diff --git a/lib/core/wallet_loading_service.dart b/lib/core/wallet_loading_service.dart index d67a43dc4..10236716d 100644 --- a/lib/core/wallet_loading_service.dart +++ b/lib/core/wallet_loading_service.dart @@ -27,7 +27,7 @@ class WalletLoadingService { // otherwise keeps duplicate (old and new names) await keyService.deleteWalletPassword(walletName: name); - await walletService.rename(name, password, newName); + await walletService.rename(name, walletPassword, newName); // set shared preferences flag based on previous wallet name if (type == WalletType.monero) { diff --git a/lib/di.dart b/lib/di.dart index a778b22a9..5e181e853 100644 --- a/lib/di.dart +++ b/lib/di.dart @@ -1108,6 +1108,7 @@ Future setup({ return WalletUnlockPage( getIt.get(param1: args), args.callback, + args.authPasswordHandler, closable: closable); }, instanceName: 'wallet_unlock_loadable'); @@ -1115,6 +1116,7 @@ Future setup({ return WalletUnlockPage( getIt.get(param1: args), args.callback, + args.authPasswordHandler, closable: closable); }, instanceName: 'wallet_unlock_verifiable'); diff --git a/lib/src/screens/wallet/wallet_edit_page.dart b/lib/src/screens/wallet/wallet_edit_page.dart index 7c90ba2c5..f32528667 100644 --- a/lib/src/screens/wallet/wallet_edit_page.dart +++ b/lib/src/screens/wallet/wallet_edit_page.dart @@ -2,8 +2,12 @@ import 'package:another_flushbar/flushbar.dart'; import 'package:cake_wallet/core/auth_service.dart'; import 'package:cake_wallet/core/wallet_name_validator.dart'; import 'package:cake_wallet/palette.dart'; +import 'package:cake_wallet/routes.dart'; +import 'package:cake_wallet/src/screens/auth/auth_page.dart'; +import 'package:cake_wallet/src/screens/wallet_unlock/wallet_unlock_arguments.dart'; import 'package:cake_wallet/src/widgets/alert_with_one_action.dart'; import 'package:cake_wallet/src/widgets/alert_with_two_actions.dart'; +import 'package:cake_wallet/store/settings_store.dart'; import 'package:cake_wallet/utils/show_bar.dart'; import 'package:cake_wallet/utils/show_pop_up.dart'; import 'package:cake_wallet/view_model/wallet_list/wallet_edit_view_model.dart'; @@ -94,9 +98,36 @@ class WalletEditPage extends BasePage { ); } else { try { - await walletEditViewModel.changeName(editingWallet); - Navigator.of(context).pop(); - walletEditViewModel.resetState(); + bool confirmed = false; + + if (SettingsStoreBase + .walletPasswordDirectInput) { + await Navigator.of(context).pushNamed( + Routes.walletUnlockLoadable, + arguments: WalletUnlockArguments( + authPasswordHandler: + (String password) async { + await walletEditViewModel + .changeName(editingWallet, + password: password); + }, + callback: (bool + isAuthenticatedSuccessfully, + AuthPageState auth) async { + if (isAuthenticatedSuccessfully) { + auth.close(); + confirmed = true; + } + }, + walletName: editingWallet.name, + walletType: editingWallet.type)); + } else { + await walletEditViewModel + .changeName(editingWallet); + confirmed = true; + } + + if (confirmed) Navigator.of(context).pop(); } catch (e) {} } } diff --git a/lib/src/screens/wallet_list/wallet_list_page.dart b/lib/src/screens/wallet_list/wallet_list_page.dart index 96a37f328..75f1ecc14 100644 --- a/lib/src/screens/wallet_list/wallet_list_page.dart +++ b/lib/src/screens/wallet_list/wallet_list_page.dart @@ -2,7 +2,9 @@ import 'package:cake_wallet/themes/extensions/cake_text_theme.dart'; import 'package:cake_wallet/main.dart'; import 'package:cake_wallet/src/screens/auth/auth_page.dart'; import 'package:cake_wallet/core/auth_service.dart'; +import 'package:cake_wallet/src/screens/wallet_unlock/wallet_unlock_arguments.dart'; import 'package:cake_wallet/themes/extensions/receive_page_theme.dart'; +import 'package:cake_wallet/store/settings_store.dart'; import 'package:cake_wallet/utils/device_info.dart'; import 'package:cake_wallet/utils/show_bar.dart'; import 'package:cake_wallet/view_model/wallet_list/wallet_list_item.dart'; @@ -250,12 +252,25 @@ class WalletListBodyState extends State { } Future _loadWallet(WalletListItem wallet) async { - await widget.authService.authenticateAction( - context, - onAuthSuccess: (isAuthenticatedSuccessfully) async { - if (!isAuthenticatedSuccessfully) { - return; - } + if (SettingsStoreBase.walletPasswordDirectInput) { + Navigator.of(context).pushNamed( + Routes.walletUnlockLoadable, + arguments: WalletUnlockArguments( + callback: (bool isAuthenticatedSuccessfully, AuthPageState auth) async { + if (isAuthenticatedSuccessfully) { + auth.close(); + setState(() {}); + } + }, walletName: wallet.name, + walletType: wallet.type)); + return; + } + + await widget.authService.authenticateAction(context, + onAuthSuccess: (isAuthenticatedSuccessfully) async { + if (!isAuthenticatedSuccessfully) { + return; + } try { changeProcessText(S.of(context).wallet_list_loading_wallet(wallet.name)); diff --git a/lib/src/screens/wallet_unlock/wallet_unlock_arguments.dart b/lib/src/screens/wallet_unlock/wallet_unlock_arguments.dart index 34b26548c..5b6d4dd16 100644 --- a/lib/src/screens/wallet_unlock/wallet_unlock_arguments.dart +++ b/lib/src/screens/wallet_unlock/wallet_unlock_arguments.dart @@ -1,13 +1,17 @@ import 'package:cake_wallet/src/screens/auth/auth_page.dart'; import 'package:cw_core/wallet_type.dart'; +typedef AuthPasswordHandler = Future Function(String); + class WalletUnlockArguments { - WalletUnlockArguments({ - required this.callback, - this.walletName, - this.walletType}); + WalletUnlockArguments( + {required this.callback, + this.walletName, + this.walletType, + this.authPasswordHandler}); final OnAuthenticationFinished callback; + final AuthPasswordHandler? authPasswordHandler; final String? walletName; final WalletType? walletType; -} \ No newline at end of file +} diff --git a/lib/src/screens/wallet_unlock/wallet_unlock_page.dart b/lib/src/screens/wallet_unlock/wallet_unlock_page.dart index f7e1968cf..2ea1e886e 100644 --- a/lib/src/screens/wallet_unlock/wallet_unlock_page.dart +++ b/lib/src/screens/wallet_unlock/wallet_unlock_page.dart @@ -5,6 +5,7 @@ import 'package:cake_wallet/src/screens/auth/auth_page.dart'; import 'package:cake_wallet/src/widgets/primary_button.dart'; import 'package:cake_wallet/utils/responsive_layout_util.dart'; import 'package:cake_wallet/utils/show_bar.dart'; +import 'package:cake_wallet/src/screens/wallet_unlock/wallet_unlock_arguments.dart'; import 'package:cake_wallet/view_model/wallet_unlock_verifiable_view_model.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; @@ -17,10 +18,12 @@ class WalletUnlockPage extends StatefulWidget { WalletUnlockPage( this.walletUnlockViewModel, this.onAuthenticationFinished, + this.authPasswordHandler, {required this.closable}); final WalletUnlockViewModel walletUnlockViewModel; final OnAuthenticationFinished onAuthenticationFinished; + final AuthPasswordHandler? authPasswordHandler; final bool closable; @override @@ -204,7 +207,20 @@ class WalletUnlockPageState extends AuthPageState { child: Observer( builder: (_) => LoadingPrimaryButton( - onPressed: () => widget.walletUnlockViewModel.unlock(), + onPressed: () async { + if (widget.authPasswordHandler != null) { + try { + await widget.authPasswordHandler!(widget + .walletUnlockViewModel.password); + widget.walletUnlockViewModel.success(); + } catch (e) { + widget.walletUnlockViewModel.failure(e); + } + return; + } + + widget.walletUnlockViewModel.unlock(); + }, text: S.of(context).unlock, color: Colors.green, textColor: Colors.white, diff --git a/lib/view_model/wallet_list/wallet_edit_view_model.dart b/lib/view_model/wallet_list/wallet_edit_view_model.dart index 0582c3f87..806d76022 100644 --- a/lib/view_model/wallet_list/wallet_edit_view_model.dart +++ b/lib/view_model/wallet_list/wallet_edit_view_model.dart @@ -32,11 +32,12 @@ abstract class WalletEditViewModelBase with Store { final WalletLoadingService _walletLoadingService; @action - Future changeName(WalletListItem walletItem) async { + Future changeName(WalletListItem walletItem, {String? password}) async { state = WalletEditRenamePending(); await _walletLoadingService.renameWallet( - walletItem.type, walletItem.name, newName); - _walletListViewModel.updateList(); + walletItem.type, walletItem.name, newName, + password: password); + resetState(); } @action @@ -45,11 +46,11 @@ abstract class WalletEditViewModelBase with Store { final walletService = getIt.get(param1: wallet.type); await walletService.remove(wallet.name); resetState(); - _walletListViewModel.updateList(); } @action void resetState() { + _walletListViewModel.updateList(); state = WalletEditViewModelInitialState(); } } diff --git a/lib/view_model/wallet_unlock_loadable_view_model.dart b/lib/view_model/wallet_unlock_loadable_view_model.dart index e8d328ade..e1e5d5238 100644 --- a/lib/view_model/wallet_unlock_loadable_view_model.dart +++ b/lib/view_model/wallet_unlock_loadable_view_model.dart @@ -7,16 +7,15 @@ import 'package:cake_wallet/view_model/wallet_unlock_view_model.dart'; part 'wallet_unlock_loadable_view_model.g.dart'; -class WalletUnlockLoadableViewModel = WalletUnlockLoadableViewModelBase with _$WalletUnlockLoadableViewModel; +class WalletUnlockLoadableViewModel = WalletUnlockLoadableViewModelBase + with _$WalletUnlockLoadableViewModel; - abstract class WalletUnlockLoadableViewModelBase extends WalletUnlockViewModel with Store { - WalletUnlockLoadableViewModelBase( - this._appStore, - this._walletLoadingService, { - required this.walletName, - required this.walletType}) - : password = '', - state = InitialExecutionState(); +abstract class WalletUnlockLoadableViewModelBase extends WalletUnlockViewModel + with Store { + WalletUnlockLoadableViewModelBase(this._appStore, this._walletLoadingService, + {required this.walletName, required this.walletType}) + : password = '', + state = InitialExecutionState(); final String walletName; @@ -43,14 +42,24 @@ class WalletUnlockLoadableViewModel = WalletUnlockLoadableViewModelBase with _$W Future unlock() async { try { state = InitialExecutionState(); - final wallet = await _walletLoadingService.load( - walletType, - walletName, - password: password); + final wallet = await _walletLoadingService.load(walletType, walletName, + password: password); _appStore.changeCurrentWallet(wallet); - state = ExecutedSuccessfullyState(); - } catch(e) { - state = FailureState(e.toString()); + success(); + } catch (e) { + failure(e.toString()); } } + + @override + @action + void success() { + state = ExecutedSuccessfullyState(); + } + + @override + @action + void failure(e) { + state = FailureState(e.toString()); + } } diff --git a/lib/view_model/wallet_unlock_verifiable_view_model.dart b/lib/view_model/wallet_unlock_verifiable_view_model.dart index ebfec0ff6..11fe3b674 100644 --- a/lib/view_model/wallet_unlock_verifiable_view_model.dart +++ b/lib/view_model/wallet_unlock_verifiable_view_model.dart @@ -7,15 +7,15 @@ import 'package:cake_wallet/view_model/wallet_unlock_view_model.dart'; part 'wallet_unlock_verifiable_view_model.g.dart'; -class WalletUnlockVerifiableViewModel = WalletUnlockVerifiableViewModelBase with _$WalletUnlockVerifiableViewModel; +class WalletUnlockVerifiableViewModel = WalletUnlockVerifiableViewModelBase + with _$WalletUnlockVerifiableViewModel; -abstract class WalletUnlockVerifiableViewModelBase extends WalletUnlockViewModel with Store { - WalletUnlockVerifiableViewModelBase( - this.appStore, { - required this.walletName, - required this.walletType}) - : password = '', - state = InitialExecutionState(); +abstract class WalletUnlockVerifiableViewModelBase extends WalletUnlockViewModel + with Store { + WalletUnlockVerifiableViewModelBase(this.appStore, + {required this.walletName, required this.walletType}) + : password = '', + state = InitialExecutionState(); final String walletName; @@ -38,12 +38,24 @@ abstract class WalletUnlockVerifiableViewModelBase extends WalletUnlockViewModel @override @action Future unlock() async { - try { - state = appStore.wallet!.password == password - ? ExecutedSuccessfullyState() - : FailureState(S.current.invalid_password) ; - } catch(e) { - state = FailureState('${S.current.invalid_password}\n${e.toString()}'); - } + try { + state = appStore.wallet!.password == password + ? ExecutedSuccessfullyState() + : FailureState(S.current.invalid_password); + } catch (e) { + failure('${S.current.invalid_password}\n${e.toString()}'); + } + } + + @override + @action + void success() { + state = ExecutedSuccessfullyState(); + } + + @override + @action + void failure(e) { + state = FailureState(e.toString()); } } diff --git a/lib/view_model/wallet_unlock_view_model.dart b/lib/view_model/wallet_unlock_view_model.dart index aff3a89d0..f0131c61f 100644 --- a/lib/view_model/wallet_unlock_view_model.dart +++ b/lib/view_model/wallet_unlock_view_model.dart @@ -6,4 +6,6 @@ abstract class WalletUnlockViewModel { void setPassword(String password); ExecutionState get state; Future unlock(); -} \ No newline at end of file + void success(); + void failure(dynamic e); +}