From 808774c05f83c14ccfc1469fcc17f5ba966f0c7f Mon Sep 17 00:00:00 2001 From: Dmitry422 Date: Thu, 12 Feb 2026 16:55:19 +0700 Subject: [PATCH 1/3] BT on/off to desktop_lock_menu --- applications/services/bt/bt_service/bt_api.c | 3 +-- applications/services/bt/bt_service/bt_api.h | 5 +++++ .../desktop/scenes/desktop_scene_lock_menu.c | 21 +++++++++++++++---- .../services/desktop/views/desktop_events.h | 3 ++- .../desktop/views/desktop_view_lock_menu.c | 17 ++++++++++----- 5 files changed, 37 insertions(+), 12 deletions(-) create mode 100644 applications/services/bt/bt_service/bt_api.h diff --git a/applications/services/bt/bt_service/bt_api.c b/applications/services/bt/bt_service/bt_api.c index 39b9a099d..8b42d7920 100644 --- a/applications/services/bt/bt_service/bt_api.c +++ b/applications/services/bt/bt_service/bt_api.c @@ -1,5 +1,4 @@ -#include "bt_i.h" -#include +#include "bt_api.h" FuriHalBleProfileBase* bt_profile_start( Bt* bt, diff --git a/applications/services/bt/bt_service/bt_api.h b/applications/services/bt/bt_service/bt_api.h new file mode 100644 index 000000000..5120ccc7f --- /dev/null +++ b/applications/services/bt/bt_service/bt_api.h @@ -0,0 +1,5 @@ +#pragma once +#include "bt_i.h" +#include + +extern void bt_set_settings(Bt* bt, const BtSettings* settings); \ No newline at end of file diff --git a/applications/services/desktop/scenes/desktop_scene_lock_menu.c b/applications/services/desktop/scenes/desktop_scene_lock_menu.c index 5ca95c4c5..b74ca7f48 100644 --- a/applications/services/desktop/scenes/desktop_scene_lock_menu.c +++ b/applications/services/desktop/scenes/desktop_scene_lock_menu.c @@ -10,6 +10,8 @@ #include "../views/desktop_view_lock_menu.h" #include "desktop_scene.h" +#include "applications/services/bt/bt_service/bt_api.h" + #define TAG "DesktopSceneLock" void desktop_scene_lock_menu_callback(DesktopEvent event, void* context) { @@ -34,6 +36,9 @@ bool desktop_scene_lock_menu_on_event(void* context, SceneManagerEvent event) { Desktop* desktop = (Desktop*)context; bool consumed = false; + Bt* bt = furi_record_open(RECORD_BT); + BtSettings bts = bt->bt_settings; + if(event.type == SceneManagerEventTypeTick) { bool check_pin_changed = scene_manager_get_scene_state(desktop->scene_manager, DesktopSceneLockMenu); @@ -42,10 +47,17 @@ bool desktop_scene_lock_menu_on_event(void* context, SceneManagerEvent event) { } } else if(event.type == SceneManagerEventTypeCustom) { switch(event.event) { - case DesktopLockMenuEventLock: - scene_manager_set_scene_state(desktop->scene_manager, DesktopSceneLockMenu, 0); - desktop_lock(desktop); - consumed = true; + // old use case + // case DesktopLockMenuEventLock: + // scene_manager_set_scene_state(desktop->scene_manager, DesktopSceneLockMenu, 0); + // desktop_lock(desktop); + // consumed = true; + // break; + case DesktopLockMenuEventBt: + bts.enabled = !bts.enabled; + bt_set_settings(bt, &bts); + scene_manager_search_and_switch_to_previous_scene( + desktop->scene_manager, DesktopSceneMain); break; case DesktopLockMenuEventDummyModeOn: desktop_set_dummy_mode_state(desktop, true); @@ -78,4 +90,5 @@ bool desktop_scene_lock_menu_on_event(void* context, SceneManagerEvent event) { void desktop_scene_lock_menu_on_exit(void* context) { UNUSED(context); + furi_record_close(RECORD_BT); } diff --git a/applications/services/desktop/views/desktop_events.h b/applications/services/desktop/views/desktop_events.h index b89ef5158..724761d48 100644 --- a/applications/services/desktop/views/desktop_events.h +++ b/applications/services/desktop/views/desktop_events.h @@ -37,7 +37,8 @@ typedef enum { DesktopDebugEventToggleDebugMode, DesktopDebugEventExit, - DesktopLockMenuEventLock, + //DesktopLockMenuEventLock, + DesktopLockMenuEventBt, DesktopLockMenuEventDummyModeOn, DesktopLockMenuEventDummyModeOff, DesktopLockMenuEventStealthModeOn, diff --git a/applications/services/desktop/views/desktop_view_lock_menu.c b/applications/services/desktop/views/desktop_view_lock_menu.c index 1b6bdab9c..fefb7b1bd 100644 --- a/applications/services/desktop/views/desktop_view_lock_menu.c +++ b/applications/services/desktop/views/desktop_view_lock_menu.c @@ -6,7 +6,8 @@ #include "desktop_view_lock_menu.h" typedef enum { - DesktopLockMenuIndexLock, + //DesktopLockMenuIndexLock, + DesktopLockMenuIndexBt, DesktopLockMenuIndexStealth, DesktopLockMenuIndexDummy, @@ -56,8 +57,9 @@ void desktop_lock_menu_draw_callback(Canvas* canvas, void* model) { for(size_t i = 0; i < DesktopLockMenuIndexTotalCount; ++i) { const char* str = NULL; - if(i == DesktopLockMenuIndexLock) { - str = "Lock"; + //if(i == DesktopLockMenuIndexLock) { + if(i == DesktopLockMenuIndexBt) { + str = "Bluetooth On/Off"; } else if(i == DesktopLockMenuIndexStealth) { if(m->stealth_mode) { str = "Unmute"; @@ -126,10 +128,15 @@ bool desktop_lock_menu_input_callback(InputEvent* event, void* context) { update); if(event->key == InputKeyOk) { - if(idx == DesktopLockMenuIndexLock) { + if(idx == DesktopLockMenuIndexBt) { if(event->type == InputTypeShort) { - lock_menu->callback(DesktopLockMenuEventLock, lock_menu->context); + lock_menu->callback(DesktopLockMenuEventBt, lock_menu->context); } + // old use case + // } else if(idx == DesktopLockMenuIndexLock) { + // if(event->type == InputTypeShort) { + // lock_menu->callback(DesktopLockMenuEventLock, lock_menu->context); + // } } else if(idx == DesktopLockMenuIndexStealth) { if((stealth_mode == false) && (event->type == InputTypeShort)) { lock_menu->callback(DesktopLockMenuEventStealthModeOn, lock_menu->context); From a98c610f6dcee25eed7c53800672485d8e9f788b Mon Sep 17 00:00:00 2001 From: Dmitry422 Date: Thu, 12 Feb 2026 17:27:28 +0700 Subject: [PATCH 2/3] BT string in desktop_lock_menu naming depent from BT ON|OFF --- .../desktop/scenes/desktop_scene_lock_menu.c | 1 + .../desktop/views/desktop_view_lock_menu.c | 14 +++++++++++++- .../desktop/views/desktop_view_lock_menu.h | 2 ++ 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/applications/services/desktop/scenes/desktop_scene_lock_menu.c b/applications/services/desktop/scenes/desktop_scene_lock_menu.c index b74ca7f48..369dcc0ef 100644 --- a/applications/services/desktop/scenes/desktop_scene_lock_menu.c +++ b/applications/services/desktop/scenes/desktop_scene_lock_menu.c @@ -27,6 +27,7 @@ void desktop_scene_lock_menu_on_enter(void* context) { desktop_lock_menu_set_dummy_mode_state(desktop->lock_menu, desktop->settings.dummy_mode); desktop_lock_menu_set_stealth_mode_state( desktop->lock_menu, furi_hal_rtc_is_flag_set(FuriHalRtcFlagStealthMode)); + desktop_lock_menu_set_bt_mode_state(desktop->lock_menu, furi_hal_bt_is_active()); desktop_lock_menu_set_idx(desktop->lock_menu, 0); view_dispatcher_switch_to_view(desktop->view_dispatcher, DesktopViewIdLockMenu); diff --git a/applications/services/desktop/views/desktop_view_lock_menu.c b/applications/services/desktop/views/desktop_view_lock_menu.c index fefb7b1bd..975db7749 100644 --- a/applications/services/desktop/views/desktop_view_lock_menu.c +++ b/applications/services/desktop/views/desktop_view_lock_menu.c @@ -40,6 +40,14 @@ void desktop_lock_menu_set_stealth_mode_state(DesktopLockMenuView* lock_menu, bo true); } +void desktop_lock_menu_set_bt_mode_state(DesktopLockMenuView* lock_menu, bool bt_mode) { + with_view_model( + lock_menu->view, + DesktopLockMenuViewModel * model, + { model->bt_mode = bt_mode; }, + true); +} + void desktop_lock_menu_set_idx(DesktopLockMenuView* lock_menu, uint8_t idx) { furi_assert(idx < DesktopLockMenuIndexTotalCount); with_view_model( @@ -59,7 +67,11 @@ void desktop_lock_menu_draw_callback(Canvas* canvas, void* model) { //if(i == DesktopLockMenuIndexLock) { if(i == DesktopLockMenuIndexBt) { - str = "Bluetooth On/Off"; + if(m->bt_mode) { + str = "Bluetooth OFF"; + } else { + str = "Bluetooth ON"; + } } else if(i == DesktopLockMenuIndexStealth) { if(m->stealth_mode) { str = "Unmute"; diff --git a/applications/services/desktop/views/desktop_view_lock_menu.h b/applications/services/desktop/views/desktop_view_lock_menu.h index a44e6b132..b2db7efb2 100644 --- a/applications/services/desktop/views/desktop_view_lock_menu.h +++ b/applications/services/desktop/views/desktop_view_lock_menu.h @@ -19,6 +19,7 @@ typedef struct { uint8_t idx; bool dummy_mode; bool stealth_mode; + bool bt_mode; } DesktopLockMenuViewModel; void desktop_lock_menu_set_callback( @@ -29,6 +30,7 @@ void desktop_lock_menu_set_callback( View* desktop_lock_menu_get_view(DesktopLockMenuView* lock_menu); void desktop_lock_menu_set_dummy_mode_state(DesktopLockMenuView* lock_menu, bool dummy_mode); void desktop_lock_menu_set_stealth_mode_state(DesktopLockMenuView* lock_menu, bool stealth_mode); +void desktop_lock_menu_set_bt_mode_state(DesktopLockMenuView* lock_menu, bool bt_mode); void desktop_lock_menu_set_idx(DesktopLockMenuView* lock_menu, uint8_t idx); DesktopLockMenuView* desktop_lock_menu_alloc(void); void desktop_lock_menu_free(DesktopLockMenuView* lock_menu); From 3f0f90e0a376db8123a827a9c6f07134b59380c9 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Thu, 12 Feb 2026 18:50:03 +0300 Subject: [PATCH 3/3] formatting, text fixes --- applications/services/bt/bt_service/bt_api.c | 2 +- applications/services/bt/bt_service/bt_api.h | 2 +- .../desktop/views/desktop_view_lock_menu.c | 19 ++++++++----------- .../scenes/power_settings_scene_power_off.c | 2 +- 4 files changed, 11 insertions(+), 14 deletions(-) diff --git a/applications/services/bt/bt_service/bt_api.c b/applications/services/bt/bt_service/bt_api.c index 8b42d7920..861569d71 100644 --- a/applications/services/bt/bt_service/bt_api.c +++ b/applications/services/bt/bt_service/bt_api.c @@ -1,4 +1,4 @@ -#include "bt_api.h" +#include "bt_api.h" FuriHalBleProfileBase* bt_profile_start( Bt* bt, diff --git a/applications/services/bt/bt_service/bt_api.h b/applications/services/bt/bt_service/bt_api.h index 5120ccc7f..24801d13b 100644 --- a/applications/services/bt/bt_service/bt_api.h +++ b/applications/services/bt/bt_service/bt_api.h @@ -2,4 +2,4 @@ #include "bt_i.h" #include -extern void bt_set_settings(Bt* bt, const BtSettings* settings); \ No newline at end of file +extern void bt_set_settings(Bt* bt, const BtSettings* settings); diff --git a/applications/services/desktop/views/desktop_view_lock_menu.c b/applications/services/desktop/views/desktop_view_lock_menu.c index 975db7749..995a47f95 100644 --- a/applications/services/desktop/views/desktop_view_lock_menu.c +++ b/applications/services/desktop/views/desktop_view_lock_menu.c @@ -42,10 +42,7 @@ void desktop_lock_menu_set_stealth_mode_state(DesktopLockMenuView* lock_menu, bo void desktop_lock_menu_set_bt_mode_state(DesktopLockMenuView* lock_menu, bool bt_mode) { with_view_model( - lock_menu->view, - DesktopLockMenuViewModel * model, - { model->bt_mode = bt_mode; }, - true); + lock_menu->view, DesktopLockMenuViewModel * model, { model->bt_mode = bt_mode; }, true); } void desktop_lock_menu_set_idx(DesktopLockMenuView* lock_menu, uint8_t idx) { @@ -68,9 +65,9 @@ void desktop_lock_menu_draw_callback(Canvas* canvas, void* model) { //if(i == DesktopLockMenuIndexLock) { if(i == DesktopLockMenuIndexBt) { if(m->bt_mode) { - str = "Bluetooth OFF"; + str = "Bluetooth Off"; } else { - str = "Bluetooth ON"; + str = "Bluetooth On"; } } else if(i == DesktopLockMenuIndexStealth) { if(m->stealth_mode) { @@ -144,11 +141,11 @@ bool desktop_lock_menu_input_callback(InputEvent* event, void* context) { if(event->type == InputTypeShort) { lock_menu->callback(DesktopLockMenuEventBt, lock_menu->context); } - // old use case - // } else if(idx == DesktopLockMenuIndexLock) { - // if(event->type == InputTypeShort) { - // lock_menu->callback(DesktopLockMenuEventLock, lock_menu->context); - // } + // old use case + // } else if(idx == DesktopLockMenuIndexLock) { + // if(event->type == InputTypeShort) { + // lock_menu->callback(DesktopLockMenuEventLock, lock_menu->context); + // } } else if(idx == DesktopLockMenuIndexStealth) { if((stealth_mode == false) && (event->type == InputTypeShort)) { lock_menu->callback(DesktopLockMenuEventStealthModeOn, lock_menu->context); diff --git a/applications/settings/power_settings_app/scenes/power_settings_scene_power_off.c b/applications/settings/power_settings_app/scenes/power_settings_scene_power_off.c index 073116ae5..b89c2d0b8 100644 --- a/applications/settings/power_settings_app/scenes/power_settings_scene_power_off.c +++ b/applications/settings/power_settings_app/scenes/power_settings_scene_power_off.c @@ -25,7 +25,7 @@ void power_settings_scene_power_off_on_enter(void* context) { if(!settings.happy_mode) { dialog_ex_set_text( dialog, " I will be\nwaiting for\n you here...", 78, 14, AlignLeft, AlignTop); - dialog_ex_set_icon(dialog, 14, 10, &I_dolph_cry_49x54); + dialog_ex_set_icon(dialog, 24, 10, &I_dolph_cry_49x54); } dialog_ex_set_left_button_text(dialog, "Settings"); dialog_ex_set_right_button_text(dialog, "Power Off");