diff --git a/src/App/Pages/Accounts/LoginApproveDevicePage.xaml b/src/App/Pages/Accounts/LoginApproveDevicePage.xaml
new file mode 100644
index 000000000..452f998e9
--- /dev/null
+++ b/src/App/Pages/Accounts/LoginApproveDevicePage.xaml
@@ -0,0 +1,54 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/App/Pages/Accounts/LoginApproveDevicePage.xaml.cs b/src/App/Pages/Accounts/LoginApproveDevicePage.xaml.cs
new file mode 100644
index 000000000..03b815253
--- /dev/null
+++ b/src/App/Pages/Accounts/LoginApproveDevicePage.xaml.cs
@@ -0,0 +1,24 @@
+using System;
+using System.Collections.Generic;
+
+using Xamarin.Forms;
+
+namespace Bit.App.Pages
+{
+ public partial class LoginApproveDevicePage : BaseContentPage
+ {
+
+ private readonly LoginApproveDeviceViewModel _vm;
+ public LoginApproveDevicePage()
+ {
+ InitializeComponent();
+ _vm = BindingContext as LoginApproveDeviceViewModel;
+ _vm.Page = this;
+ }
+
+ protected override void OnAppearing(){
+ _vm.InitAsync();
+ }
+ }
+}
+
diff --git a/src/App/Pages/Accounts/LoginApproveDeviceViewModel.cs b/src/App/Pages/Accounts/LoginApproveDeviceViewModel.cs
new file mode 100644
index 000000000..b82343529
--- /dev/null
+++ b/src/App/Pages/Accounts/LoginApproveDeviceViewModel.cs
@@ -0,0 +1,68 @@
+using System;
+using System.Threading.Tasks;
+using System.Windows.Input;
+using Bit.App.Resources;
+using Xamarin.CommunityToolkit.ObjectModel;
+
+namespace Bit.App.Pages
+{
+ public class LoginApproveDeviceViewModel : BaseViewModel
+ {
+ private bool _rememberThisDevice;
+ private bool _approveWithMyOtherDeviceEnabled;
+ private bool _requestAdminApprovalEnabled;
+ private bool _approveWithMasterPasswordEnabled;
+
+ public ICommand ApproveWithMyOtherDeviceCommand { get; }
+ public ICommand RequestAdminApprovalCommand { get; }
+ public ICommand ApproveWithMasterPasswordCommand { get; }
+
+ public LoginApproveDeviceViewModel()
+ {
+ PageTitle = AppResources.LoggedIn;
+ ApproveWithMyOtherDeviceCommand = new AsyncCommand(InitAsync,
+ onException: ex => HandleException(ex),
+ allowsMultipleExecutions: false);
+
+ RequestAdminApprovalCommand = new AsyncCommand(InitAsync,
+ onException: ex => HandleException(ex),
+ allowsMultipleExecutions: false);
+
+ ApproveWithMasterPasswordCommand = new AsyncCommand(InitAsync,
+ onException: ex => HandleException(ex),
+ allowsMultipleExecutions: false);
+ }
+
+ public bool RememberThisDevice
+ {
+ get => _rememberThisDevice;
+ set => SetProperty(ref _rememberThisDevice, value);
+ }
+
+ public bool ApproveWithMyOtherDeviceEnabled
+ {
+ get => _approveWithMyOtherDeviceEnabled;
+ set => SetProperty(ref _approveWithMyOtherDeviceEnabled, value);
+ }
+
+ public bool RequestAdminApprovalEnabled
+ {
+ get => _requestAdminApprovalEnabled;
+ set => SetProperty(ref _requestAdminApprovalEnabled, value);
+ }
+
+ public bool ApproveWithMasterPasswordEnabled
+ {
+ get => _approveWithMasterPasswordEnabled;
+ set => SetProperty(ref _approveWithMasterPasswordEnabled, value);
+ }
+
+ public async Task InitAsync()
+ {
+ ApproveWithMyOtherDeviceEnabled = true;
+ RequestAdminApprovalEnabled = true;
+ ApproveWithMasterPasswordEnabled = true;
+ }
+ }
+}
+
diff --git a/src/App/Resources/AppResources.Designer.cs b/src/App/Resources/AppResources.Designer.cs
index 2245d5f78..e9685c14c 100644
--- a/src/App/Resources/AppResources.Designer.cs
+++ b/src/App/Resources/AppResources.Designer.cs
@@ -202,6 +202,24 @@ namespace Bit.App.Resources {
}
}
+ ///
+ /// Looks up a localized string similar to Biometric unlock for this account is disabled pending verification of master password..
+ ///
+ public static string AccountBiometricInvalidated {
+ get {
+ return ResourceManager.GetString("AccountBiometricInvalidated", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Autofill biometric unlock for this account is disabled pending verification of master password..
+ ///
+ public static string AccountBiometricInvalidatedExtension {
+ get {
+ return ResourceManager.GetString("AccountBiometricInvalidatedExtension", resourceCulture);
+ }
+ }
+
///
/// Looks up a localized string similar to Your new account has been created! You may now log in..
///
@@ -544,6 +562,24 @@ namespace Bit.App.Resources {
}
}
+ ///
+ /// Looks up a localized string similar to Approve with master password.
+ ///
+ public static string ApproveWithMasterPassword {
+ get {
+ return ResourceManager.GetString("ApproveWithMasterPassword", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Approve with my other device.
+ ///
+ public static string ApproveWithMyOtherDevice {
+ get {
+ return ResourceManager.GetString("ApproveWithMyOtherDevice", resourceCulture);
+ }
+ }
+
///
/// Looks up a localized string similar to April.
///
@@ -967,24 +1003,6 @@ namespace Bit.App.Resources {
}
}
- ///
- /// Looks up a localized string similar to Biometric unlock disabled pending verification of master password..
- ///
- public static string AccountBiometricInvalidated {
- get {
- return ResourceManager.GetString("AccountBiometricInvalidated", resourceCulture);
- }
- }
-
- ///
- /// Looks up a localized string similar to Biometric unlock for autofill disabled pending verification of master password..
- ///
- public static string AccountBiometricInvalidatedExtension {
- get {
- return ResourceManager.GetString("AccountBiometricInvalidatedExtension", resourceCulture);
- }
- }
-
///
/// Looks up a localized string similar to Biometrics.
///
@@ -3550,6 +3568,15 @@ namespace Bit.App.Resources {
}
}
+ ///
+ /// Looks up a localized string similar to Logged in!.
+ ///
+ public static string LoggedIn {
+ get {
+ return ResourceManager.GetString("LoggedIn", resourceCulture);
+ }
+ }
+
///
/// Looks up a localized string similar to Logged in as {0} on {1}..
///
@@ -5138,6 +5165,15 @@ namespace Bit.App.Resources {
}
}
+ ///
+ /// Looks up a localized string similar to Remember this device.
+ ///
+ public static string RememberThisDevice {
+ get {
+ return ResourceManager.GetString("RememberThisDevice", resourceCulture);
+ }
+ }
+
///
/// Looks up a localized string similar to Remove.
///
@@ -5210,6 +5246,15 @@ namespace Bit.App.Resources {
}
}
+ ///
+ /// Looks up a localized string similar to Request admin approval.
+ ///
+ public static string RequestAdminApproval {
+ get {
+ return ResourceManager.GetString("RequestAdminApproval", resourceCulture);
+ }
+ }
+
///
/// Looks up a localized string similar to Request one-time password.
///
@@ -6200,6 +6245,15 @@ namespace Bit.App.Resources {
}
}
+ ///
+ /// Looks up a localized string similar to Turn off using a public device.
+ ///
+ public static string TurnOffUsingPublicDevice {
+ get {
+ return ResourceManager.GetString("TurnOffUsingPublicDevice", resourceCulture);
+ }
+ }
+
///
/// Looks up a localized string similar to 20 seconds.
///
diff --git a/src/App/Resources/AppResources.resx b/src/App/Resources/AppResources.resx
index 5e9c48694..05cd67030 100644
--- a/src/App/Resources/AppResources.resx
+++ b/src/App/Resources/AppResources.resx
@@ -2616,4 +2616,22 @@ Do you want to switch to this account?
Current master password
+
+ Logged in!
+
+
+ Approve with my other device
+
+
+ Request admin approval
+
+
+ Approve with master password
+
+
+ Turn off using a public device
+
+
+ Remember this device
+