diff --git a/applications/services/desktop/scenes/desktop_scene_lock_menu.c b/applications/services/desktop/scenes/desktop_scene_lock_menu.c index 05c397f18..3b2309844 100644 --- a/applications/services/desktop/scenes/desktop_scene_lock_menu.c +++ b/applications/services/desktop/scenes/desktop_scene_lock_menu.c @@ -57,7 +57,7 @@ bool desktop_scene_lock_menu_on_event(void* context, SceneManagerEvent event) { bool consumed = false; if(event.type == SceneManagerEventTypeTick) { - bool check_pin_changed = + int check_pin_changed = scene_manager_get_scene_state(desktop->scene_manager, DesktopSceneLockMenu); if(check_pin_changed) { DESKTOP_SETTINGS_LOAD(&desktop->settings); @@ -66,6 +66,12 @@ bool desktop_scene_lock_menu_on_event(void* context, SceneManagerEvent event) { scene_manager_set_scene_state(desktop->scene_manager, DesktopSceneLockMenu, 0); desktop_pin_lock(&desktop->settings); desktop_lock(desktop); + if(check_pin_changed == 2) { + Power* power = furi_record_open(RECORD_POWER); + furi_delay_ms(500); + power_off(power); + furi_record_close(RECORD_POWER); + } } } } else if(event.type == SceneManagerEventTypeCustom) { @@ -97,6 +103,26 @@ bool desktop_scene_lock_menu_on_event(void* context, SceneManagerEvent event) { } consumed = true; break; + case DesktopLockMenuEventLockPinOff: + desktop_scene_lock_menu_save_settings(desktop); + if(desktop->settings.pin_code.length > 0) { + desktop_pin_lock(&desktop->settings); + desktop_lock(desktop); + Power* power = furi_record_open(RECORD_POWER); + furi_delay_ms(500); + power_off(power); + furi_record_close(RECORD_POWER); + } else { + LoaderStatus status = + loader_start(desktop->loader, "Desktop", DESKTOP_SETTINGS_RUN_PIN_SETUP_ARG); + if(status == LoaderStatusOk) { + scene_manager_set_scene_state(desktop->scene_manager, DesktopSceneLockMenu, 2); + } else { + FURI_LOG_E(TAG, "Unable to start desktop settings"); + } + } + consumed = true; + break; case DesktopLockMenuEventXtreme: desktop_scene_lock_menu_save_settings(desktop); loader_start( diff --git a/applications/services/desktop/views/desktop_events.h b/applications/services/desktop/views/desktop_events.h index e3d4e2d7b..9e4a3bb4d 100644 --- a/applications/services/desktop/views/desktop_events.h +++ b/applications/services/desktop/views/desktop_events.h @@ -42,6 +42,7 @@ typedef enum { DesktopLockMenuEventSettings, DesktopLockMenuEventLock, DesktopLockMenuEventLockPin, + DesktopLockMenuEventLockPinOff, DesktopLockMenuEventXtreme, DesktopAnimationEventCheckAnimation, diff --git a/applications/services/desktop/views/desktop_view_lock_menu.c b/applications/services/desktop/views/desktop_view_lock_menu.c index 1275a48e4..0ccc4f326 100644 --- a/applications/services/desktop/views/desktop_view_lock_menu.c +++ b/applications/services/desktop/views/desktop_view_lock_menu.c @@ -160,10 +160,11 @@ void desktop_lock_menu_draw_callback(Canvas* canvas, void* model) { if(m->show_lock_menu) { canvas_set_font(canvas, FontSecondary); - elements_bold_rounded_frame(canvas, 24, 10, 80, 44); - canvas_draw_str_aligned(canvas, 64, 24, AlignCenter, AlignCenter, "Keypad Lock"); - canvas_draw_str_aligned(canvas, 64, 40, AlignCenter, AlignCenter, "PIN Code Lock"); - elements_frame(canvas, 30, m->pin_lock ? 32 : 16, 68, 15); + elements_bold_rounded_frame(canvas, 24, 4, 80, 56); + canvas_draw_str_aligned(canvas, 64, 16, AlignCenter, AlignCenter, "Keypad Lock"); + canvas_draw_str_aligned(canvas, 64, 32, AlignCenter, AlignCenter, "PIN Code Lock"); + canvas_draw_str_aligned(canvas, 64, 48, AlignCenter, AlignCenter, "PIN Lock + OFF"); + elements_frame(canvas, 28, 8 + m->pin_lock * 16, 72, 15); } } @@ -178,7 +179,7 @@ bool desktop_lock_menu_input_callback(InputEvent* event, void* context) { DesktopLockMenuView* lock_menu = context; uint8_t idx = 0; - bool pin_lock = false; + int pin_lock = 0; bool show_lock_menu = false; bool consumed = true; @@ -189,8 +190,16 @@ bool desktop_lock_menu_input_callback(InputEvent* event, void* context) { show_lock_menu = model->show_lock_menu; if((event->type == InputTypeShort) || (event->type == InputTypeRepeat)) { if(model->show_lock_menu) { - if(event->key == InputKeyUp || event->key == InputKeyDown) { - model->pin_lock = !model->pin_lock; + if(event->key == InputKeyUp) { + model->pin_lock--; + if(model->pin_lock < 0) { + model->pin_lock = 2; + } + } else if(event->key == InputKeyDown) { + model->pin_lock++; + if(model->pin_lock > 2) { + model->pin_lock = 0; + } } else if(event->key == InputKeyBack || event->key == InputKeyOk) { model->show_lock_menu = false; } @@ -238,10 +247,18 @@ bool desktop_lock_menu_input_callback(InputEvent* event, void* context) { DesktopEvent desktop_event = 0; if(show_lock_menu) { if(event->key == InputKeyOk && event->type == InputTypeShort) { - if(pin_lock) { - desktop_event = DesktopLockMenuEventLockPin; - } else { + switch(pin_lock) { + case 0: desktop_event = DesktopLockMenuEventLock; + break; + case 1: + desktop_event = DesktopLockMenuEventLockPin; + break; + case 2: + desktop_event = DesktopLockMenuEventLockPinOff; + break; + default: + break; } } } else { diff --git a/applications/services/desktop/views/desktop_view_lock_menu.h b/applications/services/desktop/views/desktop_view_lock_menu.h index ece48840f..957551b36 100644 --- a/applications/services/desktop/views/desktop_view_lock_menu.h +++ b/applications/services/desktop/views/desktop_view_lock_menu.h @@ -25,7 +25,7 @@ struct DesktopLockMenuView { typedef struct { uint8_t idx; bool pin_is_set; - bool pin_lock; + int pin_lock; bool show_lock_menu; DesktopLockMenuView* lock_menu; } DesktopLockMenuViewModel;