While for the most part Uno Platform apps are able to handle theme changes internally,
I have some custom code in my app that needs to react to theme change. For example when user changes from light them to dark theme here:
Android display settings for theme
In my code I can get the theme value initially like this:
var color = (Color)App.Current.Resources["SystemBaseHighColor"]
Now when the user changes theme and returns to the app I want to detect that and programmatically update some component. Is there an event I can hook into for this?
You can listen for theme changes on all platforms using the ThemeListener helper class from the Windows Community Toolkit. It's supported by recent Uno Platform versions.
Just create a new instance of ThemeListener and subscribe to the ThemeListener.ThemeChanged event.
Related
I would like implement Custom alert view in iOS like windows dialog style(with Yes,No,Cancel in horizontal) and I have to publish the app in Appstore as well.
Application will get reject from Appstore if I do this customisation?
The approval process in Apple Store, is quite complex, but there is nothing saying that customizing a view will get your app rejected.
Check the guidelines for further information.
App has access to import image from photo and other option is sending doc via email. In automation I could access photo and email options once my app loads the ui on init. This was working in iOS 10 and Xcode 8. Now, Upon upgrade the Xcode to 9 and iOS 11 the same app is not allowing me to access the element in Photo and Email. When I checked the element in Inspector, it shows me the entire Photo/Email page is RemoteViewBridge. Could you help me on this, how to fix this issue?
UIImagePickerController class has a private view hierarchy. The collection view cannot be accessed anymore from appium. In ios 11 you cannot access these elements. Try using iOS 10.3 or wait for the fix. I am accessing using coordinates in my project for the time being.
I am trying to create a project in which picture is taken to upload from mobile camera, but when it is taken with front camera it rotates upside down (especially Android). I have read suggestions to use Exif.PCL nuget package but dont know how to implement the same. Can anybody help me out with this ?
Thanks
Background
I had the same problem in one of my apps. After trying different approaches I've found several problems with current implementations. Generally I use XLabs, which has media picking capabilities.
Issues
First of all it lacked support for scaling and autorotating images after they are taken. That's your question. So, first of all I had to implement some after-processing as soon as the image was picked.
Second, there are problems with Android and Xamarin.Forms due do how Activities are handled in Android. The way it works on Android is you launch CameraActivity or PhotoGalleryActivity which are actually hosted in a different application. Those Activities use substential amount of system memory, and due to this operating system will try to kill non-forground processes, including your app :) Workarround for this was completely implementing photo taking flow inside of my application by creating photo taking activities from scratch. Thus, I will never leave my app, and Android runtime will never kill my application.
Solution
Taking account all of this, I've implement my own flow of Image capturing. You can find the source code HERE. The basic architecture is following:
I've created IImageService, which has methods for picking images from camera or library.
public interface IImageService
{
Task<IImage> GetImageFromLibrary();
Task<IImage> GetImageFromCamera();
}
Then I've implemented this for iOS and Android separately and used dependency injection. For iOS I use XLabs implementation, cause it works as it should there are no problems with it. For Android I've created several activities to support picking images from Camera and Library: CameraActivity, PhotoGaleryActivity, which basically replace the native image picking activities.
After I pick the image I do scaling and rotating procedure. For iOS I've created UIImageToolbox static class which has GetScaledAndRotatedImage method. For Android it's BitmapToolbox static class which has GetScaledAndRotatedBitmap method.
In my sample application I've created ImageViewModel and ImagePage to demonstrate the usage of IImageService. It should be straightforward.
How to use the sample app?
Let me give a small remark. You can use only XLabs implementation for both iOS and Android and just use BitmapToolbox and UIImageToolbox to implement the scaling and rotation. And this is answer to your question. However, if you want your app to be stable on Android you need to go a little bit dipper.
Install all the necessary nuget packages to your Forms, Droid and iOS projects. You can find the packages that are used by sample application in packages.config file of each project
I use MvvmCross Messenger plugin for broadcast messaging, if you have alternative you can easily replace it. But if you want to use it, don't forget to register dependencies in your AppDelegate and MainActivity
DependencyService.Register();
Add necessary classes to your Forms, iOS and Android projects from sample application. You can use Resharper to fix namespaces for you.
For xaml files, if you drug and drop to forms project default build action and Custom Tool are set to wrong values. Thus click the xaml file, select properties set Build Action to Embedded Resource, and Custom Tool to MSBuild:UpdateDesignTimeXaml
For android project add necessary resources from drawable, drawable-xxhdpi, layout and values folders.
In grid_cell_photo_galery_item.axml file fix namespaces. Replace ImageSample.Droid.Views.SquareRelativeLayout by your namespace.
For Android, right click Android project, select properties, go to Android Manifest and add CAMERA, READ_EXTERNAL_STORAGE and WRITE_EXTERNAL_STORAGE permissions.
For Android, right click Android project, select properties, go to Advanced and set Max Heap Size to something like 1G, this is needed because PhotoGalaryActivity uses substantial amount of memory to display images and we need an increased heap size.
For iOS, don't forget to add dependency injection for MediaPicker in AppDelegate - DependencyService.Register<MediaPicker>();
That's all.
I would like to make my custom widget which I want to use the short taps on some area of my custom widget to navigate to my notification list and short taps on another area to navigate to my control. Is it possible ?
I found the sample code to open the control from a widget in this answer: How should I do to start SmartWatch Extension from the program code?!
But I didn't found the sample code to open the notification list from a widget.
I'm not sure I completely understand your question.
If you are asking if it's possible to open the notification drawer on your phone from a widget on the SmartWatch the answer is no, the notification drawer cannot be opened using any public APIs in the Android SDK.
If you are talking about opening a notification list on the watch itself, using the SmartExtension SDK Notification API then yes you can but you need to create the UI yourself and retrieve the notifications via the Content Provider. There is an example of a notification extension in the Sony Add-on SDK in the sample code section.
2 questions about using a QR code in an Android device:
1. Is it possible to launch a native Android application from a QR code? Maybe by some configured URI schema?
2. Another option which might be useful for me is to have a QR code scanner inside my own app. Will it be possible for me to somehow include a different app that scans QR codes inside my app? Or will I have to implement the scanning myself?
Thanks
To scan barcodes in Android by Intent, see https://github.com/zxing/zxing/wiki/Scanning-Via-Intent
To trigger an app from a QR code, yes, you need to register the app to handle the particular custom URL scheme. This is how the same app can respond to clicks on the web: https://github.com/zxing/zxing/wiki/Scanning-From-Web-Pages
Look at how it registers to handle URLs here: https://github.com/zxing/zxing/blob/master/android/AndroidManifest.xml
1.to use a configured schema you can check this post
Launch custom android application from android browser
Then the you could QR code this scheme just like market://
2. You could use Bar code scanner app and use below code to launch or you could even integrate the zxing library to scan yourself.
Intent intent = new Intent("com.google.zxing.client.android.SCAN");
intent.setPackage("com.google.zxing.client.android");
intent.putExtra("SCAN_MODE",
"ONE_D_MODE,QR_CODE_MODE,PRODUCT_MODE,DATA_MATRIX_MODE");
startActivityForResult(intent, 0);