Esempio n. 1
0
        public async Task PopAfterTrackingStarted()
        {
            var tracker = new ToolbarTracker();

            var toolbarItem1 = new ToolbarItem("Foo", "Foo.png", () => { });
            var toolbarItem2 = new ToolbarItem("Foo", "Foo.png", () => { });

            var page = new NavigationPage(new ContentPage())
            {
                ToolbarItems =
                {
                    toolbarItem1
                }
            };

            var firstPage = new ContentPage
            {
                ToolbarItems = { toolbarItem2 }
            };

            tracker.Target = page;

            await page.Navigation.PushAsync(firstPage);

            Assert.True(tracker.ToolbarItems.Contains(toolbarItem1));
            Assert.True(tracker.ToolbarItems.Contains(toolbarItem2));

            await page.Navigation.PopAsync();

            Assert.True(tracker.ToolbarItems.Contains(toolbarItem1));
            Assert.False(tracker.ToolbarItems.Contains(toolbarItem2));
        }
Esempio n. 2
0
        public void Constructor()
        {
            var tracker = new ToolbarTracker();

            Assert.Null(tracker.Target);
            Assert.False(tracker.ToolbarItems.Any());
        }
        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                Child.SendDisappearing();

                _tracker.Target             = null;
                _tracker.CollectionChanged -= TrackerOnCollectionChanged;
                _tracker = null;

                if (NavigationItem.RightBarButtonItems != null)
                {
                    for (var i = 0; i < NavigationItem.RightBarButtonItems.Length; i++)
                    {
                        NavigationItem.RightBarButtonItems[i].Dispose();
                    }
                }

                if (ToolbarItems != null)
                {
                    for (var i = 0; i < ToolbarItems.Length; i++)
                    {
                        ToolbarItems[i].Dispose();
                    }
                }
            }
            base.Dispose(disposing);
        }
            protected override void Dispose(bool disposing)
            {
                if (disposing)
                {
                    ((IPageController)Child).SendDisappearing();

                    if (Child != null)
                    {
                        Child.PropertyChanged -= HandleChildPropertyChanged;
                        Child = null;
                    }

                    _tracker.Target             = null;
                    _tracker.CollectionChanged -= TrackerOnCollectionChanged;
                    _tracker = null;

                    if (NavigationItem.RightBarButtonItems != null)
                    {
                        for (var i = 0; i < NavigationItem.RightBarButtonItems.Length; i++)
                        {
                            NavigationItem.RightBarButtonItems[i].Dispose();
                        }
                    }

                    if (ToolbarItems != null)
                    {
                        for (var i = 0; i < ToolbarItems.Length; i++)
                        {
                            ToolbarItems[i].Dispose();
                        }
                    }
                }
                base.Dispose(disposing);
            }
Esempio n. 5
0
        public void AdditionalTargets()
        {
            var tracker = new ToolbarTracker();

            var toolbarItem1 = new ToolbarItem("Foo", "Foo.png", () => { });
            var toolbarItem2 = new ToolbarItem("Foo", "Foo.png", () => { });

            var page = new ContentPage
            {
                ToolbarItems =
                {
                    toolbarItem1
                }
            };

            var additionalPage = new ContentPage
            {
                ToolbarItems = { toolbarItem2 }
            };

            tracker.Target            = page;
            tracker.AdditionalTargets = new[] { additionalPage };

            Assert.True(tracker.ToolbarItems.Contains(toolbarItem1));
            Assert.True(tracker.ToolbarItems.Contains(toolbarItem2));
        }
        protected override void OnElementChanged(ElementChangedEventArgs <NavigationPage> e)
        {
            if (_naviFrame == null)
            {
                _naviFrame = new Naviframe(Forms.NativeParent);
                _naviFrame.PreserveContentOnPop     = true;
                _naviFrame.DefaultBackButtonEnabled = false;
                _naviFrame.AnimationFinished       += OnAnimationFinished;

                SetNativeView(_naviFrame);
                _naviItemMap = new Dictionary <Page, NaviItem>();
            }

            if (_toolbarTracker == null)
            {
                _toolbarTracker = new ToolbarTracker();
                _toolbarTracker.CollectionChanged += OnToolbarCollectionChanged;
            }

            if (e.OldElement != null)
            {
                var navigation = e.OldElement as INavigationPageController;
                navigation.PopRequested              -= OnPopRequested;
                navigation.PopToRootRequested        -= OnPopToRootRequested;
                navigation.PushRequested             -= OnPushRequested;
                navigation.RemovePageRequested       -= OnRemovePageRequested;
                navigation.InsertPageBeforeRequested -= OnInsertPageBeforeRequested;

                var pageController = e.OldElement as IPageController;
                pageController.InternalChildren.CollectionChanged -= OnPageCollectionChanged;
            }

            if (e.NewElement != null)
            {
                var navigation = e.NewElement as INavigationPageController;
                navigation.PopRequested              += OnPopRequested;
                navigation.PopToRootRequested        += OnPopToRootRequested;
                navigation.PushRequested             += OnPushRequested;
                navigation.RemovePageRequested       += OnRemovePageRequested;
                navigation.InsertPageBeforeRequested += OnInsertPageBeforeRequested;

                var pageController = e.NewElement as IPageController;
                pageController.InternalChildren.CollectionChanged += OnPageCollectionChanged;

                foreach (Page page in pageController.InternalChildren)
                {
                    _naviItemMap[page]    = _naviFrame.Push(Platform.GetOrCreateRenderer(page).NativeView, SpanTitle(page.Title));
                    page.PropertyChanged += NavigationBarPropertyChangedHandler;

                    UpdateHasNavigationBar(page);
                }

                _toolbarTracker.Target = e.NewElement;
                _previousPage          = e.NewElement.CurrentPage;
            }
            base.OnElementChanged(e);
        }
Esempio n. 7
0
 public Platform(Windows.UI.Xaml.Controls.Page page)
 {
     _page                  = page;
     _renderer              = new Canvas();
     _renderer.SizeChanged += renderer_SizeChanged;
     NavigationService.Current.OnNewPage += Current_OnNewPage;
     _tracker = new ToolbarTracker();
     _tracker.CollectionChanged += (s, e) => UpdateAppBar();
 }
Esempio n. 8
0
		public void SimpleTrackEmpty ()
		{
			var tracker = new ToolbarTracker ();

			var page = new ContentPage ();
			tracker.Target = page;

			Assert.False (tracker.ToolbarItems.Any ());
		}
        protected override void OnElementChanged(ElementChangedEventArgs <NavigationPage> e)
        {
            base.OnElementChanged(e);

            if (e.OldElement != null)
            {
                var oldNavController = (INavigationPageController)e.OldElement;

                oldNavController.PushRequested             -= OnPushed;
                oldNavController.PopRequested              -= OnPopped;
                oldNavController.PopToRootRequested        -= OnPoppedToRoot;
                oldNavController.InsertPageBeforeRequested -= OnInsertPageBeforeRequested;
                oldNavController.RemovePageRequested       -= OnRemovePageRequested;

                RemoveAllViews();
                if (_toolbar != null)
                {
                    AddView(_toolbar);
                }
            }

            if (e.NewElement != null)
            {
                if (_toolbarTracker == null)
                {
                    SetupToolbar();
                    _toolbarTracker = new ToolbarTracker();
                    _toolbarTracker.CollectionChanged += ToolbarTrackerOnCollectionChanged;
                }

                var  parents = new List <Page>();
                Page root    = Element;
                while (!Application.IsApplicationOrNull(root.RealParent))
                {
                    root = (Page)root.RealParent;
                    parents.Add(root);
                }

                _toolbarTracker.Target            = e.NewElement;
                _toolbarTracker.AdditionalTargets = parents;
                UpdateMenu();

                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
                foreach (Page page in navController.Pages)
                {
                    PushViewAsync(page, false);
                }
            }
        }
Esempio n. 10
0
        protected override void OnElementChanged(ElementChangedEventArgs <NavigationPage> e)
        {
            base.OnElementChanged(e);

            if (e.OldElement != null)
            {
                var oldNavController = (INavigationPageController)e.OldElement;

                oldNavController.PushRequested             -= OnPushed;
                oldNavController.PopRequested              -= OnPopped;
                oldNavController.PopToRootRequested        -= OnPoppedToRoot;
                oldNavController.InsertPageBeforeRequested -= OnInsertPageBeforeRequested;
                oldNavController.RemovePageRequested       -= OnRemovePageRequested;

                RemoveAllViews();
                if (_toolbar != null)
                {
                    AddView(_toolbar);
                }
            }

            if (e.NewElement != null)
            {
                if (_toolbarTracker == null)
                {
                    SetupToolbar();
                    _toolbarTracker = new ToolbarTracker();
                    _toolbarTracker.CollectionChanged += ToolbarTrackerOnCollectionChanged;
                }

                var  parents = new List <Page>();
                Page root    = Element;
                while (!Application.IsApplicationOrNull(root.RealParent))
                {
                    root = (Page)root.RealParent;
                    parents.Add(root);
                }

                _toolbarTracker.Target            = e.NewElement;
                _toolbarTracker.AdditionalTargets = parents;
                UpdateMenu();

                var navController = (INavigationPageController)e.NewElement;

                navController.PushRequested             += OnPushed;
                navController.PopRequested              += OnPopped;
                navController.PopToRootRequested        += OnPoppedToRoot;
                navController.InsertPageBeforeRequested += OnInsertPageBeforeRequested;
                navController.RemovePageRequested       += OnRemovePageRequested;

                if (_isAttachedToWindow && Element.IsAttachedToRoot())
                {
                    PushCurrentPages();
                }
            }
        }
Esempio n. 11
0
        public Platform(Windows.UI.Xaml.Controls.Page page)
        {
            _page = page;
            _renderer = new Canvas();
            _renderer.SizeChanged += renderer_SizeChanged;
            NavigationService.Current.OnNewPage += Current_OnNewPage;
            _tracker = new ToolbarTracker();
            _tracker.CollectionChanged += (s, e) => UpdateAppBar();

        }
Esempio n. 12
0
        public void SimpleTrackEmpty()
        {
            var tracker = new ToolbarTracker();

            var page = new ContentPage();

            tracker.Target = page;

            Assert.False(tracker.ToolbarItems.Any());
        }
        public override void Connect(IView navigationView, NavigationLayout nativeView)
        {
            base.Connect(navigationView, nativeView);

            if (ToolbarTracker == null)
            {
                ToolbarTracker = new ToolbarTracker();
                ToolbarTracker.CollectionChanged += ToolbarTrackerOnCollectionChanged;
            }

            ToolbarTracker.AdditionalTargets = NavigationView.GetParentPages();
        }
        protected override void Dispose(bool disposing)
        {
            _toolbarTracker.CollectionChanged -= toolbarCollectionChanged;

            Element.Pushed -= pagePusshed;
            Element.Popped -= pagePopped;

            _toolbar.SetNavigationOnClickListener(null);
            _navigationBackListener?.Dispose();
            _navigationCustomListener?.Dispose();

            _toolbar        = null;
            _toolbarTracker = null;

            base.Dispose(disposing);
        }
Esempio n. 15
0
		public void SimpleTrackWithItems ()
		{
			var tracker = new ToolbarTracker ();

			ToolbarItem item1, item2;
			var page = new ContentPage {
				ToolbarItems = {
					new ToolbarItem ("Foo", "Foo.png", () => {}),
					new ToolbarItem ("Bar", "Bar.png", () => {})
				}
			};
			tracker.Target = page;

			Assert.True (tracker.ToolbarItems.Contains (page.ToolbarItems[0]));
			Assert.True (tracker.ToolbarItems.Contains (page.ToolbarItems[1]));
		}
Esempio n. 16
0
        protected override void OnElementChanged(ElementChangedEventArgs <NavigationPage> e)
        {
            if (_naviFrame == null)
            {
                _naviFrame = new Naviframe(System.Maui.Maui.NativeParent);
                _naviFrame.PreserveContentOnPop     = true;
                _naviFrame.DefaultBackButtonEnabled = false;
                _naviFrame.AnimationFinished       += OnAnimationFinished;

                SetNativeView(_naviFrame);
                _naviItemMap = new Dictionary <Page, NaviItem>();
            }

            if (_toolbarTracker == null)
            {
                _toolbarTracker = new ToolbarTracker();
                _toolbarTracker.CollectionChanged += OnToolbarCollectionChanged;
            }

            if (e.OldElement != null)
            {
                var navigation = e.OldElement as INavigationPageController;
                navigation.PopRequested              -= OnPopRequested;
                navigation.PopToRootRequested        -= OnPopToRootRequested;
                navigation.PushRequested             -= OnPushRequested;
                navigation.RemovePageRequested       -= OnRemovePageRequested;
                navigation.InsertPageBeforeRequested -= OnInsertPageBeforeRequested;

                var pageController = e.OldElement as IPageController;
                pageController.InternalChildren.CollectionChanged -= OnPageCollectionChanged;
            }

            if (e.NewElement != null)
            {
                var navigation = e.NewElement as INavigationPageController;
                navigation.PopRequested              += OnPopRequested;
                navigation.PopToRootRequested        += OnPopToRootRequested;
                navigation.PushRequested             += OnPushRequested;
                navigation.RemovePageRequested       += OnRemovePageRequested;
                navigation.InsertPageBeforeRequested += OnInsertPageBeforeRequested;

                _toolbarTracker.Target = e.NewElement;
                _previousPage          = e.NewElement.CurrentPage;
            }
            base.OnElementChanged(e);
        }
Esempio n. 17
0
        public void SimpleTrackWithItems()
        {
            var tracker = new ToolbarTracker();

            ToolbarItem item1, item2;
            var         page = new ContentPage {
                ToolbarItems =
                {
                    new ToolbarItem("Foo", "Foo.png", () => {}),
                    new ToolbarItem("Bar", "Bar.png", () => {})
                }
            };

            tracker.Target = page;

            Assert.True(tracker.ToolbarItems.Contains(page.ToolbarItems[0]));
            Assert.True(tracker.ToolbarItems.Contains(page.ToolbarItems[1]));
        }
Esempio n. 18
0
        protected override void OnElementChanged(ElementChangedEventArgs <NavigationPage> e)
        {
            base.OnElementChanged(e);

            if (e.OldElement != null)
            {
                var oldNavController = (INavigationPageController)e.OldElement;

                oldNavController.PushRequested             -= OnPushed;
                oldNavController.PopRequested              -= OnPopped;
                oldNavController.PopToRootRequested        -= OnPoppedToRoot;
                oldNavController.InsertPageBeforeRequested -= OnInsertPageBeforeRequested;
                oldNavController.RemovePageRequested       -= OnRemovePageRequested;

                RemoveAllViews();
            }

            if (e.NewElement != null)
            {
                if (_toolbarTracker == null)
                {
                    SetupToolbar();
                    _toolbarTracker = new ToolbarTracker();
                    _toolbarTracker.CollectionChanged += ToolbarTrackerOnCollectionChanged;
                }

                _toolbarTracker.Target            = e.NewElement;
                _toolbarTracker.AdditionalTargets = Element.GetParentPages();
                UpdateMenu();

                var navController = (INavigationPageController)e.NewElement;

                navController.PushRequested             += OnPushed;
                navController.PopRequested              += OnPopped;
                navController.PopToRootRequested        += OnPoppedToRoot;
                navController.InsertPageBeforeRequested += OnInsertPageBeforeRequested;
                navController.RemovePageRequested       += OnRemovePageRequested;

                if (_isAttachedToWindow && Element.IsAttachedToRoot())
                {
                    PushCurrentPages();
                }
            }
        }
Esempio n. 19
0
        public void TrackPreConstructedTabbedPage()
        {
            var tracker = new ToolbarTracker();

            var toolbarItem1 = new ToolbarItem("Foo", "Foo.png", () => { });
            var toolbarItem2 = new ToolbarItem("Foo", "Foo.png", () => { });
            var toolbarItem3 = new ToolbarItem("Foo", "Foo.png", () => { });

            var subPage1 = new ContentPage
            {
                ToolbarItems = { toolbarItem1 }
            };

            var subPage2 = new ContentPage
            {
                ToolbarItems = { toolbarItem2, toolbarItem3 }
            };

            var tabbedpage = new TabbedPage
            {
                Children =
                {
                    subPage1,
                    subPage2
                }
            };

            tabbedpage.CurrentPage = subPage1;

            tracker.Target = tabbedpage;

            Assert.True(tracker.ToolbarItems.Count() == 1);
            Assert.True(tracker.ToolbarItems.First() == subPage1.ToolbarItems[0]);

            bool changed = false;

            tracker.CollectionChanged += (sender, args) => changed = true;

            tabbedpage.CurrentPage = subPage2;

            Assert.True(tracker.ToolbarItems.Count() == 2);
            Assert.True(tracker.ToolbarItems.First() == subPage2.ToolbarItems[0]);
            Assert.True(tracker.ToolbarItems.Last() == subPage2.ToolbarItems[1]);
        }
        protected override void OnElementChanged(Xamarin.Forms.Platform.Android.ElementChangedEventArgs <NavigationPage> e)
        {
            base.OnElementChanged(e);


            if (e.OldElement != null)
            {
                _toolbarTracker.CollectionChanged -= toolbarCollectionChanged;
                Element.Pushed -= pagePusshed;
                Element.Popped -= pagePopped;
            }

            if (e.NewElement != null)
            {
                var fieldInfo = typeof(NavigationPageRenderer).GetField("_toolbarTracker", BindingFlags.Instance | BindingFlags.NonPublic);
                _toolbarTracker = (ToolbarTracker)fieldInfo.GetValue(this);

                fieldInfo = typeof(NavigationPageRenderer).GetField("_toolbar", BindingFlags.Instance | BindingFlags.NonPublic);
                _toolbar  = (Toolbar)fieldInfo.GetValue(this);

                _toolbarTracker.CollectionChanged += toolbarCollectionChanged;

                _toolbar.SetTitleTextColor(ForeColor);
                _toolbar.SetSubtitleTextColor(ForeColor);
                Element.Pushed += pagePusshed;
                Element.Popped += pagePopped;

                _navigationBackListener = new NavigationIconBack(Element);

                UpdateMenu();

                if (Element.Parent is Xamarin.Forms.Application)
                {
                    var statusBarColor = (Element as NavigationPageEx).StatusBarBackColor;
                    if (statusBarColor != Xamarin.Forms.Color.Default)
                    {
                        (Context as FormsAppCompatActivity).Window.SetStatusBarColor(statusBarColor.ToAndroid());
                    }
                }
            }
        }
Esempio n. 21
0
        public void UnsetTarget()
        {
            var tracker = new ToolbarTracker();

            ToolbarItem item1, item2;
            var         page = new ContentPage {
                ToolbarItems =
                {
                    new ToolbarItem("Foo", "Foo.png", () => {}),
                    new ToolbarItem("Bar", "Bar.png", () => {})
                }
            };

            tracker.Target = page;

            Assert.True(tracker.ToolbarItems.Count() == 2);

            tracker.Target = null;

            Assert.False(tracker.ToolbarItems.Any());
        }
Esempio n. 22
0
		public void TrackPreConstructedTabbedPage ()
		{
			var tracker = new ToolbarTracker ();

			var toolbarItem1 = new ToolbarItem ("Foo", "Foo.png", () => { });
			var toolbarItem2 = new ToolbarItem ("Foo", "Foo.png", () => { });
			var toolbarItem3 = new ToolbarItem ("Foo", "Foo.png", () => { });

			var subPage1 = new ContentPage {
				ToolbarItems = {toolbarItem1}
			};

			var subPage2 = new ContentPage {
				ToolbarItems = {toolbarItem2, toolbarItem3}
			};

			var tabbedpage = new TabbedPage {
				Children = {
					subPage1,
					subPage2
				}
			};

			tabbedpage.CurrentPage = subPage1;

			tracker.Target = tabbedpage;

			Assert.True (tracker.ToolbarItems.Count () == 1);
			Assert.True (tracker.ToolbarItems.First () == subPage1.ToolbarItems[0]);

			bool changed = false;
			tracker.CollectionChanged += (sender, args) => changed = true;

			tabbedpage.CurrentPage = subPage2;

			Assert.True (tracker.ToolbarItems.Count () == 2);
			Assert.True (tracker.ToolbarItems.First () == subPage2.ToolbarItems[0]);
			Assert.True (tracker.ToolbarItems.Last () == subPage2.ToolbarItems[1]);
		}
Esempio n. 23
0
        protected override void Dispose(bool disposing)
        {
            if (_disposed)
            {
                return;
            }

            _disposed = true;

            if (disposing)
            {
                DeviceDisplay.MainDisplayInfoChanged -= DeviceInfoPropertyChanged;

                if (NavigationPageController != null)
                {
                    var navController = NavigationPageController;

                    navController.PushRequested             -= OnPushed;
                    navController.PopRequested              -= OnPopped;
                    navController.PopToRootRequested        -= OnPoppedToRoot;
                    navController.InsertPageBeforeRequested -= OnInsertPageBeforeRequested;
                    navController.RemovePageRequested       -= OnRemovePageRequested;
                }

                if (Current != null)
                {
                    Current.PropertyChanged -= CurrentOnPropertyChanged;
                }

                FragmentManager fm = FragmentManager;

                if (!fm.IsDestroyed)
                {
                    FragmentTransaction trans = fm.BeginTransactionEx();
                    foreach (Fragment fragment in _fragmentStack)
                    {
                        trans.RemoveEx(fragment);
                    }
                    trans.CommitAllowingStateLossEx();
                    fm.ExecutePendingTransactionsEx();
                }

                _toolbar.RemoveView(_titleView);
                _titleView?.Dispose();
                _titleView = null;

                if (_titleViewRenderer != null)
                {
                    Platform.ClearRenderer(_titleViewRenderer.View);
                    _titleViewRenderer.Dispose();
                    _titleViewRenderer = null;
                }

                _toolbar.RemoveView(_titleIconView);
                _titleIconView?.Dispose();
                _titleIconView = null;

                _imageSource = null;

                if (_toolbarTracker != null)
                {
                    _toolbarTracker.CollectionChanged -= ToolbarTrackerOnCollectionChanged;

                    _toolbar.DisposeMenuItems(_currentToolbarItems, OnToolbarItemPropertyChanged);

                    _toolbarTracker.Target = null;
                    _toolbarTracker        = null;
                }

                if (_currentMenuItems != null)
                {
                    _currentMenuItems.Clear();
                    _currentMenuItems = null;
                }

                if (_currentToolbarItems != null)
                {
                    _currentToolbarItems.Clear();
                    _currentToolbarItems = null;
                }

                if (_toolbar != null)
                {
                    _toolbar.SetNavigationOnClickListener(null);
                    _toolbar.Menu.Clear();

                    RemoveView(_toolbar);

                    _toolbar.Dispose();
                    _toolbar = null;
                }

                if (_drawerLayout.IsAlive() && _drawerListener.IsAlive())
                {
                    _drawerLayout.RemoveDrawerListener(_drawerListener);

                    RemoveView(_drawerLayout);
                }

                if (_drawerListener != null)
                {
                    _drawerListener.Dispose();
                    _drawerListener = null;
                }

                if (_drawerToggle != null)
                {
                    _drawerToggle.ToolbarNavigationClickListener = null;
                    _drawerToggle.Dispose();
                    _drawerToggle = null;
                }

                if (_backgroundDrawable != null)
                {
                    _backgroundDrawable.Dispose();
                    _backgroundDrawable = null;
                }

                Current = null;

                // We dispose the child renderers after cleaning up everything related to DrawerLayout in case
                // one of the children is a FlyoutPage (which may dispose of the DrawerLayout).
                if (Element != null)
                {
                    foreach (Element element in PageController.InternalChildren)
                    {
                        var child = element as VisualElement;
                        if (child == null)
                        {
                            continue;
                        }

                        IVisualElementRenderer renderer = Platform.GetRenderer(child);
                        renderer?.Dispose();
                    }
                }
            }

            base.Dispose(disposing);
        }
Esempio n. 24
0
		public void Constructor ()
		{
			var tracker = new ToolbarTracker ();
			Assert.Null (tracker.Target);
			Assert.False (tracker.ToolbarItems.Any ());
		}
Esempio n. 25
0
        protected override void Dispose(bool disposing)
        {
            if (disposing && !_disposed)
            {
                _disposed = true;

                if (_titleViewRenderer != null)
                {
                    Android.Platform.ClearRenderer(_titleViewRenderer.View);
                    _titleViewRenderer.Dispose();
                    _titleViewRenderer = null;
                }

                _toolbar.RemoveView(_titleView);
                _titleView?.Dispose();
                _titleView = null;

                _toolbar.RemoveView(_titleIconView);
                _titleIconView?.Dispose();
                _titleIconView = null;

                _imageSource = null;

                if (_toolbarTracker != null)
                {
                    _toolbarTracker.CollectionChanged -= ToolbarTrackerOnCollectionChanged;
                    _toolbarTracker.Target             = null;
                    _toolbarTracker = null;
                }

                if (_toolbar != null)
                {
                    _toolbar.SetNavigationOnClickListener(null);
                    _toolbar.Dispose();
                    _toolbar = null;
                }

                if (_drawerLayout != null && _drawerListener != null)
                {
                    _drawerLayout.RemoveDrawerListener(_drawerListener);
                }

                if (_drawerListener != null)
                {
                    _drawerListener.Dispose();
                    _drawerListener = null;
                }

                if (_drawerToggle != null)
                {
                    _drawerToggle.Dispose();
                    _drawerToggle = null;
                }

                if (_backgroundDrawable != null)
                {
                    _backgroundDrawable.Dispose();
                    _backgroundDrawable = null;
                }

                Current = null;

                // We dispose the child renderers after cleaning up everything related to DrawerLayout in case
                // one of the children is a MasterDetailPage (which may dispose of the DrawerLayout).
                if (Element != null)
                {
                    foreach (Element element in PageController.InternalChildren)
                    {
                        var child = element as VisualElement;
                        if (child == null)
                        {
                            continue;
                        }

                        IVisualElementRenderer renderer = Android.Platform.GetRenderer(child);
                        renderer?.Dispose();
                    }

                    var navController = NavigationPageController;

                    navController.PushRequested             -= OnPushed;
                    navController.PopRequested              -= OnPopped;
                    navController.PopToRootRequested        -= OnPoppedToRoot;
                    navController.InsertPageBeforeRequested -= OnInsertPageBeforeRequested;
                    navController.RemovePageRequested       -= OnRemovePageRequested;
                }

                Device.Info.PropertyChanged -= DeviceInfoPropertyChanged;

                // API only exists on newer android YAY
                if ((int)Build.VERSION.SdkInt >= 17)
                {
                    FragmentManager fm = FragmentManager;

                    if (!fm.IsDestroyed)
                    {
                        FragmentTransaction trans = fm.BeginTransactionEx();
                        foreach (Fragment fragment in _fragmentStack)
                        {
                            trans.RemoveEx(fragment);
                        }
                        trans.CommitAllowingStateLossEx();
                        fm.ExecutePendingTransactionsEx();
                    }
                }
            }

            base.Dispose(disposing);
        }
Esempio n. 26
0
        protected override void Dispose(bool disposing)
        {
            if (disposing && !_disposed)
            {
                _disposed = true;

                var activity = (FormsAppCompatActivity)Context;

                // API only exists on newer android YAY
                if ((int)Build.VERSION.SdkInt >= 17)
                {
                    if (!activity.IsDestroyed)
                    {
                        FragmentManager     fm    = FragmentManager;
                        FragmentTransaction trans = fm.BeginTransaction();
                        foreach (Fragment fragment in _fragmentStack)
                        {
                            trans.Remove(fragment);
                        }
                        trans.CommitAllowingStateLoss();
                        fm.ExecutePendingTransactions();
                    }
                }

                if (Element != null)
                {
                    for (var i = 0; i < Element.InternalChildren.Count; i++)
                    {
                        var child = Element.InternalChildren[i] as VisualElement;
                        if (child == null)
                        {
                            continue;
                        }
                        IVisualElementRenderer renderer = Android.Platform.GetRenderer(child);
                        renderer?.Dispose();
                    }
                    Element.PushRequested             -= OnPushed;
                    Element.PopRequested              -= OnPopped;
                    Element.PopToRootRequested        -= OnPoppedToRoot;
                    Element.InsertPageBeforeRequested -= OnInsertPageBeforeRequested;
                    Element.RemovePageRequested       -= OnRemovePageRequested;
                    Element.SendDisappearing();
                }

                if (_toolbarTracker != null)
                {
                    _toolbarTracker.CollectionChanged -= ToolbarTrackerOnCollectionChanged;
                    _toolbarTracker.Target             = null;
                    _toolbarTracker = null;
                }

                if (_toolbar != null)
                {
                    _toolbar.NavigationClick -= BarOnNavigationClick;
                    _toolbar.Dispose();
                    _toolbar = null;
                }

                Current = null;

                Device.Info.PropertyChanged -= DeviceInfoPropertyChanged;
            }

            base.Dispose(disposing);
        }
Esempio n. 27
0
		public async Task PopAfterTrackingStarted ()
		{
			var tracker = new ToolbarTracker ();

			var toolbarItem1 = new ToolbarItem ("Foo", "Foo.png", () => { });
			var toolbarItem2 = new ToolbarItem ("Foo", "Foo.png", () => { });

			var page = new NavigationPage (new ContentPage ()) {
				ToolbarItems = {
					toolbarItem1
				}
			};

			var firstPage = new ContentPage {
				ToolbarItems = { toolbarItem2 }
			};

			tracker.Target = page;

			await page.Navigation.PushAsync (firstPage);

			Assert.True (tracker.ToolbarItems.Contains (toolbarItem1));
			Assert.True (tracker.ToolbarItems.Contains (toolbarItem2));

			await page.Navigation.PopAsync ();

			Assert.True (tracker.ToolbarItems.Contains (toolbarItem1));
			Assert.False (tracker.ToolbarItems.Contains (toolbarItem2));
		}
Esempio n. 28
0
		public void UnsetTarget ()
		{
			var tracker = new ToolbarTracker ();

			ToolbarItem item1, item2;
			var page = new ContentPage {
				ToolbarItems = {
					new ToolbarItem ("Foo", "Foo.png", () => {}),
					new ToolbarItem ("Bar", "Bar.png", () => {})
				}
			};
			tracker.Target = page;

			Assert.True (tracker.ToolbarItems.Count () == 2);

			tracker.Target = null;

			Assert.False (tracker.ToolbarItems.Any ());
		}
		public GtkToolbarTracker()
		{
			_toolbarTracker = new ToolbarTracker();
			_toolbarTracker.CollectionChanged += ToolbarTrackerOnCollectionChanged;
		}
Esempio n. 30
0
		public void AdditionalTargets ()
		{
			var tracker = new ToolbarTracker ();

			var toolbarItem1 = new ToolbarItem ("Foo", "Foo.png", () => { });
			var toolbarItem2 = new ToolbarItem ("Foo", "Foo.png", () => { });

			var page = new ContentPage {
				ToolbarItems = {
					toolbarItem1
				}
			};

			var additionalPage = new ContentPage {
				ToolbarItems = {toolbarItem2}
			};

			tracker.Target = page;
			tracker.AdditionalTargets = new[] {additionalPage};

			Assert.True (tracker.ToolbarItems.Contains (toolbarItem1));
			Assert.True (tracker.ToolbarItems.Contains (toolbarItem2));
		}