fix(core): temporarily disable bluetooth switching button
What changed, and why it matters
This commit removes a Bluetooth on/off button from the Trezor device's settings menu. The button was only a placeholder: it showed a confirmation dialog but did not actually change Bluetooth state. The change is described as a temporary UI cleanup because the underlying Bluetooth control API is not yet available. There is no security fix here.
No security action required. Treat as a normal feature/UI cleanup commit. If tracking development, note that Bluetooth control remains unimplemented and will need a proper implementation later.
Security signals we found
No strong security signals were identified.
Evidence from the diff
The patch deletes the bluetooth parameter and Bluetooth DeviceMenuResult variant from the device-menu UI API across all Rust UI layouts (Bolt, Caesar, Delizia, Eckhart) and the Python mock. In the Eckhart layout it removes the Bluetooth menu item and its message handler. In core/src/apps/homescreen/device_menu.py it stops passing bluetooth=True and removes the Bluetooth result branch that only called confirm_action and then did nothing (pass # TODO implement bluetooth handling). The commit message says the API for turning BLE on is not available, so the button is temporarily disabled.
Changed components
Trezor firmware core UI device menuEckhart layout settings menuPython homescreen device_menu handlerRust UI firmware trait and layout implementationsInspect captured patch +2 / −58
diff --git a/core/embed/rust/librust_qstr.h b/core/embed/rust/librust_qstr.h
index e388ecdc..9ee66f41 100644
--- a/core/embed/rust/librust_qstr.h
+++ b/core/embed/rust/librust_qstr.h
@@ -23,7 +23,6 @@ static void _librust_qstrs(void) {
MP_QSTR_BLEIF;
MP_QSTR_BacklightLevels;
MP_QSTR_BackupFailed;
- MP_QSTR_Bluetooth;
MP_QSTR_CANCELLED;
MP_QSTR_CONFIRMED;
MP_QSTR_CheckBackup;
@@ -192,7 +191,6 @@ static void _librust_qstrs(void) {
MP_QSTR_ble__unpair_title;
MP_QSTR_ble__version;
MP_QSTR_ble_event;
- MP_QSTR_bluetooth;
MP_QSTR_bootscreen;
MP_QSTR_br_code;
MP_QSTR_br_name;
diff --git a/core/embed/rust/src/ui/api/firmware_micropython.rs b/core/embed/rust/src/ui/api/firmware_micropython.rs
index f9d05774..2d222000 100644
--- a/core/embed/rust/src/ui/api/firmware_micropython.rs
+++ b/core/embed/rust/src/ui/api/firmware_micropython.rs
@@ -940,7 +940,6 @@ extern "C" fn new_show_device_menu(n_args: usize, args: *const Obj, kwargs: *mut
let paired_devices: Vec<TString, MAX_PAIRED_DEVICES> = util::iter_into_vec(paired_devices)?;
let connected_idx: Option<usize> =
kwargs.get(Qstr::MP_QSTR_connected_idx)?.try_into_option()?;
- let bluetooth: Option<bool> = kwargs.get(Qstr::MP_QSTR_bluetooth)?.try_into_option()?;
let pin_code: Option<bool> = kwargs.get(Qstr::MP_QSTR_pin_code)?.try_into_option()?;
let auto_lock_delay: Option<TString> = kwargs
.get(Qstr::MP_QSTR_auto_lock_delay)?
@@ -961,7 +960,6 @@ extern "C" fn new_show_device_menu(n_args: usize, args: *const Obj, kwargs: *mut
failed_backup,
paired_devices,
connected_idx,
- bluetooth,
pin_code,
auto_lock_delay,
wipe_code,
@@ -1903,7 +1901,6 @@ pub static mp_module_trezorui_api: Module = obj_module! {
/// failed_backup: bool,
/// paired_devices: Iterable[str],
/// connected_idx: int | None,
- /// bluetooth: bool | None,
/// pin_code: bool | None,
/// auto_lock_delay: str | None,
/// wipe_code: bool | None,
@@ -2113,7 +2110,6 @@ pub static mp_module_trezorui_api: Module = obj_module! {
/// DevicePair: ClassVar[DeviceMenuResult]
/// DeviceUnpair: ClassVar[DeviceMenuResult]
/// DeviceUnpairAll: ClassVar[DeviceMenuResult]
- /// Bluetooth: ClassVar[DeviceMenuResult]
/// PinCode: ClassVar[DeviceMenuResult]
/// PinRemove: ClassVar[DeviceMenuResult]
/// AutoLockDelay: ClassVar[DeviceMenuResult]
diff --git a/core/embed/rust/src/ui/layout/device_menu_result.rs b/core/embed/rust/src/ui/layout/device_menu_result.rs
index 79c94444..9c029c6a 100644
--- a/core/embed/rust/src/ui/layout/device_menu_result.rs
+++ b/core/embed/rust/src/ui/layout/device_menu_result.rs
@@ -9,8 +9,6 @@ static DEVICE_MENU_RESULT_BASE_TYPE: Type = obj_type! { name: Qstr::MP_QSTR_Devi
// Root menu
pub static BACKUP_FAILED: SimpleTypeObj = SimpleTypeObj::new(&DEVICE_MENU_RESULT_BASE_TYPE);
-// Bluetooth
-pub static BLUETOOTH: SimpleTypeObj = SimpleTypeObj::new(&DEVICE_MENU_RESULT_BASE_TYPE);
// "Pair & Connect"
pub static DEVICE_PAIR: SimpleTypeObj = SimpleTypeObj::new(&DEVICE_MENU_RESULT_BASE_TYPE);
pub static DEVICE_DISCONNECT: SimpleTypeObj = SimpleTypeObj::new(&DEVICE_MENU_RESULT_BASE_TYPE);
@@ -39,7 +37,6 @@ 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_Bluetooth => BLUETOOTH.as_obj(),
Qstr::MP_QSTR_DevicePair => DEVICE_PAIR.as_obj(),
Qstr::MP_QSTR_DeviceDisconnect => DEVICE_DISCONNECT.as_obj(),
Qstr::MP_QSTR_DeviceUnpair => DEVICE_UNPAIR.as_obj(),
diff --git a/core/embed/rust/src/ui/layout_bolt/ui_firmware.rs b/core/embed/rust/src/ui/layout_bolt/ui_firmware.rs
index eff1b1bd..cee7f2b1 100644
--- a/core/embed/rust/src/ui/layout_bolt/ui_firmware.rs
+++ b/core/embed/rust/src/ui/layout_bolt/ui_firmware.rs
@@ -937,7 +937,6 @@ impl FirmwareUI for UIBolt {
_failed_backup: bool,
_paired_devices: heapless::Vec<TString<'static>, MAX_PAIRED_DEVICES>,
_connected_idx: Option<usize>,
- _bluetooth: Option<bool>,
_pin_code: Option<bool>,
_auto_lock_delay: Option<TString<'static>>,
_wipe_code: Option<bool>,
diff --git a/core/embed/rust/src/ui/layout_caesar/ui_firmware.rs b/core/embed/rust/src/ui/layout_caesar/ui_firmware.rs
index 7d29c7d8..7a5ce5aa 100644
--- a/core/embed/rust/src/ui/layout_caesar/ui_firmware.rs
+++ b/core/embed/rust/src/ui/layout_caesar/ui_firmware.rs
@@ -1131,7 +1131,6 @@ impl FirmwareUI for UICaesar {
_failed_backup: bool,
_paired_devices: heapless::Vec<TString<'static>, MAX_PAIRED_DEVICES>,
_connected_idx: Option<usize>,
- _bluetooth: Option<bool>,
_pin_code: Option<bool>,
_auto_lock_delay: Option<TString<'static>>,
_wipe_code: Option<bool>,
diff --git a/core/embed/rust/src/ui/layout_delizia/ui_firmware.rs b/core/embed/rust/src/ui/layout_delizia/ui_firmware.rs
index 321bec28..e6ada129 100644
--- a/core/embed/rust/src/ui/layout_delizia/ui_firmware.rs
+++ b/core/embed/rust/src/ui/layout_delizia/ui_firmware.rs
@@ -1021,7 +1021,6 @@ impl FirmwareUI for UIDelizia {
_failed_backup: bool,
_paired_devices: heapless::Vec<TString<'static>, MAX_PAIRED_DEVICES>,
_connected_idx: Option<usize>,
- _bluetooth: Option<bool>,
_pin_code: Option<bool>,
_auto_lock_delay: Option<TString<'static>>,
_wipe_code: Option<bool>,
diff --git a/core/embed/rust/src/ui/layout_eckhart/component_msg_obj.rs b/core/embed/rust/src/ui/layout_eckhart/component_msg_obj.rs
index 3290c8b5..38dfcf0f 100644
--- a/core/embed/rust/src/ui/layout_eckhart/component_msg_obj.rs
+++ b/core/embed/rust/src/ui/layout_eckhart/component_msg_obj.rs
@@ -159,8 +159,6 @@ impl ComponentMsgObj for DeviceMenuScreen {
match msg {
// Root menu
DeviceMenuMsg::BackupFailed => Ok(BACKUP_FAILED.as_obj()),
- // Bluetooth
- DeviceMenuMsg::Bluetooth => Ok(BLUETOOTH.as_obj()),
// "Pair & Connect"
DeviceMenuMsg::DevicePair => Ok(DEVICE_PAIR.as_obj()),
DeviceMenuMsg::DeviceDisconnect => Ok(DEVICE_DISCONNECT.as_obj()),
diff --git a/core/embed/rust/src/ui/layout_eckhart/firmware/device_menu_screen.rs b/core/embed/rust/src/ui/layout_eckhart/firmware/device_menu_screen.rs
index a3542d39..3c22324f 100644
--- a/core/embed/rust/src/ui/layout_eckhart/firmware/device_menu_screen.rs
+++ b/core/embed/rust/src/ui/layout_eckhart/firmware/device_menu_screen.rs
@@ -61,9 +61,6 @@ pub enum DeviceMenuMsg {
// Root menu
BackupFailed,
- // Bluetooth
- Bluetooth,
-
// "Pair & Connect"
DevicePair, // pair a new device
DeviceDisconnect, // disconnect a device
@@ -218,7 +215,6 @@ impl DeviceMenuScreen {
failed_backup: bool,
paired_devices: Vec<TString<'static>, MAX_PAIRED_DEVICES>,
connected_idx: Option<usize>,
- bluetooth: Option<bool>,
pin_code: Option<bool>,
auto_lock_delay: Option<TString<'static>>,
wipe_code: Option<bool>,
@@ -258,7 +254,7 @@ impl DeviceMenuScreen {
regulatory,
about,
);
- let settings = screen.add_settings_menu(bluetooth, security, device);
+ let settings = screen.add_settings_menu(security, device);
let power = screen.add_power_menu();
let is_connected = connected_idx.is_some_and(|idx| idx < paired_devices.len());
@@ -324,29 +320,8 @@ impl DeviceMenuScreen {
self.add_subscreen(Subscreen::Submenu(submenu_index))
}
- fn add_settings_menu(
- &mut self,
- bluetooth: Option<bool>,
- security_index: Option<usize>,
- device_index: usize,
- ) -> usize {
+ fn add_settings_menu(&mut self, security_index: Option<usize>, device_index: usize) -> usize {
let mut items: Vec<MenuItem, MEDIUM_MENU_ITEMS> = Vec::new();
- if let Some(bluetooth) = bluetooth {
- let mut bluetooth_item = MenuItem::new(
- TR::words__bluetooth.into(),
- Some(Action::Return(DeviceMenuMsg::Bluetooth)),
- );
- let subtext = if bluetooth {
- (
- TR::words__on.into(),
- Some(&theme::TEXT_MENU_ITEM_SUBTITLE_GREEN),
- )
- } else {
- (TR::words__off.into(), None)
- };
- bluetooth_item.with_subtext(Some(subtext));
- unwrap!(items.push(bluetooth_item));
- }
if let Some(security_index) = security_index {
unwrap!(items.push(MenuItem::new(
TR::words__security.into(),
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 b1c2d427..a9fcd05f 100644
--- a/core/embed/rust/src/ui/layout_eckhart/ui_firmware.rs
+++ b/core/embed/rust/src/ui/layout_eckhart/ui_firmware.rs
@@ -1204,7 +1204,6 @@ impl FirmwareUI for UIEckhart {
failed_backup: bool,
paired_devices: heapless::Vec<TString<'static>, MAX_PAIRED_DEVICES>,
connected_idx: Option<usize>,
- bluetooth: Option<bool>,
pin_code: Option<bool>,
auto_lock_delay: Option<TString<'static>>,
wipe_code: Option<bool>,
@@ -1219,7 +1218,6 @@ impl FirmwareUI for UIEckhart {
failed_backup,
paired_devices,
connected_idx,
- bluetooth,
pin_code,
auto_lock_delay,
wipe_code,
diff --git a/core/embed/rust/src/ui/ui_firmware.rs b/core/embed/rust/src/ui/ui_firmware.rs
index 833344f2..302401df 100644
--- a/core/embed/rust/src/ui/ui_firmware.rs
+++ b/core/embed/rust/src/ui/ui_firmware.rs
@@ -366,7 +366,6 @@ pub trait FirmwareUI {
failed_backup: bool,
paired_devices: heapless::Vec<TString<'static>, MAX_PAIRED_DEVICES>,
connected_idx: Option<usize>,
- bluetooth: Option<bool>,
pin_code: Option<bool>,
auto_lock_delay: Option<TString<'static>>,
wipe_code: Option<bool>,
diff --git a/core/mocks/generated/trezorui_api.pyi b/core/mocks/generated/trezorui_api.pyi
index 4e1f3d00..3be955b8 100644
--- a/core/mocks/generated/trezorui_api.pyi
+++ b/core/mocks/generated/trezorui_api.pyi
@@ -626,7 +626,6 @@ def show_device_menu(
failed_backup: bool,
paired_devices: Iterable[str],
connected_idx: int | None,
- bluetooth: bool | None,
pin_code: bool | None,
auto_lock_delay: str | None,
wipe_code: bool | None,
@@ -856,7 +855,6 @@ class DeviceMenuResult:
DevicePair: ClassVar[DeviceMenuResult]
DeviceUnpair: ClassVar[DeviceMenuResult]
DeviceUnpairAll: ClassVar[DeviceMenuResult]
- Bluetooth: ClassVar[DeviceMenuResult]
PinCode: ClassVar[DeviceMenuResult]
PinRemove: ClassVar[DeviceMenuResult]
AutoLockDelay: ClassVar[DeviceMenuResult]
diff --git a/core/src/apps/homescreen/device_menu.py b/core/src/apps/homescreen/device_menu.py
index 9428d5bd..5bf048df 100644
--- a/core/src/apps/homescreen/device_menu.py
+++ b/core/src/apps/homescreen/device_menu.py
@@ -61,7 +61,6 @@ async def handle_device_menu() -> None:
failed_backup=failed_backup,
paired_devices=paired_devices,
connected_idx=connected_idx,
- bluetooth=True, # TODO implement bluetooth handling
pin_code=config.has_pin() if is_initialized else None,
auto_lock_delay=auto_lock_delay,
wipe_code=config.has_wipe_code() if is_initialized else None,
@@ -141,17 +140,6 @@ async def handle_device_menu() -> None:
await unpair(BleUnpair(addr=bonds[index]))
else:
raise RuntimeError(f"Unknown menu {result_type}, {index}")
- # Bluetooth
- elif menu_result is DeviceMenuResult.Bluetooth:
- from trezor.ui.layouts import confirm_action
-
- turned_on = ble.is_connected()
- await confirm_action(
- "ble__settings",
- TR.words__bluetooth,
- TR.ble__disable if turned_on else TR.ble__enable,
- )
- pass # TODO implement bluetooth handling
# Security settings
elif menu_result is DeviceMenuResult.PinCode and is_initialized:
from trezor.messages import ChangePin
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.