Skip to content

Commit f0a0914

Browse files
committed
Overhaul
- Fixes view dispatcher - Adds checks to nfc select and view content to make sure file was opened successfully - Fixes the issue causing the need for 2 file browser instances
1 parent b586b00 commit f0a0914

12 files changed

+86
-73
lines changed

nfc_playlist.c

Lines changed: 15 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -30,25 +30,21 @@ static NfcPlaylist* nfc_playlist_alloc() {
3030
nfc_playlist->settings.emulate_led_indicator = default_emulate_led_indicator;
3131

3232
nfc_playlist->notification = furi_record_open(RECORD_NOTIFICATION);
33-
nfc_playlist->playlist_file_browser = file_browser_alloc(nfc_playlist->file_browser_output);
34-
nfc_playlist->nfc_file_browser = file_browser_alloc(nfc_playlist->file_browser_output);
33+
nfc_playlist->file_browser = file_browser_alloc(nfc_playlist->file_browser_output);
3534

3635
nfc_playlist->text_input = text_input_alloc();
3736
nfc_playlist->popup = popup_alloc();
3837

3938
view_dispatcher_set_event_callback_context(nfc_playlist->view_dispatcher, nfc_playlist);
4039
view_dispatcher_set_custom_event_callback(nfc_playlist->view_dispatcher, nfc_playlist_custom_callback);
4140
view_dispatcher_set_navigation_event_callback(nfc_playlist->view_dispatcher, nfc_playlist_back_event_callback);
42-
view_dispatcher_add_view(nfc_playlist->view_dispatcher, NfcPlaylistScene_MainMenu, submenu_get_view(nfc_playlist->submenu));
43-
view_dispatcher_add_view(nfc_playlist->view_dispatcher, NfcPlaylistScene_Settings, variable_item_list_get_view(nfc_playlist->variable_item_list));
44-
view_dispatcher_add_view(nfc_playlist->view_dispatcher, NfcPlaylistScene_Emulation, popup_get_view(nfc_playlist->popup));
45-
view_dispatcher_add_view(nfc_playlist->view_dispatcher, NfcPlaylistScene_PlaylistSelect, file_browser_get_view(nfc_playlist->playlist_file_browser));
46-
view_dispatcher_add_view(nfc_playlist->view_dispatcher, NfcPlaylistScene_FileEdit, submenu_get_view(nfc_playlist->submenu));
47-
view_dispatcher_add_view(nfc_playlist->view_dispatcher, NfcPlaylistScene_FileRename, text_input_get_view(nfc_playlist->text_input));
48-
view_dispatcher_add_view(nfc_playlist->view_dispatcher, NfcPlaylistScene_ConfirmDelete, widget_get_view(nfc_playlist->widget));
49-
view_dispatcher_add_view(nfc_playlist->view_dispatcher, NfcPlaylistScene_ViewPlaylistContent, widget_get_view(nfc_playlist->widget));
50-
view_dispatcher_add_view(nfc_playlist->view_dispatcher, NfcPlaylistScene_NfcSelect, file_browser_get_view(nfc_playlist->nfc_file_browser));
51-
view_dispatcher_add_view(nfc_playlist->view_dispatcher, NfcPlaylistScene_NameNewFile, text_input_get_view(nfc_playlist->text_input));
41+
42+
view_dispatcher_add_view(nfc_playlist->view_dispatcher, NfcPlaylistView_Submenu, submenu_get_view(nfc_playlist->submenu));
43+
view_dispatcher_add_view(nfc_playlist->view_dispatcher, NfcPlaylistView_Popup, popup_get_view(nfc_playlist->popup));
44+
view_dispatcher_add_view(nfc_playlist->view_dispatcher, NfcPlaylistView_Widget, widget_get_view(nfc_playlist->widget));
45+
view_dispatcher_add_view(nfc_playlist->view_dispatcher, NfcPlaylistView_VariableItemList, variable_item_list_get_view(nfc_playlist->variable_item_list));
46+
view_dispatcher_add_view(nfc_playlist->view_dispatcher, NfcPlaylistView_FileBrowser, file_browser_get_view(nfc_playlist->file_browser));
47+
view_dispatcher_add_view(nfc_playlist->view_dispatcher, NfcPlaylistView_TextInput, text_input_get_view(nfc_playlist->text_input));
5248

5349
Storage* storage = furi_record_open(RECORD_STORAGE);
5450
if (!storage_common_exists(storage, PLAYLIST_DIR)) {
@@ -62,16 +58,12 @@ static NfcPlaylist* nfc_playlist_alloc() {
6258
static void nfc_playlist_free(NfcPlaylist* nfc_playlist) {
6359
furi_assert(nfc_playlist);
6460

65-
view_dispatcher_remove_view(nfc_playlist->view_dispatcher, NfcPlaylistScene_MainMenu);
66-
view_dispatcher_remove_view(nfc_playlist->view_dispatcher, NfcPlaylistScene_Settings);
67-
view_dispatcher_remove_view(nfc_playlist->view_dispatcher, NfcPlaylistScene_Emulation);
68-
view_dispatcher_remove_view(nfc_playlist->view_dispatcher, NfcPlaylistScene_PlaylistSelect);
69-
view_dispatcher_remove_view(nfc_playlist->view_dispatcher, NfcPlaylistScene_FileEdit);
70-
view_dispatcher_remove_view(nfc_playlist->view_dispatcher, NfcPlaylistScene_FileRename);
71-
view_dispatcher_remove_view(nfc_playlist->view_dispatcher, NfcPlaylistScene_ConfirmDelete);
72-
view_dispatcher_remove_view(nfc_playlist->view_dispatcher, NfcPlaylistScene_ViewPlaylistContent);
73-
view_dispatcher_remove_view(nfc_playlist->view_dispatcher, NfcPlaylistScene_NfcSelect);
74-
view_dispatcher_remove_view(nfc_playlist->view_dispatcher, NfcPlaylistScene_NameNewFile);
61+
view_dispatcher_remove_view(nfc_playlist->view_dispatcher, NfcPlaylistView_Submenu);
62+
view_dispatcher_remove_view(nfc_playlist->view_dispatcher, NfcPlaylistView_Popup);
63+
view_dispatcher_remove_view(nfc_playlist->view_dispatcher, NfcPlaylistView_Widget);
64+
view_dispatcher_remove_view(nfc_playlist->view_dispatcher, NfcPlaylistView_VariableItemList);
65+
view_dispatcher_remove_view(nfc_playlist->view_dispatcher, NfcPlaylistView_FileBrowser);
66+
view_dispatcher_remove_view(nfc_playlist->view_dispatcher, NfcPlaylistView_TextInput);
7567

7668
scene_manager_free(nfc_playlist->scene_manager);
7769
view_dispatcher_free(nfc_playlist->view_dispatcher);
@@ -80,8 +72,7 @@ static void nfc_playlist_free(NfcPlaylist* nfc_playlist) {
8072
widget_free(nfc_playlist->widget);
8173

8274
furi_record_close(RECORD_NOTIFICATION);
83-
file_browser_free(nfc_playlist->playlist_file_browser);
84-
file_browser_free(nfc_playlist->nfc_file_browser);
75+
file_browser_free(nfc_playlist->file_browser);
8576
text_input_free(nfc_playlist->text_input);
8677
popup_free(nfc_playlist->popup);
8778

nfc_playlist.h

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,15 @@
2828

2929
#include "scenes/nfc_playlist_scene.h"
3030

31+
typedef enum {
32+
NfcPlaylistView_Submenu,
33+
NfcPlaylistView_Popup,
34+
NfcPlaylistView_Widget,
35+
NfcPlaylistView_VariableItemList,
36+
NfcPlaylistView_FileBrowser,
37+
NfcPlaylistView_TextInput
38+
} NfcPlaylistView;
39+
3140
typedef struct {
3241
FuriString* file_path;
3342
bool playlist_selected;
@@ -39,15 +48,14 @@ typedef struct {
3948
typedef struct {
4049
SceneManager* scene_manager;
4150
ViewDispatcher* view_dispatcher;
51+
Submenu* submenu;
52+
Popup* popup;
53+
Widget* widget;
4254
VariableItemList* variable_item_list;
43-
FileBrowser* playlist_file_browser;
44-
FileBrowser* nfc_file_browser;
55+
FileBrowser* file_browser;
4556
FuriString* file_browser_output;
4657
TextInput* text_input;
4758
char* text_input_output;
48-
Submenu* submenu;
49-
Popup* popup;
50-
Widget* widget;
5159
NotificationApp* notification;
5260
FuriThread* thread;
5361
NfcPlaylistWorker* nfc_playlist_worker;

scenes/nfc_playlist_scene_confirm_delete.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ void nfc_playlist_confirm_delete_scene_on_enter(void* context) {
2121

2222
furi_string_free(temp_str);
2323

24-
view_dispatcher_switch_to_view(nfc_playlist->view_dispatcher, NfcPlaylistScene_ConfirmDelete);
24+
view_dispatcher_switch_to_view(nfc_playlist->view_dispatcher, NfcPlaylistView_Widget);
2525
}
2626

2727
bool nfc_playlist_confirm_delete_scene_on_event(void* context, SceneManagerEvent event) {

scenes/nfc_playlist_scene_emulation.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@ int32_t nfc_playlist_emulation_task(void* context) {
1616

1717
popup_reset(nfc_playlist->popup);
1818
popup_set_context(nfc_playlist->popup, nfc_playlist);
19-
view_dispatcher_switch_to_view(nfc_playlist->view_dispatcher, NfcPlaylistScene_Emulation);
19+
20+
view_dispatcher_switch_to_view(nfc_playlist->view_dispatcher, NfcPlaylistView_Popup);
2021

2122
if (file_stream_open(stream, furi_string_get_cstr(nfc_playlist->settings.file_path), FSAM_READ, FSOM_OPEN_EXISTING)) {
2223
EmulationState = NfcPlaylistEmulationState_Emulating;

scenes/nfc_playlist_scene_file_edit.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ void nfc_playlist_file_edit_scene_on_enter(void* context) {
6161
furi_string_empty(nfc_playlist->settings.file_path),
6262
"No\nplaylist\nselected");
6363

64-
view_dispatcher_switch_to_view(nfc_playlist->view_dispatcher, NfcPlaylistScene_FileEdit);
64+
view_dispatcher_switch_to_view(nfc_playlist->view_dispatcher, NfcPlaylistView_Submenu);
6565
}
6666

6767
bool nfc_playlist_file_edit_scene_on_event(void* context, SceneManagerEvent event) {

scenes/nfc_playlist_scene_file_rename.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,8 @@ void nfc_playlist_file_rename_scene_on_enter(void* context) {
3131
text_input_set_header_text(nfc_playlist->text_input, "Enter new file name");
3232
text_input_set_minimum_length(nfc_playlist->text_input, 1);
3333
text_input_set_result_callback(nfc_playlist->text_input, nfc_playlist_file_rename_menu_callback, nfc_playlist, nfc_playlist->text_input_output, 50, true);
34-
view_dispatcher_switch_to_view(nfc_playlist->view_dispatcher, NfcPlaylistScene_FileRename);
34+
35+
view_dispatcher_switch_to_view(nfc_playlist->view_dispatcher, NfcPlaylistView_TextInput);
3536
}
3637

3738
bool nfc_playlist_file_rename_scene_on_event(void* context, SceneManagerEvent event) {

scenes/nfc_playlist_scene_main_menu.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,8 @@ void nfc_playlist_main_menu_scene_on_enter(void* context) {
6161
NfcPlaylistMenuSelection_Settings,
6262
nfc_playlist_main_menu_menu_callback,
6363
nfc_playlist);
64-
view_dispatcher_switch_to_view(nfc_playlist->view_dispatcher, NfcPlaylistScene_MainMenu);
64+
65+
view_dispatcher_switch_to_view(nfc_playlist->view_dispatcher, NfcPlaylistView_Submenu);
6566
}
6667

6768
bool nfc_playlist_main_menu_scene_on_event(void* context, SceneManagerEvent event) {

scenes/nfc_playlist_scene_name_new_file.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@ void nfc_playlist_name_new_file_scene_on_enter(void* context) {
2424
text_input_set_header_text(nfc_playlist->text_input, "Enter file name");
2525
text_input_set_minimum_length(nfc_playlist->text_input, 1);
2626
text_input_set_result_callback(nfc_playlist->text_input, nfc_playlist_name_new_file_menu_callback, nfc_playlist, nfc_playlist->text_input_output, 50, true);
27-
view_dispatcher_switch_to_view(nfc_playlist->view_dispatcher, NfcPlaylistScene_FileRename);
27+
28+
view_dispatcher_switch_to_view(nfc_playlist->view_dispatcher, NfcPlaylistView_TextInput);
2829
}
2930

3031
bool nfc_playlist_name_new_file_scene_on_event(void* context, SceneManagerEvent event) {

scenes/nfc_playlist_scene_nfc_select.c

Lines changed: 25 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -7,46 +7,51 @@ void nfc_playlist_nfc_select_menu_callback(void* context) {
77

88
Storage* storage = furi_record_open(RECORD_STORAGE);
99
File* file = storage_file_alloc(storage);
10-
uint8_t buffer[MAX_PLAYLIST_SIZE];
11-
storage_file_open(file, furi_string_get_cstr(nfc_playlist->settings.file_path), FSAM_READ_WRITE, FSOM_OPEN_EXISTING);
12-
uint16_t read_count = storage_file_read(file, buffer, MAX_PLAYLIST_SIZE);
13-
FuriString* playlist_content = furi_string_alloc();
10+
11+
if (storage_file_open(file, furi_string_get_cstr(nfc_playlist->settings.file_path), FSAM_READ_WRITE, FSOM_OPEN_EXISTING)) {
12+
uint8_t buffer[MAX_PLAYLIST_SIZE];
13+
uint16_t read_count = storage_file_read(file, buffer, MAX_PLAYLIST_SIZE);
14+
FuriString* playlist_content = furi_string_alloc();
1415

15-
for(uint16_t i = 0; i < read_count; i++) {
16-
furi_string_push_back(playlist_content, buffer[i]);
17-
}
16+
for(uint16_t i = 0; i < read_count; i++) {
17+
furi_string_push_back(playlist_content, buffer[i]);
18+
}
1819

19-
if (read_count > 0) {
20-
furi_string_printf(playlist_content, "\n%s", furi_string_get_cstr(nfc_playlist->file_browser_output));
21-
} else {
22-
furi_string_printf(playlist_content, "%s", furi_string_get_cstr(nfc_playlist->file_browser_output));
23-
}
20+
if (read_count > 0) {
21+
furi_string_printf(playlist_content, "\n%s", furi_string_get_cstr(nfc_playlist->file_browser_output));
22+
} else {
23+
furi_string_printf(playlist_content, "%s", furi_string_get_cstr(nfc_playlist->file_browser_output));
24+
}
2425

25-
storage_file_write(file, furi_string_get_cstr(playlist_content), sizeof(char) * furi_string_utf8_length(playlist_content));
26+
storage_file_write(file, furi_string_get_cstr(playlist_content), sizeof(char) * furi_string_utf8_length(playlist_content));
27+
28+
furi_string_free(playlist_content);
29+
storage_file_close(file);
30+
}
2631

27-
furi_string_free(playlist_content);
28-
storage_file_close(file);
2932
storage_file_free(file);
3033
furi_record_close(RECORD_STORAGE);
3134
furi_string_reset(nfc_playlist->file_browser_output);
35+
3236
scene_manager_previous_scene(nfc_playlist->scene_manager);
3337
}
3438

3539
void nfc_playlist_nfc_select_scene_on_enter(void* context) {
3640
NfcPlaylist* nfc_playlist = context;
3741
file_browser_configure(
38-
nfc_playlist->playlist_file_browser,
42+
nfc_playlist->file_browser,
3943
".nfc",
4044
"/ext/nfc/",
4145
true,
4246
true,
4347
&I_Nfc_10px,
4448
true);
45-
view_dispatcher_switch_to_view(nfc_playlist->view_dispatcher, NfcPlaylistScene_PlaylistSelect);
46-
file_browser_set_callback(nfc_playlist->playlist_file_browser, nfc_playlist_nfc_select_menu_callback, nfc_playlist);
49+
file_browser_set_callback(nfc_playlist->file_browser, nfc_playlist_nfc_select_menu_callback, nfc_playlist);
4750
FuriString* tmp_str = furi_string_alloc_set_str("/ext/nfc/");
48-
file_browser_start(nfc_playlist->playlist_file_browser, tmp_str);
51+
file_browser_start(nfc_playlist->file_browser, tmp_str);
4952
furi_string_free(tmp_str);
53+
54+
view_dispatcher_switch_to_view(nfc_playlist->view_dispatcher, NfcPlaylistView_FileBrowser);
5055
}
5156

5257
bool nfc_playlist_nfc_select_scene_on_event(void* context, SceneManagerEvent event) {
@@ -57,5 +62,5 @@ bool nfc_playlist_nfc_select_scene_on_event(void* context, SceneManagerEvent eve
5762

5863
void nfc_playlist_nfc_select_scene_on_exit(void* context) {
5964
NfcPlaylist* nfc_playlist = context;
60-
file_browser_stop(nfc_playlist->playlist_file_browser);
65+
file_browser_stop(nfc_playlist->file_browser);
6166
}

scenes/nfc_playlist_scene_playlist_select.c

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,18 +10,19 @@ void nfc_playlist_playlist_select_menu_callback(void* context) {
1010
void nfc_playlist_playlist_select_scene_on_enter(void* context) {
1111
NfcPlaylist* nfc_playlist = context;
1212
file_browser_configure(
13-
nfc_playlist->playlist_file_browser,
13+
nfc_playlist->file_browser,
1414
".txt",
1515
PLAYLIST_LOCATION,
1616
true,
1717
true,
1818
&I_Nfc_10px,
1919
true);
20-
view_dispatcher_switch_to_view(nfc_playlist->view_dispatcher, NfcPlaylistScene_PlaylistSelect);
21-
file_browser_set_callback(nfc_playlist->playlist_file_browser, nfc_playlist_playlist_select_menu_callback, nfc_playlist);
20+
file_browser_set_callback(nfc_playlist->file_browser, nfc_playlist_playlist_select_menu_callback, nfc_playlist);
2221
FuriString* tmp_str = furi_string_alloc_set_str(PLAYLIST_LOCATION);
23-
file_browser_start(nfc_playlist->playlist_file_browser, tmp_str);
22+
file_browser_start(nfc_playlist->file_browser, tmp_str);
2423
furi_string_free(tmp_str);
24+
25+
view_dispatcher_switch_to_view(nfc_playlist->view_dispatcher, NfcPlaylistView_FileBrowser);
2526
}
2627

2728
bool nfc_playlist_playlist_select_scene_on_event(void* context, SceneManagerEvent event) {
@@ -32,5 +33,5 @@ bool nfc_playlist_playlist_select_scene_on_event(void* context, SceneManagerEven
3233

3334
void nfc_playlist_playlist_select_scene_on_exit(void* context) {
3435
NfcPlaylist* nfc_playlist = context;
35-
file_browser_stop(nfc_playlist->playlist_file_browser);
36+
file_browser_stop(nfc_playlist->file_browser);
3637
}

0 commit comments

Comments
 (0)