From ef0203f778ef2be4294d84e3155377bbe4dbfced Mon Sep 17 00:00:00 2001 From: Willy-JL <49810075+Willy-JL@users.noreply.github.com> Date: Sun, 25 Jun 2023 23:53:11 +0100 Subject: [PATCH] Add back loader_show_settings --- .../desktop/scenes/desktop_scene_lock_menu.c | 4 +- applications/services/loader/loader.c | 15 ++++++-- applications/services/loader/loader.h | 6 +++ applications/services/loader/loader_i.h | 1 + applications/services/loader/loader_menu.c | 38 +++++++++++-------- applications/services/loader/loader_menu.h | 4 +- firmware/targets/f7/api_symbols.csv | 1 + 7 files changed, 47 insertions(+), 22 deletions(-) diff --git a/applications/services/desktop/scenes/desktop_scene_lock_menu.c b/applications/services/desktop/scenes/desktop_scene_lock_menu.c index be0290930..66d732781 100644 --- a/applications/services/desktop/scenes/desktop_scene_lock_menu.c +++ b/applications/services/desktop/scenes/desktop_scene_lock_menu.c @@ -80,8 +80,8 @@ bool desktop_scene_lock_menu_on_event(void* context, SceneManagerEvent event) { switch(event.event) { case DesktopLockMenuEventSettings: desktop_scene_lock_menu_save_settings(desktop); - // loader_show_settings(furi_record_open(RECORD_LOADER)); - // furi_record_close(RECORD_LOADER); + loader_show_settings(furi_record_open(RECORD_LOADER)); + furi_record_close(RECORD_LOADER); consumed = true; break; case DesktopLockMenuEventLock: diff --git a/applications/services/loader/loader.c b/applications/services/loader/loader.c index 91b6d1a2d..07102eb0e 100644 --- a/applications/services/loader/loader.c +++ b/applications/services/loader/loader.c @@ -88,6 +88,12 @@ void loader_show_menu(Loader* loader) { furi_message_queue_put(loader->queue, &message, FuriWaitForever); } +void loader_show_settings(Loader* loader) { + LoaderMessage message; + message.type = LoaderMessageTypeShowSettings; + furi_message_queue_put(loader->queue, &message, FuriWaitForever); +} + FuriPubSub* loader_get_pubsub(Loader* loader) { furi_assert(loader); // it's safe to return pubsub without locking @@ -312,9 +318,9 @@ static LoaderStatus loader_start_external_app( // process messages -static void loader_do_menu_show(Loader* loader) { +static void loader_do_menu_show(Loader* loader, bool settings) { if(!loader->loader_menu) { - loader->loader_menu = loader_menu_alloc(loader_menu_closed_callback, loader); + loader->loader_menu = loader_menu_alloc(loader_menu_closed_callback, loader, settings); } } @@ -475,7 +481,10 @@ int32_t loader_srv(void* p) { api_lock_unlock(message.api_lock); break; case LoaderMessageTypeShowMenu: - loader_do_menu_show(loader); + loader_do_menu_show(loader, false); + break; + case LoaderMessageTypeShowSettings: + loader_do_menu_show(loader, true); break; case LoaderMessageTypeMenuClosed: loader_do_menu_closed(loader); diff --git a/applications/services/loader/loader.h b/applications/services/loader/loader.h index d49bec0a4..f88439593 100644 --- a/applications/services/loader/loader.h +++ b/applications/services/loader/loader.h @@ -72,6 +72,12 @@ bool loader_is_locked(Loader* instance); */ void loader_show_menu(Loader* instance); +/** + * @brief Show settings menu + * @param[in] instance loader instance + */ +void loader_show_settings(Loader* instance); + /** * @brief Get loader pubsub * @param[in] instance loader instance diff --git a/applications/services/loader/loader_i.h b/applications/services/loader/loader_i.h index 688b8fb66..cdf01c33c 100644 --- a/applications/services/loader/loader_i.h +++ b/applications/services/loader/loader_i.h @@ -25,6 +25,7 @@ typedef enum { LoaderMessageTypeStartByName, LoaderMessageTypeAppClosed, LoaderMessageTypeShowMenu, + LoaderMessageTypeShowSettings, LoaderMessageTypeMenuClosed, LoaderMessageTypeApplicationsClosed, LoaderMessageTypeLock, diff --git a/applications/services/loader/loader_menu.c b/applications/services/loader/loader_menu.c index 604ae7b7a..c0e3344c3 100644 --- a/applications/services/loader/loader_menu.c +++ b/applications/services/loader/loader_menu.c @@ -12,16 +12,18 @@ struct LoaderMenu { FuriThread* thread; + bool settings; void (*closed_cb)(void*); void* context; }; static int32_t loader_menu_thread(void* p); -LoaderMenu* loader_menu_alloc(void (*closed_cb)(void*), void* context) { +LoaderMenu* loader_menu_alloc(void (*closed_cb)(void*), void* context, bool settings) { LoaderMenu* loader_menu = malloc(sizeof(LoaderMenu)); loader_menu->closed_cb = closed_cb; loader_menu->context = context; + loader_menu->settings = settings; loader_menu->thread = furi_thread_alloc_ex(TAG, 1024, loader_menu_thread, loader_menu); furi_thread_start(loader_menu->thread); return loader_menu; @@ -44,6 +46,7 @@ typedef struct { ViewDispatcher* view_dispatcher; Menu* primary_menu; Submenu* settings_menu; + bool settings; } LoaderMenuApp; static void loader_menu_start(const char* name) { @@ -123,37 +126,42 @@ static LoaderMenuApp* loader_menu_app_alloc(LoaderMenu* loader_menu) { LoaderMenuApp* app = malloc(sizeof(LoaderMenuApp)); app->gui = furi_record_open(RECORD_GUI); app->view_dispatcher = view_dispatcher_alloc(); - app->primary_menu = menu_alloc(); - app->settings_menu = submenu_alloc(); - - loader_menu_build_menu(app, loader_menu); - loader_menu_build_submenu(app, loader_menu); + app->settings = loader_menu->settings; // Primary menu - View* primary_view = menu_get_view(app->primary_menu); - view_set_context(primary_view, app->primary_menu); - view_set_previous_callback(primary_view, loader_menu_exit); - view_dispatcher_add_view(app->view_dispatcher, LoaderMenuViewPrimary, primary_view); + if(!app->settings) { + app->primary_menu = menu_alloc(); + loader_menu_build_menu(app, loader_menu); + View* primary_view = menu_get_view(app->primary_menu); + view_set_context(primary_view, app->primary_menu); + view_set_previous_callback(primary_view, loader_menu_exit); + view_dispatcher_add_view(app->view_dispatcher, LoaderMenuViewPrimary, primary_view); + } // Settings menu + app->settings_menu = submenu_alloc(); + loader_menu_build_submenu(app, loader_menu); View* settings_view = submenu_get_view(app->settings_menu); view_set_context(settings_view, app->settings_menu); - view_set_previous_callback(settings_view, loader_menu_switch_to_primary); + view_set_previous_callback(settings_view, app->settings ? loader_menu_exit : loader_menu_switch_to_primary); view_dispatcher_add_view(app->view_dispatcher, LoaderMenuViewSettings, settings_view); view_dispatcher_enable_queue(app->view_dispatcher); - view_dispatcher_switch_to_view(app->view_dispatcher, LoaderMenuViewPrimary); + view_dispatcher_switch_to_view(app->view_dispatcher, app->settings ? LoaderMenuViewSettings : LoaderMenuViewPrimary); return app; } static void loader_menu_app_free(LoaderMenuApp* app) { - view_dispatcher_remove_view(app->view_dispatcher, LoaderMenuViewPrimary); + if(!app->settings) { + view_dispatcher_remove_view(app->view_dispatcher, LoaderMenuViewPrimary); + menu_free(app->primary_menu); + } view_dispatcher_remove_view(app->view_dispatcher, LoaderMenuViewSettings); + submenu_free(app->settings_menu); + view_dispatcher_free(app->view_dispatcher); - menu_free(app->primary_menu); - submenu_free(app->settings_menu); furi_record_close(RECORD_GUI); free(app); } diff --git a/applications/services/loader/loader_menu.h b/applications/services/loader/loader_menu.h index 528fe7d29..bfb45285a 100644 --- a/applications/services/loader/loader_menu.h +++ b/applications/services/loader/loader_menu.h @@ -7,10 +7,10 @@ extern "C" { typedef struct LoaderMenu LoaderMenu; -LoaderMenu* loader_menu_alloc(void (*closed_cb)(void*), void* context); +LoaderMenu* loader_menu_alloc(void (*closed_cb)(void*), void* context, bool settings); void loader_menu_free(LoaderMenu* loader_menu); #ifdef __cplusplus } -#endif \ No newline at end of file +#endif diff --git a/firmware/targets/f7/api_symbols.csv b/firmware/targets/f7/api_symbols.csv index 7535942dc..7d356bef5 100644 --- a/firmware/targets/f7/api_symbols.csv +++ b/firmware/targets/f7/api_symbols.csv @@ -1918,6 +1918,7 @@ Function,+,loader_get_pubsub,FuriPubSub*,Loader* Function,+,loader_is_locked,_Bool,Loader* Function,+,loader_lock,_Bool,Loader* Function,+,loader_show_menu,void,Loader* +Function,+,loader_show_settings,void,Loader* Function,+,loader_start,LoaderStatus,"Loader*, const char*, const char*, FuriString*" Function,+,loader_start_with_gui_error,LoaderStatus,"Loader*, const char*, const char*" Function,+,loader_unlock,void,Loader*