1
0
mirror of https://github.com/bitwarden/mobile.git synced 2024-06-25 10:26:02 +02:00
bitwarden-mobile/src/iOS.Core/Services/DeviceActionService.cs

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

406 lines
14 KiB
C#
Raw Normal View History

2019-04-10 05:33:12 +02:00
using System;
using System.Linq;
using System.Threading.Tasks;
using Bit.App.Abstractions;
2023-09-29 16:02:19 +02:00
using Bit.Core.Resources.Localization;
using Bit.App.Utilities.Prompts;
2019-04-19 15:11:17 +02:00
using Bit.Core.Enums;
using Bit.iOS.Core.Utilities;
2019-04-10 05:33:12 +02:00
using Bit.iOS.Core.Views;
using CoreGraphics;
using Foundation;
2019-05-17 15:45:07 +02:00
using LocalAuthentication;
2019-04-10 05:33:12 +02:00
using UIKit;
2023-09-29 16:02:19 +02:00
using Bit.Core.Utilities;
2019-04-10 05:33:12 +02:00
2019-06-27 19:58:08 +02:00
namespace Bit.iOS.Core.Services
2019-04-10 05:33:12 +02:00
{
public class DeviceActionService : IDeviceActionService
{
private Toast _toast;
private UIAlertController _progressAlert;
2019-09-04 17:52:32 +02:00
private string _userAgent;
2019-04-10 05:33:12 +02:00
2019-09-04 17:52:32 +02:00
public string DeviceUserAgent
{
get
{
if (string.IsNullOrWhiteSpace(_userAgent))
2019-09-04 17:52:32 +02:00
{
2023-09-29 16:02:19 +02:00
_userAgent = $"Bitwarden_Mobile/{AppInfo.VersionString} " +
2019-09-04 17:52:32 +02:00
$"(iOS {UIDevice.CurrentDevice.SystemVersion}; Model {UIDevice.CurrentDevice.Model})";
}
return _userAgent;
}
}
2023-09-29 16:02:19 +02:00
public Bit.Core.Enums.DeviceType DeviceType => Bit.Core.Enums.DeviceType.iOS;
2019-04-19 15:11:17 +02:00
2019-04-10 05:33:12 +02:00
public bool LaunchApp(string appName)
{
throw new NotImplementedException();
}
public void Toast(string text, bool longDuration = false)
{
if (!_toast?.Dismissed ?? false)
2019-04-10 05:33:12 +02:00
{
_toast.Dismiss(false);
}
_toast = new Toast(text)
{
Duration = TimeSpan.FromSeconds(longDuration ? 5 : 3)
};
_toast.BottomMargin = 110;
_toast.LeftMargin = 20;
_toast.RightMargin = 20;
2019-04-10 05:33:12 +02:00
_toast.Show();
_toast.DismissCallback = () =>
{
_toast?.Dispose();
_toast = null;
};
}
public Task ShowLoadingAsync(string text)
{
if (_progressAlert != null)
2019-04-10 05:33:12 +02:00
{
HideLoadingAsync().GetAwaiter().GetResult();
}
var vc = GetPresentedViewController();
if (vc is null)
{
return Task.CompletedTask;
}
2019-04-10 05:33:12 +02:00
var result = new TaskCompletionSource<int>();
var loadingIndicator = new UIActivityIndicatorView(new CGRect(10, 5, 50, 50));
loadingIndicator.HidesWhenStopped = true;
loadingIndicator.ActivityIndicatorViewStyle = ThemeHelpers.LightTheme ? UIActivityIndicatorViewStyle.Gray :
UIActivityIndicatorViewStyle.White;
2019-04-10 05:33:12 +02:00
loadingIndicator.StartAnimating();
_progressAlert = UIAlertController.Create(null, text, UIAlertControllerStyle.Alert);
_progressAlert.View.TintColor = UIColor.Black;
_progressAlert.View.Add(loadingIndicator);
vc.PresentViewController(_progressAlert, false, () => result.TrySetResult(0));
2019-04-10 05:33:12 +02:00
return result.Task;
}
public Task HideLoadingAsync()
{
var result = new TaskCompletionSource<int>();
if (_progressAlert == null)
2019-04-10 05:33:12 +02:00
{
result.TrySetResult(0);
2021-08-12 15:23:02 +02:00
return result.Task;
2019-04-10 05:33:12 +02:00
}
2021-08-12 15:23:02 +02:00
2019-04-10 05:33:12 +02:00
_progressAlert.DismissViewController(false, () => result.TrySetResult(0));
_progressAlert.Dispose();
_progressAlert = null;
return result.Task;
}
2019-05-09 17:44:27 +02:00
public Task<string> DisplayPromptAync(string title = null, string description = null,
2019-05-16 21:54:21 +02:00
string text = null, string okButtonText = null, string cancelButtonText = null,
bool numericKeyboard = false, bool autofocus = true, bool password = false)
2019-05-09 17:44:27 +02:00
{
var vc = GetPresentedViewController();
if (vc is null)
{
return null;
}
2019-05-09 17:44:27 +02:00
var result = new TaskCompletionSource<string>();
var alert = UIAlertController.Create(title ?? string.Empty, description, UIAlertControllerStyle.Alert);
UITextField input = null;
okButtonText = okButtonText ?? AppResources.Ok;
cancelButtonText = cancelButtonText ?? AppResources.Cancel;
alert.AddAction(UIAlertAction.Create(cancelButtonText, UIAlertActionStyle.Cancel, x =>
{
result.TrySetResult(null);
}));
alert.AddAction(UIAlertAction.Create(okButtonText, UIAlertActionStyle.Default, x =>
{
result.TrySetResult(input.Text ?? string.Empty);
}));
alert.AddTextField(x =>
{
input = x;
input.Text = text ?? string.Empty;
if (numericKeyboard)
2019-05-16 21:54:21 +02:00
{
input.KeyboardType = UIKeyboardType.NumberPad;
}
if (password) {
input.SecureTextEntry = true;
}
if (!ThemeHelpers.LightTheme)
{
input.KeyboardAppearance = UIKeyboardAppearance.Dark;
}
2019-05-09 17:44:27 +02:00
});
vc.PresentViewController(alert, true, null);
2019-05-09 17:44:27 +02:00
return result.Task;
}
public Task<ValidatablePromptResponse?> DisplayValidatablePromptAsync(ValidatablePromptConfig config)
{
throw new NotImplementedException();
}
2019-05-15 19:09:49 +02:00
public void RateApp()
{
string uri = null;
if (SystemMajorVersion() < 11)
2019-05-15 19:09:49 +02:00
{
uri = "itms-apps://itunes.apple.com/WebObjects/MZStore.woa/wa/viewContentsUserReviews" +
"?id=1137397744&onlyLatestVersion=true&pageNumber=0&sortOrdering=1&type=Purple+Software";
}
else
{
uri = "itms-apps://itunes.apple.com/us/app/id1137397744?action=write-review";
}
2023-09-29 16:02:19 +02:00
Launcher.OpenAsync(uri).FireAndForget();
2019-05-15 19:09:49 +02:00
}
2019-10-23 15:11:48 +02:00
public bool SupportsFaceBiometric()
2019-05-17 15:45:07 +02:00
{
if (SystemMajorVersion() < 11)
2019-05-17 15:45:07 +02:00
{
return false;
}
using (var context = new LAContext())
2019-10-23 15:11:48 +02:00
{
if (!context.CanEvaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics, out var e))
2019-10-23 15:11:48 +02:00
{
return false;
}
return context.BiometryType == LABiometryType.FaceId;
}
}
public Task<bool> SupportsFaceBiometricAsync()
{
return Task.FromResult(SupportsFaceBiometric());
}
2019-05-17 18:03:35 +02:00
public bool SupportsNfc()
{
if(Application.Current is App.App currentApp && !currentApp.Options.IosExtension)
{
return CoreNFC.NFCNdefReaderSession.ReadingAvailable;
}
return false;
2019-05-17 18:03:35 +02:00
}
public bool SupportsCamera()
{
return true;
}
2019-05-17 19:46:32 +02:00
public int SystemMajorVersion()
{
var versionParts = UIDevice.CurrentDevice.SystemVersion.Split('.');
if (versionParts.Length > 0 && int.TryParse(versionParts[0], out var version))
2019-05-17 19:46:32 +02:00
{
return version;
}
// unable to determine version
return -1;
}
public string SystemModel()
{
return UIDevice.CurrentDevice.Model;
}
2019-05-17 20:04:16 +02:00
public Task<string> DisplayAlertAsync(string title, string message, string cancel, params string[] buttons)
{
var vc = GetPresentedViewController();
if (vc is null)
{
return null;
}
2019-05-17 20:04:16 +02:00
var result = new TaskCompletionSource<string>();
var alert = UIAlertController.Create(title ?? string.Empty, message, UIAlertControllerStyle.Alert);
if (!string.IsNullOrWhiteSpace(cancel))
2019-05-17 20:04:16 +02:00
{
alert.AddAction(UIAlertAction.Create(cancel, UIAlertActionStyle.Cancel, x =>
{
result.TrySetResult(cancel);
}));
}
foreach (var button in buttons)
2019-05-17 20:04:16 +02:00
{
alert.AddAction(UIAlertAction.Create(button, UIAlertActionStyle.Default, x =>
{
result.TrySetResult(button);
}));
}
vc.PresentViewController(alert, true, null);
2019-05-17 20:04:16 +02:00
return result.Task;
}
[Auto Logout] Final review of feature (#932) * Initial commit of LockService name refactor (#831) * [Auto-Logout] Update Service layer logic (#835) * Initial commit of service logic update * Added default value for action * Updated ToggleTokensAsync conditional * Removed unused variables, updated action conditional * Initial commit: lockOption/lock refactor app layer (#840) * [Auto-Logout] Settings Refactor - Application Layer Part 2 (#844) * Initial commit of app layer part 2 * Updated biometrics position * Reverted resource name refactor * LockOptions refactor revert * Updated method casing :: Removed VaultTimeout prefix for timeouts * Fixed dupe string resource (#854) * Updated dependency to use VaultTimeoutService (#896) * [Auto Logout] Xamarin Forms in AutoFill flow (iOS) (#902) * fix typo in PINRequireMasterPasswordRestart (#900) * initial commit for xf usage in autofill * Fixed databinding for hint button * Updated Two Factor page launch - removed unused imports * First pass at broadcast/messenger implentation for autofill * setting theme in extension using theme manager * extension app resources * App resources from main app * fix ref to twoFactorPage * apply resources to page * load empty app for sytling in extension * move ios renderers to ios core * static ref to resources and GetResourceColor helper * fix method ref * move application.current.resources refs to helper * switch login page alerts to device action dialogs * run on main thread * showDialog with device action service * abstract action sheet to device action service * add support for yubikey * add yubikey iimages to extension * support close button action * add support to action extension * remove empty lines Co-authored-by: Jonas Kittner <54631600+theendlessriver13@users.noreply.github.com> Co-authored-by: Kyle Spearrin <kyle.spearrin@gmail.com> * [Auto Logout] Update lock option to be default value (#929) * Initial commit - make lock action default * Removed extra whitespace Co-authored-by: Jonas Kittner <54631600+theendlessriver13@users.noreply.github.com> Co-authored-by: Kyle Spearrin <kyle.spearrin@gmail.com> Co-authored-by: Kyle Spearrin <kspearrin@users.noreply.github.com>
2020-05-29 18:26:36 +02:00
public Task<string> DisplayActionSheetAsync(string title, string cancel, string destruction,
params string[] buttons)
{
if (Application.Current is App.App app && app.Options != null && !app.Options.IosExtension)
[Auto Logout] Final review of feature (#932) * Initial commit of LockService name refactor (#831) * [Auto-Logout] Update Service layer logic (#835) * Initial commit of service logic update * Added default value for action * Updated ToggleTokensAsync conditional * Removed unused variables, updated action conditional * Initial commit: lockOption/lock refactor app layer (#840) * [Auto-Logout] Settings Refactor - Application Layer Part 2 (#844) * Initial commit of app layer part 2 * Updated biometrics position * Reverted resource name refactor * LockOptions refactor revert * Updated method casing :: Removed VaultTimeout prefix for timeouts * Fixed dupe string resource (#854) * Updated dependency to use VaultTimeoutService (#896) * [Auto Logout] Xamarin Forms in AutoFill flow (iOS) (#902) * fix typo in PINRequireMasterPasswordRestart (#900) * initial commit for xf usage in autofill * Fixed databinding for hint button * Updated Two Factor page launch - removed unused imports * First pass at broadcast/messenger implentation for autofill * setting theme in extension using theme manager * extension app resources * App resources from main app * fix ref to twoFactorPage * apply resources to page * load empty app for sytling in extension * move ios renderers to ios core * static ref to resources and GetResourceColor helper * fix method ref * move application.current.resources refs to helper * switch login page alerts to device action dialogs * run on main thread * showDialog with device action service * abstract action sheet to device action service * add support for yubikey * add yubikey iimages to extension * support close button action * add support to action extension * remove empty lines Co-authored-by: Jonas Kittner <54631600+theendlessriver13@users.noreply.github.com> Co-authored-by: Kyle Spearrin <kyle.spearrin@gmail.com> * [Auto Logout] Update lock option to be default value (#929) * Initial commit - make lock action default * Removed extra whitespace Co-authored-by: Jonas Kittner <54631600+theendlessriver13@users.noreply.github.com> Co-authored-by: Kyle Spearrin <kyle.spearrin@gmail.com> Co-authored-by: Kyle Spearrin <kspearrin@users.noreply.github.com>
2020-05-29 18:26:36 +02:00
{
return app.MainPage.DisplayActionSheet(title, cancel, destruction, buttons);
}
var vc = GetPresentedViewController();
if (vc is null)
{
return null;
}
var result = new TaskCompletionSource<string>();
[Auto Logout] Final review of feature (#932) * Initial commit of LockService name refactor (#831) * [Auto-Logout] Update Service layer logic (#835) * Initial commit of service logic update * Added default value for action * Updated ToggleTokensAsync conditional * Removed unused variables, updated action conditional * Initial commit: lockOption/lock refactor app layer (#840) * [Auto-Logout] Settings Refactor - Application Layer Part 2 (#844) * Initial commit of app layer part 2 * Updated biometrics position * Reverted resource name refactor * LockOptions refactor revert * Updated method casing :: Removed VaultTimeout prefix for timeouts * Fixed dupe string resource (#854) * Updated dependency to use VaultTimeoutService (#896) * [Auto Logout] Xamarin Forms in AutoFill flow (iOS) (#902) * fix typo in PINRequireMasterPasswordRestart (#900) * initial commit for xf usage in autofill * Fixed databinding for hint button * Updated Two Factor page launch - removed unused imports * First pass at broadcast/messenger implentation for autofill * setting theme in extension using theme manager * extension app resources * App resources from main app * fix ref to twoFactorPage * apply resources to page * load empty app for sytling in extension * move ios renderers to ios core * static ref to resources and GetResourceColor helper * fix method ref * move application.current.resources refs to helper * switch login page alerts to device action dialogs * run on main thread * showDialog with device action service * abstract action sheet to device action service * add support for yubikey * add yubikey iimages to extension * support close button action * add support to action extension * remove empty lines Co-authored-by: Jonas Kittner <54631600+theendlessriver13@users.noreply.github.com> Co-authored-by: Kyle Spearrin <kyle.spearrin@gmail.com> * [Auto Logout] Update lock option to be default value (#929) * Initial commit - make lock action default * Removed extra whitespace Co-authored-by: Jonas Kittner <54631600+theendlessriver13@users.noreply.github.com> Co-authored-by: Kyle Spearrin <kyle.spearrin@gmail.com> Co-authored-by: Kyle Spearrin <kspearrin@users.noreply.github.com>
2020-05-29 18:26:36 +02:00
var sheet = UIAlertController.Create(title, null, UIAlertControllerStyle.ActionSheet);
if (UIDevice.CurrentDevice.UserInterfaceIdiom == UIUserInterfaceIdiom.Pad)
{
var x = vc.View.Bounds.Width / 2;
var y = vc.View.Bounds.Bottom;
var rect = new CGRect(x, y, 0, 0);
sheet.PopoverPresentationController.SourceView = vc.View;
sheet.PopoverPresentationController.SourceRect = rect;
sheet.PopoverPresentationController.PermittedArrowDirections = UIPopoverArrowDirection.Unknown;
}
foreach (var button in buttons)
{
sheet.AddAction(UIAlertAction.Create(button, UIAlertActionStyle.Default,
x => result.TrySetResult(button)));
}
if (!string.IsNullOrWhiteSpace(destruction))
{
sheet.AddAction(UIAlertAction.Create(destruction, UIAlertActionStyle.Destructive,
x => result.TrySetResult(destruction)));
}
if (!string.IsNullOrWhiteSpace(cancel))
{
sheet.AddAction(UIAlertAction.Create(cancel, UIAlertActionStyle.Cancel,
x => result.TrySetResult(cancel)));
}
vc.PresentViewController(sheet, true, null);
return result.Task;
}
2019-06-11 20:46:11 +02:00
public string GetBuildNumber()
{
return NSBundle.MainBundle.InfoDictionary["CFBundleVersion"].ToString();
}
public void OpenAccessibilitySettings()
{
throw new NotImplementedException();
}
public void OpenCredentialProviderSettings() => throw new NotImplementedException();
2019-06-11 20:46:11 +02:00
public void OpenAutofillSettings()
{
throw new NotImplementedException();
}
public long GetActiveTime()
{
// Fall back to UnixTimeMilliseconds in case this approach stops working. We'll lose clock-change
// protection but the lock functionality will continue to work.
return iOSHelpers.GetSystemUpTimeMilliseconds() ?? DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
}
public void CloseMainApp()
{
throw new NotImplementedException();
}
public bool SupportsFido2()
{
// FIDO2 WebAuthn supported on 13.3+
var versionParts = UIDevice.CurrentDevice.SystemVersion.Split('.');
if (versionParts.Length > 0 && int.TryParse(versionParts[0], out var version))
{
if (version == 13)
{
if (versionParts.Length > 1 && int.TryParse(versionParts[1], out var minorVersion))
{
return minorVersion >= 3;
}
}
else if (version > 13)
{
return true;
}
}
return false;
}
public bool SupportsCredentialProviderService() => throw new NotImplementedException();
[PM-2658] Settings Reorganization feature (#2702) * [PM-2658] Settings Reorganization Init (#2697) * PM-2658 Started settings reorganization (settings main + vault + about) * PM-2658 Added settings controls based on templates and implemented OtherSettingsPage * PM-2658 Fix format * [PM-3512] Settings Appearance (#2703) * PM-3512 Implemented new Appearance Settings * PM-3512 Fix format * [PM-3510] Implement Account Security Settings view (#2714) * PM-3510 Implemented Security settings view * PM-3510 Fix format * PM-3510 Added empty placeholder to pending login requests and also improved a11y on security settings view. * PM-3511 Implemented autofill settings view (#2735) * [PM-3695] Add Connect to Watch to Other settings (#2736) * PM-3511 Implemented autofill settings view * PM-3695 Add Connect to watch setting to other settings view * [PM-3693] Clear old Settings approach (#2737) * PM-3511 Implemented autofill settings view * PM-3693 Remove old Settings approach * PM-3845 Fix default dark theme description verbiage (#2759) * PM-3839 Fix allow screen capture and submit crash logs to init their state when the page appears (#2760) * PM-3834 Fix dialogs strings on settings (#2758) * [PM-3834] Fix import items link (#2782) * PM-3834 Fix import items link * PM-3834 Fix import items link, removed old link. * [PM-4092] Fix vault timeout policies on new Settings (#2796) * PM-4092 Fix vault timeout policy on settings for disabling controls and reset timeout when surpassing maximum * PM-4092 Removed testing hardcoding of policy data
2023-09-27 21:26:12 +02:00
public bool SupportsAutofillServices() => UIDevice.CurrentDevice.CheckSystemVersion(12, 0);
public bool SupportsInlineAutofill() => false;
public bool SupportsDrawOver() => false;
2019-04-10 05:33:12 +02:00
private UIViewController GetPresentedViewController()
{
var window = UIApplication.SharedApplication.KeyWindow;
var vc = window.RootViewController;
while (vc.PresentedViewController != null)
2019-04-10 05:33:12 +02:00
{
vc = vc.PresentedViewController;
}
return vc;
}
private bool TabBarVisible()
{
var vc = GetPresentedViewController();
return vc != null && (vc is UITabBarController ||
(vc.ChildViewControllers?.Any(c => c is UITabBarController) ?? false));
}
2019-05-09 17:44:27 +02:00
public void OpenAccessibilityOverlayPermissionSettings()
{
throw new NotImplementedException();
}
public float GetSystemFontSizeScale()
{
var tempHeight = 20f;
var scaledHeight = (float)new UIFontMetrics(UIFontTextStyle.Body.GetConstant()).GetScaledValue(tempHeight);
return scaledHeight / tempHeight;
}
public async Task OnAccountSwitchCompleteAsync()
{
await ASHelpers.ReplaceAllIdentities();
}
public Task SetScreenCaptureAllowedAsync()
{
// only used by Android. Not possible in iOS
return Task.CompletedTask;
}
Passwordless feature branch PR (#2100) * [SG-471] Passwordless device login screen (#2017) * [SSG-471] Added UI for the device login request response. * [SG-471] Added text resources and arguments to Page. * [SG-471] Added properties to speed up page bindings * [SG-471] Added mock services. Added Accept/reject command binding, navigation and toast messages. * [SG-471] fixed code styling with dotnet-format * [SG-471] Fixed back button placement. PR fixes. * [SG-471] Added new Origin parameter to the page. * [SG-471] PR Fixes * [SG-471] PR fixes * [SG-471] PR Fix: added FireAndForget. * [SG-471] Moved fire and forget to run on ui thread task. * [SG-381] Passwordless - Add setting to Mobile (#2037) * [SG-381] Added settings option to approve passwordless login request. If user has notifications disabled, prompt to go to settings and enable them. * [SG-381] Update settings pop up texts. * [SG-381] Added new method to get notifications state on device settings. Added userId to property saved on device to differentiate value between users. * [SG-381] Added text for the popup on selection. * [SG-381] PR Fixes * [SG-408] Implement passwordless api methods (#2055) * [SG-408] Update notification model. * [SG-408] removed duplicated resource * [SG-408] Added implementation to Api Service of new passwordless methods. * removed qa endpoints * [SG-408] Changed auth methods implementation, added method call to viewmodel. * [SG-408] ran code format * [SG-408] PR fixes * [SG-472] Add configuration for new notification type (#2056) * [SG-472] Added methods to present local notification to the user. Configured new notification type for passwordless logins * [SG-472] Updated code to new api service changes. * [SG-472] ran dotnet format * [SG-472] PR Fixes. * [SG-472] PR Fixes * [SG-169] End-to-end testing refactor. (#2073) * [SG-169] Passwordless demo change requests (#2079) * [SG-169] End-to-end testing refactor. * [SG-169] Fixed labels. Changed color of Fingerprint phrase. Waited for app to be in foreground to launch passwordless modal to fix Android issues. * [SG-169] Anchored buttons to the bottom of the screen. * [SG-169] Changed device type from enum to string. * [SG-169] PR fixes * [SG-169] PR fixes * [SG-169] Added comment on static variable
2022-09-26 19:27:57 +02:00
public void OpenAppSettings()
{
var url = new NSUrl(UIApplication.OpenSettingsUrlString);
UIApplication.SharedApplication.OpenUrl(url);
}
public void CloseExtensionPopUp()
{
GetPresentedViewController().DismissViewController(true, null);
}
[PM-2658] Settings Reorganization feature (#2702) * [PM-2658] Settings Reorganization Init (#2697) * PM-2658 Started settings reorganization (settings main + vault + about) * PM-2658 Added settings controls based on templates and implemented OtherSettingsPage * PM-2658 Fix format * [PM-3512] Settings Appearance (#2703) * PM-3512 Implemented new Appearance Settings * PM-3512 Fix format * [PM-3510] Implement Account Security Settings view (#2714) * PM-3510 Implemented Security settings view * PM-3510 Fix format * PM-3510 Added empty placeholder to pending login requests and also improved a11y on security settings view. * PM-3511 Implemented autofill settings view (#2735) * [PM-3695] Add Connect to Watch to Other settings (#2736) * PM-3511 Implemented autofill settings view * PM-3695 Add Connect to watch setting to other settings view * [PM-3693] Clear old Settings approach (#2737) * PM-3511 Implemented autofill settings view * PM-3693 Remove old Settings approach * PM-3845 Fix default dark theme description verbiage (#2759) * PM-3839 Fix allow screen capture and submit crash logs to init their state when the page appears (#2760) * PM-3834 Fix dialogs strings on settings (#2758) * [PM-3834] Fix import items link (#2782) * PM-3834 Fix import items link * PM-3834 Fix import items link, removed old link. * [PM-4092] Fix vault timeout policies on new Settings (#2796) * PM-4092 Fix vault timeout policy on settings for disabling controls and reset timeout when surpassing maximum * PM-4092 Removed testing hardcoding of policy data
2023-09-27 21:26:12 +02:00
public string GetAutofillAccessibilityDescription() => null;
public string GetAutofillDrawOverDescription() => null;
2019-04-10 05:33:12 +02:00
}
}