diff --git a/applications/services/desktop/scenes/desktop_scene_locked.c b/applications/services/desktop/scenes/desktop_scene_locked.c index 11dd7f222..adf7a6a7c 100644 --- a/applications/services/desktop/scenes/desktop_scene_locked.c +++ b/applications/services/desktop/scenes/desktop_scene_locked.c @@ -15,6 +15,8 @@ #include "desktop_scene.h" #include "desktop_scene_i.h" +#define TAG "DesktopSrv" + #define WRONG_PIN_HEADER_TIMEOUT 3000 #define INPUT_PIN_VIEW_TIMEOUT 15000 @@ -83,6 +85,14 @@ bool desktop_scene_locked_on_event(void* context, SceneManagerEvent event) { if(event.type == SceneManagerEventTypeCustom) { switch(event.event) { + case DesktopLockedEventOpenPowerOff: { + LoaderStatus status = loader_start(desktop->loader, "Power", "off"); + if(status != LoaderStatusOk) { + FURI_LOG_E(TAG, "loader_start failed: %d", status); + } + consumed = true; + break; + } case DesktopLockedEventUnlocked: desktop_unlock(desktop); consumed = true; diff --git a/applications/services/desktop/views/desktop_events.h b/applications/services/desktop/views/desktop_events.h index af7597012..11b45a8c7 100644 --- a/applications/services/desktop/views/desktop_events.h +++ b/applications/services/desktop/views/desktop_events.h @@ -23,6 +23,7 @@ typedef enum { DesktopMainEventOpenSubRemote, DesktopMainEventOpenClock, + DesktopLockedEventOpenPowerOff, DesktopLockedEventUnlocked, DesktopLockedEventUpdate, DesktopLockedEventShowPinInput, diff --git a/applications/services/desktop/views/desktop_view_locked.c b/applications/services/desktop/views/desktop_view_locked.c index 21f24dde9..69ace11ed 100644 --- a/applications/services/desktop/views/desktop_view_locked.c +++ b/applications/services/desktop/views/desktop_view_locked.c @@ -231,6 +231,12 @@ static bool desktop_view_locked_input(InputEvent* event, void* context) { desktop_view_locked_update_hint_icon_timeout(locked_view); + if(event->key == InputKeyBack) { + if(event->type == InputTypeLong) { + locked_view->callback(DesktopLockedEventOpenPowerOff, locked_view->context); + } + } + if(pin_locked) { if(event->key == InputKeyUp) { locked_view->callback(DesktopLockedEventShowPinInput, locked_view->context); diff --git a/applications/services/desktop/views/desktop_view_main.c b/applications/services/desktop/views/desktop_view_main.c index c1009fde1..e7e4ab4fd 100644 --- a/applications/services/desktop/views/desktop_view_main.c +++ b/applications/services/desktop/views/desktop_view_main.c @@ -13,16 +13,8 @@ struct DesktopMainView { View* view; DesktopMainViewCallback callback; void* context; - TimerHandle_t poweroff_timer; }; -#define DESKTOP_MAIN_VIEW_POWEROFF_TIMEOUT 1300 - -static void desktop_main_poweroff_timer_callback(TimerHandle_t timer) { - DesktopMainView* main_view = pvTimerGetTimerID(timer); - main_view->callback(DesktopMainEventOpenPowerOff, main_view->context); -} - void desktop_main_set_callback( DesktopMainView* main_view, DesktopMainViewCallback callback, @@ -68,13 +60,8 @@ bool desktop_main_input_callback(InputEvent* event, void* context) { } if(event->key == InputKeyBack) { - if(event->type == InputTypePress) { - xTimerChangePeriod( - main_view->poweroff_timer, - pdMS_TO_TICKS(DESKTOP_MAIN_VIEW_POWEROFF_TIMEOUT), - portMAX_DELAY); - } else if(event->type == InputTypeRelease) { - xTimerStop(main_view->poweroff_timer, portMAX_DELAY); + if(event->type == InputTypeLong) { + main_view->callback(DesktopMainEventOpenPowerOff, main_view->context); } } @@ -88,19 +75,11 @@ DesktopMainView* desktop_main_alloc() { view_set_context(main_view->view, main_view); view_set_input_callback(main_view->view, desktop_main_input_callback); - main_view->poweroff_timer = xTimerCreate( - NULL, - pdMS_TO_TICKS(DESKTOP_MAIN_VIEW_POWEROFF_TIMEOUT), - pdFALSE, - main_view, - desktop_main_poweroff_timer_callback); - return main_view; } void desktop_main_free(DesktopMainView* main_view) { furi_assert(main_view); view_free(main_view->view); - furi_timer_free(main_view->poweroff_timer); free(main_view); } diff --git a/applications/settings/power_settings_app/power_settings_app.c b/applications/settings/power_settings_app/power_settings_app.c index 1d5aafef1..3f969128f 100644 --- a/applications/settings/power_settings_app/power_settings_app.c +++ b/applications/settings/power_settings_app/power_settings_app.c @@ -19,7 +19,7 @@ static void power_settings_tick_event_callback(void* context) { scene_manager_handle_tick_event(app->scene_manager); } -PowerSettingsApp* power_settings_app_alloc(uint32_t first_scene) { +PowerSettingsApp* power_settings_app_alloc(uint32_t first_scene, ViewDispatcherType type) { PowerSettingsApp* app = malloc(sizeof(PowerSettingsApp)); app->about_battery = first_scene == PowerSettingsAppSceneBatteryInfo; @@ -42,7 +42,10 @@ PowerSettingsApp* power_settings_app_alloc(uint32_t first_scene) { app->view_dispatcher, power_settings_back_event_callback); view_dispatcher_set_tick_event_callback( app->view_dispatcher, power_settings_tick_event_callback, 2000); - view_dispatcher_attach_to_gui(app->view_dispatcher, app->gui, ViewDispatcherTypeFullscreen); + view_dispatcher_attach_to_gui(app->view_dispatcher, app->gui, type); + if(type == ViewDispatcherTypeDesktop) { + gui_set_hide_statusbar(app->gui, true); + } // Views app->battery_info = battery_info_alloc(); @@ -95,14 +98,16 @@ void power_settings_app_free(PowerSettingsApp* app) { int32_t power_settings_app(void* p) { uint32_t first_scene = PowerSettingsAppSceneStart; + ViewDispatcherType type = ViewDispatcherTypeFullscreen; if(p && strlen(p)) { if(!strcmp(p, "off")) { first_scene = PowerSettingsAppScenePowerOff; + type = ViewDispatcherTypeDesktop; } else if(!strcmp(p, "about_battery")) { first_scene = PowerSettingsAppSceneBatteryInfo; } } - PowerSettingsApp* app = power_settings_app_alloc(first_scene); + PowerSettingsApp* app = power_settings_app_alloc(first_scene, type); while(true) { view_dispatcher_run(app->view_dispatcher); if(app->battery_info->exit_to_about) { @@ -114,6 +119,9 @@ int32_t power_settings_app(void* p) { } break; } + if(type == ViewDispatcherTypeDesktop) { + gui_set_hide_statusbar(app->gui, false); + } power_settings_app_free(app); return 0; }