Beispiel #1
0
        void RemovePage(Page page)
        {
            if (!_isAttachedToWindow)
            {
                PushCurrentPages();
            }

            Fragment fragment = GetPageFragment(page);

            if (fragment == null)
            {
                return;
            }

#if DEBUG
            // Enables logging of moveToState operations to logcat
#pragma warning disable CS0618 // Type or member is obsolete
            FragmentManager.EnableDebugLogging(true);
#pragma warning restore CS0618 // Type or member is obsolete
#endif

            // Go ahead and take care of the fragment bookkeeping for the page being removed
            FragmentTransaction transaction = FragmentManager.BeginTransactionEx();
            transaction.RemoveEx(fragment);
            transaction.CommitAllowingStateLossEx();

            // And remove the fragment from our own stack
            _fragmentStack.Remove(fragment);

            PostDelayed(() => UpdateToolbar(), 10);
        }
Beispiel #2
0
        void AddTransitionTimer(TaskCompletionSource <bool> tcs, Fragment fragment, FragmentManager fragmentManager, IReadOnlyCollection <Fragment> fragmentsToRemove, int duration, bool shouldUpdateToolbar)
        {
            Device.StartTimer(TimeSpan.FromMilliseconds(duration), () =>
            {
                tcs.TrySetResult(true);
                Current?.SendAppearing();
                if (shouldUpdateToolbar)
                {
                    UpdateToolbar();
                }

                if (fragmentsToRemove.Count > 0)
                {
                    FragmentTransaction fragmentTransaction = fragmentManager.BeginTransactionEx();

                    foreach (Fragment frag in fragmentsToRemove)
                    {
                        fragmentTransaction.RemoveEx(frag);
                    }

                    fragmentTransaction.CommitAllowingStateLossEx();
                }

                return(false);
            });
        }
Beispiel #3
0
        void SetupUserInterface()
        {
            activity = this.Context as Activity;
            view     = activity.LayoutInflater.Inflate(Resource.Layout.AdvancedViewerLayout, this, false);

            mDocumentView = view.FindViewById <DocumentView>(Resource.Id.document_view);

            var             context      = this.Context;
            FragmentManager childManager = null;

            if (context is FragmentActivity)
            {
                var activity = context as FragmentActivity;
                var manager  = activity.SupportFragmentManager;

                var fragments = manager.Fragments;
                if (fragments.Count > 0)
                {
                    childManager = fragments[0].ChildFragmentManager;
                }
                if (childManager != null)
                {
                    mDocumentView.OpenDocument(GetFile(), "", GetConfig(), childManager);
                }
            }
        }
Beispiel #4
0
        protected virtual IMvxFragmentView CreateFragment(
            FragmentManager fragmentManager,
            MvxBasePresentationAttribute attribute,
            Type fragmentType)
        {
            ValidateArguments(attribute);

            if (fragmentManager == null)
            {
                throw new ArgumentNullException(nameof(fragmentManager));
            }

            if (fragmentType == null)
            {
                throw new ArgumentNullException(nameof(fragmentType));
            }

            try
            {
                var fragmentClass = Class.FromType(fragmentType);
                var fragment      = (IMvxFragmentView)fragmentManager.FragmentFactory.Instantiate(
                    fragmentClass.ClassLoader, fragmentClass.Name);
                return(fragment);
            }
            catch (System.Exception ex)
            {
                _logger.Value?.Log(LogLevel.Error, ex, "Cannot create Fragment {fragmentName}", fragmentType.Name);
                throw new MvxException(ex, $"Cannot create Fragment '{fragmentType.Name}'");
            }
        }
Beispiel #5
0
 protected virtual void OnNavigationViewFragmentResumed(AndroidX.Fragment.App.FragmentManager fm, NavigationViewFragment navHostPageFragment)
 {
     if (IsInitialNavigation)
     {
         NavigationFinished(NavigationView);
     }
 }
Beispiel #6
0
            public override void OnFragmentResumed(AndroidX.Fragment.App.FragmentManager fm, AndroidX.Fragment.App.Fragment f)
            {
                if (f is NavigationViewFragment pf)
                {
                    _stackNavigationManager.OnNavigationViewFragmentResumed(fm, pf);
                }

                AToolbar?nativeToolbar = null;
                IToolbar?toolbar       = null;

                if (_stackNavigationManager.NavigationView?.Toolbar is IToolbar tb &&
                    tb?.Handler?.NativeView is AToolbar ntb)
                {
                    nativeToolbar = ntb;
                    toolbar       = tb;
                }

                // Wire up the toolbar to the currently made visible Fragment
                var controller          = NavHostFragment.FindNavController(f);
                var appbarConfigBuilder =
                    new AppBarConfiguration
                    .Builder(_stackNavigationManager.NavGraph);

                if (nativeToolbar != null && toolbar != null && toolbar.Handler?.MauiContext != null)
                {
                    if (toolbar.Handler is ToolbarHandler th)
                    {
                        th.SetupWithNavController(controller, _stackNavigationManager);
                    }
                }
            }
Beispiel #7
0
        private void PopFragment(FragmentManager fragmentManager, MvxFragmentPresentationAttribute fragmentAttribute,
                                 Fragment fragmentToPop)
        {
            var ft = fragmentManager.BeginTransaction();

            if (!fragmentAttribute.EnterAnimation.Equals(int.MinValue) &&
                !fragmentAttribute.ExitAnimation.Equals(int.MinValue))
            {
                if (!fragmentAttribute.PopEnterAnimation.Equals(int.MinValue) &&
                    !fragmentAttribute.PopExitAnimation.Equals(int.MinValue))
                {
                    ft.SetCustomAnimations(
                        fragmentAttribute.EnterAnimation,
                        fragmentAttribute.ExitAnimation,
                        fragmentAttribute.PopEnterAnimation,
                        fragmentAttribute.PopExitAnimation);
                }
                else
                {
                    ft.SetCustomAnimations(
                        fragmentAttribute.EnterAnimation,
                        fragmentAttribute.ExitAnimation);
                }
            }

            if (fragmentAttribute.TransitionStyle != int.MinValue)
            {
                ft.SetTransitionStyle(fragmentAttribute.TransitionStyle);
            }

            ft.Remove(fragmentToPop);
            ft.CommitAllowingStateLoss();

            OnFragmentPopped(ft, fragmentToPop, fragmentAttribute);
        }
Beispiel #8
0
        protected override void Dispose(bool disposing)
        {
            if (_disposed)
            {
                return;
            }

            _disposed = true;

            if (disposing)
            {
                if (_currentFragment != null && !FragmentManager.IsDestroyed)
                {
                    FragmentTransaction transaction = FragmentManager.BeginTransactionEx();
                    transaction.RemoveEx(_currentFragment);
                    transaction.SetTransitionEx((int)FragmentTransit.None);
                    transaction.CommitAllowingStateLossEx();
                    FragmentManager.ExecutePendingTransactionsEx();

                    _currentFragment = null;
                }

                _parent          = null;
                _pageContainer   = null;
                _fragmentManager = null;
                RemoveAllViews();
                DisposeChildRenderers();
            }

            base.Dispose(disposing);
        }
Beispiel #9
0
 public void SetFragmentManager(FragmentManager fragmentManager)
 {
     if (_fragmentManager == null)
     {
         _fragmentManager = fragmentManager;
     }
 }
 protected override void OnNavigationViewFragmentResumed(FragmentManager fm, NavigationViewFragment navHostPageFragment)
 {
     base.OnNavigationViewFragmentResumed(fm, navHostPageFragment);
     // This appears to be the best place to update the toolbar so that the tinting works
     // Any early and the tinting will be replaced by the native tinting
     UpdateToolbar();
 }
        protected virtual Fragment FindFragmentInChildren(string fragmentName, FragmentManager fragManager)
        {
            if (fragManager == null)
            {
                return(null);
            }

            if (fragManager.BackStackEntryCount == 0)
            {
                return(null);
            }

            for (int i = 0; i < fragManager.BackStackEntryCount; i++)
            {
                var parentFrag = fragManager.FindFragmentById(fragManager.GetBackStackEntryAt(i).Id);

                //let's try again finding it
                var frag = parentFrag?.ChildFragmentManager?.FindFragmentByTag(fragmentName);

                if (frag == null)
                {
                    //reloop for other fragments
                    frag = FindFragmentInChildren(fragmentName, parentFrag?.ChildFragmentManager);
                }

                //if we found the frag lets return it!
                if (frag != null)
                {
                    return(frag);
                }
            }

            return(null);
        }
 void IManageFragments.SetFragmentManager(FragmentManager childFragmentManager)
 {
     if (_fragmentManager == null)
     {
         _fragmentManager = childFragmentManager;
     }
 }
        void RemovePage(Page page)
        {
            if (!_isAttachedToWindow)
            {
                PushCurrentPages();
            }

            Fragment fragment = GetPageFragment(page);

            if (fragment == null)
            {
                return;
            }

#if DEBUG
            // Enables logging of moveToState operations to logcat
            FragmentManager.EnableDebugLogging(true);
#endif

            // Go ahead and take care of the fragment bookkeeping for the page being removed
            FragmentTransaction transaction = FragmentManager.BeginTransactionEx();
            transaction.RemoveEx(fragment);
            transaction.CommitAllowingStateLossEx();

            // And remove the fragment from our own stack
            _fragmentStack.Remove(fragment);

            Device.StartTimer(TimeSpan.FromMilliseconds(10), () =>
            {
                UpdateToolbar();
                return(false);
            });
        }
Beispiel #14
0
 public PlaygroundBottomNavigationComponent(
     Context context,
     BottomTabsPageViewModel viewModel,
     FragmentManager fragmentManager)
     : base(viewModel, fragmentManager)
 {
     _context = context;
 }
        protected virtual void PerformShowFragmentTransaction(
            FragmentManager fragmentManager,
            MvxFragmentPresentationAttribute attribute,
            MvxViewModelRequest request)
        {
            var fragmentName = attribute.ViewType.FragmentJavaName();

            IMvxFragmentView fragment = null;

            if (attribute.IsCacheableFragment)
            {
                fragment = (IMvxFragmentView)fragmentManager.FindFragmentByTag(fragmentName);
            }
            fragment = fragment ?? CreateFragment(fragmentManager, attribute, attribute.ViewType);

            var fragmentView = fragment.ToFragment();

            // MvxNavigationService provides an already instantiated ViewModel here
            if (request is MvxViewModelInstanceRequest instanceRequest)
            {
                fragment.ViewModel = instanceRequest.ViewModelInstance;
            }

            // save MvxViewModelRequest in the Fragment's Arguments
            var bundle            = new Bundle();
            var serializedRequest = NavigationSerializer.Serializer.SerializeObject(request);

            bundle.PutString(ViewModelRequestBundleKey, serializedRequest);

            if (fragmentView != null)
            {
                if (fragmentView.Arguments == null)
                {
                    fragmentView.Arguments = bundle;
                }
                else
                {
                    fragmentView.Arguments.Clear();
                    fragmentView.Arguments.PutAll(bundle);
                }
            }

            var ft = fragmentManager.BeginTransaction();

            OnBeforeFragmentChanging(ft, fragmentView, attribute, request);

            if (attribute.AddToBackStack)
            {
                ft.AddToBackStack(fragmentName);
            }

            OnFragmentChanging(ft, fragmentView, attribute, request);

            ft.Replace(attribute.FragmentContentId, fragmentView, fragmentName);
            ft.CommitAllowingStateLoss();

            OnFragmentChanged(ft, fragmentView, attribute, request);
        }
Beispiel #16
0
        // Fragments are always destroyed if they aren't visible
        // The Handler/PlatformView associated with the visible IView remain intact
        // The performance hit of destorying/recreating fragments should be negligible
        // Hopefully this behavior survives implementation
        // This will need to be tested with Maps and WebViews to make sure they behave efficiently
        // being removed and then added back to a different Fragment
        //
        // I'm firing NavigationFinished from here instead of FragmentAnimationFinished because
        // this event appears to fire slightly after `FragmentAnimationFinished` and it also fires
        // if we aren't using animations
        protected virtual void OnNavigationViewFragmentDestroyed(AndroidX.Fragment.App.FragmentManager fm, NavigationViewFragment navHostPageFragment)
        {
            _ = NavigationView ?? throw new InvalidOperationException($"NavigationView cannot be null");

            if (IsNavigating)
            {
                NavigationFinished(NavigationView);
            }
        }
            public override void OnFragmentCreated(AndroidX.Fragment.App.FragmentManager fm, AndroidX.Fragment.App.Fragment f, Bundle savedInstanceState)
            {
                base.OnFragmentCreated(fm, f, savedInstanceState);

                // This wires up the hardware back button to this fragment
                f.RequireActivity()
                .OnBackPressedDispatcher
                .AddCallback(f, _navigationManager.BackClick);
            }
Beispiel #18
0
            public override void OnFragmentResumed(AndroidX.Fragment.App.FragmentManager fm, AndroidX.Fragment.App.Fragment f)
            {
                if (f is NavigationViewFragment pf)
                {
                    _stackNavigationManager.OnNavigationViewFragmentResumed(fm, pf);
                }

                AToolbar?nativeToolbar = null;
                IToolbar?toolbar       = null;

                if (_stackNavigationManager.NavigationView?.Toolbar is IToolbar tb &&
                    tb?.Handler?.NativeView is AToolbar ntb)
                {
                    nativeToolbar = ntb;
                    toolbar       = tb;
                }

                // Wire up the toolbar to the currently made visible Fragment
                var controller          = NavHostFragment.FindNavController(f);
                var appbarConfigBuilder =
                    new AppBarConfiguration
                    .Builder(_stackNavigationManager.NavGraph);

                if (nativeToolbar != null && toolbar != null)
                {
                    // TODO: MAUI Hackey way of wiring up Drawer Layout
                    // But currently you can only have a nav bar with a Navigation View
                    if (nativeToolbar.Parent is DrawerLayout dl1)
                    {
                        appbarConfigBuilder = appbarConfigBuilder.SetOpenableLayout(dl1);
                    }
                    else if (nativeToolbar.Parent?.Parent is DrawerLayout dl2)
                    {
                        appbarConfigBuilder = appbarConfigBuilder.SetOpenableLayout(dl2);
                    }
                    else if (nativeToolbar.Parent?.Parent?.Parent is DrawerLayout dl3)
                    {
                        appbarConfigBuilder = appbarConfigBuilder.SetOpenableLayout(dl3);
                    }

                    var appbarConfig =
                        appbarConfigBuilder.Build();

                    NavigationUI
                    .SetupWithNavController(nativeToolbar, controller, appbarConfig);

                    // the call to SetupWithNavController resets the Navigation Icon
                    toolbar.Handler?.UpdateValue(nameof(IToolbar.BackButtonVisible));

                    if (toolbar.BackButtonVisible && toolbar.IsVisible)
                    {
                        // Wiring up to this will break the Drawer Toggle button if it's visible
                        nativeToolbar.SetNavigationOnClickListener(_stackNavigationManager.BackClick);
                    }
                }
            }
Beispiel #19
0
        void ExecuteTransaction(FragmentTransaction transaction)
        {
            // We don't currently support fragment restoration
            // So we don't need to worry about loss of this fragment's state
            transaction.CommitAllowingStateLossEx();

            // The transaction need to be executed after View has been attached
            // So Fragment Manager can find the View being added
            FragmentManager.ExecutePendingTransactionsEx();
        }
        protected virtual bool TryPerformCloseFragmentTransaction(
            FragmentManager fragmentManager,
            MvxFragmentPresentationAttribute fragmentAttribute)
        {
            try
            {
                var fragmentName = fragmentAttribute.ViewType.FragmentJavaName();

                if (fragmentManager.BackStackEntryCount > 0)
                {
                    var popBackStackFragmentName = fragmentAttribute.PopBackStackImmediateName?.Trim() == ""
                        ? fragmentName
                        : fragmentAttribute.PopBackStackImmediateName;

                    fragmentManager.PopBackStackImmediate(popBackStackFragmentName, (int)fragmentAttribute.PopBackStackImmediateFlag.ToNativePopBackStackFlags());

                    OnFragmentPopped(null, null, fragmentAttribute);
                    return(true);
                }
                else if (CurrentFragmentManager.FindFragmentByTag(fragmentName) != null)
                {
                    var ft       = fragmentManager.BeginTransaction();
                    var fragment = fragmentManager.FindFragmentByTag(fragmentName);

                    if (!fragmentAttribute.EnterAnimation.Equals(int.MinValue) && !fragmentAttribute.ExitAnimation.Equals(int.MinValue))
                    {
                        if (!fragmentAttribute.PopEnterAnimation.Equals(int.MinValue) && !fragmentAttribute.PopExitAnimation.Equals(int.MinValue))
                        {
                            ft.SetCustomAnimations(fragmentAttribute.EnterAnimation, fragmentAttribute.ExitAnimation, fragmentAttribute.PopEnterAnimation, fragmentAttribute.PopExitAnimation);
                        }
                        else
                        {
                            ft.SetCustomAnimations(fragmentAttribute.EnterAnimation, fragmentAttribute.ExitAnimation);
                        }
                    }
                    if (fragmentAttribute.TransitionStyle != int.MinValue)
                    {
                        ft.SetTransitionStyle(fragmentAttribute.TransitionStyle);
                    }

                    ft.Remove(fragment);
                    ft.CommitAllowingStateLoss();

                    OnFragmentPopped(ft, fragment, fragmentAttribute);
                    return(true);
                }
            }
            catch (System.Exception ex)
            {
                MvxLog.Instance.Error("Cannot close fragment transaction", ex);
                return(false);
            }

            return(false);
        }
Beispiel #21
0
            public override void OnFragmentViewDestroyed(
                AndroidX.Fragment.App.FragmentManager fm,
                AndroidX.Fragment.App.Fragment f)
            {
                if (f is NavigationViewFragment pf)
                {
                    _stackNavigationManager.OnNavigationViewFragmentDestroyed(fm, pf);
                }

                base.OnFragmentViewDestroyed(fm, f);
            }
Beispiel #22
0
        internal static IVisualElementRenderer CreateRenderer(VisualElement element, AndroidX.Fragment.App.FragmentManager fragmentManager, Context context)
        {
            IVisualElementRenderer renderer = Registrar.Registered.GetHandlerForObject <IVisualElementRenderer>(element, context) ?? new DefaultRenderer(context);

            var managesFragments = renderer as IManageFragments;

            managesFragments?.SetFragmentManager(fragmentManager);

            renderer.SetElement(element);

            return(renderer);
        }
Beispiel #23
0
        internal static IVisualElementRenderer CreateRenderer(VisualElement element, AndroidX.Fragment.App.FragmentManager fragmentManager, Context context)
        {
            IVisualElementRenderer renderer = CreateRenderer(element, context);

            var managesFragments = renderer as IManageFragments;

            managesFragments?.SetFragmentManager(fragmentManager);

            renderer.SetElement(element);

            return(renderer);
        }
            public override void OnFragmentResumed(AndroidX.Fragment.App.FragmentManager fm, AndroidX.Fragment.App.Fragment f)
            {
                if (f is NavigationViewFragment pf)
                {
                    _navigationManager.OnNavigationViewFragmentResumed(fm, pf);
                }


                // This wires up the hardware back button to this fragment
                f.RequireActivity()
                .OnBackPressedDispatcher
                .AddCallback(f, _navigationManager.BackClick);
            }
 protected virtual IMvxFragmentView CreateFragment(FragmentManager fragmentManager, MvxBasePresentationAttribute attribute,
                                                   Type fragmentType)
 {
     try
     {
         var fragmentClass = Class.FromType(fragmentType);
         var fragment      = (IMvxFragmentView)fragmentManager.FragmentFactory.Instantiate(fragmentClass.ClassLoader, fragmentClass.Name);
         return(fragment);
     }
     catch (System.Exception ex)
     {
         throw new MvxException(ex, $"Cannot create Fragment '{fragmentType.Name}'");
     }
 }
 public override void Show(FragmentManager manager, string tag)
 {
     try
     {
         var transaction = manager.BeginTransaction();
         transaction.Add(this, Tag);
         transaction.CommitAllowingStateLoss();
     }
     catch (IllegalStateException e)
     {
         // This sometimes fails for some reason, not sure why
         Logger.Error(e);
     }
 }
Beispiel #27
0
        private void PopOnBackstackEntries(
            string fragmentName, FragmentManager fragmentManager, MvxFragmentPresentationAttribute fragmentAttribute)
        {
            var popBackStackFragmentName =
                string.IsNullOrEmpty(fragmentAttribute.PopBackStackImmediateName?.Trim())
                    ? fragmentName
                    : fragmentAttribute.PopBackStackImmediateName;

            fragmentManager.PopBackStackImmediate(
                popBackStackFragmentName,
                (int)fragmentAttribute.PopBackStackImmediateFlag.ToNativePopBackStackFlags());

            OnFragmentPopped(null, null, fragmentAttribute);
        }
Beispiel #28
0
        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);

            Xamarin.Essentials.Platform.Init(this, savedInstanceState);

            SetContentView(Resource.Layout.activity_main);

            BottomNavigationView navigation = FindViewById <BottomNavigationView>(Resource.Id.navigation);

            navigation.SetOnNavigationItemSelectedListener(this);

            fm       = this.SupportFragmentManager;
            settings = new UserSettings(this);
            currentF = new MainFlowFragment();
        }
Beispiel #29
0
        public void Initialize()
        {
            LatLng southwest = new LatLng(30, 118);

            CameraPosition.Builder builder        = new CameraPosition.Builder();
            CameraPosition         cameraPosition =
                builder.Target(southwest).Zoom(2).Bearing(2.0f).Tilt(2.5f).Build();
            HuaweiMapOptions huaweiMapOptions = new HuaweiMapOptions().InvokeCamera(cameraPosition);

            mSupportMapFragment = SupportMapFragment.NewInstance(huaweiMapOptions);
            mSupportMapFragment.GetMapAsync(this);
            AndroidX.Fragment.App.FragmentManager     fragmentManager     = SupportFragmentManager;
            AndroidX.Fragment.App.FragmentTransaction fragmentTransaction = fragmentManager.BeginTransaction();
            fragmentTransaction.Add(Resource.Id.frame_supportmapcode, mSupportMapFragment);
            fragmentTransaction.Commit();
        }
        /// <summary>
        /// Detect the Fragment containing this View by traversing all the ChildFragmenManagers
        /// </summary>
        /// <param name="view">The current view</param>
        /// <param name="fragmentManager">The current FragmentManager</param>
        /// <returns></returns>
        internal static Fragment ParentFragment(this View view, FragmentManager fragmentManager)
        {
            //This is a bit clunky but is needed because in Forms EVERYTHING is internal!
            //We could use FragmentContainer or PageContainer b ut we would need reflection wich is slow
            foreach (var fragment in fragmentManager.Fragments)
            {
                if (fragment.View?.FindViewById(view.Id) != null && fragment.ChildFragmentManager?.Fragments.Count > 0)
                {
                    var childManager = fragment.ChildFragmentManager.Fragments[0].ChildFragmentManager;

                    return(childManager?.Fragments?.Count > 0
                                                ? view.ParentFragment(childManager)
                                                : fragment.ChildFragmentManager.Fragments.Last());
                }
            }
            return(null);
        }