From e573653ec3fa98dc6dbe8256a6f17fd25b087392 Mon Sep 17 00:00:00 2001 From: Raimo Date: Fri, 20 Jan 2023 14:28:08 +0100 Subject: [PATCH 1/4] Fix for closing and re-opening non-fullscreen modals on iOS fast not working correctly (#4554) * Update MvxModalPresentationControllerDelegate.cs * Fixed iOS modals not opening and closing correctly by swipe gesture * Remove ClosedModalViewController since it's redundant * Update MvxIosViewPresenter.cs * Update MvxModalPresentationControllerDelegate.cs * Update MvxIosViewPresenter.cs * Remove forgotten leftover when DidDismiss was used in MvxModalPresentationControllerDelegate instead of WillDismiss --- .../Ios/Presenters/IMvxIosViewPresenter.cs | 3 -- .../Ios/Presenters/MvxIosViewPresenter.cs | 29 ++++--------------- .../MvxModalPresentationControllerDelegate.cs | 8 ++--- 3 files changed, 10 insertions(+), 30 deletions(-) diff --git a/MvvmCross/Platforms/Ios/Presenters/IMvxIosViewPresenter.cs b/MvvmCross/Platforms/Ios/Presenters/IMvxIosViewPresenter.cs index afdcd4c8ad..cda34d1f02 100644 --- a/MvvmCross/Platforms/Ios/Presenters/IMvxIosViewPresenter.cs +++ b/MvvmCross/Platforms/Ios/Presenters/IMvxIosViewPresenter.cs @@ -14,9 +14,6 @@ namespace MvvmCross.Platforms.Ios.Presenters public interface IMvxIosViewPresenter : IMvxViewPresenter, IMvxCanCreateIosView { public void ClosedPopoverViewController(); - - public ConfiguredTaskAwaitable ClosedModalViewController(UIViewController viewController, - MvxModalPresentationAttribute attribute); } #nullable restore } diff --git a/MvvmCross/Platforms/Ios/Presenters/MvxIosViewPresenter.cs b/MvvmCross/Platforms/Ios/Presenters/MvxIosViewPresenter.cs index bbc57a28f8..ee22356e57 100644 --- a/MvvmCross/Platforms/Ios/Presenters/MvxIosViewPresenter.cs +++ b/MvvmCross/Platforms/Ios/Presenters/MvxIosViewPresenter.cs @@ -410,12 +410,6 @@ private Task ShowPopoverViewControllerChild(UIViewController viewControlle { ValidateArguments(viewController, attribute); - // Content size should be set to a target view controller, not the navigation one - if (attribute.PreferredContentSize != default) - { - viewController.PreferredContentSize = attribute.PreferredContentSize; - } - // setup modal based on attribute if (attribute.WrapInNavigationController) { @@ -424,6 +418,9 @@ private Task ShowPopoverViewControllerChild(UIViewController viewControlle viewController.ModalPresentationStyle = attribute.ModalPresentationStyle; viewController.ModalTransitionStyle = attribute.ModalTransitionStyle; + if (attribute.PreferredContentSize != default(CGSize)) + viewController.PreferredContentSize = attribute.PreferredContentSize; + if (_iosVersion13Checker.IsVersionOrHigher && viewController.PresentationController != null) { viewController.PresentationController.Delegate = @@ -432,19 +429,12 @@ private Task ShowPopoverViewControllerChild(UIViewController viewControlle // Check if there is a modal already presented first. Otherwise use the window root var modalHost = ModalViewControllers.LastOrDefault() ?? Window.RootViewController; - if (modalHost != null) - { - modalHost.PresentViewController( - viewController, - attribute.Animated, - null); - ModalViewControllers.Add(viewController); + modalHost.PresentViewController(viewController, attribute.Animated, null); - return Task.FromResult(true); - } + ModalViewControllers.Add(viewController); - return Task.FromResult(false); + return Task.FromResult(true); } protected virtual async Task ShowPopoverViewController( @@ -845,13 +835,6 @@ public virtual void ClosedPopoverViewController() PopoverViewController = null; } - // Called if the modal was dismissed by user (perhaps tapped background or form sheet swiped down) - public virtual ConfiguredTaskAwaitable ClosedModalViewController(UIViewController viewController, - MvxModalPresentationAttribute attribute) - { - return CloseModalViewController(viewController, attribute).ConfigureAwait(false); - } - private static void ValidateArguments(Type viewModelType, Type viewType) { if (viewModelType == null) diff --git a/MvvmCross/Platforms/Ios/Presenters/MvxModalPresentationControllerDelegate.cs b/MvvmCross/Platforms/Ios/Presenters/MvxModalPresentationControllerDelegate.cs index 9056718ffa..b0fe9c7e44 100644 --- a/MvvmCross/Platforms/Ios/Presenters/MvxModalPresentationControllerDelegate.cs +++ b/MvvmCross/Platforms/Ios/Presenters/MvxModalPresentationControllerDelegate.cs @@ -9,20 +9,20 @@ namespace MvvmCross.Platforms.Ios.Presenters { public class MvxModalPresentationControllerDelegate : UIAdaptivePresentationControllerDelegate { - private readonly IMvxIosViewPresenter _presenter; + private readonly MvxIosViewPresenter _presenter; private readonly UIViewController _viewController; private readonly MvxModalPresentationAttribute _attribute; - public MvxModalPresentationControllerDelegate(IMvxIosViewPresenter presenter, UIViewController viewController, MvxModalPresentationAttribute attribute) + public MvxModalPresentationControllerDelegate(MvxIosViewPresenter presenter, UIViewController viewController, MvxModalPresentationAttribute attribute) { _presenter = presenter; _viewController = viewController; _attribute = attribute; } - public override void DidDismiss(UIPresentationController presentationController) + public override void WillDismiss(UIPresentationController presentationController) { - _presenter.ClosedModalViewController(_viewController, _attribute); + _presenter.CloseModalViewController(_viewController, _attribute); } } } From a510f50dc31f4539e494f7f6fd86b44f9a5395ce Mon Sep 17 00:00:00 2001 From: Tomasz Cielecki Date: Fri, 20 Jan 2023 14:43:51 +0100 Subject: [PATCH 2/4] Update issue templates --- .github/ISSUE_TEMPLATE/a-regression.md | 7 +++++-- .github/ISSUE_TEMPLATE/b-bug-report.md | 7 +++++-- .github/ISSUE_TEMPLATE/c-feature-request.md | 7 +++++-- .github/ISSUE_TEMPLATE/d-enhancement-proposal.md | 7 +++++-- .github/ISSUE_TEMPLATE/e-question.md | 7 +++++-- 5 files changed, 25 insertions(+), 10 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/a-regression.md b/.github/ISSUE_TEMPLATE/a-regression.md index 7dbb60c976..d609db112c 100644 --- a/.github/ISSUE_TEMPLATE/a-regression.md +++ b/.github/ISSUE_TEMPLATE/a-regression.md @@ -1,7 +1,10 @@ --- - -name: 🔙 Regression +name: "\U0001F519 Regression" about: Report unexpected behavior that worked previously +title: '' +labels: t/bug +assignees: '' + --- ## 🔙 Regression diff --git a/.github/ISSUE_TEMPLATE/b-bug-report.md b/.github/ISSUE_TEMPLATE/b-bug-report.md index e1699eec47..7938b2a3bb 100644 --- a/.github/ISSUE_TEMPLATE/b-bug-report.md +++ b/.github/ISSUE_TEMPLATE/b-bug-report.md @@ -1,7 +1,10 @@ --- - -name: 🐛 Bug Report +name: "\U0001F41B Bug Report" about: Create a report to help us fix bugs and make improvements +title: '' +labels: t/bug +assignees: '' + --- ## 🐛 Bug Report diff --git a/.github/ISSUE_TEMPLATE/c-feature-request.md b/.github/ISSUE_TEMPLATE/c-feature-request.md index 61c19b4c8d..12b80593b6 100644 --- a/.github/ISSUE_TEMPLATE/c-feature-request.md +++ b/.github/ISSUE_TEMPLATE/c-feature-request.md @@ -1,7 +1,10 @@ --- - -name: 🚀 Feature Request +name: "\U0001F680 Feature Request" about: Want to see something new included in the Framework? Submit it! +title: '' +labels: t/feature +assignees: '' + --- ## 🚀 Feature Requests diff --git a/.github/ISSUE_TEMPLATE/d-enhancement-proposal.md b/.github/ISSUE_TEMPLATE/d-enhancement-proposal.md index 3560999ad3..a936e4a86b 100644 --- a/.github/ISSUE_TEMPLATE/d-enhancement-proposal.md +++ b/.github/ISSUE_TEMPLATE/d-enhancement-proposal.md @@ -1,7 +1,10 @@ --- - -name: 🏗 Enhancement Proposal +name: "\U0001F3D7 Enhancement Proposal" about: Proposals for code cleanup, refactor and improvements in general +title: '' +labels: t/enhancement +assignees: '' + --- ## 🏗 Enhancement Proposal diff --git a/.github/ISSUE_TEMPLATE/e-question.md b/.github/ISSUE_TEMPLATE/e-question.md index bc745cccc1..a634648382 100644 --- a/.github/ISSUE_TEMPLATE/e-question.md +++ b/.github/ISSUE_TEMPLATE/e-question.md @@ -1,7 +1,10 @@ --- - -name: 💬 Questions and Help +name: "\U0001F4AC Questions and Help" about: If you have questions, please use this for support +title: '' +labels: '' +assignees: '' + --- ## 💬 Questions and Help From e409fb7c913d17255328b7268e64396e66b7ae0a Mon Sep 17 00:00:00 2001 From: Tomasz Cielecki Date: Fri, 20 Jan 2023 15:12:09 +0100 Subject: [PATCH 3/4] Fix CreateViewsContainer getting Application Context from Top Activity (#4556) * Don't seal CreateViewsContainer * Use Application.Context to provide context instead of top Activity * Mark ApplicationContext virtual * Switch to global file namespace Co-authored-by: Tomasz Cielecki --- .../Platforms/Android/Core/MvxAndroidSetup.cs | 429 +++++++++--------- 1 file changed, 213 insertions(+), 216 deletions(-) diff --git a/MvvmCross/Platforms/Android/Core/MvxAndroidSetup.cs b/MvvmCross/Platforms/Android/Core/MvxAndroidSetup.cs index 703fc789b0..9546d50d69 100644 --- a/MvvmCross/Platforms/Android/Core/MvxAndroidSetup.cs +++ b/MvvmCross/Platforms/Android/Core/MvxAndroidSetup.cs @@ -1,7 +1,7 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MS-PL license. // See the LICENSE file in the project root for more information. - +#nullable enable using System.Reflection; using Android.Content; using Android.Views; @@ -22,289 +22,286 @@ using MvvmCross.ViewModels; using MvvmCross.Views; -namespace MvvmCross.Platforms.Android.Core +namespace MvvmCross.Platforms.Android.Core; + +public abstract class MvxAndroidSetup + : MvxSetup, IMvxAndroidGlobals, IMvxAndroidSetup { -#nullable enable - public abstract class MvxAndroidSetup - : MvxSetup, IMvxAndroidGlobals, IMvxAndroidSetup + private MvxCurrentTopActivity? _currentTopActivity; + private IMvxAndroidViewPresenter? _presenter; + + public void PlatformInitialize(Activity activity) { - private MvxCurrentTopActivity? _currentTopActivity; - private IMvxAndroidViewPresenter? _presenter; + ArgumentNullException.ThrowIfNull(activity); + ArgumentNullException.ThrowIfNull(activity.Application); - public void PlatformInitialize(Activity activity) - { - ArgumentNullException.ThrowIfNull(activity); - ArgumentNullException.ThrowIfNull(activity.Application); + PlatformInitialize(activity.Application); - PlatformInitialize(activity.Application); + // this is needed for when App is rehydrated from being killed by Android in the background + _currentTopActivity?.OnActivityCreated(activity, null); + } - // this is needed for when App is rehydrated from being killed by Android in the background - _currentTopActivity?.OnActivityCreated(activity, null); - } + public void PlatformInitialize(Application application) + { + ArgumentNullException.ThrowIfNull(application); - public void PlatformInitialize(Application application) - { - ArgumentNullException.ThrowIfNull(application); + if (_currentTopActivity != null) + return; - if (_currentTopActivity != null) - return; + _currentTopActivity = new MvxCurrentTopActivity(); + application.RegisterActivityLifecycleCallbacks(_currentTopActivity); + } - _currentTopActivity = new MvxCurrentTopActivity(); - application.RegisterActivityLifecycleCallbacks(_currentTopActivity); - } + public virtual Assembly ExecutableAssembly => ViewAssemblies.FirstOrDefault() ?? GetType().Assembly; - public virtual Assembly ExecutableAssembly => ViewAssemblies.FirstOrDefault() ?? GetType().Assembly; + public virtual Context? ApplicationContext => Application.Context; - public Context? ApplicationContext => _currentTopActivity?.Activity?.ApplicationContext; + protected override void InitializeFirstChance(IMvxIoCProvider iocProvider) + { + ValidateArguments(iocProvider); - protected override void InitializeFirstChance(IMvxIoCProvider iocProvider) - { - ValidateArguments(iocProvider); + InitializeLifetimeMonitor(iocProvider); + InitializeAndroidCurrentTopActivity(iocProvider); + RegisterPresenter(iocProvider); - InitializeLifetimeMonitor(iocProvider); - InitializeAndroidCurrentTopActivity(iocProvider); - RegisterPresenter(iocProvider); + iocProvider.RegisterSingleton(this); - iocProvider.RegisterSingleton(this); + var intentResultRouter = new MvxIntentResultSink(); + iocProvider.RegisterSingleton(intentResultRouter); + iocProvider.RegisterSingleton(intentResultRouter); - var intentResultRouter = new MvxIntentResultSink(); - iocProvider.RegisterSingleton(intentResultRouter); - iocProvider.RegisterSingleton(intentResultRouter); + var viewModelTemporaryCache = new MvxSingleViewModelCache(); + iocProvider.RegisterSingleton(viewModelTemporaryCache); - var viewModelTemporaryCache = new MvxSingleViewModelCache(); - iocProvider.RegisterSingleton(viewModelTemporaryCache); + var viewModelMultiTemporaryCache = new MvxMultipleViewModelCache(); + iocProvider.RegisterSingleton(viewModelMultiTemporaryCache); + base.InitializeFirstChance(iocProvider); + } - var viewModelMultiTemporaryCache = new MvxMultipleViewModelCache(); - iocProvider.RegisterSingleton(viewModelMultiTemporaryCache); - base.InitializeFirstChance(iocProvider); - } + protected virtual void InitializeAndroidCurrentTopActivity(IMvxIoCProvider iocProvider) + { + ValidateArguments(iocProvider); - protected virtual void InitializeAndroidCurrentTopActivity(IMvxIoCProvider iocProvider) - { - ValidateArguments(iocProvider); + var currentTopActivity = CreateAndroidCurrentTopActivity(); + iocProvider.RegisterSingleton(currentTopActivity); + } - var currentTopActivity = CreateAndroidCurrentTopActivity(); - iocProvider.RegisterSingleton(currentTopActivity); - } + protected virtual IMvxAndroidCurrentTopActivity CreateAndroidCurrentTopActivity() + { + if (_currentTopActivity == null) + throw new InvalidOperationException($"Please call {nameof(PlatformInitialize)} first"); - protected virtual IMvxAndroidCurrentTopActivity CreateAndroidCurrentTopActivity() - { - if (_currentTopActivity == null) - throw new InvalidOperationException($"Please call {nameof(PlatformInitialize)} first"); + return _currentTopActivity; + } - return _currentTopActivity; - } + protected virtual void InitializeLifetimeMonitor(IMvxIoCProvider iocProvider) + { + ValidateArguments(iocProvider); - protected virtual void InitializeLifetimeMonitor(IMvxIoCProvider iocProvider) - { - ValidateArguments(iocProvider); + var lifetimeMonitor = CreateLifetimeMonitor(); - var lifetimeMonitor = CreateLifetimeMonitor(); + iocProvider.RegisterSingleton(lifetimeMonitor); + iocProvider.RegisterSingleton(lifetimeMonitor); + } - iocProvider.RegisterSingleton(lifetimeMonitor); - iocProvider.RegisterSingleton(lifetimeMonitor); - } + protected virtual MvxAndroidLifetimeMonitor CreateLifetimeMonitor() + { + return new MvxAndroidLifetimeMonitor(); + } - protected virtual MvxAndroidLifetimeMonitor CreateLifetimeMonitor() - { - return new MvxAndroidLifetimeMonitor(); - } + protected virtual void InitializeSavedStateConverter(IMvxIoCProvider iocProvider) + { + ValidateArguments(iocProvider); - protected virtual void InitializeSavedStateConverter(IMvxIoCProvider iocProvider) - { - ValidateArguments(iocProvider); + var converter = CreateSavedStateConverter(); + iocProvider.RegisterSingleton(converter); + } - var converter = CreateSavedStateConverter(); - iocProvider.RegisterSingleton(converter); - } + protected virtual IMvxSavedStateConverter CreateSavedStateConverter() + { + return new MvxSavedStateConverter(); + } - protected virtual IMvxSavedStateConverter CreateSavedStateConverter() - { - return new MvxSavedStateConverter(); - } + protected override IMvxViewsContainer CreateViewsContainer(IMvxIoCProvider iocProvider) + { + ValidateArguments(iocProvider); - protected sealed override IMvxViewsContainer CreateViewsContainer(IMvxIoCProvider iocProvider) - { - ValidateArguments(iocProvider); + if (ApplicationContext == null) + throw new InvalidOperationException("Cannot create Views Container without ApplicationContext"); - if (ApplicationContext == null) - throw new InvalidOperationException("Cannot create Views Container without ApplicationContext"); + var container = CreateViewsContainer(ApplicationContext); + iocProvider.RegisterSingleton(container); + iocProvider.RegisterSingleton(container); + if (container is not MvxViewsContainer viewsContainer) + throw new MvxException("CreateViewsContainer must return an MvxViewsContainer"); + return viewsContainer; + } - var container = CreateViewsContainer(ApplicationContext); - iocProvider.RegisterSingleton(container); - iocProvider.RegisterSingleton(container); - if (container is not MvxViewsContainer viewsContainer) - throw new MvxException("CreateViewsContainer must return an MvxViewsContainer"); - return viewsContainer; - } + protected virtual IMvxAndroidViewsContainer CreateViewsContainer(Context applicationContext) + { + return new MvxAndroidViewsContainer(applicationContext); + } - protected virtual IMvxAndroidViewsContainer CreateViewsContainer(Context applicationContext) + protected IMvxAndroidViewPresenter Presenter + { + get { - return new MvxAndroidViewsContainer(applicationContext); + _presenter ??= CreateViewPresenter(); + return _presenter; } + } - protected IMvxAndroidViewPresenter Presenter - { - get - { - _presenter ??= CreateViewPresenter(); - return _presenter; - } - } + protected virtual IMvxAndroidViewPresenter CreateViewPresenter() + { + return new MvxAndroidViewPresenter(AndroidViewAssemblies); + } - protected virtual IMvxAndroidViewPresenter CreateViewPresenter() - { - return new MvxAndroidViewPresenter(AndroidViewAssemblies); - } + protected override IMvxViewDispatcher CreateViewDispatcher() + { + return new MvxAndroidViewDispatcher(Presenter); + } - protected override IMvxViewDispatcher CreateViewDispatcher() - { - return new MvxAndroidViewDispatcher(Presenter); - } + protected virtual void RegisterPresenter(IMvxIoCProvider iocProvider) + { + ValidateArguments(iocProvider); - protected virtual void RegisterPresenter(IMvxIoCProvider iocProvider) - { - ValidateArguments(iocProvider); + var presenter = Presenter; + iocProvider.RegisterSingleton(presenter); + iocProvider.RegisterSingleton(presenter); + } - var presenter = Presenter; - iocProvider.RegisterSingleton(presenter); - iocProvider.RegisterSingleton(presenter); - } + protected override void InitializeLastChance(IMvxIoCProvider iocProvider) + { + ValidateArguments(iocProvider); - protected override void InitializeLastChance(IMvxIoCProvider iocProvider) - { - ValidateArguments(iocProvider); + InitializeSavedStateConverter(iocProvider); - InitializeSavedStateConverter(iocProvider); + InitializeBindingBuilder(iocProvider); + base.InitializeLastChance(iocProvider); + } - InitializeBindingBuilder(iocProvider); - base.InitializeLastChance(iocProvider); - } + protected virtual void InitializeBindingBuilder(IMvxIoCProvider iocProvider) + { + ValidateArguments(iocProvider); - protected virtual void InitializeBindingBuilder(IMvxIoCProvider iocProvider) - { - ValidateArguments(iocProvider); + var bindingBuilder = CreateBindingBuilder(); + RegisterBindingBuilderCallbacks(iocProvider); + bindingBuilder.DoRegistration(iocProvider); + } - var bindingBuilder = CreateBindingBuilder(); - RegisterBindingBuilderCallbacks(iocProvider); - bindingBuilder.DoRegistration(iocProvider); - } + protected virtual void RegisterBindingBuilderCallbacks(IMvxIoCProvider iocProvider) + { + ValidateArguments(iocProvider); + + iocProvider.CallbackWhenRegistered(FillValueConverters); + iocProvider.CallbackWhenRegistered(FillTargetFactories); + iocProvider.CallbackWhenRegistered(FillBindingNames); + iocProvider.CallbackWhenRegistered>(FillViewTypes); + iocProvider.CallbackWhenRegistered(FillAxmlViewTypeResolver); + iocProvider.CallbackWhenRegistered(FillNamespaceListViewTypeResolver); + } - protected virtual void RegisterBindingBuilderCallbacks(IMvxIoCProvider iocProvider) - { - ValidateArguments(iocProvider); - - iocProvider.CallbackWhenRegistered(FillValueConverters); - iocProvider.CallbackWhenRegistered(FillTargetFactories); - iocProvider.CallbackWhenRegistered(FillBindingNames); - iocProvider.CallbackWhenRegistered>(FillViewTypes); - iocProvider.CallbackWhenRegistered(FillAxmlViewTypeResolver); - iocProvider.CallbackWhenRegistered(FillNamespaceListViewTypeResolver); - } + protected virtual MvxBindingBuilder CreateBindingBuilder() + { + return new MvxAndroidBindingBuilder(); + } - protected virtual MvxBindingBuilder CreateBindingBuilder() + protected virtual void FillViewTypes(IMvxTypeCache cache) + { + ArgumentNullException.ThrowIfNull(cache); + + foreach (var assembly in AndroidViewAssemblies) { - return new MvxAndroidBindingBuilder(); + cache.AddAssembly(assembly); } + } - protected virtual void FillViewTypes(IMvxTypeCache cache) - { - ArgumentNullException.ThrowIfNull(cache); + protected virtual void FillBindingNames(IMvxBindingNameRegistry registry) + { + // this base class does nothing + } - foreach (var assembly in AndroidViewAssemblies) - { - cache.AddAssembly(assembly); - } - } + protected virtual void FillAxmlViewTypeResolver(IMvxAxmlNameViewTypeResolver viewTypeResolver) + { + ArgumentNullException.ThrowIfNull(viewTypeResolver); - protected virtual void FillBindingNames(IMvxBindingNameRegistry registry) + foreach (var kvp in ViewNamespaceAbbreviations) { - // this base class does nothing + viewTypeResolver.ViewNamespaceAbbreviations[kvp.Key] = kvp.Value; } + } - protected virtual void FillAxmlViewTypeResolver(IMvxAxmlNameViewTypeResolver viewTypeResolver) - { - ArgumentNullException.ThrowIfNull(viewTypeResolver); - - foreach (var kvp in ViewNamespaceAbbreviations) - { - viewTypeResolver.ViewNamespaceAbbreviations[kvp.Key] = kvp.Value; - } - } + protected virtual void FillNamespaceListViewTypeResolver(IMvxNamespaceListViewTypeResolver viewTypeResolver) + { + ArgumentNullException.ThrowIfNull(viewTypeResolver); - protected virtual void FillNamespaceListViewTypeResolver(IMvxNamespaceListViewTypeResolver viewTypeResolver) + foreach (var viewNamespace in ViewNamespaces) { - ArgumentNullException.ThrowIfNull(viewTypeResolver); - - foreach (var viewNamespace in ViewNamespaces) - { - viewTypeResolver.Add(viewNamespace); - } + viewTypeResolver.Add(viewNamespace); } + } - protected virtual void FillValueConverters(IMvxValueConverterRegistry registry) - { - ArgumentNullException.ThrowIfNull(registry); + protected virtual void FillValueConverters(IMvxValueConverterRegistry registry) + { + ArgumentNullException.ThrowIfNull(registry); - registry.Fill(ValueConverterAssemblies); - registry.Fill(ValueConverterHolders); - } + registry.Fill(ValueConverterAssemblies); + registry.Fill(ValueConverterHolders); + } - protected virtual IEnumerable ValueConverterHolders => new List(); + protected virtual IEnumerable ValueConverterHolders => new List(); - protected virtual IEnumerable ValueConverterAssemblies + protected virtual IEnumerable ValueConverterAssemblies + { + get { - get - { - var toReturn = new List(); - toReturn.AddRange(GetViewModelAssemblies()); - toReturn.AddRange(GetViewAssemblies()); - return toReturn; - } + var toReturn = new List(); + toReturn.AddRange(GetViewModelAssemblies()); + toReturn.AddRange(GetViewAssemblies()); + return toReturn; } + } - protected virtual IDictionary ViewNamespaceAbbreviations => new Dictionary - { - { "Mvx", "mvvmcross.platforms.android.binding.views" } - }; - - protected virtual IEnumerable ViewNamespaces => new List - { - "Android.Views", - "Android.Widget", - "Android.Webkit", - "MvvmCross.Platforms.Android.Views", - "MvvmCross.Platforms.Android.Binding.Views" - }; - - protected virtual IEnumerable AndroidViewAssemblies => new List() - { - typeof(View).Assembly, - typeof(MvxDatePicker).Assembly, - GetType().Assembly, - }; + protected virtual IDictionary ViewNamespaceAbbreviations => new Dictionary + { + { "Mvx", "mvvmcross.platforms.android.binding.views" } + }; - protected virtual void FillTargetFactories(IMvxTargetBindingFactoryRegistry registry) - { - // nothing to do in this base class - } + protected virtual IEnumerable ViewNamespaces => new List + { + "Android.Views", + "Android.Widget", + "Android.Webkit", + "MvvmCross.Platforms.Android.Views", + "MvvmCross.Platforms.Android.Binding.Views" + }; + + protected virtual IEnumerable AndroidViewAssemblies => new List() + { + typeof(View).Assembly, + typeof(MvxDatePicker).Assembly, + GetType().Assembly, + }; - protected override IMvxNameMapping CreateViewToViewModelNaming() - { - return new MvxPostfixAwareViewToViewModelNameMapping("View", "Activity", "Fragment"); - } + protected virtual void FillTargetFactories(IMvxTargetBindingFactoryRegistry registry) + { + // nothing to do in this base class } - public abstract class MvxAndroidSetup : MvxAndroidSetup - where TApplication : class, IMvxApplication, new() + protected override IMvxNameMapping CreateViewToViewModelNaming() { - protected override IMvxApplication CreateApp(IMvxIoCProvider iocProvider) => - iocProvider.IoCConstruct(); + return new MvxPostfixAwareViewToViewModelNameMapping("View", "Activity", "Fragment"); + } +} - public override IEnumerable GetViewModelAssemblies() - { - return new[] { typeof(TApplication).GetTypeInfo().Assembly }; - } +public abstract class MvxAndroidSetup : MvxAndroidSetup + where TApplication : class, IMvxApplication, new() +{ + protected override IMvxApplication CreateApp(IMvxIoCProvider iocProvider) => + iocProvider.IoCConstruct(); + + public override IEnumerable GetViewModelAssemblies() + { + return new[] { typeof(TApplication).GetTypeInfo().Assembly }; } -#nullable restore } From 6f2c112a7daae1dde2a3377d13844f4596727e66 Mon Sep 17 00:00:00 2001 From: Tomasz Cielecki Date: Fri, 20 Jan 2023 15:32:14 +0100 Subject: [PATCH 4/4] Update changelog --- CHANGELOG.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 22626a4539..69ebd4fd71 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,22 @@ # Changelog +## [9.0.9](https://github.com/MvvmCross/MvvmCross/tree/9.0.9) (2023-01-20) + +[Full Changelog](https://github.com/MvvmCross/MvvmCross/compare/9.0.8...9.0.9) + +**Fixed bugs:** + +- Android ListenableWorker MvxSetupSingleton.EnsureInitialized\(\) crashes with InvalidOperationException [\#4555](https://github.com/MvvmCross/MvvmCross/issues/4555) +- Fix CreateViewsContainer getting Application Context from Top Activity [\#4556](https://github.com/MvvmCross/MvvmCross/pull/4556) ([Cheesebaron](https://github.com/Cheesebaron)) + +**Closed issues:** + +- Upgrade to 8.0.2 causes "You cannot create more than one instance of MvxSingleton" exception on startup of iOS instance [\#4327](https://github.com/MvvmCross/MvvmCross/issues/4327) + +**Merged pull requests:** + +- Fix for closing and re-opening non-fullscreen modals on iOS fast not working correctly [\#4554](https://github.com/MvvmCross/MvvmCross/pull/4554) ([Digifais](https://github.com/Digifais)) + ## [9.0.8](https://github.com/MvvmCross/MvvmCross/tree/9.0.8) (2023-01-16) [Full Changelog](https://github.com/MvvmCross/MvvmCross/compare/9.0.7...9.0.8)