From a2148444bafd728090c39c1f40700b43baded1e4 Mon Sep 17 00:00:00 2001 From: "E.Z. Hart" Date: Wed, 4 May 2016 06:18:40 -0600 Subject: Add INavigationPageController (#149) --- .../AppCompat/NavigationPageRenderer.cs | 48 +++++++++++++--------- Xamarin.Forms.Platform.Android/Platform.cs | 6 +-- .../Renderers/NavigationRenderer.cs | 43 ++++++++++--------- 3 files changed, 55 insertions(+), 42 deletions(-) (limited to 'Xamarin.Forms.Platform.Android') diff --git a/Xamarin.Forms.Platform.Android/AppCompat/NavigationPageRenderer.cs b/Xamarin.Forms.Platform.Android/AppCompat/NavigationPageRenderer.cs index 30733c64..7196cf8c 100644 --- a/Xamarin.Forms.Platform.Android/AppCompat/NavigationPageRenderer.cs +++ b/Xamarin.Forms.Platform.Android/AppCompat/NavigationPageRenderer.cs @@ -15,6 +15,7 @@ using Android.Support.V4.Widget; using Android.Support.V7.Graphics.Drawable; using Android.Util; using Android.Views; +using Xamarin.Forms.Internals; using ActionBarDrawerToggle = Android.Support.V7.App.ActionBarDrawerToggle; using AView = Android.Views.View; using AToolbar = Android.Support.V7.Widget.Toolbar; @@ -137,11 +138,14 @@ namespace Xamarin.Forms.Platform.Android.AppCompat IVisualElementRenderer renderer = Android.Platform.GetRenderer(child); renderer?.Dispose(); } - Element.PushRequested -= OnPushed; - Element.PopRequested -= OnPopped; - Element.PopToRootRequested -= OnPoppedToRoot; - Element.InsertPageBeforeRequested -= OnInsertPageBeforeRequested; - Element.RemovePageRequested -= OnRemovePageRequested; + + var navController = (INavigationPageController)Element; + + navController.PushRequested -= OnPushed; + navController.PopRequested -= OnPopped; + navController.PopToRootRequested -= OnPoppedToRoot; + navController.InsertPageBeforeRequested -= OnInsertPageBeforeRequested; + navController.RemovePageRequested -= OnRemovePageRequested; Element.SendDisappearing(); } @@ -188,11 +192,13 @@ namespace Xamarin.Forms.Platform.Android.AppCompat if (e.OldElement != null) { - e.OldElement.PushRequested -= OnPushed; - e.OldElement.PopRequested -= OnPopped; - e.OldElement.PopToRootRequested -= OnPoppedToRoot; - e.OldElement.InsertPageBeforeRequested -= OnInsertPageBeforeRequested; - e.OldElement.RemovePageRequested -= OnRemovePageRequested; + var oldNavController = (INavigationPageController)e.OldElement; + + oldNavController.PushRequested -= OnPushed; + oldNavController.PopRequested -= OnPopped; + oldNavController.PopToRootRequested -= OnPoppedToRoot; + oldNavController.InsertPageBeforeRequested -= OnInsertPageBeforeRequested; + oldNavController.RemovePageRequested -= OnRemovePageRequested; RemoveAllViews(); if (_toolbar != null) @@ -220,14 +226,16 @@ namespace Xamarin.Forms.Platform.Android.AppCompat _toolbarTracker.AdditionalTargets = parents; UpdateMenu(); - e.NewElement.PushRequested += OnPushed; - e.NewElement.PopRequested += OnPopped; - e.NewElement.PopToRootRequested += OnPoppedToRoot; - e.NewElement.InsertPageBeforeRequested += OnInsertPageBeforeRequested; - e.NewElement.RemovePageRequested += OnRemovePageRequested; + var navController = (INavigationPageController)e.NewElement; + + navController.PushRequested += OnPushed; + navController.PopRequested += OnPopped; + navController.PopToRootRequested += OnPoppedToRoot; + navController.InsertPageBeforeRequested += OnInsertPageBeforeRequested; + navController.RemovePageRequested += OnRemovePageRequested; // If there is already stuff on the stack we need to push it - e.NewElement.StackCopy.Reverse().ForEach(p => PushViewAsync(p, false)); + ((INavigationPageController)e.NewElement).StackCopy.Reverse().ForEach(p => PushViewAsync(p, false)); } } @@ -415,7 +423,7 @@ namespace Xamarin.Forms.Platform.Android.AppCompat Task OnPopViewAsync(Page page, bool animated) { - Page pageToShow = Element.StackCopy.Skip(1).FirstOrDefault(); + Page pageToShow = ((INavigationPageController)Element).StackCopy.Skip(1).FirstOrDefault(); if (pageToShow == null) return Task.FromResult(false); @@ -593,10 +601,10 @@ namespace Xamarin.Forms.Platform.Android.AppCompat if (!removed) { UpdateToolbar(); - if (_drawerToggle != null && Element.StackDepth == 2) + if (_drawerToggle != null && ((INavigationPageController)Element).StackDepth == 2) AnimateArrowIn(); } - else if (_drawerToggle != null && Element.StackDepth == 2) + else if (_drawerToggle != null && ((INavigationPageController)Element).StackDepth == 2) AnimateArrowOut(); Device.StartTimer(TimeSpan.FromMilliseconds(200), () => @@ -680,7 +688,7 @@ namespace Xamarin.Forms.Platform.Android.AppCompat if (bar == null) return; - bool isNavigated = Element.StackDepth > 1; + bool isNavigated = ((INavigationPageController)Element).StackDepth > 1; bar.NavigationIcon = null; if (isNavigated) diff --git a/Xamarin.Forms.Platform.Android/Platform.cs b/Xamarin.Forms.Platform.Android/Platform.cs index 8c289ef4..c00b9544 100644 --- a/Xamarin.Forms.Platform.Android/Platform.cs +++ b/Xamarin.Forms.Platform.Android/Platform.cs @@ -872,7 +872,7 @@ namespace Xamarin.Forms.Platform.Android return false; bool hasMasterDetailPage = CurrentMasterDetailPage != null; - bool navigated = CurrentNavigationPage != null && CurrentNavigationPage.StackDepth > 1; + bool navigated = CurrentNavigationPage != null && ((INavigationPageController)CurrentNavigationPage).StackDepth > 1; bool navigationPageHasNavigationBar = CurrentNavigationPage != null && NavigationPage.GetHasNavigationBar(CurrentNavigationPage.CurrentPage); return navigationPageHasNavigationBar || (hasMasterDetailPage && !navigated); } @@ -880,7 +880,7 @@ namespace Xamarin.Forms.Platform.Android bool ShouldUpdateActionBarUpColor() { bool hasMasterDetailPage = CurrentMasterDetailPage != null; - bool navigated = CurrentNavigationPage != null && CurrentNavigationPage.StackDepth > 1; + bool navigated = CurrentNavigationPage != null && ((INavigationPageController)CurrentNavigationPage).StackDepth > 1; return (hasMasterDetailPage && navigated) || !hasMasterDetailPage; } @@ -903,7 +903,7 @@ namespace Xamarin.Forms.Platform.Android if (CurrentNavigationPage == null) return false; - bool pagePushed = CurrentNavigationPage.StackDepth > 1; + bool pagePushed = ((INavigationPageController)CurrentNavigationPage).StackDepth > 1; bool pushedPageHasBackButton = NavigationPage.GetHasBackButton(CurrentNavigationPage.CurrentPage); return pagePushed && pushedPageHasBackButton; diff --git a/Xamarin.Forms.Platform.Android/Renderers/NavigationRenderer.cs b/Xamarin.Forms.Platform.Android/Renderers/NavigationRenderer.cs index 91e052ca..395a0f82 100644 --- a/Xamarin.Forms.Platform.Android/Renderers/NavigationRenderer.cs +++ b/Xamarin.Forms.Platform.Android/Renderers/NavigationRenderer.cs @@ -2,6 +2,7 @@ using System; using System.Linq; using System.Threading.Tasks; using Android.Views; +using Xamarin.Forms.Internals; using AButton = Android.Widget.Button; using AView = Android.Views.View; using AndroidAnimation = Android.Animation; @@ -47,11 +48,13 @@ namespace Xamarin.Forms.Platform.Android if (Element != null) { - Element.PushRequested -= OnPushed; - Element.PopRequested -= OnPopped; - Element.PopToRootRequested -= OnPoppedToRoot; - Element.InsertPageBeforeRequested -= OnInsertPageBeforeRequested; - Element.RemovePageRequested -= OnRemovePageRequested; + var navController = (INavigationPageController)Element; + + navController.PushRequested -= OnPushed; + navController.PopRequested -= OnPopped; + navController.PopToRootRequested -= OnPoppedToRoot; + navController.InsertPageBeforeRequested -= OnInsertPageBeforeRequested; + navController.RemovePageRequested -= OnRemovePageRequested; } } @@ -76,25 +79,27 @@ namespace Xamarin.Forms.Platform.Android if (e.OldElement != null) { - NavigationPage oldNav = e.OldElement; - oldNav.PushRequested -= OnPushed; - oldNav.PopRequested -= OnPopped; - oldNav.PopToRootRequested -= OnPoppedToRoot; - oldNav.InsertPageBeforeRequested -= OnInsertPageBeforeRequested; - oldNav.RemovePageRequested -= OnRemovePageRequested; + var oldNavController = (INavigationPageController)e.OldElement; + + oldNavController.PushRequested -= OnPushed; + oldNavController.PopRequested -= OnPopped; + oldNavController.PopToRootRequested -= OnPoppedToRoot; + oldNavController.InsertPageBeforeRequested -= OnInsertPageBeforeRequested; + oldNavController.RemovePageRequested -= OnRemovePageRequested; RemoveAllViews(); } - NavigationPage nav = e.NewElement; - nav.PushRequested += OnPushed; - nav.PopRequested += OnPopped; - nav.PopToRootRequested += OnPoppedToRoot; - nav.InsertPageBeforeRequested += OnInsertPageBeforeRequested; - nav.RemovePageRequested += OnRemovePageRequested; + var newNavController = (INavigationPageController)e.NewElement; + + newNavController.PushRequested += OnPushed; + newNavController.PopRequested += OnPopped; + newNavController.PopToRootRequested += OnPoppedToRoot; + newNavController.InsertPageBeforeRequested += OnInsertPageBeforeRequested; + newNavController.RemovePageRequested += OnRemovePageRequested; // If there is already stuff on the stack we need to push it - nav.StackCopy.Reverse().ForEach(p => PushViewAsync(p, false)); + newNavController.StackCopy.Reverse().ForEach(p => PushViewAsync(p, false)); } protected override void OnLayout(bool changed, int l, int t, int r, int b) @@ -112,7 +117,7 @@ namespace Xamarin.Forms.Platform.Android protected virtual Task OnPopViewAsync(Page page, bool animated) { - Page pageToShow = Element.StackCopy.Skip(1).FirstOrDefault(); + Page pageToShow = ((INavigationPageController)Element).StackCopy.Skip(1).FirstOrDefault(); if (pageToShow == null) return Task.FromResult(false); -- cgit v1.2.3