Updates

M committed Oct 20, 2020 at 15:09 UTC aa120c33b1193d719dac607acb70fb50c5e62367
9 files changed +125 -69
ios/Runner.xcodeproj/project.pbxproj
+3 -3
@@ -354,7 +354,7 @@
354 buildSettings = {
355 ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
356 CLANG_ENABLE_MODULES = YES;
357 - CURRENT_PROJECT_VERSION = 7;
357 + CURRENT_PROJECT_VERSION = 8;
358 DEVELOPMENT_TEAM = 32J6BB6VUS;
359 ENABLE_BITCODE = NO;
360 FRAMEWORK_SEARCH_PATHS = (
@@ -493,7 +493,7 @@
493 buildSettings = {
494 ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
495 CLANG_ENABLE_MODULES = YES;
496 - CURRENT_PROJECT_VERSION = 7;
496 + CURRENT_PROJECT_VERSION = 8;
497 DEVELOPMENT_TEAM = 32J6BB6VUS;
498 ENABLE_BITCODE = NO;
499 FRAMEWORK_SEARCH_PATHS = (
@@ -526,7 +526,7 @@
526 buildSettings = {
527 ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
528 CLANG_ENABLE_MODULES = YES;
529 - CURRENT_PROJECT_VERSION = 7;
529 + CURRENT_PROJECT_VERSION = 8;
530 DEVELOPMENT_TEAM = 32J6BB6VUS;
531 ENABLE_BITCODE = NO;
532 FRAMEWORK_SEARCH_PATHS = (
lib/src/screens/new_wallet/new_wallet_page.dart
-1
@@ -157,7 +157,6 @@ class _WalletNameFormState extends State<WalletNameForm> {
157 builder: (context) {
158 return LoadingPrimaryButton(
159 onPressed: _confirmForm,
160 - //text: S.of(context).continue_text,
160 text: S.of(context).seed_language_next,
161 color: Colors.green,
162 textColor: Colors.white,
lib/src/screens/receive/widgets/address_cell.dart
+1 -2
@@ -50,8 +50,7 @@ class AddressCell extends StatelessWidget {
50 maxLines: 1,
51 overflow: TextOverflow.ellipsis,
52 style: TextStyle(
53 - fontSize: 18,
54 - fontWeight: FontWeight.w600,
53 + fontSize: 14,
54 color: textColor,
55 ),
56 ),
lib/src/screens/restore/wallet_restore_from_seed_form.dart
+8 -6
@@ -7,7 +7,10 @@ import 'package:cake_wallet/src/widgets/base_text_form_field.dart';
7 import 'package:cake_wallet/src/widgets/blockchain_height_widget.dart';
8
9 class WalletRestoreFromSeedForm extends StatefulWidget {
10 - WalletRestoreFromSeedForm({Key key}) : super(key: key);
10 + WalletRestoreFromSeedForm({Key key, this.blockHeightFocusNode})
11 + : super(key: key);
12 +
13 + final FocusNode blockHeightFocusNode;
14
15 @override
16 WalletRestoreFromSeedFormState createState() =>
@@ -36,7 +39,7 @@ class WalletRestoreFromSeedFormState extends State<WalletRestoreFromSeedForm> {
39 return Container(
40 padding: EdgeInsets.only(left: 25, right: 25),
41 child: Column(children: [
39 - SeedWidget(key: seedWidgetStateKey),
42 + SeedWidget(key: seedWidgetStateKey, language: language),
43 GestureDetector(
44 onTap: () async {
45 final selected = await showPopUp<String>(
@@ -54,16 +57,15 @@ class WalletRestoreFromSeedFormState extends State<WalletRestoreFromSeedForm> {
57 enableInteractiveSelection: false,
58 readOnly: true)))),
59 BlockchainHeightWidget(
57 - key: blockchainHeightKey,
58 - onHeightChange: (height) {
59 - print(height);
60 - })
60 + focusNode: widget.blockHeightFocusNode,
61 + key: blockchainHeightKey)
62 ]));
63 }
64
65 void _changeLanguage(String language) {
66 setState(() {
67 this.language = language;
68 + seedWidgetStateKey.currentState.changeSeedLanguage(language);
69 _setLanguageLabel(language);
70 });
71 }
lib/src/screens/restore/wallet_restore_page.dart
+20 -9
@@ -1,5 +1,8 @@
1 +import 'package:cake_wallet/src/widgets/keyboard_done_button.dart';
2 +import 'package:cake_wallet/src/widgets/scollable_with_bottom_section.dart';
3 import 'package:flutter/cupertino.dart';
4 import 'package:flutter/material.dart';
5 +import 'package:keyboard_actions/keyboard_actions.dart';
6 import 'package:mobx/mobx.dart';
7 import 'package:flutter_mobx/flutter_mobx.dart';
8 import 'package:smooth_page_indicator/smooth_page_indicator.dart';
@@ -20,9 +23,12 @@ class WalletRestorePage extends BasePage {
23 walletRestoreFromKeysFormKey =
24 GlobalKey<WalletRestoreFromKeysFromState>(),
25 _pages = [],
26 + _blockHeightFocusNode = FocusNode(),
27 _controller = PageController(initialPage: 0) {
28 _pages.addAll([
25 - WalletRestoreFromSeedForm(key: walletRestoreFromSeedFormKey),
29 + WalletRestoreFromSeedForm(
30 + key: walletRestoreFromSeedFormKey,
31 + blockHeightFocusNode: _blockHeightFocusNode),
32 WalletRestoreFromKeysFrom(key: walletRestoreFromKeysFormKey)
33 ]);
34 }
@@ -49,6 +55,7 @@ class WalletRestorePage extends BasePage {
55 final List<Widget> _pages;
56 final GlobalKey<WalletRestoreFromSeedFormState> walletRestoreFromSeedFormKey;
57 final GlobalKey<WalletRestoreFromKeysFromState> walletRestoreFromKeysFormKey;
58 + final FocusNode _blockHeightFocusNode;
59
60 @override
61 Widget body(BuildContext context) {
@@ -77,7 +84,7 @@ class WalletRestorePage extends BasePage {
84 },
85 controller: _controller,
86 itemCount: _pages.length,
80 - itemBuilder: (_, index) => _pages[index])),
87 + itemBuilder: (_, index) => SingleChildScrollView(child: _pages[index]))),
88 Padding(
89 padding: EdgeInsets.only(top: 10),
90 child: SmoothPageIndicator(
@@ -93,13 +100,17 @@ class WalletRestorePage extends BasePage {
100 )),
101 Padding(
102 padding: EdgeInsets.only(top: 20, bottom: 40, left: 25, right: 25),
96 - child: PrimaryButton(
97 - text: S.of(context).restore_recover,
98 - isDisabled: false,
99 - onPressed: () =>
100 - walletRestoreViewModel.create(options: _credentials()),
101 - color: Theme.of(context).accentTextTheme.body2.color,
102 - textColor: Colors.white)),
103 + child: Observer(
104 + builder: (context) {
105 + return LoadingPrimaryButton(
106 + onPressed: () =>
107 + walletRestoreViewModel.create(options: _credentials()),
108 + text: S.of(context).seed_language_next,
109 + color: Colors.green,
110 + textColor: Colors.white,
111 + isLoading: walletRestoreViewModel.state is IsExecutingState);
112 + },
113 + ))
114 ]);
115 }
116
lib/src/widgets/annotated_editable_text.dart
+1 -1
@@ -40,7 +40,7 @@ class AnnotatedEditableText extends EditableText {
40 color: Colors.black,
41 backgroundColor: Colors.transparent,
42 fontWeight: FontWeight.normal,
43 - fontSize: 20)))
43 + fontSize: 16)))
44 .toList(),
45 super(
46 maxLines: null,
lib/src/widgets/blockchain_height_widget.dart
+14 -14
@@ -6,10 +6,11 @@ import 'package:cake_wallet/monero/get_height_by_date.dart';
6 import 'package:cake_wallet/src/widgets/base_text_form_field.dart';
7
8 class BlockchainHeightWidget extends StatefulWidget {
9 - BlockchainHeightWidget({GlobalKey key, this.onHeightChange})
9 + BlockchainHeightWidget({GlobalKey key, this.onHeightChange, this.focusNode})
10 : super(key: key);
11
12 final Function(int) onHeightChange;
13 + final FocusNode focusNode;
14
15 @override
16 State<StatefulWidget> createState() => BlockchainHeightState();
@@ -47,14 +48,14 @@ class BlockchainHeightState extends State<BlockchainHeightWidget> {
48 children: <Widget>[
49 Flexible(
50 child: Container(
50 - padding: EdgeInsets.only(top: 20.0, bottom: 10.0),
51 - child: BaseTextFormField(
52 - controller: restoreHeightController,
53 - keyboardType: TextInputType.numberWithOptions(
54 - signed: false, decimal: false),
55 - hintText: S.of(context).widgets_restore_from_blockheight,
56 - )
57 - ))
51 + padding: EdgeInsets.only(top: 20.0, bottom: 10.0),
52 + child: BaseTextFormField(
53 + focusNode: widget.focusNode,
54 + controller: restoreHeightController,
55 + keyboardType: TextInputType.numberWithOptions(
56 + signed: false, decimal: false),
57 + hintText: S.of(context).widgets_restore_from_blockheight,
58 + )))
59 ],
60 ),
61 Padding(
@@ -74,11 +75,10 @@ class BlockchainHeightState extends State<BlockchainHeightWidget> {
75 child: InkWell(
76 onTap: () => _selectDate(context),
77 child: IgnorePointer(
77 - child: BaseTextFormField(
78 - controller: dateController,
79 - hintText: S.of(context).widgets_restore_from_date,
80 - )
81 - ),
78 + child: BaseTextFormField(
79 + controller: dateController,
80 + hintText: S.of(context).widgets_restore_from_date,
81 + )),
82 ),
83 ))
84 ],
lib/src/widgets/seed_widget.dart
+46 -21
@@ -12,22 +12,36 @@ import 'package:cake_wallet/generated/i18n.dart';
12 import 'package:flutter/widgets.dart';
13
14 class SeedWidget extends StatefulWidget {
15 - SeedWidget({Key key}) : super(key: key);
15 + SeedWidget({Key key, this.language}) : super(key: key);
16 +
17 + final String language;
18
19 @override
18 - SeedWidgetState createState() => SeedWidgetState();
20 + SeedWidgetState createState() => SeedWidgetState(language);
21 }
22
23 class SeedWidgetState extends State<SeedWidget> {
22 - SeedWidgetState()
24 + SeedWidgetState(String language)
25 : controller = TextEditingController(),
26 focusNode = FocusNode(),
25 - words =
26 - SeedValidator.getWordList(type: WalletType.monero, language: 'en');
27 + words = SeedValidator.getWordList(
28 + type: WalletType.monero, language: language) {
29 + focusNode.addListener(() {
30 + setState(() {
31 + if (!focusNode.hasFocus && controller.text.isEmpty) {
32 + _showPlaceholder = true;
33 + }
34 +
35 + if (focusNode.hasFocus) {
36 + _showPlaceholder = false;
37 + }
38 + });
39 + });
40 + }
41
42 final TextEditingController controller;
43 final FocusNode focusNode;
30 - final List<String> words;
44 + List<String> words;
45 bool _showPlaceholder;
46
47 String get text => controller.text;
@@ -38,12 +52,11 @@ class SeedWidgetState extends State<SeedWidget> {
52 _showPlaceholder = true;
53 }
54
41 - Future<void> _pasteAddress() async {
42 - final value = await Clipboard.getData('text/plain');
43 -
44 - if (value?.text?.isNotEmpty ?? false) {
45 - controller.text = value.text;
46 - }
55 + void changeSeedLanguage(String language) {
56 + setState(() {
57 + words = SeedValidator.getWordList(
58 + type: WalletType.monero, language: language);
59 + });
60 }
61
62 @override
@@ -84,15 +97,16 @@ class SeedWidgetState extends State<SeedWidget> {
97 child: InkWell(
98 onTap: () async => _pasteAddress(),
99 child: Container(
87 - decoration: BoxDecoration(
88 - color: Theme.of(context).hintColor,
89 - borderRadius: BorderRadius.all(Radius.circular(6))),
90 - // child: Image.asset('assets/images/duplicate.png',
91 - // color: Theme.of(context)
92 - // .primaryTextTheme
93 - // .display1
94 - // .decorationColor)
95 - ),
100 + padding: EdgeInsets.all(8),
101 + decoration: BoxDecoration(
102 + color: Theme.of(context).hintColor,
103 + borderRadius:
104 + BorderRadius.all(Radius.circular(6))),
105 + child: Image.asset('assets/images/paste_ios.png',
106 + color: Theme.of(context)
107 + .primaryTextTheme
108 + .display1
109 + .decorationColor)),
110 )))
111 ]),
112 Container(
@@ -101,4 +115,15 @@ class SeedWidgetState extends State<SeedWidget> {
115 color: Theme.of(context).primaryTextTheme.title.backgroundColor),
116 ]));
117 }
118 +
119 + Future<void> _pasteAddress() async {
120 + final value = await Clipboard.getData('text/plain');
121 +
122 + if (value?.text?.isNotEmpty ?? false) {
123 + setState(() {
124 + _showPlaceholder = false;
125 + controller.text = value.text;
126 + });
127 + }
128 + }
129 }
lib/view_model/wallet_restore_view_model.dart
+32 -12
@@ -1,6 +1,7 @@
1 import 'package:flutter/foundation.dart';
2 import 'package:hive/hive.dart';
3 import 'package:mobx/mobx.dart';
4 +import 'package:uuid/uuid.dart';
5 import 'package:cake_wallet/store/app_store.dart';
6 import 'package:cake_wallet/core/wallet_base.dart';
7 import 'package:cake_wallet/core/generate_wallet_password.dart';
@@ -9,6 +10,7 @@ import 'package:cake_wallet/core/wallet_credentials.dart';
10 import 'package:cake_wallet/entities/wallet_type.dart';
11 import 'package:cake_wallet/entities/wallet_info.dart';
12 import 'package:cake_wallet/view_model/wallet_creation_vm.dart';
13 +import 'package:cake_wallet/monero/monero_wallet_service.dart';
14
15 part 'wallet_restore_view_model.g.dart';
16
@@ -23,6 +25,7 @@ abstract class WalletRestoreViewModelBase extends WalletCreationVM with Store {
25 {@required WalletType type})
26 : super(appStore, walletInfoSource, type: type, isRecovery: true) {
27 mode = WalletRestoreMode.seed;
28 + _walletCreationService.changeWalletType(type: WalletType.monero);
29 }
30
31 @observable
@@ -33,22 +36,39 @@ abstract class WalletRestoreViewModelBase extends WalletCreationVM with Store {
36 @override
37 WalletCredentials getCredentials(dynamic options) {
38 final password = generateWalletPassword(type);
39 + final height = options['height'] as int;
40 + name = Uuid().v4().substring(0, 10);
41
37 - // switch (type) {
38 - // case WalletType.monero:
39 - // return MoneroRestoreWalletFromSeedCredentials(
40 - // name: name, height: height, mnemonic: seed, password: password);
41 - // case WalletType.bitcoin:
42 - // return BitcoinRestoreWalletFromSeedCredentials(
43 - // name: name, mnemonic: seed, password: password);
44 - // default:
45 - // return null;
46 - // }
42 + if (mode == WalletRestoreMode.seed) {
43 + final seed = options['seed'] as String;
44 +
45 + return MoneroRestoreWalletFromSeedCredentials(
46 + name: name, height: height, mnemonic: seed, password: password);
47 + }
48 +
49 + if (mode == WalletRestoreMode.keys) {
50 + final viewKey = options['viewKey'] as String;
51 + final spendKey = options['spendKey'] as String;
52 + final address = options['address'] as String;
53 +
54 + return MoneroRestoreWalletFromKeysCredentials(
55 + name: name,
56 + height: height,
57 + spendKey: spendKey,
58 + viewKey: viewKey,
59 + address: address,
60 + password: password);
61 + }
62
63 return null;
64 }
65
66 @override
52 - Future<WalletBase> process(WalletCredentials credentials) async =>
53 - _walletCreationService.restoreFromSeed(credentials);
67 + Future<WalletBase> process(WalletCredentials credentials) async {
68 + if (mode == WalletRestoreMode.keys) {
69 + return _walletCreationService.restoreFromKeys(credentials);
70 + }
71 +
72 + return _walletCreationService.restoreFromSeed(credentials);
73 + }
74 }