From bc54b0e43763d20de07b7d6a302c4a07fe4eea1d Mon Sep 17 00:00:00 2001 From: DrunkBatya Date: Sat, 1 Oct 2022 09:13:06 +0300 Subject: [PATCH 01/15] Add .fap extention, and Applications tab --- applications/main/archive/helpers/archive_browser.h | 3 +++ applications/main/archive/helpers/archive_files.h | 1 + applications/main/archive/scenes/archive_scene_browser.c | 1 + applications/main/archive/views/archive_browser_view.c | 2 ++ applications/main/archive/views/archive_browser_view.h | 1 + 5 files changed, 8 insertions(+) diff --git a/applications/main/archive/helpers/archive_browser.h b/applications/main/archive/helpers/archive_browser.h index ad64a9845323..e4cf1f944ca1 100644 --- a/applications/main/archive/helpers/archive_browser.h +++ b/applications/main/archive/helpers/archive_browser.h @@ -17,6 +17,7 @@ static const char* tab_default_paths[] = { [ArchiveTabBadUsb] = ANY_PATH("badusb"), [ArchiveTabU2f] = "/app:u2f", [ArchiveTabBrowser] = STORAGE_ANY_PATH_PREFIX, + [ArchiveTabApplications] = ANY_PATH("apps"), }; static const char* known_ext[] = { @@ -30,6 +31,7 @@ static const char* known_ext[] = { [ArchiveFileTypeUpdateManifest] = ".fuf", [ArchiveFileTypeFolder] = "?", [ArchiveFileTypeUnknown] = "*", + [ArchiveFileTypeApplication] = ".fap", }; static const ArchiveFileTypeEnum known_type[] = { @@ -42,6 +44,7 @@ static const ArchiveFileTypeEnum known_type[] = { [ArchiveTabBadUsb] = ArchiveFileTypeBadUsb, [ArchiveTabU2f] = ArchiveFileTypeU2f, [ArchiveTabBrowser] = ArchiveFileTypeUnknown, + [ArchiveTabApplications] = ArchiveFileTypeApplication, }; static inline ArchiveFileTypeEnum archive_get_tab_filetype(ArchiveTabEnum tab) { diff --git a/applications/main/archive/helpers/archive_files.h b/applications/main/archive/helpers/archive_files.h index 84b7e24a62f5..7cf7fd41f033 100644 --- a/applications/main/archive/helpers/archive_files.h +++ b/applications/main/archive/helpers/archive_files.h @@ -13,6 +13,7 @@ typedef enum { ArchiveFileTypeBadUsb, ArchiveFileTypeU2f, ArchiveFileTypeUpdateManifest, + ArchiveFileTypeApplication, ArchiveFileTypeFolder, ArchiveFileTypeUnknown, ArchiveFileTypeLoading, diff --git a/applications/main/archive/scenes/archive_scene_browser.c b/applications/main/archive/scenes/archive_scene_browser.c index e22ac792fcbe..f0ff33fc6939 100644 --- a/applications/main/archive/scenes/archive_scene_browser.c +++ b/applications/main/archive/scenes/archive_scene_browser.c @@ -20,6 +20,7 @@ static const char* flipper_app_name[] = { [ArchiveFileTypeBadUsb] = "Bad USB", [ArchiveFileTypeU2f] = "U2F", [ArchiveFileTypeUpdateManifest] = "UpdaterApp", + [ArchiveFileTypeApplication] = "Applications", }; static void archive_loader_callback(const void* message, void* context) { diff --git a/applications/main/archive/views/archive_browser_view.c b/applications/main/archive/views/archive_browser_view.c index ddd6637dbc87..dd82bcdee260 100644 --- a/applications/main/archive/views/archive_browser_view.c +++ b/applications/main/archive/views/archive_browser_view.c @@ -15,6 +15,7 @@ static const char* ArchiveTabNames[] = { [ArchiveTabBadUsb] = "Bad USB", [ArchiveTabU2f] = "U2F", [ArchiveTabBrowser] = "Browser", + [ArchiveTabApplications] = "Applications", }; static const Icon* ArchiveItemIcons[] = { @@ -29,6 +30,7 @@ static const Icon* ArchiveItemIcons[] = { [ArchiveFileTypeFolder] = &I_dir_10px, [ArchiveFileTypeUnknown] = &I_unknown_10px, [ArchiveFileTypeLoading] = &I_loading_10px, + [ArchiveFileTypeApplication] = &A_Plugins_14, }; void archive_browser_set_callback( diff --git a/applications/main/archive/views/archive_browser_view.h b/applications/main/archive/views/archive_browser_view.h index 5c649c389de0..688fc22855c9 100644 --- a/applications/main/archive/views/archive_browser_view.h +++ b/applications/main/archive/views/archive_browser_view.h @@ -27,6 +27,7 @@ typedef enum { ArchiveTabBadUsb, ArchiveTabU2f, ArchiveTabBrowser, + ArchiveTabApplications, ArchiveTabTotal, } ArchiveTabEnum; From b1d29e071233c1aab79af1f293e7872a3aabb5f4 Mon Sep 17 00:00:00 2001 From: DrunkBatya Date: Sat, 1 Oct 2022 09:42:16 +0300 Subject: [PATCH 02/15] Using new icon, renaming tab to Apps --- .../main/archive/views/archive_browser_view.c | 4 ++-- assets/icons/Archive/plugin_10px.png | Bin 0 -> 418 bytes firmware/targets/f7/api_symbols.csv | 3 ++- 3 files changed, 4 insertions(+), 3 deletions(-) create mode 100644 assets/icons/Archive/plugin_10px.png diff --git a/applications/main/archive/views/archive_browser_view.c b/applications/main/archive/views/archive_browser_view.c index dd82bcdee260..436c5349a3d2 100644 --- a/applications/main/archive/views/archive_browser_view.c +++ b/applications/main/archive/views/archive_browser_view.c @@ -14,8 +14,8 @@ static const char* ArchiveTabNames[] = { [ArchiveTabInfrared] = "Infrared", [ArchiveTabBadUsb] = "Bad USB", [ArchiveTabU2f] = "U2F", + [ArchiveTabApplications] = "Apps", [ArchiveTabBrowser] = "Browser", - [ArchiveTabApplications] = "Applications", }; static const Icon* ArchiveItemIcons[] = { @@ -30,7 +30,7 @@ static const Icon* ArchiveItemIcons[] = { [ArchiveFileTypeFolder] = &I_dir_10px, [ArchiveFileTypeUnknown] = &I_unknown_10px, [ArchiveFileTypeLoading] = &I_loading_10px, - [ArchiveFileTypeApplication] = &A_Plugins_14, + [ArchiveFileTypeApplication] = &I_plugin_10px, }; void archive_browser_set_callback( diff --git a/assets/icons/Archive/plugin_10px.png b/assets/icons/Archive/plugin_10px.png new file mode 100644 index 0000000000000000000000000000000000000000..c554b93be42f008b15d721cbb9e11b40736e73f4 GIT binary patch literal 418 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2V6Od#Ih`sfGcHCp1-_1wh&K!jjEv4D7+D`gDNr9o9J_9~9*`;sfS3W% q2NZ#DS Date: Sat, 1 Oct 2022 09:55:05 +0300 Subject: [PATCH 03/15] Change tabs order --- applications/main/archive/helpers/archive_browser.h | 6 +++--- applications/main/archive/views/archive_browser_view.h | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/applications/main/archive/helpers/archive_browser.h b/applications/main/archive/helpers/archive_browser.h index e4cf1f944ca1..c77b54d553f5 100644 --- a/applications/main/archive/helpers/archive_browser.h +++ b/applications/main/archive/helpers/archive_browser.h @@ -16,8 +16,8 @@ static const char* tab_default_paths[] = { [ArchiveTabInfrared] = ANY_PATH("infrared"), [ArchiveTabBadUsb] = ANY_PATH("badusb"), [ArchiveTabU2f] = "/app:u2f", - [ArchiveTabBrowser] = STORAGE_ANY_PATH_PREFIX, [ArchiveTabApplications] = ANY_PATH("apps"), + [ArchiveTabBrowser] = STORAGE_ANY_PATH_PREFIX, }; static const char* known_ext[] = { @@ -28,10 +28,10 @@ static const char* known_ext[] = { [ArchiveFileTypeInfrared] = ".ir", [ArchiveFileTypeBadUsb] = ".txt", [ArchiveFileTypeU2f] = "?", + [ArchiveFileTypeApplication] = ".fap", [ArchiveFileTypeUpdateManifest] = ".fuf", [ArchiveFileTypeFolder] = "?", [ArchiveFileTypeUnknown] = "*", - [ArchiveFileTypeApplication] = ".fap", }; static const ArchiveFileTypeEnum known_type[] = { @@ -43,8 +43,8 @@ static const ArchiveFileTypeEnum known_type[] = { [ArchiveTabInfrared] = ArchiveFileTypeInfrared, [ArchiveTabBadUsb] = ArchiveFileTypeBadUsb, [ArchiveTabU2f] = ArchiveFileTypeU2f, - [ArchiveTabBrowser] = ArchiveFileTypeUnknown, [ArchiveTabApplications] = ArchiveFileTypeApplication, + [ArchiveTabBrowser] = ArchiveFileTypeUnknown, }; static inline ArchiveFileTypeEnum archive_get_tab_filetype(ArchiveTabEnum tab) { diff --git a/applications/main/archive/views/archive_browser_view.h b/applications/main/archive/views/archive_browser_view.h index 688fc22855c9..d20a5f81f286 100644 --- a/applications/main/archive/views/archive_browser_view.h +++ b/applications/main/archive/views/archive_browser_view.h @@ -26,8 +26,8 @@ typedef enum { ArchiveTabIButton, ArchiveTabBadUsb, ArchiveTabU2f, - ArchiveTabBrowser, ArchiveTabApplications, + ArchiveTabBrowser, ArchiveTabTotal, } ArchiveTabEnum; From 10016db991a7617f09c0e02cdea348dacf0112b9 Mon Sep 17 00:00:00 2001 From: DrunkBatya Date: Sat, 1 Oct 2022 17:02:47 +0300 Subject: [PATCH 04/15] Add first ugly implementation of in-app icons in archive browser --- .../main/archive/views/archive_browser_view.c | 38 ++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/applications/main/archive/views/archive_browser_view.c b/applications/main/archive/views/archive_browser_view.c index 436c5349a3d2..3d2cc9e1bf0e 100644 --- a/applications/main/archive/views/archive_browser_view.c +++ b/applications/main/archive/views/archive_browser_view.c @@ -4,6 +4,10 @@ #include "../archive_i.h" #include "archive_browser_view.h" #include "../helpers/archive_browser.h" +#include "../../fap_loader/elf_cpp/elf_hashtable.h" +#include + +#define CUSTOM_ICON_MAX_SIZE 32 static const char* ArchiveTabNames[] = { [ArchiveTabFavorites] = "Favorites", @@ -113,6 +117,27 @@ static void archive_draw_loading(Canvas* canvas, ArchiveBrowserViewModel* model) canvas_draw_icon(canvas, x, y, &A_Loading_24); } +static void get_fap_icon(string_t file_path, uint8_t* icon_ptr) { + Storage* storage = furi_record_open(RECORD_STORAGE); + FlipperApplication* app = flipper_application_alloc(storage, &hashtable_api_interface); + + FlipperApplicationPreloadStatus preload_res = + flipper_application_preload_manifest(app, string_get_cstr(file_path)); + if(preload_res == FlipperApplicationPreloadStatusSuccess) { + const FlipperApplicationManifest* manifest = flipper_application_get_manifest(app); + if(manifest->has_icon) { + memcpy(icon_ptr, manifest->icon, FAP_MANIFEST_MAX_ICON_SIZE); + } else { + // ? + } + } else { + // log error + } + + flipper_application_free(app); + furi_record_close(RECORD_STORAGE); +} + static void draw_list(Canvas* canvas, ArchiveBrowserViewModel* model) { furi_assert(model); @@ -126,10 +151,12 @@ static void draw_list(Canvas* canvas, ArchiveBrowserViewModel* model) { uint8_t x_offset = (model->move_fav && model->item_idx == idx) ? MOVE_OFFSET : 0; ArchiveFileTypeEnum file_type = ArchiveFileTypeLoading; + string_t file_path; if(archive_is_item_in_array(model, idx)) { ArchiveFile_t* file = files_array_get( model->files, CLAMP(idx - model->array_offset, (int32_t)(array_size - 1), 0)); + string_init_set(file_path, file->path); path_extract_filename(file->path, str_buf, archive_is_known_app(file->type)); file_type = file->type; } else { @@ -145,9 +172,18 @@ static void draw_list(Canvas* canvas, ArchiveBrowserViewModel* model) { canvas_set_color(canvas, ColorBlack); } - canvas_draw_icon(canvas, 2 + x_offset, 16 + i * FRAME_HEIGHT, ArchiveItemIcons[file_type]); + if(file_type == ArchiveFileTypeApplication) { + uint8_t* custom_icon_data = malloc(CUSTOM_ICON_MAX_SIZE); + get_fap_icon(file_path, custom_icon_data); + canvas_draw_bitmap( + canvas, 2 + x_offset, 16 + i * FRAME_HEIGHT, 10, 10, custom_icon_data); + free(custom_icon_data); + } else { + canvas_draw_icon(canvas, 2 + x_offset, 16 + i * FRAME_HEIGHT, ArchiveItemIcons[file_type]); + } canvas_draw_str(canvas, 15 + x_offset, 24 + i * FRAME_HEIGHT, string_get_cstr(str_buf)); + string_clear(file_path); string_clear(str_buf); } From baef364f67d703981eb20e4ed549cb91e235f452 Mon Sep 17 00:00:00 2001 From: DrunkBatya Date: Sat, 1 Oct 2022 17:34:47 +0300 Subject: [PATCH 05/15] fix code style --- applications/main/archive/views/archive_browser_view.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/applications/main/archive/views/archive_browser_view.c b/applications/main/archive/views/archive_browser_view.c index 3d2cc9e1bf0e..fea7c1c5ab0a 100644 --- a/applications/main/archive/views/archive_browser_view.c +++ b/applications/main/archive/views/archive_browser_view.c @@ -179,7 +179,8 @@ static void draw_list(Canvas* canvas, ArchiveBrowserViewModel* model) { canvas, 2 + x_offset, 16 + i * FRAME_HEIGHT, 10, 10, custom_icon_data); free(custom_icon_data); } else { - canvas_draw_icon(canvas, 2 + x_offset, 16 + i * FRAME_HEIGHT, ArchiveItemIcons[file_type]); + canvas_draw_icon( + canvas, 2 + x_offset, 16 + i * FRAME_HEIGHT, ArchiveItemIcons[file_type]); } canvas_draw_str(canvas, 15 + x_offset, 24 + i * FRAME_HEIGHT, string_get_cstr(str_buf)); From 5235c17060983d4d78b01c856870266a4659d03b Mon Sep 17 00:00:00 2001 From: DrunkBatya Date: Sun, 2 Oct 2022 10:28:19 +0300 Subject: [PATCH 06/15] Starting using FAPLoader callback --- .../main/archive/views/archive_browser_view.c | 39 +++++++------------ applications/main/fap_loader/fap_loader_app.c | 19 ++------- applications/main/fap_loader/fap_loader_app.h | 23 +++++++++++ 3 files changed, 41 insertions(+), 40 deletions(-) create mode 100644 applications/main/fap_loader/fap_loader_app.h diff --git a/applications/main/archive/views/archive_browser_view.c b/applications/main/archive/views/archive_browser_view.c index fea7c1c5ab0a..0efe240a5350 100644 --- a/applications/main/archive/views/archive_browser_view.c +++ b/applications/main/archive/views/archive_browser_view.c @@ -4,8 +4,7 @@ #include "../archive_i.h" #include "archive_browser_view.h" #include "../helpers/archive_browser.h" -#include "../../fap_loader/elf_cpp/elf_hashtable.h" -#include +#include "../../fap_loader/fap_loader_app.h" #define CUSTOM_ICON_MAX_SIZE 32 @@ -117,25 +116,18 @@ static void archive_draw_loading(Canvas* canvas, ArchiveBrowserViewModel* model) canvas_draw_icon(canvas, x, y, &A_Loading_24); } -static void get_fap_icon(string_t file_path, uint8_t* icon_ptr) { - Storage* storage = furi_record_open(RECORD_STORAGE); - FlipperApplication* app = flipper_application_alloc(storage, &hashtable_api_interface); - - FlipperApplicationPreloadStatus preload_res = - flipper_application_preload_manifest(app, string_get_cstr(file_path)); - if(preload_res == FlipperApplicationPreloadStatusSuccess) { - const FlipperApplicationManifest* manifest = flipper_application_get_manifest(app); - if(manifest->has_icon) { - memcpy(icon_ptr, manifest->icon, FAP_MANIFEST_MAX_ICON_SIZE); - } else { - // ? - } - } else { - // log error - } - - flipper_application_free(app); +static bool get_fap_icon(string_t file_path, uint8_t* icon_ptr) { + FapLoader* loader = malloc(sizeof(FapLoader)); + bool success = false; + string_t fap_name; + string_init(fap_name); + loader->storage = furi_record_open(RECORD_STORAGE); + if(fap_loader_item_callback(file_path, loader, &icon_ptr, fap_name)) + success = true; + string_clear(fap_name); furi_record_close(RECORD_STORAGE); + free(loader); + return success; } static void draw_list(Canvas* canvas, ArchiveBrowserViewModel* model) { @@ -143,6 +135,7 @@ static void draw_list(Canvas* canvas, ArchiveBrowserViewModel* model) { size_t array_size = files_array_size(model->files); bool scrollbar = model->item_cnt > 4; + uint8_t* custom_icon_data = malloc(CUSTOM_ICON_MAX_SIZE); for(uint32_t i = 0; i < MIN(model->item_cnt, MENU_ITEMS); ++i) { string_t str_buf; @@ -172,12 +165,9 @@ static void draw_list(Canvas* canvas, ArchiveBrowserViewModel* model) { canvas_set_color(canvas, ColorBlack); } - if(file_type == ArchiveFileTypeApplication) { - uint8_t* custom_icon_data = malloc(CUSTOM_ICON_MAX_SIZE); - get_fap_icon(file_path, custom_icon_data); + if(file_type == ArchiveFileTypeApplication && get_fap_icon(file_path, custom_icon_data)) { canvas_draw_bitmap( canvas, 2 + x_offset, 16 + i * FRAME_HEIGHT, 10, 10, custom_icon_data); - free(custom_icon_data); } else { canvas_draw_icon( canvas, 2 + x_offset, 16 + i * FRAME_HEIGHT, ArchiveItemIcons[file_type]); @@ -195,6 +185,7 @@ static void draw_list(Canvas* canvas, ArchiveBrowserViewModel* model) { if(model->menu) { render_item_menu(canvas, model); } + free(custom_icon_data); } static void archive_render_status_bar(Canvas* canvas, ArchiveBrowserViewModel* model) { diff --git a/applications/main/fap_loader/fap_loader_app.c b/applications/main/fap_loader/fap_loader_app.c index c0f60ceca98a..3cdae18e765e 100644 --- a/applications/main/fap_loader/fap_loader_app.c +++ b/applications/main/fap_loader/fap_loader_app.c @@ -4,24 +4,11 @@ #include #include #include +#include "fap_loader_app.h" #include "elf_cpp/elf_hashtable.h" #include -#define TAG "fap_loader_app" - -typedef struct { - FlipperApplication* app; - Storage* storage; - DialogsApp* dialogs; - Gui* gui; - string_t fap_path; - - ViewDispatcher* view_dispatcher; - Loading* loading; -} FapLoader; - -static bool - fap_loader_item_callback(string_t path, void* context, uint8_t** icon_ptr, string_t item_name) { +bool fap_loader_item_callback(string_t path, void* context, uint8_t** icon_ptr, string_t item_name) { FapLoader* loader = context; furi_assert(loader); @@ -176,4 +163,4 @@ int32_t fap_loader_app(void* p) { furi_record_close(RECORD_STORAGE); free(loader); return 0; -} \ No newline at end of file +} diff --git a/applications/main/fap_loader/fap_loader_app.h b/applications/main/fap_loader/fap_loader_app.h new file mode 100644 index 000000000000..bb7419639a16 --- /dev/null +++ b/applications/main/fap_loader/fap_loader_app.h @@ -0,0 +1,23 @@ +#ifndef FAP_LOADER_APP_H +#define FAP_LPADER_APP_H + +#include +#include +#include + +#define TAG "fap_loader_app" + +typedef struct { + FlipperApplication* app; + Storage* storage; + DialogsApp* dialogs; + Gui* gui; + string_t fap_path; + + ViewDispatcher* view_dispatcher; + Loading* loading; +} FapLoader; + +bool fap_loader_item_callback(string_t path, void* context, uint8_t** icon_ptr, string_t item_name); + +#endif // FAP_LPADER_APP_H From 414ef1f56d46d31abc5290107fef07eaf51a6369 Mon Sep 17 00:00:00 2001 From: DrunkBatya Date: Sun, 2 Oct 2022 10:29:07 +0300 Subject: [PATCH 07/15] fix code style --- applications/main/archive/views/archive_browser_view.c | 3 +-- applications/main/fap_loader/fap_loader_app.c | 3 --- applications/main/fap_loader/fap_loader_app.h | 2 +- 3 files changed, 2 insertions(+), 6 deletions(-) diff --git a/applications/main/archive/views/archive_browser_view.c b/applications/main/archive/views/archive_browser_view.c index 0efe240a5350..897e313ee80c 100644 --- a/applications/main/archive/views/archive_browser_view.c +++ b/applications/main/archive/views/archive_browser_view.c @@ -122,8 +122,7 @@ static bool get_fap_icon(string_t file_path, uint8_t* icon_ptr) { string_t fap_name; string_init(fap_name); loader->storage = furi_record_open(RECORD_STORAGE); - if(fap_loader_item_callback(file_path, loader, &icon_ptr, fap_name)) - success = true; + if(fap_loader_item_callback(file_path, loader, &icon_ptr, fap_name)) success = true; string_clear(fap_name); furi_record_close(RECORD_STORAGE); free(loader); diff --git a/applications/main/fap_loader/fap_loader_app.c b/applications/main/fap_loader/fap_loader_app.c index 3cdae18e765e..89a28b880a1e 100644 --- a/applications/main/fap_loader/fap_loader_app.c +++ b/applications/main/fap_loader/fap_loader_app.c @@ -1,12 +1,9 @@ #include #include #include -#include #include -#include #include "fap_loader_app.h" #include "elf_cpp/elf_hashtable.h" -#include bool fap_loader_item_callback(string_t path, void* context, uint8_t** icon_ptr, string_t item_name) { FapLoader* loader = context; diff --git a/applications/main/fap_loader/fap_loader_app.h b/applications/main/fap_loader/fap_loader_app.h index bb7419639a16..a484d26e63f0 100644 --- a/applications/main/fap_loader/fap_loader_app.h +++ b/applications/main/fap_loader/fap_loader_app.h @@ -20,4 +20,4 @@ typedef struct { bool fap_loader_item_callback(string_t path, void* context, uint8_t** icon_ptr, string_t item_name); -#endif // FAP_LPADER_APP_H +#endif // FAP_LPADER_APP_H From acbbf99e39b765d07b18b1e717fddc9061b6340a Mon Sep 17 00:00:00 2001 From: DrunkBatya Date: Sun, 2 Oct 2022 11:16:36 +0300 Subject: [PATCH 08/15] add comment --- applications/main/archive/views/archive_browser_view.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/applications/main/archive/views/archive_browser_view.c b/applications/main/archive/views/archive_browser_view.c index 897e313ee80c..a82da44047f4 100644 --- a/applications/main/archive/views/archive_browser_view.c +++ b/applications/main/archive/views/archive_browser_view.c @@ -118,10 +118,10 @@ static void archive_draw_loading(Canvas* canvas, ArchiveBrowserViewModel* model) static bool get_fap_icon(string_t file_path, uint8_t* icon_ptr) { FapLoader* loader = malloc(sizeof(FapLoader)); + loader->storage = furi_record_open(RECORD_STORAGE); bool success = false; - string_t fap_name; + string_t fap_name; // unused, just for fap_loader_item_callback string_init(fap_name); - loader->storage = furi_record_open(RECORD_STORAGE); if(fap_loader_item_callback(file_path, loader, &icon_ptr, fap_name)) success = true; string_clear(fap_name); furi_record_close(RECORD_STORAGE); From e2dae24e6fbadf75eae566720c657f30be0c2fed Mon Sep 17 00:00:00 2001 From: DrunkBatya Date: Sun, 2 Oct 2022 11:34:26 +0300 Subject: [PATCH 09/15] Getting all metafata from fap --- .../main/archive/views/archive_browser_view.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/applications/main/archive/views/archive_browser_view.c b/applications/main/archive/views/archive_browser_view.c index a82da44047f4..bb9325b2a8bc 100644 --- a/applications/main/archive/views/archive_browser_view.c +++ b/applications/main/archive/views/archive_browser_view.c @@ -116,14 +116,11 @@ static void archive_draw_loading(Canvas* canvas, ArchiveBrowserViewModel* model) canvas_draw_icon(canvas, x, y, &A_Loading_24); } -static bool get_fap_icon(string_t file_path, uint8_t* icon_ptr) { +static bool get_fap_meta(string_t file_path, string_t fap_name, uint8_t* icon_ptr) { FapLoader* loader = malloc(sizeof(FapLoader)); loader->storage = furi_record_open(RECORD_STORAGE); bool success = false; - string_t fap_name; // unused, just for fap_loader_item_callback - string_init(fap_name); if(fap_loader_item_callback(file_path, loader, &icon_ptr, fap_name)) success = true; - string_clear(fap_name); furi_record_close(RECORD_STORAGE); free(loader); return success; @@ -149,8 +146,9 @@ static void draw_list(Canvas* canvas, ArchiveBrowserViewModel* model) { ArchiveFile_t* file = files_array_get( model->files, CLAMP(idx - model->array_offset, (int32_t)(array_size - 1), 0)); string_init_set(file_path, file->path); - path_extract_filename(file->path, str_buf, archive_is_known_app(file->type)); file_type = file->type; + if(file_type != ArchiveFileTypeApplication) + path_extract_filename(file->path, str_buf, archive_is_known_app(file->type)); } else { string_set_str(str_buf, "---"); } @@ -164,7 +162,8 @@ static void draw_list(Canvas* canvas, ArchiveBrowserViewModel* model) { canvas_set_color(canvas, ColorBlack); } - if(file_type == ArchiveFileTypeApplication && get_fap_icon(file_path, custom_icon_data)) { + if(file_type == ArchiveFileTypeApplication && + get_fap_meta(file_path, str_buf, custom_icon_data)) { canvas_draw_bitmap( canvas, 2 + x_offset, 16 + i * FRAME_HEIGHT, 10, 10, custom_icon_data); } else { From 17c45efcb1b8b70d0f19950b908e3e85bceb02d5 Mon Sep 17 00:00:00 2001 From: DrunkBatya Date: Sun, 2 Oct 2022 13:24:57 +0300 Subject: [PATCH 10/15] add app filename fallback --- applications/main/archive/views/archive_browser_view.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/applications/main/archive/views/archive_browser_view.c b/applications/main/archive/views/archive_browser_view.c index bb9325b2a8bc..4a3ca3e3ec14 100644 --- a/applications/main/archive/views/archive_browser_view.c +++ b/applications/main/archive/views/archive_browser_view.c @@ -165,7 +165,9 @@ static void draw_list(Canvas* canvas, ArchiveBrowserViewModel* model) { if(file_type == ArchiveFileTypeApplication && get_fap_meta(file_path, str_buf, custom_icon_data)) { canvas_draw_bitmap( - canvas, 2 + x_offset, 16 + i * FRAME_HEIGHT, 10, 10, custom_icon_data); + canvas, 2 + x_offset, 16 + i * FRAME_HEIGHT, 11, 10, custom_icon_data); + } else if(file_type == ArchiveFileTypeApplication) { + path_extract_filename(file_path, str_buf, archive_is_known_app(file_type)); } else { canvas_draw_icon( canvas, 2 + x_offset, 16 + i * FRAME_HEIGHT, ArchiveItemIcons[file_type]); From fbef92f926fe81d4e217a530dc2124f3a62bfe81 Mon Sep 17 00:00:00 2001 From: DrunkBatya Date: Tue, 4 Oct 2022 10:56:56 +0300 Subject: [PATCH 11/15] using fap_loader_item_callback in archive_list_item_cb --- .../main/archive/helpers/archive_browser.c | 20 ++++++++++ .../main/archive/helpers/archive_files.h | 37 +++++++++++++++--- .../main/archive/views/archive_browser_view.c | 35 ++++++----------- applications/main/fap_loader/fap_loader_app.c | 2 +- assets/icons/Archive/plugin_10px.png | Bin 418 -> 0 bytes firmware/targets/f7/api_symbols.csv | 3 +- 6 files changed, 66 insertions(+), 31 deletions(-) delete mode 100644 assets/icons/Archive/plugin_10px.png diff --git a/applications/main/archive/helpers/archive_browser.c b/applications/main/archive/helpers/archive_browser.c index 00bb6b06331f..81d0ae3f0fcf 100644 --- a/applications/main/archive/helpers/archive_browser.c +++ b/applications/main/archive/helpers/archive_browser.c @@ -5,6 +5,7 @@ #include #include #include "gui/modules/file_browser_worker.h" +#include "../../fap_loader/fap_loader_app.h" #include "m-string.h" #include @@ -351,15 +352,34 @@ void archive_add_app_item(ArchiveBrowserView* browser, const char* name) { ArchiveFile_t_clear(&item); } +static bool archive_get_fap_meta(string_t file_path, string_t fap_name, uint8_t** icon_ptr) { + FapLoader* loader = malloc(sizeof(FapLoader)); + loader->storage = furi_record_open(RECORD_STORAGE); + bool success = false; + if(fap_loader_item_callback(file_path, loader, icon_ptr, fap_name)) success = true; + furi_record_close(RECORD_STORAGE); + free(loader); + return success; +} + void archive_add_file_item(ArchiveBrowserView* browser, bool is_folder, const char* name) { furi_assert(browser); furi_assert(name); ArchiveFile_t item; + item.custom_icon_data = NULL; ArchiveFile_t_init(&item); string_init_set_str(item.path, name); + string_init(item.display_name); archive_set_file_type(&item, string_get_cstr(browser->path), is_folder, false); + if(item.type == ArchiveFileTypeApplication) { + item.custom_icon_data = malloc(CUSTOM_ICON_MAX_SIZE); + if(!archive_get_fap_meta(item.path, item.display_name, &item.custom_icon_data)) { + free(item.custom_icon_data); + item.custom_icon_data = NULL; + } + } with_view_model( browser->view, (ArchiveBrowserViewModel * model) { diff --git a/applications/main/archive/helpers/archive_files.h b/applications/main/archive/helpers/archive_files.h index 7cf7fd41f033..1733f2b43599 100644 --- a/applications/main/archive/helpers/archive_files.h +++ b/applications/main/archive/helpers/archive_files.h @@ -4,6 +4,8 @@ #include #include +#define CUSTOM_ICON_MAX_SIZE 32 + typedef enum { ArchiveFileTypeIButton, ArchiveFileTypeNFC, @@ -22,33 +24,56 @@ typedef enum { typedef struct { string_t path; ArchiveFileTypeEnum type; + uint8_t* custom_icon_data; + string_t display_name; bool fav; bool is_app; } ArchiveFile_t; static void ArchiveFile_t_init(ArchiveFile_t* obj) { + string_init(obj->path); obj->type = ArchiveFileTypeUnknown; - obj->is_app = false; + obj->custom_icon_data = NULL; + string_init(obj->display_name); obj->fav = false; - string_init(obj->path); + obj->is_app = false; } static void ArchiveFile_t_init_set(ArchiveFile_t* obj, const ArchiveFile_t* src) { + string_init_set(obj->path, src->path); obj->type = src->type; - obj->is_app = src->is_app; + if(src->custom_icon_data) { + obj->custom_icon_data = malloc(CUSTOM_ICON_MAX_SIZE); + memcpy(obj->custom_icon_data, src->custom_icon_data, CUSTOM_ICON_MAX_SIZE); + } else { + obj->custom_icon_data = NULL; + } + string_init_set(obj->display_name, src->display_name); obj->fav = src->fav; - string_init_set(obj->path, src->path); + obj->is_app = src->is_app; } static void ArchiveFile_t_set(ArchiveFile_t* obj, const ArchiveFile_t* src) { + string_set(obj->path, src->path); obj->type = src->type; - obj->is_app = src->is_app; + if(src->custom_icon_data) { + obj->custom_icon_data = malloc(CUSTOM_ICON_MAX_SIZE); + memcpy(obj->custom_icon_data, src->custom_icon_data, CUSTOM_ICON_MAX_SIZE); + } else { + obj->custom_icon_data = NULL; + } + string_set(obj->display_name, src->display_name); obj->fav = src->fav; - string_set(obj->path, src->path); + obj->is_app = src->is_app; } static void ArchiveFile_t_clear(ArchiveFile_t* obj) { string_clear(obj->path); + if(obj->custom_icon_data) { + free(obj->custom_icon_data); + obj->custom_icon_data = NULL; + } + string_clear(obj->display_name); } ARRAY_DEF( diff --git a/applications/main/archive/views/archive_browser_view.c b/applications/main/archive/views/archive_browser_view.c index 4a3ca3e3ec14..02722a539412 100644 --- a/applications/main/archive/views/archive_browser_view.c +++ b/applications/main/archive/views/archive_browser_view.c @@ -4,9 +4,6 @@ #include "../archive_i.h" #include "archive_browser_view.h" #include "../helpers/archive_browser.h" -#include "../../fap_loader/fap_loader_app.h" - -#define CUSTOM_ICON_MAX_SIZE 32 static const char* ArchiveTabNames[] = { [ArchiveTabFavorites] = "Favorites", @@ -33,7 +30,7 @@ static const Icon* ArchiveItemIcons[] = { [ArchiveFileTypeFolder] = &I_dir_10px, [ArchiveFileTypeUnknown] = &I_unknown_10px, [ArchiveFileTypeLoading] = &I_loading_10px, - [ArchiveFileTypeApplication] = &I_plugin_10px, + [ArchiveFileTypeApplication] = &I_unknown_10px, }; void archive_browser_set_callback( @@ -116,16 +113,6 @@ static void archive_draw_loading(Canvas* canvas, ArchiveBrowserViewModel* model) canvas_draw_icon(canvas, x, y, &A_Loading_24); } -static bool get_fap_meta(string_t file_path, string_t fap_name, uint8_t* icon_ptr) { - FapLoader* loader = malloc(sizeof(FapLoader)); - loader->storage = furi_record_open(RECORD_STORAGE); - bool success = false; - if(fap_loader_item_callback(file_path, loader, &icon_ptr, fap_name)) success = true; - furi_record_close(RECORD_STORAGE); - free(loader); - return success; -} - static void draw_list(Canvas* canvas, ArchiveBrowserViewModel* model) { furi_assert(model); @@ -140,15 +127,23 @@ static void draw_list(Canvas* canvas, ArchiveBrowserViewModel* model) { uint8_t x_offset = (model->move_fav && model->item_idx == idx) ? MOVE_OFFSET : 0; ArchiveFileTypeEnum file_type = ArchiveFileTypeLoading; - string_t file_path; + uint8_t* custom_icon_data = NULL; if(archive_is_item_in_array(model, idx)) { ArchiveFile_t* file = files_array_get( model->files, CLAMP(idx - model->array_offset, (int32_t)(array_size - 1), 0)); - string_init_set(file_path, file->path); file_type = file->type; - if(file_type != ArchiveFileTypeApplication) + if(file_type == ArchiveFileTypeApplication) { + if(file->custom_icon_data) { + custom_icon_data = file->custom_icon_data; + string_set(str_buf, file->display_name); + } else { + file_type = ArchiveFileTypeUnknown; + path_extract_filename(file->path, str_buf, archive_is_known_app(file->type)); + } + } else { path_extract_filename(file->path, str_buf, archive_is_known_app(file->type)); + } } else { string_set_str(str_buf, "---"); } @@ -162,19 +157,15 @@ static void draw_list(Canvas* canvas, ArchiveBrowserViewModel* model) { canvas_set_color(canvas, ColorBlack); } - if(file_type == ArchiveFileTypeApplication && - get_fap_meta(file_path, str_buf, custom_icon_data)) { + if(custom_icon_data) { canvas_draw_bitmap( canvas, 2 + x_offset, 16 + i * FRAME_HEIGHT, 11, 10, custom_icon_data); - } else if(file_type == ArchiveFileTypeApplication) { - path_extract_filename(file_path, str_buf, archive_is_known_app(file_type)); } else { canvas_draw_icon( canvas, 2 + x_offset, 16 + i * FRAME_HEIGHT, ArchiveItemIcons[file_type]); } canvas_draw_str(canvas, 15 + x_offset, 24 + i * FRAME_HEIGHT, string_get_cstr(str_buf)); - string_clear(file_path); string_clear(str_buf); } diff --git a/applications/main/fap_loader/fap_loader_app.c b/applications/main/fap_loader/fap_loader_app.c index 89a28b880a1e..7dfbc017ef9e 100644 --- a/applications/main/fap_loader/fap_loader_app.c +++ b/applications/main/fap_loader/fap_loader_app.c @@ -115,7 +115,7 @@ static bool fap_loader_select_app(FapLoader* loader) { const DialogsFileBrowserOptions browser_options = { .extension = ".fap", .skip_assets = true, - .icon = &I_badusb_10px, + .icon = &I_unknown_10px, .hide_ext = true, .item_loader_callback = fap_loader_item_callback, .item_loader_context = loader, diff --git a/assets/icons/Archive/plugin_10px.png b/assets/icons/Archive/plugin_10px.png deleted file mode 100644 index c554b93be42f008b15d721cbb9e11b40736e73f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 418 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2V6Od#Ih`sfGcHCp1-_1wh&K!jjEv4D7+D`gDNr9o9J_9~9*`;sfS3W% q2NZ#DS Date: Tue, 4 Oct 2022 13:42:15 +0300 Subject: [PATCH 12/15] fixes --- .../main/archive/helpers/archive_browser.c | 19 +++---- .../main/archive/helpers/archive_files.h | 20 +++---- .../main/archive/views/archive_browser_view.c | 4 +- applications/main/fap_loader/fap_loader_app.c | 56 ++++++++++++++----- applications/main/fap_loader/fap_loader_app.h | 21 ++----- 5 files changed, 65 insertions(+), 55 deletions(-) diff --git a/applications/main/archive/helpers/archive_browser.c b/applications/main/archive/helpers/archive_browser.c index 81d0ae3f0fcf..acd4201c8448 100644 --- a/applications/main/archive/helpers/archive_browser.c +++ b/applications/main/archive/helpers/archive_browser.c @@ -5,7 +5,7 @@ #include #include #include "gui/modules/file_browser_worker.h" -#include "../../fap_loader/fap_loader_app.h" +#include #include "m-string.h" #include @@ -353,12 +353,10 @@ void archive_add_app_item(ArchiveBrowserView* browser, const char* name) { } static bool archive_get_fap_meta(string_t file_path, string_t fap_name, uint8_t** icon_ptr) { - FapLoader* loader = malloc(sizeof(FapLoader)); - loader->storage = furi_record_open(RECORD_STORAGE); + FapLoader* loader = fap_loader_alloc_minimal(); bool success = false; if(fap_loader_item_callback(file_path, loader, icon_ptr, fap_name)) success = true; - furi_record_close(RECORD_STORAGE); - free(loader); + fap_loader_free_minimal(loader); return success; } @@ -367,20 +365,17 @@ void archive_add_file_item(ArchiveBrowserView* browser, bool is_folder, const ch furi_assert(name); ArchiveFile_t item; - item.custom_icon_data = NULL; - ArchiveFile_t_init(&item); - string_init_set_str(item.path, name); - string_init(item.display_name); + + string_set_str(item.path, name); archive_set_file_type(&item, string_get_cstr(browser->path), is_folder, false); if(item.type == ArchiveFileTypeApplication) { - item.custom_icon_data = malloc(CUSTOM_ICON_MAX_SIZE); - if(!archive_get_fap_meta(item.path, item.display_name, &item.custom_icon_data)) { + item.custom_icon_data = malloc(FAP_MANIFEST_MAX_ICON_SIZE); + if(!archive_get_fap_meta(item.path, item.custom_name, &item.custom_icon_data)) { free(item.custom_icon_data); item.custom_icon_data = NULL; } } - with_view_model( browser->view, (ArchiveBrowserViewModel * model) { files_array_push_back(model->files, item); diff --git a/applications/main/archive/helpers/archive_files.h b/applications/main/archive/helpers/archive_files.h index 1733f2b43599..6d829521e8bb 100644 --- a/applications/main/archive/helpers/archive_files.h +++ b/applications/main/archive/helpers/archive_files.h @@ -4,7 +4,7 @@ #include #include -#define CUSTOM_ICON_MAX_SIZE 32 +#define FAP_MANIFEST_MAX_ICON_SIZE 32 typedef enum { ArchiveFileTypeIButton, @@ -25,7 +25,7 @@ typedef struct { string_t path; ArchiveFileTypeEnum type; uint8_t* custom_icon_data; - string_t display_name; + string_t custom_name; bool fav; bool is_app; } ArchiveFile_t; @@ -34,7 +34,7 @@ static void ArchiveFile_t_init(ArchiveFile_t* obj) { string_init(obj->path); obj->type = ArchiveFileTypeUnknown; obj->custom_icon_data = NULL; - string_init(obj->display_name); + string_init(obj->custom_name); obj->fav = false; obj->is_app = false; } @@ -43,12 +43,12 @@ static void ArchiveFile_t_init_set(ArchiveFile_t* obj, const ArchiveFile_t* src) string_init_set(obj->path, src->path); obj->type = src->type; if(src->custom_icon_data) { - obj->custom_icon_data = malloc(CUSTOM_ICON_MAX_SIZE); - memcpy(obj->custom_icon_data, src->custom_icon_data, CUSTOM_ICON_MAX_SIZE); + obj->custom_icon_data = malloc(FAP_MANIFEST_MAX_ICON_SIZE); + memcpy(obj->custom_icon_data, src->custom_icon_data, FAP_MANIFEST_MAX_ICON_SIZE); } else { obj->custom_icon_data = NULL; } - string_init_set(obj->display_name, src->display_name); + string_init_set(obj->custom_name, src->custom_name); obj->fav = src->fav; obj->is_app = src->is_app; } @@ -57,12 +57,12 @@ static void ArchiveFile_t_set(ArchiveFile_t* obj, const ArchiveFile_t* src) { string_set(obj->path, src->path); obj->type = src->type; if(src->custom_icon_data) { - obj->custom_icon_data = malloc(CUSTOM_ICON_MAX_SIZE); - memcpy(obj->custom_icon_data, src->custom_icon_data, CUSTOM_ICON_MAX_SIZE); + obj->custom_icon_data = malloc(FAP_MANIFEST_MAX_ICON_SIZE); + memcpy(obj->custom_icon_data, src->custom_icon_data, FAP_MANIFEST_MAX_ICON_SIZE); } else { obj->custom_icon_data = NULL; } - string_set(obj->display_name, src->display_name); + string_set(obj->custom_name, src->custom_name); obj->fav = src->fav; obj->is_app = src->is_app; } @@ -73,7 +73,7 @@ static void ArchiveFile_t_clear(ArchiveFile_t* obj) { free(obj->custom_icon_data); obj->custom_icon_data = NULL; } - string_clear(obj->display_name); + string_clear(obj->custom_name); } ARRAY_DEF( diff --git a/applications/main/archive/views/archive_browser_view.c b/applications/main/archive/views/archive_browser_view.c index 02722a539412..1627c28cfe30 100644 --- a/applications/main/archive/views/archive_browser_view.c +++ b/applications/main/archive/views/archive_browser_view.c @@ -118,7 +118,7 @@ static void draw_list(Canvas* canvas, ArchiveBrowserViewModel* model) { size_t array_size = files_array_size(model->files); bool scrollbar = model->item_cnt > 4; - uint8_t* custom_icon_data = malloc(CUSTOM_ICON_MAX_SIZE); + uint8_t* custom_icon_data = malloc(FAP_MANIFEST_MAX_ICON_SIZE); for(uint32_t i = 0; i < MIN(model->item_cnt, MENU_ITEMS); ++i) { string_t str_buf; @@ -136,7 +136,7 @@ static void draw_list(Canvas* canvas, ArchiveBrowserViewModel* model) { if(file_type == ArchiveFileTypeApplication) { if(file->custom_icon_data) { custom_icon_data = file->custom_icon_data; - string_set(str_buf, file->display_name); + string_set(str_buf, file->custom_name); } else { file_type = ArchiveFileTypeUnknown; path_extract_filename(file->path, str_buf, archive_is_known_app(file->type)); diff --git a/applications/main/fap_loader/fap_loader_app.c b/applications/main/fap_loader/fap_loader_app.c index 7dfbc017ef9e..1e54120a0424 100644 --- a/applications/main/fap_loader/fap_loader_app.c +++ b/applications/main/fap_loader/fap_loader_app.c @@ -2,8 +2,23 @@ #include #include #include -#include "fap_loader_app.h" +#include +#include +#include #include "elf_cpp/elf_hashtable.h" +#include "fap_loader_app.h" + +#define TAG "fap_loader_app" + +struct FapLoader { + FlipperApplication* app; + Storage* storage; + DialogsApp* dialogs; + Gui* gui; + string_t fap_path; + ViewDispatcher* view_dispatcher; + Loading* loading; +}; bool fap_loader_item_callback(string_t path, void* context, uint8_t** icon_ptr, string_t item_name) { FapLoader* loader = context; @@ -125,19 +140,41 @@ static bool fap_loader_select_app(FapLoader* loader) { loader->dialogs, loader->fap_path, loader->fap_path, &browser_options); } -int32_t fap_loader_app(void* p) { +FapLoader* fap_loader_alloc_minimal() { FapLoader* loader = malloc(sizeof(FapLoader)); loader->storage = furi_record_open(RECORD_STORAGE); + return loader; +} + +static FapLoader* fap_loader_alloc_full() { + FapLoader* loader = fap_loader_alloc_minimal(); loader->dialogs = furi_record_open(RECORD_DIALOGS); loader->gui = furi_record_open(RECORD_GUI); - loader->view_dispatcher = view_dispatcher_alloc(); loader->loading = loading_alloc(); - view_dispatcher_attach_to_gui( loader->view_dispatcher, loader->gui, ViewDispatcherTypeFullscreen); view_dispatcher_add_view(loader->view_dispatcher, 0, loading_get_view(loader->loading)); + return loader; +} + +void fap_loader_free_minimal(FapLoader* loader) { + furi_record_close(RECORD_STORAGE); + free(loader); +} +static void fap_loader_free_full(FapLoader* loader) { + view_dispatcher_remove_view(loader->view_dispatcher, 0); + loading_free(loader->loading); + view_dispatcher_free(loader->view_dispatcher); + string_clear(loader->fap_path); + furi_record_close(RECORD_GUI); + furi_record_close(RECORD_DIALOGS); + fap_loader_free_minimal(loader); +} + +int32_t fap_loader_app(void* p) { + FapLoader* loader = fap_loader_alloc_full(); if(p) { string_init_set(loader->fap_path, (const char*)p); fap_loader_run_selected_app(loader); @@ -149,15 +186,6 @@ int32_t fap_loader_app(void* p) { fap_loader_run_selected_app(loader); }; } - - view_dispatcher_remove_view(loader->view_dispatcher, 0); - loading_free(loader->loading); - view_dispatcher_free(loader->view_dispatcher); - - string_clear(loader->fap_path); - furi_record_close(RECORD_GUI); - furi_record_close(RECORD_DIALOGS); - furi_record_close(RECORD_STORAGE); - free(loader); + fap_loader_free_full(loader); return 0; } diff --git a/applications/main/fap_loader/fap_loader_app.h b/applications/main/fap_loader/fap_loader_app.h index a484d26e63f0..a9b050754646 100644 --- a/applications/main/fap_loader/fap_loader_app.h +++ b/applications/main/fap_loader/fap_loader_app.h @@ -1,23 +1,10 @@ #ifndef FAP_LOADER_APP_H #define FAP_LPADER_APP_H -#include -#include -#include - -#define TAG "fap_loader_app" - -typedef struct { - FlipperApplication* app; - Storage* storage; - DialogsApp* dialogs; - Gui* gui; - string_t fap_path; - - ViewDispatcher* view_dispatcher; - Loading* loading; -} FapLoader; +typedef struct FapLoader FapLoader; bool fap_loader_item_callback(string_t path, void* context, uint8_t** icon_ptr, string_t item_name); +FapLoader* fap_loader_alloc_minimal(); +void fap_loader_free_minimal(FapLoader* loader); -#endif // FAP_LPADER_APP_H +#endif // FAP_LOADER_APP_H From 21443ba4a677dbca3087c0b7923db31de5fbeb6e Mon Sep 17 00:00:00 2001 From: SG Date: Thu, 6 Oct 2022 16:43:45 +1000 Subject: [PATCH 13/15] FAP-Loader: removed minimal allocation --- .../main/archive/helpers/archive_browser.c | 8 +++-- applications/main/fap_loader/fap_loader_app.c | 33 ++++++++++--------- applications/main/fap_loader/fap_loader_app.h | 29 ++++++++++++---- 3 files changed, 45 insertions(+), 25 deletions(-) diff --git a/applications/main/archive/helpers/archive_browser.c b/applications/main/archive/helpers/archive_browser.c index acd4201c8448..0cd33b289f18 100644 --- a/applications/main/archive/helpers/archive_browser.c +++ b/applications/main/archive/helpers/archive_browser.c @@ -353,10 +353,12 @@ void archive_add_app_item(ArchiveBrowserView* browser, const char* name) { } static bool archive_get_fap_meta(string_t file_path, string_t fap_name, uint8_t** icon_ptr) { - FapLoader* loader = fap_loader_alloc_minimal(); + Storage* storage = furi_record_open(RECORD_STORAGE); bool success = false; - if(fap_loader_item_callback(file_path, loader, icon_ptr, fap_name)) success = true; - fap_loader_free_minimal(loader); + if(fap_loader_load_name_and_icon(file_path, storage, icon_ptr, fap_name)) { + success = true; + } + furi_record_close(RECORD_STORAGE); return success; } diff --git a/applications/main/fap_loader/fap_loader_app.c b/applications/main/fap_loader/fap_loader_app.c index 1e54120a0424..e4315cb08491 100644 --- a/applications/main/fap_loader/fap_loader_app.c +++ b/applications/main/fap_loader/fap_loader_app.c @@ -20,11 +20,14 @@ struct FapLoader { Loading* loading; }; -bool fap_loader_item_callback(string_t path, void* context, uint8_t** icon_ptr, string_t item_name) { - FapLoader* loader = context; - furi_assert(loader); +bool fap_loader_load_name_and_icon( + string_t path, + Storage* storage, + uint8_t** icon_ptr, + string_t item_name) { + furi_assert(storage); - FlipperApplication* app = flipper_application_alloc(loader->storage, &hashtable_api_interface); + FlipperApplication* app = flipper_application_alloc(storage, &hashtable_api_interface); FlipperApplicationPreloadStatus preload_res = flipper_application_preload_manifest(app, string_get_cstr(path)); @@ -47,6 +50,13 @@ bool fap_loader_item_callback(string_t path, void* context, uint8_t** icon_ptr, return load_success; } +static bool + fap_loader_item_callback(string_t path, void* context, uint8_t** icon_ptr, string_t item_name) { + FapLoader* fap_loader = context; + furi_assert(fap_loader); + return fap_loader_load_name_and_icon(path, fap_loader->storage, icon_ptr, item_name); +} + static bool fap_loader_run_selected_app(FapLoader* loader) { furi_assert(loader); @@ -140,14 +150,9 @@ static bool fap_loader_select_app(FapLoader* loader) { loader->dialogs, loader->fap_path, loader->fap_path, &browser_options); } -FapLoader* fap_loader_alloc_minimal() { +static FapLoader* fap_loader_alloc_full() { FapLoader* loader = malloc(sizeof(FapLoader)); loader->storage = furi_record_open(RECORD_STORAGE); - return loader; -} - -static FapLoader* fap_loader_alloc_full() { - FapLoader* loader = fap_loader_alloc_minimal(); loader->dialogs = furi_record_open(RECORD_DIALOGS); loader->gui = furi_record_open(RECORD_GUI); loader->view_dispatcher = view_dispatcher_alloc(); @@ -158,11 +163,6 @@ static FapLoader* fap_loader_alloc_full() { return loader; } -void fap_loader_free_minimal(FapLoader* loader) { - furi_record_close(RECORD_STORAGE); - free(loader); -} - static void fap_loader_free_full(FapLoader* loader) { view_dispatcher_remove_view(loader->view_dispatcher, 0); loading_free(loader->loading); @@ -170,7 +170,8 @@ static void fap_loader_free_full(FapLoader* loader) { string_clear(loader->fap_path); furi_record_close(RECORD_GUI); furi_record_close(RECORD_DIALOGS); - fap_loader_free_minimal(loader); + furi_record_close(RECORD_STORAGE); + free(loader); } int32_t fap_loader_app(void* p) { diff --git a/applications/main/fap_loader/fap_loader_app.h b/applications/main/fap_loader/fap_loader_app.h index a9b050754646..4f3f0ba24954 100644 --- a/applications/main/fap_loader/fap_loader_app.h +++ b/applications/main/fap_loader/fap_loader_app.h @@ -1,10 +1,27 @@ -#ifndef FAP_LOADER_APP_H -#define FAP_LPADER_APP_H +#pragma once +#include + +#ifdef __cplusplus +extern "C" { +#endif typedef struct FapLoader FapLoader; -bool fap_loader_item_callback(string_t path, void* context, uint8_t** icon_ptr, string_t item_name); -FapLoader* fap_loader_alloc_minimal(); -void fap_loader_free_minimal(FapLoader* loader); +/** + * @brief Load name and icon from FAP file. + * + * @param path Path to FAP file. + * @param storage Storage instance. + * @param icon_ptr Icon pointer. + * @param item_name Application name. + * @return true if icon and name were loaded successfully. + */ +bool fap_loader_load_name_and_icon( + string_t path, + Storage* storage, + uint8_t** icon_ptr, + string_t item_name); -#endif // FAP_LOADER_APP_H +#ifdef __cplusplus +} +#endif \ No newline at end of file From db698ef4c27551afdf8bdebb95d2097995ed3af9 Mon Sep 17 00:00:00 2001 From: SG Date: Thu, 6 Oct 2022 16:56:13 +1000 Subject: [PATCH 14/15] Merge fixes --- applications/main/archive/helpers/archive_browser.c | 2 +- applications/main/archive/helpers/archive_files.h | 4 ++-- applications/main/archive/views/archive_browser_view.c | 2 +- applications/main/fap_loader/fap_loader_app.c | 4 ++-- applications/main/fap_loader/fap_loader_app.h | 4 ++-- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/applications/main/archive/helpers/archive_browser.c b/applications/main/archive/helpers/archive_browser.c index be7c3129dea5..f66030706f4d 100644 --- a/applications/main/archive/helpers/archive_browser.c +++ b/applications/main/archive/helpers/archive_browser.c @@ -352,7 +352,7 @@ void archive_add_app_item(ArchiveBrowserView* browser, const char* name) { ArchiveFile_t_clear(&item); } -static bool archive_get_fap_meta(string_t file_path, string_t fap_name, uint8_t** icon_ptr) { +static bool archive_get_fap_meta(FuriString* file_path, FuriString* fap_name, uint8_t** icon_ptr) { Storage* storage = furi_record_open(RECORD_STORAGE); bool success = false; if(fap_loader_load_name_and_icon(file_path, storage, icon_ptr, fap_name)) { diff --git a/applications/main/archive/helpers/archive_files.h b/applications/main/archive/helpers/archive_files.h index 8e1d76d7d406..2017a9574f96 100644 --- a/applications/main/archive/helpers/archive_files.h +++ b/applications/main/archive/helpers/archive_files.h @@ -40,7 +40,7 @@ static void ArchiveFile_t_init(ArchiveFile_t* obj) { } static void ArchiveFile_t_init_set(ArchiveFile_t* obj, const ArchiveFile_t* src) { - furi_string_init_set(obj->path, src->path); + obj->path = furi_string_alloc_set(src->path); obj->type = src->type; if(src->custom_icon_data) { obj->custom_icon_data = malloc(FAP_MANIFEST_MAX_ICON_SIZE); @@ -48,7 +48,7 @@ static void ArchiveFile_t_init_set(ArchiveFile_t* obj, const ArchiveFile_t* src) } else { obj->custom_icon_data = NULL; } - furi_string_init_set(obj->custom_name, src->custom_name); + obj->custom_name = furi_string_alloc_set(src->custom_name); obj->fav = src->fav; obj->is_app = src->is_app; } diff --git a/applications/main/archive/views/archive_browser_view.c b/applications/main/archive/views/archive_browser_view.c index 8dee886f427a..bc2700a67afc 100644 --- a/applications/main/archive/views/archive_browser_view.c +++ b/applications/main/archive/views/archive_browser_view.c @@ -136,7 +136,7 @@ static void draw_list(Canvas* canvas, ArchiveBrowserViewModel* model) { if(file_type == ArchiveFileTypeApplication) { if(file->custom_icon_data) { custom_icon_data = file->custom_icon_data; - string_set(str_buf, file->custom_name); + furi_string_set(str_buf, file->custom_name); } else { file_type = ArchiveFileTypeUnknown; path_extract_filename(file->path, str_buf, archive_is_known_app(file->type)); diff --git a/applications/main/fap_loader/fap_loader_app.c b/applications/main/fap_loader/fap_loader_app.c index d3da36faa6c0..fb0a300e7908 100644 --- a/applications/main/fap_loader/fap_loader_app.c +++ b/applications/main/fap_loader/fap_loader_app.c @@ -20,7 +20,7 @@ struct FapLoader { Loading* loading; }; -static bool fap_loader_load_name_and_icon( +bool fap_loader_load_name_and_icon( FuriString* path, Storage* storage, uint8_t** icon_ptr, @@ -52,7 +52,7 @@ static bool fap_loader_item_callback( FuriString* path, void* context, uint8_t** icon_ptr, - string_t item_name) { + FuriString* item_name) { FapLoader* fap_loader = context; furi_assert(fap_loader); return fap_loader_load_name_and_icon(path, fap_loader->storage, icon_ptr, item_name); diff --git a/applications/main/fap_loader/fap_loader_app.h b/applications/main/fap_loader/fap_loader_app.h index 4f3f0ba24954..9ed725efe528 100644 --- a/applications/main/fap_loader/fap_loader_app.h +++ b/applications/main/fap_loader/fap_loader_app.h @@ -17,10 +17,10 @@ typedef struct FapLoader FapLoader; * @return true if icon and name were loaded successfully. */ bool fap_loader_load_name_and_icon( - string_t path, + FuriString* path, Storage* storage, uint8_t** icon_ptr, - string_t item_name); + FuriString* item_name); #ifdef __cplusplus } From 4caaad67f67d8c14123060b771eb829d2894e8d7 Mon Sep 17 00:00:00 2001 From: SG Date: Thu, 6 Oct 2022 17:06:44 +1000 Subject: [PATCH 15/15] Removed strange code --- applications/main/archive/views/archive_browser_view.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/applications/main/archive/views/archive_browser_view.c b/applications/main/archive/views/archive_browser_view.c index bc2700a67afc..f13094a1ce42 100644 --- a/applications/main/archive/views/archive_browser_view.c +++ b/applications/main/archive/views/archive_browser_view.c @@ -118,7 +118,6 @@ static void draw_list(Canvas* canvas, ArchiveBrowserViewModel* model) { size_t array_size = files_array_size(model->files); bool scrollbar = model->item_cnt > 4; - uint8_t* custom_icon_data = malloc(FAP_MANIFEST_MAX_ICON_SIZE); for(uint32_t i = 0; i < MIN(model->item_cnt, MENU_ITEMS); ++i) { FuriString* str_buf; @@ -177,7 +176,6 @@ static void draw_list(Canvas* canvas, ArchiveBrowserViewModel* model) { if(model->menu) { render_item_menu(canvas, model); } - free(custom_icon_data); } static void archive_render_status_bar(Canvas* canvas, ArchiveBrowserViewModel* model) {