From 0b19d8d50a63fc133b465389686cf62094dd5879 Mon Sep 17 00:00:00 2001 From: Geoffroy BONNEVILLE Date: Tue, 21 Apr 2020 17:13:39 +0200 Subject: [PATCH] Opening Databases now use a Messenger service --- ModernKeePass/App.xaml.cs | 57 +++++++++++---- ModernKeePass/DependencyInjection.cs | 13 ++++ ModernKeePass/Strings/en-US/CodeBehind.resw | 3 + ModernKeePass/Strings/fr-FR/CodeBehind.resw | 3 + ModernKeePass/ViewModels/RecentVm.cs | 8 ++- ModernKeePass/Views/GroupDetailPage.xaml.cs | 12 +--- .../MainPageFrames/OpenDatabasePage.xaml | 16 +---- .../MainPageFrames/OpenDatabasePage.xaml.cs | 23 +++++- .../MainPageFrames/RecentDatabasesPage.xaml | 21 ++---- .../RecentDatabasesPage.xaml.cs | 30 +++++++- .../UserControls/OpenDatabaseUserControl.xaml | 9 ++- .../OpenDatabaseUserControl.xaml.cs | 70 ++----------------- .../Messages/DatabaseAlreadyOpenedMessage.cs | 9 +++ .../Messages/DatabaseClosedMessage.cs | 7 ++ .../Messages/DatabaseOpenedMessage.cs | 7 ++ .../Messages/DatabaseOpeningMessage.cs | 7 ++ .../Messages/NavigateToPageMessage.cs | 8 +++ WinAppCommon/Messages/SaveErrorMessage.cs | 7 ++ WinAppCommon/ViewModels/Items/RecentItemVm.cs | 17 +---- .../UserControls/OpenDatabaseControlVm.cs | 53 +++++++++++--- WinAppCommon/WinAppCommon.projitems | 6 ++ 21 files changed, 240 insertions(+), 146 deletions(-) create mode 100644 WinAppCommon/Messages/DatabaseAlreadyOpenedMessage.cs create mode 100644 WinAppCommon/Messages/DatabaseClosedMessage.cs create mode 100644 WinAppCommon/Messages/DatabaseOpenedMessage.cs create mode 100644 WinAppCommon/Messages/DatabaseOpeningMessage.cs create mode 100644 WinAppCommon/Messages/NavigateToPageMessage.cs create mode 100644 WinAppCommon/Messages/SaveErrorMessage.cs diff --git a/ModernKeePass/App.xaml.cs b/ModernKeePass/App.xaml.cs index 7431d83..d1510de 100644 --- a/ModernKeePass/App.xaml.cs +++ b/ModernKeePass/App.xaml.cs @@ -10,8 +10,10 @@ using Windows.Storage.Pickers; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Navigation; +using GalaSoft.MvvmLight.Messaging; using GalaSoft.MvvmLight.Views; using MediatR; +using Messages; using Microsoft.Extensions.DependencyInjection; using Microsoft.HockeyApp; using ModernKeePass.Application; @@ -39,6 +41,8 @@ namespace ModernKeePass private readonly IMediator _mediator; private readonly ISettingsProxy _settings; private readonly INavigationService _navigation; + private readonly IMessenger _messenger; + private readonly IHockeyClient _hockey; public static IServiceProvider Services { get; private set; } @@ -48,16 +52,6 @@ namespace ModernKeePass /// public App() { -#if DEBUG - HockeyClient.Current.Configure("2fe83672-887b-4910-b9de-93a4398d0f8f"); -#else - HockeyClient.Current.Configure("9eb5fbb79b484fbd8daf04635e975c84"); -#endif - InitializeComponent(); - Suspending += OnSuspending; - Resuming += OnResuming; - UnhandledException += OnUnhandledException; - // Setup DI IServiceCollection serviceCollection = new ServiceCollection(); serviceCollection.AddApplication(); @@ -71,8 +65,47 @@ namespace ModernKeePass _resource = Services.GetService(); _settings = Services.GetService(); _navigation = Services.GetService(); + _messenger = Services.GetService(); + _hockey = Services.GetService(); + + InitializeComponent(); + Suspending += OnSuspending; + Resuming += OnResuming; + UnhandledException += OnUnhandledException; + + ReceiveGlobalMessage(); } + #region Messages + private void ReceiveGlobalMessage() + { + _messenger.Register(this, async action => await ShowDatabaseOpenedDialog(action)); + } + + private async Task ShowDatabaseOpenedDialog(DatabaseAlreadyOpenedMessage message) + { + await MessageDialogHelper.ShowActionDialog(_resource.GetResourceValue("MessageDialogDBOpenTitle"), + string.Format(_resource.GetResourceValue("MessageDialogDBOpenDesc"), message.OpenedDatabase.Name), + _resource.GetResourceValue("MessageDialogDBOpenButtonSave"), + _resource.GetResourceValue("MessageDialogDBOpenButtonDiscard"), + async command => + { + await _mediator.Send(new SaveDatabaseCommand()); + ToastNotificationHelper.ShowGenericToast( + message.OpenedDatabase.Name, + _resource.GetResourceValue("ToastSavedMessage")); + await _mediator.Send(new CloseDatabaseCommand()); + _messenger.Send(new DatabaseClosedMessage()); + }, + async command => + { + await _mediator.Send(new CloseDatabaseCommand()); + _messenger.Send(new DatabaseClosedMessage()); + }); + } + + #endregion + #region Event Handlers private async void OnUnhandledException(object sender, UnhandledExceptionEventArgs unhandledExceptionEventArgs) @@ -89,7 +122,7 @@ namespace ModernKeePass { var innerException = realException.InnerException; unhandledExceptionEventArgs.Handled = true; - HockeyClient.Current.TrackException(innerException); + _hockey.TrackException(innerException); await MessageDialogHelper.ShowActionDialog(_resource.GetResourceValue("MessageDialogSaveErrorTitle"), innerException?.Message, _resource.GetResourceValue("MessageDialogSaveErrorButtonSaveAs"), @@ -123,7 +156,7 @@ namespace ModernKeePass protected override async void OnLaunched(LaunchActivatedEventArgs args) { await OnLaunchOrActivated(args); - await HockeyClient.Current.SendCrashesAsync(/* sendWithoutAsking: true */); + await _hockey.SendCrashesAsync(/* sendWithoutAsking: true */); } protected override async void OnActivated(IActivatedEventArgs args) diff --git a/ModernKeePass/DependencyInjection.cs b/ModernKeePass/DependencyInjection.cs index 2be2630..048e4b4 100644 --- a/ModernKeePass/DependencyInjection.cs +++ b/ModernKeePass/DependencyInjection.cs @@ -1,7 +1,9 @@ using System.Reflection; using AutoMapper; +using GalaSoft.MvvmLight.Messaging; using GalaSoft.MvvmLight.Views; using Microsoft.Extensions.DependencyInjection; +using Microsoft.HockeyApp; using ModernKeePass.Common; using ModernKeePass.Views; @@ -23,6 +25,17 @@ namespace ModernKeePass nav.Configure(Constants.Navigation.GroupPage, typeof(GroupDetailPage)); return nav; }); + services.AddSingleton(provider => Messenger.Default); + + services.AddSingleton(provider => + { +#if DEBUG + HockeyClient.Current.Configure("2fe83672-887b-4910-b9de-93a4398d0f8f"); +#else + HockeyClient.Current.Configure("9eb5fbb79b484fbd8daf04635e975c84"); +#endif + return HockeyClient.Current; + }); return services; } diff --git a/ModernKeePass/Strings/en-US/CodeBehind.resw b/ModernKeePass/Strings/en-US/CodeBehind.resw index 169b342..9365040 100644 --- a/ModernKeePass/Strings/en-US/CodeBehind.resw +++ b/ModernKeePass/Strings/en-US/CodeBehind.resw @@ -264,4 +264,7 @@ Delete history entry ? + + Open + \ No newline at end of file diff --git a/ModernKeePass/Strings/fr-FR/CodeBehind.resw b/ModernKeePass/Strings/fr-FR/CodeBehind.resw index eecc35b..5ef0eeb 100644 --- a/ModernKeePass/Strings/fr-FR/CodeBehind.resw +++ b/ModernKeePass/Strings/fr-FR/CodeBehind.resw @@ -264,4 +264,7 @@ Supprimer cet historique ? + + Open + \ No newline at end of file diff --git a/ModernKeePass/ViewModels/RecentVm.cs b/ModernKeePass/ViewModels/RecentVm.cs index 1b5e287..d5c9900 100644 --- a/ModernKeePass/ViewModels/RecentVm.cs +++ b/ModernKeePass/ViewModels/RecentVm.cs @@ -42,8 +42,7 @@ namespace ModernKeePass.ViewModels public ICommand ClearAllCommand { get; } - public RecentVm() : this (App.Services.GetRequiredService()) - { } + public RecentVm() : this (App.Services.GetRequiredService()) { } public RecentVm(IRecentProxy recent) { @@ -55,6 +54,11 @@ namespace ModernKeePass.ViewModels if (RecentItems.Count > 0) SelectedItem = RecentItems[0]; } + + public void UpdateAccessTime(string token) + { + _recent.Get(token, true).Wait(); + } private void ClearAll() { diff --git a/ModernKeePass/Views/GroupDetailPage.xaml.cs b/ModernKeePass/Views/GroupDetailPage.xaml.cs index 08e85c5..908e363 100644 --- a/ModernKeePass/Views/GroupDetailPage.xaml.cs +++ b/ModernKeePass/Views/GroupDetailPage.xaml.cs @@ -58,15 +58,9 @@ namespace ModernKeePass.Views { NavigationHelper.OnNavigatedTo(e); - var args = e.Parameter as PasswordEventArgs; - if (args != null) - DataContext = new GroupDetailVm(args.RootGroupId); - else - { - var navigationItem = e.Parameter as NavigationItem; - if (navigationItem != null) - DataContext = new GroupDetailVm(navigationItem.Id) { IsEditMode = navigationItem.IsNew }; - } + var navigationItem = e.Parameter as NavigationItem; + if (navigationItem != null) + DataContext = new GroupDetailVm(navigationItem.Id) { IsEditMode = navigationItem.IsNew }; } protected override void OnNavigatedFrom(NavigationEventArgs e) diff --git a/ModernKeePass/Views/MainPageFrames/OpenDatabasePage.xaml b/ModernKeePass/Views/MainPageFrames/OpenDatabasePage.xaml index 0ffe7eb..04299ee 100644 --- a/ModernKeePass/Views/MainPageFrames/OpenDatabasePage.xaml +++ b/ModernKeePass/Views/MainPageFrames/OpenDatabasePage.xaml @@ -5,19 +5,15 @@ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:viewModels="using:ModernKeePass.ViewModels" xmlns:converters="using:ModernKeePass.Converters" - xmlns:interactivity="using:Microsoft.Xaml.Interactivity" - xmlns:core="using:Microsoft.Xaml.Interactions.Core" xmlns:userControls="using:ModernKeePass.Views.UserControls" x:Class="ModernKeePass.Views.OpenDatabasePage" mc:Ignorable="d"> + - - - - + - + @@ -43,16 +40,10 @@ - - - - - - - - - - + diff --git a/ModernKeePass/Views/MainPageFrames/RecentDatabasesPage.xaml.cs b/ModernKeePass/Views/MainPageFrames/RecentDatabasesPage.xaml.cs index 485806b..f84455c 100644 --- a/ModernKeePass/Views/MainPageFrames/RecentDatabasesPage.xaml.cs +++ b/ModernKeePass/Views/MainPageFrames/RecentDatabasesPage.xaml.cs @@ -1,5 +1,13 @@ // Pour en savoir plus sur le modèle d'élément Page vierge, consultez la page http://go.microsoft.com/fwlink/?LinkId=234238 +using GalaSoft.MvvmLight.Messaging; +using GalaSoft.MvvmLight.Views; +using Messages; +using Microsoft.Extensions.DependencyInjection; +using ModernKeePass.Common; +using ModernKeePass.Models; +using ModernKeePass.ViewModels; + namespace ModernKeePass.Views { /// @@ -7,9 +15,29 @@ namespace ModernKeePass.Views /// public sealed partial class RecentDatabasesPage { - public RecentDatabasesPage() + private RecentVm Model => (RecentVm)Resources["ViewModel"]; + + private readonly INavigationService _navigation; + private readonly IMessenger _messenger; + + public RecentDatabasesPage(): this( + App.Services.GetRequiredService(), + App.Services.GetRequiredService()) + { } + + public RecentDatabasesPage(INavigationService navigation, IMessenger messenger) { + _navigation = navigation; + _messenger = messenger; InitializeComponent(); + + messenger.Register(this, action => Model.UpdateAccessTime(action.Token)); + messenger.Register(this, NavigateToPage); + } + + private void NavigateToPage(DatabaseOpenedMessage message) + { + _navigation.NavigateTo(Constants.Navigation.GroupPage, new NavigationItem { Id = message.RootGroupId }); } } } diff --git a/ModernKeePass/Views/UserControls/OpenDatabaseUserControl.xaml b/ModernKeePass/Views/UserControls/OpenDatabaseUserControl.xaml index c22dc98..9c0df3a 100644 --- a/ModernKeePass/Views/UserControls/OpenDatabaseUserControl.xaml +++ b/ModernKeePass/Views/UserControls/OpenDatabaseUserControl.xaml @@ -1,4 +1,4 @@ -