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"> - - - - - - - - - - - - - - - - -