lock option picker

This commit is contained in:
Kyle Spearrin 2019-05-16 14:55:18 -04:00
parent 3f8ab1bfe7
commit c65b065dd7
5 changed files with 102 additions and 6 deletions

View file

@ -13,6 +13,8 @@
<ContentPage.Resources> <ContentPage.Resources>
<ResourceDictionary> <ResourceDictionary>
<u:StringHasValueConverter x:Key="stringHasValue" />
<DataTemplate <DataTemplate
x:Key="regularTemplate" x:Key="regularTemplate"
x:DataType="pages:SettingsPageListItem"> x:DataType="pages:SettingsPageListItem">
@ -24,6 +26,12 @@
HorizontalOptions="StartAndExpand" HorizontalOptions="StartAndExpand"
VerticalOptions="CenterAndExpand" VerticalOptions="CenterAndExpand"
StyleClass="list-title"/> StyleClass="list-title"/>
<Label Text="{Binding SubLabel, Mode=OneWay}"
IsVisible="{Binding SubLabel, Converter={StaticResource stringHasValue}}"
HorizontalOptions="End"
HorizontalTextAlignment="End"
VerticalOptions="CenterAndExpand"
StyleClass="list-sub"/>
</StackLayout> </StackLayout>
</ViewCell> </ViewCell>
</DataTemplate> </DataTemplate>

View file

@ -20,6 +20,12 @@ namespace Bit.App.Pages
_vm.Page = this; _vm.Page = this;
} }
protected async override void OnAppearing()
{
base.OnAppearing();
await _vm.InitAsync();
}
private async void RowSelected(object sender, SelectedItemChangedEventArgs e) private async void RowSelected(object sender, SelectedItemChangedEventArgs e)
{ {
((ListView)sender).SelectedItem = null; ((ListView)sender).SelectedItem = null;
@ -88,6 +94,10 @@ namespace Bit.App.Pages
{ {
await _vm.LockAsync(); await _vm.LockAsync();
} }
else if(item.Name == AppResources.LockOptions)
{
await _vm.LockOptionsAsync();
}
} }
} }
} }

View file

@ -1,9 +1,11 @@
using Bit.App.Abstractions; using Bit.App.Abstractions;
using Bit.App.Resources; using Bit.App.Resources;
using Bit.Core;
using Bit.Core.Abstractions; using Bit.Core.Abstractions;
using Bit.Core.Utilities; using Bit.Core.Utilities;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using Xamarin.Forms; using Xamarin.Forms;
@ -18,6 +20,25 @@ namespace Bit.App.Pages
private readonly IEnvironmentService _environmentService; private readonly IEnvironmentService _environmentService;
private readonly IMessagingService _messagingService; private readonly IMessagingService _messagingService;
private readonly ILockService _lockService; private readonly ILockService _lockService;
private readonly IStorageService _storageService;
private readonly ISyncService _syncService;
private bool _pin;
private bool _fingerprint;
private string _lastSyncDate;
private string _lockOptionValue;
private List<KeyValuePair<string, int?>> _lockOptions =
new List<KeyValuePair<string, int?>>
{
new KeyValuePair<string, int?>(AppResources.LockOptionImmediately, 0),
new KeyValuePair<string, int?>(AppResources.LockOption1Minute, 1),
new KeyValuePair<string, int?>(AppResources.LockOption5Minutes, 5),
new KeyValuePair<string, int?>(AppResources.LockOption15Minutes, 15),
new KeyValuePair<string, int?>(AppResources.LockOption30Minutes, 30),
new KeyValuePair<string, int?>(AppResources.LockOption1Hour, 60),
new KeyValuePair<string, int?>(AppResources.LockOption4Hours, 240),
new KeyValuePair<string, int?>(AppResources.Never, null),
};
public SettingsPageViewModel() public SettingsPageViewModel()
{ {
@ -28,12 +49,30 @@ namespace Bit.App.Pages
_environmentService = ServiceContainer.Resolve<IEnvironmentService>("environmentService"); _environmentService = ServiceContainer.Resolve<IEnvironmentService>("environmentService");
_messagingService = ServiceContainer.Resolve<IMessagingService>("messagingService"); _messagingService = ServiceContainer.Resolve<IMessagingService>("messagingService");
_lockService = ServiceContainer.Resolve<ILockService>("lockService"); _lockService = ServiceContainer.Resolve<ILockService>("lockService");
_storageService = ServiceContainer.Resolve<IStorageService>("storageService");
_syncService = ServiceContainer.Resolve<ISyncService>("syncService");
GroupedItems = new ExtendedObservableCollection<SettingsPageListGroup>();
PageTitle = AppResources.Settings; PageTitle = AppResources.Settings;
BuildList();
} }
public List<SettingsPageListGroup> GroupedItems { get; set; } public ExtendedObservableCollection<SettingsPageListGroup> GroupedItems { get; set; }
public async Task InitAsync()
{
var lastSync = await _syncService.GetLastSyncAsync();
if(lastSync != null)
{
_lastSyncDate = string.Format("{0} {1}", lastSync.Value.ToShortDateString(),
lastSync.Value.ToShortTimeString());
}
var option = await _storageService.GetAsync<int?>(Constants.LockOptionKey);
_lockOptionValue = _lockOptions.FirstOrDefault(o => o.Value == option).Key;
var pinSet = await _lockService.IsPinLockSetAsync();
_pin = pinSet.Item1 || pinSet.Item2;
// TODO: Fingerprint
BuildList();
}
public async Task AboutAsync() public async Task AboutAsync()
{ {
@ -136,17 +175,32 @@ namespace Bit.App.Pages
await _lockService.LockAsync(true); await _lockService.LockAsync(true);
} }
public async Task LockOptionsAsync()
{
var options = _lockOptions.Select(o => o.Key == _lockOptionValue ? $"✓ {o.Key}" : o.Key).ToArray();
var selection = await Page.DisplayActionSheet(AppResources.LockOptions, AppResources.Cancel, null, options);
if(selection == AppResources.Cancel)
{
return;
}
var cleanSelection = selection.Replace("✓ ", string.Empty);
var selectionOption = _lockOptions.FirstOrDefault(o => o.Key == cleanSelection);
_lockOptionValue = selectionOption.Key;
await _storageService.SaveAsync(Constants.LockOptionKey, selectionOption.Value);
BuildList();
}
private void BuildList() private void BuildList()
{ {
var doUpper = Device.RuntimePlatform != Device.Android; var doUpper = Device.RuntimePlatform != Device.Android;
var manageItems = new List<SettingsPageListItem> var manageItems = new List<SettingsPageListItem>
{ {
new SettingsPageListItem { Name = AppResources.Folders }, new SettingsPageListItem { Name = AppResources.Folders },
new SettingsPageListItem { Name = AppResources.Sync } new SettingsPageListItem { Name = AppResources.Sync, SubLabel = _lastSyncDate }
}; };
var securityItems = new List<SettingsPageListItem> var securityItems = new List<SettingsPageListItem>
{ {
new SettingsPageListItem { Name = AppResources.LockOptions }, new SettingsPageListItem { Name = AppResources.LockOptions, SubLabel = _lockOptionValue },
new SettingsPageListItem { Name = string.Format(AppResources.UnlockWith, AppResources.Fingerprint) }, new SettingsPageListItem { Name = string.Format(AppResources.UnlockWith, AppResources.Fingerprint) },
new SettingsPageListItem { Name = AppResources.UnlockWithPIN }, new SettingsPageListItem { Name = AppResources.UnlockWithPIN },
new SettingsPageListItem { Name = AppResources.LockNow }, new SettingsPageListItem { Name = AppResources.LockNow },
@ -172,14 +226,14 @@ namespace Bit.App.Pages
new SettingsPageListItem { Name = AppResources.HelpAndFeedback }, new SettingsPageListItem { Name = AppResources.HelpAndFeedback },
new SettingsPageListItem { Name = AppResources.RateTheApp } new SettingsPageListItem { Name = AppResources.RateTheApp }
}; };
GroupedItems = new List<SettingsPageListGroup> GroupedItems.ResetWithRange(new List<SettingsPageListGroup>
{ {
new SettingsPageListGroup(manageItems, AppResources.Manage, doUpper), new SettingsPageListGroup(manageItems, AppResources.Manage, doUpper),
new SettingsPageListGroup(securityItems, AppResources.Security, doUpper), new SettingsPageListGroup(securityItems, AppResources.Security, doUpper),
new SettingsPageListGroup(accountItems, AppResources.Account, doUpper), new SettingsPageListGroup(accountItems, AppResources.Account, doUpper),
new SettingsPageListGroup(toolsItems, AppResources.Tools, doUpper), new SettingsPageListGroup(toolsItems, AppResources.Tools, doUpper),
new SettingsPageListGroup(otherItems, AppResources.Other, doUpper) new SettingsPageListGroup(otherItems, AppResources.Other, doUpper)
}; });
} }
} }
} }

View file

@ -2085,6 +2085,15 @@ namespace Bit.App.Resources {
} }
} }
/// <summary>
/// Looks up a localized string similar to 30 minutes.
/// </summary>
public static string LockOption30Minutes {
get {
return ResourceManager.GetString("LockOption30Minutes", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to 4 hours. /// Looks up a localized string similar to 4 hours.
/// </summary> /// </summary>
@ -2094,6 +2103,15 @@ namespace Bit.App.Resources {
} }
} }
/// <summary>
/// Looks up a localized string similar to 5 minutes.
/// </summary>
public static string LockOption5Minutes {
get {
return ResourceManager.GetString("LockOption5Minutes", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to Immediately. /// Looks up a localized string similar to Immediately.
/// </summary> /// </summary>

View file

@ -1490,4 +1490,10 @@
<data name="Unlock" xml:space="preserve"> <data name="Unlock" xml:space="preserve">
<value>Unlock</value> <value>Unlock</value>
</data> </data>
<data name="LockOption30Minutes" xml:space="preserve">
<value>30 minutes</value>
</data>
<data name="LockOption5Minutes" xml:space="preserve">
<value>5 minutes</value>
</data>
</root> </root>