Cw 1624 trezor passphrase on trezor device instead of app (#3601)

* feat: add support for Trezor device settings configuration and `AwaitingSettings` state in pairing flow

* fix ugly widgets

* trezor options ui

* feat: add support for Trezor on device passphrases

* chore: bump trezor_flutter deps

* fix: remove unused subtitle property in proceed_on_device_sheet [skip ci]

* chore: update trezor_flutter dependency to latest commit [skip ci]

* fix: set restore height and store wallet during initialization steps

---------

Co-authored-by: Robert Malikowski <malikowskirobert@gmail.com>
This commit is contained in:
Konstantin Ullrich
2026-09-18 02:27:32 +02:00
committed by GitHub
co-authored by Robert Malikowski
parent dd58455ea6
commit 98f58c2898
50 changed files with 741 additions and 295 deletions
@@ -3,7 +3,6 @@ import "dart:async";
import "package:cake_wallet/core/wallet_name_validator.dart";
import "package:cake_wallet/generated/i18n.dart";
import "package:cake_wallet/src/screens/base_page.dart";
import "package:cake_wallet/src/screens/connect_device/monero_hardware_wallet_passphrase_input.dart";
import "package:cake_wallet/src/widgets/alert_with_one_action.dart";
import "package:cake_wallet/src/widgets/base_text_form_field.dart";
import "package:cake_wallet/src/widgets/blockchain_height_widget.dart";
@@ -136,21 +135,6 @@ class _MoneroHardwareWalletOptionsFormState extends State<_MoneroHardwareWalletO
bottomSection: Observer(
builder: (_) => Column(
children: [
if (_walletHardwareRestoreVM.passphraseAvailable) ...[
TextButton(
onPressed: () {
showModalBottomSheet(
context: context,
isScrollControlled: true,
backgroundColor: Colors.transparent,
builder: (context) => MoneroHardwareWalletPassphraseInputModal(
controller: _passphraseController,
),
);
},
child: Text(S.of(context).add_a_passphrase),
),
],
LoadingPrimaryButton(
onPressed: _confirmForm,
text: S.of(context).seed_language_next,
@@ -1,3 +1,4 @@
import "package:cake_wallet/src/widgets/cake_image_widget.dart";
import 'package:cake_wallet/src/widgets/new_list_row/list_Item_style_wrapper.dart';
import 'package:cake_wallet/src/widgets/standard_switch.dart';
import 'package:flutter/material.dart';
@@ -7,6 +8,8 @@ class ListItemToggleWidget extends StatefulWidget {
super.key,
required this.keyValue,
required this.label,
this.subtitle,
this.iconPath,
required this.value,
required this.onChanged,
this.leadingEndWidget,
@@ -15,7 +18,9 @@ class ListItemToggleWidget extends StatefulWidget {
});
final String keyValue;
final String? iconPath;
final String label;
final String? subtitle;
final bool value;
final ValueChanged<bool> onChanged;
final Widget? leadingEndWidget;
@@ -48,8 +53,24 @@ class _ListItemToggleWidgetState extends State<ListItemToggleWidget> {
child: Row(
spacing: 8,
children: [
if(widget.iconPath != null && widget.iconPath!.isNotEmpty)
CakeImageWidget(imageUrl: widget.iconPath, width: 24, height: 24,),
Flexible(
child: Text(widget.label, style: textStyle, softWrap: true),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(widget.label, style: textStyle, softWrap: true),
if (widget.subtitle != null)
Padding(
padding: const EdgeInsets.only(right: 8),
child: Text(
widget.subtitle!,
style: labelStyle.copyWith(fontSize: 12),
),
),
],
),
),
if (widget.leadingEndWidget != null) widget.leadingEndWidget!
],
@@ -65,4 +86,4 @@ class _ListItemToggleWidgetState extends State<ListItemToggleWidget> {
);
});
}
}
}
@@ -16,12 +16,12 @@ import 'package:flutter/material.dart';
class NewListSections extends StatelessWidget {
const NewListSections(
{super.key,
required this.sections,
this.controllers = const {},
this.tapHandlers = const {},
this.getCheckboxValue,
this.updateCheckboxValue,
this.showHeader = false});
required this.sections,
this.controllers = const {},
this.tapHandlers = const {},
this.getCheckboxValue,
this.updateCheckboxValue,
this.showHeader = false});
final Map<String, List<ListItem>> sections;
final Map<String, TextEditingController> controllers;
@@ -71,8 +71,8 @@ class NewListSections extends StatelessWidget {
final controller = controllers[item.keyValue];
assert(
controller != null,
'No controller provided for key ${item.keyValue}. '
controller != null,
'No controller provided for key ${item.keyValue}. '
'Please provide a TextEditingController for this key.');
return ListItemTextFieldWidget(
@@ -120,7 +120,9 @@ class NewListSections extends StatelessWidget {
return ListItemToggleWidget(
keyValue: item.keyValue,
label: item.label,
subtitle: item.subtitle,
leadingEndWidget: item.leadingEndWidget,
iconPath: item.iconPath,
value: item.value,
onChanged: item.onChanged,
isFirstInSection: isFirst,
@@ -170,4 +172,4 @@ class NewListSections extends StatelessWidget {
return SizedBox.shrink();
}
}
}