From 3d1e2afe7bb1ca041f6ce299009637b35028829f Mon Sep 17 00:00:00 2001 From: James Crutchley Date: Tue, 18 Feb 2025 05:51:52 -0800 Subject: [PATCH 1/4] Add support for Media Element on a `FlyoutPage` --- .../Views/MauiMediaElement.macios.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/CommunityToolkit.Maui.MediaElement/Views/MauiMediaElement.macios.cs b/src/CommunityToolkit.Maui.MediaElement/Views/MauiMediaElement.macios.cs index c3777325a0..96199d354d 100644 --- a/src/CommunityToolkit.Maui.MediaElement/Views/MauiMediaElement.macios.cs +++ b/src/CommunityToolkit.Maui.MediaElement/Views/MauiMediaElement.macios.cs @@ -168,6 +168,11 @@ static bool TryGetCurrentPage([NotNullWhen(true)] out Page? currentPage) currentPage = modalPage; return true; } + if (window.Page is FlyoutPage flyoutPage) + { + currentPage = flyoutPage; + return true; + } // If not using Shell or a Modal Page, return the visible page in the (non-modal) NavigationStack if (window.Navigation.NavigationStack[^1] is Page page) From 49bc01440b252f5b9a49aee6c9295fa30236584c Mon Sep 17 00:00:00 2001 From: James Crutchley Date: Thu, 20 Feb 2025 04:56:53 -0800 Subject: [PATCH 2/4] Update Page Extension to latest Maui version Update TryGetCurrentPage to use GetCurrentPage --- .../Extensions/PageExtensions.cs | 21 ++++++------ .../Views/MauiMediaElement.macios.cs | 34 ++----------------- 2 files changed, 12 insertions(+), 43 deletions(-) diff --git a/src/CommunityToolkit.Maui.MediaElement/Extensions/PageExtensions.cs b/src/CommunityToolkit.Maui.MediaElement/Extensions/PageExtensions.cs index 80ae10965e..80f66de283 100644 --- a/src/CommunityToolkit.Maui.MediaElement/Extensions/PageExtensions.cs +++ b/src/CommunityToolkit.Maui.MediaElement/Extensions/PageExtensions.cs @@ -10,23 +10,22 @@ internal static Page GetCurrentPage(this Page currentPage) { return modal; } - - if (currentPage is FlyoutPage flyoutPage) + else if (currentPage is FlyoutPage fp) { - return GetCurrentPage(flyoutPage.Detail); + return GetCurrentPage(fp.Detail); } - - if (currentPage is Shell { CurrentItem.CurrentItem: IShellSectionController shellSectionController }) + else if (currentPage is Shell shell && shell.CurrentItem?.CurrentItem is IShellSectionController ssc) { - return shellSectionController.PresentedPage; + return ssc.PresentedPage; } - - if (currentPage is IPageContainer paigeContainer) + else if (currentPage is IPageContainer pc) { - return GetCurrentPage(paigeContainer.CurrentPage); + return GetCurrentPage(pc.CurrentPage); + } + else + { + return currentPage; } - - return currentPage; } internal record struct ParentWindow diff --git a/src/CommunityToolkit.Maui.MediaElement/Views/MauiMediaElement.macios.cs b/src/CommunityToolkit.Maui.MediaElement/Views/MauiMediaElement.macios.cs index 96199d354d..8402940ef5 100644 --- a/src/CommunityToolkit.Maui.MediaElement/Views/MauiMediaElement.macios.cs +++ b/src/CommunityToolkit.Maui.MediaElement/Views/MauiMediaElement.macios.cs @@ -152,41 +152,11 @@ static bool TryGetCurrentPage([NotNullWhen(true)] out Page? currentPage) // TODO: Add support for MediaElement in an ItemsView in a multi-window application throw new NotSupportedException("MediaElement is not currently supported in multi-window applications"); } - - var window = Application.Current.Windows[0]; - - // If using Shell, return the current page - if (window.Page is Shell { CurrentPage: not null } shell) - { - currentPage = shell.CurrentPage; - return true; - } - - // If not using Shell, use the ModelNavigationStack to check for any pages displayed modally - if (TryGetModalPage(window, out var modalPage)) - { - currentPage = modalPage; - return true; - } - if (window.Page is FlyoutPage flyoutPage) + if (Application.Current.Windows[0].Page is Page page) { - currentPage = flyoutPage; + currentPage = PageExtensions.GetCurrentPage(page); return true; } - - // If not using Shell or a Modal Page, return the visible page in the (non-modal) NavigationStack - if (window.Navigation.NavigationStack[^1] is Page page) - { - currentPage = page; - return true; - } - return false; - - static bool TryGetModalPage(Window window, [NotNullWhen(true)] out Page? page) - { - page = window.Navigation.ModalStack.LastOrDefault(); - return page is not null; - } } } \ No newline at end of file From 1585e10b793b90236a316c2d570c8ccbea81740a Mon Sep 17 00:00:00 2001 From: James Crutchley Date: Sun, 4 May 2025 17:29:10 -0700 Subject: [PATCH 3/4] Add unit tests for `GetCurrentPage` in `PageExtensions` class --- .../Extensions/PageExtensionsTests.cs | 105 ++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 src/CommunityToolkit.Maui.UnitTests/Extensions/PageExtensionsTests.cs diff --git a/src/CommunityToolkit.Maui.UnitTests/Extensions/PageExtensionsTests.cs b/src/CommunityToolkit.Maui.UnitTests/Extensions/PageExtensionsTests.cs new file mode 100644 index 0000000000..4fa0b7762b --- /dev/null +++ b/src/CommunityToolkit.Maui.UnitTests/Extensions/PageExtensionsTests.cs @@ -0,0 +1,105 @@ +using CommunityToolkit.Maui.Extensions; +using CommunityToolkit.Maui.UnitTests.Mocks; +using Xunit; + +namespace CommunityToolkit.Maui.UnitTests.Extensions; +public class PageExtensionsTests : BaseHandlerTest +{ + [Fact] + public void GetCurrentPage_ReturnsModalPage_WhenModalStackIsNotEmpty() + { + // Arrange + var modalPage = new ContentPage(); + var navigationPage = new NavigationPage(new ContentPage()); + navigationPage.Navigation.PushModalAsync(modalPage); + + // Act + var result = PageExtensions.GetCurrentPage(navigationPage); + + // Assert + Assert.Equal(modalPage, result); + } + + [Fact] + public void GetCurrentPage_ReturnsFlyoutDetailPage_WhenCurrentPageIsFlyoutPage() + { + // Arrange + var detailPage = new ContentPage(); + var flyoutPage = new FlyoutPage + { + Detail = new NavigationPage(detailPage), + Flyout = new ContentPage() + { + Title = "Flyout", + } + }; + + // Act + var result = PageExtensions.GetCurrentPage(flyoutPage); + + // Assert + Assert.Equal(detailPage, result); + } + + [Fact] + public void GetCurrentPage_ReturnsShellPresentedPage_WhenCurrentPageIsShell() + { + // Arrange + var presentedPage = new ContentPage(); + var shell = new Shell(); + var shellSection = new ShellSection + { + Items = { new ShellContent { Content = presentedPage } } + }; + shell.Items.Add(new ShellItem { Items = { shellSection } }); + shell.CurrentItem = shell.Items[0]; + + // Act + var result = PageExtensions.GetCurrentPage(shell); + + // Assert + Assert.Equal(presentedPage, result); + } + + [Fact] + public void GetCurrentPage_ReturnsContainerCurrentPage_WhenCurrentPageIsPageContainer() + { + var dispatcher = DispatcherProvider.Current.GetForCurrentThread() ?? throw new InvalidOperationException("Dispatcher is not available for the current thread."); + // Arrange + var currentPage = new ContentPage(); + + TabbedPage? pageContainer = null; + dispatcher.Dispatch(() => + { + pageContainer = new TabbedPage + { + Children = + { + currentPage, + } + }; + }); + if (pageContainer is null) + { + throw new InvalidOperationException("PageContainer is null"); + } + // Act + var result = PageExtensions.GetCurrentPage(pageContainer); + + // Assert + Assert.Equal(currentPage, result); + } + + [Fact] + public void GetCurrentPage_ReturnsCurrentPage_WhenNoSpecialCasesApply() + { + // Arrange + var currentPage = new ContentPage(); + + // Act + var result = PageExtensions.GetCurrentPage(currentPage); + + // Assert + Assert.Equal(currentPage, result); + } +} From 8a8a85882b71e4b25e3004e739a1bb7d4bf60614 Mon Sep 17 00:00:00 2001 From: James Crutchley Date: Thu, 3 Jul 2025 14:49:31 -0700 Subject: [PATCH 4/4] Refactor PageExtensionsTests class structure Removed dependency on CommunityToolkit.Maui.UnitTests.Mocks and changed inheritance from BaseHandlerTest to BaseTest, updating the testing context for improved clarity and functionality. --- .../Extensions/PageExtensionsTests.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/CommunityToolkit.Maui.UnitTests/Extensions/PageExtensionsTests.cs b/src/CommunityToolkit.Maui.UnitTests/Extensions/PageExtensionsTests.cs index 4fa0b7762b..50ef965a09 100644 --- a/src/CommunityToolkit.Maui.UnitTests/Extensions/PageExtensionsTests.cs +++ b/src/CommunityToolkit.Maui.UnitTests/Extensions/PageExtensionsTests.cs @@ -1,9 +1,8 @@ using CommunityToolkit.Maui.Extensions; -using CommunityToolkit.Maui.UnitTests.Mocks; using Xunit; namespace CommunityToolkit.Maui.UnitTests.Extensions; -public class PageExtensionsTests : BaseHandlerTest +public class PageExtensionsTests : BaseTest { [Fact] public void GetCurrentPage_ReturnsModalPage_WhenModalStackIsNotEmpty()