1
0
mirror of https://github.com/bitwarden/mobile.git synced 2024-11-16 10:35:27 +01:00

init login page

This commit is contained in:
Kyle Spearrin 2019-05-01 15:29:57 -04:00
parent 3b97fa0379
commit 9678eab43f
4 changed files with 64 additions and 10 deletions

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage
<pages:BaseContentPage
xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="Bit.App.Pages.LoginPage"
@ -31,6 +31,7 @@
Text="{u:I18n EmailAddress}"
StyleClass="box-label" />
<Entry
x:Name="_email"
Text="{Binding Email}"
StyleClass="box-value" />
</StackLayout>
@ -49,6 +50,7 @@
Grid.Row="0"
Grid.Column="0" />
<controls:MonoEntry
x:Name="_masterPassword"
Text="{Binding MasterPassword}"
StyleClass="box-value"
IsPassword="{Binding ShowPassword, Converter={StaticResource inverseBool}}"
@ -69,4 +71,4 @@
</StackLayout>
</ScrollView>
</ContentPage>
</pages:BaseContentPage>

View File

@ -1,14 +1,9 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Xamarin.Forms;
using Xamarin.Forms.Xaml;
namespace Bit.App.Pages
{
public partial class LoginPage : ContentPage
public partial class LoginPage : BaseContentPage
{
private LoginPageViewModel _vm;
@ -17,6 +12,23 @@ namespace Bit.App.Pages
InitializeComponent();
_vm = BindingContext as LoginPageViewModel;
_vm.Page = this;
MasterPasswordEntry = _masterPassword;
}
public Entry MasterPasswordEntry { get; set; }
protected override async void OnAppearing()
{
base.OnAppearing();
await _vm.InitAsync();
if(string.IsNullOrWhiteSpace(_vm.Email))
{
RequestFocus(_email);
}
else
{
RequestFocus(_masterPassword);
}
}
private async void LogIn_Clicked(object sender, EventArgs e)

View File

@ -10,9 +10,13 @@ namespace Bit.App.Pages
{
public class LoginPageViewModel : BaseViewModel
{
private const string Keys_RememberedEmail = "rememberedEmail";
private const string Keys_RememberEmail = "rememberEmail";
private readonly IDeviceActionService _deviceActionService;
private readonly IAuthService _authService;
private readonly ISyncService _syncService;
private readonly IStorageService _storageService;
private bool _showPassword;
@ -21,6 +25,7 @@ namespace Bit.App.Pages
_deviceActionService = ServiceContainer.Resolve<IDeviceActionService>("deviceActionService");
_authService = ServiceContainer.Resolve<IAuthService>("authService");
_syncService = ServiceContainer.Resolve<ISyncService>("syncService");
_storageService = ServiceContainer.Resolve<IStorageService>("storageService");
PageTitle = AppResources.Bitwarden;
TogglePasswordCommand = new Command(TogglePassword);
@ -40,6 +45,17 @@ namespace Bit.App.Pages
public string ShowPasswordIcon => ShowPassword ? "" : "";
public string Email { get; set; }
public string MasterPassword { get; set; }
public bool RememberEmail { get; set; }
public async Task InitAsync()
{
if(string.IsNullOrWhiteSpace(Email))
{
Email = await _storageService.GetAsync<string>(Keys_RememberedEmail);
}
var rememberEmail = await _storageService.GetAsync<bool?>(Keys_RememberEmail);
RememberEmail = rememberEmail.GetValueOrDefault(true);
}
public async Task LogInAsync()
{
@ -68,7 +84,14 @@ namespace Bit.App.Pages
await _deviceActionService.ShowLoadingAsync(AppResources.LoggingIn);
var response = await _authService.LogInAsync(Email, MasterPassword);
await _deviceActionService.HideLoadingAsync();
// TODO: remember email?
if(RememberEmail)
{
await _storageService.SaveAsync(Keys_RememberedEmail, Email);
}
else
{
await _storageService.RemoveAsync(Keys_RememberedEmail);
}
if(response.TwoFactor)
{
// TODO: 2fa page
@ -89,6 +112,7 @@ namespace Bit.App.Pages
public void TogglePassword()
{
ShowPassword = !ShowPassword;
(Page as LoginPage).MasterPasswordEntry.Focus();
}
}
}

View File

@ -6,6 +6,8 @@ namespace Bit.App.Pages
{
public class BaseContentPage : ContentPage
{
protected int AndroidShowModalAnimationDelay = 400;
protected void SetActivityIndicator()
{
Content = new ActivityIndicator
@ -33,9 +35,23 @@ namespace Bit.App.Pages
}
await Task.Run(async () =>
{
await Task.Delay(400);
await Task.Delay(AndroidShowModalAnimationDelay);
Device.BeginInvokeOnMainThread(async () => await DoWorkAsync());
});
}
protected void RequestFocus(Entry entry)
{
if(Device.RuntimePlatform == Device.iOS)
{
entry.Focus();
return;
}
Task.Run(async () =>
{
await Task.Delay(AndroidShowModalAnimationDelay);
Device.BeginInvokeOnMainThread(() => entry.Focus());
});
}
}
}