From 24dd4336c4973e95ab0eabbf8954c2ec43463deb Mon Sep 17 00:00:00 2001 From: Willy-JL <49810075+Willy-JL@users.noreply.github.com> Date: Sat, 6 May 2023 02:53:21 +0100 Subject: [PATCH] Dont reload ext main apps data on each menu open --- applications/services/loader/loader.c | 54 +++++++++++++++- applications/services/loader/loader.h | 1 + .../services/loader/loader_extmainapp.h | 12 ++++ applications/services/loader/loader_i.h | 1 + applications/services/loader/loader_menu.c | 64 ++++--------------- applications/services/loader/loader_menu.h | 3 +- 6 files changed, 82 insertions(+), 53 deletions(-) create mode 100644 applications/services/loader/loader_extmainapp.h diff --git a/applications/services/loader/loader.c b/applications/services/loader/loader.c index b9f47dcdd..12651eba7 100644 --- a/applications/services/loader/loader.c +++ b/applications/services/loader/loader.c @@ -3,6 +3,11 @@ #include "loader_menu.h" #include #include +#include +#include +#include +#include "applications/main/fap_loader/fap_loader_app.h" +#include #define TAG "Loader" #define LOADER_MAGIC_THREAD_VALUE 0xDEADBEEF @@ -107,6 +112,28 @@ static void loader_thread_state_callback(FuriThreadState thread_state, void* con } } +bool loader_menu_load_fap_meta( + Storage* storage, + FuriString* path, + FuriString* name, + const Icon** icon) { + *icon = NULL; + uint8_t* icon_buf = malloc(CUSTOM_ICON_MAX_SIZE); + if(!fap_loader_load_name_and_icon(path, storage, &icon_buf, name)) { + free(icon_buf); + icon_buf = NULL; + return false; + } + *icon = malloc(sizeof(Icon)); + FURI_CONST_ASSIGN((*icon)->frame_count, 1); + FURI_CONST_ASSIGN((*icon)->frame_rate, 0); + FURI_CONST_ASSIGN((*icon)->width, 10); + FURI_CONST_ASSIGN((*icon)->height, 10); + FURI_CONST_ASSIGN_PTR((*icon)->frames, malloc(sizeof(const uint8_t*))); + FURI_CONST_ASSIGN_PTR((*icon)->frames[0], icon_buf); + return true; +} + // implementation static Loader* loader_alloc() { @@ -118,6 +145,31 @@ static Loader* loader_alloc() { loader->app.name = NULL; loader->app.thread = NULL; loader->app.insomniac = false; + + Storage* storage = furi_record_open(RECORD_STORAGE); + FuriString* path = furi_string_alloc(); + FuriString* name = furi_string_alloc(); + Stream* stream = file_stream_alloc(storage); + ExtMainAppList_init(loader->ext_main_apps); + if(file_stream_open(stream, XTREME_APPS_PATH, FSAM_READ, FSOM_OPEN_EXISTING)) { + while(stream_read_line(stream, path)) { + furi_string_replace_all(path, "\r", ""); + furi_string_replace_all(path, "\n", ""); + const Icon* icon; + if(!loader_menu_load_fap_meta(storage, path, name, &icon)) continue; + ExtMainAppList_push_back( + loader->ext_main_apps, + (ExtMainApp){ + .name = strdup(furi_string_get_cstr(name)), + .path = strdup(furi_string_get_cstr(path)), + .icon = icon}); + } + } + file_stream_close(stream); + stream_free(stream); + furi_string_free(name); + furi_string_free(path); + furi_record_close(RECORD_STORAGE); return loader; } @@ -204,7 +256,7 @@ static void loader_do_menu_show(Loader* loader, bool settings) { loader->loader_menu = loader_menu_alloc(); loader_menu_set_closed_callback(loader->loader_menu, loader_menu_closed_callback, loader); loader_menu_set_click_callback(loader->loader_menu, loader_menu_click_callback, loader); - loader_menu_start(loader->loader_menu, settings); + loader_menu_start(loader->loader_menu, settings, &loader->ext_main_apps); } } diff --git a/applications/services/loader/loader.h b/applications/services/loader/loader.h index e8f1fd64e..b31bb1bdd 100644 --- a/applications/services/loader/loader.h +++ b/applications/services/loader/loader.h @@ -1,5 +1,6 @@ #pragma once #include +#include "loader_extmainapp.h" #ifdef __cplusplus extern "C" { diff --git a/applications/services/loader/loader_extmainapp.h b/applications/services/loader/loader_extmainapp.h new file mode 100644 index 000000000..2e10b16a3 --- /dev/null +++ b/applications/services/loader/loader_extmainapp.h @@ -0,0 +1,12 @@ +#pragma once + +#include +#include + +typedef struct { + const char* name; + const char* path; + const Icon* icon; +} ExtMainApp; + +LIST_DEF(ExtMainAppList, ExtMainApp, M_POD_OPLIST) diff --git a/applications/services/loader/loader_i.h b/applications/services/loader/loader_i.h index 4a1477a7b..6887b4b50 100644 --- a/applications/services/loader/loader_i.h +++ b/applications/services/loader/loader_i.h @@ -16,6 +16,7 @@ struct Loader { FuriMessageQueue* queue; LoaderMenu* loader_menu; LoaderAppData app; + ExtMainAppList_t ext_main_apps; }; typedef enum { diff --git a/applications/services/loader/loader_menu.c b/applications/services/loader/loader_menu.c index 1391394e5..c4e14038c 100644 --- a/applications/services/loader/loader_menu.c +++ b/applications/services/loader/loader_menu.c @@ -4,11 +4,6 @@ #include #include #include -#include -#include -#include -#include "applications/main/fap_loader/fap_loader_app.h" -#include #include "loader_menu.h" @@ -19,7 +14,9 @@ struct LoaderMenu { ViewDispatcher* view_dispatcher; Menu* primary_menu; Submenu* settings_menu; + bool settings; + ExtMainAppList_t* ext_main_apps; void (*closed_callback)(void*); void* closed_callback_context; @@ -59,10 +56,11 @@ void loader_menu_free(LoaderMenu* loader_menu) { free(loader_menu); } -void loader_menu_start(LoaderMenu* loader_menu, bool settings) { +void loader_menu_start(LoaderMenu* loader_menu, bool settings, ExtMainAppList_t* ext_main_apps) { furi_assert(loader_menu); furi_assert(!loader_menu->thread); loader_menu->settings = settings; + loader_menu->ext_main_apps = ext_main_apps; loader_menu->thread = furi_thread_alloc_ex(TAG, 1024, loader_menu_thread, loader_menu); furi_thread_start(loader_menu->thread); } @@ -132,28 +130,6 @@ static uint32_t loader_menu_exit(void* context) { return VIEW_NONE; } -bool loader_menu_load_fap_meta( - Storage* storage, - FuriString* path, - FuriString* name, - const Icon** icon) { - *icon = NULL; - uint8_t* icon_buf = malloc(CUSTOM_ICON_MAX_SIZE); - if(!fap_loader_load_name_and_icon(path, storage, &icon_buf, name)) { - free(icon_buf); - icon_buf = NULL; - return false; - } - *icon = malloc(sizeof(Icon)); - FURI_CONST_ASSIGN((*icon)->frame_count, 1); - FURI_CONST_ASSIGN((*icon)->frame_rate, 0); - FURI_CONST_ASSIGN((*icon)->width, 10); - FURI_CONST_ASSIGN((*icon)->height, 10); - FURI_CONST_ASSIGN_PTR((*icon)->frames, malloc(sizeof(const uint8_t*))); - FURI_CONST_ASSIGN_PTR((*icon)->frames[0], icon_buf); - return true; -} - static void loader_menu_build_menu(LoaderMenu* loader_menu) { size_t i; for(i = 0; i < FLIPPER_APPS_COUNT; i++) { @@ -173,30 +149,16 @@ static void loader_menu_build_menu(LoaderMenu* loader_menu) { loader_menu_switch_to_settings, loader_menu); - Storage* storage = furi_record_open(RECORD_STORAGE); - FuriString* path = furi_string_alloc(); - FuriString* name = furi_string_alloc(); - Stream* stream = file_stream_alloc(storage); - if(file_stream_open(stream, XTREME_APPS_PATH, FSAM_READ, FSOM_OPEN_EXISTING)) { - while(stream_read_line(stream, path)) { - furi_string_replace_all(path, "\r", ""); - furi_string_replace_all(path, "\n", ""); - const Icon* icon; - if(!loader_menu_load_fap_meta(storage, path, name, &icon)) continue; - menu_add_item( - loader_menu->primary_menu, - strdup(furi_string_get_cstr(name)), - icon, - (uint32_t)strdup(furi_string_get_cstr(path)), - loader_menu_external_callback, - (void*)loader_menu); - } + for(i = 0; i < ExtMainAppList_size(*loader_menu->ext_main_apps); i++) { + const ExtMainApp* app = ExtMainAppList_get(*loader_menu->ext_main_apps, i); + menu_add_item( + loader_menu->primary_menu, + app->name, + app->icon, + (uint32_t)app->path, + loader_menu_external_callback, + (void*)loader_menu); } - file_stream_close(stream); - stream_free(stream); - furi_string_free(name); - furi_string_free(path); - furi_record_close(RECORD_STORAGE); }; static void loader_menu_build_submenu(LoaderMenu* loader_menu) { diff --git a/applications/services/loader/loader_menu.h b/applications/services/loader/loader_menu.h index db39834da..f4188b733 100644 --- a/applications/services/loader/loader_menu.h +++ b/applications/services/loader/loader_menu.h @@ -1,5 +1,6 @@ #pragma once #include +#include "loader_extmainapp.h" #ifdef __cplusplus extern "C" { @@ -11,7 +12,7 @@ LoaderMenu* loader_menu_alloc(); void loader_menu_free(LoaderMenu* loader_menu); -void loader_menu_start(LoaderMenu* loader_menu, bool settings); +void loader_menu_start(LoaderMenu* loader_menu, bool settings, ExtMainAppList_t* ext_main_apps); void loader_menu_stop(LoaderMenu* loader_menu);