diff --git a/Directory.Build.props b/Directory.Build.props index 9d5af4701a..0f7e91aa2e 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -24,7 +24,7 @@ https://docs.microsoft.com/en-us/windows/win32/fileio/maximum-file-path-limitati SourceGen - 10.0.41 + 10.0.51 true true true diff --git a/samples/CommunityToolkit.Maui.Sample/Pages/Views/Popup/PopupsPage.xaml.cs b/samples/CommunityToolkit.Maui.Sample/Pages/Views/Popup/PopupsPage.xaml.cs index 076ef8e8b5..9bc18a4cd2 100644 --- a/samples/CommunityToolkit.Maui.Sample/Pages/Views/Popup/PopupsPage.xaml.cs +++ b/samples/CommunityToolkit.Maui.Sample/Pages/Views/Popup/PopupsPage.xaml.cs @@ -33,6 +33,15 @@ protected override async void OnNavigatedFrom(NavigatedFromEventArgs args) { base.OnNavigatedFrom(args); if (args.IsDestinationPageACommunityToolkitPopupPage()) + { + await Toast.Make("Popup Opened").Show(); + } + } + + protected override async void OnNavigatingFrom(NavigatingFromEventArgs args) + { + base.OnNavigatingFrom(args); + if (args.IsDestinationPageACommunityToolkitPopupPage()) { await Toast.Make("Opening Popup").Show(); } diff --git a/src/CommunityToolkit.Maui.UnitTests/Extensions/NavigatedFromEventArgsExtensionsTests.cs b/src/CommunityToolkit.Maui.UnitTests/Extensions/NavigatedFromEventArgsExtensionsTests.cs index 61b83d5f5a..704bbe178f 100644 --- a/src/CommunityToolkit.Maui.UnitTests/Extensions/NavigatedFromEventArgsExtensionsTests.cs +++ b/src/CommunityToolkit.Maui.UnitTests/Extensions/NavigatedFromEventArgsExtensionsTests.cs @@ -7,7 +7,7 @@ namespace CommunityToolkit.Maui.UnitTests.Extensions; public class NavigatedFromEventArgsExtensionsTests : BaseViewTest { - [Fact] + [Fact(Timeout = (int)TestDuration.Medium)] public async Task NavigatedFromEventArgsExtensions_IsDestinationPageACommunityToolkitPopupPage_ShouldReturnTrue() { // Arrange @@ -36,11 +36,12 @@ public async Task NavigatedFromEventArgsExtensions_IsDestinationPageACommunityTo void HandleNavigatedFromEventArgsReceived(object? sender, NavigatedFromEventArgs e) { + shellContentPage.NavigatedFromEventArgsReceived -= HandleNavigatedFromEventArgsReceived; isDestinationPageACommunityToolkitPopupPageTCS.SetResult(e.IsDestinationPageACommunityToolkitPopupPage()); } } - [Fact] + [Fact(Timeout = (int)TestDuration.Medium)] public async Task NavigatedFromEventArgsExtensions_IsDestinationPageACommunityToolkitPopupPage_ShouldReturnFalse() { // Arrange diff --git a/src/CommunityToolkit.Maui.UnitTests/Extensions/NavigatedToEventArgsExtensionsTests.cs b/src/CommunityToolkit.Maui.UnitTests/Extensions/NavigatedToEventArgsExtensionsTests.cs index dcdc34a086..c464c746c4 100644 --- a/src/CommunityToolkit.Maui.UnitTests/Extensions/NavigatedToEventArgsExtensionsTests.cs +++ b/src/CommunityToolkit.Maui.UnitTests/Extensions/NavigatedToEventArgsExtensionsTests.cs @@ -7,7 +7,7 @@ namespace CommunityToolkit.Maui.UnitTests.Extensions; public class NavigatedToEventArgsExtensionsTests : BaseViewTest { - [Fact] + [Fact(Timeout = (int)TestDuration.Medium)] public async Task NavigatedToEventArgsExtensions_WasPreviousPageACommunityToolkitPopupPage_ShouldReturnTrue() { // Arrange @@ -38,12 +38,13 @@ void HandleNavigatedToEventArgsReceived(object? sender, NavigatedToEventArgs e) { if (e.PreviousPage != mainPage) { + shellContentPage.NavigatedToEventArgsReceived -= HandleNavigatedToEventArgsReceived; wasPreviousPageACommunityToolkitPopupPageTCS.SetResult(e.WasPreviousPageACommunityToolkitPopupPage()); } } } - [Fact] + [Fact(Timeout = (int)TestDuration.Medium)] public async Task NavigatedToEventArgsExtensions_WasPreviousPageACommunityToolkitPopupPage_ShouldReturnFalse() { // Arrange diff --git a/src/CommunityToolkit.Maui.UnitTests/Extensions/NavigatingFromEventArgsExtensionsTests.cs b/src/CommunityToolkit.Maui.UnitTests/Extensions/NavigatingFromEventArgsExtensionsTests.cs new file mode 100644 index 0000000000..5cb74bad37 --- /dev/null +++ b/src/CommunityToolkit.Maui.UnitTests/Extensions/NavigatingFromEventArgsExtensionsTests.cs @@ -0,0 +1,89 @@ +using CommunityToolkit.Maui.Extensions; +using CommunityToolkit.Maui.UnitTests.Mocks; +using Xunit; + +namespace CommunityToolkit.Maui.UnitTests.Extensions; + +public class NavigatingFromEventArgsExtensionsTests : BaseViewTest +{ + [Fact(Timeout = (int)TestDuration.Medium)] + public async Task NavigatingFromEventArgsExtensions_IsDestinationPageACommunityToolkitPopupPage_ShouldReturnTrue() + { + // Arrange + TaskCompletionSource isDestinationPageACommunityToolkitPopupPageTCS = new(); + var application = (MockApplication)ServiceProvider.GetRequiredService(); + var popupService = ServiceProvider.GetRequiredService(); + + var shell = (Shell)(application.Windows[0].Page ?? throw new InvalidOperationException("Unable to retrieve Shell")); + var mainPage = shell.CurrentPage; + var shellContentPage = new ShellContentPage(); + shellContentPage.NavigatingFromEventArgsReceived += HandleNavigatingFromEventArgsReceived; + + var shellParameters = new Dictionary + { + { nameof(ContentPage.BackgroundColor), Colors.Orange } + }; + + // Act + await mainPage.Navigation.PushAsync(shellContentPage); + await popupService.ShowPopupAsync(shell, null, shellParameters, TestContext.Current.CancellationToken); + bool? isDestinationPageACommunityToolkitPopupPage = await isDestinationPageACommunityToolkitPopupPageTCS.Task; + + // Assert + Assert.True(isDestinationPageACommunityToolkitPopupPage); + + void HandleNavigatingFromEventArgsReceived(object? sender, NavigatingFromEventArgs e) + { + ArgumentNullException.ThrowIfNull(sender); + + if (sender is not ShellContentPage) + { + shellContentPage.NavigatingFromEventArgsReceived -= HandleNavigatingFromEventArgsReceived; + isDestinationPageACommunityToolkitPopupPageTCS.SetResult(e.IsDestinationPageACommunityToolkitPopupPage()); + } + } + } + + [Fact(Timeout = (int)TestDuration.Medium)] + public async Task NavigatingFromEventArgsExtensions_IsDestinationPageACommunityToolkitPopupPage_ShouldReturnFalse() + { + // Arrange + MockApplication application = (MockApplication)ServiceProvider.GetRequiredService(); + + Shell shell = (Shell)(application.Windows[0].Page ?? throw new InvalidOperationException("Unable to retrieve Shell")); + Page mainPage = shell.CurrentPage; + + ShellContentPage shellContentPage = new(); + ShellContentPage anotherShellContentPage = new(); + + TaskCompletionSource isDestinationPageACommunityToolkitPopupPageTCS = new(); + shellContentPage.NavigatingFromEventArgsReceived += HandleNavigatingFromEventArgsReceived; + + // Act + await mainPage.Navigation.PushAsync(shellContentPage); + await mainPage.Navigation.PushAsync(anotherShellContentPage); + bool? isDestinationPageACommunityToolkitPopupPage = await isDestinationPageACommunityToolkitPopupPageTCS.Task; + + // Assert + Assert.False(isDestinationPageACommunityToolkitPopupPage); + + void HandleNavigatingFromEventArgsReceived(object? sender, NavigatingFromEventArgs e) + { + ArgumentNullException.ThrowIfNull(sender); + + shellContentPage.NavigatingFromEventArgsReceived -= HandleNavigatingFromEventArgsReceived; + isDestinationPageACommunityToolkitPopupPageTCS.SetResult(e.IsDestinationPageACommunityToolkitPopupPage()); + } + } + + sealed class ShellContentPage : ContentPage + { + public event EventHandler? NavigatingFromEventArgsReceived; + + protected override void OnNavigatingFrom(NavigatingFromEventArgs args) + { + base.OnNavigatingFrom(args); + NavigatingFromEventArgsReceived?.Invoke(this, args); + } + } +} \ No newline at end of file diff --git a/src/CommunityToolkit.Maui/Extensions/NavigatedFromEventArgsExtensions.shared.cs b/src/CommunityToolkit.Maui/Extensions/NavigatedFromEventArgsExtensions.shared.cs deleted file mode 100644 index 174cadc492..0000000000 --- a/src/CommunityToolkit.Maui/Extensions/NavigatedFromEventArgsExtensions.shared.cs +++ /dev/null @@ -1,16 +0,0 @@ -using CommunityToolkit.Maui.Views; - -namespace CommunityToolkit.Maui.Extensions; - -/// -/// Extension methods for . -/// -public static class NavigatedFromEventArgsExtensions -{ - /// - /// Determines whether the previous page was a Community Toolkit . - /// - /// The current . - /// A boolean indicating whether the previous page was a Community Toolkit . - public static bool IsDestinationPageACommunityToolkitPopupPage(this NavigatedFromEventArgs args) => args.DestinationPage is PopupPage; -} \ No newline at end of file diff --git a/src/CommunityToolkit.Maui/Extensions/NavigatedToEventArgsExtensions.shared.cs b/src/CommunityToolkit.Maui/Extensions/NavigatedToEventArgsExtensions.shared.cs deleted file mode 100644 index 961bed55a2..0000000000 --- a/src/CommunityToolkit.Maui/Extensions/NavigatedToEventArgsExtensions.shared.cs +++ /dev/null @@ -1,16 +0,0 @@ -using CommunityToolkit.Maui.Views; - -namespace CommunityToolkit.Maui.Extensions; - -/// -/// Extension methods for . -/// -public static class NavigatedToEventArgsExtensions -{ - /// - /// Determines whether the previous page was a Community Toolkit . - /// - /// The current . - /// A boolean indicating whether the previous page was a Community Toolkit . - public static bool WasPreviousPageACommunityToolkitPopupPage(this NavigatedToEventArgs args) => args.PreviousPage is PopupPage; -} \ No newline at end of file diff --git a/src/CommunityToolkit.Maui/Extensions/NavigationEventArgsExtensions.cs b/src/CommunityToolkit.Maui/Extensions/NavigationEventArgsExtensions.cs new file mode 100644 index 0000000000..de1d9fcfd4 --- /dev/null +++ b/src/CommunityToolkit.Maui/Extensions/NavigationEventArgsExtensions.cs @@ -0,0 +1,30 @@ +using CommunityToolkit.Maui.Views; + +namespace CommunityToolkit.Maui.Extensions; + +/// +/// Extension methods for , and . +/// +public static class NavigationEventArgsExtensions +{ + /// + /// Determines if the destination page is the internal wrapper used when displaying a Community Toolkit . + /// + /// The current . + /// A boolean indicating if the destination page is a representing a Community Toolkit . + public static bool IsDestinationPageACommunityToolkitPopupPage(this NavigatedFromEventArgs args) => args.DestinationPage is PopupPage; + + /// + /// Determines whether the previous page was the internal wrapper used when displaying a Community Toolkit . + /// + /// The current . + /// A boolean indicating whether the previous page was a representing a Community Toolkit . + public static bool WasPreviousPageACommunityToolkitPopupPage(this NavigatedToEventArgs args) => args.PreviousPage is PopupPage; + + /// + /// Determines if the destination page will be the internal wrapper used when displaying a Community Toolkit . + /// + /// The current . + /// A boolean indicating if the destination page will be a representing a Community Toolkit . + public static bool IsDestinationPageACommunityToolkitPopupPage(this NavigatingFromEventArgs args) => args.DestinationPage is PopupPage; +} \ No newline at end of file