From 34d5d689cdd8031488487f48873fceca207e7830 Mon Sep 17 00:00:00 2001 From: David Britch Date: Mon, 8 May 2017 13:20:06 +0100 Subject: [PATCH] Fixed app crash when switching from mock to real services. When the previous page is the MainView, switching from mock to real services will force re-authentication by navigating to the LoginView. --- .../Services/Navigation/INavigationService.cs | 2 ++ .../Services/Navigation/NavigationService.cs | 10 ++++++ .../ViewModels/SettingsViewModel.cs | 34 ++++++++++++++----- .../Views/SettingsView.xaml | 2 +- 4 files changed, 39 insertions(+), 9 deletions(-) diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Navigation/INavigationService.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Navigation/INavigationService.cs index 6a1bbcf6d..e04843679 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Navigation/INavigationService.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Navigation/INavigationService.cs @@ -5,6 +5,8 @@ namespace eShopOnContainers.Services { public interface INavigationService { + ViewModelBase PreviousPageViewModel { get; } + Task InitializeAsync(); Task NavigateToAsync() where TViewModel : ViewModelBase; diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Navigation/NavigationService.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Navigation/NavigationService.cs index 4a6c0ef6c..d9ec0be89 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Navigation/NavigationService.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Navigation/NavigationService.cs @@ -12,6 +12,16 @@ namespace eShopOnContainers.Services { public class NavigationService : INavigationService { + public ViewModelBase PreviousPageViewModel + { + get + { + var mainPage = Application.Current.MainPage as CustomNavigationView; + var viewModel = mainPage.Navigation.NavigationStack[mainPage.Navigation.NavigationStack.Count - 2].BindingContext; + return viewModel as ViewModelBase; + } + } + public Task InitializeAsync() { if(string.IsNullOrEmpty(Settings.AuthAccessToken)) diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/SettingsViewModel.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/SettingsViewModel.cs index b42e6445a..4596eb25c 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/SettingsViewModel.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/SettingsViewModel.cs @@ -3,6 +3,7 @@ using System.Windows.Input; using Xamarin.Forms; using System.Threading.Tasks; using eShopOnContainers.Core.Helpers; +using eShopOnContainers.Core.Models.User; namespace eShopOnContainers.Core.ViewModels { @@ -67,13 +68,7 @@ namespace eShopOnContainers.Core.ViewModels } } - public ICommand MockServicesCommand => new Command(MockServices); - - private void MockServices() - { - ViewModelLocator.RegisterDependencies(!UseAzureServices); - UpdateInfo(); - } + public ICommand ToggleMockServicesCommand => new Command(async () => await ToggleMockServicesAsync()); public override Task InitializeAsync(object navigationData) { @@ -82,7 +77,30 @@ namespace eShopOnContainers.Core.ViewModels return base.InitializeAsync(navigationData); } - private void UpdateInfo() + private async Task ToggleMockServicesAsync() + { + ViewModelLocator.RegisterDependencies(!UseAzureServices); + UpdateInfo(); + + var previousPageViewModel = NavigationService.PreviousPageViewModel; + if (previousPageViewModel != null) + { + if (previousPageViewModel is MainViewModel) + { + // Slight delay so that page navigation isn't instantaneous + await Task.Delay(1000); + if (UseAzureServices) + { + Settings.AuthAccessToken = string.Empty; + Settings.AuthIdToken = string.Empty; + await NavigationService.NavigateToAsync(new LogoutParameter { Logout = true }); + await NavigationService.RemoveBackStackAsync(); + } + } + } + } + + private void UpdateInfo() { if (!UseAzureServices) { diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/SettingsView.xaml b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/SettingsView.xaml index 167e637e6..7db37dd66 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/SettingsView.xaml +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/SettingsView.xaml @@ -121,7 +121,7 @@ Grid.Row="1" Animate="True" Checked="{Binding UseAzureServices, Mode=TwoWay}" - Command="{Binding MockServicesCommand}" + Command="{Binding ToggleMockServicesCommand}" Style="{StaticResource SettingsToggleButtonStyle}">