1
0
mirror of https://github.com/trezor/trezor-firmware.git synced 2024-11-25 17:09:44 +00:00

refactor(core): move confirm_reset to UiFeatures

- unify param to just one bool `recovery`
- title and button is determined in Rust based on the argument
This commit is contained in:
obrusvit 2024-11-01 21:03:39 +01:00
parent 2692743608
commit d4fa752709
16 changed files with 92 additions and 123 deletions

View File

@ -251,7 +251,6 @@ static void _librust_qstrs(void) {
MP_QSTR_firmware_update__title_fingerprint;
MP_QSTR_first_screen;
MP_QSTR_flow_confirm_output;
MP_QSTR_flow_confirm_reset;
MP_QSTR_flow_confirm_set_new_pin;
MP_QSTR_flow_confirm_summary;
MP_QSTR_flow_continue_recovery;

View File

@ -110,6 +110,16 @@ extern "C" fn new_confirm_homescreen(n_args: usize, args: *const Obj, kwargs: *m
unsafe { util::try_with_args_and_kwargs(n_args, args, kwargs, block) }
}
extern "C" fn new_confirm_reset_device(n_args: usize, args: *const Obj, kwargs: *mut Map) -> Obj {
let block = move |_args: &[Obj], kwargs: &Map| {
let recovery: bool = kwargs.get(Qstr::MP_QSTR_recovery)?.try_into()?;
let layout = ModelUI::confirm_reset_device(recovery)?;
Ok(LayoutObj::new_root(layout)?.into())
};
unsafe { util::try_with_args_and_kwargs(n_args, args, kwargs, block) }
}
extern "C" fn new_request_bip39(n_args: usize, args: *const Obj, kwargs: *mut Map) -> Obj {
let block = move |_args: &[Obj], kwargs: &Map| {
let prompt: TString = kwargs.get(Qstr::MP_QSTR_prompt)?.try_into()?;
@ -494,6 +504,10 @@ pub static mp_module_trezorui_api: Module = obj_module! {
/// """Confirm homescreen."""
Qstr::MP_QSTR_confirm_homescreen => obj_fn_kw!(0, new_confirm_homescreen).as_obj(),
/// def confirm_reset_device(recovery: bool) -> LayoutObj[UiResult]:
/// """Confirm TOS before creating wallet creation or wallet recovery."""
Qstr::MP_QSTR_confirm_reset_device => obj_fn_kw!(0, new_confirm_reset_device).as_obj(),
/// def request_bip39(
/// *,
/// prompt: str,

View File

@ -389,16 +389,6 @@ extern "C" fn new_confirm_properties(n_args: usize, args: *const Obj, kwargs: *m
unsafe { util::try_with_args_and_kwargs(n_args, args, kwargs, block) }
}
extern "C" fn new_confirm_reset(n_args: usize, args: *const Obj, kwargs: *mut Map) -> Obj {
let block = move |_args: &[Obj], kwargs: &Map| {
let recovery: bool = kwargs.get(Qstr::MP_QSTR_recovery)?.try_into()?;
let flow = flow::confirm_reset::new_confirm_reset(recovery)?;
Ok(LayoutObj::new_root(flow)?.into())
};
unsafe { util::try_with_args_and_kwargs(n_args, args, kwargs, block) }
}
extern "C" fn new_confirm_set_new_pin(n_args: usize, args: *const Obj, kwargs: *mut Map) -> Obj {
let block = move |_args: &[Obj], kwargs: &Map| {
let title: TString = kwargs.get(Qstr::MP_QSTR_title)?.try_into()?;
@ -1147,10 +1137,6 @@ pub static mp_module_trezorui2: Module = obj_module! {
/// the value is to be rendered as binary with monospace font, False otherwise."""
Qstr::MP_QSTR_confirm_properties => obj_fn_kw!(0, new_confirm_properties).as_obj(),
/// def flow_confirm_reset(recovery: bool) -> LayoutObj[UiResult]:
/// """Confirm TOS before creating wallet creation or wallet recovery."""
Qstr::MP_QSTR_flow_confirm_reset => obj_fn_kw!(0, new_confirm_reset).as_obj(),
// TODO: supply more arguments for Wipe code setting when figma done
/// def flow_confirm_set_new_pin(
/// *,

View File

@ -107,6 +107,11 @@ impl UIFeaturesFirmware for ModelMercuryFeatures {
Ok(flow)
}
fn confirm_reset_device(recovery: bool) -> Result<impl LayoutMaybeTrace, Error> {
let flow = flow::confirm_reset::new_confirm_reset(recovery)?;
Ok(flow)
}
fn check_homescreen_format(image: BinaryData, __accept_toif: bool) -> bool {
super::component::check_homescreen_format(image)
}

View File

@ -372,24 +372,6 @@ extern "C" fn new_confirm_properties(n_args: usize, args: *const Obj, kwargs: *m
unsafe { util::try_with_args_and_kwargs(n_args, args, kwargs, block) }
}
extern "C" fn new_confirm_reset_device(n_args: usize, args: *const Obj, kwargs: *mut Map) -> Obj {
let block = move |_args: &[Obj], kwargs: &Map| {
let title: TString = kwargs.get(Qstr::MP_QSTR_title)?.try_into()?;
let button: TString<'static> = kwargs.get(Qstr::MP_QSTR_button)?.try_into()?;
let ops = OpTextLayout::new(theme::TEXT_NORMAL)
.text_normal(TR::reset__by_continuing)
.next_page()
.text_normal(TR::reset__more_info_at)
.newline()
.text_bold(TR::reset__tos_link);
let formatted = FormattedText::new(ops).vertically_centered();
content_in_button_page(title, formatted, button, Some("".into()), false)
};
unsafe { util::try_with_args_and_kwargs(n_args, args, kwargs, block) }
}
extern "C" fn new_confirm_backup(n_args: usize, args: *const Obj, kwargs: *mut Map) -> Obj {
let block = move |_args: &[Obj], _kwargs: &Map| {
let get_page = move |page_index| match page_index {
@ -1296,14 +1278,6 @@ pub static mp_module_trezorui2: Module = obj_module! {
/// This only concerns the text style, you need to decode the value to UTF-8 in python."""
Qstr::MP_QSTR_confirm_properties => obj_fn_kw!(0, new_confirm_properties).as_obj(),
/// def confirm_reset_device(
/// *,
/// title: str,
/// button: str,
/// ) -> LayoutObj[UiResult]:
/// """Confirm TOS before device setup."""
Qstr::MP_QSTR_confirm_reset_device => obj_fn_kw!(0, new_confirm_reset_device).as_obj(),
/// def confirm_backup() -> LayoutObj[UiResult]:
/// """Strongly recommend user to do backup."""
Qstr::MP_QSTR_confirm_backup => obj_fn_kw!(0, new_confirm_backup).as_obj(),

View File

@ -30,7 +30,9 @@ use crate::{
use super::{
component::{
ButtonDetails, ButtonPage, CoinJoinProgress, ConfirmHomescreen, Flow, FlowPages, Frame, Homescreen, Lockscreen, NumberInput, PassphraseEntry, PinEntry, Progress, ScrollableFrame, SimpleChoice, WordlistEntry, WordlistType
ButtonDetails, ButtonPage, CoinJoinProgress, ConfirmHomescreen, Flow, FlowPages, Frame,
Homescreen, Lockscreen, NumberInput, PassphraseEntry, PinEntry, Progress, ScrollableFrame,
SimpleChoice, WordlistEntry, WordlistType,
},
theme, ModelTRFeatures,
};
@ -114,6 +116,29 @@ impl UIFeaturesFirmware for ModelTRFeatures {
Ok(layout)
}
fn confirm_reset_device(recovery: bool) -> Result<impl LayoutMaybeTrace, Error> {
let (title, button) = if recovery {
(
TR::recovery__title_recover.into(),
TR::reset__button_recover.into(),
)
} else {
(
TR::reset__title_create_wallet.into(),
TR::reset__button_create.into(),
)
};
let ops = OpTextLayout::new(theme::TEXT_NORMAL)
.text_normal(TR::reset__by_continuing)
.next_page()
.text_normal(TR::reset__more_info_at)
.newline()
.text_bold(TR::reset__tos_link);
let formatted = FormattedText::new(ops).vertically_centered();
content_in_button_page(title, formatted, button, Some("".into()), false)
}
fn check_homescreen_format(image: BinaryData, _accept_toif: bool) -> bool {
super::component::check_homescreen_format(image)
}

View File

@ -565,32 +565,6 @@ extern "C" fn new_confirm_properties(n_args: usize, args: *const Obj, kwargs: *m
unsafe { util::try_with_args_and_kwargs(n_args, args, kwargs, block) }
}
extern "C" fn new_confirm_reset_device(n_args: usize, args: *const Obj, kwargs: *mut Map) -> Obj {
let block = move |_args: &[Obj], kwargs: &Map| {
let title: TString = kwargs.get(Qstr::MP_QSTR_title)?.try_into()?;
let button: TString = kwargs.get(Qstr::MP_QSTR_button)?.try_into()?;
let par_array: [Paragraph<'static>; 3] = [
Paragraph::new(&theme::TEXT_NORMAL, TR::reset__by_continuing).with_bottom_padding(17), /* simulating a carriage return */
Paragraph::new(&theme::TEXT_NORMAL, TR::reset__more_info_at),
Paragraph::new(&theme::TEXT_DEMIBOLD, TR::reset__tos_link),
];
let paragraphs = Paragraphs::new(par_array);
let buttons = Button::cancel_confirm(
Button::with_icon(theme::ICON_CANCEL),
Button::with_text(button).styled(theme::button_confirm()),
true,
);
let obj = LayoutObj::new(Frame::left_aligned(
theme::label_title(),
title,
Dialog::new(paragraphs, buttons),
))?;
Ok(obj.into())
};
unsafe { util::try_with_args_and_kwargs(n_args, args, kwargs, block) }
}
extern "C" fn new_show_address_details(n_args: usize, args: *const Obj, kwargs: *mut Map) -> Obj {
let block = move |_args: &[Obj], kwargs: &Map| {
let qr_title: TString<'static> = kwargs.get(Qstr::MP_QSTR_qr_title)?.try_into()?;
@ -1252,14 +1226,6 @@ pub static mp_module_trezorui2: Module = obj_module! {
/// the value is to be rendered as binary with monospace font, False otherwise."""
Qstr::MP_QSTR_confirm_properties => obj_fn_kw!(0, new_confirm_properties).as_obj(),
/// def confirm_reset_device(
/// *,
/// title: str,
/// button: str,
/// ) -> LayoutObj[UiResult]:
/// """Confirm TOS before device setup."""
Qstr::MP_QSTR_confirm_reset_device => obj_fn_kw!(0, new_confirm_reset_device).as_obj(),
/// def show_address_details(
/// *,
/// qr_title: str,

View File

@ -122,6 +122,37 @@ impl UIFeaturesFirmware for ModelTTFeatures {
Ok(layout)
}
fn confirm_reset_device(recovery: bool) -> Result<impl LayoutMaybeTrace, Error> {
let (title, button) = if recovery {
(
TR::recovery__title_recover.into(),
TR::reset__button_recover.into(),
)
} else {
(
TR::reset__title_create_wallet.into(),
TR::reset__button_create.into(),
)
};
let par_array: [Paragraph<'static>; 3] = [
Paragraph::new(&theme::TEXT_NORMAL, TR::reset__by_continuing).with_bottom_padding(17), /* simulating a carriage return */
Paragraph::new(&theme::TEXT_NORMAL, TR::reset__more_info_at),
Paragraph::new(&theme::TEXT_DEMIBOLD, TR::reset__tos_link),
];
let paragraphs = Paragraphs::new(par_array);
let buttons = Button::cancel_confirm(
Button::with_icon(theme::ICON_CANCEL),
Button::with_text(button).styled(theme::button_confirm()),
true,
);
let layout = RootComponent::new(Frame::left_aligned(
theme::label_title(),
title,
Dialog::new(paragraphs, buttons),
));
Ok(layout)
}
fn check_homescreen_format(image: BinaryData, accept_toif: bool) -> bool {
super::component::check_homescreen_format(image, false)
}

View File

@ -30,6 +30,8 @@ pub trait UIFeaturesFirmware {
fingerprint: TString<'static>,
) -> Result<impl LayoutMaybeTrace, Error>;
fn confirm_reset_device(recovery: bool) -> Result<impl LayoutMaybeTrace, Error>;
fn check_homescreen_format(image: BinaryData, accept_toif: bool) -> bool;
fn request_bip39(

View File

@ -60,11 +60,6 @@ def confirm_properties(
the value is to be rendered as binary with monospace font, False otherwise."""
# rust/src/ui/model_mercury/layout.rs
def flow_confirm_reset(recovery: bool) -> LayoutObj[UiResult]:
"""Confirm TOS before creating wallet creation or wallet recovery."""
# rust/src/ui/model_mercury/layout.rs
def flow_confirm_set_new_pin(
*,
@ -391,15 +386,6 @@ def confirm_properties(
This only concerns the text style, you need to decode the value to UTF-8 in python."""
# rust/src/ui/model_tr/layout.rs
def confirm_reset_device(
*,
title: str,
button: str,
) -> LayoutObj[UiResult]:
"""Confirm TOS before device setup."""
# rust/src/ui/model_tr/layout.rs
def confirm_backup() -> LayoutObj[UiResult]:
"""Strongly recommend user to do backup."""
@ -700,15 +686,6 @@ def confirm_properties(
the value is to be rendered as binary with monospace font, False otherwise."""
# rust/src/ui/model_tt/layout.rs
def confirm_reset_device(
*,
title: str,
button: str,
) -> LayoutObj[UiResult]:
"""Confirm TOS before device setup."""
# rust/src/ui/model_tt/layout.rs
def show_address_details(
*,

View File

@ -114,6 +114,11 @@ def confirm_homescreen(
"""Confirm homescreen."""
# rust/src/ui/api/firmware_upy.rs
def confirm_reset_device(recovery: bool) -> LayoutObj[UiResult]:
"""Confirm TOS before creating wallet creation or wallet recovery."""
# rust/src/ui/api/firmware_upy.rs
def request_bip39(
*,

View File

@ -67,7 +67,7 @@ async def recovery_device(msg: RecoveryDevice) -> Success:
return await recovery_process()
if recovery_type == RecoveryType.NormalRecovery:
await confirm_reset_device(TR.recovery__title_recover, recovery=True)
await confirm_reset_device(recovery=True)
# wipe storage to make sure the device is in a clear state
storage.reset()

View File

@ -55,7 +55,7 @@ async def reset_device(msg: ResetDevice) -> Success:
_validate_reset_device(msg)
# make sure user knows they're setting up a new wallet
await confirm_reset_device(TR.reset__title_create_wallet)
await confirm_reset_device()
# Rendering empty loader so users do not feel a freezing screen
render_empty_loader(config.StorageMessage.PROCESSING_MSG)

View File

@ -89,8 +89,10 @@ def confirm_single(
)
def confirm_reset_device(_title: str, recovery: bool = False) -> Awaitable[None]:
return raise_if_not_confirmed(trezorui2.flow_confirm_reset(recovery=recovery), None)
def confirm_reset_device(recovery: bool = False) -> Awaitable[None]:
return raise_if_not_confirmed(
trezorui_api.confirm_reset_device(recovery=recovery), None
)
async def show_wallet_created_success() -> None:

View File

@ -109,19 +109,10 @@ def confirm_single(
def confirm_reset_device(
title: str,
recovery: bool = False,
) -> Awaitable[None]:
if recovery:
button = TR.reset__button_recover
else:
button = TR.reset__button_create
return raise_if_not_confirmed(
trezorui2.confirm_reset_device(
title=title,
button=button,
),
trezorui_api.confirm_reset_device(recovery=recovery),
"recover_device" if recovery else "setup_device",
ButtonRequestType.ProtectCall if recovery else ButtonRequestType.ResetDevice,
)

View File

@ -84,17 +84,9 @@ def confirm_single(
)
def confirm_reset_device(title: str, recovery: bool = False) -> Awaitable[None]:
if recovery:
button = TR.reset__button_recover
else:
button = TR.reset__button_create
def confirm_reset_device(recovery: bool = False) -> Awaitable[None]:
return raise_if_not_confirmed(
trezorui2.confirm_reset_device(
title=title,
button=button,
),
trezorui_api.confirm_reset_device(recovery=recovery),
"recover_device" if recovery else "setup_device",
(ButtonRequestType.ProtectCall if recovery else ButtonRequestType.ResetDevice),
)