mirror of
https://github.com/bitwarden/android.git
synced 2024-10-31 15:15:34 +03:00
[Key Connector] Hide MP input in iOS extensions (#1656)
* Hide MP on iOS unlock screen * Update navbar if using biometric auth only * Tidy up logic
This commit is contained in:
parent
316cb4d21c
commit
ff35e3c022
1 changed files with 88 additions and 40 deletions
|
@ -34,6 +34,7 @@ namespace Bit.iOS.Core.Controllers
|
||||||
private bool _biometricIntegrityValid = true;
|
private bool _biometricIntegrityValid = true;
|
||||||
private bool _passwordReprompt = false;
|
private bool _passwordReprompt = false;
|
||||||
private bool _usesKeyConnector;
|
private bool _usesKeyConnector;
|
||||||
|
private bool _biometricUnlockOnly = false;
|
||||||
|
|
||||||
protected bool autofillExtension = false;
|
protected bool autofillExtension = false;
|
||||||
|
|
||||||
|
@ -52,6 +53,30 @@ namespace Bit.iOS.Core.Controllers
|
||||||
|
|
||||||
public string BiometricIntegrityKey { get; set; }
|
public string BiometricIntegrityKey { get; set; }
|
||||||
|
|
||||||
|
public UITableViewCell BiometricCell
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
var cell = new UITableViewCell();
|
||||||
|
if (_biometricIntegrityValid)
|
||||||
|
{
|
||||||
|
var biometricButtonText = _deviceActionService.SupportsFaceBiometric() ?
|
||||||
|
AppResources.UseFaceIDToUnlock : AppResources.UseFingerprintToUnlock;
|
||||||
|
cell.TextLabel.TextColor = ThemeHelpers.PrimaryColor;
|
||||||
|
cell.TextLabel.Text = biometricButtonText;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
cell.TextLabel.TextColor = ThemeHelpers.DangerColor;
|
||||||
|
cell.TextLabel.Font = ThemeHelpers.GetDangerFont();
|
||||||
|
cell.TextLabel.Lines = 0;
|
||||||
|
cell.TextLabel.LineBreakMode = UILineBreakMode.WordWrap;
|
||||||
|
cell.TextLabel.Text = AppResources.BiometricInvalidatedExtension;
|
||||||
|
}
|
||||||
|
return cell;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public override async void ViewDidLoad()
|
public override async void ViewDidLoad()
|
||||||
{
|
{
|
||||||
_vaultTimeoutService = ServiceContainer.Resolve<IVaultTimeoutService>("vaultTimeoutService");
|
_vaultTimeoutService = ServiceContainer.Resolve<IVaultTimeoutService>("vaultTimeoutService");
|
||||||
|
@ -82,32 +107,57 @@ namespace Bit.iOS.Core.Controllers
|
||||||
_biometricIntegrityValid = _biometricService.ValidateIntegrityAsync(BiometricIntegrityKey).GetAwaiter()
|
_biometricIntegrityValid = _biometricService.ValidateIntegrityAsync(BiometricIntegrityKey).GetAwaiter()
|
||||||
.GetResult();
|
.GetResult();
|
||||||
_usesKeyConnector = await _keyConnectorService.GetUsesKeyConnector();
|
_usesKeyConnector = await _keyConnectorService.GetUsesKeyConnector();
|
||||||
|
_biometricUnlockOnly = _usesKeyConnector && _biometricLock && !_pinLock;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_pinLock)
|
||||||
|
{
|
||||||
|
BaseNavItem.Title = AppResources.VerifyPIN;
|
||||||
|
}
|
||||||
|
else if (_usesKeyConnector)
|
||||||
|
{
|
||||||
|
BaseNavItem.Title = AppResources.UnlockVault;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
BaseNavItem.Title = AppResources.VerifyMasterPassword;
|
||||||
}
|
}
|
||||||
|
|
||||||
BaseNavItem.Title = _pinLock ? AppResources.VerifyPIN : AppResources.VerifyMasterPassword;
|
|
||||||
BaseCancelButton.Title = AppResources.Cancel;
|
BaseCancelButton.Title = AppResources.Cancel;
|
||||||
BaseSubmitButton.Title = AppResources.Submit;
|
|
||||||
|
if (_biometricUnlockOnly)
|
||||||
|
{
|
||||||
|
BaseSubmitButton.Title = null;
|
||||||
|
BaseSubmitButton.Enabled = false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
BaseSubmitButton.Title = AppResources.Submit;
|
||||||
|
}
|
||||||
|
|
||||||
var descriptor = UIFontDescriptor.PreferredBody;
|
var descriptor = UIFontDescriptor.PreferredBody;
|
||||||
|
|
||||||
MasterPasswordCell.Label.Text = _pinLock ? AppResources.PIN : AppResources.MasterPassword;
|
if (!_biometricUnlockOnly)
|
||||||
MasterPasswordCell.TextField.SecureTextEntry = true;
|
|
||||||
MasterPasswordCell.TextField.ReturnKeyType = UIReturnKeyType.Go;
|
|
||||||
MasterPasswordCell.TextField.ShouldReturn += (UITextField tf) =>
|
|
||||||
{
|
{
|
||||||
CheckPasswordAsync().GetAwaiter().GetResult();
|
MasterPasswordCell.Label.Text = _pinLock ? AppResources.PIN : AppResources.MasterPassword;
|
||||||
return true;
|
MasterPasswordCell.TextField.SecureTextEntry = true;
|
||||||
};
|
MasterPasswordCell.TextField.ReturnKeyType = UIReturnKeyType.Go;
|
||||||
if (_pinLock)
|
MasterPasswordCell.TextField.ShouldReturn += (UITextField tf) =>
|
||||||
{
|
{
|
||||||
MasterPasswordCell.TextField.KeyboardType = UIKeyboardType.NumberPad;
|
CheckPasswordAsync().GetAwaiter().GetResult();
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
if (_pinLock)
|
||||||
|
{
|
||||||
|
MasterPasswordCell.TextField.KeyboardType = UIKeyboardType.NumberPad;
|
||||||
|
}
|
||||||
|
MasterPasswordCell.Button.TitleLabel.Font = UIFont.FromName("FontAwesome", 28f);
|
||||||
|
MasterPasswordCell.Button.SetTitle("\uf06e", UIControlState.Normal);
|
||||||
|
MasterPasswordCell.Button.TouchUpInside += (sender, e) => {
|
||||||
|
MasterPasswordCell.TextField.SecureTextEntry = !MasterPasswordCell.TextField.SecureTextEntry;
|
||||||
|
MasterPasswordCell.Button.SetTitle(MasterPasswordCell.TextField.SecureTextEntry ? "\uf06e" : "\uf070", UIControlState.Normal);
|
||||||
|
};
|
||||||
}
|
}
|
||||||
MasterPasswordCell.Button.TitleLabel.Font = UIFont.FromName("FontAwesome", 28f);
|
|
||||||
MasterPasswordCell.Button.SetTitle("\uf06e", UIControlState.Normal);
|
|
||||||
MasterPasswordCell.Button.TouchUpInside += (sender, e) => {
|
|
||||||
MasterPasswordCell.TextField.SecureTextEntry = !MasterPasswordCell.TextField.SecureTextEntry;
|
|
||||||
MasterPasswordCell.Button.SetTitle(MasterPasswordCell.TextField.SecureTextEntry ? "\uf06e" : "\uf070", UIControlState.Normal);
|
|
||||||
};
|
|
||||||
|
|
||||||
TableView.RowHeight = UITableView.AutomaticDimension;
|
TableView.RowHeight = UITableView.AutomaticDimension;
|
||||||
TableView.EstimatedRowHeight = 70;
|
TableView.EstimatedRowHeight = 70;
|
||||||
|
@ -143,9 +193,6 @@ namespace Bit.iOS.Core.Controllers
|
||||||
{
|
{
|
||||||
MasterPasswordCell.TextField.BecomeFirstResponder();
|
MasterPasswordCell.TextField.BecomeFirstResponder();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected async Task CheckPasswordAsync()
|
protected async Task CheckPasswordAsync()
|
||||||
|
@ -355,38 +402,34 @@ namespace Bit.iOS.Core.Controllers
|
||||||
{
|
{
|
||||||
if (indexPath.Row == 0)
|
if (indexPath.Row == 0)
|
||||||
{
|
{
|
||||||
return _controller.MasterPasswordCell;
|
if (_controller._biometricUnlockOnly)
|
||||||
|
{
|
||||||
|
return _controller.BiometricCell;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return _controller.MasterPasswordCell;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (indexPath.Section == 1)
|
else if (indexPath.Section == 1)
|
||||||
{
|
{
|
||||||
if (indexPath.Row == 0)
|
if (indexPath.Row == 0)
|
||||||
{
|
{
|
||||||
var cell = new ExtendedUITableViewCell();
|
|
||||||
if (_controller._passwordReprompt)
|
if (_controller._passwordReprompt)
|
||||||
{
|
{
|
||||||
|
var cell = new ExtendedUITableViewCell();
|
||||||
cell.TextLabel.TextColor = ThemeHelpers.DangerColor;
|
cell.TextLabel.TextColor = ThemeHelpers.DangerColor;
|
||||||
cell.TextLabel.Font = ThemeHelpers.GetDangerFont();
|
cell.TextLabel.Font = ThemeHelpers.GetDangerFont();
|
||||||
cell.TextLabel.Lines = 0;
|
cell.TextLabel.Lines = 0;
|
||||||
cell.TextLabel.LineBreakMode = UILineBreakMode.WordWrap;
|
cell.TextLabel.LineBreakMode = UILineBreakMode.WordWrap;
|
||||||
cell.TextLabel.Text = AppResources.PasswordConfirmationDesc;
|
cell.TextLabel.Text = AppResources.PasswordConfirmationDesc;
|
||||||
|
return cell;
|
||||||
}
|
}
|
||||||
else if (_controller._biometricIntegrityValid)
|
else if (!_controller._biometricUnlockOnly)
|
||||||
{
|
{
|
||||||
var biometricButtonText = _controller._deviceActionService.SupportsFaceBiometric() ?
|
return _controller.BiometricCell;
|
||||||
AppResources.UseFaceIDToUnlock : AppResources.UseFingerprintToUnlock;
|
|
||||||
cell.TextLabel.TextColor = ThemeHelpers.PrimaryColor;
|
|
||||||
cell.TextLabel.Text = biometricButtonText;
|
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
cell.TextLabel.TextColor = ThemeHelpers.DangerColor;
|
|
||||||
cell.TextLabel.Font = ThemeHelpers.GetDangerFont();
|
|
||||||
cell.TextLabel.Lines = 0;
|
|
||||||
cell.TextLabel.LineBreakMode = UILineBreakMode.WordWrap;
|
|
||||||
cell.TextLabel.Text = AppResources.BiometricInvalidatedExtension;
|
|
||||||
}
|
|
||||||
return cell;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return new ExtendedUITableViewCell();
|
return new ExtendedUITableViewCell();
|
||||||
|
@ -399,7 +442,10 @@ namespace Bit.iOS.Core.Controllers
|
||||||
|
|
||||||
public override nint NumberOfSections(UITableView tableView)
|
public override nint NumberOfSections(UITableView tableView)
|
||||||
{
|
{
|
||||||
return _controller._biometricLock || _controller._passwordReprompt ? 2 : 1;
|
return (!_controller._biometricUnlockOnly && _controller._biometricLock) ||
|
||||||
|
_controller._passwordReprompt
|
||||||
|
? 2
|
||||||
|
: 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override nint RowsInSection(UITableView tableview, nint section)
|
public override nint RowsInSection(UITableView tableview, nint section)
|
||||||
|
@ -425,7 +471,9 @@ namespace Bit.iOS.Core.Controllers
|
||||||
{
|
{
|
||||||
tableView.DeselectRow(indexPath, true);
|
tableView.DeselectRow(indexPath, true);
|
||||||
tableView.EndEditing(true);
|
tableView.EndEditing(true);
|
||||||
if (indexPath.Section == 1 && indexPath.Row == 0)
|
if (indexPath.Row == 0 &&
|
||||||
|
((_controller._biometricUnlockOnly && indexPath.Section == 0) ||
|
||||||
|
indexPath.Section == 1))
|
||||||
{
|
{
|
||||||
var task = _controller.PromptBiometricAsync();
|
var task = _controller.PromptBiometricAsync();
|
||||||
return;
|
return;
|
||||||
|
|
Loading…
Reference in a new issue