1
0
mirror of https://github.com/trezor/trezor-firmware.git synced 2025-01-08 22:40:59 +00:00

fix(core/ui): minor visual tweaks

- centered title for coinjoin loader
- make device label bold on label confirmation screen

[no changelog]
This commit is contained in:
Martin Milata 2023-04-28 14:43:59 +02:00
parent 312f6899c7
commit 3a5fdfedcc
10 changed files with 148 additions and 28 deletions

View File

@ -90,7 +90,7 @@
#define MICROPY_PY_DELATTR_SETATTR (0)
#define MICROPY_PY_BUILTINS_STR_UNICODE (1)
#define MICROPY_PY_BUILTINS_STR_CENTER (1)
#define MICROPY_PY_BUILTINS_STR_PARTITION (0)
#define MICROPY_PY_BUILTINS_STR_PARTITION (1)
#define MICROPY_PY_BUILTINS_STR_SPLITLINES (0)
#define MICROPY_PY_BUILTINS_MEMORYVIEW (1)
#define MICROPY_PY_BUILTINS_FROZENSET (0)

View File

@ -37,6 +37,7 @@ static void _librust_qstrs(void) {
MP_QSTR_confirm_address;
MP_QSTR_confirm_blob;
MP_QSTR_confirm_coinjoin;
MP_QSTR_confirm_emphasized;
MP_QSTR_confirm_fido;
MP_QSTR_confirm_homescreen;
MP_QSTR_confirm_joint_total;

View File

@ -60,7 +60,7 @@ where
Self {
value: 0,
indeterminate,
content: Frame::left_aligned(
content: Frame::centered(
theme::label_title(),
"COINJOIN IN PROGRESS",
Split::bottom(RECTANGLE_HEIGHT, 0, Empty, inner),

View File

@ -23,6 +23,7 @@ use crate::{
painter,
placed::GridPlaced,
text::{
op::OpTextLayout,
paragraphs::{
Checklist, Paragraph, ParagraphSource, ParagraphVecLong, ParagraphVecShort,
Paragraphs, VecExt,
@ -270,6 +271,15 @@ where
}
}
impl<T> ComponentMsgObj for FormattedText<T>
where
T: StringType + Clone,
{
fn msg_try_into_obj(&self, _msg: Self::Msg) -> Result<Obj, Error> {
unreachable!()
}
}
impl<T> ComponentMsgObj for Checklist<T>
where
T: ParagraphSource,
@ -349,7 +359,7 @@ impl<T> ComponentMsgObj for (Timeout, T)
where
T: Component<Msg = ()>,
{
fn msg_try_into_obj(&self, msg: Self::Msg) -> Result<Obj, Error> {
fn msg_try_into_obj(&self, _msg: Self::Msg) -> Result<Obj, Error> {
Ok(CANCELLED.as_obj())
}
}
@ -447,6 +457,47 @@ extern "C" fn new_confirm_action(n_args: usize, args: *const Obj, kwargs: *mut M
unsafe { util::try_with_args_and_kwargs(n_args, args, kwargs, block) }
}
extern "C" fn new_confirm_emphasized(n_args: usize, args: *const Obj, kwargs: *mut Map) -> Obj {
let block = move |_args: &[Obj], kwargs: &Map| {
let title: StrBuffer = kwargs.get(Qstr::MP_QSTR_title)?.try_into()?;
let verb: Option<StrBuffer> = kwargs
.get(Qstr::MP_QSTR_verb)
.unwrap_or_else(|_| Obj::const_none())
.try_into_option()?;
let items: Obj = kwargs.get(Qstr::MP_QSTR_items)?;
let mut iter_buf = IterBuf::new();
let iter = Iter::try_from_obj_with_buf(items, &mut iter_buf)?;
let mut ops = OpTextLayout::new(theme::TEXT_NORMAL);
for item in iter {
if item.is_str() {
ops = ops.text_normal(item.try_into()?)
} else {
let [emphasis, text]: [Obj; 2] = iter_into_array(item)?;
let text: StrBuffer = text.try_into()?;
if emphasis.try_into()? {
ops = ops.text_demibold(text);
} else {
ops = ops.text_normal(text);
}
}
}
let buttons = Button::<StrBuffer>::cancel_confirm_text(None, verb);
let obj = LayoutObj::new(Frame::left_aligned(
theme::label_title(),
title,
SwipePage::new(
FormattedText::new(ops).vertically_aligned(geometry::Alignment::Center),
buttons,
theme::BG,
),
))?;
Ok(obj.into())
};
unsafe { util::try_with_args_and_kwargs(n_args, args, kwargs, block) }
}
struct ConfirmBlobParams {
title: StrBuffer,
subtitle: Option<StrBuffer>,
@ -1596,6 +1647,15 @@ pub static mp_module_trezorui2: Module = obj_module! {
/// """Confirm action."""
Qstr::MP_QSTR_confirm_action => obj_fn_kw!(0, new_confirm_action).as_obj(),
/// def confirm_emphasized(
/// *,
/// title: str,
/// items: Iterable[str | tuple[bool, str]],
/// verb: str | None = None,
/// ) -> object:
/// """Confirm formatted text that has been pre-split in python. For tuples
/// the first component is a bool indicating whether this part is emphasized."""
Qstr::MP_QSTR_confirm_emphasized => obj_fn_kw!(0, new_confirm_emphasized).as_obj(),
/// def confirm_homescreen(
/// *,
@ -1685,7 +1745,7 @@ pub static mp_module_trezorui2: Module = obj_module! {
/// def confirm_total(
/// *,
/// title: str,
/// items: List[Tuple[str, str]],
/// items: list[tuple[str, str]],
/// info_button: bool = False,
/// ) -> object:
/// """Transaction summary. Always hold to confirm."""
@ -1787,7 +1847,7 @@ pub static mp_module_trezorui2: Module = obj_module! {
/// title: str,
/// button: str,
/// info_button: str,
/// items: Iterable[Tuple[int, str]],
/// items: Iterable[tuple[int, str]],
/// ) -> object:
/// """Confirm given items but with third button. Always single page
/// without scrolling."""
@ -1797,7 +1857,7 @@ pub static mp_module_trezorui2: Module = obj_module! {
/// *,
/// title: str,
/// button: str,
/// items: Iterable[Tuple[int, str]],
/// items: Iterable[tuple[int, str]],
/// ) -> object:
/// """Confirm long content with the possibility to go back from any page.
/// Meant to be used with confirm_with_info."""

View File

@ -98,7 +98,7 @@
#define MICROPY_PY_DELATTR_SETATTR (0)
#define MICROPY_PY_BUILTINS_STR_UNICODE (1)
#define MICROPY_PY_BUILTINS_STR_CENTER (1)
#define MICROPY_PY_BUILTINS_STR_PARTITION (0)
#define MICROPY_PY_BUILTINS_STR_PARTITION (1)
#define MICROPY_PY_BUILTINS_STR_SPLITLINES (0)
#define MICROPY_PY_BUILTINS_MEMORYVIEW (1)
#define MICROPY_PY_BUILTINS_FROZENSET (0)

View File

@ -400,6 +400,17 @@ def confirm_action(
"""Confirm action."""
# rust/src/ui/model_tt/layout.rs
def confirm_emphasized(
*,
title: str,
items: Iterable[str | tuple[bool, str]],
verb: str | None = None,
) -> object:
"""Confirm formatted text that has been pre-split in python. For tuples
the first component is a bool indicating whether this part is emphasized."""
# rust/src/ui/model_tt/layout.rs
def confirm_homescreen(
*,
@ -497,7 +508,7 @@ def confirm_value(
def confirm_total(
*,
title: str,
items: List[Tuple[str, str]],
items: list[tuple[str, str]],
info_button: bool = False,
) -> object:
"""Transaction summary. Always hold to confirm."""
@ -608,7 +619,7 @@ def confirm_with_info(
title: str,
button: str,
info_button: str,
items: Iterable[Tuple[int, str]],
items: Iterable[tuple[int, str]],
) -> object:
"""Confirm given items but with third button. Always single page
without scrolling."""
@ -619,7 +630,7 @@ def confirm_more(
*,
title: str,
button: str,
items: Iterable[Tuple[int, str]],
items: Iterable[tuple[int, str]],
) -> object:
"""Confirm long content with the possibility to go back from any page.
Meant to be used with confirm_with_info."""

View File

@ -2,7 +2,7 @@ from typing import TYPE_CHECKING
from trezor import utils
from trezor.enums import ButtonRequestType
from trezor.ui.layouts import confirm_action, confirm_homescreen
from trezor.ui.layouts import confirm_action, confirm_homescreen, confirm_single
from trezor.wire import DataError
import trezorui2
@ -172,13 +172,13 @@ async def _require_confirm_change_homescreen(
async def _require_confirm_change_label(ctx: GenericContext, label: str) -> None:
await confirm_action(
await confirm_single(
ctx,
"set_label",
"Device name",
description="Do you want to change device name to {}?",
description="Change device name to {}?",
description_param=label,
br_code=BRT_PROTECT_CALL,
verb="Change",
)

View File

@ -363,6 +363,26 @@ async def confirm_action(
)
async def confirm_single(
ctx: GenericContext,
br_type: str,
title: str,
description: str,
description_param: str | None = None,
verb: str | None = None,
) -> None:
description_param = description_param or ""
begin, _separator, end = description.partition("{}")
await confirm_action(
ctx,
br_type,
title,
description=begin + description_param + end,
verb=verb or "CONFIRM",
br_code=ButtonRequestType.ProtectCall,
)
async def confirm_reset_device(
ctx: GenericContext,
title: str,

View File

@ -278,6 +278,34 @@ async def confirm_action(
)
async def confirm_single(
ctx: GenericContext,
br_type: str,
title: str,
description: str,
description_param: str | None = None,
verb: str | None = None,
) -> None:
if verb is not None:
verb = verb.upper()
description_param = description_param or ""
begin, _separator, end = description.partition("{}")
await raise_if_not_confirmed(
interact(
ctx,
RustLayout(
trezorui2.confirm_emphasized(
title=title.upper(),
items=(begin, (True, description_param), end),
verb=verb,
)
),
br_type,
ButtonRequestType.ProtectCall,
)
)
async def confirm_reset_device(
ctx: GenericContext, title: str, recovery: bool = False
) -> None:

View File

@ -1756,7 +1756,7 @@
"TR_test_autolock.py::test_apply_auto_lock_delay_valid[60]": "132313d9d2e89b6d1361d2c02ca8a9572a521bbfaf6453e49b991954923413f2",
"TR_test_autolock.py::test_apply_auto_lock_delay_valid[7227]": "b654071bf9d7faff8b7f283150804d712400f9e5a8217bcb89fb76f83dc467d1",
"TR_test_autolock.py::test_autolock_cancels_ui": "24adeb92c6c701075980bd0f8b08cae8decb48aea67e81b0c880f23278a5d942",
"TR_test_autolock.py::test_autolock_default_value": "dd186ea42e0ea51696ff28b2cf9f58cce6efa2d8e84a68e95047cbef9e9f835a",
"TR_test_autolock.py::test_autolock_default_value": "5d0b75910b0934f9739c6ff0c058ab616219db27c008a0de1f36a236cf0a73ba",
"TR_test_autolock.py::test_autolock_ignores_getaddress": "87f75b4035574d1f982ca2bb834c298c81f9cd94baeeb7b44722662e37602dbf",
"TR_test_autolock.py::test_autolock_ignores_initialize": "87f75b4035574d1f982ca2bb834c298c81f9cd94baeeb7b44722662e37602dbf",
"TR_test_basic.py::test_device_id_different": "6ed1584443961ba00a4759d91f3b13a9ffa93fce1e2568744e153aeb0765dd0d",
@ -1774,16 +1774,16 @@
"TR_test_firmware_hash.py::test_firmware_hash_emu": "5c20e27dcba8ba5e74512a5b6c4517e07c29c3c2f622fc4b9532eddbf82c6ac9",
"TR_test_firmware_hash.py::test_firmware_hash_hw": "57e3aa5a6a55926dcc95ca290bf1b2826bbc86b535e0baa162f7c79b1784c96b",
"TR_test_msg_applysettings.py::test_apply_homescreen_tr_toif_good": "70c2479c43f0d902ce235aa134f990f798cd677dca298b0898d1676d1cd225f6",
"TR_test_msg_applysettings.py::test_apply_homescreen_tr_toif_with_long_label": "9d8c753c0e0459d9368c87025b1d008d8f5f66d0b018dfa6d7aaa13de28b6665",
"TR_test_msg_applysettings.py::test_apply_homescreen_tr_toif_with_long_label": "d5375706916cb55e945182ffb12b4d3ead018216ed155572296ca6e9e9a8d9a7",
"TR_test_msg_applysettings.py::test_apply_homescreen_tr_toif_with_notification": "5a31233b5dd5d5fed19f06c2ac52f7d93e6b19c6013d6d752ce82f56244503fd",
"TR_test_msg_applysettings.py::test_apply_homescreen_tr_toif_wrong_size": "4af2680f5abfe0d5f173841f5431c3dc5dfedb40af8c205b3f11615e89ca9fac",
"TR_test_msg_applysettings.py::test_apply_homescreen_tr_upload_jpeg_fail": "4af2680f5abfe0d5f173841f5431c3dc5dfedb40af8c205b3f11615e89ca9fac",
"TR_test_msg_applysettings.py::test_apply_homescreen_tr_upload_t1_fail": "4af2680f5abfe0d5f173841f5431c3dc5dfedb40af8c205b3f11615e89ca9fac",
"TR_test_msg_applysettings.py::test_apply_settings": "033ea55744ae6e1f58f316026611b4688dae4185a1a6d9c90e74ccc14ecd6e8a",
"TR_test_msg_applysettings.py::test_apply_settings": "b6103ad64a5b73749363d2d981a50439c654e6f427f481fa1b01b2c3b0a81aa5",
"TR_test_msg_applysettings.py::test_apply_settings_passphrase": "cd99c6c8eecd12536ba3bc43a2105c617b7b7e82b5f50b3a22834dab23ead905",
"TR_test_msg_applysettings.py::test_apply_settings_passphrase_on_device": "c0d276bc4b64307c1440b648bc87f1de44edf2af8a3b3b32997f3271990f66b8",
"TR_test_msg_applysettings.py::test_apply_settings_rotation": "1b1f2d2d66d458550e524b6cb9d36dcda132e1d10bf1c95c1cde6a3fc1d3616b",
"TR_test_msg_applysettings.py::test_experimental_features": "23629cfa1744ee0f2f69e0fb393d648885c0251c4486e531b5a52ada9b7ee9dc",
"TR_test_msg_applysettings.py::test_experimental_features": "2a06448be4d338d4801e546e8eede4f9effeca2c9dc78dbb6b6449ffaf37cf4f",
"TR_test_msg_applysettings.py::test_label_too_long": "57e3aa5a6a55926dcc95ca290bf1b2826bbc86b535e0baa162f7c79b1784c96b",
"TR_test_msg_applysettings.py::test_safety_checks": "2abd8b80488fa2ac88987469b2d0d050b41e32aba5bb3fc33b860374f3fd57d1",
"TR_test_msg_backup_device.py::test_backup_bip39": "c3f73753287060702e5ee4ee8a7dcf1344d25f42dfec7bb25cc349954e1a35c3",
@ -1820,7 +1820,7 @@
"TR_test_pin.py::test_exponential_backoff_t2": "52281d0972707fdc79d75c7be53a2245cb08bce99032747084895657d7dca5d6",
"TR_test_pin.py::test_incorrect_pin_t2": "124344d031a0bb76a00619252359f32bb3a0e795743ed4c07633e0d016b9fc2f",
"TR_test_pin.py::test_no_protection": "57e3aa5a6a55926dcc95ca290bf1b2826bbc86b535e0baa162f7c79b1784c96b",
"TR_test_protection_levels.py::test_apply_settings": "3d0230adc6180464094133d8570c4a32739462ebbc7838a84c9e3a5f6ae1a781",
"TR_test_protection_levels.py::test_apply_settings": "4a624209ced2b6e147a316018be1f46cccc5fdc9a0660c1316d3f8f7dbc973bd",
"TR_test_protection_levels.py::test_change_pin_t2": "146c99c81e6501b1171234e56ef85967e095774eb591313f2dbf72a42546bd9e",
"TR_test_protection_levels.py::test_get_address": "65abab80b1efa1fc29199bedd350d7e76b3096fbb575fc600a76cf67a69328f4",
"TR_test_protection_levels.py::test_get_entropy": "07ffdd1d2d447d3610b99cf2f14949b8101f6fa212c2dc8349df13d0ba651740",
@ -1884,7 +1884,7 @@
},
"TT": {
"click_tests": {
"TT_test_autolock.py::test_autolock_does_not_interrupt_preauthorized": "03e156da82e7acd3509f831d1fc2e635fcebc673f3c14d61d141273e608fc7a4",
"TT_test_autolock.py::test_autolock_does_not_interrupt_preauthorized": "670aa732e6d64912be8a0658a5ce4a3a602e2dd0dfe9ff9c68766bab777c2d2e",
"TT_test_autolock.py::test_autolock_does_not_interrupt_signing": "6711f75420f88f7500a6adfa8d9d25007871f698e08f048a80450085d9452133",
"TT_test_autolock.py::test_autolock_interrupts_passphrase": "d1f797544d62708739c340dd4aa4ee28cfc65e9b643f595a55706de5917ee82f",
"TT_test_autolock.py::test_autolock_interrupts_signing": "ae4d3cc00fd5482b4499eff1c73aec75f4153e34950db910d4f787cc5f9b4208",
@ -1938,8 +1938,8 @@
"TT_bitcoin-test_authorize_coinjoin.py::test_get_address": "a350f2131e942e52029dd8646c33a5392335eef2f4e8a64499a3e185c8890f57",
"TT_bitcoin-test_authorize_coinjoin.py::test_get_public_key": "fe6f38a712c28289520dae54bbdf5aa67e7a34916a1b8c7064130419d5f22e04",
"TT_bitcoin-test_authorize_coinjoin.py::test_multisession_authorization": "fe8cd9934667d12430865eeccd7fdfd2f957ac933aa438fd15d5eaa6a7c1ab7b",
"TT_bitcoin-test_authorize_coinjoin.py::test_sign_tx": "23ab128ca97aaac5506d8e77f0fe9951db62538a60ea3664cab4f3d7b84501f6",
"TT_bitcoin-test_authorize_coinjoin.py::test_sign_tx_large": "fd523b4cd46d79aba746ab20e75a519ffa9858d94471ab53a7f22c2edf7306ab",
"TT_bitcoin-test_authorize_coinjoin.py::test_sign_tx": "65a8e11765a403512659e3af55db625423e300cdda5406cd6d383642b32cd740",
"TT_bitcoin-test_authorize_coinjoin.py::test_sign_tx_large": "20dd629b0a249610f5b507e0c3aa8b85201482195fec1b42fe61c39db69e9564",
"TT_bitcoin-test_authorize_coinjoin.py::test_sign_tx_migration": "750b3cebac7e8467763642fce5c5b3a7984877e199bc0b1acf36eb9b266985e8",
"TT_bitcoin-test_authorize_coinjoin.py::test_sign_tx_spend": "4df5b3f3038732bef4f0613ffa82ba840f571cd44740ea5c4e0dd8fd3e37a915",
"TT_bitcoin-test_authorize_coinjoin.py::test_wrong_account_type": "0a9ed8c97bfbf9f5615ffd9286c6ffb18f92f81481a2c97fb643b83cd96d2545",
@ -2951,15 +2951,15 @@
"TT_test_autolock.py::test_apply_auto_lock_delay_valid[60]": "e451683254af05cbdc8fa4caad1925dfd5e7de7338fc80f1289fb198f9c1f676",
"TT_test_autolock.py::test_apply_auto_lock_delay_valid[7227]": "0e00ab4c70dd9fec3511712ebbcdfa2556487efa1e53830248240627c5f1417f",
"TT_test_autolock.py::test_autolock_cancels_ui": "41bce102e56bcb761e7480690b4f2ded2739522c9642c7233eceafece9641a1e",
"TT_test_autolock.py::test_autolock_default_value": "0126aab250a451219f64248cb9ff5a34e36e9c8caf85b175f16fbaa90a38e654",
"TT_test_autolock.py::test_autolock_default_value": "903b00be6bfa0694284da893caeef10a69be0c4e9484416d6968c57cdfa8e347",
"TT_test_autolock.py::test_autolock_ignores_getaddress": "21605135cfbb4914cd525d6b76f260a17fe6552fdadcf9a89b2ec6e3572606f5",
"TT_test_autolock.py::test_autolock_ignores_initialize": "21605135cfbb4914cd525d6b76f260a17fe6552fdadcf9a89b2ec6e3572606f5",
"TT_test_basic.py::test_device_id_different": "6f8d7ba4ef109b2c20d09689d1fa329e23d5a11d21ce47a91339aeb21ffcf1ad",
"TT_test_basic.py::test_device_id_same": "80a6e289138a604cf351a29511cf6f85e2243591317894703152787e1351a1a3",
"TT_test_basic.py::test_features": "80a6e289138a604cf351a29511cf6f85e2243591317894703152787e1351a1a3",
"TT_test_basic.py::test_ping": "80a6e289138a604cf351a29511cf6f85e2243591317894703152787e1351a1a3",
"TT_test_busy_state.py::test_busy_expiry": "ba86a3b442bcc2709762a008734511cf5d7ddd715f7184e9006061b8046e2d56",
"TT_test_busy_state.py::test_busy_state": "808dd87ba553e2f1f89d5d9ae0a2605d4e39a394cb0a538ff19370a0a49adeb7",
"TT_test_busy_state.py::test_busy_expiry": "903a28c07c3ae14381b4c854cda714052d828b6138ee6e1fcd3907a7d4ff5eb8",
"TT_test_busy_state.py::test_busy_state": "2f6cd1ee1c57655ccb3d8c116227fac68fd1692abb21f4d842b76142f8bc941a",
"TT_test_cancel.py::test_cancel_message_via_cancel[message0]": "1bd3157d54327e33542f89dcac6c7cd23808f7c9aa1b0adb390e5fcc1fd858a5",
"TT_test_cancel.py::test_cancel_message_via_cancel[message1]": "1bd3157d54327e33542f89dcac6c7cd23808f7c9aa1b0adb390e5fcc1fd858a5",
"TT_test_cancel.py::test_cancel_message_via_initialize[message0]": "1bd3157d54327e33542f89dcac6c7cd23808f7c9aa1b0adb390e5fcc1fd858a5",
@ -2972,11 +2972,11 @@
"TT_test_msg_applysettings.py::test_apply_homescreen_jpeg_progressive": "914efb0961a2182f1ffb1b71b4dc68fc59c000270d4e0d8be98550f435bb3a34",
"TT_test_msg_applysettings.py::test_apply_homescreen_jpeg_wrong_size": "914efb0961a2182f1ffb1b71b4dc68fc59c000270d4e0d8be98550f435bb3a34",
"TT_test_msg_applysettings.py::test_apply_homescreen_toif": "914efb0961a2182f1ffb1b71b4dc68fc59c000270d4e0d8be98550f435bb3a34",
"TT_test_msg_applysettings.py::test_apply_settings": "19e2405d937b26de2c48744d4f8a5ff876a1f276dd0f574af0b18f9cf095b133",
"TT_test_msg_applysettings.py::test_apply_settings": "65331ed91d57db555d6a6d44f27323c771158367d47d1b591e5067b71b44ba8a",
"TT_test_msg_applysettings.py::test_apply_settings_passphrase": "87d6fcedfa5ebabe9ae8c6a1e138bdcb2023c2cb52d84b62576c1f8602bb9803",
"TT_test_msg_applysettings.py::test_apply_settings_passphrase_on_device": "be0c1a6a8c60e74b18929349bba70b9bd313d0a95faf8c42795e9eff6f1391da",
"TT_test_msg_applysettings.py::test_apply_settings_rotation": "59466fcbae8742584adf7269eac15d5eeb905e0ddebc32087e01dbb22f60096f",
"TT_test_msg_applysettings.py::test_experimental_features": "e7bdcfa8708fc0fbe88f5f4cc7f93497c94fa5ae9e08282496c04e993123674c",
"TT_test_msg_applysettings.py::test_experimental_features": "f38ed6fd1202c705571c4bd30978c9af1992e3ff3f1bf679f835c48e0573f52d",
"TT_test_msg_applysettings.py::test_label_too_long": "80a6e289138a604cf351a29511cf6f85e2243591317894703152787e1351a1a3",
"TT_test_msg_applysettings.py::test_safety_checks": "4ec93f34a54d13317c2d5434ed5853d0edf0f6d91772aab2a15acf7e3de75458",
"TT_test_msg_backup_device.py::test_backup_bip39": "a01b8e554380d678021934d3ff1465b9e822079bc6d98a94660b3d11c7ad0e10",
@ -3016,7 +3016,7 @@
"TT_test_pin.py::test_exponential_backoff_t2": "477f517b378cfbbea696d26156d225e82cafc923a61439ebd2fcdc30624621f8",
"TT_test_pin.py::test_incorrect_pin_t2": "a876b9361f82c8921f9e0f6139f6603171d1a2f072d397be62af9c01fad3f562",
"TT_test_pin.py::test_no_protection": "80a6e289138a604cf351a29511cf6f85e2243591317894703152787e1351a1a3",
"TT_test_protection_levels.py::test_apply_settings": "f21279b8f97c74260ccbe823e8e71b475ed6f631966c977fd56197e182b26c41",
"TT_test_protection_levels.py::test_apply_settings": "d28b52f30a3513b03a1649261c8762211aa3d82e2afa305e3ea30380f1f8c5dd",
"TT_test_protection_levels.py::test_change_pin_t2": "990124ab2de328f9f2080ee8936d96e0d0d62d52ee64b453553af9e54bea1d59",
"TT_test_protection_levels.py::test_get_address": "79930e3c2d8e3e87934f7f06d09daa27508beb1e5ed413006533ce03bc3c45ce",
"TT_test_protection_levels.py::test_get_entropy": "a820cf9c173f1aa5b446ef9f40910594e1346bfb94219d7204254bc5b1a38909",