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
}