chore(core/eckhart): update apply settings label flow
What changed, and why it matters
This commit is a routine user-interface polish change for the Trezor hardware wallet. It updates the on-screen button label and color when changing the device's name, and adds a short 'Device name changed' confirmation screen afterward. There is no security fix or vulnerability here.
No security action needed; treat as normal UI/UX maintenance.
Security signals we found
No strong security signals were identified.
Evidence from the diff
The patch refactors the device-name change confirmation flow. It introduces a new confirm_change_label helper across four UI layout backends (bolt, caesar, delizia, eckhart), changes the Eckhart layout’s right button from a generic confirm to a styled confirm button, and adds a new translated string ‘device_name__changed’ shown after the label is updated. Translation signature metadata is refreshed accordingly.
Changed components
core/src/apps/management/apply_settings.pycore/src/trezor/ui/layouts/bolt/__init__.pycore/src/trezor/ui/layouts/caesar/__init__.pycore/src/trezor/ui/layouts/delizia/__init__.pycore/src/trezor/ui/layouts/eckhart/__init__.pycore/embed/rust/src/ui/layout_eckhart/ui_firmware.rscore/translations/en.jsonInspect captured patch +77 / −16
diff --git a/core/embed/rust/librust_qstr.h b/core/embed/rust/librust_qstr.h
index 143ece18..8656b5a6 100644
--- a/core/embed/rust/librust_qstr.h
+++ b/core/embed/rust/librust_qstr.h
@@ -268,6 +268,7 @@ static void _librust_qstrs(void) {
MP_QSTR_details_title;
MP_QSTR_device_name;
MP_QSTR_device_name__change_template;
+ MP_QSTR_device_name__changed;
MP_QSTR_device_name__continue_with_empty_label;
MP_QSTR_device_name__enter;
MP_QSTR_device_name__title;
diff --git a/core/embed/rust/src/translations/generated/translated_string.rs b/core/embed/rust/src/translations/generated/translated_string.rs
index b3ce0d8b..bad20620 100644
--- a/core/embed/rust/src/translations/generated/translated_string.rs
+++ b/core/embed/rust/src/translations/generated/translated_string.rs
@@ -1461,6 +1461,7 @@ pub enum TranslatedString {
device_name__enter = 1077, // "Enter device name"
regulatory_certification__title = 1078, // "Regulatory certification"
words__name = 1079, // "Name"
+ device_name__changed = 1080, // "Device name changed."
}
impl TranslatedString {
@@ -3241,6 +3242,7 @@ impl TranslatedString {
(Self::device_name__enter, "Enter device name"),
(Self::regulatory_certification__title, "Regulatory certification"),
(Self::words__name, "Name"),
+ (Self::device_name__changed, "Device name changed."),
];
#[cfg(feature = "micropython")]
@@ -3608,6 +3610,7 @@ impl TranslatedString {
#[cfg(feature = "debug")]
(Qstr::MP_QSTR_debug__loading_seed_not_recommended, Self::debug__loading_seed_not_recommended),
(Qstr::MP_QSTR_device_name__change_template, Self::device_name__change_template),
+ (Qstr::MP_QSTR_device_name__changed, Self::device_name__changed),
(Qstr::MP_QSTR_device_name__continue_with_empty_label, Self::device_name__continue_with_empty_label),
(Qstr::MP_QSTR_device_name__enter, Self::device_name__enter),
(Qstr::MP_QSTR_device_name__title, Self::device_name__title),
diff --git a/core/embed/rust/src/ui/layout_eckhart/ui_firmware.rs b/core/embed/rust/src/ui/layout_eckhart/ui_firmware.rs
index 8c826abc..c00fa95b 100644
--- a/core/embed/rust/src/ui/layout_eckhart/ui_firmware.rs
+++ b/core/embed/rust/src/ui/layout_eckhart/ui_firmware.rs
@@ -188,10 +188,12 @@ impl FirmwareUI for UIEckhart {
}
}
let text = FormattedText::new(ops);
- let action_bar = ActionBar::new_double(
- Button::with_icon(theme::ICON_CROSS),
- Button::with_text(verb.unwrap_or(TR::buttons__confirm.into())),
- );
+ let right_button = if let Some(verb) = verb {
+ Button::with_text(verb)
+ } else {
+ Button::with_text(TR::buttons__confirm.into()).styled(button_confirm())
+ };
+ let action_bar = ActionBar::new_double(Button::with_icon(theme::ICON_CROSS), right_button);
let screen = TextScreen::new(text)
.with_header(Header::new(title))
.with_action_bar(action_bar);
diff --git a/core/mocks/trezortranslate_keys.pyi b/core/mocks/trezortranslate_keys.pyi
index f10b1bd7..08e69695 100644
--- a/core/mocks/trezortranslate_keys.pyi
+++ b/core/mocks/trezortranslate_keys.pyi
@@ -250,6 +250,7 @@ class TR:
debug__loading_seed: str = "Loading seed"
debug__loading_seed_not_recommended: str = "Loading private seed is not recommended."
device_name__change_template: str = "Change device name to {0}?"
+ device_name__changed: str = "Device name changed."
device_name__continue_with_empty_label: str = "Continue with empty device name?"
device_name__enter: str = "Enter device name"
device_name__title: str = "Device name"
diff --git a/core/src/apps/management/apply_settings.py b/core/src/apps/management/apply_settings.py
index 7c89e8cc..6e5ddfd2 100644
--- a/core/src/apps/management/apply_settings.py
+++ b/core/src/apps/management/apply_settings.py
@@ -161,14 +161,10 @@ async def _require_confirm_change_homescreen(homescreen: bytes) -> None:
async def _require_confirm_change_label(label: str) -> None:
- from trezor.ui.layouts import confirm_single
+ from trezor.ui.layouts import confirm_change_label
- await confirm_single(
- "set_label",
- TR.device_name__title,
- description=TR.device_name__change_template,
- description_param=label,
- verb=TR.buttons__change,
+ await confirm_change_label(
+ "set_label", TR.device_name__title, TR.device_name__change_template, label
)
diff --git a/core/src/trezor/ui/layouts/bolt/__init__.py b/core/src/trezor/ui/layouts/bolt/__init__.py
index 25dc88ae..176f2dac 100644
--- a/core/src/trezor/ui/layouts/bolt/__init__.py
+++ b/core/src/trezor/ui/layouts/bolt/__init__.py
@@ -213,6 +213,19 @@ def confirm_homescreen(image: bytes) -> Awaitable[None]:
)
+async def confirm_change_label(
+ br_name: str, title: str, template: str, param: str
+) -> None:
+
+ await confirm_single(
+ br_name=br_name,
+ title=title,
+ description=template,
+ description_param=param,
+ verb=TR.buttons__change,
+ )
+
+
def confirm_change_passphrase(use: bool) -> Awaitable[None]:
description = TR.passphrase__turn_on if use else TR.passphrase__turn_off
verb = TR.buttons__turn_on if use else TR.buttons__turn_off
diff --git a/core/src/trezor/ui/layouts/caesar/__init__.py b/core/src/trezor/ui/layouts/caesar/__init__.py
index a8993be3..7cf396fe 100644
--- a/core/src/trezor/ui/layouts/caesar/__init__.py
+++ b/core/src/trezor/ui/layouts/caesar/__init__.py
@@ -231,6 +231,19 @@ def confirm_homescreen(image: bytes) -> Awaitable[None]:
)
+async def confirm_change_label(
+ br_name: str, title: str, template: str, param: str
+) -> None:
+
+ await confirm_single(
+ br_name=br_name,
+ title=title,
+ description=template,
+ description_param=param,
+ verb=TR.buttons__change,
+ )
+
+
def confirm_change_passphrase(use: bool) -> Awaitable[None]:
description = TR.passphrase__turn_on if use else TR.passphrase__turn_off
verb = TR.buttons__turn_on if use else TR.buttons__turn_off
diff --git a/core/src/trezor/ui/layouts/delizia/__init__.py b/core/src/trezor/ui/layouts/delizia/__init__.py
index 4ddcb1dc..c61afb4c 100644
--- a/core/src/trezor/ui/layouts/delizia/__init__.py
+++ b/core/src/trezor/ui/layouts/delizia/__init__.py
@@ -236,6 +236,19 @@ def confirm_homescreen(
)
+async def confirm_change_label(
+ br_name: str, title: str, template: str, param: str
+) -> None:
+
+ await confirm_single(
+ br_name=br_name,
+ title=title,
+ description=template,
+ description_param=param,
+ verb=TR.buttons__change,
+ )
+
+
def confirm_change_passphrase(use: bool) -> Awaitable[ui.UiResult]:
description = TR.passphrase__turn_on if use else TR.passphrase__turn_off
diff --git a/core/src/trezor/ui/layouts/eckhart/__init__.py b/core/src/trezor/ui/layouts/eckhart/__init__.py
index 85a4f995..630314dd 100644
--- a/core/src/trezor/ui/layouts/eckhart/__init__.py
+++ b/core/src/trezor/ui/layouts/eckhart/__init__.py
@@ -93,12 +93,14 @@ def confirm_single(
trezorui_api.confirm_emphasized(
title=title,
items=(begin, (True, description_param), end),
- verb=verb,
+ verb=None,
),
br_name,
ButtonRequestType.ProtectCall,
)
+ show_continue_in_app(TR.address__confirmed)
+
def confirm_reset_device(recovery: bool = False) -> Awaitable[None]:
return raise_if_cancelled(
@@ -217,6 +219,21 @@ def confirm_homescreen(
)
+async def confirm_change_label(
+ br_name: str, title: str, template: str, param: str
+) -> None:
+
+ await confirm_single(
+ br_name=br_name,
+ title=title,
+ description=template,
+ description_param=param,
+ verb=None,
+ )
+
+ show_continue_in_app(TR.device_name__changed)
+
+
def confirm_change_passphrase(use: bool) -> Awaitable[None]:
description = TR.passphrase__turn_on if use else TR.passphrase__turn_off
diff --git a/core/translations/en.json b/core/translations/en.json
index f0b4ec74..a11a9536 100644
--- a/core/translations/en.json
+++ b/core/translations/en.json
@@ -282,6 +282,7 @@
"debug__loading_seed": "Loading seed",
"debug__loading_seed_not_recommended": "Loading private seed is not recommended.",
"device_name__change_template": "Change device name to {0}?",
+ "device_name__changed": "Device name changed.",
"device_name__continue_with_empty_label": "Continue with empty device name?",
"device_name__enter": "Enter device name",
"device_name__title": "Device name",
diff --git a/core/translations/order.json b/core/translations/order.json
index afba5a1d..3d0507f6 100644
--- a/core/translations/order.json
+++ b/core/translations/order.json
@@ -1078,5 +1078,6 @@
"1076": "device_name__continue_with_empty_label",
"1077": "device_name__enter",
"1078": "regulatory_certification__title",
- "1079": "words__name"
+ "1079": "words__name",
+ "1080": "device_name__changed"
}
diff --git a/core/translations/signatures.json b/core/translations/signatures.json
index 84faf9f5..d4298bae 100644
--- a/core/translations/signatures.json
+++ b/core/translations/signatures.json
@@ -1,8 +1,8 @@
{
"current": {
- "merkle_root": "2ccd8252bccecdb7fd94da5b7f6b504aee0abf62adc7dfa68e8d6ced638acb82",
- "datetime": "2025-08-20T06:07:28.795050+00:00",
- "commit": "0e72c2178cd24750deeda1b4264933946285bcc7"
+ "merkle_root": "e44bae08b662c59aa91b62a75b9ee40858603b11ece9d8d4af19e5fd04a01fdc",
+ "datetime": "2025-08-20T07:39:47.219011+00:00",
+ "commit": "ec8cfd0bf7531340876483537a555def259bbfc7"
},
"history": [
{
Why this scored 15/100
Community notes
Notes can correct, qualify, or add evidence to the AI analysis. Every note shown here has been validated by a human moderator.
The AI analysis stands alone for now. Submit a note if you can add evidence or important context.