CAKE-343 | applied subaddresses for contact book; added addresses field to wallet_info.dart; added updateAddressesInfo() to wallet_base.dart; applied updateAddressesInfo() to wallet services and view models

OleksandrSobol committed Jun 18, 2021 at 15:36 UTC 6709b7779a9692cfafd8186439b7e9ca1dfdfde0
13 files changed +81 -18
lib/bitcoin/bitcoin_wallet_service.dart
+1
@@ -44,6 +44,7 @@ class BitcoinWalletService extends WalletService<
44 final wallet = await BitcoinWalletBase.open(
45 password: password, name: name, walletInfo: walletInfo);
46 await wallet.init();
47 + await wallet.updateAddressesInfo();
48 return wallet;
49 }
50
lib/bitcoin/electrum_wallet.dart
+2
@@ -125,6 +125,8 @@ abstract class ElectrumWalletBase extends WalletBase<ElectrumBalance,
125
126 address = addresses[_accountIndex].address;
127
128 + await updateAddressesInfo();
129 +
130 await save();
131 }
132
lib/bitcoin/litecoin_wallet_service.dart
+1
@@ -45,6 +45,7 @@ class LitecoinWalletService extends WalletService<
45 final wallet = await LitecoinWalletBase.open(
46 password: password, name: name, walletInfo: walletInfo);
47 await wallet.init();
48 + await wallet.updateAddressesInfo();
49 return wallet;
50 }
51
lib/core/wallet_base.dart
+9
@@ -66,4 +66,13 @@ abstract class WalletBase<
66 Future<void> rescan({int height});
67
68 void close();
69 +
70 + Future<void> updateAddressesInfo() async {
71 + try {
72 + walletInfo.address = address;
73 + await walletInfo.save();
74 + } catch (e) {
75 + print(e.toString());
76 + }
77 + }
78 }
lib/di.dart
+1
@@ -362,6 +362,7 @@ Future setup(
362 AccountListItem, void>(
363 (AccountListItem account, _) => MoneroAccountEditOrCreateViewModel(
364 (getIt.get<AppStore>().wallet as MoneroWallet).accountList,
365 + wallet: getIt.get<AppStore>().wallet,
366 accountListItem: account));
367
368 getIt.registerFactoryParam<MoneroAccountEditOrCreatePage, AccountListItem,
lib/entities/wallet_info.dart
+3
@@ -53,5 +53,8 @@ class WalletInfo extends HiveObject {
53 @HiveField(8)
54 String address;
55
56 + @HiveField(10)
57 + Map<String, String> addresses;
58 +
59 DateTime get date => DateTime.fromMillisecondsSinceEpoch(timestamp);
60 }
lib/monero/monero_wallet.dart
+22
@@ -445,4 +445,26 @@ abstract class MoneroWalletBase extends WalletBase<MoneroBalance,
445 print(e.toString());
446 }
447 }
448 +
449 + @override
450 + Future<void> updateAddressesInfo() async {
451 + final Map<String, String> _addresses = {};
452 + final _subaddressList = MoneroSubaddressList();
453 +
454 + accountList.accounts.forEach((account) {
455 + _subaddressList.update(accountIndex: account.id);
456 + _subaddressList.subaddresses.forEach((subaddress) {
457 + _addresses.addAll({subaddress.address:subaddress.label});
458 + });
459 + });
460 +
461 + try {
462 + walletInfo.addresses = _addresses;
463 + walletInfo.address = address;
464 +
465 + await walletInfo.save();
466 + } catch (e) {
467 + print(e.toString());
468 + }
469 + }
470 }
lib/monero/monero_wallet_service.dart
+1
@@ -126,6 +126,7 @@ class MoneroWalletService extends WalletService<
126 }
127
128 await wallet.init();
129 + await wallet.updateAddressesInfo();
130
131 return wallet;
132 } catch (e) {
lib/src/screens/contact/contact_list_page.dart
+13 -11
@@ -151,17 +151,19 @@ class ContactListPage extends BasePage {
151 crossAxisAlignment: CrossAxisAlignment.center,
152 children: <Widget>[
153 image ?? Offstage(),
154 - Padding(
155 - padding: image != null
156 - ? EdgeInsets.only(left: 12)
157 - : EdgeInsets.only(left: 0),
158 - child: Text(
159 - contact.name,
160 - style: TextStyle(
161 - fontSize: 14,
162 - fontWeight: FontWeight.normal,
163 - color: Theme.of(context).primaryTextTheme.title.color),
164 - ),
154 + Expanded(
155 + child: Padding(
156 + padding: image != null
157 + ? EdgeInsets.only(left: 12)
158 + : EdgeInsets.only(left: 0),
159 + child: Text(
160 + contact.name,
161 + style: TextStyle(
162 + fontSize: 14,
163 + fontWeight: FontWeight.normal,
164 + color: Theme.of(context).primaryTextTheme.title.color),
165 + ),
166 + )
167 )
168 ],
169 ),
lib/view_model/contact_list/contact_list_view_model.dart
+17 -5
@@ -16,11 +16,23 @@ class ContactListViewModel = ContactListViewModelBase
16 abstract class ContactListViewModelBase with Store {
17 ContactListViewModelBase(this.contactSource, this.walletInfoSource)
18 : contacts = ObservableList<ContactRecord>(),
19 - walletContacts = walletInfoSource.values
20 - .where((info) => info.address?.isNotEmpty ?? false)
21 - .map((info) => WalletContact(
22 - info.address, info.name, walletTypeToCryptoCurrency(info.type)))
23 - .toList() {
19 + walletContacts = [] {
20 + walletInfoSource.values.forEach((info) {
21 + if (info.address?.isNotEmpty ?? false) {
22 + if (info.addresses != null) {
23 + info.addresses.forEach((address, label) {
24 + walletContacts.add(WalletContact(
25 + address,
26 + info.name + ' ($label)',
27 + walletTypeToCryptoCurrency(info.type)));
28 + });
29 + } else {
30 + walletContacts.add(WalletContact(info.address, info.name,
31 + walletTypeToCryptoCurrency(info.type)));
32 + }
33 + }
34 + });
35 +
36 _subscription = contactSource.bindToListWithTransform(
37 contacts, (Contact contact) => ContactRecord(contactSource, contact),
38 initialFire: true);
lib/view_model/monero_account_list/monero_account_edit_or_create_view_model.dart
+8 -2
@@ -1,3 +1,5 @@
1 +import 'package:cake_wallet/core/wallet_base.dart';
2 +import 'package:flutter/foundation.dart';
3 import 'package:mobx/mobx.dart';
4 import 'package:cake_wallet/core/execution_state.dart';
5 import 'package:cake_wallet/monero/monero_account_list.dart';
@@ -10,11 +12,12 @@ class MoneroAccountEditOrCreateViewModel = MoneroAccountEditOrCreateViewModelBas
12
13 abstract class MoneroAccountEditOrCreateViewModelBase with Store {
14 MoneroAccountEditOrCreateViewModelBase(this._moneroAccountList,
13 - {AccountListItem accountListItem})
15 + {@required WalletBase wallet, AccountListItem accountListItem})
16 : state = InitialExecutionState(),
17 isEdit = accountListItem != null,
18 label = accountListItem?.label??'',
17 - _accountListItem = accountListItem;
19 + _accountListItem = accountListItem,
20 + _wallet = wallet;
21
22 final bool isEdit;
23
@@ -26,6 +29,7 @@ abstract class MoneroAccountEditOrCreateViewModelBase with Store {
29
30 final MoneroAccountList _moneroAccountList;
31 final AccountListItem _accountListItem;
32 + final WalletBase _wallet;
33
34 Future<void> save() async {
35 try {
@@ -38,6 +42,8 @@ abstract class MoneroAccountEditOrCreateViewModelBase with Store {
42 await _moneroAccountList.addAccount(label: label);
43 }
44
45 + await _wallet.updateAddressesInfo();
46 +
47 state = ExecutedSuccessfullyState();
48 } catch (e) {
49 state = FailureState(e.toString());
lib/view_model/wallet_address_list/wallet_address_edit_or_create_view_model.dart
+2
@@ -54,6 +54,8 @@ abstract class WalletAddressEditOrCreateViewModelBase with Store {
54 await _createNew();
55 }
56
57 + await _wallet.updateAddressesInfo();
58 +
59 state = AddressSavedSuccessfully();
60 } catch (e) {
61 state = AddressEditOrCreateStateFailure(error: e.toString());
lib/view_model/wallet_creation_vm.dart
+1
@@ -54,6 +54,7 @@ abstract class WalletCreationVMBase with Store {
54 await _walletInfoSource.add(walletInfo);
55 _appStore.changeCurrentWallet(wallet);
56 _appStore.authenticationStore.allowed();
57 + await wallet.updateAddressesInfo();
58 state = ExecutedSuccessfullyState();
59 } catch (e) {
60 state = FailureState(e.toString());