diff --git a/docs/navigation/backbutton.md b/docs/navigation/backbutton.md index 9972145..496c5cd 100644 --- a/docs/navigation/backbutton.md +++ b/docs/navigation/backbutton.md @@ -13,4 +13,6 @@ public class MainActivity : FormsAppCompatActivity PopupPlugin.OnBackPressed(); } } -``` \ No newline at end of file +``` + +The PopupPlugin.OnBackPressed will check to see if the currently displayed page is PopupDialogContainer. If it is it will call all of the same Dialog API's that you would expect, while using the Navigation Service for all of your other pages and PopupPages. \ No newline at end of file diff --git a/src/Prism.Plugin.Popups/Dialogs/PopupDialogContainer.cs b/src/Prism.Plugin.Popups/Dialogs/PopupDialogContainer.cs index caf5d72..4d65259 100644 --- a/src/Prism.Plugin.Popups/Dialogs/PopupDialogContainer.cs +++ b/src/Prism.Plugin.Popups/Dialogs/PopupDialogContainer.cs @@ -1,8 +1,10 @@ -using Rg.Plugins.Popup.Pages; +using System; +using Rg.Plugins.Popup.Pages; namespace Prism.Plugin.Popups.Dialogs { internal class PopupDialogContainer : PopupPage { + public Action RequestClose { get; set; } } } diff --git a/src/Prism.Plugin.Popups/Dialogs/PopupDialogService.cs b/src/Prism.Plugin.Popups/Dialogs/PopupDialogService.cs index 151dddc..c8a6fda 100644 --- a/src/Prism.Plugin.Popups/Dialogs/PopupDialogService.cs +++ b/src/Prism.Plugin.Popups/Dialogs/PopupDialogService.cs @@ -115,6 +115,8 @@ void DialogAware_RequestClose(IDialogParameters outParameters) popupPage.BackgroundClicked += CloseOnBackgroundClicked; } + popupPage.RequestClose = () => DialogAware_RequestClose(null); + Action closeCallback = closeOnBackgroundTapped ? DialogAware_RequestClose : p => { }; PushPopupPage(popupPage, view, closeCallback, animated); } @@ -124,7 +126,7 @@ void DialogAware_RequestClose(IDialogParameters outParameters) } } - private static PopupPage CreatePopupPageForView(BindableObject view) + private static PopupDialogContainer CreatePopupPageForView(View view) { var popupPage = new PopupDialogContainer(); diff --git a/src/Prism.Plugin.Popups/PopupPlugin.cs b/src/Prism.Plugin.Popups/PopupPlugin.cs index dbfa34d..8f45d7b 100644 --- a/src/Prism.Plugin.Popups/PopupPlugin.cs +++ b/src/Prism.Plugin.Popups/PopupPlugin.cs @@ -1,9 +1,10 @@ -#if MONOANDROID -using System; +using System; +using System.Linq; using System.Threading; using Prism.Common; using Prism.Ioc; using Prism.Navigation; +using Prism.Plugin.Popups.Dialogs; using Rg.Plugins.Popup.Contracts; namespace Prism.Plugin.Popups @@ -23,10 +24,23 @@ public static async void OnBackPressed() try { var container = ContainerLocator.Container; - var popupNavigation = container.Resolve(); - var appProvider = container.Resolve(); + if (container is null) + { + Console.WriteLine("Android back button pressed before Prism has initialized."); + return; + } + + var popupNavigation = container.Resolve(); + if (popupNavigation.PopupStack.Count > 0 && + popupNavigation.PopupStack.LastOrDefault() is PopupDialogContainer dialog) + { + dialog.RequestClose.Invoke(); + return; + } + var appProvider = container.Resolve(); var topPage = PopupUtilities.TopPage(popupNavigation, appProvider); + var navService = container.Resolve(PrismApplicationBase.NavigationServiceName); if (navService is IPageAware pa) { @@ -44,4 +58,3 @@ public static async void OnBackPressed() } } } -#endif diff --git a/src/Prism.Plugin.Popups/Prism.Plugin.Popups.csproj b/src/Prism.Plugin.Popups/Prism.Plugin.Popups.csproj index 145b67e..798bc5f 100644 --- a/src/Prism.Plugin.Popups/Prism.Plugin.Popups.csproj +++ b/src/Prism.Plugin.Popups/Prism.Plugin.Popups.csproj @@ -11,11 +11,18 @@ + + + + + + +