From d972b6cb5a9b88997b9c4a8e0edd47c226f915a2 Mon Sep 17 00:00:00 2001 From: Geoffroy BONNEVILLE Date: Thu, 9 Apr 2020 19:43:06 +0200 Subject: [PATCH] Added the option to close DB without saving Changed the way recent files are retrieved Stopped showing the DB Closed exception on suspend Reordering entries works Moved code from infra to application Cleanup --- ModernKeePass.Application/Application.csproj | 2 +- .../Common/Interfaces/IDatabaseProxy.cs | 2 +- .../Common/Interfaces/IRecentProxy.cs | 2 +- .../Queries/GetDatabase/GetDatabaseQuery.cs | 3 +- .../MoveEntryCommand.cs} | 12 ++--- .../SetRecycleBin/SetRecycleBinCommand.cs | 5 +- ModernKeePass.Domain/Common/Constants.cs | 7 +++ ModernKeePass.Domain/Domain.csproj | 1 + .../KeePass/KeePassDatabaseClient.cs | 18 +++---- .../UWP/StorageFileClient.cs | 12 ++--- .../UWP/UwpRecentFilesClient.cs | 54 ++++++++++--------- ModernKeePass/Actions/DeleteEntityAction.cs | 4 +- ModernKeePass/App.xaml.cs | 13 +++-- ModernKeePass/Common/MessageDialogHelper.cs | 6 +-- ModernKeePass/Strings/en-US/Resources.resw | 6 +++ ModernKeePass/Strings/fr-FR/Resources.resw | 6 +++ ModernKeePass/ViewModels/CompositeKeyVm.cs | 2 +- ModernKeePass/ViewModels/EntryDetailVm.cs | 4 +- ModernKeePass/ViewModels/GroupDetailVm.cs | 18 +++---- .../ViewModels/Items/RecentItemVm.cs | 2 +- .../ViewModels/Items/SettingsDatabaseVm.cs | 2 +- .../ViewModels/Items/SettingsNewVm.cs | 2 +- .../ViewModels/Items/SettingsSaveVm.cs | 2 +- ModernKeePass/ViewModels/MainVm.cs | 2 +- ModernKeePass/ViewModels/OpenVm.cs | 2 +- ModernKeePass/ViewModels/RecentVm.cs | 7 +-- ModernKeePass/ViewModels/SaveVm.cs | 9 +++- ModernKeePass/ViewModels/SettingsVm.cs | 2 +- .../MainPageFrames/ImportExportPage.xaml.cs | 2 +- .../MainPageFrames/NewDatabasePage.xaml.cs | 4 +- .../MainPageFrames/OpenDatabasePage.xaml.cs | 2 +- .../MainPageFrames/RecentDatabasesPage.xaml | 14 ++--- .../MainPageFrames/SaveDatabasePage.xaml | 2 + .../MainPageFrames/SaveDatabasePage.xaml.cs | 8 ++- .../CompositeKeyUserControl.xaml.cs | 2 +- 35 files changed, 141 insertions(+), 100 deletions(-) rename ModernKeePass.Application/Group/Commands/{InsertEntry/InsertEntryCommand.cs => MoveEntry/MoveEntryCommand.cs} (61%) create mode 100644 ModernKeePass.Domain/Common/Constants.cs diff --git a/ModernKeePass.Application/Application.csproj b/ModernKeePass.Application/Application.csproj index af1fc37..5cee244 100644 --- a/ModernKeePass.Application/Application.csproj +++ b/ModernKeePass.Application/Application.csproj @@ -119,7 +119,7 @@ - + diff --git a/ModernKeePass.Application/Common/Interfaces/IDatabaseProxy.cs b/ModernKeePass.Application/Common/Interfaces/IDatabaseProxy.cs index 561e988..1657f15 100644 --- a/ModernKeePass.Application/Common/Interfaces/IDatabaseProxy.cs +++ b/ModernKeePass.Application/Common/Interfaces/IDatabaseProxy.cs @@ -27,7 +27,7 @@ namespace ModernKeePass.Application.Common.Interfaces void CloseDatabase(); Task AddEntry(string parentGroupId, string entryId); - Task InsertEntry(string parentGroupId, string entryId, int index); + Task MoveEntry(string parentGroupId, string entryId, int index); Task AddGroup(string parentGroupId, string groupId); void UpdateEntry(string entryId, string fieldName, object fieldValue); void UpdateGroup(string groupId); diff --git a/ModernKeePass.Application/Common/Interfaces/IRecentProxy.cs b/ModernKeePass.Application/Common/Interfaces/IRecentProxy.cs index dd97e65..d165de0 100644 --- a/ModernKeePass.Application/Common/Interfaces/IRecentProxy.cs +++ b/ModernKeePass.Application/Common/Interfaces/IRecentProxy.cs @@ -8,7 +8,7 @@ namespace ModernKeePass.Application.Common.Interfaces { int EntryCount { get; } Task Get(string token, bool updateAccessTime = false); - Task> GetAll(); + IEnumerable GetAll(); Task Add(FileInfo recentItem); void ClearAll(); } diff --git a/ModernKeePass.Application/Database/Queries/GetDatabase/GetDatabaseQuery.cs b/ModernKeePass.Application/Database/Queries/GetDatabase/GetDatabaseQuery.cs index 0bf6b0d..4d207a8 100644 --- a/ModernKeePass.Application/Database/Queries/GetDatabase/GetDatabaseQuery.cs +++ b/ModernKeePass.Application/Database/Queries/GetDatabase/GetDatabaseQuery.cs @@ -1,6 +1,7 @@ using MediatR; using ModernKeePass.Application.Common.Interfaces; using ModernKeePass.Application.Database.Models; +using ModernKeePass.Domain.Common; namespace ModernKeePass.Application.Database.Queries.GetDatabase { @@ -26,7 +27,7 @@ namespace ModernKeePass.Application.Database.Queries.GetDatabase database.Name = _databaseProxy.Name; database.RootGroupId = _databaseProxy.RootGroupId; database.IsRecycleBinEnabled = _databaseProxy.IsRecycleBinEnabled; - database.RecycleBinId = _databaseProxy.RecycleBinId; + database.RecycleBinId = _databaseProxy.RecycleBinId == Constants.EmptyId ? null : _databaseProxy.RecycleBinId; database.Compression = _databaseProxy.Compression; database.CipherId = _databaseProxy.CipherId; database.KeyDerivationId = _databaseProxy.KeyDerivationId; diff --git a/ModernKeePass.Application/Group/Commands/InsertEntry/InsertEntryCommand.cs b/ModernKeePass.Application/Group/Commands/MoveEntry/MoveEntryCommand.cs similarity index 61% rename from ModernKeePass.Application/Group/Commands/InsertEntry/InsertEntryCommand.cs rename to ModernKeePass.Application/Group/Commands/MoveEntry/MoveEntryCommand.cs index db3e417..46a4f82 100644 --- a/ModernKeePass.Application/Group/Commands/InsertEntry/InsertEntryCommand.cs +++ b/ModernKeePass.Application/Group/Commands/MoveEntry/MoveEntryCommand.cs @@ -5,28 +5,28 @@ using ModernKeePass.Application.Entry.Models; using ModernKeePass.Application.Group.Models; using ModernKeePass.Domain.Exceptions; -namespace ModernKeePass.Application.Group.Commands.InsertEntry +namespace ModernKeePass.Application.Group.Commands.MoveEntry { - public class InsertEntryCommand : IRequest + public class MoveEntryCommand : IRequest { public GroupVm ParentGroup { get; set; } public EntryVm Entry { get; set; } public int Index { get; set; } - public class InsertEntryCommandHandler : IAsyncRequestHandler + public class MoveEntryCommandHandler : IAsyncRequestHandler { private readonly IDatabaseProxy _database; - public InsertEntryCommandHandler(IDatabaseProxy database) + public MoveEntryCommandHandler(IDatabaseProxy database) { _database = database; } - public async Task Handle(InsertEntryCommand message) + public async Task Handle(MoveEntryCommand message) { if (!_database.IsOpen) throw new DatabaseClosedException(); - await _database.InsertEntry(message.ParentGroup.Id, message.Entry.Id, message.Index); + await _database.MoveEntry(message.ParentGroup.Id, message.Entry.Id, message.Index); message.ParentGroup.Entries.Insert(message.Index, message.Entry); } } diff --git a/ModernKeePass.Application/Parameters/Commands/SetRecycleBin/SetRecycleBinCommand.cs b/ModernKeePass.Application/Parameters/Commands/SetRecycleBin/SetRecycleBinCommand.cs index 2725adb..82f3c63 100644 --- a/ModernKeePass.Application/Parameters/Commands/SetRecycleBin/SetRecycleBinCommand.cs +++ b/ModernKeePass.Application/Parameters/Commands/SetRecycleBin/SetRecycleBinCommand.cs @@ -1,5 +1,6 @@ using MediatR; using ModernKeePass.Application.Common.Interfaces; +using ModernKeePass.Domain.Common; using ModernKeePass.Domain.Exceptions; namespace ModernKeePass.Application.Parameters.Commands.SetRecycleBin @@ -19,8 +20,8 @@ namespace ModernKeePass.Application.Parameters.Commands.SetRecycleBin public void Handle(SetRecycleBinCommand message) { - if (_database.IsOpen) _database.RecycleBinId = message.RecycleBinId; - else throw new DatabaseClosedException(); + if (!_database.IsOpen) throw new DatabaseClosedException(); + _database.RecycleBinId = message.RecycleBinId ?? Constants.EmptyId; } } } diff --git a/ModernKeePass.Domain/Common/Constants.cs b/ModernKeePass.Domain/Common/Constants.cs new file mode 100644 index 0000000..6cbe1ee --- /dev/null +++ b/ModernKeePass.Domain/Common/Constants.cs @@ -0,0 +1,7 @@ +namespace ModernKeePass.Domain.Common +{ + public static class Constants + { + public static string EmptyId => "00000000000000000000000000000000"; + } +} \ No newline at end of file diff --git a/ModernKeePass.Domain/Domain.csproj b/ModernKeePass.Domain/Domain.csproj index fc54a22..e75a3d8 100644 --- a/ModernKeePass.Domain/Domain.csproj +++ b/ModernKeePass.Domain/Domain.csproj @@ -76,6 +76,7 @@ + diff --git a/ModernKeePass.Infrastructure/KeePass/KeePassDatabaseClient.cs b/ModernKeePass.Infrastructure/KeePass/KeePassDatabaseClient.cs index e32e0df..f889343 100644 --- a/ModernKeePass.Infrastructure/KeePass/KeePassDatabaseClient.cs +++ b/ModernKeePass.Infrastructure/KeePass/KeePassDatabaseClient.cs @@ -45,18 +45,13 @@ namespace ModernKeePass.Infrastructure.KeePass public string RecycleBinId { - get + get { - if (_pwDatabase.RecycleBinEnabled && !_pwDatabase.RecycleBinUuid.Equals(PwUuid.Zero)) - { - return _pwDatabase.RecycleBinUuid.ToHexString(); - } - - return null; + return _pwDatabase.RecycleBinUuid.ToHexString(); } set { - _pwDatabase.RecycleBinUuid = value != null ? BuildIdFromString(value) : PwUuid.Zero; + _pwDatabase.RecycleBinUuid = BuildIdFromString(value); _pwDatabase.RecycleBinChanged = _dateTime.Now; } } @@ -152,7 +147,7 @@ namespace ModernKeePass.Infrastructure.KeePass }); } - public async Task SaveDatabase(byte[] newFileContents) + public async Task SaveDatabase(byte[] newFileContents) { return await Task.Run(() => { @@ -176,12 +171,15 @@ namespace ModernKeePass.Infrastructure.KeePass }); } - public async Task InsertEntry(string parentGroupId, string entryId, int index) + public async Task MoveEntry(string parentGroupId, string entryId, int index) { await Task.Run(() => { var parentPwGroup = _pwDatabase.RootGroup.FindGroup(BuildIdFromString(parentGroupId), true); var pwEntry = _pwDatabase.RootGroup.FindEntry(BuildIdFromString(entryId), true); + var currentIndex = (uint)parentPwGroup.Entries.IndexOf(pwEntry); + + parentPwGroup.Entries.RemoveAt(currentIndex); parentPwGroup.Entries.Insert((uint)index, pwEntry); }); } diff --git a/ModernKeePass.Infrastructure/UWP/StorageFileClient.cs b/ModernKeePass.Infrastructure/UWP/StorageFileClient.cs index 4337d42..d4cb136 100644 --- a/ModernKeePass.Infrastructure/UWP/StorageFileClient.cs +++ b/ModernKeePass.Infrastructure/UWP/StorageFileClient.cs @@ -12,15 +12,15 @@ namespace ModernKeePass.Infrastructure.UWP { public async Task OpenBinaryFile(string path) { - var file = await StorageApplicationPermissions.FutureAccessList.GetFileAsync(path); - var result = await FileIO.ReadBufferAsync(file); + var file = await StorageApplicationPermissions.FutureAccessList.GetFileAsync(path).AsTask(); + var result = await FileIO.ReadBufferAsync(file).AsTask(); return result.ToArray(); } public async Task> OpenTextFile(string path) { - var file = await StorageApplicationPermissions.FutureAccessList.GetFileAsync(path); - var result = await FileIO.ReadLinesAsync(file); + var file = await StorageApplicationPermissions.FutureAccessList.GetFileAsync(path).AsTask(); + var result = await FileIO.ReadLinesAsync(file).AsTask(); return result; } @@ -31,8 +31,8 @@ namespace ModernKeePass.Infrastructure.UWP public async Task WriteBinaryContentsToFile(string path, byte[] contents) { - var file = await StorageApplicationPermissions.FutureAccessList.GetFileAsync(path); - await FileIO.WriteBytesAsync(file, contents); + var file = await StorageApplicationPermissions.FutureAccessList.GetFileAsync(path).AsTask(); + await FileIO.WriteBytesAsync(file, contents).AsTask(); } } } \ No newline at end of file diff --git a/ModernKeePass.Infrastructure/UWP/UwpRecentFilesClient.cs b/ModernKeePass.Infrastructure/UWP/UwpRecentFilesClient.cs index 3dbf956..9a1d952 100644 --- a/ModernKeePass.Infrastructure/UWP/UwpRecentFilesClient.cs +++ b/ModernKeePass.Infrastructure/UWP/UwpRecentFilesClient.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Linq; using System.Threading.Tasks; using Windows.Storage.AccessCache; using ModernKeePass.Application.Common.Interfaces; @@ -10,51 +11,52 @@ namespace ModernKeePass.Infrastructure.UWP public class UwpRecentFilesClient: IRecentProxy { private readonly StorageItemMostRecentlyUsedList _mru = StorageApplicationPermissions.MostRecentlyUsedList; + private readonly StorageItemAccessList _fal = StorageApplicationPermissions.FutureAccessList; public int EntryCount => _mru.Entries.Count; public async Task Get(string token, bool updateAccessTime = false) { - var file = await _mru.GetFileAsync(token, updateAccessTime ? AccessCacheOptions.None : AccessCacheOptions.SuppressAccessTimeUpdate); - StorageApplicationPermissions.FutureAccessList.AddOrReplace(token, file); - return new FileInfo + try { - Id = token, - Name = file.DisplayName, - Path = file.Path - }; + var file = await _mru.GetFileAsync(token, + updateAccessTime ? AccessCacheOptions.None : AccessCacheOptions.SuppressAccessTimeUpdate).AsTask().ConfigureAwait(false); + _fal.AddOrReplace(token, file); + return new FileInfo + { + Id = token, + Name = file.DisplayName, + Path = file.Path + }; + } + catch (Exception) + { + _mru.Remove(token); + return null; + } } - public async Task> GetAll() + public IEnumerable GetAll() { - var result = new List(); - foreach (var entry in _mru.Entries) + return _mru.Entries.Select(e => new FileInfo { - try - { - var recentItem = await Get(entry.Token); - result.Add(recentItem); - } - catch (Exception) - { - _mru.Remove(entry.Token); - } - } - return result; + Id = e.Token, + Name = e.Metadata?.Substring(e.Metadata.LastIndexOf("\\", StringComparison.OrdinalIgnoreCase) + 1), + Path = e.Metadata + }); } public async Task Add(FileInfo recentItem) { - var file = await StorageApplicationPermissions.FutureAccessList.GetFileAsync(recentItem.Id); - _mru.Add(file); + var file = await _fal.GetFileAsync(recentItem.Id).AsTask(); + _mru.Add(file, file.Path); } public void ClearAll() { - for (var i = _mru.Entries.Count; i > 0; i--) + foreach (var entry in _mru.Entries) { - var entry = _mru.Entries[i]; - StorageApplicationPermissions.FutureAccessList.Remove(entry.Token); + if (_fal.ContainsItem(entry.Token)) _fal.Remove(entry.Token); _mru.Remove(entry.Token); } } diff --git a/ModernKeePass/Actions/DeleteEntityAction.cs b/ModernKeePass/Actions/DeleteEntityAction.cs index b0032be..2da4459 100644 --- a/ModernKeePass/Actions/DeleteEntityAction.cs +++ b/ModernKeePass/Actions/DeleteEntityAction.cs @@ -34,7 +34,7 @@ namespace ModernKeePass.Actions DependencyProperty.Register("Command", typeof(ICommand), typeof(DeleteEntityAction), new PropertyMetadata(null)); - public DeleteEntityAction() : this(App.Services.GetService()) { } + public DeleteEntityAction() : this(App.Services.GetRequiredService()) { } public DeleteEntityAction(IMediator mediator) { @@ -58,7 +58,7 @@ namespace ModernKeePass.Actions ToastNotificationHelper.ShowMovedToast(Entity, resource.GetResourceValue("EntityDeleting"), text); Entity.MarkForDelete(resource.GetResourceValue("RecycleBinTitle")); Command.Execute(null); - }, null).GetAwaiter(); + }, null).GetAwaiter().GetResult(); return null; } diff --git a/ModernKeePass/App.xaml.cs b/ModernKeePass/App.xaml.cs index 7a3cdea..fa58839 100644 --- a/ModernKeePass/App.xaml.cs +++ b/ModernKeePass/App.xaml.cs @@ -101,7 +101,7 @@ namespace ModernKeePass savePicker.FileTypeChoices.Add(_resource.GetResourceValue("MessageDialogSaveErrorFileTypeDesc"), new List {".kdbx"}); - var file = await savePicker.PickSaveFileAsync(); + var file = await savePicker.PickSaveFileAsync().AsTask(); if (file != null) { var token = StorageApplicationPermissions.FutureAccessList.Add(file); @@ -213,15 +213,20 @@ namespace ModernKeePass { if (_settings.GetSetting("SaveSuspend", true)) { - await _mediator.Send(new SaveDatabaseCommand()); + await _mediator.Send(new SaveDatabaseCommand()).ConfigureAwait(false); } - await _mediator.Send(new CloseDatabaseCommand()); + + await _mediator.Send(new CloseDatabaseCommand()).ConfigureAwait(false); + } + catch (DatabaseClosedException) + { + // Do nothing on purpose } catch (Exception exception) { ToastNotificationHelper.ShowErrorToast(exception); } - await SuspensionManager.SaveAsync(); + await SuspensionManager.SaveAsync().ConfigureAwait(false); deferral.Complete(); } diff --git a/ModernKeePass/Common/MessageDialogHelper.cs b/ModernKeePass/Common/MessageDialogHelper.cs index 385ef4d..7fd6010 100644 --- a/ModernKeePass/Common/MessageDialogHelper.cs +++ b/ModernKeePass/Common/MessageDialogHelper.cs @@ -15,7 +15,7 @@ namespace ModernKeePass.Common messageDialog.Commands.Add(new UICommand(actionButtonText, actionCommand)); // Show the message dialog - await messageDialog.ShowAsync(); + await messageDialog.ShowAsync().AsTask(); } public static async Task ShowErrorDialog(Exception exception) @@ -25,7 +25,7 @@ namespace ModernKeePass.Common var messageDialog = CreateBasicDialog(exception.Message, exception.StackTrace, "OK"); // Show the message dialog - await messageDialog.ShowAsync(); + await messageDialog.ShowAsync().AsTask();; } public static async Task ShowNotificationDialog(string title, string message) @@ -33,7 +33,7 @@ namespace ModernKeePass.Common var dialog = CreateBasicDialog(title, message, "OK"); // Show the message dialog - await dialog.ShowAsync(); + await dialog.ShowAsync().AsTask();; } private static MessageDialog CreateBasicDialog(string title, string message, string dismissActionText, UICommandInvokedHandler cancelCommand = null) diff --git a/ModernKeePass/Strings/en-US/Resources.resw b/ModernKeePass/Strings/en-US/Resources.resw index 4c5c79e..0b0bba4 100644 --- a/ModernKeePass/Strings/en-US/Resources.resw +++ b/ModernKeePass/Strings/en-US/Resources.resw @@ -492,4 +492,10 @@ Format + + Close without saving + + + This will close the currently opened database without saving the changes. + \ No newline at end of file diff --git a/ModernKeePass/Strings/fr-FR/Resources.resw b/ModernKeePass/Strings/fr-FR/Resources.resw index e4635f6..ab51db7 100644 --- a/ModernKeePass/Strings/fr-FR/Resources.resw +++ b/ModernKeePass/Strings/fr-FR/Resources.resw @@ -495,4 +495,10 @@ Le fichier CSV doit être formatté de la façon suivante: Nom du compte;Login;Mot de passe:URL;Commentaires + + Fermer sans sauvegarder + + + Cela va fermer la base de données ouverte sans sauvegarder les changements. + \ No newline at end of file diff --git a/ModernKeePass/ViewModels/CompositeKeyVm.cs b/ModernKeePass/ViewModels/CompositeKeyVm.cs index a5c80b0..9aa887f 100644 --- a/ModernKeePass/ViewModels/CompositeKeyVm.cs +++ b/ModernKeePass/ViewModels/CompositeKeyVm.cs @@ -115,7 +115,7 @@ namespace ModernKeePass.ViewModels private readonly ISettingsProxy _settings; private readonly ResourceHelper _resource; - public CompositeKeyVm() : this(App.Services.GetService(), App.Services.GetService()) { } + public CompositeKeyVm() : this(App.Services.GetRequiredService(), App.Services.GetRequiredService()) { } public CompositeKeyVm(IMediator mediator, ISettingsProxy settings) { diff --git a/ModernKeePass/ViewModels/EntryDetailVm.cs b/ModernKeePass/ViewModels/EntryDetailVm.cs index 9c4e852..1ce5ca4 100644 --- a/ModernKeePass/ViewModels/EntryDetailVm.cs +++ b/ModernKeePass/ViewModels/EntryDetailVm.cs @@ -219,7 +219,7 @@ namespace ModernKeePass.ViewModels public EntryDetailVm() { } - internal EntryDetailVm(string entryId, bool isNewEntry = false) : this(entryId, App.Services.GetService(), isNewEntry) { } + internal EntryDetailVm(string entryId, bool isNewEntry = false) : this(entryId, App.Services.GetRequiredService(), isNewEntry) { } public EntryDetailVm(string entryId, IMediator mediator, bool isNewEntry = false) { @@ -232,7 +232,7 @@ namespace ModernKeePass.ViewModels if (isNewEntry) GeneratePassword().GetAwaiter().GetResult(); IsSelected = true; - SaveCommand = new RelayCommand(() => _mediator.Send(new SaveDatabaseCommand())); + SaveCommand = new RelayCommand(async () => await _mediator.Send(new SaveDatabaseCommand())); GeneratePasswordCommand = new RelayCommand(async () => await GeneratePassword()); UndoDeleteCommand = new RelayCommand(async () => await Move(_parent), () => _parent != null); } diff --git a/ModernKeePass/ViewModels/GroupDetailVm.cs b/ModernKeePass/ViewModels/GroupDetailVm.cs index df5159e..4875d92 100644 --- a/ModernKeePass/ViewModels/GroupDetailVm.cs +++ b/ModernKeePass/ViewModels/GroupDetailVm.cs @@ -16,8 +16,7 @@ using ModernKeePass.Application.Group.Commands.AddGroup; using ModernKeePass.Application.Group.Commands.CreateEntry; using ModernKeePass.Application.Group.Commands.CreateGroup; using ModernKeePass.Application.Group.Commands.DeleteGroup; -using ModernKeePass.Application.Group.Commands.InsertEntry; -using ModernKeePass.Application.Group.Commands.RemoveEntry; +using ModernKeePass.Application.Group.Commands.MoveEntry; using ModernKeePass.Application.Group.Commands.RemoveGroup; using ModernKeePass.Application.Group.Commands.SortEntries; using ModernKeePass.Application.Group.Commands.SortGroups; @@ -33,9 +32,9 @@ namespace ModernKeePass.ViewModels { public class GroupDetailVm : NotifyPropertyChangedBase, IVmEntity, ISelectableModel { - public ObservableCollection Entries => new ObservableCollection(_group.Entries); + public ObservableCollection Entries { get; } - public ObservableCollection Groups => new ObservableCollection(_group.SubGroups); + public ObservableCollection Groups { get; } public IEnumerable SubEntries { @@ -124,7 +123,7 @@ namespace ModernKeePass.ViewModels public GroupDetailVm() {} - internal GroupDetailVm(string groupId) : this(groupId, App.Services.GetService()) + internal GroupDetailVm(string groupId) : this(groupId, App.Services.GetRequiredService()) { } public GroupDetailVm(string groupId, IMediator mediator, bool isEditMode = false) @@ -141,12 +140,14 @@ namespace ModernKeePass.ViewModels SaveCommand = new RelayCommand(async () => await _mediator.Send(new SaveDatabaseCommand())); SortEntriesCommand = new RelayCommand(async () => - await SortEntriesAsync().ConfigureAwait(false), () => IsEditMode); + await SortEntriesAsync(), () => IsEditMode); SortGroupsCommand = new RelayCommand(async () => - await SortGroupsAsync().ConfigureAwait(false), () => IsEditMode); + await SortGroupsAsync(), () => IsEditMode); UndoDeleteCommand = new RelayCommand(async () => await Move(_parent), () => _parent != null); + Entries = new ObservableCollection(_group.Entries); Entries.CollectionChanged += Entries_CollectionChanged; + Groups = new ObservableCollection(_group.SubGroups); } private async void Entries_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) @@ -156,7 +157,6 @@ namespace ModernKeePass.ViewModels case NotifyCollectionChangedAction.Remove: var oldIndex = e.OldStartingIndex; _reorderedEntry = _group.Entries[oldIndex]; - await _mediator.Send(new RemoveEntryCommand {Entry = _reorderedEntry, ParentGroup = _group}); break; case NotifyCollectionChangedAction.Add: if (_reorderedEntry == null) @@ -166,7 +166,7 @@ namespace ModernKeePass.ViewModels } else { - await _mediator.Send(new InsertEntryCommand {Entry = _reorderedEntry, ParentGroup = _group, Index = e.NewStartingIndex}); + await _mediator.Send(new MoveEntryCommand {Entry = _reorderedEntry, ParentGroup = _group, Index = e.NewStartingIndex}); } break; } diff --git a/ModernKeePass/ViewModels/Items/RecentItemVm.cs b/ModernKeePass/ViewModels/Items/RecentItemVm.cs index d91bb1b..842a57d 100644 --- a/ModernKeePass/ViewModels/Items/RecentItemVm.cs +++ b/ModernKeePass/ViewModels/Items/RecentItemVm.cs @@ -38,7 +38,7 @@ namespace ModernKeePass.ViewModels set { SetProperty(ref _isSelected, value); } } - public RecentItemVm(FileInfo file): this(App.Services.GetService(), file) {} + public RecentItemVm(FileInfo file): this(App.Services.GetRequiredService(), file) {} public RecentItemVm(IRecentProxy recent, FileInfo file) { _recent = recent; diff --git a/ModernKeePass/ViewModels/Items/SettingsDatabaseVm.cs b/ModernKeePass/ViewModels/Items/SettingsDatabaseVm.cs index dee3b78..1818b57 100644 --- a/ModernKeePass/ViewModels/Items/SettingsDatabaseVm.cs +++ b/ModernKeePass/ViewModels/Items/SettingsDatabaseVm.cs @@ -77,7 +77,7 @@ namespace ModernKeePass.ViewModels } } - public SettingsDatabaseVm() : this(App.Services.GetService()) { } + public SettingsDatabaseVm() : this(App.Services.GetRequiredService()) { } public SettingsDatabaseVm(IMediator mediator) { diff --git a/ModernKeePass/ViewModels/Items/SettingsNewVm.cs b/ModernKeePass/ViewModels/Items/SettingsNewVm.cs index c44074a..decc9e3 100644 --- a/ModernKeePass/ViewModels/Items/SettingsNewVm.cs +++ b/ModernKeePass/ViewModels/Items/SettingsNewVm.cs @@ -8,7 +8,7 @@ namespace ModernKeePass.ViewModels { private readonly ISettingsProxy _settings; - public SettingsNewVm() : this(App.Services.GetService()) + public SettingsNewVm() : this(App.Services.GetRequiredService()) { } public SettingsNewVm(ISettingsProxy settings) diff --git a/ModernKeePass/ViewModels/Items/SettingsSaveVm.cs b/ModernKeePass/ViewModels/Items/SettingsSaveVm.cs index 9da7961..4289d7f 100644 --- a/ModernKeePass/ViewModels/Items/SettingsSaveVm.cs +++ b/ModernKeePass/ViewModels/Items/SettingsSaveVm.cs @@ -7,7 +7,7 @@ namespace ModernKeePass.ViewModels { private readonly ISettingsProxy _settings; - public SettingsSaveVm() : this(App.Services.GetService()) + public SettingsSaveVm() : this(App.Services.GetRequiredService()) { } public SettingsSaveVm(ISettingsProxy settings) diff --git a/ModernKeePass/ViewModels/MainVm.cs b/ModernKeePass/ViewModels/MainVm.cs index f3bd7ea..faadf5d 100644 --- a/ModernKeePass/ViewModels/MainVm.cs +++ b/ModernKeePass/ViewModels/MainVm.cs @@ -50,7 +50,7 @@ namespace ModernKeePass.ViewModels public MainVm() {} internal MainVm(Frame referenceFrame, Frame destinationFrame, FileInfo databaseFile = null) : this(referenceFrame, destinationFrame, - App.Services.GetService(), App.Services.GetService(), databaseFile) + App.Services.GetRequiredService(), App.Services.GetRequiredService(), databaseFile) { } public MainVm(Frame referenceFrame, Frame destinationFrame, IMediator mediator, IRecentProxy recent, FileInfo databaseFile = null) diff --git a/ModernKeePass/ViewModels/OpenVm.cs b/ModernKeePass/ViewModels/OpenVm.cs index 090dd83..230040f 100644 --- a/ModernKeePass/ViewModels/OpenVm.cs +++ b/ModernKeePass/ViewModels/OpenVm.cs @@ -32,7 +32,7 @@ namespace ModernKeePass.ViewModels private set { SetProperty(ref _path, value); } } - public OpenVm(): this(App.Services.GetService()) { } + public OpenVm(): this(App.Services.GetRequiredService()) { } public OpenVm(IRecentProxy recent) { diff --git a/ModernKeePass/ViewModels/RecentVm.cs b/ModernKeePass/ViewModels/RecentVm.cs index 77edabb..246ae42 100644 --- a/ModernKeePass/ViewModels/RecentVm.cs +++ b/ModernKeePass/ViewModels/RecentVm.cs @@ -1,5 +1,6 @@ using System.Collections.ObjectModel; using System.Linq; +using System.Threading.Tasks; using System.Windows.Input; using Microsoft.Extensions.DependencyInjection; using ModernKeePass.Application.Common.Interfaces; @@ -41,15 +42,15 @@ namespace ModernKeePass.ViewModels public ICommand ClearAllCommand { get; } - public RecentVm() : this (App.Services.GetService()) + public RecentVm() : this (App.Services.GetRequiredService()) { } public RecentVm(IRecentProxy recent) { _recent = recent; ClearAllCommand = new RelayCommand(ClearAll); - - var recentItems = _recent.GetAll().GetAwaiter().GetResult().Select(r => new RecentItemVm(r)); + + var recentItems = _recent.GetAll().Select(r => new RecentItemVm(r)); RecentItems = new ObservableCollection(recentItems); if (RecentItems.Count > 0) SelectedItem = RecentItems[0]; diff --git a/ModernKeePass/ViewModels/SaveVm.cs b/ModernKeePass/ViewModels/SaveVm.cs index 91bb274..1294eff 100644 --- a/ModernKeePass/ViewModels/SaveVm.cs +++ b/ModernKeePass/ViewModels/SaveVm.cs @@ -11,7 +11,7 @@ namespace ModernKeePass.ViewModels public class SaveVm { private readonly IMediator _mediator; - public SaveVm() : this(App.Services.GetService()) { } + public SaveVm() : this(App.Services.GetRequiredService()) { } public SaveVm(IMediator mediator) { @@ -21,7 +21,7 @@ namespace ModernKeePass.ViewModels public async Task Save(bool close = true) { await _mediator.Send(new SaveDatabaseCommand()); - if (close) await _mediator.Send(new CloseDatabaseCommand()); + if (close) await Close(); } public async Task Save(StorageFile file) @@ -29,5 +29,10 @@ namespace ModernKeePass.ViewModels var token = StorageApplicationPermissions.FutureAccessList.Add(file); await _mediator.Send(new SaveDatabaseCommand { FilePath = token }); } + + public async Task Close() + { + await _mediator.Send(new CloseDatabaseCommand()); + } } } \ No newline at end of file diff --git a/ModernKeePass/ViewModels/SettingsVm.cs b/ModernKeePass/ViewModels/SettingsVm.cs index 89f6cdc..c5c1340 100644 --- a/ModernKeePass/ViewModels/SettingsVm.cs +++ b/ModernKeePass/ViewModels/SettingsVm.cs @@ -43,7 +43,7 @@ namespace ModernKeePass.ViewModels } } - public SettingsVm() : this(App.Services.GetService()) { } + public SettingsVm() : this(App.Services.GetRequiredService()) { } public SettingsVm(IMediator mediator) { diff --git a/ModernKeePass/Views/MainPageFrames/ImportExportPage.xaml.cs b/ModernKeePass/Views/MainPageFrames/ImportExportPage.xaml.cs index 84d43b6..2ebe284 100644 --- a/ModernKeePass/Views/MainPageFrames/ImportExportPage.xaml.cs +++ b/ModernKeePass/Views/MainPageFrames/ImportExportPage.xaml.cs @@ -27,7 +27,7 @@ namespace ModernKeePass.Views picker.FileTypeFilter.Add(".csv"); // Application now has read/write access to the picked file - var file = await picker.PickSingleFileAsync(); + var file = await picker.PickSingleFileAsync().AsTask(); if (file == null) return; } diff --git a/ModernKeePass/Views/MainPageFrames/NewDatabasePage.xaml.cs b/ModernKeePass/Views/MainPageFrames/NewDatabasePage.xaml.cs index 7e78eca..c03790c 100644 --- a/ModernKeePass/Views/MainPageFrames/NewDatabasePage.xaml.cs +++ b/ModernKeePass/Views/MainPageFrames/NewDatabasePage.xaml.cs @@ -34,7 +34,7 @@ namespace ModernKeePass.Views }; savePicker.FileTypeChoices.Add("KeePass 2.x database", new List { ".kdbx" }); - var file = await savePicker.PickSaveFileAsync(); + var file = await savePicker.PickSaveFileAsync().AsTask(); if (file == null) return; var token = StorageApplicationPermissions.FutureAccessList.Add(file); @@ -72,7 +72,7 @@ namespace ModernKeePass.Views picker.FileTypeFilter.Add(Model.ImportFileExtensionFilter); // Application now has read/write access to the picked file - Model.ImportFile = await picker.PickSingleFileAsync(); + Model.ImportFile = await picker.PickSingleFileAsync().AsTask(); if (Model.ImportFile != null) ImportFileLink.Content = Model.ImportFile.Name; } } diff --git a/ModernKeePass/Views/MainPageFrames/OpenDatabasePage.xaml.cs b/ModernKeePass/Views/MainPageFrames/OpenDatabasePage.xaml.cs index 436d0c5..09538cd 100644 --- a/ModernKeePass/Views/MainPageFrames/OpenDatabasePage.xaml.cs +++ b/ModernKeePass/Views/MainPageFrames/OpenDatabasePage.xaml.cs @@ -42,7 +42,7 @@ namespace ModernKeePass.Views picker.FileTypeFilter.Add(".kdbx"); // Application now has read/write access to the picked file - var file = await picker.PickSingleFileAsync(); + var file = await picker.PickSingleFileAsync().AsTask(); if (file == null) return; diff --git a/ModernKeePass/Views/MainPageFrames/RecentDatabasesPage.xaml b/ModernKeePass/Views/MainPageFrames/RecentDatabasesPage.xaml index d306e04..338c9fb 100644 --- a/ModernKeePass/Views/MainPageFrames/RecentDatabasesPage.xaml +++ b/ModernKeePass/Views/MainPageFrames/RecentDatabasesPage.xaml @@ -12,12 +12,10 @@ mc:Ignorable="d"> - + + - - - - + @@ -29,7 +27,7 @@ @@ -47,8 +45,10 @@ - + + + diff --git a/ModernKeePass/Views/MainPageFrames/SaveDatabasePage.xaml b/ModernKeePass/Views/MainPageFrames/SaveDatabasePage.xaml index f86a4fe..38213cb 100644 --- a/ModernKeePass/Views/MainPageFrames/SaveDatabasePage.xaml +++ b/ModernKeePass/Views/MainPageFrames/SaveDatabasePage.xaml @@ -15,5 +15,7 @@ + + diff --git a/ModernKeePass/Views/MainPageFrames/SaveDatabasePage.xaml.cs b/ModernKeePass/Views/MainPageFrames/SaveDatabasePage.xaml.cs index 116ae58..cdcec13 100644 --- a/ModernKeePass/Views/MainPageFrames/SaveDatabasePage.xaml.cs +++ b/ModernKeePass/Views/MainPageFrames/SaveDatabasePage.xaml.cs @@ -43,11 +43,17 @@ namespace ModernKeePass.Views }; savePicker.FileTypeChoices.Add("KeePass 2.x database", new List { ".kdbx" }); - var file = await savePicker.PickSaveFileAsync(); + var file = await savePicker.PickSaveFileAsync().AsTask(); if (file == null) return; await Model.Save(file); _mainFrame.Navigate(typeof(MainPage)); } + + private async void CloseButton_OnClick(object sender, RoutedEventArgs e) + { + await Model.Close(); + _mainFrame.Navigate(typeof(MainPage)); + } } } diff --git a/ModernKeePass/Views/UserControls/CompositeKeyUserControl.xaml.cs b/ModernKeePass/Views/UserControls/CompositeKeyUserControl.xaml.cs index a7c3baf..a66bb7d 100644 --- a/ModernKeePass/Views/UserControls/CompositeKeyUserControl.xaml.cs +++ b/ModernKeePass/Views/UserControls/CompositeKeyUserControl.xaml.cs @@ -77,7 +77,7 @@ namespace ModernKeePass.Views.UserControls public bool ShowComplexityIndicator => CreateNew || UpdateKey; - public CompositeKeyUserControl(): this(App.Services.GetService()) + public CompositeKeyUserControl(): this(App.Services.GetRequiredService()) { } public CompositeKeyUserControl(IMediator mediator)