diff --git a/CHANGELOG.md b/CHANGELOG.md index 7ba57a247..d0142174c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,7 @@ - RFID: - OFW: Fix detection of GProx II cards and false detection of other cards (by @Astrrra) - OFW: Fix Guard GProxII False Positive and 36-bit Parsing (by @zinongli) +- Desktop: Poweroff fallback when app unavailable (by @Willy-JL) - Loader: Warn about missing SD card for main apps (by @Willy-JL) - OFW: NFC: Fix crash on Ultralight unlock (by @Astrrra) - OFW: RPC: Broken file interaction fixes (by @RebornedBrain) diff --git a/applications/services/desktop/desktop.c b/applications/services/desktop/desktop.c index 10d95ddb4..002870e0a 100644 --- a/applications/services/desktop/desktop.c +++ b/applications/services/desktop/desktop.c @@ -440,6 +440,29 @@ void desktop_unlock(Desktop* desktop) { desktop->locked = false; } +int32_t desktop_shutdown(void* context) { + Desktop* desktop = context; + LoaderStatus result = loader_start(desktop->loader, "Power", "off", NULL); + if(result != LoaderStatusOk) { + // Mimic applications/settings/power_settings_app/scenes/power_settings_scene_power_off.c + DialogMessage* message = dialog_message_alloc(); + dialog_message_set_header(message, "Turn Off Device?", 64, 0, AlignCenter, AlignTop); + dialog_message_set_text( + message, " I will be\nwaiting for\n you here...", 78, 14, AlignLeft, AlignTop); + dialog_message_set_icon(message, &I_dolph_cry_49x54, 14, 10); + dialog_message_set_buttons(message, "Cancel", NULL, "Power Off"); + DialogMessageButton res = dialog_message_show(furi_record_open(RECORD_DIALOGS), message); + furi_record_close(RECORD_DIALOGS); + dialog_message_free(message); + if(res == DialogMessageButtonRight) { + Power* power = furi_record_open(RECORD_POWER); + power_off(power); + furi_record_close(RECORD_POWER); + } + } + return 0; +} + void desktop_set_stealth_mode_state(Desktop* desktop, bool enabled) { desktop->in_transition = true; diff --git a/applications/services/desktop/desktop_i.h b/applications/services/desktop/desktop_i.h index 91b7060ce..10badcc07 100644 --- a/applications/services/desktop/desktop_i.h +++ b/applications/services/desktop/desktop_i.h @@ -93,4 +93,5 @@ struct Desktop { void desktop_lock(Desktop* desktop, bool pin_lock); void desktop_unlock(Desktop* desktop); +int32_t desktop_shutdown(void* context); void desktop_set_stealth_mode_state(Desktop* desktop, bool enabled); diff --git a/applications/services/desktop/scenes/desktop_scene_locked.c b/applications/services/desktop/scenes/desktop_scene_locked.c index a9fc3b7db..5f5013c73 100644 --- a/applications/services/desktop/scenes/desktop_scene_locked.c +++ b/applications/services/desktop/scenes/desktop_scene_locked.c @@ -3,6 +3,7 @@ #include #include #include +#include #include "../desktop.h" #include "../desktop_i.h" @@ -83,7 +84,7 @@ bool desktop_scene_locked_on_event(void* context, SceneManagerEvent event) { switch(event.event) { case DesktopLockedEventOpenPowerOff: { if(momentum_settings.lockscreen_poweroff) { - loader_start_detached_with_gui_error(desktop->loader, "Power", "off"); + run_parallel(desktop_shutdown, desktop, 512); } consumed = true; break; diff --git a/applications/services/desktop/scenes/desktop_scene_main.c b/applications/services/desktop/scenes/desktop_scene_main.c index 13a431d7f..c3c0334e3 100644 --- a/applications/services/desktop/scenes/desktop_scene_main.c +++ b/applications/services/desktop/scenes/desktop_scene_main.c @@ -3,6 +3,7 @@ #include #include #include +#include #include "../desktop_i.h" #include "../views/desktop_events.h" @@ -119,7 +120,7 @@ bool desktop_scene_main_on_event(void* context, SceneManagerEvent event) { break; case DesktopMainEventOpenPowerOff: { - loader_start_detached_with_gui_error(desktop->loader, "Power", "off"); + run_parallel(desktop_shutdown, desktop, 512); consumed = true; break; }