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)