From 01736ca685e5dce3ca0f2b5b0d768f34be6052fc Mon Sep 17 00:00:00 2001 From: Kyle Spearrin Date: Fri, 28 Apr 2017 11:07:26 -0400 Subject: [PATCH] Lock Screen Fixes - Move settings to AppSettingsService - Update activity on page disappaearing - Always check if app is currently locked before updating last activity date --- src/Android/MainActivity.cs | 3 +- src/Android/MainApplication.cs | 1 + .../Services/IAppSettingsService.cs | 10 +++++ src/App/Abstractions/Services/ILockService.cs | 2 + src/App/App.cs | 9 ++-- src/App/App.csproj | 2 + src/App/Controls/ExtendedContentPage.cs | 14 +++---- src/App/Pages/Lock/LockFingerprintPage.cs | 5 ++- .../Pages/Settings/SettingsEditFolderPage.cs | 1 - src/App/Services/AppSettingsService.cs | 41 +++++++++++++++++++ src/App/Services/LockService.cs | 18 ++++++-- src/iOS.Extension/LoadingViewController.cs | 9 ++-- src/iOS/AppDelegate.cs | 10 +++-- 13 files changed, 102 insertions(+), 23 deletions(-) create mode 100644 src/App/Abstractions/Services/IAppSettingsService.cs create mode 100644 src/App/Services/AppSettingsService.cs diff --git a/src/Android/MainActivity.cs b/src/Android/MainActivity.cs index 835ad8d67..6d34d039c 100644 --- a/src/Android/MainActivity.cs +++ b/src/Android/MainActivity.cs @@ -73,7 +73,8 @@ namespace Bit.Android Resolver.Resolve(), Resolver.Resolve(), Resolver.Resolve(), - Resolver.Resolve())); + Resolver.Resolve(), + Resolver.Resolve())); MessagingCenter.Subscribe(Xamarin.Forms.Application.Current, "RateApp", (sender) => { diff --git a/src/Android/MainApplication.cs b/src/Android/MainApplication.cs index 792925f1b..c95bbb701 100644 --- a/src/Android/MainApplication.cs +++ b/src/Android/MainApplication.cs @@ -211,6 +211,7 @@ namespace Bit.Android .RegisterType(new ContainerControlledLifetimeManager()) .RegisterType(new ContainerControlledLifetimeManager()) .RegisterType(new ContainerControlledLifetimeManager()) + .RegisterType(new ContainerControlledLifetimeManager()) // Repositories .RegisterType(new ContainerControlledLifetimeManager()) .RegisterType(new ContainerControlledLifetimeManager()) diff --git a/src/App/Abstractions/Services/IAppSettingsService.cs b/src/App/Abstractions/Services/IAppSettingsService.cs new file mode 100644 index 000000000..51ba598fa --- /dev/null +++ b/src/App/Abstractions/Services/IAppSettingsService.cs @@ -0,0 +1,10 @@ +using System; + +namespace Bit.App.Abstractions +{ + public interface IAppSettingsService + { + bool Locked { get; set; } + DateTime LastActivity { get; set; } + } +} \ No newline at end of file diff --git a/src/App/Abstractions/Services/ILockService.cs b/src/App/Abstractions/Services/ILockService.cs index 5efa7ee32..540d29d01 100644 --- a/src/App/Abstractions/Services/ILockService.cs +++ b/src/App/Abstractions/Services/ILockService.cs @@ -1,9 +1,11 @@ using Bit.App.Enums; +using System; namespace Bit.App.Abstractions { public interface ILockService { + void UpdateLastActivity(DateTime? activityDate = null); LockType GetLockType(bool forceLock); } } \ No newline at end of file diff --git a/src/App/App.cs b/src/App/App.cs index cfd7c210c..793e16796 100644 --- a/src/App/App.cs +++ b/src/App/App.cs @@ -33,6 +33,7 @@ namespace Bit.App private readonly IGoogleAnalyticsService _googleAnalyticsService; private readonly ILocalizeService _localizeService; private readonly IAppInfoService _appInfoService; + private readonly IAppSettingsService _appSettingsService; public App( string uri, @@ -46,7 +47,8 @@ namespace Bit.App ILockService lockService, IGoogleAnalyticsService googleAnalyticsService, ILocalizeService localizeService, - IAppInfoService appInfoService) + IAppInfoService appInfoService, + IAppSettingsService appSettingsService) { _uri = uri; _databaseService = databaseService; @@ -60,6 +62,7 @@ namespace Bit.App _googleAnalyticsService = googleAnalyticsService; _localizeService = localizeService; _appInfoService = appInfoService; + _appSettingsService = appSettingsService; SetCulture(); SetStyles(); @@ -123,7 +126,7 @@ namespace Bit.App if(Device.OS == TargetPlatform.Android && !TopPageIsLock()) { - _settings.AddOrUpdateValue(Constants.LastActivityDate, DateTime.UtcNow); + _lockService.UpdateLastActivity(); } } @@ -248,7 +251,7 @@ namespace Bit.App return; } - _settings.AddOrUpdateValue(Constants.Locked, true); + _appSettingsService.Locked = true; switch(lockType) { case Enums.LockType.Fingerprint: diff --git a/src/App/App.csproj b/src/App/App.csproj index 9d98489e3..e907e9386 100644 --- a/src/App/App.csproj +++ b/src/App/App.csproj @@ -39,6 +39,7 @@ + @@ -203,6 +204,7 @@ True AppResources.zh-Hans.resx + diff --git a/src/App/Controls/ExtendedContentPage.cs b/src/App/Controls/ExtendedContentPage.cs index bf5b8d1d5..8a5b4b4b8 100644 --- a/src/App/Controls/ExtendedContentPage.cs +++ b/src/App/Controls/ExtendedContentPage.cs @@ -10,7 +10,7 @@ namespace Bit.App.Controls { private ISyncService _syncService; private IGoogleAnalyticsService _googleAnalyticsService; - private ISettings _settings; + private ILockService _lockService; private bool _syncIndicator; private bool _updateActivity; @@ -20,7 +20,7 @@ namespace Bit.App.Controls _updateActivity = updateActivity; _syncService = Resolver.Resolve(); _googleAnalyticsService = Resolver.Resolve(); - _settings = Resolver.Resolve(); + _lockService = Resolver.Resolve(); BackgroundColor = Color.FromHex("efeff4"); @@ -45,11 +45,6 @@ namespace Bit.App.Controls IsBusy = _syncService.SyncInProgress; } - if(_updateActivity) - { - _settings.AddOrUpdateValue(Constants.LastActivityDate, DateTime.UtcNow); - } - _googleAnalyticsService.TrackPage(GetType().Name); base.OnAppearing(); } @@ -61,6 +56,11 @@ namespace Bit.App.Controls IsBusy = false; } + if(_updateActivity) + { + _lockService.UpdateLastActivity(); + } + base.OnDisappearing(); } } diff --git a/src/App/Pages/Lock/LockFingerprintPage.cs b/src/App/Pages/Lock/LockFingerprintPage.cs index 6fa13647d..955b3f9e8 100644 --- a/src/App/Pages/Lock/LockFingerprintPage.cs +++ b/src/App/Pages/Lock/LockFingerprintPage.cs @@ -6,6 +6,7 @@ using Xamarin.Forms; using XLabs.Ioc; using Plugin.Fingerprint.Abstractions; using Plugin.Settings.Abstractions; +using Bit.App.Abstractions; namespace Bit.App.Pages { @@ -13,6 +14,7 @@ namespace Bit.App.Pages { private readonly IFingerprint _fingerprint; private readonly ISettings _settings; + private readonly IAppSettingsService _appSettings; private readonly bool _checkFingerprintImmediately; public LockFingerprintPage(bool checkFingerprintImmediately) @@ -20,6 +22,7 @@ namespace Bit.App.Pages _checkFingerprintImmediately = checkFingerprintImmediately; _fingerprint = Resolver.Resolve(); _settings = Resolver.Resolve(); + _appSettings = Resolver.Resolve(); Init(); } @@ -79,7 +82,7 @@ namespace Bit.App.Pages var result = await _fingerprint.AuthenticateAsync(AppResources.FingerprintDirection); if(result.Authenticated) { - _settings.AddOrUpdateValue(Constants.Locked, false); + _appSettings.Locked = false; await Navigation.PopModalAsync(); } else if(result.Status == FingerprintAuthenticationResultStatus.FallbackRequested) diff --git a/src/App/Pages/Settings/SettingsEditFolderPage.cs b/src/App/Pages/Settings/SettingsEditFolderPage.cs index df915e611..c23644999 100644 --- a/src/App/Pages/Settings/SettingsEditFolderPage.cs +++ b/src/App/Pages/Settings/SettingsEditFolderPage.cs @@ -152,7 +152,6 @@ namespace Bit.App.Pages return; } - _userDialogs.ShowLoading(AppResources.Deleting, MaskType.Black); var deleteTask = await _folderService.DeleteAsync(_folderId); _userDialogs.HideLoading(); diff --git a/src/App/Services/AppSettingsService.cs b/src/App/Services/AppSettingsService.cs new file mode 100644 index 000000000..04a8cae29 --- /dev/null +++ b/src/App/Services/AppSettingsService.cs @@ -0,0 +1,41 @@ +using System; +using Bit.App.Abstractions; +using Plugin.Settings.Abstractions; + +namespace Bit.App.Services +{ + public class AppSettingsService : IAppSettingsService + { + private readonly ISettings _settings; + + public AppSettingsService( + ISettings settings) + { + _settings = settings; + } + + public bool Locked + { + get + { + return _settings.GetValueOrDefault(Constants.Locked, false); + } + set + { + _settings.AddOrUpdateValue(Constants.Locked, value); + } + } + + public DateTime LastActivity + { + get + { + return _settings.GetValueOrDefault(Constants.LastActivityDate, DateTime.MinValue); + } + set + { + _settings.AddOrUpdateValue(Constants.LastActivityDate, value); + } + } + } +} diff --git a/src/App/Services/LockService.cs b/src/App/Services/LockService.cs index cef4dcea4..9fe18f43d 100644 --- a/src/App/Services/LockService.cs +++ b/src/App/Services/LockService.cs @@ -9,19 +9,32 @@ namespace Bit.App.Services public class LockService : ILockService { private readonly ISettings _settings; + private readonly IAppSettingsService _appSettings; private readonly IAuthService _authService; private readonly IFingerprint _fingerprint; public LockService( ISettings settings, + IAppSettingsService appSettings, IAuthService authService, IFingerprint fingerprint) { _settings = settings; + _appSettings = appSettings; _authService = authService; _fingerprint = fingerprint; } + public void UpdateLastActivity(DateTime? activityDate = null) + { + if(_appSettings.Locked) + { + return; + } + + _appSettings.LastActivity = activityDate.GetValueOrDefault(DateTime.UtcNow); + } + public LockType GetLockType(bool forceLock) { // Only lock if they are logged in @@ -31,7 +44,7 @@ namespace Bit.App.Services } // Are we forcing a lock? (i.e. clicking a button to lock the app manually, immediately) - if(!forceLock && !_settings.GetValueOrDefault(Constants.Locked, false)) + if(!forceLock && !_appSettings.Locked) { // Lock seconds tells if they want to lock the app or not var lockSeconds = _settings.GetValueOrDefault(Constants.SettingLockSeconds, 60 * 15); @@ -42,8 +55,7 @@ namespace Bit.App.Services // Has it been longer than lockSeconds since the last time the app was used? var now = DateTime.UtcNow; - var lastBackground = _settings.GetValueOrDefault(Constants.LastActivityDate, now.AddYears(-1)); - if((now - lastBackground).TotalSeconds < lockSeconds) + if((now - _appSettings.LastActivity).TotalSeconds < lockSeconds) { return LockType.None; } diff --git a/src/iOS.Extension/LoadingViewController.cs b/src/iOS.Extension/LoadingViewController.cs index 7bf7df141..2c23fc69b 100644 --- a/src/iOS.Extension/LoadingViewController.cs +++ b/src/iOS.Extension/LoadingViewController.cs @@ -30,7 +30,7 @@ namespace Bit.iOS.Extension private readonly JsonSerializerSettings _jsonSettings = new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }; private IGoogleAnalyticsService _googleAnalyticsService; - private ISettings _settings; + private ILockService _lockService; public LoadingViewController(IntPtr handle) : base(handle) { } @@ -44,7 +44,7 @@ namespace Bit.iOS.Extension View.BackgroundColor = new UIColor(red: 0.94f, green: 0.94f, blue: 0.96f, alpha: 1.0f); _context.ExtContext = ExtensionContext; _googleAnalyticsService = Resolver.Resolve(); - _settings = Resolver.Resolve(); + _lockService = Resolver.Resolve(); if(!_setupHockeyApp) { @@ -175,7 +175,7 @@ namespace Bit.iOS.Extension private void ContinueOn() { Debug.WriteLine("BW Log, Segue to setup, login add or list."); - _settings.AddOrUpdateValue(App.Constants.LastActivityDate, DateTime.UtcNow); + _lockService.UpdateLastActivity(); if(_context.ProviderType == Constants.UTTypeAppExtensionSaveLoginAction) { @@ -240,7 +240,7 @@ namespace Bit.iOS.Extension if(itemData != null) { - _settings.AddOrUpdateValue(App.Constants.LastActivityDate, DateTime.UtcNow); + _lockService.UpdateLastActivity(); _googleAnalyticsService.TrackExtensionEvent("AutoFilled", _context.ProviderType); } else @@ -283,6 +283,7 @@ namespace Bit.iOS.Extension .RegisterType(new ContainerControlledLifetimeManager()) .RegisterType(new ContainerControlledLifetimeManager()) .RegisterType(new ContainerControlledLifetimeManager()) + .RegisterType(new ContainerControlledLifetimeManager()) // Repositories .RegisterType(new ContainerControlledLifetimeManager()) .RegisterType(new ContainerControlledLifetimeManager()) diff --git a/src/iOS/AppDelegate.cs b/src/iOS/AppDelegate.cs index 63cba7cfc..ab7fb5ec2 100644 --- a/src/iOS/AppDelegate.cs +++ b/src/iOS/AppDelegate.cs @@ -33,6 +33,7 @@ namespace Bit.iOS public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate { private GaiCompletionHandler _dispatchHandler = null; + private ILockService _lockService; public ISettings Settings { get; set; } @@ -45,6 +46,7 @@ namespace Bit.iOS SetIoc(); } + _lockService = Resolver.Resolve(); var appIdService = Resolver.Resolve(); var crashManagerDelegate = new HockeyAppCrashManagerDelegate( appIdService, Resolver.Resolve()); @@ -65,10 +67,11 @@ namespace Bit.iOS Resolver.Resolve(), Resolver.Resolve(), Resolver.Resolve(), - Resolver.Resolve(), + _lockService, Resolver.Resolve(), Resolver.Resolve(), - Resolver.Resolve())); + Resolver.Resolve(), + Resolver.Resolve())); // Appearance stuff @@ -143,7 +146,7 @@ namespace Bit.iOS UIApplication.SharedApplication.SetStatusBarHidden(true, false); // Log the date/time we last backgrounded - Settings.AddOrUpdateValue(App.Constants.LastActivityDate, DateTime.UtcNow); + _lockService.UpdateLastActivity(); // Dispatch Google Analytics SendGoogleAnalyticsHitsInBackground(); @@ -268,6 +271,7 @@ namespace Bit.iOS .RegisterType(new ContainerControlledLifetimeManager()) .RegisterType(new ContainerControlledLifetimeManager()) .RegisterType(new ContainerControlledLifetimeManager()) + .RegisterType(new ContainerControlledLifetimeManager()) // Repositories .RegisterType(new ContainerControlledLifetimeManager()) .RegisterType(new ContainerControlledLifetimeManager())