mirror of
https://github.com/trezor/trezor-firmware.git
synced 2025-06-26 01:42:34 +00:00
refactor(core): return uPy Obj from DeviceMenu
[no changelog]
This commit is contained in:
parent
3aab117046
commit
bd89e13493
@ -18,12 +18,18 @@ static void _librust_qstrs(void) {
|
|||||||
MP_QSTR_;
|
MP_QSTR_;
|
||||||
MP_QSTR_ATTACHED;
|
MP_QSTR_ATTACHED;
|
||||||
MP_QSTR_AttachType;
|
MP_QSTR_AttachType;
|
||||||
|
MP_QSTR_AutoLockDelay;
|
||||||
MP_QSTR_BacklightLevels;
|
MP_QSTR_BacklightLevels;
|
||||||
|
MP_QSTR_BackupFailed;
|
||||||
MP_QSTR_BleInterface;
|
MP_QSTR_BleInterface;
|
||||||
MP_QSTR_CANCELLED;
|
MP_QSTR_CANCELLED;
|
||||||
MP_QSTR_CONFIRMED;
|
MP_QSTR_CONFIRMED;
|
||||||
|
MP_QSTR_CheckBackup;
|
||||||
MP_QSTR_DIM;
|
MP_QSTR_DIM;
|
||||||
MP_QSTR_DONE;
|
MP_QSTR_DONE;
|
||||||
|
MP_QSTR_DeviceDisconnect;
|
||||||
|
MP_QSTR_DeviceMenuResult;
|
||||||
|
MP_QSTR_DevicePair;
|
||||||
MP_QSTR_INFO;
|
MP_QSTR_INFO;
|
||||||
MP_QSTR_INITIAL;
|
MP_QSTR_INITIAL;
|
||||||
MP_QSTR_LOW;
|
MP_QSTR_LOW;
|
||||||
@ -42,10 +48,12 @@ static void _librust_qstrs(void) {
|
|||||||
MP_QSTR_SWIPE_LEFT;
|
MP_QSTR_SWIPE_LEFT;
|
||||||
MP_QSTR_SWIPE_RIGHT;
|
MP_QSTR_SWIPE_RIGHT;
|
||||||
MP_QSTR_SWIPE_UP;
|
MP_QSTR_SWIPE_UP;
|
||||||
|
MP_QSTR_ScreenBrightness;
|
||||||
MP_QSTR_TR;
|
MP_QSTR_TR;
|
||||||
MP_QSTR_TRANSITIONING;
|
MP_QSTR_TRANSITIONING;
|
||||||
MP_QSTR_TX_PACKET_LEN;
|
MP_QSTR_TX_PACKET_LEN;
|
||||||
MP_QSTR_TranslationsHeader;
|
MP_QSTR_TranslationsHeader;
|
||||||
|
MP_QSTR_WipeDevice;
|
||||||
MP_QSTR___del__;
|
MP_QSTR___del__;
|
||||||
MP_QSTR___dict__;
|
MP_QSTR___dict__;
|
||||||
MP_QSTR___name__;
|
MP_QSTR___name__;
|
||||||
|
@ -17,6 +17,7 @@ use crate::{
|
|||||||
component::Empty,
|
component::Empty,
|
||||||
layout::{
|
layout::{
|
||||||
base::LAYOUT_STATE,
|
base::LAYOUT_STATE,
|
||||||
|
device_menu_result::DEVICE_MENU_RESULT,
|
||||||
obj::{ComponentMsgObj, LayoutObj, ATTACH_TYPE_OBJ},
|
obj::{ComponentMsgObj, LayoutObj, ATTACH_TYPE_OBJ},
|
||||||
result::{CANCELLED, CONFIRMED, INFO},
|
result::{CANCELLED, CONFIRMED, INFO},
|
||||||
util::{upy_disable_animation, RecoveryType},
|
util::{upy_disable_animation, RecoveryType},
|
||||||
@ -1665,7 +1666,7 @@ pub static mp_module_trezorui_api: Module = obj_module! {
|
|||||||
/// device_name: str,
|
/// device_name: str,
|
||||||
/// paired_devices: Iterable[str],
|
/// paired_devices: Iterable[str],
|
||||||
/// auto_lock_delay: str,
|
/// auto_lock_delay: str,
|
||||||
/// ) -> LayoutObj[UiResult]:
|
/// ) -> LayoutObj[UiResult | DeviceMenuResult | tuple[DeviceMenuResult, int]]:
|
||||||
/// """Show the device menu."""
|
/// """Show the device menu."""
|
||||||
Qstr::MP_QSTR_show_device_menu => obj_fn_kw!(0, new_show_device_menu).as_obj(),
|
Qstr::MP_QSTR_show_device_menu => obj_fn_kw!(0, new_show_device_menu).as_obj(),
|
||||||
|
|
||||||
@ -1834,4 +1835,14 @@ pub static mp_module_trezorui_api: Module = obj_module! {
|
|||||||
/// DONE: "ClassVar[LayoutState]"
|
/// DONE: "ClassVar[LayoutState]"
|
||||||
Qstr::MP_QSTR_LayoutState => LAYOUT_STATE.as_obj(),
|
Qstr::MP_QSTR_LayoutState => LAYOUT_STATE.as_obj(),
|
||||||
|
|
||||||
|
/// class DeviceMenuResult:
|
||||||
|
/// """Result of a device menu operation."""
|
||||||
|
/// BackupFailed: ClassVar[DeviceMenuResult]
|
||||||
|
/// DevicePair: ClassVar[DeviceMenuResult]
|
||||||
|
/// DeviceDisconnect: ClassVar[DeviceMenuResult]
|
||||||
|
/// CheckBackup: ClassVar[DeviceMenuResult]
|
||||||
|
/// WipeDevice: ClassVar[DeviceMenuResult]
|
||||||
|
/// ScreenBrightness: ClassVar[DeviceMenuResult]
|
||||||
|
/// AutoLockDelay: ClassVar[DeviceMenuResult]
|
||||||
|
Qstr::MP_QSTR_DeviceMenuResult => DEVICE_MENU_RESULT.as_obj(),
|
||||||
};
|
};
|
||||||
|
32
core/embed/rust/src/ui/layout/device_menu_result.rs
Normal file
32
core/embed/rust/src/ui/layout/device_menu_result.rs
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
use crate::micropython::{
|
||||||
|
macros::{obj_dict, obj_map, obj_type},
|
||||||
|
qstr::Qstr,
|
||||||
|
simple_type::SimpleTypeObj,
|
||||||
|
typ::Type,
|
||||||
|
};
|
||||||
|
|
||||||
|
static DEVICE_MENU_RESULT_BASE_TYPE: Type = obj_type! { name: Qstr::MP_QSTR_DeviceMenuResult, };
|
||||||
|
|
||||||
|
pub static BACKUP_FAILED: SimpleTypeObj = SimpleTypeObj::new(&DEVICE_MENU_RESULT_BASE_TYPE);
|
||||||
|
pub static DEVICE_PAIR: SimpleTypeObj = SimpleTypeObj::new(&DEVICE_MENU_RESULT_BASE_TYPE);
|
||||||
|
pub static DEVICE_DISCONNECT: SimpleTypeObj = SimpleTypeObj::new(&DEVICE_MENU_RESULT_BASE_TYPE);
|
||||||
|
pub static CHECK_BACKUP: SimpleTypeObj = SimpleTypeObj::new(&DEVICE_MENU_RESULT_BASE_TYPE);
|
||||||
|
pub static WIPE_DEVICE: SimpleTypeObj = SimpleTypeObj::new(&DEVICE_MENU_RESULT_BASE_TYPE);
|
||||||
|
pub static SCREEN_BRIGHTNESS: SimpleTypeObj = SimpleTypeObj::new(&DEVICE_MENU_RESULT_BASE_TYPE);
|
||||||
|
pub static AUTO_LOCK_DELAY: SimpleTypeObj = SimpleTypeObj::new(&DEVICE_MENU_RESULT_BASE_TYPE);
|
||||||
|
|
||||||
|
// Create a DeviceMenuResult class that contains all result types
|
||||||
|
static DEVICE_MENU_RESULT_TYPE: Type = obj_type! {
|
||||||
|
name: Qstr::MP_QSTR_DeviceMenuResult,
|
||||||
|
locals: &obj_dict! { obj_map! {
|
||||||
|
Qstr::MP_QSTR_BackupFailed => BACKUP_FAILED.as_obj(),
|
||||||
|
Qstr::MP_QSTR_DevicePair => DEVICE_PAIR.as_obj(),
|
||||||
|
Qstr::MP_QSTR_DeviceDisconnect => DEVICE_DISCONNECT.as_obj(),
|
||||||
|
Qstr::MP_QSTR_CheckBackup => CHECK_BACKUP.as_obj(),
|
||||||
|
Qstr::MP_QSTR_WipeDevice => WIPE_DEVICE.as_obj(),
|
||||||
|
Qstr::MP_QSTR_ScreenBrightness => SCREEN_BRIGHTNESS.as_obj(),
|
||||||
|
Qstr::MP_QSTR_AutoLockDelay => AUTO_LOCK_DELAY.as_obj(),
|
||||||
|
} },
|
||||||
|
};
|
||||||
|
|
||||||
|
pub static DEVICE_MENU_RESULT: SimpleTypeObj = SimpleTypeObj::new(&DEVICE_MENU_RESULT_TYPE);
|
@ -3,6 +3,8 @@ pub mod base;
|
|||||||
#[cfg(feature = "micropython")]
|
#[cfg(feature = "micropython")]
|
||||||
pub mod obj;
|
pub mod obj;
|
||||||
|
|
||||||
|
#[cfg(feature = "micropython")]
|
||||||
|
pub mod device_menu_result;
|
||||||
#[cfg(feature = "micropython")]
|
#[cfg(feature = "micropython")]
|
||||||
pub mod result;
|
pub mod result;
|
||||||
|
|
||||||
|
@ -1,12 +1,13 @@
|
|||||||
use crate::{
|
use crate::{
|
||||||
error::Error,
|
error::Error,
|
||||||
micropython::obj::Obj,
|
micropython::{obj::Obj, util::new_tuple},
|
||||||
ui::{
|
ui::{
|
||||||
component::{
|
component::{
|
||||||
text::paragraphs::{ParagraphSource, Paragraphs},
|
text::paragraphs::{ParagraphSource, Paragraphs},
|
||||||
Component, Timeout,
|
Component, Timeout,
|
||||||
},
|
},
|
||||||
layout::{
|
layout::{
|
||||||
|
device_menu_result::*,
|
||||||
obj::ComponentMsgObj,
|
obj::ComponentMsgObj,
|
||||||
result::{CANCELLED, CONFIRMED, INFO},
|
result::{CANCELLED, CONFIRMED, INFO},
|
||||||
},
|
},
|
||||||
@ -148,13 +149,15 @@ impl ComponentMsgObj for SetBrightnessScreen {
|
|||||||
impl<'a> ComponentMsgObj for DeviceMenuScreen<'a> {
|
impl<'a> ComponentMsgObj for DeviceMenuScreen<'a> {
|
||||||
fn msg_try_into_obj(&self, msg: Self::Msg) -> Result<Obj, Error> {
|
fn msg_try_into_obj(&self, msg: Self::Msg) -> Result<Obj, Error> {
|
||||||
match msg {
|
match msg {
|
||||||
DeviceMenuMsg::BackupFailed => "BackupFailed".try_into(),
|
DeviceMenuMsg::BackupFailed => Ok(BACKUP_FAILED.as_obj()),
|
||||||
DeviceMenuMsg::DevicePair => "DevicePair".try_into(),
|
DeviceMenuMsg::DevicePair => Ok(DEVICE_PAIR.as_obj()),
|
||||||
DeviceMenuMsg::DeviceDisconnect(_) => "DeviceDisconnect".try_into(),
|
DeviceMenuMsg::DeviceDisconnect(index) => {
|
||||||
DeviceMenuMsg::CheckBackup => "CheckBackup".try_into(),
|
Ok(new_tuple(&[DEVICE_DISCONNECT.as_obj(), index.try_into()?])?)
|
||||||
DeviceMenuMsg::WipeDevice => "WipeDevice".try_into(),
|
}
|
||||||
DeviceMenuMsg::ScreenBrightness => "ScreenBrightness".try_into(),
|
DeviceMenuMsg::CheckBackup => Ok(CHECK_BACKUP.as_obj()),
|
||||||
DeviceMenuMsg::AutoLockDelay => "AutoLockDelay".try_into(),
|
DeviceMenuMsg::WipeDevice => Ok(WIPE_DEVICE.as_obj()),
|
||||||
|
DeviceMenuMsg::ScreenBrightness => Ok(SCREEN_BRIGHTNESS.as_obj()),
|
||||||
|
DeviceMenuMsg::AutoLockDelay => Ok(AUTO_LOCK_DELAY.as_obj()),
|
||||||
DeviceMenuMsg::Close => Ok(CANCELLED.as_obj()),
|
DeviceMenuMsg::Close => Ok(CANCELLED.as_obj()),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -555,7 +555,7 @@ def show_device_menu(
|
|||||||
device_name: str,
|
device_name: str,
|
||||||
paired_devices: Iterable[str],
|
paired_devices: Iterable[str],
|
||||||
auto_lock_delay: str,
|
auto_lock_delay: str,
|
||||||
) -> LayoutObj[UiResult]:
|
) -> LayoutObj[UiResult | DeviceMenuResult | tuple[DeviceMenuResult, int]]:
|
||||||
"""Show the device menu."""
|
"""Show the device menu."""
|
||||||
|
|
||||||
|
|
||||||
@ -739,3 +739,15 @@ class LayoutState:
|
|||||||
ATTACHED: "ClassVar[LayoutState]"
|
ATTACHED: "ClassVar[LayoutState]"
|
||||||
TRANSITIONING: "ClassVar[LayoutState]"
|
TRANSITIONING: "ClassVar[LayoutState]"
|
||||||
DONE: "ClassVar[LayoutState]"
|
DONE: "ClassVar[LayoutState]"
|
||||||
|
|
||||||
|
|
||||||
|
# rust/src/ui/api/firmware_micropython.rs
|
||||||
|
class DeviceMenuResult:
|
||||||
|
"""Result of a device menu operation."""
|
||||||
|
BackupFailed: ClassVar[DeviceMenuResult]
|
||||||
|
DevicePair: ClassVar[DeviceMenuResult]
|
||||||
|
DeviceDisconnect: ClassVar[DeviceMenuResult]
|
||||||
|
CheckBackup: ClassVar[DeviceMenuResult]
|
||||||
|
WipeDevice: ClassVar[DeviceMenuResult]
|
||||||
|
ScreenBrightness: ClassVar[DeviceMenuResult]
|
||||||
|
AutoLockDelay: ClassVar[DeviceMenuResult]
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
import storage.device
|
import storage.device
|
||||||
import trezorui_api
|
import trezorui_api
|
||||||
from trezor import TR, config, utils
|
from trezor import TR, config, utils
|
||||||
from trezor.ui.layouts import raise_if_not_confirmed
|
from trezor.ui.layouts import interact
|
||||||
from trezor.ui.layouts.common import interact
|
|
||||||
from trezor.wire import ActionCancelled
|
from trezor.wire import ActionCancelled
|
||||||
|
from trezorui_api import DeviceMenuResult
|
||||||
|
|
||||||
|
|
||||||
async def _prompt_auto_lock_delay() -> int:
|
async def _prompt_auto_lock_delay() -> int:
|
||||||
@ -61,7 +61,7 @@ async def handle_device_menu() -> None:
|
|||||||
"{count} {plural}", auto_lock_num, auto_lock_label
|
"{count} {plural}", auto_lock_num, auto_lock_label
|
||||||
)
|
)
|
||||||
|
|
||||||
menu_result = await raise_if_not_confirmed(
|
menu_result = await interact(
|
||||||
trezorui_api.show_device_menu(
|
trezorui_api.show_device_menu(
|
||||||
failed_backup=failed_backup,
|
failed_backup=failed_backup,
|
||||||
battery_percentage=battery_percentage,
|
battery_percentage=battery_percentage,
|
||||||
@ -70,27 +70,37 @@ async def handle_device_menu() -> None:
|
|||||||
device_name=device_name,
|
device_name=device_name,
|
||||||
auto_lock_delay=auto_lock_str,
|
auto_lock_delay=auto_lock_str,
|
||||||
),
|
),
|
||||||
None,
|
"device_menu",
|
||||||
)
|
)
|
||||||
if menu_result == "DevicePair":
|
|
||||||
|
if menu_result is DeviceMenuResult.DevicePair:
|
||||||
from apps.management.ble.pair_new_device import pair_new_device
|
from apps.management.ble.pair_new_device import pair_new_device
|
||||||
|
|
||||||
await pair_new_device()
|
await pair_new_device()
|
||||||
elif menu_result == "ScreenBrightness":
|
elif menu_result is DeviceMenuResult.ScreenBrightness:
|
||||||
from trezor.ui.layouts import set_brightness
|
from trezor.ui.layouts import set_brightness
|
||||||
|
|
||||||
await set_brightness()
|
await set_brightness()
|
||||||
elif menu_result == "WipeDevice":
|
elif menu_result is DeviceMenuResult.WipeDevice:
|
||||||
from trezor.messages import WipeDevice
|
from trezor.messages import WipeDevice
|
||||||
|
|
||||||
from apps.management.wipe_device import wipe_device
|
from apps.management.wipe_device import wipe_device
|
||||||
|
|
||||||
await wipe_device(WipeDevice())
|
await wipe_device(WipeDevice())
|
||||||
elif menu_result == "AutoLockDelay":
|
elif menu_result is DeviceMenuResult.AutoLockDelay:
|
||||||
|
|
||||||
if config.has_pin():
|
if config.has_pin():
|
||||||
|
|
||||||
auto_lock_delay_ms = await _prompt_auto_lock_delay()
|
auto_lock_delay_ms = await _prompt_auto_lock_delay()
|
||||||
storage.device.set_autolock_delay_ms(auto_lock_delay_ms)
|
storage.device.set_autolock_delay_ms(auto_lock_delay_ms)
|
||||||
|
elif isinstance(menu_result, tuple):
|
||||||
|
# It's a tuple with (result_type, index)
|
||||||
|
result_type, index = menu_result
|
||||||
|
if result_type is DeviceMenuResult.DeviceDisconnect:
|
||||||
|
raise RuntimeError(
|
||||||
|
f"Device disconnect not implemented, device index: {index}"
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
raise RuntimeError(f"Unknown menu {result_type}, {index}")
|
||||||
else:
|
else:
|
||||||
raise RuntimeError(f"Unknown menu {menu_result}")
|
raise RuntimeError(f"Unknown menu {menu_result}")
|
||||||
|
Loading…
Reference in New Issue
Block a user