From 3990c9301323d5ccf2566fb4c2762b5c0a2ea916 Mon Sep 17 00:00:00 2001 From: gid9798 <30450294+gid9798@users.noreply.github.com> Date: Thu, 17 Aug 2023 13:04:40 +0300 Subject: [PATCH 1/4] Desktop favorites pt1 --- .../services/desktop/desktop_settings.h | 25 +++- .../desktop/scenes/desktop_scene_locked.c | 4 + .../desktop/scenes/desktop_scene_main.c | 98 ++++++------ .../services/desktop/views/desktop_events.h | 25 ++-- .../desktop/views/desktop_view_locked.c | 1 + .../desktop/views/desktop_view_main.c | 33 ++--- .../scenes/desktop_settings_scene_favorite.c | 111 ++++++-------- .../scenes/desktop_settings_scene_i.h | 3 + .../scenes/desktop_settings_scene_start.c | 139 +++++++++++++----- 9 files changed, 256 insertions(+), 183 deletions(-) diff --git a/applications/services/desktop/desktop_settings.h b/applications/services/desktop/desktop_settings.h index 981d73bdf..50995c79c 100644 --- a/applications/services/desktop/desktop_settings.h +++ b/applications/services/desktop/desktop_settings.h @@ -8,7 +8,7 @@ #include #include -#define DESKTOP_SETTINGS_VER (12) +#define DESKTOP_SETTINGS_VER (13) #define DESKTOP_SETTINGS_PATH INT_PATH(DESKTOP_SETTINGS_FILE_NAME) #define DESKTOP_SETTINGS_MAGIC (0x17) @@ -43,6 +43,24 @@ #define DISPLAY_BATTERY_RETRO_5 4 #define DISPLAY_BATTERY_BAR_PERCENT 5 +typedef enum { + FavoriteAppLeftShort = 0, + FavoriteAppLeftLong, + FavoriteAppRightShort, + FavoriteAppRightLong, + + FavoriteAppNumber, +} FavoriteAppShortcut; + +typedef enum { + DummyAppLeft = 0, + DummyAppRight, + DummyAppDown, + DummyAppOk, + + DummyAppNumber, +} DummyAppShortcut; + typedef struct { InputKey data[MAX_PIN_SIZE]; uint8_t length; @@ -53,12 +71,11 @@ typedef struct { } FavoriteApp; typedef struct { - FavoriteApp favorite_primary; - FavoriteApp favorite_secondary; - FavoriteApp favorite_tertiary; PinCode pin_code; uint32_t auto_lock_delay_ms; uint8_t displayBatteryPercentage; uint8_t dummy_mode; uint8_t display_clock; + FavoriteApp favorite_apps[FavoriteAppNumber]; + FavoriteApp dummy_apps[DummyAppNumber]; } DesktopSettings; diff --git a/applications/services/desktop/scenes/desktop_scene_locked.c b/applications/services/desktop/scenes/desktop_scene_locked.c index f64ef8371..bbed56001 100644 --- a/applications/services/desktop/scenes/desktop_scene_locked.c +++ b/applications/services/desktop/scenes/desktop_scene_locked.c @@ -87,6 +87,10 @@ bool desktop_scene_locked_on_event(void* context, SceneManagerEvent event) { desktop_unlock(desktop); consumed = true; break; + case DesktopLockedEventDoorsClosed: + notification_message(desktop->notification, &sequence_display_backlight_off); + consumed = true; + break; case DesktopLockedEventUpdate: if(desktop_view_locked_is_locked_hint_visible(desktop->locked_view)) { notification_message(desktop->notification, &sequence_display_backlight_off); diff --git a/applications/services/desktop/scenes/desktop_scene_main.c b/applications/services/desktop/scenes/desktop_scene_main.c index d1b8df309..ca3ff56bf 100644 --- a/applications/services/desktop/scenes/desktop_scene_main.c +++ b/applications/services/desktop/scenes/desktop_scene_main.c @@ -61,17 +61,23 @@ static void } #endif -static void desktop_scene_main_open_app_or_profile(Desktop* desktop, const char* path) { - if(loader_start_with_gui_error(desktop->loader, path, NULL) != LoaderStatusOk) { +static void desktop_scene_main_open_app_or_profile(Desktop* desktop, FavoriteApp* application) { + bool load_ok = false; + if(strlen(application->name_or_path) > 0) { + if(loader_start(desktop->loader, application->name_or_path, NULL, NULL) == + LoaderStatusOk) { + load_ok = true; + } + } + if(!load_ok) { loader_start(desktop->loader, "Passport", NULL, NULL); } } static void desktop_scene_main_start_favorite(Desktop* desktop, FavoriteApp* application) { - if(strlen(application->name_or_path) > 2) { + if(strlen(application->name_or_path) > 0) { loader_start_with_gui_error(desktop->loader, application->name_or_path, NULL); - } else if( - (strlen(application->name_or_path) < 2) && (strcmp(application->name_or_path, "d") != 0)) { + } else { loader_start(desktop->loader, LOADER_APPLICATIONS_NAME, NULL, NULL); } } @@ -112,6 +118,12 @@ bool desktop_scene_main_on_event(void* context, SceneManagerEvent event) { consumed = true; } break; + case DesktopMainEventLock: + scene_manager_set_scene_state(desktop->scene_manager, DesktopSceneLockMenu, 0); + desktop_lock(desktop); + consumed = true; + break; + case DesktopMainEventOpenLockMenu: scene_manager_next_scene(desktop->scene_manager, DesktopSceneLockMenu); consumed = true; @@ -122,12 +134,6 @@ bool desktop_scene_main_on_event(void* context, SceneManagerEvent event) { consumed = true; break; - case DesktopMainEventLock: - scene_manager_set_scene_state(desktop->scene_manager, DesktopSceneLockMenu, 0); - desktop_lock(desktop); - consumed = true; - break; - case DesktopMainEventOpenArchive: #ifdef APP_ARCHIVE desktop_switch_to_app(desktop, &FLIPPER_ARCHIVE); @@ -141,21 +147,31 @@ bool desktop_scene_main_on_event(void* context, SceneManagerEvent event) { break; } - case DesktopMainEventOpenFavoritePrimary: + case DesktopMainEventOpenFavoriteLeftShort: DESKTOP_SETTINGS_LOAD(&desktop->settings); - desktop_scene_main_start_favorite(desktop, &desktop->settings.favorite_primary); + desktop_scene_main_start_favorite( + desktop, &desktop->settings.favorite_apps[FavoriteAppLeftShort]); consumed = true; break; - case DesktopMainEventOpenFavoriteSecondary: + case DesktopMainEventOpenFavoriteLeftLong: DESKTOP_SETTINGS_LOAD(&desktop->settings); - desktop_scene_main_start_favorite(desktop, &desktop->settings.favorite_secondary); + desktop_scene_main_start_favorite( + desktop, &desktop->settings.favorite_apps[FavoriteAppLeftLong]); consumed = true; break; - case DesktopMainEventOpenFavoriteTertiary: + case DesktopMainEventOpenFavoriteRightShort: DESKTOP_SETTINGS_LOAD(&desktop->settings); - desktop_scene_main_start_favorite(desktop, &desktop->settings.favorite_tertiary); + desktop_scene_main_start_favorite( + desktop, &desktop->settings.favorite_apps[FavoriteAppRightShort]); consumed = true; break; + case DesktopMainEventOpenFavoriteRightLong: + DESKTOP_SETTINGS_LOAD(&desktop->settings); + desktop_scene_main_start_favorite( + desktop, &desktop->settings.favorite_apps[FavoriteAppRightLong]); + consumed = true; + break; + case DesktopAnimationEventCheckAnimation: animation_manager_check_blocking_process(desktop->animation_manager); consumed = true; @@ -166,39 +182,31 @@ bool desktop_scene_main_on_event(void* context, SceneManagerEvent event) { break; case DesktopAnimationEventInteractAnimation: if(!animation_manager_interact_process(desktop->animation_manager)) { - loader_start(desktop->loader, "Passport", NULL, NULL); + DESKTOP_SETTINGS_LOAD(&desktop->settings); + if(!desktop->settings.dummy_mode) { + desktop_scene_main_open_app_or_profile( + desktop, &desktop->settings.favorite_apps[FavoriteAppRightShort]); + } else { + desktop_scene_main_open_app_or_profile( + desktop, &desktop->settings.dummy_apps[DummyAppRight]); + } } consumed = true; break; - case DesktopMainEventOpenPassport: { - loader_start(desktop->loader, "Passport", NULL, NULL); - break; - } - case DesktopMainEventOpenGameMenu: { - desktop_scene_main_open_app_or_profile(desktop, EXT_PATH("/apps/Games/snake.fap")); - break; - } - case DesktopMainEventOpenTetris: { - desktop_scene_main_open_app_or_profile(desktop, EXT_PATH("/apps/Games/tetris.fap")); - break; - } - case DesktopMainEventOpenArkanoid: { - desktop_scene_main_open_app_or_profile(desktop, EXT_PATH("/apps/Games/arkanoid.fap")); - break; - } - case DesktopMainEventOpenDOOM: { - desktop_scene_main_open_app_or_profile(desktop, EXT_PATH("/apps/Games/doom.fap")); - break; - } - case DesktopMainEventOpenZombiez: { - desktop_scene_main_open_app_or_profile(desktop, EXT_PATH("/apps/Games/zombiez.fap")); - break; - } - case DesktopMainEventOpenHeap: { + + case DesktopDummyEventOpenLeft: desktop_scene_main_open_app_or_profile( - desktop, EXT_PATH("/apps/Games/heap_defence.fap")); + desktop, &desktop->settings.dummy_apps[DummyAppLeft]); break; - } + case DesktopDummyEventOpenDown: + desktop_scene_main_open_app_or_profile( + desktop, &desktop->settings.dummy_apps[DummyAppDown]); + break; + case DesktopDummyEventOpenOk: + desktop_scene_main_open_app_or_profile( + desktop, &desktop->settings.dummy_apps[DummyAppOk]); + break; + case DesktopLockedEventUpdate: desktop_view_locked_update(desktop->locked_view); consumed = true; diff --git a/applications/services/desktop/views/desktop_events.h b/applications/services/desktop/views/desktop_events.h index fd72457b0..98cfc6ca8 100644 --- a/applications/services/desktop/views/desktop_events.h +++ b/applications/services/desktop/views/desktop_events.h @@ -1,27 +1,30 @@ #pragma once typedef enum { + DesktopMainEventLock, DesktopMainEventOpenLockMenu, DesktopMainEventOpenArchive, - DesktopMainEventOpenFavoritePrimary, - DesktopMainEventOpenFavoriteSecondary, - DesktopMainEventOpenFavoriteTertiary, + DesktopMainEventOpenFavoriteLeftShort, + DesktopMainEventOpenFavoriteLeftLong, + DesktopMainEventOpenFavoriteRightShort, + DesktopMainEventOpenFavoriteRightLong, DesktopMainEventOpenMenu, DesktopMainEventOpenDebug, - DesktopMainEventOpenPassport, DesktopMainEventOpenPowerOff, - DesktopMainEventLock, - DesktopMainEventOpenGameMenu, - DesktopMainEventOpenTetris, - DesktopMainEventOpenArkanoid, - DesktopMainEventOpenDOOM, - DesktopMainEventOpenZombiez, - DesktopMainEventOpenHeap, + DesktopDummyEventOpenLeft, + DesktopDummyEventOpenDown, + DesktopDummyEventOpenOk, + + // TODO add long press in Dummy mode & RightLong + DesktopDummyEventOpenUpLong, + DesktopDummyEventOpenDownLong, + DesktopDummyEventOpenLeftLong, DesktopLockedEventUnlocked, DesktopLockedEventUpdate, DesktopLockedEventShowPinInput, + DesktopLockedEventDoorsClosed, DesktopPinInputEventResetWrongPinLabel, DesktopPinInputEventUnlocked, diff --git a/applications/services/desktop/views/desktop_view_locked.c b/applications/services/desktop/views/desktop_view_locked.c index 0cdd63a67..b6ab9344b 100644 --- a/applications/services/desktop/views/desktop_view_locked.c +++ b/applications/services/desktop/views/desktop_view_locked.c @@ -99,6 +99,7 @@ void desktop_view_locked_update(DesktopViewLocked* locked_view) { if(view_state == DesktopViewLockedStateDoorsClosing && !desktop_view_locked_doors_move(model)) { + locked_view->callback(DesktopLockedEventDoorsClosed, locked_view->context); model->view_state = DesktopViewLockedStateLocked; } else if(view_state == DesktopViewLockedStateLockedHintShown) { model->view_state = DesktopViewLockedStateLocked; diff --git a/applications/services/desktop/views/desktop_view_main.c b/applications/services/desktop/views/desktop_view_main.c index 0a1c72ca6..970b5b793 100644 --- a/applications/services/desktop/views/desktop_view_main.c +++ b/applications/services/desktop/views/desktop_view_main.c @@ -59,18 +59,18 @@ bool desktop_main_input_callback(InputEvent* event, void* context) { } else if(event->key == InputKeyDown) { main_view->callback(DesktopMainEventOpenArchive, main_view->context); } else if(event->key == InputKeyLeft) { - main_view->callback(DesktopMainEventOpenFavoritePrimary, main_view->context); + main_view->callback(DesktopMainEventOpenFavoriteLeftShort, main_view->context); } - // Right key is handled by animation manager + // Right key short is handled by animation manager } else if(event->type == InputTypeLong) { - if(event->key == InputKeyDown) { + if(event->key == InputKeyUp) { + main_view->callback(DesktopMainEventLock, main_view->context); + } else if(event->key == InputKeyDown) { main_view->callback(DesktopMainEventOpenDebug, main_view->context); } else if(event->key == InputKeyLeft) { - main_view->callback(DesktopMainEventOpenFavoriteSecondary, main_view->context); + main_view->callback(DesktopMainEventOpenFavoriteLeftLong, main_view->context); } else if(event->key == InputKeyRight) { - main_view->callback(DesktopMainEventOpenFavoriteTertiary, main_view->context); - } else if(event->key == InputKeyUp) { - main_view->callback(DesktopMainEventLock, main_view->context); + main_view->callback(DesktopMainEventOpenFavoriteRightLong, main_view->context); } else if(event->key == InputKeyOk) { if(furi_hal_rtc_is_flag_set(FuriHalRtcFlagDebug)) { main_view->callback(DesktopAnimationEventNewIdleAnimation, main_view->context); @@ -80,31 +80,26 @@ bool desktop_main_input_callback(InputEvent* event, void* context) { } else { if(event->type == InputTypeShort) { if(event->key == InputKeyOk) { - main_view->callback( - DesktopMainEventOpenGameMenu, main_view->context); // OPENS Snake + main_view->callback(DesktopDummyEventOpenOk, main_view->context); } else if(event->key == InputKeyUp) { main_view->callback(DesktopMainEventOpenLockMenu, main_view->context); } else if(event->key == InputKeyDown) { - main_view->callback( - DesktopMainEventOpenTetris, main_view->context); // OPENS Tetris + main_view->callback(DesktopDummyEventOpenDown, main_view->context); } else if(event->key == InputKeyLeft) { - main_view->callback( - DesktopMainEventOpenArkanoid, main_view->context); // OPENS Arkanoid + main_view->callback(DesktopDummyEventOpenLeft, main_view->context); } - // Right key is handled by animation manager + // Right key short is handled by animation manager } else if(event->type == InputTypeLong) { if(event->key == InputKeyOk) { if(furi_hal_rtc_is_flag_set(FuriHalRtcFlagDebug)) { main_view->callback(DesktopAnimationEventNewIdleAnimation, main_view->context); } } else if(event->key == InputKeyUp) { - main_view->callback(DesktopMainEventOpenDOOM, main_view->context); // OPENS DOOM + main_view->callback(DesktopDummyEventOpenUpLong, main_view->context); } else if(event->key == InputKeyDown) { - main_view->callback( - DesktopMainEventOpenZombiez, main_view->context); // OPENS Zombiez + main_view->callback(DesktopDummyEventOpenDownLong, main_view->context); } else if(event->key == InputKeyLeft) { - main_view->callback( - DesktopMainEventOpenHeap, main_view->context); // OPENS Heap Defence + main_view->callback(DesktopDummyEventOpenLeftLong, main_view->context); } } } diff --git a/applications/settings/desktop_settings/scenes/desktop_settings_scene_favorite.c b/applications/settings/desktop_settings/scenes/desktop_settings_scene_favorite.c index db6f7ebe4..31826cae0 100644 --- a/applications/settings/desktop_settings/scenes/desktop_settings_scene_favorite.c +++ b/applications/settings/desktop_settings/scenes/desktop_settings_scene_favorite.c @@ -1,19 +1,19 @@ #include "../desktop_settings_app.h" #include "applications.h" #include "desktop_settings_scene.h" +#include "desktop_settings_scene_i.h" #include #include #include #define APPS_COUNT (FLIPPER_APPS_COUNT + FLIPPER_EXTERNAL_APPS_COUNT) -#define EXTERNAL_BROWSER_NAME ("Apps") -#define EXTERNAL_BROWSER_INDEX (APPS_COUNT + 1) +#define DEFAULT_INDEX (0) +#define EXTERNAL_BROWSER_NAME ("Apps Menu (Default)") +#define PASSPORT_NAME ("Passport (Default)") +#define EXTERNAL_APPLICATION_INDEX (1) #define EXTERNAL_APPLICATION_NAME ("[Select App]") -#define EXTERNAL_APPLICATION_INDEX (APPS_COUNT + 2) - -#define NONE_APPLICATION_INDEX (APPS_COUNT + 3) #define PRESELECTED_SPECIAL 0xffffffff @@ -57,40 +57,32 @@ void desktop_settings_scene_favorite_on_enter(void* context) { Submenu* submenu = app->submenu; submenu_reset(submenu); - uint32_t primary_favorite = + uint32_t favorite_id = scene_manager_get_scene_state(app->scene_manager, DesktopSettingsAppSceneFavorite); uint32_t pre_select_item = PRESELECTED_SPECIAL; FavoriteApp* curr_favorite_app = NULL; - if(primary_favorite == 0) { - curr_favorite_app = &app->settings.favorite_primary; - } else if(primary_favorite == 1) { - curr_favorite_app = &app->settings.favorite_secondary; - } else if(primary_favorite == 2) { - curr_favorite_app = &app->settings.favorite_tertiary; - } else { - curr_favorite_app = &app->settings.favorite_primary; - } - if(curr_favorite_app == NULL) { - // This should not happen! - return; - } + bool is_dummy_app = false; + bool default_passport = false; - for(size_t i = 0; i < APPS_COUNT; i++) { - const char* name = favorite_fap_get_app_name(i); - - submenu_add_item(submenu, name, i, desktop_settings_scene_favorite_submenu_callback, app); - - // Select favorite item in submenu - if(!strcmp(name, curr_favorite_app->name_or_path)) { - pre_select_item = i; + if((favorite_id & SCENE_STATE_SET_DUMMY_APP) == 0) { + furi_assert(favorite_id < FavoriteAppNumber); + curr_favorite_app = &app->settings.favorite_apps[favorite_id]; + if(favorite_id == FavoriteAppRightShort) { + default_passport = true; } + } else { + favorite_id &= ~(SCENE_STATE_SET_DUMMY_APP); + furi_assert(favorite_id < DummyAppNumber); + curr_favorite_app = &app->settings.dummy_apps[favorite_id]; + is_dummy_app = true; + default_passport = true; } // Special case: Application browser submenu_add_item( submenu, - EXTERNAL_BROWSER_NAME, - EXTERNAL_BROWSER_INDEX, + default_passport ? (PASSPORT_NAME) : (EXTERNAL_BROWSER_NAME), + DEFAULT_INDEX, desktop_settings_scene_favorite_submenu_callback, app); @@ -102,28 +94,29 @@ void desktop_settings_scene_favorite_on_enter(void* context) { desktop_settings_scene_favorite_submenu_callback, app); + if(!is_dummy_app) { + for(size_t i = 0; i < APPS_COUNT; i++) { + const char* name = favorite_fap_get_app_name(i); + + submenu_add_item( + submenu, name, i + 2, desktop_settings_scene_favorite_submenu_callback, app); + + // Select favorite item in submenu + if(!strcmp(name, curr_favorite_app->name_or_path)) { + pre_select_item = i + 2; + } + } + } + if(pre_select_item == PRESELECTED_SPECIAL) { if(curr_favorite_app->name_or_path[0] == '\0') { - pre_select_item = EXTERNAL_BROWSER_INDEX; + pre_select_item = DEFAULT_INDEX; } else { pre_select_item = EXTERNAL_APPLICATION_INDEX; } } - submenu_add_item( - submenu, - "None (disable)", - NONE_APPLICATION_INDEX, - desktop_settings_scene_favorite_submenu_callback, - app); - - if(primary_favorite == 0) { - submenu_set_header(submenu, "Primary favorite app:"); - } else if(primary_favorite == 1) { - submenu_set_header(submenu, "Secondary favorite app:"); - } else if(primary_favorite == 2) { - submenu_set_header(submenu, "Tertiary favorite app:"); - } + submenu_set_header(submenu, is_dummy_app ? ("Dummy Mode app:") : ("Favorite app:")); submenu_set_selected_item(submenu, pre_select_item); // If set during loop, visual glitch. view_dispatcher_switch_to_view(app->view_dispatcher, DesktopSettingsAppViewMenu); @@ -134,26 +127,20 @@ bool desktop_settings_scene_favorite_on_event(void* context, SceneManagerEvent e bool consumed = false; FuriString* temp_path = furi_string_alloc_set_str(EXT_PATH("apps")); - uint32_t primary_favorite = + uint32_t favorite_id = scene_manager_get_scene_state(app->scene_manager, DesktopSettingsAppSceneFavorite); FavoriteApp* curr_favorite_app = NULL; - if(primary_favorite == 0) { - curr_favorite_app = &app->settings.favorite_primary; - } else if(primary_favorite == 1) { - curr_favorite_app = &app->settings.favorite_secondary; - } else if(primary_favorite == 2) { - curr_favorite_app = &app->settings.favorite_tertiary; + if((favorite_id & SCENE_STATE_SET_DUMMY_APP) == 0) { + furi_assert(favorite_id < FavoriteAppNumber); + curr_favorite_app = &app->settings.favorite_apps[favorite_id]; } else { - curr_favorite_app = &app->settings.favorite_primary; - } - if(curr_favorite_app == NULL) { - // This should not happen! - furi_string_free(temp_path); - return consumed; + favorite_id &= ~(SCENE_STATE_SET_DUMMY_APP); + furi_assert(favorite_id < DummyAppNumber); + curr_favorite_app = &app->settings.dummy_apps[favorite_id]; } if(event.type == SceneManagerEventTypeCustom) { - if(event.event == EXTERNAL_BROWSER_INDEX) { + if(event.event == DEFAULT_INDEX) { curr_favorite_app->name_or_path[0] = '\0'; consumed = true; } else if(event.event == EXTERNAL_APPLICATION_INDEX) { @@ -180,13 +167,9 @@ bool desktop_settings_scene_favorite_on_event(void* context, SceneManagerEvent e MAX_APP_LENGTH); consumed = true; } - } else if(event.event == NONE_APPLICATION_INDEX) { - // Clear favorite app path and set it to "d" (disabled) - memset(curr_favorite_app->name_or_path, 0, strlen(curr_favorite_app->name_or_path)); - strncpy(curr_favorite_app->name_or_path, "d", MAX_APP_LENGTH); - consumed = true; } else { - const char* name = favorite_fap_get_app_name(event.event); + size_t app_index = event.event - 2; + const char* name = favorite_fap_get_app_name(app_index); if(name) strncpy(curr_favorite_app->name_or_path, name, MAX_APP_LENGTH); consumed = true; } diff --git a/applications/settings/desktop_settings/scenes/desktop_settings_scene_i.h b/applications/settings/desktop_settings/scenes/desktop_settings_scene_i.h index 230fec873..657680bc3 100644 --- a/applications/settings/desktop_settings/scenes/desktop_settings_scene_i.h +++ b/applications/settings/desktop_settings/scenes/desktop_settings_scene_i.h @@ -5,3 +5,6 @@ #define SCENE_STATE_PIN_ERROR_MISMATCH (0) #define SCENE_STATE_PIN_ERROR_WRONG (1) + +#define SCENE_STATE_SET_FAVORITE_APP (0) +#define SCENE_STATE_SET_DUMMY_APP (1 << 8) diff --git a/applications/settings/desktop_settings/scenes/desktop_settings_scene_start.c b/applications/settings/desktop_settings/scenes/desktop_settings_scene_start.c index 6629930c3..403a6350f 100644 --- a/applications/settings/desktop_settings/scenes/desktop_settings_scene_start.c +++ b/applications/settings/desktop_settings/scenes/desktop_settings_scene_start.c @@ -3,16 +3,24 @@ #include "../desktop_settings_app.h" #include "desktop_settings_scene.h" +#include "desktop_settings_scene_i.h" #include -#define SCENE_EVENT_SELECT_FAVORITE_PRIMARY 0 -#define SCENE_EVENT_SELECT_FAVORITE_SECONDARY 1 -#define SCENE_EVENT_SELECT_FAVORITE_TERTIARY 2 -#define SCENE_EVENT_SELECT_PIN_SETUP 3 -#define SCENE_EVENT_SELECT_AUTO_LOCK_DELAY 4 -#define SCENE_EVENT_SELECT_BATTERY_DISPLAY 5 -#define SCENE_EVENT_SELECT_CLOCK_DISPLAY 6 -#define SCENE_EVENT_SELECT_CHANGE_NAME 7 +typedef enum { + DesktopSettingsPinSetup = 0, + DesktopSettingsAutoLockDelay, + DesktopSettingsBatteryDisplay, + DesktopSettingsClockDisplay, + DesktopSettingsChangeName, + DesktopSettingsFavoriteLeftShort, + DesktopSettingsFavoriteLeftLong, + DesktopSettingsFavoriteRightShort, + DesktopSettingsFavoriteRightLong, + DesktopSettingsDummyLeft, + DesktopSettingsDummyRight, + DesktopSettingsDummyDown, + DesktopSettingsDummyOk, +} DesktopSettingsEntry; #define AUTO_LOCK_DELAY_COUNT 9 const char* const auto_lock_delay_text[AUTO_LOCK_DELAY_COUNT] = { @@ -87,12 +95,6 @@ void desktop_settings_scene_start_on_enter(void* context) { VariableItem* item; uint8_t value_index; - variable_item_list_add(variable_item_list, "Primary Favorite App", 1, NULL, NULL); - - variable_item_list_add(variable_item_list, "Secondary Favorite App", 1, NULL, NULL); - - variable_item_list_add(variable_item_list, "Tertiary Favorite App", 1, NULL, NULL); - variable_item_list_add(variable_item_list, "PIN Setup", 1, NULL, NULL); item = variable_item_list_add( @@ -102,8 +104,6 @@ void desktop_settings_scene_start_on_enter(void* context) { desktop_settings_scene_start_auto_lock_delay_changed, app); - variable_item_list_set_enter_callback( - variable_item_list, desktop_settings_scene_start_var_list_enter_callback, app); value_index = value_index_uint32( app->settings.auto_lock_delay_ms, auto_lock_delay_value, AUTO_LOCK_DELAY_COUNT); variable_item_set_current_value_index(item, value_index); @@ -137,6 +137,19 @@ void desktop_settings_scene_start_on_enter(void* context) { variable_item_list_add(variable_item_list, "Change Flipper Name", 0, NULL, app); + variable_item_list_add(variable_item_list, "Favorite App - Left Short", 1, NULL, NULL); + variable_item_list_add(variable_item_list, "Favorite App - Left Long", 1, NULL, NULL); + variable_item_list_add(variable_item_list, "Favorite App - Right Short", 1, NULL, NULL); + variable_item_list_add(variable_item_list, "Favorite App - Right Long", 1, NULL, NULL); + + variable_item_list_add(variable_item_list, "Dummy Mode App - Left", 1, NULL, NULL); + variable_item_list_add(variable_item_list, "Dummy Mode App - Right", 1, NULL, NULL); + variable_item_list_add(variable_item_list, "Dummy Mode App - Down", 1, NULL, NULL); + variable_item_list_add(variable_item_list, "Dummy Mode App - Ok", 1, NULL, NULL); + + variable_item_list_set_enter_callback( + variable_item_list, desktop_settings_scene_start_var_list_enter_callback, app); + view_dispatcher_switch_to_view(app->view_dispatcher, DesktopSettingsAppViewVarItemList); } @@ -146,35 +159,81 @@ bool desktop_settings_scene_start_on_event(void* context, SceneManagerEvent even if(event.type == SceneManagerEventTypeCustom) { switch(event.event) { - case SCENE_EVENT_SELECT_FAVORITE_PRIMARY: - scene_manager_set_scene_state(app->scene_manager, DesktopSettingsAppSceneFavorite, 0); - scene_manager_next_scene(app->scene_manager, DesktopSettingsAppSceneFavorite); - consumed = true; - break; - case SCENE_EVENT_SELECT_FAVORITE_SECONDARY: - scene_manager_set_scene_state(app->scene_manager, DesktopSettingsAppSceneFavorite, 1); - scene_manager_next_scene(app->scene_manager, DesktopSettingsAppSceneFavorite); - consumed = true; - break; - case SCENE_EVENT_SELECT_FAVORITE_TERTIARY: - scene_manager_set_scene_state(app->scene_manager, DesktopSettingsAppSceneFavorite, 2); - scene_manager_next_scene(app->scene_manager, DesktopSettingsAppSceneFavorite); - consumed = true; - break; - case SCENE_EVENT_SELECT_PIN_SETUP: + case DesktopSettingsPinSetup: scene_manager_next_scene(app->scene_manager, DesktopSettingsAppScenePinMenu); - consumed = true; break; - case SCENE_EVENT_SELECT_AUTO_LOCK_DELAY: - case SCENE_EVENT_SELECT_CLOCK_DISPLAY: - case SCENE_EVENT_SELECT_BATTERY_DISPLAY: - consumed = true; - break; - case SCENE_EVENT_SELECT_CHANGE_NAME: + + // case DesktopSettingsAutoLockDelay: + // case DesktopSettingsBatteryDisplay: + // case DesktopSettingsClockDisplay: + // Proces in default + + case DesktopSettingsChangeName: scene_manager_next_scene(app->scene_manager, DesktopSettingsAppSceneChangeName); - consumed = true; + break; + + case DesktopSettingsFavoriteLeftShort: + scene_manager_set_scene_state( + app->scene_manager, + DesktopSettingsAppSceneFavorite, + SCENE_STATE_SET_FAVORITE_APP | FavoriteAppLeftShort); + scene_manager_next_scene(app->scene_manager, DesktopSettingsAppSceneFavorite); + break; + case DesktopSettingsFavoriteLeftLong: + scene_manager_set_scene_state( + app->scene_manager, + DesktopSettingsAppSceneFavorite, + SCENE_STATE_SET_FAVORITE_APP | FavoriteAppLeftLong); + scene_manager_next_scene(app->scene_manager, DesktopSettingsAppSceneFavorite); + break; + case DesktopSettingsFavoriteRightShort: + scene_manager_set_scene_state( + app->scene_manager, + DesktopSettingsAppSceneFavorite, + SCENE_STATE_SET_FAVORITE_APP | FavoriteAppRightShort); + scene_manager_next_scene(app->scene_manager, DesktopSettingsAppSceneFavorite); + break; + case DesktopSettingsFavoriteRightLong: + scene_manager_set_scene_state( + app->scene_manager, + DesktopSettingsAppSceneFavorite, + SCENE_STATE_SET_FAVORITE_APP | FavoriteAppRightLong); + scene_manager_next_scene(app->scene_manager, DesktopSettingsAppSceneFavorite); + break; + + case DesktopSettingsDummyLeft: + scene_manager_set_scene_state( + app->scene_manager, + DesktopSettingsAppSceneFavorite, + SCENE_STATE_SET_DUMMY_APP | DummyAppLeft); + scene_manager_next_scene(app->scene_manager, DesktopSettingsAppSceneFavorite); + break; + case DesktopSettingsDummyRight: + scene_manager_set_scene_state( + app->scene_manager, + DesktopSettingsAppSceneFavorite, + SCENE_STATE_SET_DUMMY_APP | DummyAppRight); + scene_manager_next_scene(app->scene_manager, DesktopSettingsAppSceneFavorite); + break; + case DesktopSettingsDummyDown: + scene_manager_set_scene_state( + app->scene_manager, + DesktopSettingsAppSceneFavorite, + SCENE_STATE_SET_DUMMY_APP | DummyAppDown); + scene_manager_next_scene(app->scene_manager, DesktopSettingsAppSceneFavorite); + break; + case DesktopSettingsDummyOk: + scene_manager_set_scene_state( + app->scene_manager, + DesktopSettingsAppSceneFavorite, + SCENE_STATE_SET_DUMMY_APP | DummyAppOk); + scene_manager_next_scene(app->scene_manager, DesktopSettingsAppSceneFavorite); + break; + + default: break; } + consumed = true; } return consumed; } From f73f3699527893ef75b1edd49c0b41037ddcb4d2 Mon Sep 17 00:00:00 2001 From: gid9798 <30450294+gid9798@users.noreply.github.com> Date: Thu, 17 Aug 2023 13:40:55 +0300 Subject: [PATCH 2/4] Desktop favorites pt2 --- .../services/desktop/desktop_settings.h | 5 ++ .../desktop/scenes/desktop_scene_main.c | 20 +++++++ .../services/desktop/views/desktop_events.h | 4 +- .../desktop/views/desktop_view_main.c | 10 ++-- .../scenes/desktop_settings_scene_start.c | 53 +++++++++++++++++-- 5 files changed, 83 insertions(+), 9 deletions(-) diff --git a/applications/services/desktop/desktop_settings.h b/applications/services/desktop/desktop_settings.h index 50995c79c..9e1db835c 100644 --- a/applications/services/desktop/desktop_settings.h +++ b/applications/services/desktop/desktop_settings.h @@ -54,9 +54,14 @@ typedef enum { typedef enum { DummyAppLeft = 0, + DummyAppLeftLong, DummyAppRight, + DummyAppRightLong, + DummyAppUpLong, DummyAppDown, + DummyAppDownLong, DummyAppOk, + DummyAppOkLong, DummyAppNumber, } DummyAppShortcut; diff --git a/applications/services/desktop/scenes/desktop_scene_main.c b/applications/services/desktop/scenes/desktop_scene_main.c index ca3ff56bf..a4fe5054b 100644 --- a/applications/services/desktop/scenes/desktop_scene_main.c +++ b/applications/services/desktop/scenes/desktop_scene_main.c @@ -206,6 +206,26 @@ bool desktop_scene_main_on_event(void* context, SceneManagerEvent event) { desktop_scene_main_open_app_or_profile( desktop, &desktop->settings.dummy_apps[DummyAppOk]); break; + case DesktopDummyEventOpenUpLong: + desktop_scene_main_open_app_or_profile( + desktop, &desktop->settings.dummy_apps[DummyAppUpLong]); + break; + case DesktopDummyEventOpenDownLong: + desktop_scene_main_open_app_or_profile( + desktop, &desktop->settings.dummy_apps[DummyAppDownLong]); + break; + case DesktopDummyEventOpenLeftLong: + desktop_scene_main_open_app_or_profile( + desktop, &desktop->settings.dummy_apps[DummyAppLeftLong]); + break; + case DesktopDummyEventOpenRightLong: + desktop_scene_main_open_app_or_profile( + desktop, &desktop->settings.dummy_apps[DummyAppRightLong]); + break; + case DesktopDummyEventOpenOkLong: + desktop_scene_main_open_app_or_profile( + desktop, &desktop->settings.dummy_apps[DummyAppOkLong]); + break; case DesktopLockedEventUpdate: desktop_view_locked_update(desktop->locked_view); diff --git a/applications/services/desktop/views/desktop_events.h b/applications/services/desktop/views/desktop_events.h index 98cfc6ca8..10bc8cb22 100644 --- a/applications/services/desktop/views/desktop_events.h +++ b/applications/services/desktop/views/desktop_events.h @@ -15,11 +15,11 @@ typedef enum { DesktopDummyEventOpenLeft, DesktopDummyEventOpenDown, DesktopDummyEventOpenOk, - - // TODO add long press in Dummy mode & RightLong DesktopDummyEventOpenUpLong, DesktopDummyEventOpenDownLong, DesktopDummyEventOpenLeftLong, + DesktopDummyEventOpenRightLong, + DesktopDummyEventOpenOkLong, DesktopLockedEventUnlocked, DesktopLockedEventUpdate, diff --git a/applications/services/desktop/views/desktop_view_main.c b/applications/services/desktop/views/desktop_view_main.c index 970b5b793..c274dd540 100644 --- a/applications/services/desktop/views/desktop_view_main.c +++ b/applications/services/desktop/views/desktop_view_main.c @@ -91,15 +91,19 @@ bool desktop_main_input_callback(InputEvent* event, void* context) { // Right key short is handled by animation manager } else if(event->type == InputTypeLong) { if(event->key == InputKeyOk) { - if(furi_hal_rtc_is_flag_set(FuriHalRtcFlagDebug)) { - main_view->callback(DesktopAnimationEventNewIdleAnimation, main_view->context); - } + // Not working in DummyMode + // if(furi_hal_rtc_is_flag_set(FuriHalRtcFlagDebug)) { + // main_view->callback(DesktopAnimationEventNewIdleAnimation, main_view->context); + // } + main_view->callback(DesktopDummyEventOpenOkLong, main_view->context); } else if(event->key == InputKeyUp) { main_view->callback(DesktopDummyEventOpenUpLong, main_view->context); } else if(event->key == InputKeyDown) { main_view->callback(DesktopDummyEventOpenDownLong, main_view->context); } else if(event->key == InputKeyLeft) { main_view->callback(DesktopDummyEventOpenLeftLong, main_view->context); + } else if(event->key == InputKeyRight) { + main_view->callback(DesktopDummyEventOpenRightLong, main_view->context); } } } diff --git a/applications/settings/desktop_settings/scenes/desktop_settings_scene_start.c b/applications/settings/desktop_settings/scenes/desktop_settings_scene_start.c index 403a6350f..975a3b9b6 100644 --- a/applications/settings/desktop_settings/scenes/desktop_settings_scene_start.c +++ b/applications/settings/desktop_settings/scenes/desktop_settings_scene_start.c @@ -17,9 +17,14 @@ typedef enum { DesktopSettingsFavoriteRightShort, DesktopSettingsFavoriteRightLong, DesktopSettingsDummyLeft, + DesktopSettingsDummyLeftLong, DesktopSettingsDummyRight, + DesktopSettingsDummyRightLong, + DesktopSettingsDummyUpLong, DesktopSettingsDummyDown, + DesktopSettingsDummyDownLong, DesktopSettingsDummyOk, + DesktopSettingsDummyOkLong, } DesktopSettingsEntry; #define AUTO_LOCK_DELAY_COUNT 9 @@ -142,10 +147,15 @@ void desktop_settings_scene_start_on_enter(void* context) { variable_item_list_add(variable_item_list, "Favorite App - Right Short", 1, NULL, NULL); variable_item_list_add(variable_item_list, "Favorite App - Right Long", 1, NULL, NULL); - variable_item_list_add(variable_item_list, "Dummy Mode App - Left", 1, NULL, NULL); - variable_item_list_add(variable_item_list, "Dummy Mode App - Right", 1, NULL, NULL); - variable_item_list_add(variable_item_list, "Dummy Mode App - Down", 1, NULL, NULL); - variable_item_list_add(variable_item_list, "Dummy Mode App - Ok", 1, NULL, NULL); + variable_item_list_add(variable_item_list, "DummyMode App - Left", 1, NULL, NULL); + variable_item_list_add(variable_item_list, "DummyMode App - Left Long", 1, NULL, NULL); + variable_item_list_add(variable_item_list, "DummyMode App - Right", 1, NULL, NULL); + variable_item_list_add(variable_item_list, "DummyMode App - Right Long", 1, NULL, NULL); + variable_item_list_add(variable_item_list, "DummyMode App - Up Long", 1, NULL, NULL); + variable_item_list_add(variable_item_list, "DummyMode App - Down", 1, NULL, NULL); + variable_item_list_add(variable_item_list, "DummyMode App - Down Long", 1, NULL, NULL); + variable_item_list_add(variable_item_list, "DummyMode App - Ok", 1, NULL, NULL); + variable_item_list_add(variable_item_list, "DummyMode App - Ok Long", 1, NULL, NULL); variable_item_list_set_enter_callback( variable_item_list, desktop_settings_scene_start_var_list_enter_callback, app); @@ -208,6 +218,13 @@ bool desktop_settings_scene_start_on_event(void* context, SceneManagerEvent even SCENE_STATE_SET_DUMMY_APP | DummyAppLeft); scene_manager_next_scene(app->scene_manager, DesktopSettingsAppSceneFavorite); break; + case DesktopSettingsDummyLeftLong: + scene_manager_set_scene_state( + app->scene_manager, + DesktopSettingsAppSceneFavorite, + SCENE_STATE_SET_DUMMY_APP | DummyAppLeftLong); + scene_manager_next_scene(app->scene_manager, DesktopSettingsAppSceneFavorite); + break; case DesktopSettingsDummyRight: scene_manager_set_scene_state( app->scene_manager, @@ -215,6 +232,20 @@ bool desktop_settings_scene_start_on_event(void* context, SceneManagerEvent even SCENE_STATE_SET_DUMMY_APP | DummyAppRight); scene_manager_next_scene(app->scene_manager, DesktopSettingsAppSceneFavorite); break; + case DesktopSettingsDummyRightLong: + scene_manager_set_scene_state( + app->scene_manager, + DesktopSettingsAppSceneFavorite, + SCENE_STATE_SET_DUMMY_APP | DummyAppRightLong); + scene_manager_next_scene(app->scene_manager, DesktopSettingsAppSceneFavorite); + break; + case DesktopSettingsDummyUpLong: + scene_manager_set_scene_state( + app->scene_manager, + DesktopSettingsAppSceneFavorite, + SCENE_STATE_SET_DUMMY_APP | DummyAppUpLong); + scene_manager_next_scene(app->scene_manager, DesktopSettingsAppSceneFavorite); + break; case DesktopSettingsDummyDown: scene_manager_set_scene_state( app->scene_manager, @@ -222,6 +253,13 @@ bool desktop_settings_scene_start_on_event(void* context, SceneManagerEvent even SCENE_STATE_SET_DUMMY_APP | DummyAppDown); scene_manager_next_scene(app->scene_manager, DesktopSettingsAppSceneFavorite); break; + case DesktopSettingsDummyDownLong: + scene_manager_set_scene_state( + app->scene_manager, + DesktopSettingsAppSceneFavorite, + SCENE_STATE_SET_DUMMY_APP | DummyAppDownLong); + scene_manager_next_scene(app->scene_manager, DesktopSettingsAppSceneFavorite); + break; case DesktopSettingsDummyOk: scene_manager_set_scene_state( app->scene_manager, @@ -229,6 +267,13 @@ bool desktop_settings_scene_start_on_event(void* context, SceneManagerEvent even SCENE_STATE_SET_DUMMY_APP | DummyAppOk); scene_manager_next_scene(app->scene_manager, DesktopSettingsAppSceneFavorite); break; + case DesktopSettingsDummyOkLong: + scene_manager_set_scene_state( + app->scene_manager, + DesktopSettingsAppSceneFavorite, + SCENE_STATE_SET_DUMMY_APP | DummyAppOkLong); + scene_manager_next_scene(app->scene_manager, DesktopSettingsAppSceneFavorite); + break; default: break; From b1b00d4fa76730ce3978568d014c2ea9bc760872 Mon Sep 17 00:00:00 2001 From: gid9798 <30450294+gid9798@users.noreply.github.com> Date: Fri, 18 Aug 2023 11:23:35 +0300 Subject: [PATCH 3/4] Desktop favorites: Return none and add lock in dummy --- .../views/one_shot_animation_view.c | 2 +- .../desktop/scenes/desktop_scene_main.c | 26 ++++++++++--- .../scenes/desktop_settings_scene_favorite.c | 38 +++++++++++++++++-- 3 files changed, 56 insertions(+), 10 deletions(-) diff --git a/applications/services/desktop/animations/views/one_shot_animation_view.c b/applications/services/desktop/animations/views/one_shot_animation_view.c index 9a4dff06c..077f82d09 100644 --- a/applications/services/desktop/animations/views/one_shot_animation_view.c +++ b/applications/services/desktop/animations/views/one_shot_animation_view.c @@ -65,8 +65,8 @@ static bool one_shot_view_input(InputEvent* event, void* context) { if(!consumed) { if(event->key == InputKeyRight) { /* Right button reserved for animation activation, so consume */ - consumed = true; if(event->type == InputTypeShort) { + consumed = true; if(view->interact_callback) { view->interact_callback(view->interact_callback_context); } diff --git a/applications/services/desktop/scenes/desktop_scene_main.c b/applications/services/desktop/scenes/desktop_scene_main.c index a4fe5054b..877ef5307 100644 --- a/applications/services/desktop/scenes/desktop_scene_main.c +++ b/applications/services/desktop/scenes/desktop_scene_main.c @@ -61,11 +61,19 @@ static void } #endif +static inline bool desktop_scene_main_check_none(const char* str) { + return (str[1] == '\0' && str[0] == '?'); +} + static void desktop_scene_main_open_app_or_profile(Desktop* desktop, FavoriteApp* application) { bool load_ok = false; if(strlen(application->name_or_path) > 0) { - if(loader_start(desktop->loader, application->name_or_path, NULL, NULL) == - LoaderStatusOk) { + if(desktop_scene_main_check_none(application->name_or_path)) { + // skip loading + load_ok = true; + } else if( + loader_start(desktop->loader, application->name_or_path, NULL, NULL) == + LoaderStatusOk) { load_ok = true; } } @@ -76,7 +84,9 @@ static void desktop_scene_main_open_app_or_profile(Desktop* desktop, FavoriteApp static void desktop_scene_main_start_favorite(Desktop* desktop, FavoriteApp* application) { if(strlen(application->name_or_path) > 0) { - loader_start_with_gui_error(desktop->loader, application->name_or_path, NULL); + if(!desktop_scene_main_check_none(application->name_or_path)) { + loader_start_with_gui_error(desktop->loader, application->name_or_path, NULL); + } } else { loader_start(desktop->loader, LOADER_APPLICATIONS_NAME, NULL, NULL); } @@ -207,8 +217,14 @@ bool desktop_scene_main_on_event(void* context, SceneManagerEvent event) { desktop, &desktop->settings.dummy_apps[DummyAppOk]); break; case DesktopDummyEventOpenUpLong: - desktop_scene_main_open_app_or_profile( - desktop, &desktop->settings.dummy_apps[DummyAppUpLong]); + if(!desktop_scene_main_check_none( + desktop->settings.dummy_apps[DummyAppUpLong].name_or_path)) { + desktop_scene_main_open_app_or_profile( + desktop, &desktop->settings.dummy_apps[DummyAppUpLong]); + } else { + scene_manager_set_scene_state(desktop->scene_manager, DesktopSceneLockMenu, 0); + desktop_lock(desktop); + } break; case DesktopDummyEventOpenDownLong: desktop_scene_main_open_app_or_profile( diff --git a/applications/settings/desktop_settings/scenes/desktop_settings_scene_favorite.c b/applications/settings/desktop_settings/scenes/desktop_settings_scene_favorite.c index 31826cae0..aade00662 100644 --- a/applications/settings/desktop_settings/scenes/desktop_settings_scene_favorite.c +++ b/applications/settings/desktop_settings/scenes/desktop_settings_scene_favorite.c @@ -12,9 +12,15 @@ #define EXTERNAL_BROWSER_NAME ("Apps Menu (Default)") #define PASSPORT_NAME ("Passport (Default)") -#define EXTERNAL_APPLICATION_INDEX (1) +#define NONE_APPLICATION_INDEX (1) +#define NONE_APPLICATION_NAME "None (disable)" +#define LOCK_APPLICATION_NAME "Lock Flipper" + +#define EXTERNAL_APPLICATION_INDEX (2) #define EXTERNAL_APPLICATION_NAME ("[Select App]") +#define MAIN_LIST_APPLICATION_OFFSET (3) + #define PRESELECTED_SPECIAL 0xffffffff static const char* favorite_fap_get_app_name(size_t i) { @@ -63,6 +69,7 @@ void desktop_settings_scene_favorite_on_enter(void* context) { FavoriteApp* curr_favorite_app = NULL; bool is_dummy_app = false; bool default_passport = false; + bool lock_if_none = false; if((favorite_id & SCENE_STATE_SET_DUMMY_APP) == 0) { furi_assert(favorite_id < FavoriteAppNumber); @@ -76,6 +83,9 @@ void desktop_settings_scene_favorite_on_enter(void* context) { curr_favorite_app = &app->settings.dummy_apps[favorite_id]; is_dummy_app = true; default_passport = true; + if(favorite_id == DummyAppUpLong) { + lock_if_none = true; + } } // Special case: Application browser @@ -86,6 +96,14 @@ void desktop_settings_scene_favorite_on_enter(void* context) { desktop_settings_scene_favorite_submenu_callback, app); + // Special case: None (disable) or Lock Flipper + submenu_add_item( + submenu, + lock_if_none ? (LOCK_APPLICATION_NAME) : (NONE_APPLICATION_NAME), + NONE_APPLICATION_INDEX, + desktop_settings_scene_favorite_submenu_callback, + app); + // Special case: Specific application submenu_add_item( submenu, @@ -99,11 +117,15 @@ void desktop_settings_scene_favorite_on_enter(void* context) { const char* name = favorite_fap_get_app_name(i); submenu_add_item( - submenu, name, i + 2, desktop_settings_scene_favorite_submenu_callback, app); + submenu, + name, + i + MAIN_LIST_APPLICATION_OFFSET, + desktop_settings_scene_favorite_submenu_callback, + app); // Select favorite item in submenu if(!strcmp(name, curr_favorite_app->name_or_path)) { - pre_select_item = i + 2; + pre_select_item = i + MAIN_LIST_APPLICATION_OFFSET; } } } @@ -111,6 +133,10 @@ void desktop_settings_scene_favorite_on_enter(void* context) { if(pre_select_item == PRESELECTED_SPECIAL) { if(curr_favorite_app->name_or_path[0] == '\0') { pre_select_item = DEFAULT_INDEX; + } else if( + (curr_favorite_app->name_or_path[1] == '\0') && + (curr_favorite_app->name_or_path[0] == '?')) { + pre_select_item = NONE_APPLICATION_INDEX; } else { pre_select_item = EXTERNAL_APPLICATION_INDEX; } @@ -143,6 +169,10 @@ bool desktop_settings_scene_favorite_on_event(void* context, SceneManagerEvent e if(event.event == DEFAULT_INDEX) { curr_favorite_app->name_or_path[0] = '\0'; consumed = true; + } else if(event.event == NONE_APPLICATION_INDEX) { + curr_favorite_app->name_or_path[0] = '?'; + curr_favorite_app->name_or_path[1] = '\0'; + consumed = true; } else if(event.event == EXTERNAL_APPLICATION_INDEX) { const DialogsFileBrowserOptions browser_options = { .extension = ".fap", @@ -168,7 +198,7 @@ bool desktop_settings_scene_favorite_on_event(void* context, SceneManagerEvent e consumed = true; } } else { - size_t app_index = event.event - 2; + size_t app_index = event.event - MAIN_LIST_APPLICATION_OFFSET; const char* name = favorite_fap_get_app_name(app_index); if(name) strncpy(curr_favorite_app->name_or_path, name, MAX_APP_LENGTH); consumed = true; From 6330012b1d46de1ba5efd8cb63ceffc863dcbfb1 Mon Sep 17 00:00:00 2001 From: gid9798 <30450294+gid9798@users.noreply.github.com> Date: Fri, 18 Aug 2023 11:27:12 +0300 Subject: [PATCH 4/4] Desktop: fix lock timer after rebooting --- applications/services/desktop/desktop.c | 5 +++-- applications/services/desktop/views/desktop_view_locked.c | 3 +-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/applications/services/desktop/desktop.c b/applications/services/desktop/desktop.c index 30e7253da..f4837bfb0 100644 --- a/applications/services/desktop/desktop.c +++ b/applications/services/desktop/desktop.c @@ -131,8 +131,9 @@ static bool desktop_custom_event_callback(void* context, uint32_t event) { DESKTOP_SETTINGS_LOAD(&desktop->settings); desktop_clock_reconfigure(desktop); - - desktop_auto_lock_arm(desktop); + if(!furi_hal_rtc_is_flag_set(FuriHalRtcFlagLock)) { + desktop_auto_lock_arm(desktop); + } return true; case DesktopGlobalAutoLock: if(!loader_is_locked(desktop->loader)) { diff --git a/applications/services/desktop/views/desktop_view_locked.c b/applications/services/desktop/views/desktop_view_locked.c index b6ab9344b..67cebfaab 100644 --- a/applications/services/desktop/views/desktop_view_locked.c +++ b/applications/services/desktop/views/desktop_view_locked.c @@ -224,8 +224,7 @@ void desktop_view_locked_close_doors(DesktopViewLocked* locked_view) { void desktop_view_locked_lock(DesktopViewLocked* locked_view, bool pin_locked) { DesktopViewLockedModel* model = view_get_model(locked_view->view); - // TODO: Fix!!!!!!!!!!! - //furi_assert(model->view_state == DesktopViewLockedStateUnlocked); + furi_assert(model->view_state == DesktopViewLockedStateUnlocked); model->view_state = DesktopViewLockedStateLocked; model->pin_locked = pin_locked; view_commit_model(locked_view->view, true);