Skip to content

Commit 23bb605

Browse files
committed
fix(APP): loading perf changes
1 parent 4c06e9a commit 23bb605

7 files changed

+120
-81
lines changed

applications/main/momentum_app/momentum_app.c

Lines changed: 71 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,61 @@ void momentum_app_push_mainmenu_app(MomentumApp* app, FuriString* exe) {
210210
furi_string_free(label);
211211
}
212212

213+
void momentum_app_load_asset_pack_names(MomentumApp* app) {
214+
if(app->asset_pack_names_loaded) {
215+
return;
216+
}
217+
218+
app->asset_pack_index = 0;
219+
File* folder = storage_file_alloc(app->storage);
220+
FileInfo info;
221+
char* name = malloc(ASSET_PACKS_NAME_LEN);
222+
if(storage_dir_open(folder, ASSET_PACKS_PATH)) {
223+
while(storage_dir_read(folder, &info, name, ASSET_PACKS_NAME_LEN)) {
224+
if(info.flags & FSF_DIRECTORY && name[0] != '.') {
225+
char* copy = strdup(name);
226+
size_t idx = 0;
227+
for(; idx < CharList_size(app->asset_pack_names); idx++) {
228+
char* comp = *CharList_get(app->asset_pack_names, idx);
229+
if(strcasecmp(copy, comp) < 0) {
230+
break;
231+
}
232+
}
233+
CharList_push_at(app->asset_pack_names, idx, copy);
234+
if(app->asset_pack_index != 0) {
235+
if(idx < app->asset_pack_index) app->asset_pack_index++;
236+
} else if(strcmp(copy, momentum_settings.asset_pack) == 0) {
237+
app->asset_pack_index = idx + 1;
238+
}
239+
}
240+
}
241+
storage_file_close(folder);
242+
}
243+
free(name);
244+
storage_file_free(folder);
245+
246+
app->asset_pack_names_loaded = true;
247+
}
248+
249+
void momentum_app_unload_asset_pack_names(MomentumApp* app) {
250+
if(!app->asset_pack_names_loaded) {
251+
return;
252+
}
253+
254+
CharList_it_t it;
255+
for(CharList_it(it, app->asset_pack_names); !CharList_end_p(it); CharList_next(it)) {
256+
free(*CharList_cref(it));
257+
}
258+
CharList_reset(app->asset_pack_names);
259+
app->asset_pack_index = 0;
260+
app->asset_pack_names_loaded = false;
261+
}
262+
213263
void momentum_app_load_mainmenu_apps(MomentumApp* app) {
264+
if(app->mainmenu_apps_loaded) {
265+
return;
266+
}
267+
214268
// Loading logic mimics applications/services/loader/loader_menu.c
215269
Stream* stream = file_stream_alloc(app->storage);
216270
FuriString* line = furi_string_alloc();
@@ -252,6 +306,7 @@ void momentum_app_load_mainmenu_apps(MomentumApp* app) {
252306
furi_string_free(line);
253307
file_stream_close(stream);
254308
stream_free(stream);
309+
app->mainmenu_apps_loaded = true;
255310
}
256311

257312
void momentum_app_empty_mainmenu_apps(MomentumApp* app) {
@@ -266,6 +321,16 @@ void momentum_app_empty_mainmenu_apps(MomentumApp* app) {
266321
CharList_reset(app->mainmenu_app_exes);
267322
}
268323

324+
void momentum_app_unload_mainmenu_apps(MomentumApp* app) {
325+
if(!app->mainmenu_apps_loaded) {
326+
return;
327+
}
328+
329+
momentum_app_empty_mainmenu_apps(app);
330+
app->mainmenu_app_index = 0;
331+
app->mainmenu_apps_loaded = false;
332+
}
333+
269334
MomentumApp* momentum_app_alloc() {
270335
MomentumApp* app = malloc(sizeof(MomentumApp));
271336
app->gui = furi_record_open(RECORD_GUI);
@@ -324,38 +389,14 @@ MomentumApp* momentum_app_alloc() {
324389

325390
// Settings init
326391

327-
app->asset_pack_index = 0;
328392
CharList_init(app->asset_pack_names);
329-
File* folder = storage_file_alloc(app->storage);
330-
FileInfo info;
331-
char* name = malloc(ASSET_PACKS_NAME_LEN);
332-
if(storage_dir_open(folder, ASSET_PACKS_PATH)) {
333-
while(storage_dir_read(folder, &info, name, ASSET_PACKS_NAME_LEN)) {
334-
if(info.flags & FSF_DIRECTORY && name[0] != '.') {
335-
char* copy = strdup(name);
336-
size_t idx = 0;
337-
for(; idx < CharList_size(app->asset_pack_names); idx++) {
338-
char* comp = *CharList_get(app->asset_pack_names, idx);
339-
if(strcasecmp(copy, comp) < 0) {
340-
break;
341-
}
342-
}
343-
CharList_push_at(app->asset_pack_names, idx, copy);
344-
if(app->asset_pack_index != 0) {
345-
if(idx < app->asset_pack_index) app->asset_pack_index++;
346-
} else {
347-
if(strcmp(copy, momentum_settings.asset_pack) == 0)
348-
app->asset_pack_index = idx + 1;
349-
}
350-
}
351-
}
352-
}
353-
free(name);
354-
storage_file_free(folder);
393+
app->asset_pack_index = 0;
394+
app->asset_pack_names_loaded = false;
355395

356396
CharList_init(app->mainmenu_app_labels);
357397
CharList_init(app->mainmenu_app_exes);
358-
momentum_app_load_mainmenu_apps(app);
398+
app->mainmenu_app_index = 0;
399+
app->mainmenu_apps_loaded = false;
359400

360401
desktop_api_get_settings(app->desktop, &app->desktop_settings);
361402

@@ -457,13 +498,10 @@ void momentum_app_free(MomentumApp* app) {
457498

458499
// Settings deinit
459500

460-
CharList_it_t it;
461-
for(CharList_it(it, app->asset_pack_names); !CharList_end_p(it); CharList_next(it)) {
462-
free(*CharList_cref(it));
463-
}
501+
momentum_app_unload_asset_pack_names(app);
464502
CharList_clear(app->asset_pack_names);
465503

466-
momentum_app_empty_mainmenu_apps(app);
504+
momentum_app_unload_mainmenu_apps(app);
467505
CharList_clear(app->mainmenu_app_labels);
468506
CharList_clear(app->mainmenu_app_exes);
469507

applications/main/momentum_app/momentum_app.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,11 @@ typedef struct {
6666

6767
CharList_t asset_pack_names;
6868
uint8_t asset_pack_index;
69+
bool asset_pack_names_loaded;
6970
CharList_t mainmenu_app_labels;
7071
CharList_t mainmenu_app_exes;
7172
uint8_t mainmenu_app_index;
73+
bool mainmenu_apps_loaded;
7274
DesktopSettings desktop_settings;
7375
bool subghz_use_defaults;
7476
FrequencyList_t subghz_static_freqs;
@@ -109,8 +111,17 @@ typedef enum {
109111
MomentumAppViewDialogEx,
110112
} MomentumAppView;
111113

114+
typedef enum {
115+
MomentumAppMainmenuAddSourceMainApp,
116+
MomentumAppMainmenuAddSourceExternalApp,
117+
MomentumAppMainmenuAddSourceFileDirectory,
118+
} MomentumAppMainmenuAddSource;
119+
112120
bool momentum_app_apply(MomentumApp* app);
113121

114122
void momentum_app_push_mainmenu_app(MomentumApp* app, FuriString* exe);
123+
void momentum_app_load_asset_pack_names(MomentumApp* app);
124+
void momentum_app_unload_asset_pack_names(MomentumApp* app);
115125
void momentum_app_load_mainmenu_apps(MomentumApp* app);
116126
void momentum_app_empty_mainmenu_apps(MomentumApp* app);
127+
void momentum_app_unload_mainmenu_apps(MomentumApp* app);

applications/main/momentum_app/scenes/momentum_app_scene_interface_graphics.c

Lines changed: 3 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -12,20 +12,6 @@ void momentum_app_scene_interface_graphics_var_item_list_callback(void* context,
1212
view_dispatcher_send_custom_event(app->view_dispatcher, index);
1313
}
1414

15-
static void momentum_app_scene_interface_graphics_asset_pack_changed(VariableItem* item) {
16-
MomentumApp* app = variable_item_get_context(item);
17-
uint8_t index = variable_item_get_current_value_index(item);
18-
variable_item_set_current_value_text(
19-
item, index == 0 ? "Default" : *CharList_get(app->asset_pack_names, index - 1));
20-
strlcpy(
21-
momentum_settings.asset_pack,
22-
index == 0 ? "" : *CharList_get(app->asset_pack_names, index - 1),
23-
ASSET_PACKS_NAME_LEN);
24-
app->asset_pack_index = index;
25-
app->save_settings = true;
26-
app->apply_pack = true;
27-
}
28-
2915
const char* const anim_speed_names[] = {
3016
"25%",
3117
"50%",
@@ -121,15 +107,12 @@ void momentum_app_scene_interface_graphics_on_enter(void* context) {
121107
item = variable_item_list_add(
122108
var_item_list,
123109
"Asset Pack",
124-
CharList_size(app->asset_pack_names) + 1,
125-
momentum_app_scene_interface_graphics_asset_pack_changed,
110+
0,
111+
NULL,
126112
app);
127-
variable_item_set_current_value_index(item, app->asset_pack_index);
128113
variable_item_set_current_value_text(
129114
item,
130-
app->asset_pack_index == 0 ?
131-
"Default" :
132-
*CharList_get(app->asset_pack_names, app->asset_pack_index - 1));
115+
momentum_settings.asset_pack[0] ? momentum_settings.asset_pack : "Default");
133116

134117
item = variable_item_list_add(
135118
var_item_list,

applications/main/momentum_app/scenes/momentum_app_scene_interface_graphics_pack.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ void momentum_app_scene_interface_graphics_pack_on_enter(void* context) {
99
MomentumApp* app = context;
1010
Submenu* submenu = app->submenu;
1111

12+
momentum_app_load_asset_pack_names(app);
13+
1214
submenu_add_item(
1315
submenu, "Default", 0, momentum_app_scene_interface_graphics_pack_submenu_callback, app);
1416

applications/main/momentum_app/scenes/momentum_app_scene_interface_mainmenu.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,8 @@ void momentum_app_scene_interface_mainmenu_on_enter(void* context) {
7171
VariableItemList* var_item_list = app->var_item_list;
7272
VariableItem* item;
7373

74+
momentum_app_load_mainmenu_apps(app);
75+
7476
item = variable_item_list_add(
7577
var_item_list,
7678
"Menu Style",

applications/main/momentum_app/scenes/momentum_app_scene_interface_mainmenu_add.c

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,5 @@
11
#include "../momentum_app.h"
22

3-
enum SubmenuIndex {
4-
SubmenuIndexMainApp,
5-
SubmenuIndexExternalApp,
6-
SubmenuIndexFileDirectory,
7-
};
8-
93
static bool fap_selector_item_callback(
104
FuriString* file_path,
115
void* context,
@@ -24,12 +18,14 @@ static void
2418
scene_manager_set_scene_state(app->scene_manager, MomentumAppSceneInterfaceMainmenuAdd, index);
2519

2620
switch(index) {
27-
case SubmenuIndexMainApp:
21+
case MomentumAppMainmenuAddSourceMainApp:
22+
scene_manager_next_scene(app->scene_manager, MomentumAppSceneInterfaceMainmenuAddMain);
23+
break;
24+
case MomentumAppMainmenuAddSourceExternalApp:
2825
scene_manager_next_scene(app->scene_manager, MomentumAppSceneInterfaceMainmenuAddMain);
2926
break;
30-
case SubmenuIndexExternalApp:
31-
case SubmenuIndexFileDirectory: {
32-
const bool is_file_dir = index == SubmenuIndexFileDirectory;
27+
case MomentumAppMainmenuAddSourceFileDirectory: {
28+
const bool is_file_dir = true;
3329
const DialogsFileBrowserOptions browser_options = {
3430
.extension = is_file_dir ? "*" : ".fap",
3531
.icon = &I_unknown_10px,
@@ -66,21 +62,21 @@ void momentum_app_scene_interface_mainmenu_add_on_enter(void* context) {
6662
submenu_add_item(
6763
submenu,
6864
"Main App",
69-
SubmenuIndexMainApp,
65+
MomentumAppMainmenuAddSourceMainApp,
7066
momentum_app_scene_interface_mainmenu_add_submenu_callback,
7167
app);
7268

7369
submenu_add_item(
7470
submenu,
7571
"External App",
76-
SubmenuIndexExternalApp,
72+
MomentumAppMainmenuAddSourceExternalApp,
7773
momentum_app_scene_interface_mainmenu_add_submenu_callback,
7874
app);
7975

8076
submenu_add_item(
8177
submenu,
8278
"File / Directory (right btn)",
83-
SubmenuIndexFileDirectory,
79+
MomentumAppMainmenuAddSourceFileDirectory,
8480
momentum_app_scene_interface_mainmenu_add_submenu_callback,
8581
app);
8682

applications/main/momentum_app/scenes/momentum_app_scene_interface_mainmenu_add_main.c

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -17,22 +17,29 @@ static void
1717
void momentum_app_scene_interface_mainmenu_add_main_on_enter(void* context) {
1818
MomentumApp* app = context;
1919
Submenu* submenu = app->submenu;
20+
const uint32_t source =
21+
scene_manager_get_scene_state(app->scene_manager, MomentumAppSceneInterfaceMainmenuAdd);
2022

21-
for(size_t i = 0; i < FLIPPER_APPS_COUNT; i++) {
22-
submenu_add_item(
23-
submenu,
24-
FLIPPER_APPS[i].name,
25-
(uint32_t)FLIPPER_APPS[i].name,
26-
momentum_app_scene_interface_mainmenu_add_main_submenu_callback,
27-
app);
28-
}
29-
for(size_t i = 0; i < FLIPPER_EXTERNAL_APPS_COUNT - 1; i++) {
30-
submenu_add_item(
31-
submenu,
32-
FLIPPER_EXTERNAL_APPS[i].name,
33-
(uint32_t)FLIPPER_EXTERNAL_APPS[i].name,
34-
momentum_app_scene_interface_mainmenu_add_main_submenu_callback,
35-
app);
23+
if(source == MomentumAppMainmenuAddSourceMainApp) {
24+
submenu_set_header(submenu, "Choose Main App:");
25+
for(size_t i = 0; i < FLIPPER_APPS_COUNT; i++) {
26+
submenu_add_item(
27+
submenu,
28+
FLIPPER_APPS[i].name,
29+
(uint32_t)FLIPPER_APPS[i].name,
30+
momentum_app_scene_interface_mainmenu_add_main_submenu_callback,
31+
app);
32+
}
33+
} else {
34+
submenu_set_header(submenu, "Choose External App:");
35+
for(size_t i = 0; i < FLIPPER_EXTERNAL_APPS_COUNT - 1; i++) {
36+
submenu_add_item(
37+
submenu,
38+
FLIPPER_EXTERNAL_APPS[i].name,
39+
(uint32_t)FLIPPER_EXTERNAL_APPS[i].name,
40+
momentum_app_scene_interface_mainmenu_add_main_submenu_callback,
41+
app);
42+
}
3643
}
3744

3845
view_dispatcher_switch_to_view(app->view_dispatcher, MomentumAppViewSubmenu);

0 commit comments

Comments
 (0)