mirror of
https://github.com/bitwarden/android.git
synced 2024-12-25 02:18:27 +03:00
lock option picker
This commit is contained in:
parent
3f8ab1bfe7
commit
c65b065dd7
5 changed files with 102 additions and 6 deletions
|
@ -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>
|
||||||
|
|
|
@ -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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
};
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
18
src/App/Resources/AppResources.Designer.cs
generated
18
src/App/Resources/AppResources.Designer.cs
generated
|
@ -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>
|
||||||
|
|
|
@ -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>
|
Loading…
Reference in a new issue