From 1eae24cf68083df391c69bfea58d88b66ee93d42 Mon Sep 17 00:00:00 2001 From: Willy-JL <49810075+Willy-JL@users.noreply.github.com> Date: Sat, 18 Mar 2023 22:48:10 +0000 Subject: [PATCH] Animate lockscreen --- applications/services/desktop/desktop.c | 3 +- applications/services/desktop/desktop_i.h | 2 - .../desktop/scenes/desktop_scene_locked.c | 4 +- .../desktop/views/desktop_view_locked.c | 113 +++++++++++----- .../desktop/views/desktop_view_locked.h | 2 +- .../desktop/views/desktop_view_lockscreen.c | 122 ------------------ .../desktop/views/desktop_view_lockscreen.h | 13 -- 7 files changed, 83 insertions(+), 176 deletions(-) delete mode 100644 applications/services/desktop/views/desktop_view_lockscreen.c delete mode 100644 applications/services/desktop/views/desktop_view_lockscreen.h diff --git a/applications/services/desktop/desktop.c b/applications/services/desktop/desktop.c index 79bd3cfb1..1fe23bb1d 100644 --- a/applications/services/desktop/desktop.c +++ b/applications/services/desktop/desktop.c @@ -165,7 +165,6 @@ Desktop* desktop_alloc() { desktop->debug_view = desktop_debug_alloc(); desktop->hw_mismatch_popup = popup_alloc(); desktop->locked_view = desktop_view_locked_alloc(); - desktop->lockscreen_view = desktop_view_lockscreen_alloc(); desktop->pin_input_view = desktop_view_pin_input_alloc(); desktop->pin_timeout_view = desktop_view_pin_timeout_alloc(); desktop->slideshow_view = desktop_view_slideshow_alloc(); @@ -181,7 +180,7 @@ Desktop* desktop_alloc() { /* locked view (as animation view) attends in 2 scenes: main & locked, * because it has to draw "Unlocked" label on main scene */ desktop->locked_view_stack = view_stack_alloc(); - view_stack_add_view(desktop->locked_view_stack, desktop_view_lockscreen_get_view(desktop->lockscreen_view)); + view_stack_add_view(desktop->locked_view_stack, dolphin_view); view_stack_add_view( desktop->locked_view_stack, desktop_view_locked_get_view(desktop->locked_view)); diff --git a/applications/services/desktop/desktop_i.h b/applications/services/desktop/desktop_i.h index 2935d0594..822eecc76 100644 --- a/applications/services/desktop/desktop_i.h +++ b/applications/services/desktop/desktop_i.h @@ -5,7 +5,6 @@ #include "views/desktop_view_pin_timeout.h" #include "views/desktop_view_pin_input.h" #include "views/desktop_view_locked.h" -#include "views/desktop_view_lockscreen.h" #include "views/desktop_view_main.h" #include "views/desktop_view_lock_menu.h" #include "views/desktop_view_debug.h" @@ -48,7 +47,6 @@ struct Desktop { DesktopLockMenuView* lock_menu; DesktopDebugView* debug_view; DesktopViewLocked* locked_view; - DesktopLockscreenView* lockscreen_view; DesktopMainView* main_view; DesktopViewPinTimeout* pin_timeout_view; DesktopSlideshowView* slideshow_view; diff --git a/applications/services/desktop/scenes/desktop_scene_locked.c b/applications/services/desktop/scenes/desktop_scene_locked.c index af19efc74..f981572e5 100644 --- a/applications/services/desktop/scenes/desktop_scene_locked.c +++ b/applications/services/desktop/scenes/desktop_scene_locked.c @@ -60,11 +60,11 @@ void desktop_scene_locked_on_enter(void* context) { desktop->scene_manager, DesktopScenePinTimeout, pin_timeout); switch_to_timeout_scene = true; } else { - desktop_view_locked_close_doors(desktop->locked_view); + desktop_view_locked_close_cover(desktop->locked_view); } } else { desktop_view_locked_lock(desktop->locked_view, false); - desktop_view_locked_close_doors(desktop->locked_view); + desktop_view_locked_close_cover(desktop->locked_view); } scene_manager_set_scene_state( desktop->scene_manager, DesktopSceneLocked, SCENE_LOCKED_REPEAT_ENTER); diff --git a/applications/services/desktop/views/desktop_view_locked.c b/applications/services/desktop/views/desktop_view_locked.c index 0bf757036..ca7666b8e 100644 --- a/applications/services/desktop/views/desktop_view_locked.c +++ b/applications/services/desktop/views/desktop_view_locked.c @@ -6,20 +6,19 @@ #include #include #include +#include +#include #include #include "../desktop_i.h" #include "desktop_view_locked.h" -#define DOOR_MOVING_INTERVAL_MS (1000 / 16) +#define COVER_MOVING_INTERVAL_MS (1000 / 16) #define LOCKED_HINT_TIMEOUT_MS (1000) #define UNLOCKED_HINT_TIMEOUT_MS (2000) -#define DOOR_OFFSET_START -55 -#define DOOR_OFFSET_END 0 - -#define DOOR_L_FINAL_POS 0 -#define DOOR_R_FINAL_POS 60 +#define COVER_OFFSET_START -64 +#define COVER_OFFSET_END 0 #define UNLOCK_CNT 3 #define UNLOCK_RST_TIMEOUT 600 @@ -37,14 +36,15 @@ struct DesktopViewLocked { typedef enum { DesktopViewLockedStateUnlocked, DesktopViewLockedStateLocked, - DesktopViewLockedStateDoorsClosing, + DesktopViewLockedStateCoverClosing, + DesktopViewLockedStateCoverOpening, DesktopViewLockedStateLockedHintShown, DesktopViewLockedStateUnlockedHintShown } DesktopViewLockedState; typedef struct { bool pin_locked; - int8_t door_offset; + int8_t cover_offset; DesktopViewLockedState view_state; } DesktopViewLockedModel; @@ -63,20 +63,59 @@ static void locked_view_timer_callback(TimerHandle_t timer) { locked_view->callback(DesktopLockedEventUpdate, locked_view->context); } -static void desktop_view_locked_doors_draw(Canvas* canvas, DesktopViewLockedModel* model) { - int8_t offset = model->door_offset; - uint8_t door_left_x = DOOR_L_FINAL_POS + offset; - uint8_t door_right_x = DOOR_R_FINAL_POS - offset; - uint8_t height = icon_get_height(&I_DoorLeft_70x55); - canvas_draw_icon(canvas, door_left_x, canvas_height(canvas) - height, &I_DoorLeft_70x55); - canvas_draw_icon(canvas, door_right_x, canvas_height(canvas) - height, &I_DoorRight_70x55); +void desktop_view_locked_draw_lockscreen(Canvas* canvas, void* m) { + DesktopViewLockedModel* model = m; + int y = model->cover_offset; + char time_str[9]; + char date_str[14]; + char meridian_str[3]; + FuriHalRtcDateTime datetime; + furi_hal_rtc_get_datetime(&datetime); + LocaleTimeFormat time_format = locale_get_time_format(); + LocaleDateFormat date_format = locale_get_date_format(); + + if(time_format == LocaleTimeFormat24h) { + snprintf(time_str, 9, "%.2d:%.2d", datetime.hour, datetime.minute); + } else { + bool pm = datetime.hour > 12; + bool pm12 = datetime.hour >= 12; + snprintf(time_str, 9, "%.2d:%.2d", pm ? datetime.hour - 12 : datetime.hour, datetime.minute); + snprintf(meridian_str, 3, pm12 ? "PM" : "AM"); + } + + if(date_format == LocaleDateFormatYMD) { + snprintf(date_str, 14, "%.4d-%.2d-%.2d", datetime.year, datetime.month, datetime.day); + } else if(date_format == LocaleDateFormatMDY) { + snprintf(date_str, 14, "%.2d-%.2d-%.4d", datetime.month, datetime.day, datetime.year); + } else { + snprintf(date_str, 14, "%.2d-%.2d-%.4d", datetime.day, datetime.month, datetime.year); + } + + canvas_draw_icon(canvas, 0, 0 + y, XTREME_ASSETS()->I_Lockscreen); + canvas_set_font(canvas, FontBigNumbers); + canvas_draw_str(canvas, 0, 64 + y, time_str); + int meridian_offset = canvas_string_width(canvas, time_str) + 2; + canvas_set_font(canvas, FontSecondary); + canvas_draw_str(canvas, 0, 48 + y, date_str); + if(time_format == LocaleTimeFormat12h) { + canvas_draw_str(canvas, 0 + meridian_offset, 64 + y, meridian_str); + } + canvas_set_font(canvas, FontBatteryPercent); + canvas_draw_str_aligned(canvas, 64, 6 + y, AlignCenter, AlignCenter, "UP to Unlock"); } -static bool desktop_view_locked_doors_move(DesktopViewLockedModel* model) { +static bool desktop_view_locked_cover_move(DesktopViewLockedModel* model, bool down) { bool stop = false; - if(model->door_offset < DOOR_OFFSET_END) { - model->door_offset = CLAMP(model->door_offset + 5, DOOR_OFFSET_END, DOOR_OFFSET_START); - stop = true; + if(down) { + if(model->cover_offset < COVER_OFFSET_END) { + model->cover_offset = CLAMP(model->cover_offset + 5, COVER_OFFSET_END, COVER_OFFSET_START); + stop = true; + } + } else { + if(model->cover_offset > COVER_OFFSET_START) { + model->cover_offset = CLAMP(model->cover_offset - 5, COVER_OFFSET_END, COVER_OFFSET_START); + stop = true; + } } return stop; @@ -97,9 +136,13 @@ void desktop_view_locked_update(DesktopViewLocked* locked_view) { DesktopViewLockedModel* model = view_get_model(locked_view->view); DesktopViewLockedState view_state = model->view_state; - if(view_state == DesktopViewLockedStateDoorsClosing && - !desktop_view_locked_doors_move(model)) { + if(view_state == DesktopViewLockedStateCoverClosing && + !desktop_view_locked_cover_move(model, true)) { model->view_state = DesktopViewLockedStateLocked; + } else if(view_state == DesktopViewLockedStateCoverOpening && + !desktop_view_locked_cover_move(model, false)) { + model->view_state = DesktopViewLockedStateUnlocked; + xTimerChangePeriod(locked_view->timer, pdMS_TO_TICKS(UNLOCKED_HINT_TIMEOUT_MS), portMAX_DELAY); } else if(view_state == DesktopViewLockedStateLockedHintShown) { model->view_state = DesktopViewLockedStateLocked; } else if(view_state == DesktopViewLockedStateUnlockedHintShown) { @@ -108,7 +151,7 @@ void desktop_view_locked_update(DesktopViewLocked* locked_view) { view_commit_model(locked_view->view, true); - if(view_state != DesktopViewLockedStateDoorsClosing) { + if(view_state != DesktopViewLockedStateCoverClosing && view_state != DesktopViewLockedStateCoverOpening) { xTimerStop(locked_view->timer, portMAX_DELAY); } } @@ -118,10 +161,10 @@ static void desktop_view_locked_draw(Canvas* canvas, void* model) { DesktopViewLockedState view_state = m->view_state; canvas_set_color(canvas, ColorBlack); - if(view_state == DesktopViewLockedStateDoorsClosing) { - desktop_view_locked_doors_draw(canvas, m); - canvas_set_font(canvas, FontPrimary); - elements_multiline_text_framed(canvas, 42, 30 + STATUS_BAR_Y_SHIFT, "Locked"); + if(view_state == DesktopViewLockedStateLocked || view_state == DesktopViewLockedStateLockedHintShown || view_state == DesktopViewLockedStateCoverClosing || view_state == DesktopViewLockedStateCoverOpening) { + desktop_view_locked_draw_lockscreen(canvas, m); + // canvas_set_font(canvas, FontPrimary); + // elements_multiline_text_framed(canvas, 42, 30 + STATUS_BAR_Y_SHIFT, "Locked"); } else if(view_state == DesktopViewLockedStateLockedHintShown) { canvas_set_font(canvas, FontSecondary); elements_bold_rounded_frame(canvas, 14, 2 + STATUS_BAR_Y_SHIFT, 99, 48); @@ -132,8 +175,8 @@ static void desktop_view_locked_draw(Canvas* canvas, void* model) { canvas_draw_icon(canvas, 16, 7 + STATUS_BAR_Y_SHIFT, &I_WarningDolphin_45x42); canvas_draw_dot(canvas, 17, 61); } else if(view_state == DesktopViewLockedStateUnlockedHintShown) { - canvas_set_font(canvas, FontPrimary); - elements_multiline_text_framed(canvas, 42, 30 + STATUS_BAR_Y_SHIFT, "Unlocked"); + // canvas_set_font(canvas, FontPrimary); + // elements_multiline_text_framed(canvas, 42, 30 + STATUS_BAR_Y_SHIFT, "Unlocked"); } } @@ -212,13 +255,13 @@ void desktop_view_locked_free(DesktopViewLocked* locked_view) { free(locked_view); } -void desktop_view_locked_close_doors(DesktopViewLocked* locked_view) { +void desktop_view_locked_close_cover(DesktopViewLocked* locked_view) { DesktopViewLockedModel* model = view_get_model(locked_view->view); furi_assert(model->view_state == DesktopViewLockedStateLocked); - model->view_state = DesktopViewLockedStateDoorsClosing; - model->door_offset = DOOR_OFFSET_START; + model->view_state = DesktopViewLockedStateCoverClosing; + model->cover_offset = COVER_OFFSET_START; view_commit_model(locked_view->view, true); - xTimerChangePeriod(locked_view->timer, pdMS_TO_TICKS(DOOR_MOVING_INTERVAL_MS), portMAX_DELAY); + xTimerChangePeriod(locked_view->timer, pdMS_TO_TICKS(COVER_MOVING_INTERVAL_MS), portMAX_DELAY); } void desktop_view_locked_lock(DesktopViewLocked* locked_view, bool pin_locked) { @@ -232,10 +275,12 @@ void desktop_view_locked_lock(DesktopViewLocked* locked_view, bool pin_locked) { void desktop_view_locked_unlock(DesktopViewLocked* locked_view) { locked_view->lock_count = 0; DesktopViewLockedModel* model = view_get_model(locked_view->view); - model->view_state = DesktopViewLockedStateUnlockedHintShown; + // model->view_state = DesktopViewLockedStateUnlockedHintShown; + model->view_state = DesktopViewLockedStateCoverOpening; + model->cover_offset = COVER_OFFSET_END; model->pin_locked = false; view_commit_model(locked_view->view, true); - xTimerChangePeriod(locked_view->timer, pdMS_TO_TICKS(UNLOCKED_HINT_TIMEOUT_MS), portMAX_DELAY); + xTimerChangePeriod(locked_view->timer, pdMS_TO_TICKS(COVER_MOVING_INTERVAL_MS), portMAX_DELAY); } bool desktop_view_locked_is_locked_hint_visible(DesktopViewLocked* locked_view) { diff --git a/applications/services/desktop/views/desktop_view_locked.h b/applications/services/desktop/views/desktop_view_locked.h index ea065e398..4c12c0274 100644 --- a/applications/services/desktop/views/desktop_view_locked.h +++ b/applications/services/desktop/views/desktop_view_locked.h @@ -18,5 +18,5 @@ DesktopViewLocked* desktop_view_locked_alloc(); void desktop_view_locked_free(DesktopViewLocked* locked_view); void desktop_view_locked_lock(DesktopViewLocked* locked_view, bool pin_locked); void desktop_view_locked_unlock(DesktopViewLocked* locked_view); -void desktop_view_locked_close_doors(DesktopViewLocked* locked_view); +void desktop_view_locked_close_cover(DesktopViewLocked* locked_view); bool desktop_view_locked_is_locked_hint_visible(DesktopViewLocked* locked_view); diff --git a/applications/services/desktop/views/desktop_view_lockscreen.c b/applications/services/desktop/views/desktop_view_lockscreen.c deleted file mode 100644 index e422c9192..000000000 --- a/applications/services/desktop/views/desktop_view_lockscreen.c +++ /dev/null @@ -1,122 +0,0 @@ -#include -#include -#include -#include -#include -#include - -#include "desktop_view_lockscreen.h" -#include "../desktop_i.h" - -struct DesktopLockscreenView { - View* view; - void* context; -}; - -typedef struct { - LocaleDateFormat date_format; - LocaleTimeFormat time_format; -} DesktopLockscreenViewModel; - -static void desktop_view_lockscreen_draw(Canvas* canvas, void* context) { - DesktopLockscreenViewModel* model = context; - canvas_clear(canvas); - canvas_draw_icon(canvas, 0, 0, XTREME_ASSETS()->I_Lockscreen); - - char time_str[9]; - char date_str[14]; - char meridian_str[3]; - FuriHalRtcDateTime datetime; - furi_hal_rtc_get_datetime(&datetime); - - if(model->time_format == LocaleTimeFormat24h) { - snprintf(time_str, 9, "%.2d:%.2d", datetime.hour, datetime.minute); - } else { - bool pm = datetime.hour > 12; - bool pm12 = datetime.hour >= 12; - snprintf(time_str, 9, "%.2d:%.2d", pm ? datetime.hour - 12 : datetime.hour, datetime.minute); - snprintf(meridian_str, 3, pm12 ? "PM" : "AM"); - } - - if(model->date_format == LocaleDateFormatYMD) { - snprintf(date_str, 14, "%.4d-%.2d-%.2d", datetime.year, datetime.month, datetime.day); - } else if(model->date_format == LocaleDateFormatMDY) { - snprintf(date_str, 14, "%.2d-%.2d-%.4d", datetime.month, datetime.day, datetime.year); - } else { - snprintf(date_str, 14, "%.2d-%.2d-%.4d", datetime.day, datetime.month, datetime.year); - } - - canvas_set_font(canvas, FontBigNumbers); - canvas_draw_str(canvas, 0, 64, time_str); - int meridian_offset = canvas_string_width(canvas, time_str) + 2; - canvas_set_font(canvas, FontSecondary); - canvas_draw_str(canvas, 0, 48, date_str); - if(model->time_format == LocaleTimeFormat12h) { - canvas_draw_str(canvas, 0 + meridian_offset, 64, meridian_str); - } - canvas_set_font(canvas, FontBatteryPercent); - canvas_draw_str_aligned(canvas, 64, 6, AlignCenter, AlignCenter, "UP to Unlock"); -} - -static bool desktop_view_lockscreen_input(InputEvent* event, void* context) { - furi_assert(event); - UNUSED(context); - // DesktopLockscreenView* instance = context; - - // DesktopLockscreenViewModel* model = view_get_model(instance->view); - if(event->type == InputTypeShort) { - switch(event->key) { - case InputKeyLeft: - case InputKeyRight: - case InputKeyOk: - case InputKeyBack: - default: - break; - } - } - // view_commit_model(instance->view, update_view); - - return true; -} - -static void desktop_view_lockscreen_enter(void* context) { - DesktopLockscreenView* instance = context; - - DesktopLockscreenViewModel* model = view_get_model(instance->view); - model->time_format = locale_get_time_format(); - model->date_format = locale_get_date_format(); - view_commit_model(instance->view, false); -} - -static void desktop_view_lockscreen_exit(void* context) { - DesktopLockscreenView* instance = context; - UNUSED(instance); - - // DesktopLockscreenViewModel* model = view_get_model(instance->view); - // view_commit_model(instance->view, false); -} - -DesktopLockscreenView* desktop_view_lockscreen_alloc() { - DesktopLockscreenView* instance = malloc(sizeof(DesktopLockscreenView)); - instance->view = view_alloc(); - view_allocate_model(instance->view, ViewModelTypeLocking, sizeof(DesktopLockscreenViewModel)); - view_set_context(instance->view, instance); - view_set_draw_callback(instance->view, (ViewDrawCallback)desktop_view_lockscreen_draw); - view_set_input_callback(instance->view, desktop_view_lockscreen_input); - view_set_enter_callback(instance->view, desktop_view_lockscreen_enter); - view_set_exit_callback(instance->view, desktop_view_lockscreen_exit); - - return instance; -} - -void desktop_view_lockscreen_free(DesktopLockscreenView* instance) { - furi_assert(instance); - - view_free(instance->view); - free(instance); -} - -View* desktop_view_lockscreen_get_view(DesktopLockscreenView* instance) { - furi_assert(instance); - return instance->view; -} diff --git a/applications/services/desktop/views/desktop_view_lockscreen.h b/applications/services/desktop/views/desktop_view_lockscreen.h deleted file mode 100644 index 64e9ae7c9..000000000 --- a/applications/services/desktop/views/desktop_view_lockscreen.h +++ /dev/null @@ -1,13 +0,0 @@ -#pragma once - -#include - -#include "desktop_events.h" - -typedef struct DesktopLockscreenView DesktopLockscreenView; - -DesktopLockscreenView* desktop_view_lockscreen_alloc(); - -void desktop_view_lockscreen_free(DesktopLockscreenView* main_view); - -View* desktop_view_lockscreen_get_view(DesktopLockscreenView* main_view);