dev
dart 253 lines 12.3 KB
Raw
1 import 'dart:io';
2
3 import 'package:cake_wallet/bitcoin/bitcoin.dart';
4 import 'package:cake_wallet/entities/new_ui_entities/list_item/list_item_regular_row.dart';
5 import 'package:cake_wallet/entities/new_ui_entities/list_item/list_item_selector.dart';
6 import 'package:cake_wallet/entities/priority_for_wallet_type.dart';
7 import 'package:cake_wallet/generated/i18n.dart';
8 import 'package:cake_wallet/new-ui/widgets/modal_page_wrapper.dart';
9 import 'package:cake_wallet/new-ui/widgets/receive_page/receive_top_bar.dart';
10 import 'package:cake_wallet/routes.dart';
11 import 'package:cake_wallet/src/screens/base_page.dart';
12 import 'package:cake_wallet/src/screens/dev/moneroc_cache_debug.dart';
13 import 'package:cake_wallet/src/widgets/new_list_row/new_list_section.dart';
14 import 'package:cake_wallet/src/widgets/picker.dart';
15 import 'package:cake_wallet/utils/feature_flag.dart';
16 import 'package:cake_wallet/utils/share_util.dart';
17 import 'package:cake_wallet/utils/show_pop_up.dart';
18 import 'package:cake_wallet/view_model/settings/other_settings_view_model.dart';
19 import 'package:cw_core/root_dir.dart';
20 import 'package:cw_core/wallet_info.dart';
21 import 'package:cw_core/transaction_priority.dart';
22 import 'package:cw_core/wallet_type.dart';
23 import 'package:cw_core/db/sqlite.dart';
24 import 'package:flutter/material.dart';
25 import 'package:path/path.dart' as p;
26
27 class OtherSettingsPage extends BasePage {
28 OtherSettingsPage(this._otherSettingsViewModel) {
29 if (_otherSettingsViewModel.sendViewModel.isElectrumWallet) {
30 bitcoin!.updateFeeRates(_otherSettingsViewModel.sendViewModel.wallet);
31 }
32 }
33
34 @override
35 bool get hideAppBar => true;
36
37 final OtherSettingsViewModel _otherSettingsViewModel;
38
39 @override
40 Widget body(BuildContext context) {
41 return ModalPageWrapper(
42 topBar: ModalTopBar(
43 title: S.of(context).other,
44 leadingIcon: Icon(Icons.arrow_back_ios_new),
45 leadingSemanticLabel: S.of(context).seed_alert_back,
46 onLeadingPressed: () => Navigator.of(context).pop(),
47 ),
48 // header: ModalHeader(
49 // iconPath: "assets/new-ui/settings_row_icons/other.svg",
50 // message: "Other settings",
51 // title: S.of(context).other_settings),
52 content: NewListSections(sections: {
53 "": [
54 if (_otherSettingsViewModel.displayTransactionPriority)
55 _otherSettingsViewModel.walletType == WalletType.bitcoin
56 ? ListItemSelector(
57 keyValue: "fee_priority",
58 label: S.of(context).settings_fee_priority,
59 options: [_otherSettingsViewModel.transactionPriority.title],
60 onTap: () async {
61 final items = priorityForWalletType(_otherSettingsViewModel.walletType);
62
63 var selectedAtIndex =
64 items.indexOf(_otherSettingsViewModel.transactionPriority);
65 double sliderValue = _otherSettingsViewModel.customBitcoinFeeRate;
66
67 await showPopUp<void>(
68 context: context,
69 builder: (BuildContext context) {
70 return StatefulBuilder(
71 builder: (BuildContext context, StateSetter setState) {
72 return Picker(
73 items: items,
74 displayItem: (TransactionPriority item) => _otherSettingsViewModel
75 .getDisplayBitcoinPriority(item, sliderValue.round()),
76 selectedAtIndex: selectedAtIndex,
77 customItemIndex: _otherSettingsViewModel.customPriorityItemIndex,
78 maxValue: _otherSettingsViewModel.maxCustomFeeRate?.toDouble(),
79 headerEnabled: false,
80 closeOnItemSelected: false,
81 mainAxisAlignment: MainAxisAlignment.center,
82 sliderValue: sliderValue,
83 onSliderChanged: (double newValue) =>
84 setState(() => sliderValue = newValue),
85 onItemSelected: (TransactionPriority priority) {
86 setState(() => selectedAtIndex = items.indexOf(priority));
87 _otherSettingsViewModel.onDisplayBitcoinPrioritySelected
88 .call(priority, sliderValue);
89 },
90 );
91 },
92 );
93 },
94 );
95 _otherSettingsViewModel.onDisplayBitcoinPrioritySelected
96 .call(items[selectedAtIndex], sliderValue);
97 })
98 : ListItemSelector(
99 keyValue: "fee_priority",
100 label: S.of(context).settings_fee_priority,
101 options: [_otherSettingsViewModel.transactionPriority.title],
102 onTap: () async {
103 final selectedAtIndex =
104 priorityForWalletType(_otherSettingsViewModel.walletType).indexOf(
105 _otherSettingsViewModel.transactionPriority,
106 );
107
108 await showPopUp<void>(
109 context: context,
110 builder: (_) => Picker(
111 items: priorityForWalletType(_otherSettingsViewModel.walletType),
112 displayItem: _otherSettingsViewModel.getDisplayPriority,
113 selectedAtIndex: selectedAtIndex,
114 mainAxisAlignment: MainAxisAlignment.start,
115 onItemSelected: (TransactionPriority item) => _otherSettingsViewModel
116 .onDisplayBitcoinPrioritySelected
117 .call(item, 0),
118 isSeparated: false,
119 ),
120 );
121 },
122 ),
123 if (_otherSettingsViewModel.changeRepresentativeEnabled)
124 ListItemRegularRow(
125 keyValue: "change_rep",
126 label: S.of(context).change_rep,
127 onTap: () => Navigator.of(context).pushNamed(Routes.changeRep)),
128 if (_otherSettingsViewModel.changeHardwareWalletTypeEnabled)
129 ListItemRegularRow(
130 keyValue: "hardware_wallet_manufacturer",
131 label: "Hardware wallet manufacturer",
132 onTap: () => Navigator.of(context)
133 .pushNamed(Routes.restoreWalletFromHardwareWallet, arguments: {
134 "showUnavailable": false,
135 "availableHardwareWalletTypes": [
136 HardwareWalletType.cupcake,
137 HardwareWalletType.coldcard,
138 HardwareWalletType.seedsigner,
139 ],
140 "onSelect": (BuildContext context, HardwareWalletType hwType) async {
141 await _otherSettingsViewModel.onHardwareWalletTypeChanged(hwType);
142 Navigator.pop(context);
143 },
144 }),
145 ),
146 if(_otherSettingsViewModel.hasSignVerify)
147 ListItemRegularRow(
148 keyValue: "security_backup_page_sign_and_verify",
149 label: S.of(context).sign_verify_title,
150 onTap: () {
151 Navigator.of(context).pushNamed(Routes.signPage);
152 }),
153 ],
154 if (_otherSettingsViewModel.walletType == WalletType.bitcoin)
155 "btc_logging": [
156 if(_otherSettingsViewModel.hasLightning)
157 ListItemRegularRow(
158 keyValue: "export_lightning_logs",
159 label: S.of(context).export_lightning_logs,
160 onTap: () => onExportLNLog(context)),
161 if(_otherSettingsViewModel.hasPayjoin)
162 ListItemRegularRow(
163 keyValue: "export_payjoin_logs",
164 label: S.of(context).export_payjoin_logs,
165 onTap: () => onExportPJLog(context)),
166 ],
167 "dev": FeatureFlag.hasDevOptions == false
168 ? []
169 : [
170 if (_otherSettingsViewModel.walletType == WalletType.monero)
171 ListItemRegularRow(
172 keyValue: "[dev] monero background sync",
173 label: "[dev] monero background sync",
174 onTap: () => Navigator.of(context).pushNamed(Routes.devMoneroBackgroundSync)),
175 if ([WalletType.monero, WalletType.wownero, WalletType.zano]
176 .contains(_otherSettingsViewModel.walletType))
177 ListItemRegularRow(
178 keyValue: "[dev] xmr call profiler",
179 label: "[dev] xmr call profiler",
180 onTap: () => Navigator.of(context).pushNamed(Routes.devMoneroCallProfiler)),
181 if ([WalletType.monero].contains(_otherSettingsViewModel.walletType))
182 ListItemRegularRow(
183 keyValue: '[dev] xmr wallet cache debug',
184 label: '[dev] xmr wallet cache debug',
185 onTap: () =>
186 Navigator.of(context).pushNamed(Routes.devMoneroWalletCacheDebug)),
187 ListItemRegularRow(
188 keyValue: '[dev] shared preferences',
189 label: '[dev] shared preferences',
190 onTap: () => Navigator.of(context).pushNamed(Routes.devSharedPreferences)),
191 ListItemRegularRow(
192 keyValue: '[dev] secure storage preferences',
193 label: '[dev] secure storage preferences',
194 onTap: () => Navigator.of(context).pushNamed(Routes.devSecurePreferences)),
195 ListItemRegularRow(
196 keyValue: '[dev] background sync logs',
197 label: '[dev] background sync logs',
198 onTap: () => Navigator.of(context).pushNamed(Routes.devBackgroundSyncLogs)),
199 ListItemRegularRow(
200 keyValue: '[dev] socket health logs',
201 label: '[dev] socket health logs',
202 onTap: () => Navigator.of(context).pushNamed(Routes.devSocketHealthLogs)),
203 ListItemRegularRow(
204 keyValue: '[dev] network requests logs',
205 label: '[dev] network requests logs',
206 onTap: () => Navigator.of(context).pushNamed(Routes.devNetworkRequests)),
207 ListItemRegularRow(
208 keyValue: '[dev] exchange provider logs',
209 label: '[dev] exchange provider logs',
210 onTap: () => Navigator.of(context).pushNamed(Routes.devExchangeProviderLogs)),
211 ListItemRegularRow(
212 keyValue: '[dev] *QR tools',
213 label: '[dev] *QR tools',
214 onTap: () => Navigator.of(context).pushNamed(Routes.devExchangeProviderLogs)),
215 ListItemRegularRow(
216 keyValue: '[dev] browse sqlite db',
217 label: '[dev] browse sqlite db',
218 onTap: () async {
219 final data = await dumpDb();
220 Navigator.of(context).push(
221 MaterialPageRoute(
222 builder: (context) => JsonExplorerPage(data: data, title: 'sqlite db'),
223 ),
224 );
225 }),
226 ListItemRegularRow(
227 keyValue: '[dev] fake corrupt sqlite db',
228 label: '[dev] fake corrupt sqlite db',
229 onTap: () async {
230 final dbDebugMarker = await sqliteDebugMarkerFile();
231 dbDebugMarker.create();
232 }),
233 ]
234 }),
235 );
236 }
237
238 Future<void> onExportLNLog(BuildContext context) async {
239 final file = await _otherSettingsViewModel.getLightningLog();
240
241 if (file != null) {
242 await ShareUtil.shareFile(filePath: file.path, fileName: "Lightning.log", context: context);
243 }
244 }
245
246 Future<void> onExportPJLog(BuildContext context) async {
247 final file = await _otherSettingsViewModel.getPayjoinLog();
248
249 if (file != null) {
250 await ShareUtil.shareFile(filePath: file.path, fileName: "Payjoin.log", context: context);
251 }
252 }
253 }