#include #include #include #include #include #include #include "../desktop.h" #include "../desktop_i.h" #include "../desktop_helpers.h" #include "../animations/animation_manager.h" #include "../views/desktop_events.h" #include "../views/desktop_view_pin_input.h" #include "../views/desktop_view_locked.h" #include "desktop_scene.h" #include "desktop_scene_i.h" #define WRONG_PIN_HEADER_TIMEOUT 3000 #define INPUT_PIN_VIEW_TIMEOUT 15000 static void desktop_scene_locked_callback(DesktopEvent event, void* context) { Desktop* desktop = (Desktop*)context; view_dispatcher_send_custom_event(desktop->view_dispatcher, event); } static void desktop_scene_locked_new_idle_animation_callback(void* context) { furi_assert(context); Desktop* desktop = context; view_dispatcher_send_custom_event( desktop->view_dispatcher, DesktopAnimationEventNewIdleAnimation); } void desktop_scene_locked_on_enter(void* context) { Desktop* desktop = (Desktop*)context; // callbacks for 1-st layer animation_manager_set_new_idle_callback( desktop->animation_manager, desktop_scene_locked_new_idle_animation_callback); animation_manager_set_check_callback(desktop->animation_manager, NULL); animation_manager_set_interact_callback(desktop->animation_manager, NULL); // callbacks for 2-nd layer desktop_view_locked_set_callback(desktop->locked_view, desktop_scene_locked_callback, desktop); bool switch_to_timeout_scene = false; uint32_t state = scene_manager_get_scene_state(desktop->scene_manager, DesktopSceneLocked); if(state == SCENE_LOCKED_FIRST_ENTER) { bool pin_locked = furi_hal_rtc_is_flag_set(FuriHalRtcFlagLock); desktop_helpers_lock_system(desktop, pin_locked); if(pin_locked) { LOAD_DESKTOP_SETTINGS(&desktop->settings); desktop_view_locked_lock(desktop->locked_view, true); uint32_t pin_fails = furi_hal_rtc_get_pin_fails(); uint32_t pin_timeout = desktop_helpers_get_pin_fail_timeout(pin_fails); if(pin_timeout) { scene_manager_set_scene_state( desktop->scene_manager, DesktopScenePinTimeout, pin_timeout); switch_to_timeout_scene = true; } else { desktop_view_locked_close_doors(desktop->locked_view); } } else { desktop_view_locked_lock(desktop->locked_view, false); desktop_view_locked_close_doors(desktop->locked_view); } scene_manager_set_scene_state( desktop->scene_manager, DesktopSceneLocked, SCENE_LOCKED_REPEAT_ENTER); } if(switch_to_timeout_scene) { scene_manager_next_scene(desktop->scene_manager, DesktopScenePinTimeout); } else { view_dispatcher_switch_to_view(desktop->view_dispatcher, DesktopViewIdLocked); } } bool desktop_scene_locked_on_event(void* context, SceneManagerEvent event) { Desktop* desktop = (Desktop*)context; bool consumed = false; if(event.type == SceneManagerEventTypeCustom) { switch(event.event) { case DesktopLockedEventUnlocked: furi_hal_rtc_set_pin_fails(0); desktop_helpers_unlock_system(desktop); scene_manager_search_and_switch_to_previous_scene( desktop->scene_manager, DesktopSceneMain); consumed = true; break; case DesktopLockedEventUpdate: desktop_view_locked_update(desktop->locked_view); consumed = true; break; case DesktopLockedEventShowPinInput: scene_manager_next_scene(desktop->scene_manager, DesktopScenePinInput); consumed = true; break; case DesktopAnimationEventNewIdleAnimation: animation_manager_new_idle_process(desktop->animation_manager); consumed = true; break; } } return consumed; } void desktop_scene_locked_on_exit(void* context) { }