From 7dbf93fe7b0ba835d4d6b7f7c5ffad22fd96e112 Mon Sep 17 00:00:00 2001 From: BONNEVILLE Geoffroy Date: Fri, 23 Feb 2018 18:09:21 +0100 Subject: [PATCH] Changed most services to singletons Refactor the Database Service (no more enum, ...) Restored the Donate page with Paypal web page Added (but not working) MS App Center integration Corrected tests accordingly WIP AOP to detect database changes --- ModernKeePass/Aop/DatabaseChanged.cs | 14 ++++++ ModernKeePass/Aop/DatabaseChangedProxy.cs | 26 +++++++++++ ModernKeePass/App.xaml.cs | 18 ++++---- ModernKeePass/Common/MessageDialogHelper.cs | 4 +- .../{IDatabase.cs => IDatabaseService.cs} | 3 +- .../Interfaces/IProxyInvocationHandler.cs | 9 ++++ .../{IRecent.cs => IRecentService.cs} | 2 +- .../{IResource.cs => IResourceService.cs} | 2 +- .../{ISettings.cs => ISettingsService.cs} | 2 +- ModernKeePass/ModernKeePassApp.csproj | 25 ++++++++--- ModernKeePass/Services/DatabaseService.cs | 19 ++++---- ModernKeePass/Services/LicenseService.cs | 2 +- ModernKeePass/Services/RecentService.cs | 4 +- ModernKeePass/Services/ResourcesService.cs | 2 +- ModernKeePass/Services/SettingsService.cs | 4 +- .../Services/SingletonServiceBase.cs | 12 +++++ ModernKeePass/ViewModels/CompositeKeyVm.cs | 8 ++-- ModernKeePass/ViewModels/DonateVm.cs | 44 ------------------- ModernKeePass/ViewModels/EntryVm.cs | 11 +++-- ModernKeePass/ViewModels/GroupVm.cs | 22 +++++++--- .../ViewModels/Items/RecentItemVm.cs | 9 ++-- .../ViewModels/Items/SettingsDatabaseVm.cs | 8 ++-- .../ViewModels/Items/SettingsNewVm.cs | 6 +-- ModernKeePass/ViewModels/MainVm.cs | 11 +++-- ModernKeePass/ViewModels/OpenVm.cs | 13 +++--- ModernKeePass/ViewModels/RecentVm.cs | 6 +-- ModernKeePass/ViewModels/SaveVm.cs | 8 ++-- ModernKeePass/ViewModels/SettingsVm.cs | 5 +-- .../Views/MainPageFrames/DonatePage.xaml | 23 +--------- ModernKeePass/packages.config | 3 ++ .../Mock/DatabaseServiceMock.cs | 23 +++------- .../Mock/RecentServiceMock.cs | 2 +- .../Mock/ResourceServiceMock.cs | 2 +- .../Mock/SettingsServiceMock.cs | 2 +- ModernKeePassApp.Test/ViewModelsTests.cs | 39 +++++----------- 35 files changed, 199 insertions(+), 194 deletions(-) create mode 100644 ModernKeePass/Aop/DatabaseChanged.cs create mode 100644 ModernKeePass/Aop/DatabaseChangedProxy.cs rename ModernKeePass/Interfaces/{IDatabase.cs => IDatabaseService.cs} (92%) create mode 100644 ModernKeePass/Interfaces/IProxyInvocationHandler.cs rename ModernKeePass/Interfaces/{IRecent.cs => IRecentService.cs} (91%) rename ModernKeePass/Interfaces/{IResource.cs => IResourceService.cs} (72%) rename ModernKeePass/Interfaces/{ISettings.cs => ISettingsService.cs} (79%) create mode 100644 ModernKeePass/Services/SingletonServiceBase.cs delete mode 100644 ModernKeePass/ViewModels/DonateVm.cs diff --git a/ModernKeePass/Aop/DatabaseChanged.cs b/ModernKeePass/Aop/DatabaseChanged.cs new file mode 100644 index 0000000..dbc8e6b --- /dev/null +++ b/ModernKeePass/Aop/DatabaseChanged.cs @@ -0,0 +1,14 @@ +using System; +using ModernKeePass.Services; + +namespace ModernKeePass.Attributes +{ + [AttributeUsage(AttributeTargets.All)] + public class DatabaseChangedAttribute: Attribute + { + public DatabaseChangedAttribute() + { + DatabaseService.Instance.HasChanged = true; + } + } +} diff --git a/ModernKeePass/Aop/DatabaseChangedProxy.cs b/ModernKeePass/Aop/DatabaseChangedProxy.cs new file mode 100644 index 0000000..e47604a --- /dev/null +++ b/ModernKeePass/Aop/DatabaseChangedProxy.cs @@ -0,0 +1,26 @@ +using System.Reflection; +using ModernKeePass.Interfaces; + +namespace ModernKeePass.Aop +{ + public class DatabaseChangedProxy: IProxyInvocationHandler + { + private readonly T _decorated; + private readonly IDatabaseService _databaseService; + + public DatabaseChangedProxy(T decorated, IDatabaseService databaseService) + { + _decorated = decorated; + _databaseService = databaseService; + } + + public object Invoke(object proxy, MethodInfo method, object[] parameters) + { + object retVal = null; + retVal = method.Invoke(proxy, parameters); + _databaseService.HasChanged = true; + + return retVal; + } + } +} diff --git a/ModernKeePass/App.xaml.cs b/ModernKeePass/App.xaml.cs index 22cd1f3..e16261d 100644 --- a/ModernKeePass/App.xaml.cs +++ b/ModernKeePass/App.xaml.cs @@ -6,6 +6,9 @@ using Windows.Storage; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Navigation; +using Microsoft.AppCenter; +using Microsoft.AppCenter.Analytics; +using Microsoft.AppCenter.Push; using ModernKeePass.Common; using ModernKeePass.Exceptions; using ModernKeePass.Services; @@ -20,18 +23,16 @@ namespace ModernKeePass /// sealed partial class App { - public DatabaseService Database { get; private set; } - /// /// Initializes the singleton application object. This is the first line of authored code /// executed, and as such is the logical equivalent of main() or WinMain(). /// public App() { + AppCenter.Start("79d23520-a486-4f63-af81-8d90bf4e1bea", typeof(Analytics), typeof(Push)); InitializeComponent(); Suspending += OnSuspending; UnhandledException += OnUnhandledException; - Database = new DatabaseService(); } #region Event Handlers @@ -49,12 +50,12 @@ namespace ModernKeePass if (realException is SaveException) { unhandledExceptionEventArgs.Handled = true; - MessageDialogHelper.SaveErrorDialog(realException as SaveException, Database); + MessageDialogHelper.SaveErrorDialog(realException as SaveException, DatabaseService.Instance); } else if (realException is DatabaseOpenedException) { unhandledExceptionEventArgs.Handled = true; - MessageDialogHelper.SaveUnchangedDialog(realException as DatabaseOpenedException, Database); + MessageDialogHelper.SaveUnchangedDialog(realException as DatabaseOpenedException, DatabaseService.Instance); } } @@ -153,8 +154,9 @@ namespace ModernKeePass { var deferral = e.SuspendingOperation.GetDeferral(); UnhandledException -= OnUnhandledException; - Database.Save(); - await Database.Close(); + var database = DatabaseService.Instance; + database.Save(); + await database.Close(); deferral.Complete(); } @@ -166,7 +168,7 @@ namespace ModernKeePass { base.OnFileActivated(args); var rootFrame = new Frame(); - Database.DatabaseFile = args.Files[0] as StorageFile; + DatabaseService.Instance.DatabaseFile = args.Files[0] as StorageFile; rootFrame.Navigate(typeof(MainPage), args); Window.Current.Content = rootFrame; Window.Current.Activate(); diff --git a/ModernKeePass/Common/MessageDialogHelper.cs b/ModernKeePass/Common/MessageDialogHelper.cs index 956e676..f530c76 100644 --- a/ModernKeePass/Common/MessageDialogHelper.cs +++ b/ModernKeePass/Common/MessageDialogHelper.cs @@ -22,7 +22,7 @@ namespace ModernKeePass.Common await messageDialog.ShowAsync(); } - public static void SaveErrorDialog(SaveException exception, IDatabase database) + public static void SaveErrorDialog(SaveException exception, IDatabaseService database) { ShowActionDialog("Save error", exception.InnerException.Message, "Save as", "Discard", async command => { @@ -38,7 +38,7 @@ namespace ModernKeePass.Common }, null); } - public static void SaveUnchangedDialog(DatabaseOpenedException exception, IDatabase database) + public static void SaveUnchangedDialog(DatabaseOpenedException exception, IDatabaseService database) { ShowActionDialog("Opened database", $"Database {database.Name} is currently opened. What to you wish to do?", "Save changes", "Discard", command => { diff --git a/ModernKeePass/Interfaces/IDatabase.cs b/ModernKeePass/Interfaces/IDatabaseService.cs similarity index 92% rename from ModernKeePass/Interfaces/IDatabase.cs rename to ModernKeePass/Interfaces/IDatabaseService.cs index d3c3712..5b9a16c 100644 --- a/ModernKeePass/Interfaces/IDatabase.cs +++ b/ModernKeePass/Interfaces/IDatabaseService.cs @@ -7,7 +7,7 @@ using ModernKeePassLib.Keys; namespace ModernKeePass.Interfaces { - public interface IDatabase + public interface IDatabaseService { string Name { get; } bool RecycleBinEnabled { get; set; } @@ -21,6 +21,7 @@ namespace ModernKeePass.Interfaces bool IsOpen { get; } bool IsFileOpen { get; } bool IsClosed { get; } + bool HasChanged { get; set; } Task Open(CompositeKey key, bool createNew); void UpdateCompositeKey(CompositeKey key); diff --git a/ModernKeePass/Interfaces/IProxyInvocationHandler.cs b/ModernKeePass/Interfaces/IProxyInvocationHandler.cs new file mode 100644 index 0000000..5781e23 --- /dev/null +++ b/ModernKeePass/Interfaces/IProxyInvocationHandler.cs @@ -0,0 +1,9 @@ +using System.Reflection; + +namespace ModernKeePass.Interfaces +{ + public interface IProxyInvocationHandler + { + object Invoke(object proxy, MethodInfo method, object[] parameters); + } +} \ No newline at end of file diff --git a/ModernKeePass/Interfaces/IRecent.cs b/ModernKeePass/Interfaces/IRecentService.cs similarity index 91% rename from ModernKeePass/Interfaces/IRecent.cs rename to ModernKeePass/Interfaces/IRecentService.cs index 59b8b50..5f66aa5 100644 --- a/ModernKeePass/Interfaces/IRecent.cs +++ b/ModernKeePass/Interfaces/IRecentService.cs @@ -4,7 +4,7 @@ using Windows.Storage; namespace ModernKeePass.Interfaces { - public interface IRecent + public interface IRecentService { int EntryCount { get; } Task GetFileAsync(string token); diff --git a/ModernKeePass/Interfaces/IResource.cs b/ModernKeePass/Interfaces/IResourceService.cs similarity index 72% rename from ModernKeePass/Interfaces/IResource.cs rename to ModernKeePass/Interfaces/IResourceService.cs index 836b449..72a35c4 100644 --- a/ModernKeePass/Interfaces/IResource.cs +++ b/ModernKeePass/Interfaces/IResourceService.cs @@ -1,6 +1,6 @@ namespace ModernKeePass.Interfaces { - public interface IResource + public interface IResourceService { string GetResourceValue(string key); } diff --git a/ModernKeePass/Interfaces/ISettings.cs b/ModernKeePass/Interfaces/ISettingsService.cs similarity index 79% rename from ModernKeePass/Interfaces/ISettings.cs rename to ModernKeePass/Interfaces/ISettingsService.cs index 18d1550..e5411a9 100644 --- a/ModernKeePass/Interfaces/ISettings.cs +++ b/ModernKeePass/Interfaces/ISettingsService.cs @@ -1,6 +1,6 @@ namespace ModernKeePass.Interfaces { - public interface ISettings + public interface ISettingsService { T GetSetting(string property); void PutSetting(string property, T value); diff --git a/ModernKeePass/ModernKeePassApp.csproj b/ModernKeePass/ModernKeePassApp.csproj index 99e8df4..9b113f2 100644 --- a/ModernKeePass/ModernKeePassApp.csproj +++ b/ModernKeePass/ModernKeePassApp.csproj @@ -111,21 +111,24 @@ + App.xaml + - + + - + + - DonatePage.xaml - + @@ -142,7 +145,7 @@ - + @@ -337,6 +340,18 @@ ..\packages\Portable.BouncyCastle.1.8.1.3\lib\netstandard1.0\BouncyCastle.Crypto.dll True + + ..\packages\Microsoft.AppCenter.1.4.0\lib\portable-net45+win8+wpa81+wp8\Microsoft.AppCenter.dll + True + + + ..\packages\Microsoft.AppCenter.Analytics.1.4.0\lib\portable-net45+win8+wpa81+wp8\Microsoft.AppCenter.Analytics.dll + True + + + ..\packages\Microsoft.AppCenter.Push.1.4.0\lib\portable-net45+win8+wpa81+wp8\Microsoft.AppCenter.Push.dll + True + ..\packages\Microsoft.Toolkit.Uwp.Notifications.2.0.0\lib\dotnet\Microsoft.Toolkit.Uwp.Notifications.dll True diff --git a/ModernKeePass/Services/DatabaseService.cs b/ModernKeePass/Services/DatabaseService.cs index 8c44fd2..e12b0f4 100644 --- a/ModernKeePass/Services/DatabaseService.cs +++ b/ModernKeePass/Services/DatabaseService.cs @@ -15,10 +15,10 @@ using ModernKeePassLib.Serialization; namespace ModernKeePass.Services { - public class DatabaseService: IDatabase + public class DatabaseService: SingletonServiceBase, IDatabaseService { private readonly PwDatabase _pwDatabase = new PwDatabase(); - private readonly ISettings _settings; + private readonly ISettingsService _settings; private StorageFile _realDatabaseFile; private StorageFile _databaseFile; private GroupVm _recycleBin; @@ -48,7 +48,7 @@ namespace ModernKeePass.Services get { return _databaseFile; } set { - if (IsOpen) + if (IsOpen && HasChanged) { throw new DatabaseOpenedException(); } @@ -77,15 +77,18 @@ namespace ModernKeePass.Services public bool IsOpen => _pwDatabase.IsOpen; public bool IsFileOpen => !_pwDatabase.IsOpen && _databaseFile != null; public bool IsClosed => _databaseFile == null; + public bool HasChanged { get; set; } + + public DatabaseService() : this(SettingsService.Instance) + { + } - public DatabaseService() : this(new SettingsService()) - { } - - public DatabaseService(ISettings settings) + public DatabaseService(ISettingsService settings) { _settings = settings; } + /// /// Open a KeePass database /// @@ -118,7 +121,7 @@ namespace ModernKeePass.Services } else _pwDatabase.Open(ioConnection, key, new NullStatusLogger()); - if (!_pwDatabase.IsOpen) return; + //if (!_pwDatabase.IsOpen) return; // Copy database in temp directory and use this file for operations if (_settings.GetSetting("AntiCorruption")) diff --git a/ModernKeePass/Services/LicenseService.cs b/ModernKeePass/Services/LicenseService.cs index 833a729..f81f60d 100644 --- a/ModernKeePass/Services/LicenseService.cs +++ b/ModernKeePass/Services/LicenseService.cs @@ -6,7 +6,7 @@ using ModernKeePass.Interfaces; namespace ModernKeePass.Services { - public class LicenseService : ILicenseService + public class LicenseService : SingletonServiceBase, ILicenseService { public enum PurchaseResult { diff --git a/ModernKeePass/Services/RecentService.cs b/ModernKeePass/Services/RecentService.cs index fa8625d..b5155b4 100644 --- a/ModernKeePass/Services/RecentService.cs +++ b/ModernKeePass/Services/RecentService.cs @@ -8,10 +8,10 @@ using ModernKeePass.ViewModels; namespace ModernKeePass.Services { - public class RecentService : IRecent + public class RecentService : SingletonServiceBase, IRecentService { private readonly StorageItemMostRecentlyUsedList _mru = StorageApplicationPermissions.MostRecentlyUsedList; - + public int EntryCount => _mru.Entries.Count; public ObservableCollection GetAllFiles(bool removeIfNonExistant = true) diff --git a/ModernKeePass/Services/ResourcesService.cs b/ModernKeePass/Services/ResourcesService.cs index f5db911..3630fc4 100644 --- a/ModernKeePass/Services/ResourcesService.cs +++ b/ModernKeePass/Services/ResourcesService.cs @@ -3,7 +3,7 @@ using ModernKeePass.Interfaces; namespace ModernKeePass.Services { - public class ResourcesService: IResource + public class ResourcesService: IResourceService { private const string ResourceFileName = "CodeBehind"; private readonly ResourceLoader _resourceLoader = ResourceLoader.GetForCurrentView(); diff --git a/ModernKeePass/Services/SettingsService.cs b/ModernKeePass/Services/SettingsService.cs index 59ad226..d13c9d8 100644 --- a/ModernKeePass/Services/SettingsService.cs +++ b/ModernKeePass/Services/SettingsService.cs @@ -5,10 +5,10 @@ using ModernKeePass.Interfaces; namespace ModernKeePass.Services { - public class SettingsService : ISettings + public class SettingsService : SingletonServiceBase, ISettingsService { private readonly IPropertySet _values = ApplicationData.Current.LocalSettings.Values; - + public T GetSetting(string property) { try diff --git a/ModernKeePass/Services/SingletonServiceBase.cs b/ModernKeePass/Services/SingletonServiceBase.cs new file mode 100644 index 0000000..21e8758 --- /dev/null +++ b/ModernKeePass/Services/SingletonServiceBase.cs @@ -0,0 +1,12 @@ +using System; + +namespace ModernKeePass.Services +{ + public abstract class SingletonServiceBase where T : new() + { + private static readonly Lazy LazyInstance = + new Lazy(() => new T()); + + public static T Instance => LazyInstance.Value; + } +} diff --git a/ModernKeePass/ViewModels/CompositeKeyVm.cs b/ModernKeePass/ViewModels/CompositeKeyVm.cs index 94e6be0..e9f442f 100644 --- a/ModernKeePass/ViewModels/CompositeKeyVm.cs +++ b/ModernKeePass/ViewModels/CompositeKeyVm.cs @@ -22,7 +22,7 @@ namespace ModernKeePass.ViewModels Success = 5 } - public IDatabase Database { get; set; } + public IDatabaseService Database { get; set; } public bool HasPassword { @@ -111,11 +111,11 @@ namespace ModernKeePass.ViewModels private StatusTypes _statusType; private StorageFile _keyFile; private string _keyFileText; - private readonly IResource _resource; + private readonly IResourceService _resource; - public CompositeKeyVm() : this((Application.Current as App)?.Database, new ResourcesService()) { } + public CompositeKeyVm() : this(DatabaseService.Instance, new ResourcesService()) { } - public CompositeKeyVm(IDatabase database, IResource resource) + public CompositeKeyVm(IDatabaseService database, IResourceService resource) { _resource = resource; _keyFileText = _resource.GetResourceValue("CompositeKeyDefaultKeyFile"); diff --git a/ModernKeePass/ViewModels/DonateVm.cs b/ModernKeePass/ViewModels/DonateVm.cs deleted file mode 100644 index 78d6e60..0000000 --- a/ModernKeePass/ViewModels/DonateVm.cs +++ /dev/null @@ -1,44 +0,0 @@ -using System; -using System.Collections.ObjectModel; -using System.Globalization; -using System.Linq; -using System.Threading.Tasks; -using Windows.ApplicationModel.Store; -using ModernKeePass.Common; -using ModernKeePass.Interfaces; -using ModernKeePass.Services; - -namespace ModernKeePass.ViewModels -{ - public class DonateVm: NotifyPropertyChangedBase - { - public ObservableCollection Donations { get; } - - public ProductListing SelectedItem - { - get { return _selectedItem; } - set { SetProperty(ref _selectedItem, value); } - } - - private readonly ILicenseService _license; - private ProductListing _selectedItem; - - public DonateVm() : this (new LicenseService()) { } - - public DonateVm(ILicenseService license) - { - // TODO: find a nice way to order products - _license = license; - Donations = new ObservableCollection( - _license.Products.Values - /*.OrderBy(p => decimal.Parse(p.FormattedPrice.Replace('\u00A0', ' '), NumberStyles.Currency, - CultureInfo.CurrentCulture.NumberFormat))*/ - ); - } - - public async Task Purchase() - { - return await _license.Purchase(SelectedItem.ProductId); - } - } -} diff --git a/ModernKeePass/ViewModels/EntryVm.cs b/ModernKeePass/ViewModels/EntryVm.cs index 6a59abb..722c00b 100644 --- a/ModernKeePass/ViewModels/EntryVm.cs +++ b/ModernKeePass/ViewModels/EntryVm.cs @@ -1,10 +1,11 @@ using System; using System.ComponentModel; using System.Text; -using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; +using ModernKeePass.Attributes; using ModernKeePass.Interfaces; using ModernKeePass.Mappings; +using ModernKeePass.Services; using ModernKeePassLib; using ModernKeePassLib.Cryptography.PasswordGenerator; using ModernKeePassLib.Security; @@ -67,6 +68,7 @@ namespace ModernKeePass.ViewModels NotifyPropertyChanged("PasswordComplexityIndicator"); } } + public string Url { get { return GetEntryValue(PwDefs.UrlField); } @@ -155,7 +157,7 @@ namespace ModernKeePass.ViewModels public event PropertyChangedEventHandler PropertyChanged; private readonly PwEntry _pwEntry; - private readonly IDatabase _database; + private readonly IDatabaseService _database; private bool _isEditMode; private bool _isRevealPassword; private double _passwordLength = 25; @@ -168,9 +170,9 @@ namespace ModernKeePass.ViewModels public EntryVm() { } - internal EntryVm(PwEntry entry, GroupVm parent) : this(entry, parent, (Application.Current as App)?.Database) { } + internal EntryVm(PwEntry entry, GroupVm parent) : this(entry, parent, DatabaseService.Instance) { } - public EntryVm(PwEntry entry, GroupVm parent, IDatabase database) + public EntryVm(PwEntry entry, GroupVm parent, IDatabaseService database) { _database = database; _pwEntry = entry; @@ -211,6 +213,7 @@ namespace ModernKeePass.ViewModels return _pwEntry?.Strings.GetSafe(key).ReadString(); } + [DatabaseChanged] private void SetEntryValue(string key, string newValue) { _pwEntry?.Strings.Set(key, new ProtectedString(true, newValue)); diff --git a/ModernKeePass/ViewModels/GroupVm.cs b/ModernKeePass/ViewModels/GroupVm.cs index 4ecc268..b4c6f45 100644 --- a/ModernKeePass/ViewModels/GroupVm.cs +++ b/ModernKeePass/ViewModels/GroupVm.cs @@ -3,11 +3,12 @@ using System.Collections.ObjectModel; using System.Collections.Specialized; using System.Linq; using System.Text; -using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; +using ModernKeePass.Attributes; using ModernKeePass.Common; using ModernKeePass.Interfaces; using ModernKeePass.Mappings; +using ModernKeePass.Services; using ModernKeePassLib; namespace ModernKeePass.ViewModels @@ -54,6 +55,7 @@ namespace ModernKeePass.ViewModels public string Name { get { return _pwGroup == null ? string.Empty : _pwGroup.Name; } + [DatabaseChanged] set { _pwGroup.Name = value; } } @@ -92,7 +94,7 @@ namespace ModernKeePass.ViewModels } private readonly PwGroup _pwGroup; - private readonly IDatabase _database; + private readonly IDatabaseService _database; private bool _isEditMode; private PwEntry _reorderedEntry; private ObservableCollection _entries = new ObservableCollection(); @@ -101,10 +103,10 @@ namespace ModernKeePass.ViewModels public GroupVm() {} internal GroupVm(PwGroup pwGroup, GroupVm parent, PwUuid recycleBinId = null) : this(pwGroup, parent, - (Application.Current as App)?.Database, recycleBinId) + DatabaseService.Instance, recycleBinId) { } - public GroupVm(PwGroup pwGroup, GroupVm parent, IDatabase database, PwUuid recycleBinId = null) + public GroupVm(PwGroup pwGroup, GroupVm parent, IDatabaseService database, PwUuid recycleBinId = null) { _pwGroup = pwGroup; _database = database; @@ -115,7 +117,8 @@ namespace ModernKeePass.ViewModels Entries.CollectionChanged += Entries_CollectionChanged; Groups = new ObservableCollection(pwGroup.Groups.Select(g => new GroupVm(g, this, recycleBinId))); } - + + [DatabaseChanged] private void Entries_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) { switch (e.Action) @@ -131,7 +134,8 @@ namespace ModernKeePass.ViewModels break; } } - + + [DatabaseChanged] public GroupVm AddNewGroup(string name = "") { var pwGroup = new PwGroup(true, true, name, PwIcon.Folder); @@ -162,6 +166,8 @@ namespace ModernKeePass.ViewModels Move(PreviousGroup); } + + [DatabaseChanged] public void Move(GroupVm destination) { PreviousGroup = ParentGroup; @@ -189,6 +195,8 @@ namespace ModernKeePass.ViewModels _database.Save(); } + + [DatabaseChanged] public void SortEntries() { var comparer = new PwEntryComparer(PwDefs.TitleField, true, false); @@ -203,6 +211,8 @@ namespace ModernKeePass.ViewModels } } + + [DatabaseChanged] public void SortGroups() { try diff --git a/ModernKeePass/ViewModels/Items/RecentItemVm.cs b/ModernKeePass/ViewModels/Items/RecentItemVm.cs index 202f653..52ebff2 100644 --- a/ModernKeePass/ViewModels/Items/RecentItemVm.cs +++ b/ModernKeePass/ViewModels/Items/RecentItemVm.cs @@ -1,6 +1,5 @@ using Windows.Storage; using ModernKeePass.Common; -using Windows.UI.Xaml; using ModernKeePass.Interfaces; using ModernKeePass.Services; @@ -31,20 +30,20 @@ namespace ModernKeePass.ViewModels public void OpenDatabaseFile() { - OpenDatabaseFile((Application.Current as App)?.Database); + OpenDatabaseFile(DatabaseService.Instance); } - public void OpenDatabaseFile(IDatabase database) + public void OpenDatabaseFile(IDatabaseService database) { database.DatabaseFile = DatabaseFile; } public void UpdateAccessTime() { - UpdateAccessTime(new RecentService()); + UpdateAccessTime(RecentService.Instance); } - public async void UpdateAccessTime(IRecent recent) + public async void UpdateAccessTime(IRecentService recent) { await recent.GetFileAsync(Token); } diff --git a/ModernKeePass/ViewModels/Items/SettingsDatabaseVm.cs b/ModernKeePass/ViewModels/Items/SettingsDatabaseVm.cs index c3efdbd..75da833 100644 --- a/ModernKeePass/ViewModels/Items/SettingsDatabaseVm.cs +++ b/ModernKeePass/ViewModels/Items/SettingsDatabaseVm.cs @@ -2,9 +2,9 @@ using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; -using Windows.UI.Xaml; using ModernKeePass.Common; using ModernKeePass.Interfaces; +using ModernKeePass.Services; using ModernKeePassLib; using ModernKeePassLib.Cryptography.Cipher; using ModernKeePassLib.Cryptography.KeyDerivation; @@ -14,7 +14,7 @@ namespace ModernKeePass.ViewModels // TODO: implement Kdf settings public class SettingsDatabaseVm: NotifyPropertyChangedBase, IHasSelectableObject { - private readonly IDatabase _database; + private readonly IDatabaseService _database; private GroupVm _selectedItem; public bool HasRecycleBin @@ -88,9 +88,9 @@ namespace ModernKeePass.ViewModels } } - public SettingsDatabaseVm() : this((Application.Current as App)?.Database) { } + public SettingsDatabaseVm() : this(DatabaseService.Instance) { } - public SettingsDatabaseVm(IDatabase database) + public SettingsDatabaseVm(IDatabaseService database) { _database = database; Groups = _database?.RootGroup.Groups; diff --git a/ModernKeePass/ViewModels/Items/SettingsNewVm.cs b/ModernKeePass/ViewModels/Items/SettingsNewVm.cs index 033ea22..54dc044 100644 --- a/ModernKeePass/ViewModels/Items/SettingsNewVm.cs +++ b/ModernKeePass/ViewModels/Items/SettingsNewVm.cs @@ -6,12 +6,12 @@ namespace ModernKeePass.ViewModels { public class SettingsNewVm { - private ISettings _settings; + private ISettingsService _settings; - public SettingsNewVm() : this(new SettingsService()) + public SettingsNewVm() : this(SettingsService.Instance) { } - public SettingsNewVm(ISettings settings) + public SettingsNewVm(ISettingsService settings) { _settings = settings; } diff --git a/ModernKeePass/ViewModels/MainVm.cs b/ModernKeePass/ViewModels/MainVm.cs index 3659743..8fffd94 100644 --- a/ModernKeePass/ViewModels/MainVm.cs +++ b/ModernKeePass/ViewModels/MainVm.cs @@ -1,7 +1,6 @@ using System.Collections.ObjectModel; using System.Linq; using Windows.ApplicationModel; -using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; using ModernKeePass.Common; using ModernKeePass.Interfaces; @@ -46,10 +45,10 @@ namespace ModernKeePass.ViewModels public MainVm() {} internal MainVm(Frame referenceFrame, Frame destinationFrame) : this(referenceFrame, destinationFrame, - (Application.Current as App)?.Database, new ResourcesService(), new RecentService()) + DatabaseService.Instance, new ResourcesService(), RecentService.Instance) { } - public MainVm(Frame referenceFrame, Frame destinationFrame, IDatabase database, IResource resource, IRecent recent) + public MainVm(Frame referenceFrame, Frame destinationFrame, IDatabaseService database, IResourceService resource, IRecentService recent) { var isDatabaseOpen = database != null && database.IsOpen; @@ -62,7 +61,7 @@ namespace ModernKeePass.ViewModels Destination = destinationFrame, Parameter = referenceFrame, SymbolIcon = Symbol.Page2, - IsSelected = database != null && database.IsFileOpen + IsSelected = database != null && database.IsFileOpen && !database.IsOpen }, new MainMenuItemVm { @@ -107,14 +106,14 @@ namespace ModernKeePass.ViewModels PageType = typeof(AboutPage), Destination = destinationFrame, SymbolIcon = Symbol.Help - }/*, + }, new MainMenuItemVm { Title = resource.GetResourceValue("MainMenuItemDonate"), PageType = typeof(DonatePage), Destination = destinationFrame, SymbolIcon = Symbol.Shop - }*/ + } }; // Auto-select the Recent Items menu item if the conditions are met SelectedItem = mainMenuItems.FirstOrDefault(m => m.IsSelected); diff --git a/ModernKeePass/ViewModels/OpenVm.cs b/ModernKeePass/ViewModels/OpenVm.cs index b8241f0..0559587 100644 --- a/ModernKeePass/ViewModels/OpenVm.cs +++ b/ModernKeePass/ViewModels/OpenVm.cs @@ -1,5 +1,4 @@ using Windows.Storage; -using Windows.UI.Xaml; using ModernKeePass.Common; using ModernKeePass.Interfaces; using ModernKeePass.Services; @@ -12,11 +11,11 @@ namespace ModernKeePass.ViewModels public string Name => _database?.Name; - private readonly IDatabase _database; + private readonly IDatabaseService _database; - public OpenVm() : this((Application.Current as App)?.Database) { } + public OpenVm() : this(DatabaseService.Instance) { } - public OpenVm(IDatabase database) + public OpenVm(IDatabaseService database) { _database = database; if (database == null || !database.IsFileOpen) return; @@ -25,10 +24,10 @@ namespace ModernKeePass.ViewModels public void OpenFile(StorageFile file) { - OpenFile(file, new RecentService()); + OpenFile(file, RecentService.Instance); } - public void OpenFile(StorageFile file, IRecent recent) + public void OpenFile(StorageFile file, IRecentService recent) { _database.DatabaseFile = file; OnPropertyChanged("Name"); @@ -36,7 +35,7 @@ namespace ModernKeePass.ViewModels AddToRecentList(file, recent); } - private void AddToRecentList(StorageFile file, IRecent recent) + private void AddToRecentList(StorageFile file, IRecentService recent) { recent.Add(file, file.DisplayName); } diff --git a/ModernKeePass/ViewModels/RecentVm.cs b/ModernKeePass/ViewModels/RecentVm.cs index 338f4e0..404ab5a 100644 --- a/ModernKeePass/ViewModels/RecentVm.cs +++ b/ModernKeePass/ViewModels/RecentVm.cs @@ -7,7 +7,7 @@ namespace ModernKeePass.ViewModels { public class RecentVm : NotifyPropertyChangedBase, IHasSelectableObject { - private readonly IRecent _recent; + private readonly IRecentService _recent; private ISelectableModel _selectedItem; private ObservableCollection _recentItems = new ObservableCollection(); @@ -35,10 +35,10 @@ namespace ModernKeePass.ViewModels } } - public RecentVm() : this (new RecentService()) + public RecentVm() : this (RecentService.Instance) { } - public RecentVm(IRecent recent) + public RecentVm(IRecentService recent) { _recent = recent; RecentItems = _recent.GetAllFiles(); diff --git a/ModernKeePass/ViewModels/SaveVm.cs b/ModernKeePass/ViewModels/SaveVm.cs index ae95b27..4531317 100644 --- a/ModernKeePass/ViewModels/SaveVm.cs +++ b/ModernKeePass/ViewModels/SaveVm.cs @@ -1,16 +1,16 @@ using System.Threading.Tasks; using Windows.Storage; -using Windows.UI.Xaml; using ModernKeePass.Interfaces; +using ModernKeePass.Services; namespace ModernKeePass.ViewModels { public class SaveVm { - private readonly IDatabase _database; - public SaveVm() : this((Application.Current as App)?.Database) { } + private readonly IDatabaseService _database; + public SaveVm() : this(DatabaseService.Instance) { } - public SaveVm(IDatabase database) + public SaveVm(IDatabaseService database) { _database = database; } diff --git a/ModernKeePass/ViewModels/SettingsVm.cs b/ModernKeePass/ViewModels/SettingsVm.cs index 72919ea..9bbf52a 100644 --- a/ModernKeePass/ViewModels/SettingsVm.cs +++ b/ModernKeePass/ViewModels/SettingsVm.cs @@ -1,6 +1,5 @@ using System.Collections.ObjectModel; using System.Linq; -using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; using ModernKeePass.Common; using ModernKeePass.Interfaces; @@ -41,9 +40,9 @@ namespace ModernKeePass.ViewModels } } - public SettingsVm() : this((Application.Current as App)?.Database, new ResourcesService()) { } + public SettingsVm() : this(DatabaseService.Instance, new ResourcesService()) { } - public SettingsVm(IDatabase database, IResource resource) + public SettingsVm(IDatabaseService database, IResourceService resource) { var menuItems = new ObservableCollection { diff --git a/ModernKeePass/Views/MainPageFrames/DonatePage.xaml b/ModernKeePass/Views/MainPageFrames/DonatePage.xaml index e124884..cb8000c 100644 --- a/ModernKeePass/Views/MainPageFrames/DonatePage.xaml +++ b/ModernKeePass/Views/MainPageFrames/DonatePage.xaml @@ -4,27 +4,6 @@ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" - xmlns:viewModels="using:ModernKeePass.ViewModels" - xmlns:converters="using:ModernKeePass.Converters" mc:Ignorable="d"> - - - - - - - - - - - - - - - - -