diff options
author | E.Z. Hart <hartez@users.noreply.github.com> | 2016-06-16 09:45:09 -0600 |
---|---|---|
committer | Rui Marinho <me@ruimarinho.net> | 2016-06-16 16:45:09 +0100 |
commit | d5be2f0144ca810fdfbf59808d526c26fe86017e (patch) | |
tree | 3ad7e4465307cd6d633184e05d85eb3a4df59e01 /Xamarin.Forms.Platform.Android | |
parent | 04f7bd296ee67af9189ecd7fdfbd2808ca16ce9a (diff) | |
download | xamarin-forms-d5be2f0144ca810fdfbf59808d526c26fe86017e.tar.gz xamarin-forms-d5be2f0144ca810fdfbf59808d526c26fe86017e.tar.bz2 xamarin-forms-d5be2f0144ca810fdfbf59808d526c26fe86017e.zip |
Prep Page for removal of InternalsVisibleTo (#150)
Diffstat (limited to 'Xamarin.Forms.Platform.Android')
20 files changed, 135 insertions, 104 deletions
diff --git a/Xamarin.Forms.Platform.Android/AppCompat/CarouselPageRenderer.cs b/Xamarin.Forms.Platform.Android/AppCompat/CarouselPageRenderer.cs index a42d2863..fb6d5b55 100644 --- a/Xamarin.Forms.Platform.Android/AppCompat/CarouselPageRenderer.cs +++ b/Xamarin.Forms.Platform.Android/AppCompat/CarouselPageRenderer.cs @@ -24,6 +24,8 @@ namespace Xamarin.Forms.Platform.Android.AppCompat { } + IPageController PageController => Element as IPageController; + void ViewPager.IOnPageChangeListener.OnPageSelected(int position) { Element.CurrentPage = Element.Children[position]; @@ -54,7 +56,7 @@ namespace Xamarin.Forms.Platform.Android.AppCompat } if (Element != null) - Element.InternalChildren.CollectionChanged -= OnChildrenCollectionChanged; + PageController.InternalChildren.CollectionChanged -= OnChildrenCollectionChanged; } base.Dispose(disposing); @@ -63,13 +65,13 @@ namespace Xamarin.Forms.Platform.Android.AppCompat protected override void OnAttachedToWindow() { base.OnAttachedToWindow(); - Element.SendAppearing(); + PageController.SendAppearing(); } protected override void OnDetachedFromWindow() { base.OnDetachedFromWindow(); - Element.SendDisappearing(); + PageController.SendDisappearing(); } protected override void OnElementChanged(ElementChangedEventArgs<CarouselPage> e) @@ -79,7 +81,7 @@ namespace Xamarin.Forms.Platform.Android.AppCompat var activity = (FormsAppCompatActivity)Context; if (e.OldElement != null) - e.OldElement.InternalChildren.CollectionChanged -= OnChildrenCollectionChanged; + ((IPageController)e.OldElement).InternalChildren.CollectionChanged -= OnChildrenCollectionChanged; if (e.NewElement != null) { @@ -100,7 +102,7 @@ namespace Xamarin.Forms.Platform.Android.AppCompat if (carouselPage.CurrentPage != null) ScrollToCurrentPage(); - carouselPage.InternalChildren.CollectionChanged += OnChildrenCollectionChanged; + ((IPageController)carouselPage).InternalChildren.CollectionChanged += OnChildrenCollectionChanged; } } @@ -123,7 +125,7 @@ namespace Xamarin.Forms.Platform.Android.AppCompat if (width > 0 && height > 0) { - Element.ContainerArea = new Rectangle(0, 0, context.FromPixels(width), context.FromPixels(height)); + PageController.ContainerArea = new Rectangle(0, 0, context.FromPixels(width), context.FromPixels(height)); pager.Layout(0, 0, width, b); } diff --git a/Xamarin.Forms.Platform.Android/AppCompat/FragmentContainer.cs b/Xamarin.Forms.Platform.Android/AppCompat/FragmentContainer.cs index cc35b1a3..34abfda8 100644 --- a/Xamarin.Forms.Platform.Android/AppCompat/FragmentContainer.cs +++ b/Xamarin.Forms.Platform.Android/AppCompat/FragmentContainer.cs @@ -31,6 +31,8 @@ namespace Xamarin.Forms.Platform.Android.AppCompat public Page Page => (Page)_pageReference?.Target; + IPageController PageController => Page as IPageController; + public override bool UserVisibleHint { get { return base.UserVisibleHint; } @@ -41,9 +43,9 @@ namespace Xamarin.Forms.Platform.Android.AppCompat return; _isVisible = value; if (_isVisible.Value) - Page?.SendAppearing(); + PageController?.SendAppearing(); else - Page?.SendDisappearing(); + PageController?.SendDisappearing(); } } @@ -106,20 +108,20 @@ namespace Xamarin.Forms.Platform.Android.AppCompat return; if (hidden) - Page.SendDisappearing(); + PageController.SendDisappearing(); else - Page.SendAppearing(); + PageController.SendAppearing(); } public override void OnPause() { - Page?.SendDisappearing(); + PageController?.SendDisappearing(); base.OnPause(); } public override void OnResume() { - Page?.SendAppearing(); + PageController?.SendAppearing(); base.OnResume(); } } diff --git a/Xamarin.Forms.Platform.Android/AppCompat/FrameRenderer.cs b/Xamarin.Forms.Platform.Android/AppCompat/FrameRenderer.cs index c2dd8e69..b57233ba 100644 --- a/Xamarin.Forms.Platform.Android/AppCompat/FrameRenderer.cs +++ b/Xamarin.Forms.Platform.Android/AppCompat/FrameRenderer.cs @@ -182,7 +182,7 @@ namespace Xamarin.Forms.Platform.Android.AppCompat if (Element == null) return; - var children = Element.LogicalChildren; + var children = ((IElementController)Element).LogicalChildren; for (var i = 0; i < children.Count; i++) { var visualElement = children[i] as VisualElement; diff --git a/Xamarin.Forms.Platform.Android/AppCompat/MasterDetailPageRenderer.cs b/Xamarin.Forms.Platform.Android/AppCompat/MasterDetailPageRenderer.cs index 0173f485..18153218 100644 --- a/Xamarin.Forms.Platform.Android/AppCompat/MasterDetailPageRenderer.cs +++ b/Xamarin.Forms.Platform.Android/AppCompat/MasterDetailPageRenderer.cs @@ -51,6 +51,10 @@ namespace Xamarin.Forms.Platform.Android.AppCompat } } + IPageController MasterPageController => Element.Master as IPageController; + IPageController DetailPageController => Element.Detail as IPageController; + IPageController PageController => Element as IPageController; + void IDrawerListener.OnDrawerClosed(global::Android.Views.View drawerView) { } @@ -212,13 +216,13 @@ namespace Xamarin.Forms.Platform.Android.AppCompat protected override void OnAttachedToWindow() { base.OnAttachedToWindow(); - Element.SendAppearing(); + PageController.SendAppearing(); } protected override void OnDetachedFromWindow() { base.OnDetachedFromWindow(); - Element.SendDisappearing(); + PageController.SendDisappearing(); } protected virtual void OnElementChanged(VisualElement oldElement, VisualElement newElement) @@ -279,14 +283,14 @@ namespace Xamarin.Forms.Platform.Android.AppCompat void MasterDetailPageAppearing(object sender, EventArgs e) { - Element.Master?.SendAppearing(); - Element.Detail?.SendAppearing(); + MasterPageController?.SendAppearing(); + DetailPageController?.SendAppearing(); } void MasterDetailPageDisappearing(object sender, EventArgs e) { - Element.Master?.SendDisappearing(); - Element.Detail?.SendDisappearing(); + MasterPageController?.SendDisappearing(); + DetailPageController?.SendDisappearing(); } void OnBackButtonPressed(object sender, BackButtonPressedEventArgs backButtonPressedEventArgs) diff --git a/Xamarin.Forms.Platform.Android/AppCompat/NavigationPageRenderer.cs b/Xamarin.Forms.Platform.Android/AppCompat/NavigationPageRenderer.cs index 1132c8fa..277be331 100644 --- a/Xamarin.Forms.Platform.Android/AppCompat/NavigationPageRenderer.cs +++ b/Xamarin.Forms.Platform.Android/AppCompat/NavigationPageRenderer.cs @@ -73,6 +73,8 @@ namespace Xamarin.Forms.Platform.Android.AppCompat FragmentManager FragmentManager => _fragmentManager ?? (_fragmentManager = ((FormsAppCompatActivity)Context).SupportFragmentManager); + IPageController PageController => Element as IPageController; + bool ToolbarVisible { get { return _toolbarVisible; } @@ -130,9 +132,9 @@ namespace Xamarin.Forms.Platform.Android.AppCompat if (Element != null) { - for (var i = 0; i < Element.InternalChildren.Count; i++) + for (var i = 0; i < PageController.InternalChildren.Count; i++) { - var child = Element.InternalChildren[i] as VisualElement; + var child = PageController.InternalChildren[i] as VisualElement; if (child == null) continue; IVisualElementRenderer renderer = Android.Platform.GetRenderer(child); @@ -146,7 +148,7 @@ namespace Xamarin.Forms.Platform.Android.AppCompat navController.PopToRootRequested -= OnPoppedToRoot; navController.InsertPageBeforeRequested -= OnInsertPageBeforeRequested; navController.RemovePageRequested -= OnRemovePageRequested; - Element.SendDisappearing(); + PageController.SendDisappearing(); } if (_toolbarTracker != null) @@ -174,7 +176,7 @@ namespace Xamarin.Forms.Platform.Android.AppCompat protected override void OnAttachedToWindow() { base.OnAttachedToWindow(); - Element.SendAppearing(); + PageController.SendAppearing(); _fragmentStack.Last().UserVisibleHint = true; RegisterToolbar(); UpdateToolbar(); @@ -183,7 +185,7 @@ namespace Xamarin.Forms.Platform.Android.AppCompat protected override void OnDetachedFromWindow() { base.OnDetachedFromWindow(); - Element.SendDisappearing(); + PageController.SendDisappearing(); } protected override void OnElementChanged(ElementChangedEventArgs<NavigationPage> e) @@ -272,7 +274,7 @@ namespace Xamarin.Forms.Platform.Android.AppCompat int containerHeight = ToolbarVisible ? internalHeight : b - t; containerHeight -= ContainerPadding; - Element.ContainerArea = new Rectangle(0, 0, Context.FromPixels(r - l), Context.FromPixels(containerHeight)); + PageController.ContainerArea = new Rectangle(0, 0, Context.FromPixels(r - l), Context.FromPixels(containerHeight)); // Potential for optimization here, the exact conditions by which you don't need to do this are complex // and the cost of doing when it's not needed is moderate to low since the layout will short circuit pretty fast Element.ForceLayout(); @@ -393,7 +395,7 @@ namespace Xamarin.Forms.Platform.Android.AppCompat { UpdateToolbar(); - int index = Element.InternalChildren.IndexOf(before); + int index = PageController.InternalChildren.IndexOf(before); if (index == -1) throw new InvalidOperationException("This should never happen, please file a bug"); @@ -464,7 +466,7 @@ namespace Xamarin.Forms.Platform.Android.AppCompat if (masterDetailPage == null) { - masterDetailPage = Element.InternalChildren[0] as MasterDetailPage; + masterDetailPage = PageController.InternalChildren[0] as MasterDetailPage; if (masterDetailPage == null) return; } diff --git a/Xamarin.Forms.Platform.Android/AppCompat/Platform.cs b/Xamarin.Forms.Platform.Android/AppCompat/Platform.cs index 01e8dcc1..0bad79b1 100644 --- a/Xamarin.Forms.Platform.Android/AppCompat/Platform.cs +++ b/Xamarin.Forms.Platform.Android/AppCompat/Platform.cs @@ -41,6 +41,8 @@ namespace Xamarin.Forms.Platform.Android.AppCompat Page Page { get; set; } + IPageController CurrentPageController => _navModel.CurrentPage as IPageController; + public void Dispose() { if (_disposed) @@ -79,7 +81,7 @@ namespace Xamarin.Forms.Platform.Android.AppCompat Task<Page> INavigation.PopModalAsync(bool animated) { Page modal = _navModel.PopModal(); - modal.SendDisappearing(); + ((IPageController)modal).SendDisappearing(); var source = new TaskCompletionSource<Page>(); IVisualElementRenderer modalRenderer = Android.Platform.GetRenderer(modal); @@ -95,7 +97,7 @@ namespace Xamarin.Forms.Platform.Android.AppCompat modalContainer.RemoveFromParent(); modalContainer.Dispose(); source.TrySetResult(modal); - _navModel.CurrentPage?.SendAppearing(); + CurrentPageController?.SendAppearing(); modalContainer = null; } }); @@ -105,7 +107,7 @@ namespace Xamarin.Forms.Platform.Android.AppCompat modalContainer.RemoveFromParent(); modalContainer.Dispose(); source.TrySetResult(modal); - _navModel.CurrentPage?.SendAppearing(); + CurrentPageController?.SendAppearing(); } } @@ -139,7 +141,7 @@ namespace Xamarin.Forms.Platform.Android.AppCompat async Task INavigation.PushModalAsync(Page modal, bool animated) { - _navModel.CurrentPage?.SendDisappearing(); + CurrentPageController?.SendDisappearing(); _navModel.PushModal(modal); @@ -151,7 +153,7 @@ namespace Xamarin.Forms.Platform.Android.AppCompat // Verify that the modal is still on the stack if (_navModel.CurrentPage == modal) - modal.SendAppearing(); + ((IPageController)modal).SendAppearing(); } void INavigation.RemovePage(Page page) diff --git a/Xamarin.Forms.Platform.Android/AppCompat/TabbedPageRenderer.cs b/Xamarin.Forms.Platform.Android/AppCompat/TabbedPageRenderer.cs index 4bd54906..243e5c14 100644 --- a/Xamarin.Forms.Platform.Android/AppCompat/TabbedPageRenderer.cs +++ b/Xamarin.Forms.Platform.Android/AppCompat/TabbedPageRenderer.cs @@ -44,6 +44,8 @@ namespace Xamarin.Forms.Platform.Android.AppCompat } } + IPageController PageController => Element as IPageController; + void IManageFragments.SetFragmentManager(FragmentManager childFragmentManager) { if (_fragmentManager == null) @@ -114,7 +116,7 @@ namespace Xamarin.Forms.Platform.Android.AppCompat } if (Element != null) - Element.InternalChildren.CollectionChanged -= OnChildrenCollectionChanged; + PageController.InternalChildren.CollectionChanged -= OnChildrenCollectionChanged; } base.Dispose(disposing); @@ -123,13 +125,13 @@ namespace Xamarin.Forms.Platform.Android.AppCompat protected override void OnAttachedToWindow() { base.OnAttachedToWindow(); - Element.SendAppearing(); + PageController.SendAppearing(); } protected override void OnDetachedFromWindow() { base.OnDetachedFromWindow(); - Element.SendDisappearing(); + PageController.SendDisappearing(); } protected override void OnElementChanged(ElementChangedEventArgs<TabbedPage> e) @@ -139,7 +141,7 @@ namespace Xamarin.Forms.Platform.Android.AppCompat var activity = (FormsAppCompatActivity)Context; if (e.OldElement != null) - e.OldElement.InternalChildren.CollectionChanged -= OnChildrenCollectionChanged; + ((IPageController)e.OldElement).InternalChildren.CollectionChanged -= OnChildrenCollectionChanged; if (e.NewElement != null) { @@ -177,7 +179,7 @@ namespace Xamarin.Forms.Platform.Android.AppCompat ScrollToCurrentPage(); UpdateIgnoreContainerAreas(); - tabbedPage.InternalChildren.CollectionChanged += OnChildrenCollectionChanged; + ((IPageController)tabbedPage).InternalChildren.CollectionChanged += OnChildrenCollectionChanged; UpdateBarBackgroundColor(); UpdateBarTextColor(); } @@ -216,11 +218,11 @@ namespace Xamarin.Forms.Platform.Android.AppCompat if (width > 0 && height > 0) { - Element.ContainerArea = new Rectangle(0, context.FromPixels(tabsHeight), context.FromPixels(width), context.FromPixels(height - tabsHeight)); + PageController.ContainerArea = new Rectangle(0, context.FromPixels(tabsHeight), context.FromPixels(width), context.FromPixels(height - tabsHeight)); - for (var i = 0; i < Element.InternalChildren.Count; i++) + for (var i = 0; i < PageController.InternalChildren.Count; i++) { - var child = Element.InternalChildren[i] as VisualElement; + var child = PageController.InternalChildren[i] as VisualElement; if (child == null) continue; IVisualElementRenderer renderer = Android.Platform.GetRenderer(child); @@ -267,7 +269,7 @@ namespace Xamarin.Forms.Platform.Android.AppCompat void UpdateIgnoreContainerAreas() { - foreach (Page child in Element.Children) + foreach (IPageController child in Element.Children) child.IgnoresContainerArea = child is NavigationPage; } @@ -275,16 +277,16 @@ namespace Xamarin.Forms.Platform.Android.AppCompat { TabLayout tabs = _tabLayout; - if (position >= Element.InternalChildren.Count) + if (position >= PageController.InternalChildren.Count) return; - var leftPage = (Page)Element.InternalChildren[position]; + var leftPage = (Page)PageController.InternalChildren[position]; IVisualElementRenderer leftRenderer = Android.Platform.GetRenderer(leftPage); if (leftRenderer == null) return; - if (offset <= 0 || position >= Element.InternalChildren.Count - 1) + if (offset <= 0 || position >= PageController.InternalChildren.Count - 1) { var leftNavRenderer = leftRenderer as NavigationPageRenderer; if (leftNavRenderer != null) @@ -294,7 +296,7 @@ namespace Xamarin.Forms.Platform.Android.AppCompat } else { - var rightPage = (Page)Element.InternalChildren[position + 1]; + var rightPage = (Page)PageController.InternalChildren[position + 1]; IVisualElementRenderer rightRenderer = Android.Platform.GetRenderer(rightPage); var leftHeight = 0; diff --git a/Xamarin.Forms.Platform.Android/Platform.cs b/Xamarin.Forms.Platform.Android/Platform.cs index a37929fd..65c3b8cf 100644 --- a/Xamarin.Forms.Platform.Android/Platform.cs +++ b/Xamarin.Forms.Platform.Android/Platform.cs @@ -71,6 +71,8 @@ namespace Xamarin.Forms.Platform.Android #endregion + IPageController CurrentPageController => _navModel.CurrentPage as IPageController; + ActionBar ActionBar { get { return ((Activity)_context).ActionBar; } @@ -195,7 +197,7 @@ namespace Xamarin.Forms.Platform.Android { Page modal = _navModel.PopModal(); - modal.SendDisappearing(); + ((IPageController)modal).SendDisappearing(); var source = new TaskCompletionSource<Page>(); IVisualElementRenderer modalRenderer = GetRenderer(modal); @@ -210,7 +212,7 @@ namespace Xamarin.Forms.Platform.Android modalRenderer.ViewGroup.RemoveFromParent(); modalRenderer.Dispose(); source.TrySetResult(modal); - _navModel.CurrentPage?.SendAppearing(); + CurrentPageController?.SendAppearing(); } }); } @@ -219,7 +221,7 @@ namespace Xamarin.Forms.Platform.Android modalRenderer.ViewGroup.RemoveFromParent(); modalRenderer.Dispose(); source.TrySetResult(modal); - _navModel.CurrentPage?.SendAppearing(); + CurrentPageController?.SendAppearing(); } } @@ -256,7 +258,7 @@ namespace Xamarin.Forms.Platform.Android async Task INavigation.PushModalAsync(Page modal, bool animated) { - _navModel.CurrentPage?.SendDisappearing(); + CurrentPageController?.SendDisappearing(); _navModel.PushModal(modal); @@ -266,7 +268,7 @@ namespace Xamarin.Forms.Platform.Android // Verify that the modal is still on the stack if (_navModel.CurrentPage == modal) - modal.SendAppearing(); + ((IPageController)modal).SendAppearing(); _toolbarTracker.Target = _navModel.Roots.Last(); @@ -563,7 +565,7 @@ namespace Xamarin.Forms.Platform.Android result.AddRange(AncestorPagesOfPage(((MasterDetailPage)root).Detail)); else { - foreach (Page page in root.InternalChildren.OfType<Page>()) + foreach (Page page in ((IPageController)root).InternalChildren.OfType<Page>()) result.AddRange(AncestorPagesOfPage(page)); } diff --git a/Xamarin.Forms.Platform.Android/RendererPool.cs b/Xamarin.Forms.Platform.Android/RendererPool.cs index 95a28778..447de3fd 100644 --- a/Xamarin.Forms.Platform.Android/RendererPool.cs +++ b/Xamarin.Forms.Platform.Android/RendererPool.cs @@ -25,7 +25,7 @@ namespace Xamarin.Forms.Platform.Android public void ClearChildrenRenderers() { - if (_parent.Element.LogicalChildren.Count == 0) + if (((IElementController)_parent.Element).LogicalChildren.Count == 0) return; ClearChildrenRenderers(_oldElement); } @@ -51,7 +51,7 @@ namespace Xamarin.Forms.Platform.Android if (view == null) return; - foreach (Element logicalChild in view.LogicalChildren) + foreach (Element logicalChild in ((IElementController)view).LogicalChildren) { var child = logicalChild as VisualElement; if (child != null) diff --git a/Xamarin.Forms.Platform.Android/Renderers/CarouselPageAdapter.cs b/Xamarin.Forms.Platform.Android/Renderers/CarouselPageAdapter.cs index 345501d5..b7e98bae 100644 --- a/Xamarin.Forms.Platform.Android/Renderers/CarouselPageAdapter.cs +++ b/Xamarin.Forms.Platform.Android/Renderers/CarouselPageAdapter.cs @@ -15,6 +15,8 @@ namespace Xamarin.Forms.Platform.Android bool _ignoreAndroidSelection; CarouselPage _page; + IElementController ElementController => _page as IElementController; + public CarouselPageAdapter(ViewPager pager, CarouselPage page, Context context) { _pager = pager; @@ -43,7 +45,7 @@ namespace Xamarin.Forms.Platform.Android return; int currentItem = _pager.CurrentItem; - _page.CurrentPage = currentItem >= 0 && currentItem < _page.LogicalChildren.Count ? _page.LogicalChildren[currentItem] as ContentPage : null; + _page.CurrentPage = currentItem >= 0 && currentItem < ElementController.LogicalChildren.Count ? ElementController.LogicalChildren[currentItem] as ContentPage : null; } public override void DestroyItem(ViewGroup p0, int p1, Object p2) @@ -117,7 +119,7 @@ namespace Xamarin.Forms.Platform.Android { if (disposing && _page != null) { - foreach (Element element in _page.LogicalChildren) + foreach (Element element in ElementController.LogicalChildren) { var childPage = element as VisualElement; diff --git a/Xamarin.Forms.Platform.Android/Renderers/CarouselPageRenderer.cs b/Xamarin.Forms.Platform.Android/Renderers/CarouselPageRenderer.cs index 859e78d2..3774da03 100644 --- a/Xamarin.Forms.Platform.Android/Renderers/CarouselPageRenderer.cs +++ b/Xamarin.Forms.Platform.Android/Renderers/CarouselPageRenderer.cs @@ -13,6 +13,8 @@ namespace Xamarin.Forms.Platform.Android AutoPackage = false; } + IPageController PageController => Element as IPageController; + protected override void Dispose(bool disposing) { if (disposing && _viewPager != null) @@ -34,13 +36,13 @@ namespace Xamarin.Forms.Platform.Android adapter.UpdateCurrentItem(); - Element.SendAppearing(); + PageController.SendAppearing(); } protected override void OnDetachedFromWindow() { base.OnDetachedFromWindow(); - Element.SendDisappearing(); + PageController.SendDisappearing(); } protected override void OnElementChanged(ElementChangedEventArgs<CarouselPage> e) @@ -91,7 +93,7 @@ namespace Xamarin.Forms.Platform.Android void UpdateCurrentItem() { int index = CarouselPage.GetIndex(Element.CurrentPage); - if (index < 0 || index >= Element.LogicalChildren.Count) + if (index < 0 || index >= ((IElementController)Element).LogicalChildren.Count) return; _viewPager.CurrentItem = index; diff --git a/Xamarin.Forms.Platform.Android/Renderers/ImageRenderer.cs b/Xamarin.Forms.Platform.Android/Renderers/ImageRenderer.cs index fb51f158..1f8a7763 100644 --- a/Xamarin.Forms.Platform.Android/Renderers/ImageRenderer.cs +++ b/Xamarin.Forms.Platform.Android/Renderers/ImageRenderer.cs @@ -11,6 +11,8 @@ namespace Xamarin.Forms.Platform.Android { bool _isDisposed; + IElementController ElementController => Element as IElementController; + public ImageRenderer() { AutoPackage = false; @@ -98,8 +100,7 @@ namespace Xamarin.Forms.Platform.Android if (!_isDisposed) { Control.SetImageBitmap(bitmap); - if (bitmap != null) - bitmap.Dispose(); + bitmap?.Dispose(); ((IImageController)Element).SetIsLoading(false); ((IVisualElementController)Element).NativeSizeChanged(); diff --git a/Xamarin.Forms.Platform.Android/Renderers/MasterDetailRenderer.cs b/Xamarin.Forms.Platform.Android/Renderers/MasterDetailRenderer.cs index 09c0c7c7..ec9c620e 100644 --- a/Xamarin.Forms.Platform.Android/Renderers/MasterDetailRenderer.cs +++ b/Xamarin.Forms.Platform.Android/Renderers/MasterDetailRenderer.cs @@ -44,6 +44,10 @@ namespace Xamarin.Forms.Platform.Android } } + IPageController MasterPageController => _page.Master as IPageController; + IPageController DetailPageController => _page.Detail as IPageController; + IPageController PageController => Element as IPageController; + public void OnDrawerClosed(AView drawerView) { } @@ -184,13 +188,13 @@ namespace Xamarin.Forms.Platform.Android protected override void OnAttachedToWindow() { base.OnAttachedToWindow(); - ((Page)Element).SendAppearing(); + PageController.SendAppearing(); } protected override void OnDetachedFromWindow() { base.OnDetachedFromWindow(); - ((Page)Element).SendDisappearing(); + PageController.SendDisappearing(); } protected virtual void OnElementChanged(VisualElement oldElement, VisualElement newElement) @@ -256,20 +260,14 @@ namespace Xamarin.Forms.Platform.Android void MasterDetailPageAppearing(object sender, EventArgs e) { - if (_page.Master != null) - _page.Master.SendAppearing(); - - if (_page.Detail != null) - _page.Detail.SendAppearing(); + MasterPageController?.SendAppearing(); + DetailPageController?.SendAppearing(); } void MasterDetailPageDisappearing(object sender, EventArgs e) { - if (_page.Master != null) - _page.Master.SendDisappearing(); - - if (_page.Detail != null) - _page.Detail.SendDisappearing(); + MasterPageController?.SendDisappearing(); + DetailPageController?.SendDisappearing(); } void OnBackButtonPressed(object sender, BackButtonPressedEventArgs backButtonPressedEventArgs) diff --git a/Xamarin.Forms.Platform.Android/Renderers/NavigationRenderer.cs b/Xamarin.Forms.Platform.Android/Renderers/NavigationRenderer.cs index dc9a8fe1..f326cb3c 100644 --- a/Xamarin.Forms.Platform.Android/Renderers/NavigationRenderer.cs +++ b/Xamarin.Forms.Platform.Android/Renderers/NavigationRenderer.cs @@ -35,11 +35,13 @@ namespace Xamarin.Forms.Platform.Android return OnPushAsync(page, animated); } + IPageController PageController => Element as IPageController; + protected override void Dispose(bool disposing) { if (disposing) { - foreach (VisualElement child in Element.InternalChildren) + foreach (VisualElement child in PageController.InternalChildren) { IVisualElementRenderer renderer = Platform.GetRenderer(child); if (renderer != null) @@ -64,13 +66,13 @@ namespace Xamarin.Forms.Platform.Android protected override void OnAttachedToWindow() { base.OnAttachedToWindow(); - Element.SendAppearing(); + PageController.SendAppearing(); } protected override void OnDetachedFromWindow() { base.OnDetachedFromWindow(); - Element.SendDisappearing(); + PageController.SendDisappearing(); } protected override void OnElementChanged(ElementChangedEventArgs<NavigationPage> e) @@ -132,7 +134,7 @@ namespace Xamarin.Forms.Platform.Android void InsertPageBefore(Page page, Page before) { - int index = Element.InternalChildren.IndexOf(before); + int index = ((IPageController)Element).InternalChildren.IndexOf(before); if (index == -1) throw new InvalidOperationException("This should never happen, please file a bug"); @@ -220,9 +222,9 @@ namespace Xamarin.Forms.Platform.Android { // animate out if (containerToAdd.Parent != this) - AddView(containerToAdd, Element.LogicalChildren.IndexOf(rendererToAdd.Element)); + AddView(containerToAdd, ((IElementController)Element).LogicalChildren.IndexOf(rendererToAdd.Element)); else - ((Page)rendererToAdd.Element).SendAppearing(); + ((IPageController)rendererToAdd.Element).SendAppearing(); containerToAdd.Visibility = ViewStates.Visible; if (containerToRemove != null) @@ -260,7 +262,7 @@ namespace Xamarin.Forms.Platform.Android if (!containerAlreadyAdded) AddView(containerToAdd); else - ((Page)rendererToAdd.Element).SendAppearing(); + ((IPageController)rendererToAdd.Element).SendAppearing(); if (existing) Element.ForceLayout(); @@ -273,8 +275,7 @@ namespace Xamarin.Forms.Platform.Android if (containerToRemove != null && containerToRemove.Handle != IntPtr.Zero) { containerToRemove.Visibility = ViewStates.Gone; - if (pageToRemove != null) - pageToRemove.SendDisappearing(); + ((IPageController)pageToRemove)?.SendDisappearing(); } s_currentAnimation = null; tcs.TrySetResult(true); @@ -296,10 +297,10 @@ namespace Xamarin.Forms.Platform.Android if (containerToAdd.Parent != this) AddView(containerToAdd); else - ((Page)rendererToAdd.Element).SendAppearing(); + ((IPageController)rendererToAdd.Element).SendAppearing(); if (containerToRemove != null && !removed) - pageToRemove.SendDisappearing(); + ((IPageController)pageToRemove).SendDisappearing(); if (existing) Element.ForceLayout(); diff --git a/Xamarin.Forms.Platform.Android/Renderers/PageRenderer.cs b/Xamarin.Forms.Platform.Android/Renderers/PageRenderer.cs index 24d85aa8..7db4a4ad 100644 --- a/Xamarin.Forms.Platform.Android/Renderers/PageRenderer.cs +++ b/Xamarin.Forms.Platform.Android/Renderers/PageRenderer.cs @@ -12,9 +12,11 @@ namespace Xamarin.Forms.Platform.Android return true; } + IPageController PageController => Element as IPageController; + protected override void Dispose(bool disposing) { - Element?.SendDisappearing(); + PageController?.SendDisappearing(); base.Dispose(disposing); } @@ -24,7 +26,7 @@ namespace Xamarin.Forms.Platform.Android var pageContainer = Parent as PageContainer; if (pageContainer != null && pageContainer.IsInFragment) return; - Element.SendAppearing(); + PageController.SendAppearing(); } protected override void OnDetachedFromWindow() @@ -33,7 +35,7 @@ namespace Xamarin.Forms.Platform.Android var pageContainer = Parent as PageContainer; if (pageContainer != null && pageContainer.IsInFragment) return; - Element.SendDisappearing(); + PageController.SendDisappearing(); } protected override void OnElementChanged(ElementChangedEventArgs<Page> e) diff --git a/Xamarin.Forms.Platform.Android/Renderers/PickerRenderer.cs b/Xamarin.Forms.Platform.Android/Renderers/PickerRenderer.cs index e9cc3942..57d93b8f 100644 --- a/Xamarin.Forms.Platform.Android/Renderers/PickerRenderer.cs +++ b/Xamarin.Forms.Platform.Android/Renderers/PickerRenderer.cs @@ -23,6 +23,8 @@ namespace Xamarin.Forms.Platform.Android AutoPackage = false; } + IElementController ElementController => Element as IElementController; + protected override void Dispose(bool disposing) { if (disposing && !_isDisposed) @@ -77,7 +79,7 @@ namespace Xamarin.Forms.Platform.Android else if (_dialog != null) { _dialog.Hide(); - ((IElementController)Element).SetValueFromRenderer(VisualElement.IsFocusedPropertyKey, false); + ElementController.SetValueFromRenderer(VisualElement.IsFocusedPropertyKey, false); Control.ClearFocus(); _dialog = null; } @@ -101,14 +103,14 @@ namespace Xamarin.Forms.Platform.Android var layout = new LinearLayout(Context) { Orientation = Orientation.Vertical }; layout.AddView(picker); - ((IElementController)Element).SetValueFromRenderer(VisualElement.IsFocusedPropertyKey, true); + ElementController.SetValueFromRenderer(VisualElement.IsFocusedPropertyKey, true); var builder = new AlertDialog.Builder(Context); builder.SetView(layout); builder.SetTitle(model.Title ?? ""); builder.SetNegativeButton(global::Android.Resource.String.Cancel, (s, a) => { - ((IElementController)Element).SetValueFromRenderer(VisualElement.IsFocusedPropertyKey, false); + ElementController.SetValueFromRenderer(VisualElement.IsFocusedPropertyKey, false); // It is possible for the Content of the Page to be changed when Focus is changed. // In this case, we'll lose our Control. Control?.ClearFocus(); @@ -116,14 +118,14 @@ namespace Xamarin.Forms.Platform.Android }); builder.SetPositiveButton(global::Android.Resource.String.Ok, (s, a) => { - ((IElementController)Element).SetValueFromRenderer(Picker.SelectedIndexProperty, picker.Value); + ElementController.SetValueFromRenderer(Picker.SelectedIndexProperty, picker.Value); // It is possible for the Content of the Page to be changed on SelectedIndexChanged. // In this case, the Element & Control will no longer exist. if (Element != null) { if (model.Items.Count > 0 && Element.SelectedIndex >= 0) Control.Text = model.Items[Element.SelectedIndex]; - ((IElementController)Element).SetValueFromRenderer(VisualElement.IsFocusedPropertyKey, false); + ElementController.SetValueFromRenderer(VisualElement.IsFocusedPropertyKey, false); // It is also possible for the Content of the Page to be changed when Focus is changed. // In this case, we'll lose our Control. Control?.ClearFocus(); diff --git a/Xamarin.Forms.Platform.Android/Renderers/TabbedRenderer.cs b/Xamarin.Forms.Platform.Android/Renderers/TabbedRenderer.cs index 35404a64..f2878a80 100644 --- a/Xamarin.Forms.Platform.Android/Renderers/TabbedRenderer.cs +++ b/Xamarin.Forms.Platform.Android/Renderers/TabbedRenderer.cs @@ -11,6 +11,8 @@ namespace Xamarin.Forms.Platform.Android AutoPackage = false; } + IPageController PageController => Element as IPageController; + protected override void Dispose(bool disposing) { if (disposing && Element != null && Element.Children.Count > 0) @@ -31,13 +33,13 @@ namespace Xamarin.Forms.Platform.Android protected override void OnAttachedToWindow() { base.OnAttachedToWindow(); - Element.SendAppearing(); + PageController.SendAppearing(); } protected override void OnDetachedFromWindow() { base.OnDetachedFromWindow(); - Element.SendDisappearing(); + PageController.SendDisappearing(); } protected override void OnElementChanged(ElementChangedEventArgs<TabbedPage> e) diff --git a/Xamarin.Forms.Platform.Android/Renderers/TimePickerRenderer.cs b/Xamarin.Forms.Platform.Android/Renderers/TimePickerRenderer.cs index 010eda72..4cb5d2d4 100644 --- a/Xamarin.Forms.Platform.Android/Renderers/TimePickerRenderer.cs +++ b/Xamarin.Forms.Platform.Android/Renderers/TimePickerRenderer.cs @@ -19,11 +19,13 @@ namespace Xamarin.Forms.Platform.Android AutoPackage = false; } + IElementController ElementController => Element as IElementController; + void TimePickerDialog.IOnTimeSetListener.OnTimeSet(ATimePicker view, int hourOfDay, int minute) { - ((IElementController)Element).SetValueFromRenderer(VisualElement.IsFocusedPropertyKey, false); + ElementController.SetValueFromRenderer(VisualElement.IsFocusedPropertyKey, false); - ((IElementController)Element).SetValueFromRenderer(TimePicker.TimeProperty, new TimeSpan(hourOfDay, minute, 0)); + ElementController.SetValueFromRenderer(TimePicker.TimeProperty, new TimeSpan(hourOfDay, minute, 0)); Control.ClearFocus(); _dialog = null; } @@ -66,7 +68,7 @@ namespace Xamarin.Forms.Platform.Android else if (_dialog != null) { _dialog.Hide(); - ((IElementController)Element).SetValueFromRenderer(VisualElement.IsFocusedPropertyKey, false); + ElementController.SetValueFromRenderer(VisualElement.IsFocusedPropertyKey, false); Control.ClearFocus(); _dialog = null; } @@ -75,7 +77,7 @@ namespace Xamarin.Forms.Platform.Android void OnClick() { TimePicker view = Element; - ((IElementController)Element).SetValueFromRenderer(VisualElement.IsFocusedPropertyKey, true); + ElementController.SetValueFromRenderer(VisualElement.IsFocusedPropertyKey, true); _dialog = new TimePickerDialog(Context, this, view.Time.Hours, view.Time.Minutes, false); _dialog.Show(); diff --git a/Xamarin.Forms.Platform.Android/VisualElementPackager.cs b/Xamarin.Forms.Platform.Android/VisualElementPackager.cs index e7e6ab6f..e6db1c6a 100644 --- a/Xamarin.Forms.Platform.Android/VisualElementPackager.cs +++ b/Xamarin.Forms.Platform.Android/VisualElementPackager.cs @@ -29,6 +29,8 @@ namespace Xamarin.Forms.Platform.Android _renderer.ElementChanged += (sender, args) => SetElement(args.OldElement, args.NewElement); } + IElementController ElementController => _renderer.Element as IElementController; + public void Dispose() { if (_disposed) @@ -96,9 +98,9 @@ namespace Xamarin.Forms.Platform.Android void EnsureChildOrder() { - for (var i = 0; i < _renderer.Element.LogicalChildren.Count; i++) + for (var i = 0; i < ElementController.LogicalChildren.Count; i++) { - Element child = _renderer.Element.LogicalChildren[i]; + Element child = ElementController.LogicalChildren[i]; var element = (VisualElement)child; if (element != null) { @@ -113,7 +115,8 @@ namespace Xamarin.Forms.Platform.Android var view = e.Element as VisualElement; if (view != null) AddChild(view); - if (_renderer.Element.LogicalChildren[_renderer.Element.LogicalChildren.Count - 1] != view) + + if (ElementController.LogicalChildren[ElementController.LogicalChildren.Count - 1] != view) EnsureChildOrder(); } @@ -155,8 +158,8 @@ namespace Xamarin.Forms.Platform.Android { sameChildrenTypes = true; - oldChildren = oldElement.LogicalChildren; - newChildren = newElement.LogicalChildren; + oldChildren = ((IElementController)oldElement).LogicalChildren; + newChildren = ((IElementController)newElement).LogicalChildren; if (oldChildren.Count == newChildren.Count) { for (var i = 0; i < oldChildren.Count; i++) @@ -193,7 +196,7 @@ namespace Xamarin.Forms.Platform.Android newElement.ChildrenReordered += _childReorderedHandler; - newChildren = newChildren ?? newElement.LogicalChildren; + newChildren = newChildren ?? ((IElementController)newElement).LogicalChildren; for (var i = 0; i < newChildren.Count; i++) { diff --git a/Xamarin.Forms.Platform.Android/VisualElementRenderer.cs b/Xamarin.Forms.Platform.Android/VisualElementRenderer.cs index 893adcaa..5274f897 100644 --- a/Xamarin.Forms.Platform.Android/VisualElementRenderer.cs +++ b/Xamarin.Forms.Platform.Android/VisualElementRenderer.cs @@ -306,7 +306,7 @@ namespace Xamarin.Forms.Platform.Android if (Element == null) return; - ReadOnlyCollection<Element> children = Element.LogicalChildren; + ReadOnlyCollection<Element> children = ((IElementController)Element).LogicalChildren; for (var i = 0; i < children.Count; i++) { var visualElement = children[i] as VisualElement; |