From ca99981267cc3b4250547959e8cf551c29c070c6 Mon Sep 17 00:00:00 2001 From: Shane Neuville Date: Wed, 5 Apr 2023 09:33:45 -0500 Subject: [PATCH 1/3] Propagate Title to android and ios window --- .../Handlers/Window/WindowHandler.Android.cs | 3 +- .../src/Handlers/Window/WindowHandler.iOS.cs | 10 ++----- .../src/Platform/Android/WindowExtensions.cs | 8 ++++++ src/Core/src/Platform/iOS/WindowExtensions.cs | 9 ++++++ .../Window/WindowHandlerTests.Android.cs | 28 +++++++++++++++++++ 5 files changed, 49 insertions(+), 9 deletions(-) create mode 100644 src/Core/tests/DeviceTests/Handlers/Window/WindowHandlerTests.Android.cs diff --git a/src/Core/src/Handlers/Window/WindowHandler.Android.cs b/src/Core/src/Handlers/Window/WindowHandler.Android.cs index 724f56c33005..3da60b24d7bd 100644 --- a/src/Core/src/Handlers/Window/WindowHandler.Android.cs +++ b/src/Core/src/Handlers/Window/WindowHandler.Android.cs @@ -17,7 +17,8 @@ protected override void ConnectHandler(Activity platformView) UpdateVirtualViewFrame(platformView); } - public static void MapTitle(IWindowHandler handler, IWindow window) { } + public static void MapTitle(IWindowHandler handler, IWindow window) => + handler.PlatformView.UpdateTitle(window); public static void MapContent(IWindowHandler handler, IWindow window) { diff --git a/src/Core/src/Handlers/Window/WindowHandler.iOS.cs b/src/Core/src/Handlers/Window/WindowHandler.iOS.cs index 088affbd8065..4025e0b61e58 100644 --- a/src/Core/src/Handlers/Window/WindowHandler.iOS.cs +++ b/src/Core/src/Handlers/Window/WindowHandler.iOS.cs @@ -12,14 +12,8 @@ protected override void ConnectHandler(UIWindow platformView) UpdateVirtualViewFrame(platformView); } - - public static void MapTitle(IWindowHandler handler, IWindow window) - { -#if MACCATALYST - if (handler.PlatformView.WindowScene is not null) - handler.PlatformView.WindowScene.Title = window.Title ?? String.Empty; -#endif - } + public static void MapTitle(IWindowHandler handler, IWindow window) => + handler.PlatformView.UpdateTitle(window); public static void MapContent(IWindowHandler handler, IWindow window) { diff --git a/src/Core/src/Platform/Android/WindowExtensions.cs b/src/Core/src/Platform/Android/WindowExtensions.cs index f7aa040a8edd..42691238eb8f 100644 --- a/src/Core/src/Platform/Android/WindowExtensions.cs +++ b/src/Core/src/Platform/Android/WindowExtensions.cs @@ -9,6 +9,14 @@ namespace Microsoft.Maui { public static partial class WindowExtensions { + internal static void UpdateTitle(this Activity platformWindow, IWindow window) + { + if (string.IsNullOrEmpty(window.Title)) + platformWindow.Title = ApplicationModel.AppInfo.Current.Name; + else + platformWindow.Title = window.Title; + } + internal static DisplayOrientation GetOrientation(this IWindow? window) { if (window == null) diff --git a/src/Core/src/Platform/iOS/WindowExtensions.cs b/src/Core/src/Platform/iOS/WindowExtensions.cs index d37cf7df3290..67c9607deee3 100644 --- a/src/Core/src/Platform/iOS/WindowExtensions.cs +++ b/src/Core/src/Platform/iOS/WindowExtensions.cs @@ -9,6 +9,15 @@ namespace Microsoft.Maui.Platform { public static partial class WindowExtensions { + internal static void UpdateTitle(this UIWindow platformWindow, IWindow window) + { + // If you set the title to null the app will crash + // If you set it to an empty string the title reverts back to the + // default app title. + if (OperatingSystem.IsIOSVersionAtLeast(13) && platformWindow.WindowScene is not null) + platformWindow.WindowScene.Title = window.Title ?? String.Empty; + } + internal static void UpdateX(this UIWindow platformWindow, IWindow window) => platformWindow.UpdateUnsupportedCoordinate(window); diff --git a/src/Core/tests/DeviceTests/Handlers/Window/WindowHandlerTests.Android.cs b/src/Core/tests/DeviceTests/Handlers/Window/WindowHandlerTests.Android.cs new file mode 100644 index 000000000000..368334a32c61 --- /dev/null +++ b/src/Core/tests/DeviceTests/Handlers/Window/WindowHandlerTests.Android.cs @@ -0,0 +1,28 @@ +using System.Threading.Tasks; +using Microsoft.Maui.Controls; +using Microsoft.Maui.Devices; +using Microsoft.Maui.Graphics; +using Xunit; + +namespace Microsoft.Maui.DeviceTests +{ + public partial class WindowHandlerTests : CoreHandlerTestBase + { + [Fact] + public async Task TitleSetsOnWindow() + { + await InvokeOnMainThreadAsync(() => + { + var activity = MauiContext.Context.GetActivity(); + Assert.NotNull(activity); + var testWindow = activity.GetWindow() as Window; + Assert.NotNull(testWindow); + + testWindow.Title = "Test Title"; + Assert.Equal("Test Title", activity.Title); + testWindow.Title = null; + Assert.Equal(activity.Title, ApplicationModel.AppInfo.Current.Name); + }); + } + } +} \ No newline at end of file From b8ff388fa6cf24cfccb6a0ab9a35eb711d12f7ec Mon Sep 17 00:00:00 2001 From: Shane Neuville Date: Thu, 6 Apr 2023 11:16:40 -0500 Subject: [PATCH 2/3] - try grabbing window from a different mechanism --- .../Handlers/Window/WindowHandlerTests.Android.cs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/Core/tests/DeviceTests/Handlers/Window/WindowHandlerTests.Android.cs b/src/Core/tests/DeviceTests/Handlers/Window/WindowHandlerTests.Android.cs index 368334a32c61..71833f4635ef 100644 --- a/src/Core/tests/DeviceTests/Handlers/Window/WindowHandlerTests.Android.cs +++ b/src/Core/tests/DeviceTests/Handlers/Window/WindowHandlerTests.Android.cs @@ -3,6 +3,7 @@ using Microsoft.Maui.Devices; using Microsoft.Maui.Graphics; using Xunit; +using AActivity = Android.App.Activity; namespace Microsoft.Maui.DeviceTests { @@ -13,10 +14,10 @@ public async Task TitleSetsOnWindow() { await InvokeOnMainThreadAsync(() => { - var activity = MauiContext.Context.GetActivity(); - Assert.NotNull(activity); - var testWindow = activity.GetWindow() as Window; - Assert.NotNull(testWindow); + var testWindow = Application.Current.Windows[0]; + var activity = testWindow.Handler.PlatformView as AActivity; + Assert.True(activity is not null, "Activity is Null"); + Assert.True(testWindow is not null, "Window is Null"); testWindow.Title = "Test Title"; Assert.Equal("Test Title", activity.Title); From 1f3fb12aa6d90ce160c214c6189b61ea1b8305c8 Mon Sep 17 00:00:00 2001 From: Shane Neuville Date: Thu, 6 Apr 2023 12:32:42 -0500 Subject: [PATCH 3/3] - rework android tests --- .../Handlers/Window/WindowHandlerTests.Android.cs | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/Core/tests/DeviceTests/Handlers/Window/WindowHandlerTests.Android.cs b/src/Core/tests/DeviceTests/Handlers/Window/WindowHandlerTests.Android.cs index 71833f4635ef..52e5eefa9700 100644 --- a/src/Core/tests/DeviceTests/Handlers/Window/WindowHandlerTests.Android.cs +++ b/src/Core/tests/DeviceTests/Handlers/Window/WindowHandlerTests.Android.cs @@ -1,9 +1,7 @@ using System.Threading.Tasks; +using AndroidX.AppCompat.App; using Microsoft.Maui.Controls; -using Microsoft.Maui.Devices; -using Microsoft.Maui.Graphics; using Xunit; -using AActivity = Android.App.Activity; namespace Microsoft.Maui.DeviceTests { @@ -14,14 +12,18 @@ public async Task TitleSetsOnWindow() { await InvokeOnMainThreadAsync(() => { - var testWindow = Application.Current.Windows[0]; - var activity = testWindow.Handler.PlatformView as AActivity; + var activity = (AppCompatActivity)MauiProgramDefaults.DefaultContext; + var testWindow = new Window(); + Assert.True(activity is not null, "Activity is Null"); - Assert.True(testWindow is not null, "Window is Null"); testWindow.Title = "Test Title"; + WindowExtensions.UpdateTitle(activity, testWindow); + Assert.Equal("Test Title", activity.Title); testWindow.Title = null; + + WindowExtensions.UpdateTitle(activity, testWindow); Assert.Equal(activity.Title, ApplicationModel.AppInfo.Current.Name); }); }