diff --git a/app/lib/l10n/app_en.arb b/app/lib/l10n/app_en.arb index dbeee98f..44383883 100644 --- a/app/lib/l10n/app_en.arb +++ b/app/lib/l10n/app_en.arb @@ -440,7 +440,9 @@ "settingsAppLockDescription": "If enabled, you will be asked to authenticate when you open the app", "settingsAppLockSetupBiometricFallbackDialogTitle": "Pick the fallback when biometric is not available", "settingsAppLockSetupPinDialogTitle": "Set the PIN to unlock app", + "settingsAppLockConfirmPinDialogTitle": "Input the same PIN again", "settingsAppLockSetupPasswordDialogTitle": "Set the password to unlock app", + "settingsAppLockConfirmPasswordDialogTitle": "Input the same password again", "settingsExperimentalTitle": "Experimental", "settingsExperimentalDescription": "Features that are not ready for everyday use", "settingsExpertTitle": "Advanced", diff --git a/app/lib/l10n/untranslated-messages.txt b/app/lib/l10n/untranslated-messages.txt index d6b491df..6b51c19c 100644 --- a/app/lib/l10n/untranslated-messages.txt +++ b/app/lib/l10n/untranslated-messages.txt @@ -34,7 +34,9 @@ "settingsAppLockDescription", "settingsAppLockSetupBiometricFallbackDialogTitle", "settingsAppLockSetupPinDialogTitle", + "settingsAppLockConfirmPinDialogTitle", "settingsAppLockSetupPasswordDialogTitle", + "settingsAppLockConfirmPasswordDialogTitle", "settingsAboutSectionTitle", "settingsVersionTitle", "settingsServerVersionTitle", @@ -260,7 +262,9 @@ "settingsAppLockDescription", "settingsAppLockSetupBiometricFallbackDialogTitle", "settingsAppLockSetupPinDialogTitle", + "settingsAppLockConfirmPinDialogTitle", "settingsAppLockSetupPasswordDialogTitle", + "settingsAppLockConfirmPasswordDialogTitle", "appLockUnlockHint", "appLockUnlockWrongPassword", "enabledText", @@ -283,7 +287,9 @@ "settingsAppLockDescription", "settingsAppLockSetupBiometricFallbackDialogTitle", "settingsAppLockSetupPinDialogTitle", + "settingsAppLockConfirmPinDialogTitle", "settingsAppLockSetupPasswordDialogTitle", + "settingsAppLockConfirmPasswordDialogTitle", "fileLastSharedByOthersDescription", "multipleFilesLinkShareDialogContent", "createShareProgressText", @@ -348,7 +354,9 @@ "settingsAppLockDescription", "settingsAppLockSetupBiometricFallbackDialogTitle", "settingsAppLockSetupPinDialogTitle", + "settingsAppLockConfirmPinDialogTitle", "settingsAppLockSetupPasswordDialogTitle", + "settingsAppLockConfirmPasswordDialogTitle", "settingsExpertTitle", "settingsExpertWarningText", "settingsClearCacheDatabaseTitle", @@ -449,7 +457,9 @@ "settingsAppLockDescription", "settingsAppLockSetupBiometricFallbackDialogTitle", "settingsAppLockSetupPinDialogTitle", + "settingsAppLockConfirmPinDialogTitle", "settingsAppLockSetupPasswordDialogTitle", + "settingsAppLockConfirmPasswordDialogTitle", "appLockUnlockHint", "appLockUnlockWrongPassword", "enabledText", @@ -467,7 +477,9 @@ "settingsAppLockDescription", "settingsAppLockSetupBiometricFallbackDialogTitle", "settingsAppLockSetupPinDialogTitle", + "settingsAppLockConfirmPinDialogTitle", "settingsAppLockSetupPasswordDialogTitle", + "settingsAppLockConfirmPasswordDialogTitle", "appLockUnlockHint", "appLockUnlockWrongPassword", "enabledText", @@ -485,7 +497,9 @@ "settingsAppLockDescription", "settingsAppLockSetupBiometricFallbackDialogTitle", "settingsAppLockSetupPinDialogTitle", + "settingsAppLockConfirmPinDialogTitle", "settingsAppLockSetupPasswordDialogTitle", + "settingsAppLockConfirmPasswordDialogTitle", "appLockUnlockHint", "appLockUnlockWrongPassword", "enabledText", @@ -505,7 +519,9 @@ "settingsAppLockDescription", "settingsAppLockSetupBiometricFallbackDialogTitle", "settingsAppLockSetupPinDialogTitle", + "settingsAppLockConfirmPinDialogTitle", "settingsAppLockSetupPasswordDialogTitle", + "settingsAppLockConfirmPasswordDialogTitle", "unmuteTooltip", "slideshowTooltip", "enhanceColorPopTitle", @@ -602,7 +618,9 @@ "settingsAppLockDescription", "settingsAppLockSetupBiometricFallbackDialogTitle", "settingsAppLockSetupPinDialogTitle", + "settingsAppLockConfirmPinDialogTitle", "settingsAppLockSetupPasswordDialogTitle", + "settingsAppLockConfirmPasswordDialogTitle", "settingsExperimentalTitle", "settingsExperimentalDescription", "settingsExpertTitle", @@ -894,7 +912,9 @@ "settingsAppLockDescription", "settingsAppLockSetupBiometricFallbackDialogTitle", "settingsAppLockSetupPinDialogTitle", + "settingsAppLockConfirmPinDialogTitle", "settingsAppLockSetupPasswordDialogTitle", + "settingsAppLockConfirmPasswordDialogTitle", "enhanceColorPopTitle", "imageEditTransformOrientationClockwise", "imageEditTransformOrientationCounterclockwise", @@ -920,7 +940,9 @@ "settingsAppLockDescription", "settingsAppLockSetupBiometricFallbackDialogTitle", "settingsAppLockSetupPinDialogTitle", + "settingsAppLockConfirmPinDialogTitle", "settingsAppLockSetupPasswordDialogTitle", + "settingsAppLockConfirmPasswordDialogTitle", "settingsServerVersionTitle", "searchLandingPeopleListEmptyText2", "createCollectionFailureNotification", @@ -953,7 +975,9 @@ "settingsAppLockDescription", "settingsAppLockSetupBiometricFallbackDialogTitle", "settingsAppLockSetupPinDialogTitle", + "settingsAppLockConfirmPinDialogTitle", "settingsAppLockSetupPasswordDialogTitle", + "settingsAppLockConfirmPasswordDialogTitle", "appLockUnlockHint", "appLockUnlockWrongPassword", "enabledText", @@ -971,7 +995,9 @@ "settingsAppLockDescription", "settingsAppLockSetupBiometricFallbackDialogTitle", "settingsAppLockSetupPinDialogTitle", + "settingsAppLockConfirmPinDialogTitle", "settingsAppLockSetupPasswordDialogTitle", + "settingsAppLockConfirmPasswordDialogTitle", "appLockUnlockHint", "appLockUnlockWrongPassword", "enabledText", @@ -1018,7 +1044,9 @@ "settingsAppLockDescription", "settingsAppLockSetupBiometricFallbackDialogTitle", "settingsAppLockSetupPinDialogTitle", + "settingsAppLockConfirmPinDialogTitle", "settingsAppLockSetupPasswordDialogTitle", + "settingsAppLockConfirmPasswordDialogTitle", "settingsExpertTitle", "settingsExpertWarningText", "settingsClearCacheDatabaseTitle", @@ -1161,7 +1189,9 @@ "settingsAppLockDescription", "settingsAppLockSetupBiometricFallbackDialogTitle", "settingsAppLockSetupPinDialogTitle", + "settingsAppLockConfirmPinDialogTitle", "settingsAppLockSetupPasswordDialogTitle", + "settingsAppLockConfirmPasswordDialogTitle", "settingsExpertTitle", "settingsExpertWarningText", "settingsClearCacheDatabaseTitle", diff --git a/app/lib/widget/protected_page_password_auth_dialog.dart b/app/lib/widget/protected_page_password_auth_dialog.dart index c383838f..1c7cb54b 100644 --- a/app/lib/widget/protected_page_password_auth_dialog.dart +++ b/app/lib/widget/protected_page_password_auth_dialog.dart @@ -94,6 +94,47 @@ class _WrappedProtectedPagePasswordSetupDialog extends StatelessWidget { } } +class ProtectedPagePasswordConfirmDialog extends StatelessWidget { + const ProtectedPagePasswordConfirmDialog({ + super.key, + required this.password, + }); + + @override + Widget build(BuildContext context) { + return BlocProvider( + create: (context) => _Bloc( + password: password, + ), + child: _WrappedProtectedPagePasswordConfirmDialog(), + ); + } + + final CiString password; +} + +class _WrappedProtectedPagePasswordConfirmDialog extends StatelessWidget { + @override + Widget build(BuildContext context) { + return MultiBlocListener( + listeners: [ + _BlocListenerT( + selector: (state) => state.isAuthorized, + listener: (context, isAuthorized) { + if (isAuthorized.value == true) { + Navigator.of(context).pop(true); + } + }, + ), + ], + child: AlertDialog( + title: Text(L10n.global().settingsAppLockConfirmPasswordDialogTitle), + content: const _DialogBody(), + ), + ); + } +} + // typedef _BlocBuilder = BlocBuilder<_Bloc, _State>; // typedef _BlocListener = BlocListener<_Bloc, _State>; typedef _BlocListenerT = BlocListenerT<_Bloc, _State, T>; diff --git a/app/lib/widget/protected_page_pin_auth_dialog.dart b/app/lib/widget/protected_page_pin_auth_dialog.dart index 718e3b59..9dad3ebb 100644 --- a/app/lib/widget/protected_page_pin_auth_dialog.dart +++ b/app/lib/widget/protected_page_pin_auth_dialog.dart @@ -107,6 +107,52 @@ class _WrappedProtectedPagePinSetupDialog extends StatelessWidget { } } +class ProtectedPagePinConfirmDialog extends StatelessWidget { + const ProtectedPagePinConfirmDialog({ + super.key, + required this.pin, + }); + + @override + Widget build(BuildContext context) { + return BlocProvider( + create: (context) => _Bloc( + pin: pin, + removeItemBuilder: (_, animation, value) => _RemoveItem( + animation: animation, + value: value, + ), + ), + child: _WrappedProtectedPagePinConfirmDialog(), + ); + } + + final CiString pin; +} + +class _WrappedProtectedPagePinConfirmDialog extends StatelessWidget { + @override + Widget build(BuildContext context) { + return MultiBlocListener( + listeners: [ + _BlocListenerT( + selector: (state) => state.isAuthorized, + listener: (context, isAuthorized) { + if (isAuthorized) { + Navigator.of(context).pop(true); + } + }, + ), + ], + child: AlertDialog( + title: Text(L10n.global().settingsAppLockConfirmPinDialogTitle), + scrollable: true, + content: const _DialogBody(), + ), + ); + } +} + // typedef _BlocBuilder = BlocBuilder<_Bloc, _State>; // typedef _BlocListener = BlocListener<_Bloc, _State>; typedef _BlocListenerT = BlocListenerT<_Bloc, _State, T>; diff --git a/app/lib/widget/settings/app_lock_settings.dart b/app/lib/widget/settings/app_lock_settings.dart index 5e34ed53..7bbc29c5 100644 --- a/app/lib/widget/settings/app_lock_settings.dart +++ b/app/lib/widget/settings/app_lock_settings.dart @@ -258,6 +258,13 @@ class _WrappedAppLockSettings extends StatelessWidget { if (result == null) { return null; } + final isConfirmed = await showDialog( + context: context, + builder: (_) => ProtectedPagePinConfirmDialog(pin: result), + ); + if (isConfirmed != true) { + return null; + } return context.bloc.securePrefController.setProtectedPageAuthPin(result); } @@ -269,6 +276,13 @@ class _WrappedAppLockSettings extends StatelessWidget { if (result == null) { return null; } + final isConfirmed = await showDialog( + context: context, + builder: (_) => ProtectedPagePasswordConfirmDialog(password: result), + ); + if (isConfirmed != true) { + return null; + } return context.bloc.securePrefController .setProtectedPageAuthPassword(result); }