コード例 #1
0
        protected virtual Bundle CreateActivityTransitionOptions(
            Intent intent, MvxActivityPresentationAttribute attribute, MvxViewModelRequest request)
        {
            ValidateArguments(attribute, request);

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

            var bundle = Bundle.Empty !;

            if (CurrentActivity.IsActivityAlive() &&
                CurrentActivity is IMvxAndroidSharedElements sharedElementsActivity &&
                Build.VERSION.SdkInt >= BuildVersionCodes.Lollipop)
            {
                var(elements, transitionElementPairs) =
                    GetTransitionElements(attribute, request, sharedElementsActivity);

                if (transitionElementPairs.Count == 0)
                {
                    _logger.Value?.Warn("No transition elements are provided");
                    return(bundle);
                }

                var transitionElementsBundle = CreateTransitionElementsBundle(intent, transitionElementPairs, elements);
                if (transitionElementsBundle != null)
                {
                    return(transitionElementsBundle);
                }
            }
コード例 #2
0
        protected override void ShowActivity(Type view,
                                             MvxActivityPresentationAttribute attribute,
                                             MvxViewModelRequest request)
        {
            var intent = CreateIntentForRequest(request);

            if (attribute.Extras != null)
            {
                intent.PutExtras(attribute.Extras);
            }

            var activity = CurrentActivity;

            if (activity == null)
            {
                MvxTrace.Warning("Cannot Resolve current top activity");
                return;
            }

            var activityOptions = CreateActivityTransitionOptions(intent, attribute);

            if (activityOptions != null)
            {
                activity.StartActivity(intent, activityOptions.ToBundle());
            }
            else
            {
                activity.StartActivity(intent);
            }
        }
コード例 #3
0
        protected override void ShowActivity(Type view,
                                             MvxActivityPresentationAttribute attribute,
                                             MvxViewModelRequest request)
        {
            var intent = CreateIntentForRequest(request);

            if (attribute.Extras != null)
            {
                intent.PutExtras(attribute.Extras);
            }

            var activity = CurrentActivity;

            if (activity == null)
            {
                MvxTrace.Warning("Cannot Resolve current top activity");
                return;
            }

            if (attribute.SharedElements != null)
            {
                IList <Pair> sharedElements = new List <Pair>();
                foreach (var item in attribute.SharedElements)
                {
                    intent.PutExtra(item.Key, ViewCompat.GetTransitionName(item.Value));
                    sharedElements.Add(Pair.Create(item.Value, item.Key));
                }
                ActivityOptionsCompat options = ActivityOptionsCompat.MakeSceneTransitionAnimation(CurrentActivity, sharedElements.ToArray());
                activity.StartActivity(intent, options.ToBundle());
            }
            else
            {
                activity.StartActivity(intent);
            }
        }
コード例 #4
0
        protected virtual void ShowActivity(
            Type view,
            MvxActivityPresentationAttribute attribute,
            MvxViewModelRequest request)
        {
            var intent = CreateIntentForRequest(request);

            if (attribute.Extras != null)
            {
                intent.PutExtras(attribute.Extras);
            }
            ShowIntent(intent);
        }
コード例 #5
0
        protected virtual Task <bool> ShowActivity(
            Type view,
            MvxActivityPresentationAttribute attribute,
            MvxViewModelRequest request)
        {
            var intent = CreateIntentForRequest(request);

            if (attribute.Extras != null)
            {
                intent.PutExtras(attribute.Extras);
            }

            ShowIntent(intent, CreateActivityTransitionOptions(intent, attribute, request));
            return(Task.FromResult(true));
        }
コード例 #6
0
        protected override bool CloseActivity(IMvxViewModel viewModel, MvxActivityPresentationAttribute attribute)
        {
            var currentView = CurrentActivity as IMvxView;

            if (currentView == null || currentView.ViewModel != viewModel)
            {
                var currentTopActivity = Mvx.Resolve <IMvxAndroidCurrentTopActivity>() as QueryableMvxLifecycleMonitorCurrentTopActivity;
                var closingActivity    = currentTopActivity?.FindActivityByViewModel(viewModel);
                closingActivity?.Finish();
                if (closingActivity != null)
                {
                    //found an activity and handled it
                    return(true);
                }
            }

            return(base.CloseActivity(viewModel, attribute));
        }
コード例 #7
0
        protected virtual Bundle CreateActivityTransitionOptions(Intent intent, MvxActivityPresentationAttribute attribute, MvxViewModelRequest request)
        {
            var bundle = Bundle.Empty;

            if (CurrentActivity is IMvxAndroidSharedElements sharedElementsActivity)
            {
                var elements = new List <string>();
                var transitionElementPairs = new List <Pair>();

                foreach (KeyValuePair <string, View> item in sharedElementsActivity.FetchSharedElementsToAnimate(attribute, request))
                {
                    var transitionName = item.Value.GetTransitionNameSupport();
                    if (!string.IsNullOrEmpty(transitionName))
                    {
                        transitionElementPairs.Add(Pair.Create(item.Value, transitionName));
                        elements.Add($"{item.Key}:{transitionName}");
                    }
                    else
                    {
                        MvxLog.Instance.Warn("A XML transitionName is required in order to transition a control when navigating.");
                    }
                }

                if (!transitionElementPairs.Any())
                {
                    MvxLog.Instance.Warn("No transition elements are provided");
                    return(bundle);
                }

                if (Build.VERSION.SdkInt >= BuildVersionCodes.Lollipop)
                {
                    var activityOptions = ActivityOptions.MakeSceneTransitionAnimation(CurrentActivity, transitionElementPairs.ToArray());
                    intent.PutExtra(SharedElementsBundleKey, string.Join("|", elements));
                    bundle = activityOptions.ToBundle();
                }
                else
                {
                    MvxLog.Instance.Warn("Shared element transition requires Android v21+.");
                }
            }

            return(bundle);
        }
コード例 #8
0
        protected virtual bool CloseActivity(IMvxViewModel viewModel, MvxActivityPresentationAttribute attribute)
        {
            var currentView = CurrentActivity as IMvxView;

            if (currentView == null)
            {
                Mvx.Warning("Ignoring close for viewmodel - rootframe has no current page");
                return(false);
            }

            if (currentView.ViewModel != viewModel)
            {
                Mvx.Warning("Ignoring close for viewmodel - rootframe's current page is not the view for the requested viewmodel");
                return(false);
            }

            CurrentActivity.Finish();

            return(true);
        }
コード例 #9
0
        protected virtual Task <bool> CloseActivity(IMvxViewModel viewModel, MvxActivityPresentationAttribute attribute)
        {
            var currentView = CurrentActivity as IMvxView;

            if (currentView == null)
            {
                MvxLog.Instance.Warn("Ignoring close for viewmodel - rootframe has no current page");
                return(Task.FromResult(false));
            }

            if (currentView.ViewModel != viewModel)
            {
                MvxLog.Instance.Warn("Ignoring close for viewmodel - rootframe's current page is not the view for the requested viewmodel");
                return(Task.FromResult(false));
            }

            CurrentActivity.Finish();

            return(Task.FromResult(true));
        }
コード例 #10
0
        public override ValueTask<MvxBasePresentationAttribute?> CreatePresentationAttribute(Type? viewModelType, Type? viewType)
        {
            if (viewType?.IsSubclassOf(typeof(DialogFragment)) ?? false)
            {
                MvxLog.Instance.Trace("PresentationAttribute not found for {0}. Assuming DialogFragment presentation", viewType.Name);
                var attribute = new MvxDialogFragmentPresentationAttribute() { ViewType = viewType, ViewModelType = viewModelType };
                return new ValueTask<MvxBasePresentationAttribute?>(attribute);
            }
            else if (viewType?.IsSubclassOf(typeof(Fragment)) ?? false)
            {
                MvxLog.Instance.Trace("PresentationAttribute not found for {0}. Assuming Fragment presentation", viewType.Name);
                var attribute= new MvxFragmentPresentationAttribute(GetCurrentActivityViewModelType(), global::Android.Resource.Id.Content) { ViewType = viewType, ViewModelType = viewModelType };
                return new ValueTask<MvxBasePresentationAttribute?>(attribute);
            }
            else if (viewType?.IsSubclassOf(typeof(Activity)) ?? false)
            {
                MvxLog.Instance.Trace("PresentationAttribute not found for {0}. Assuming Activity presentation", viewType.Name);
                var attribute = new MvxActivityPresentationAttribute() { ViewType = viewType, ViewModelType = viewModelType };
                return new ValueTask<MvxBasePresentationAttribute?>(attribute);
            }

            return new ValueTask<MvxBasePresentationAttribute?>((MvxBasePresentationAttribute?)null);
        }
コード例 #11
0
        protected virtual Bundle CreateActivityTransitionOptions(
            Intent intent, MvxActivityPresentationAttribute attribute, MvxViewModelRequest request)
        {
            ValidateArguments(attribute, request);

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

            var bundle = Bundle.Empty !;

            if (CurrentActivity.IsActivityAlive() &&
                CurrentActivity is IMvxAndroidSharedElements sharedElementsActivity)
            {
                var(elements, transitionElementPairs) =
                    GetTransitionElements(attribute, request, sharedElementsActivity);

                if (transitionElementPairs.Count == 0)
                {
                    _logger.Value?.Log(LogLevel.Warning, "No transition elements are provided");
                    return(bundle);
                }

                var transitionElementsBundle = CreateTransitionElementsBundle(intent, transitionElementPairs, elements);
                if (transitionElementsBundle != null)
                {
                    return(transitionElementsBundle);
                }
            }
            else
            {
                _logger.Value?.Log(LogLevel.Warning, "Shared element transition requires Android v21+.");
            }

            return(bundle);
        }
コード例 #12
0
        protected virtual ActivityOptionsCompat CreateActivityTransitionOptions(Android.Content.Intent intent, MvxActivityPresentationAttribute attribute)
        {
            ActivityOptionsCompat options = null;

            if (attribute.SharedElements != null)
            {
                IList <Pair> sharedElements = new List <Pair>();
                foreach (var item in attribute.SharedElements)
                {
                    intent.PutExtra(item.Key, ViewCompat.GetTransitionName(item.Value));
                    sharedElements.Add(Pair.Create(item.Value, item.Key));
                }
                options = ActivityOptionsCompat.MakeSceneTransitionAnimation(CurrentActivity, sharedElements.ToArray());
            }

            return(options);
        }
コード例 #13
0
 protected override bool CloseActivity(IMvxViewModel viewModel, MvxActivityPresentationAttribute attribute)
 {
     return(base.CloseActivity(viewModel, attribute));
 }
コード例 #14
0
 protected override void ShowActivity(Type view, MvxActivityPresentationAttribute attribute, MvxViewModelRequest request)
 {
     base.ShowActivity(view, attribute, request);
 }