1
0
mirror of https://github.com/bitwarden/mobile synced 2026-01-02 00:23:15 +00:00

moved password generation link to button

This commit is contained in:
Kyle Spearrin
2018-03-06 12:40:42 -05:00
parent fb6e488339
commit fb6e0c9eb8
17 changed files with 168 additions and 126 deletions

View File

@@ -11,6 +11,7 @@ namespace Bit.App.Controls
{
private VisualElement _nextElement;
private TapGestureRecognizer _tgr;
private StackLayout _buttonStackLayout = null;
public FormEntryCell(
string labelText,
@@ -20,7 +21,8 @@ namespace Bit.App.Controls
bool useLabelAsPlaceholder = false,
string imageSource = null,
Thickness? containerPadding = null,
bool useButton = false)
string button1 = null,
string button2 = null)
{
if(!useLabelAsPlaceholder)
{
@@ -83,8 +85,57 @@ namespace Bit.App.Controls
VerticalOptions = LayoutOptions.CenterAndExpand
};
if(!useLabelAsPlaceholder)
{
formStackLayout.Children.Add(Label);
}
formStackLayout.Children.Add(Entry);
imageStackLayout.Children.Add(formStackLayout);
if(!string.IsNullOrWhiteSpace(button1) || !string.IsNullOrWhiteSpace(button2))
{
_buttonStackLayout = new StackLayout
{
Orientation = StackOrientation.Horizontal,
VerticalOptions = LayoutOptions.CenterAndExpand
};
imageStackLayout.Children.Add(_buttonStackLayout);
if(!string.IsNullOrWhiteSpace(button1))
{
Button1 = new ExtendedButton { Image = button1 };
_buttonStackLayout.Children.Add(Button1);
if(Device.RuntimePlatform == Device.Android)
{
Button1.Padding = new Thickness(0);
Button1.BackgroundColor = Color.Transparent;
Button1.WidthRequest = 40;
}
}
if(!string.IsNullOrWhiteSpace(button2))
{
Button2 = new ExtendedButton { Image = button2 };
_buttonStackLayout.Children.Add(Button2);
if(Device.RuntimePlatform == Device.Android)
{
Button2.Padding = new Thickness(0);
Button2.BackgroundColor = Color.Transparent;
Button2.WidthRequest = 40;
}
}
}
if(Device.RuntimePlatform == Device.Android)
{
if(_buttonStackLayout != null)
{
_buttonStackLayout.Spacing = 5;
}
var deviceInfo = Resolver.Resolve<IDeviceInfoService>();
if(useLabelAsPlaceholder)
{
@@ -107,25 +158,11 @@ namespace Bit.App.Controls
imageStackLayout.AdjustPaddingForDevice();
}
}
if(!useLabelAsPlaceholder)
else if(Device.RuntimePlatform == Device.UWP)
{
formStackLayout.Children.Add(Label);
}
formStackLayout.Children.Add(Entry);
imageStackLayout.Children.Add(formStackLayout);
if(useButton)
{
Button = new ExtendedButton();
imageStackLayout.Children.Add(Button);
if(Device.RuntimePlatform == Device.Android)
if(_buttonStackLayout != null)
{
Button.Padding = new Thickness(0);
Button.BackgroundColor = Color.Transparent;
Button.WidthRequest = 40;
_buttonStackLayout.Spacing = 0;
}
}
@@ -134,7 +171,8 @@ namespace Bit.App.Controls
public Label Label { get; private set; }
public ExtendedEntry Entry { get; private set; }
public ExtendedButton Button { get; private set; }
public ExtendedButton Button1 { get; private set; }
public ExtendedButton Button2 { get; private set; }
public VisualElement NextElement
{
get => _nextElement;

View File

@@ -101,7 +101,6 @@ namespace Bit.App.Pages
public FormEntryCell LoginPasswordCell { get; private set; }
public FormEntryCell LoginUsernameCell { get; private set; }
public FormEntryCell LoginTotpCell { get; private set; }
public ExtendedTextCell LoginGenerateCell { get; private set; }
// Card
public FormEntryCell CardNameCell { get; private set; }
@@ -202,11 +201,11 @@ namespace Bit.App.Pages
LoginPasswordCell.InitEvents();
LoginUsernameCell.InitEvents();
LoginTotpCell.InitEvents();
LoginPasswordCell.Button.Clicked += PasswordButton_Clicked;
LoginGenerateCell.Tapped += GenerateCell_Tapped;
if(LoginTotpCell?.Button != null)
LoginPasswordCell.Button1.Clicked += PasswordButton_Clicked;
LoginPasswordCell.Button2.Clicked += PasswordButton2_Clicked;
if(LoginTotpCell?.Button1 != null)
{
LoginTotpCell.Button.Clicked += TotpButton_Clicked;
LoginTotpCell.Button1.Clicked += TotpButton_Clicked;
}
break;
case CipherType.Card:
@@ -285,11 +284,11 @@ namespace Bit.App.Pages
LoginTotpCell.Dispose();
LoginPasswordCell.Dispose();
LoginUsernameCell.Dispose();
LoginPasswordCell.Button.Clicked -= PasswordButton_Clicked;
LoginGenerateCell.Tapped -= GenerateCell_Tapped;
if(LoginTotpCell?.Button != null)
LoginPasswordCell.Button1.Clicked -= PasswordButton_Clicked;
LoginPasswordCell.Button2.Clicked += PasswordButton2_Clicked;
if(LoginTotpCell?.Button1 != null)
{
LoginTotpCell.Button.Clicked -= TotpButton_Clicked;
LoginTotpCell.Button1.Clicked -= TotpButton_Clicked;
}
break;
case CipherType.Card:
@@ -342,10 +341,20 @@ namespace Bit.App.Pages
private void PasswordButton_Clicked(object sender, EventArgs e)
{
LoginPasswordCell.Entry.InvokeToggleIsPassword();
LoginPasswordCell.Button.Image =
LoginPasswordCell.Button1.Image =
"eye" + (!LoginPasswordCell.Entry.IsPasswordFromToggled ? "_slash" : string.Empty) + ".png";
}
private async void PasswordButton2_Clicked(object sender, EventArgs e)
{
var page = new ToolsPasswordGeneratorPage((password) =>
{
LoginPasswordCell.Entry.Text = password;
_deviceActionService.Toast(AppResources.PasswordGenerated);
}, _fromAutofill);
await Navigation.PushForDeviceAsync(page);
}
private async void TotpButton_Clicked(object sender, EventArgs e)
{
var scanPage = new ScanPage((key) =>
@@ -368,16 +377,6 @@ namespace Bit.App.Pages
await Navigation.PushModalAsync(new ExtendedNavigationPage(scanPage));
}
private async void GenerateCell_Tapped(object sender, EventArgs e)
{
var page = new ToolsPasswordGeneratorPage((password) =>
{
LoginPasswordCell.Entry.Text = password;
_deviceActionService.Toast(AppResources.PasswordGenerated);
}, _fromAutofill);
await Navigation.PushForDeviceAsync(page);
}
private void AlertNoConnection()
{
DisplayAlert(AppResources.InternetConnectionRequiredTitle, AppResources.InternetConnectionRequiredMessage,
@@ -400,19 +399,15 @@ namespace Bit.App.Pages
if(_type == CipherType.Login)
{
LoginTotpCell = new FormEntryCell(AppResources.AuthenticatorKey, useButton: _deviceInfo.HasCamera);
if(_deviceInfo.HasCamera)
{
LoginTotpCell.Button.Image = "camera.png";
}
LoginTotpCell = new FormEntryCell(AppResources.AuthenticatorKey,
button1: _deviceInfo.HasCamera ? "camera.png" : null);
LoginTotpCell.Entry.DisableAutocapitalize = true;
LoginTotpCell.Entry.Autocorrect = false;
LoginTotpCell.Entry.FontFamily =
Helpers.OnPlatform(iOS: "Menlo-Regular", Android: "monospace", Windows: "Courier");
LoginPasswordCell = new FormEntryCell(AppResources.Password, isPassword: true, nextElement: LoginTotpCell.Entry,
useButton: true);
LoginPasswordCell.Button.Image = "eye.png";
button1: "eye.png", button2: "refresh_alt.png");
LoginPasswordCell.Entry.DisableAutocapitalize = true;
LoginPasswordCell.Entry.Autocorrect = false;
LoginPasswordCell.Entry.FontFamily =
@@ -422,12 +417,6 @@ namespace Bit.App.Pages
LoginPasswordCell.Entry.Text = _defaultPassword;
}
LoginGenerateCell = new ExtendedTextCell
{
Text = AppResources.GeneratePassword,
ShowDisclousure = true
};
LoginUsernameCell = new FormEntryCell(AppResources.Username, nextElement: LoginPasswordCell.Entry);
LoginUsernameCell.Entry.DisableAutocapitalize = true;
LoginUsernameCell.Entry.Autocorrect = false;
@@ -441,7 +430,6 @@ namespace Bit.App.Pages
// Build sections
TopSection.Add(LoginUsernameCell);
TopSection.Add(LoginPasswordCell);
TopSection.Add(LoginGenerateCell);
TopSection.Add(LoginTotpCell);
// Uris

View File

@@ -59,7 +59,6 @@ namespace Bit.App.Pages
public FormEntryCell LoginPasswordCell { get; private set; }
public FormEntryCell LoginUsernameCell { get; private set; }
public FormEntryCell LoginTotpCell { get; private set; }
public ExtendedTextCell LoginGenerateCell { get; private set; }
// Card
public FormEntryCell CardNameCell { get; private set; }
@@ -170,11 +169,8 @@ namespace Bit.App.Pages
// Types
if(Cipher.Type == CipherType.Login)
{
LoginTotpCell = new FormEntryCell(AppResources.AuthenticatorKey, useButton: _deviceInfo.HasCamera);
if(_deviceInfo.HasCamera)
{
LoginTotpCell.Button.Image = "camera.png";
}
LoginTotpCell = new FormEntryCell(AppResources.AuthenticatorKey,
button1: _deviceInfo.HasCamera ? "camera.png" : null);
LoginTotpCell.Entry.Text = Cipher.Login?.Totp?.Decrypt(Cipher.OrganizationId);
LoginTotpCell.Entry.DisableAutocapitalize = true;
LoginTotpCell.Entry.Autocorrect = false;
@@ -182,20 +178,13 @@ namespace Bit.App.Pages
Helpers.OnPlatform(iOS: "Menlo-Regular", Android: "monospace", Windows: "Courier");
LoginPasswordCell = new FormEntryCell(AppResources.Password, isPassword: true,
nextElement: LoginTotpCell.Entry, useButton: true);
nextElement: LoginTotpCell.Entry, button1: "eye.png", button2: "refresh_alt.png");
LoginPasswordCell.Entry.Text = Cipher.Login?.Password?.Decrypt(Cipher.OrganizationId);
LoginPasswordCell.Button.Image = "eye.png";
LoginPasswordCell.Entry.DisableAutocapitalize = true;
LoginPasswordCell.Entry.Autocorrect = false;
LoginPasswordCell.Entry.FontFamily =
Helpers.OnPlatform(iOS: "Menlo-Regular", Android: "monospace", Windows: "Courier");
LoginGenerateCell = new ExtendedTextCell
{
Text = AppResources.GeneratePassword,
ShowDisclousure = true
};
LoginUsernameCell = new FormEntryCell(AppResources.Username, nextElement: LoginPasswordCell.Entry);
LoginUsernameCell.Entry.Text = Cipher.Login?.Username?.Decrypt(Cipher.OrganizationId);
LoginUsernameCell.Entry.DisableAutocapitalize = true;
@@ -207,7 +196,6 @@ namespace Bit.App.Pages
// Build sections
TopSection.Add(LoginUsernameCell);
TopSection.Add(LoginPasswordCell);
TopSection.Add(LoginGenerateCell);
TopSection.Add(LoginTotpCell);
// Uris
@@ -709,17 +697,17 @@ namespace Bit.App.Pages
LoginPasswordCell?.InitEvents();
LoginUsernameCell?.InitEvents();
LoginTotpCell?.InitEvents();
if(LoginPasswordCell?.Button != null)
if(LoginPasswordCell?.Button1 != null)
{
LoginPasswordCell.Button.Clicked += PasswordButton_Clicked;
LoginPasswordCell.Button1.Clicked += PasswordButton_Clicked;
}
if(LoginGenerateCell != null)
if(LoginPasswordCell?.Button2 != null)
{
LoginGenerateCell.Tapped += GenerateCell_Tapped;
LoginPasswordCell.Button2.Clicked += PasswordButton2_Clicked;
}
if(LoginTotpCell?.Button != null)
if(LoginTotpCell?.Button1 != null)
{
LoginTotpCell.Button.Clicked += TotpButton_Clicked;
LoginTotpCell.Button1.Clicked += TotpButton_Clicked;
}
break;
case CipherType.Card:
@@ -789,17 +777,17 @@ namespace Bit.App.Pages
LoginTotpCell?.Dispose();
LoginPasswordCell?.Dispose();
LoginUsernameCell?.Dispose();
if(LoginPasswordCell?.Button != null)
if(LoginPasswordCell?.Button1 != null)
{
LoginPasswordCell.Button.Clicked -= PasswordButton_Clicked;
LoginPasswordCell.Button1.Clicked -= PasswordButton_Clicked;
}
if(LoginGenerateCell != null)
if(LoginPasswordCell?.Button2 != null)
{
LoginGenerateCell.Tapped -= GenerateCell_Tapped;
LoginPasswordCell.Button2.Clicked -= PasswordButton2_Clicked;
}
if(LoginTotpCell?.Button != null)
if(LoginTotpCell?.Button1 != null)
{
LoginTotpCell.Button.Clicked -= TotpButton_Clicked;
LoginTotpCell.Button1.Clicked -= TotpButton_Clicked;
}
break;
case CipherType.Card:
@@ -841,10 +829,26 @@ namespace Bit.App.Pages
private void PasswordButton_Clicked(object sender, EventArgs e)
{
LoginPasswordCell.Entry.InvokeToggleIsPassword();
LoginPasswordCell.Button.Image =
LoginPasswordCell.Button1.Image =
"eye" + (!LoginPasswordCell.Entry.IsPasswordFromToggled ? "_slash" : string.Empty) + ".png";
}
private async void PasswordButton2_Clicked(object sender, EventArgs e)
{
if(!string.IsNullOrWhiteSpace(LoginPasswordCell.Entry.Text)
&& !(await DisplayAlert(null, AppResources.PasswordOverrideAlert, AppResources.Yes, AppResources.No)))
{
return;
}
var page = new ToolsPasswordGeneratorPage((password) =>
{
LoginPasswordCell.Entry.Text = password;
_deviceActionService.Toast(AppResources.PasswordGenerated);
});
await Navigation.PushForDeviceAsync(page);
}
private async void TotpButton_Clicked(object sender, EventArgs e)
{
var scanPage = new ScanPage((key) =>
@@ -867,22 +871,6 @@ namespace Bit.App.Pages
await Navigation.PushModalAsync(new ExtendedNavigationPage(scanPage));
}
private async void GenerateCell_Tapped(object sender, EventArgs e)
{
if(!string.IsNullOrWhiteSpace(LoginPasswordCell.Entry.Text)
&& !(await DisplayAlert(null, AppResources.PasswordOverrideAlert, AppResources.Yes, AppResources.No)))
{
return;
}
var page = new ToolsPasswordGeneratorPage((password) =>
{
LoginPasswordCell.Entry.Text = password;
_deviceActionService.Toast(AppResources.PasswordGenerated);
});
await Navigation.PushForDeviceAsync(page);
}
private async void AttachmentsCell_Tapped(object sender, EventArgs e)
{
var page = new ExtendedNavigationPage(new VaultAttachmentsPage(_cipherId));

View File

@@ -257,7 +257,8 @@ namespace Bit.App.Utilities
case FieldType.Text:
case FieldType.Hidden:
var hidden = type == FieldType.Hidden;
var textFieldCell = new FormEntryCell(label, isPassword: hidden, useButton: hidden);
var textFieldCell = new FormEntryCell(label, isPassword: hidden,
button1: hidden ? "eye.png" : null);
textFieldCell.Entry.Text = value;
textFieldCell.Entry.DisableAutocapitalize = true;
textFieldCell.Entry.Autocorrect = false;
@@ -266,11 +267,10 @@ namespace Bit.App.Utilities
{
textFieldCell.Entry.FontFamily = Helpers.OnPlatform(
iOS: "Menlo-Regular", Android: "monospace", Windows: "Courier");
textFieldCell.Button.Image = "eye.png";
textFieldCell.Button.Command = new Command(() =>
textFieldCell.Button1.Command = new Command(() =>
{
textFieldCell.Entry.InvokeToggleIsPassword();
textFieldCell.Button.Image =
textFieldCell.Button1.Image =
"eye" + (!textFieldCell.Entry.IsPasswordFromToggled ? "_slash" : string.Empty) + ".png";
});
}