diff --git a/src/App/Pages/LoginTwoFactorPage.cs b/src/App/Pages/LoginTwoFactorPage.cs index b6d2f1835..3806cc77d 100644 --- a/src/App/Pages/LoginTwoFactorPage.cs +++ b/src/App/Pages/LoginTwoFactorPage.cs @@ -93,6 +93,12 @@ namespace Bit.App.Pages On = false }; + var continueToolbarItem = new ToolbarItem(AppResources.Continue, Helpers.ToolbarImage("ion_chevron_right.png"), async () => + { + var token = TokenCell?.Entry.Text.Trim().Replace(" ", ""); + await LogInAsync(token); + }, ToolbarItemOrder.Default, 0); + if(!_providerType.HasValue) { instruction.Text = AppResources.NoTwoStepAvailable; @@ -111,12 +117,6 @@ namespace Bit.App.Pages else if(_providerType.Value == TwoFactorProviderType.Authenticator || _providerType.Value == TwoFactorProviderType.Email) { - var continueToolbarItem = new ToolbarItem(AppResources.Continue, Helpers.ToolbarImage("login.png"), async () => - { - var token = TokenCell?.Entry.Text.Trim().Replace(" ", ""); - await LogInAsync(token); - }, ToolbarItemOrder.Default, 0); - var padding = Helpers.OnPlatform( iOS: new Thickness(15, 20), Android: new Thickness(15, 8), @@ -232,7 +232,7 @@ namespace Bit.App.Pages var image = new CachedImage { - Source = "yubikey", + Source = "yubikey.png", VerticalOptions = LayoutOptions.Start, HorizontalOptions = LayoutOptions.Center, WidthRequest = 266, @@ -240,9 +240,14 @@ namespace Bit.App.Pages Margin = new Thickness(0, 0, 0, 25) }; + TokenCell = new FormEntryCell("", imageSource: "lock"); + + TokenCell.Entry.ReturnType = ReturnType.Go; + var table = new TwoFactorTable( new TableSection(Helpers.GetEmptyTableSectionTitle()) { + TokenCell, RememberCell }); @@ -254,6 +259,7 @@ namespace Bit.App.Pages table.WrappingStackLayout = () => layout; scrollView.Content = layout; + ToolbarItems.Add(continueToolbarItem); Title = AppResources.YubiKeyTitle; Content = scrollView; @@ -270,6 +276,11 @@ namespace Bit.App.Pages { _deviceActionService.DismissKeyboard(); } + + if(TokenCell != null) + { + TokenCell.Entry.FocusWithDelay(); + } } private void InitEvents() @@ -312,7 +323,7 @@ namespace Bit.App.Pages { var nfcKey = _providers[TwoFactorProviderType.YubiKey].ContainsKey("Nfc") && (bool)_providers[TwoFactorProviderType.YubiKey]["Nfc"]; - if(_deviceInfoService.NfcEnabled && nfcKey) + if(_deviceInfoService.NfcEnabled && nfcKey || Device.RuntimePlatform == Device.UWP) { options.Add(AppResources.YubiKeyTitle); } @@ -453,7 +464,7 @@ namespace Bit.App.Pages break; case TwoFactorProviderType.YubiKey: var nfcKey = p.Value.ContainsKey("Nfc") && (bool)p.Value["Nfc"]; - if(!_deviceInfoService.NfcEnabled || !nfcKey) + if((!_deviceInfoService.NfcEnabled || !nfcKey) && Device.RuntimePlatform != Device.UWP) { continue; } diff --git a/src/App/Resources/AppResources.Designer.cs b/src/App/Resources/AppResources.Designer.cs index f175db098..d98da4586 100644 --- a/src/App/Resources/AppResources.Designer.cs +++ b/src/App/Resources/AppResources.Designer.cs @@ -3148,7 +3148,7 @@ namespace Bit.App.Resources { } /// - /// Looks up a localized string similar to Hold your YubiKey NEO against the back of the device to continue.. + /// Looks up a localized string similar to To continue, hold your YubiKey NEO against the back of the device or insert your YubiKey into your device's USB port, then touch its button.. /// public static string YubiKeyInstruction { get { @@ -3157,7 +3157,7 @@ namespace Bit.App.Resources { } /// - /// Looks up a localized string similar to YubiKey NEO Security Key. + /// Looks up a localized string similar to YubiKey Security Key. /// public static string YubiKeyTitle { get { diff --git a/src/App/Resources/AppResources.resx b/src/App/Resources/AppResources.resx index 52b665f9f..9d7f4c333 100644 --- a/src/App/Resources/AppResources.resx +++ b/src/App/Resources/AppResources.resx @@ -883,10 +883,10 @@ For 2FA - Hold your YubiKey NEO against the back of the device to continue. + To continue, hold your YubiKey NEO against the back of the device or insert your YubiKey into your device's USB port, then touch its button. - YubiKey NEO Security Key + YubiKey Security Key "YubiKey NEO" is the product name and should not be translated.