From 4b5ce43654fbabc3da8dfafd04f6ebb4c9a33bf0 Mon Sep 17 00:00:00 2001 From: xiaoy312 Date: Wed, 12 Jul 2023 11:13:41 -0400 Subject: [PATCH] fix: mobile ui-tests not working --- .../Android/MainActivity.Android.cs | 87 ++++++++++++++++--- .../Uno.Toolkit.Samples.Mobile.csproj | 4 + .../Android/MainActivity.Android.cs | 73 +++++++++++++++- .../Uno.Toolkit.WinUI.Samples.Mobile.csproj | 4 + 4 files changed, 157 insertions(+), 11 deletions(-) diff --git a/samples/Uno.Toolkit.Samples/Uno.Toolkit.Samples.Mobile/Android/MainActivity.Android.cs b/samples/Uno.Toolkit.Samples/Uno.Toolkit.Samples.Mobile/Android/MainActivity.Android.cs index e542e3a02..41483dfaa 100644 --- a/samples/Uno.Toolkit.Samples/Uno.Toolkit.Samples.Mobile/Android/MainActivity.Android.cs +++ b/samples/Uno.Toolkit.Samples/Uno.Toolkit.Samples.Mobile/Android/MainActivity.Android.cs @@ -1,18 +1,85 @@ -using Android.App; -using Android.Widget; +using System; +using System.IO; +using System.Threading; +using Android.App; using Android.OS; -using Android.Content.PM; using Android.Views; +using Java.Interop; -namespace Uno.Toolkit.Samples +namespace Uno.Toolkit.Samples.Droid; + +[Activity( + MainLauncher = true, + ConfigurationChanges = global::Uno.UI.ActivityHelper.AllConfigChanges, + // SoftInput.AdjustNothing is required by SafeArea + WindowSoftInputMode = SoftInput.AdjustNothing | SoftInput.StateHidden +)] +public class MainActivity : Windows.UI.Xaml.ApplicationActivity { - [Activity( - MainLauncher = true, - ConfigurationChanges = global::Uno.UI.ActivityHelper.AllConfigChanges, - WindowSoftInputMode = SoftInput.AdjustPan | SoftInput.StateHidden - )] - public class MainActivity : Windows.UI.Xaml.ApplicationActivity +#if USE_UITESTS + private HandlerThread _pixelCopyHandlerThread; + + [Export("NavBackFromNestedPage")] + public void NavBackFromNestedPage() => App.NavBackFromNestedPage(); + + [Export("ForceNavigation")] + public void ForceNavigation(string sampleName) => App.ForceNavigation(sampleName); + + [Export("ExitNestedSample")] + public void ExitNestedSampleBackdoor() => App.ExitNestedSample(); + + [Export("NavigateToNestedSample")] + public void NavigateToNestedSample(string pageName) => App.NavigateToNestedSample(pageName); + + [Export("GetDisplayScreenScaling")] + public string GetDisplayScreenScaling(string value) => App.GetDisplayScreenScaling(value); + + /// + /// Returns a base64 encoded PNG file + /// + [Export("GetScreenshot")] + public string GetScreenshot(string displayId) + { + // Get true size of screen, including status bar and bottom navigation bar + var metrics = Resources.DisplayMetrics; + var bitmap = Android.Graphics.Bitmap.CreateBitmap(metrics.WidthPixels, metrics.HeightPixels, Android.Graphics.Bitmap.Config.Argb8888); + + if (_pixelCopyHandlerThread == null) + { + _pixelCopyHandlerThread = new Android.OS.HandlerThread("ScreenshotHelper"); + _pixelCopyHandlerThread.Start(); + } + + var listener = new PixelCopyListener(); + + // PixelCopy.Request returns the actual rendering of the screen location for the app, including OpenGL content. + // Setting srcRect to null ensures that the entire screen, including status bar and bottom navigation bar, are captured. +#pragma warning disable CA1416 // Validate platform compatibility + PixelCopy.Request(Window, srcRect: null, bitmap, listener, new Android.OS.Handler(_pixelCopyHandlerThread.Looper)); +#pragma warning restore CA1416 // Validate platform compatibility + + listener.WaitOne(); + + using var memoryStream = new MemoryStream(); + bitmap.Compress(Android.Graphics.Bitmap.CompressFormat.Png, 100, memoryStream); + + return Convert.ToBase64String(memoryStream.ToArray()); + } + + class PixelCopyListener : Java.Lang.Object, PixelCopy.IOnPixelCopyFinishedListener { + private ManualResetEvent _event = new ManualResetEvent(false); + + public void WaitOne() + { + _event.WaitOne(); + } + + public void OnPixelCopyFinished(int copyResult) + { + _event.Set(); + } } +#endif } diff --git a/samples/Uno.Toolkit.Samples/Uno.Toolkit.Samples.Mobile/Uno.Toolkit.Samples.Mobile.csproj b/samples/Uno.Toolkit.Samples/Uno.Toolkit.Samples.Mobile/Uno.Toolkit.Samples.Mobile.csproj index 1b52faa33..0348ff708 100644 --- a/samples/Uno.Toolkit.Samples/Uno.Toolkit.Samples.Mobile/Uno.Toolkit.Samples.Mobile.csproj +++ b/samples/Uno.Toolkit.Samples/Uno.Toolkit.Samples.Mobile/Uno.Toolkit.Samples.Mobile.csproj @@ -15,6 +15,10 @@ 21.0 10.14 + + True + $(DefineConstants);USE_UITESTS + iossimulator-x64 diff --git a/samples/Uno.Toolkit.WinUI.Samples/Uno.Toolkit.WinUI.Samples.Mobile/Android/MainActivity.Android.cs b/samples/Uno.Toolkit.WinUI.Samples/Uno.Toolkit.WinUI.Samples.Mobile/Android/MainActivity.Android.cs index 5f0e7eacb..a2187350b 100644 --- a/samples/Uno.Toolkit.WinUI.Samples/Uno.Toolkit.WinUI.Samples.Mobile/Android/MainActivity.Android.cs +++ b/samples/Uno.Toolkit.WinUI.Samples/Uno.Toolkit.WinUI.Samples.Mobile/Android/MainActivity.Android.cs @@ -3,14 +3,85 @@ using Android.OS; using Android.Content.PM; using Android.Views; +using Java.Interop; +using Uno.Toolkit.Samples; +using System.IO; +using System; +using System.Threading; namespace Uno.Toolkit.WinUI.Samples.Droid; [Activity( MainLauncher = true, ConfigurationChanges = global::Uno.UI.ActivityHelper.AllConfigChanges, + // SoftInput.AdjustNothing is required by SafeArea WindowSoftInputMode = SoftInput.AdjustNothing | SoftInput.StateHidden )] public class MainActivity : Microsoft.UI.Xaml.ApplicationActivity { -} \ No newline at end of file +#if USE_UITESTS + private HandlerThread _pixelCopyHandlerThread; + + [Export("NavBackFromNestedPage")] + public void NavBackFromNestedPage() => App.NavBackFromNestedPage(); + + [Export("ForceNavigation")] + public void ForceNavigation(string sampleName) => App.ForceNavigation(sampleName); + + [Export("ExitNestedSample")] + public void ExitNestedSampleBackdoor() => App.ExitNestedSample(); + + [Export("NavigateToNestedSample")] + public void NavigateToNestedSample(string pageName) => App.NavigateToNestedSample(pageName); + + [Export("GetDisplayScreenScaling")] + public string GetDisplayScreenScaling(string value) => App.GetDisplayScreenScaling(value); + + /// + /// Returns a base64 encoded PNG file + /// + [Export("GetScreenshot")] + public string GetScreenshot(string displayId) + { + // Get true size of screen, including status bar and bottom navigation bar + var metrics = Resources.DisplayMetrics; + var bitmap = Android.Graphics.Bitmap.CreateBitmap(metrics.WidthPixels, metrics.HeightPixels, Android.Graphics.Bitmap.Config.Argb8888); + + if (_pixelCopyHandlerThread == null) + { + _pixelCopyHandlerThread = new Android.OS.HandlerThread("ScreenshotHelper"); + _pixelCopyHandlerThread.Start(); + } + + var listener = new PixelCopyListener(); + + // PixelCopy.Request returns the actual rendering of the screen location for the app, including OpenGL content. + // Setting srcRect to null ensures that the entire screen, including status bar and bottom navigation bar, are captured. +#pragma warning disable CA1416 // Validate platform compatibility + PixelCopy.Request(Window, srcRect: null, bitmap, listener, new Android.OS.Handler(_pixelCopyHandlerThread.Looper)); +#pragma warning restore CA1416 // Validate platform compatibility + + listener.WaitOne(); + + using var memoryStream = new MemoryStream(); + bitmap.Compress(Android.Graphics.Bitmap.CompressFormat.Png, 100, memoryStream); + + return Convert.ToBase64String(memoryStream.ToArray()); + } + + class PixelCopyListener : Java.Lang.Object, PixelCopy.IOnPixelCopyFinishedListener + { + private ManualResetEvent _event = new ManualResetEvent(false); + + public void WaitOne() + { + _event.WaitOne(); + } + + public void OnPixelCopyFinished(int copyResult) + { + _event.Set(); + } + } +#endif +} diff --git a/samples/Uno.Toolkit.WinUI.Samples/Uno.Toolkit.WinUI.Samples.Mobile/Uno.Toolkit.WinUI.Samples.Mobile.csproj b/samples/Uno.Toolkit.WinUI.Samples/Uno.Toolkit.WinUI.Samples.Mobile/Uno.Toolkit.WinUI.Samples.Mobile.csproj index 556a8bc75..c2a078435 100644 --- a/samples/Uno.Toolkit.WinUI.Samples/Uno.Toolkit.WinUI.Samples.Mobile/Uno.Toolkit.WinUI.Samples.Mobile.csproj +++ b/samples/Uno.Toolkit.WinUI.Samples/Uno.Toolkit.WinUI.Samples.Mobile/Uno.Toolkit.WinUI.Samples.Mobile.csproj @@ -22,6 +22,10 @@ $(DefineConstants);IS_WINUI + + True + $(DefineConstants);USE_UITESTS +