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

@ -906,5 +906,20 @@
<ItemGroup>
<AndroidResource Include="Resources\drawable-xxxhdpi\pencil.png" />
</ItemGroup>
<ItemGroup>
<AndroidResource Include="Resources\drawable\refresh_alt.png" />
</ItemGroup>
<ItemGroup>
<AndroidResource Include="Resources\drawable-hdpi\refresh_alt.png" />
</ItemGroup>
<ItemGroup>
<AndroidResource Include="Resources\drawable-xhdpi\refresh_alt.png" />
</ItemGroup>
<ItemGroup>
<AndroidResource Include="Resources\drawable-xxhdpi\refresh_alt.png" />
</ItemGroup>
<ItemGroup>
<AndroidResource Include="Resources\drawable-xxxhdpi\refresh_alt.png" />
</ItemGroup>
<Import Project="$(MSBuildExtensionsPath)\Xamarin\Android\Xamarin.Android.CSharp.targets" />
</Project>

View file

@ -4682,26 +4682,26 @@ namespace Bit.Android
// aapt resource value: 0x7f02005b
public const int avd_hide_password = 2130837595;
// aapt resource value: 0x7f02015a
public const int avd_hide_password_1 = 2130837850;
// aapt resource value: 0x7f02015b
public const int avd_hide_password_2 = 2130837851;
public const int avd_hide_password_1 = 2130837851;
// aapt resource value: 0x7f02015c
public const int avd_hide_password_3 = 2130837852;
public const int avd_hide_password_2 = 2130837852;
// aapt resource value: 0x7f02015d
public const int avd_hide_password_3 = 2130837853;
// aapt resource value: 0x7f02005c
public const int avd_show_password = 2130837596;
// aapt resource value: 0x7f02015d
public const int avd_show_password_1 = 2130837853;
// aapt resource value: 0x7f02015e
public const int avd_show_password_2 = 2130837854;
public const int avd_show_password_1 = 2130837854;
// aapt resource value: 0x7f02015f
public const int avd_show_password_3 = 2130837855;
public const int avd_show_password_2 = 2130837855;
// aapt resource value: 0x7f020160
public const int avd_show_password_3 = 2130837856;
// aapt resource value: 0x7f02005d
public const int bottom_nav_bg = 2130837597;
@ -5405,11 +5405,11 @@ namespace Bit.Android
// aapt resource value: 0x7f020146
public const int notification_sm = 2130837830;
// aapt resource value: 0x7f020158
public const int notification_template_icon_bg = 2130837848;
// aapt resource value: 0x7f020159
public const int notification_template_icon_low_bg = 2130837849;
public const int notification_template_icon_bg = 2130837849;
// aapt resource value: 0x7f02015a
public const int notification_template_icon_low_bg = 2130837850;
// aapt resource value: 0x7f020147
public const int notification_tile_bg = 2130837831;
@ -5430,37 +5430,40 @@ namespace Bit.Android
public const int refresh = 2130837836;
// aapt resource value: 0x7f02014d
public const int search = 2130837837;
public const int refresh_alt = 2130837837;
// aapt resource value: 0x7f02014e
public const int share = 2130837838;
public const int search = 2130837838;
// aapt resource value: 0x7f02014f
public const int share_tools = 2130837839;
public const int share = 2130837839;
// aapt resource value: 0x7f020150
public const int shield = 2130837840;
public const int share_tools = 2130837840;
// aapt resource value: 0x7f020151
public const int slider_thumb = 2130837841;
public const int shield = 2130837841;
// aapt resource value: 0x7f020152
public const int splash_screen = 2130837842;
public const int slider_thumb = 2130837842;
// aapt resource value: 0x7f020153
public const int tools = 2130837843;
public const int splash_screen = 2130837843;
// aapt resource value: 0x7f020154
public const int trash = 2130837844;
public const int tools = 2130837844;
// aapt resource value: 0x7f020155
public const int upload = 2130837845;
public const int trash = 2130837845;
// aapt resource value: 0x7f020156
public const int user = 2130837846;
public const int upload = 2130837846;
// aapt resource value: 0x7f020157
public const int yubikey = 2130837847;
public const int user = 2130837847;
// aapt resource value: 0x7f020158
public const int yubikey = 2130837848;
static Drawable()
{

Binary file not shown.

After

Width:  |  Height:  |  Size: 804 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1,017 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 583 B

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";
});
}

View file

@ -43,6 +43,7 @@
<Content Include="$(MSBuildThisFileDirectory)photo.png" />
<Content Include="$(MSBuildThisFileDirectory)plus.png" />
<Content Include="$(MSBuildThisFileDirectory)refresh.png" />
<Content Include="$(MSBuildThisFileDirectory)refresh_alt.png" />
<Content Include="$(MSBuildThisFileDirectory)refresh_selected.png" />
<Content Include="$(MSBuildThisFileDirectory)search.png" />
<Content Include="$(MSBuildThisFileDirectory)share.png" />

Binary file not shown.

After

Width:  |  Height:  |  Size: 1,017 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 583 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1,017 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

View file

@ -710,5 +710,14 @@
<Version>2.0.5782</Version>
</PackageReference>
</ItemGroup>
<ItemGroup>
<BundleResource Include="Resources\refresh_alt.png" />
</ItemGroup>
<ItemGroup>
<BundleResource Include="Resources\refresh_alt%402x.png" />
</ItemGroup>
<ItemGroup>
<BundleResource Include="Resources\refresh_alt%403x.png" />
</ItemGroup>
<Import Project="$(MSBuildExtensionsPath)\Xamarin\iOS\Xamarin.iOS.CSharp.targets" />
</Project>