From 3a5fdfedccb00cfdd72d7434c95c733471d864c8 Mon Sep 17 00:00:00 2001 From: Martin Milata Date: Fri, 28 Apr 2023 14:43:59 +0200 Subject: [PATCH] fix(core/ui): minor visual tweaks - centered title for coinjoin loader - make device label bold on label confirmation screen [no changelog] --- core/embed/firmware/mpconfigport.h | 2 +- core/embed/rust/librust_qstr.h | 1 + .../model_tt/component/coinjoin_progress.rs | 2 +- core/embed/rust/src/ui/model_tt/layout.rs | 68 +++++++++++++++++-- core/embed/unix/mpconfigport.h | 2 +- core/mocks/generated/trezorui2.pyi | 17 ++++- core/src/apps/management/apply_settings.py | 8 +-- core/src/trezor/ui/layouts/tr/__init__.py | 20 ++++++ core/src/trezor/ui/layouts/tt_v2/__init__.py | 28 ++++++++ tests/ui_tests/fixtures.json | 28 ++++---- 10 files changed, 148 insertions(+), 28 deletions(-) diff --git a/core/embed/firmware/mpconfigport.h b/core/embed/firmware/mpconfigport.h index f6a5dc18cf..56a1c056bb 100644 --- a/core/embed/firmware/mpconfigport.h +++ b/core/embed/firmware/mpconfigport.h @@ -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) diff --git a/core/embed/rust/librust_qstr.h b/core/embed/rust/librust_qstr.h index 59dd11851a..c6bdb93a9a 100644 --- a/core/embed/rust/librust_qstr.h +++ b/core/embed/rust/librust_qstr.h @@ -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; diff --git a/core/embed/rust/src/ui/model_tt/component/coinjoin_progress.rs b/core/embed/rust/src/ui/model_tt/component/coinjoin_progress.rs index 979cd7f1c2..7e3e973e69 100644 --- a/core/embed/rust/src/ui/model_tt/component/coinjoin_progress.rs +++ b/core/embed/rust/src/ui/model_tt/component/coinjoin_progress.rs @@ -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), diff --git a/core/embed/rust/src/ui/model_tt/layout.rs b/core/embed/rust/src/ui/model_tt/layout.rs index dd6fd4df28..2f2069dab1 100644 --- a/core/embed/rust/src/ui/model_tt/layout.rs +++ b/core/embed/rust/src/ui/model_tt/layout.rs @@ -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 ComponentMsgObj for FormattedText +where + T: StringType + Clone, +{ + fn msg_try_into_obj(&self, _msg: Self::Msg) -> Result { + unreachable!() + } +} + impl ComponentMsgObj for Checklist where T: ParagraphSource, @@ -349,7 +359,7 @@ impl ComponentMsgObj for (Timeout, T) where T: Component, { - fn msg_try_into_obj(&self, msg: Self::Msg) -> Result { + fn msg_try_into_obj(&self, _msg: Self::Msg) -> Result { 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 = 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::::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, @@ -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.""" diff --git a/core/embed/unix/mpconfigport.h b/core/embed/unix/mpconfigport.h index 1ea15f0237..af15fe6453 100644 --- a/core/embed/unix/mpconfigport.h +++ b/core/embed/unix/mpconfigport.h @@ -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) diff --git a/core/mocks/generated/trezorui2.pyi b/core/mocks/generated/trezorui2.pyi index 9bcc2af84a..b4c4b4857f 100644 --- a/core/mocks/generated/trezorui2.pyi +++ b/core/mocks/generated/trezorui2.pyi @@ -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.""" diff --git a/core/src/apps/management/apply_settings.py b/core/src/apps/management/apply_settings.py index 264c810370..9ffbff5a31 100644 --- a/core/src/apps/management/apply_settings.py +++ b/core/src/apps/management/apply_settings.py @@ -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", ) diff --git a/core/src/trezor/ui/layouts/tr/__init__.py b/core/src/trezor/ui/layouts/tr/__init__.py index ccab93455f..234bd84787 100644 --- a/core/src/trezor/ui/layouts/tr/__init__.py +++ b/core/src/trezor/ui/layouts/tr/__init__.py @@ -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, diff --git a/core/src/trezor/ui/layouts/tt_v2/__init__.py b/core/src/trezor/ui/layouts/tt_v2/__init__.py index 30a2de76c8..4b8eedefc9 100644 --- a/core/src/trezor/ui/layouts/tt_v2/__init__.py +++ b/core/src/trezor/ui/layouts/tt_v2/__init__.py @@ -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: diff --git a/tests/ui_tests/fixtures.json b/tests/ui_tests/fixtures.json index 69754b07d7..a2c5a51c26 100644 --- a/tests/ui_tests/fixtures.json +++ b/tests/ui_tests/fixtures.json @@ -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",