Jelajahi Sumber

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
acegoal07 1 tahun lalu
induk
melakukan
f0a0914bc0

+ 15 - 24
nfc_playlist.c

@@ -30,8 +30,7 @@ static NfcPlaylist* nfc_playlist_alloc() {
    nfc_playlist->settings.emulate_led_indicator = default_emulate_led_indicator;
 
    nfc_playlist->notification = furi_record_open(RECORD_NOTIFICATION);
-   nfc_playlist->playlist_file_browser = file_browser_alloc(nfc_playlist->file_browser_output);
-   nfc_playlist->nfc_file_browser = file_browser_alloc(nfc_playlist->file_browser_output);
+   nfc_playlist->file_browser = file_browser_alloc(nfc_playlist->file_browser_output);
 
    nfc_playlist->text_input = text_input_alloc();
    nfc_playlist->popup = popup_alloc();
@@ -39,16 +38,13 @@ static NfcPlaylist* nfc_playlist_alloc() {
    view_dispatcher_set_event_callback_context(nfc_playlist->view_dispatcher, nfc_playlist);
    view_dispatcher_set_custom_event_callback(nfc_playlist->view_dispatcher, nfc_playlist_custom_callback);
    view_dispatcher_set_navigation_event_callback(nfc_playlist->view_dispatcher, nfc_playlist_back_event_callback);
-   view_dispatcher_add_view(nfc_playlist->view_dispatcher, NfcPlaylistScene_MainMenu, submenu_get_view(nfc_playlist->submenu));
-   view_dispatcher_add_view(nfc_playlist->view_dispatcher, NfcPlaylistScene_Settings, variable_item_list_get_view(nfc_playlist->variable_item_list));
-   view_dispatcher_add_view(nfc_playlist->view_dispatcher, NfcPlaylistScene_Emulation, popup_get_view(nfc_playlist->popup));
-   view_dispatcher_add_view(nfc_playlist->view_dispatcher, NfcPlaylistScene_PlaylistSelect, file_browser_get_view(nfc_playlist->playlist_file_browser));
-   view_dispatcher_add_view(nfc_playlist->view_dispatcher, NfcPlaylistScene_FileEdit, submenu_get_view(nfc_playlist->submenu));
-   view_dispatcher_add_view(nfc_playlist->view_dispatcher, NfcPlaylistScene_FileRename, text_input_get_view(nfc_playlist->text_input));
-   view_dispatcher_add_view(nfc_playlist->view_dispatcher, NfcPlaylistScene_ConfirmDelete, widget_get_view(nfc_playlist->widget));
-   view_dispatcher_add_view(nfc_playlist->view_dispatcher, NfcPlaylistScene_ViewPlaylistContent, widget_get_view(nfc_playlist->widget));
-   view_dispatcher_add_view(nfc_playlist->view_dispatcher, NfcPlaylistScene_NfcSelect, file_browser_get_view(nfc_playlist->nfc_file_browser));
-   view_dispatcher_add_view(nfc_playlist->view_dispatcher, NfcPlaylistScene_NameNewFile, text_input_get_view(nfc_playlist->text_input));
+
+   view_dispatcher_add_view(nfc_playlist->view_dispatcher, NfcPlaylistView_Submenu, submenu_get_view(nfc_playlist->submenu));
+   view_dispatcher_add_view(nfc_playlist->view_dispatcher, NfcPlaylistView_Popup, popup_get_view(nfc_playlist->popup));
+   view_dispatcher_add_view(nfc_playlist->view_dispatcher, NfcPlaylistView_Widget, widget_get_view(nfc_playlist->widget));
+   view_dispatcher_add_view(nfc_playlist->view_dispatcher, NfcPlaylistView_VariableItemList, variable_item_list_get_view(nfc_playlist->variable_item_list));
+   view_dispatcher_add_view(nfc_playlist->view_dispatcher, NfcPlaylistView_FileBrowser, file_browser_get_view(nfc_playlist->file_browser));
+   view_dispatcher_add_view(nfc_playlist->view_dispatcher, NfcPlaylistView_TextInput, text_input_get_view(nfc_playlist->text_input));
 
    Storage* storage = furi_record_open(RECORD_STORAGE);
    if (!storage_common_exists(storage, PLAYLIST_DIR)) {
@@ -62,16 +58,12 @@ static NfcPlaylist* nfc_playlist_alloc() {
 static void nfc_playlist_free(NfcPlaylist* nfc_playlist) {
    furi_assert(nfc_playlist);
 
-   view_dispatcher_remove_view(nfc_playlist->view_dispatcher, NfcPlaylistScene_MainMenu);
-   view_dispatcher_remove_view(nfc_playlist->view_dispatcher, NfcPlaylistScene_Settings);
-   view_dispatcher_remove_view(nfc_playlist->view_dispatcher, NfcPlaylistScene_Emulation);
-   view_dispatcher_remove_view(nfc_playlist->view_dispatcher, NfcPlaylistScene_PlaylistSelect);
-   view_dispatcher_remove_view(nfc_playlist->view_dispatcher, NfcPlaylistScene_FileEdit);
-   view_dispatcher_remove_view(nfc_playlist->view_dispatcher, NfcPlaylistScene_FileRename);
-   view_dispatcher_remove_view(nfc_playlist->view_dispatcher, NfcPlaylistScene_ConfirmDelete);
-   view_dispatcher_remove_view(nfc_playlist->view_dispatcher, NfcPlaylistScene_ViewPlaylistContent);
-   view_dispatcher_remove_view(nfc_playlist->view_dispatcher, NfcPlaylistScene_NfcSelect);
-   view_dispatcher_remove_view(nfc_playlist->view_dispatcher, NfcPlaylistScene_NameNewFile);
+   view_dispatcher_remove_view(nfc_playlist->view_dispatcher, NfcPlaylistView_Submenu);
+   view_dispatcher_remove_view(nfc_playlist->view_dispatcher, NfcPlaylistView_Popup);
+   view_dispatcher_remove_view(nfc_playlist->view_dispatcher, NfcPlaylistView_Widget);
+   view_dispatcher_remove_view(nfc_playlist->view_dispatcher, NfcPlaylistView_VariableItemList);
+   view_dispatcher_remove_view(nfc_playlist->view_dispatcher, NfcPlaylistView_FileBrowser);
+   view_dispatcher_remove_view(nfc_playlist->view_dispatcher, NfcPlaylistView_TextInput);
 
    scene_manager_free(nfc_playlist->scene_manager);
    view_dispatcher_free(nfc_playlist->view_dispatcher);
@@ -80,8 +72,7 @@ static void nfc_playlist_free(NfcPlaylist* nfc_playlist) {
    widget_free(nfc_playlist->widget);
 
    furi_record_close(RECORD_NOTIFICATION);
-   file_browser_free(nfc_playlist->playlist_file_browser);
-   file_browser_free(nfc_playlist->nfc_file_browser);
+   file_browser_free(nfc_playlist->file_browser);
    text_input_free(nfc_playlist->text_input);
    popup_free(nfc_playlist->popup);
 

+ 13 - 5
nfc_playlist.h

@@ -28,6 +28,15 @@
 
 #include "scenes/nfc_playlist_scene.h"
 
+typedef enum {
+   NfcPlaylistView_Submenu,
+   NfcPlaylistView_Popup,
+   NfcPlaylistView_Widget,
+   NfcPlaylistView_VariableItemList,
+   NfcPlaylistView_FileBrowser,
+   NfcPlaylistView_TextInput
+} NfcPlaylistView;
+
 typedef struct {
    FuriString* file_path;
    bool playlist_selected;
@@ -39,15 +48,14 @@ typedef struct {
 typedef struct {
    SceneManager* scene_manager;
    ViewDispatcher* view_dispatcher;
+   Submenu* submenu;
+   Popup* popup;
+   Widget* widget;
    VariableItemList* variable_item_list;
-   FileBrowser* playlist_file_browser;
-   FileBrowser* nfc_file_browser;
+   FileBrowser* file_browser;
    FuriString* file_browser_output;
    TextInput* text_input;
    char* text_input_output;
-   Submenu* submenu;
-   Popup* popup;
-   Widget* widget;
    NotificationApp* notification;
    FuriThread* thread;
    NfcPlaylistWorker* nfc_playlist_worker;

+ 1 - 1
scenes/nfc_playlist_scene_confirm_delete.c

@@ -21,7 +21,7 @@ void nfc_playlist_confirm_delete_scene_on_enter(void* context) {
 
    furi_string_free(temp_str);
 
-   view_dispatcher_switch_to_view(nfc_playlist->view_dispatcher, NfcPlaylistScene_ConfirmDelete);
+   view_dispatcher_switch_to_view(nfc_playlist->view_dispatcher, NfcPlaylistView_Widget);
 }
 
 bool nfc_playlist_confirm_delete_scene_on_event(void* context, SceneManagerEvent event) {

+ 2 - 1
scenes/nfc_playlist_scene_emulation.c

@@ -16,7 +16,8 @@ int32_t nfc_playlist_emulation_task(void* context) {
 
    popup_reset(nfc_playlist->popup);
    popup_set_context(nfc_playlist->popup, nfc_playlist);
-   view_dispatcher_switch_to_view(nfc_playlist->view_dispatcher, NfcPlaylistScene_Emulation);
+   
+   view_dispatcher_switch_to_view(nfc_playlist->view_dispatcher, NfcPlaylistView_Popup);
 
    if (file_stream_open(stream, furi_string_get_cstr(nfc_playlist->settings.file_path), FSAM_READ, FSOM_OPEN_EXISTING)) {
       EmulationState = NfcPlaylistEmulationState_Emulating;

+ 1 - 1
scenes/nfc_playlist_scene_file_edit.c

@@ -61,7 +61,7 @@ void nfc_playlist_file_edit_scene_on_enter(void* context) {
       furi_string_empty(nfc_playlist->settings.file_path),
       "No\nplaylist\nselected");
 
-   view_dispatcher_switch_to_view(nfc_playlist->view_dispatcher, NfcPlaylistScene_FileEdit);
+   view_dispatcher_switch_to_view(nfc_playlist->view_dispatcher, NfcPlaylistView_Submenu);
 }
 
 bool nfc_playlist_file_edit_scene_on_event(void* context, SceneManagerEvent event) {

+ 2 - 1
scenes/nfc_playlist_scene_file_rename.c

@@ -31,7 +31,8 @@ void nfc_playlist_file_rename_scene_on_enter(void* context) {
    text_input_set_header_text(nfc_playlist->text_input, "Enter new file name");
    text_input_set_minimum_length(nfc_playlist->text_input, 1);
    text_input_set_result_callback(nfc_playlist->text_input, nfc_playlist_file_rename_menu_callback, nfc_playlist, nfc_playlist->text_input_output, 50, true);
-   view_dispatcher_switch_to_view(nfc_playlist->view_dispatcher, NfcPlaylistScene_FileRename);
+   
+   view_dispatcher_switch_to_view(nfc_playlist->view_dispatcher, NfcPlaylistView_TextInput);
 }
 
 bool nfc_playlist_file_rename_scene_on_event(void* context, SceneManagerEvent event) {

+ 2 - 1
scenes/nfc_playlist_scene_main_menu.c

@@ -61,7 +61,8 @@ void nfc_playlist_main_menu_scene_on_enter(void* context) {
       NfcPlaylistMenuSelection_Settings,
       nfc_playlist_main_menu_menu_callback,
       nfc_playlist);
-   view_dispatcher_switch_to_view(nfc_playlist->view_dispatcher, NfcPlaylistScene_MainMenu);
+      
+   view_dispatcher_switch_to_view(nfc_playlist->view_dispatcher, NfcPlaylistView_Submenu);
 }
 
 bool nfc_playlist_main_menu_scene_on_event(void* context, SceneManagerEvent event) {

+ 2 - 1
scenes/nfc_playlist_scene_name_new_file.c

@@ -24,7 +24,8 @@ void nfc_playlist_name_new_file_scene_on_enter(void* context) {
    text_input_set_header_text(nfc_playlist->text_input, "Enter file name");
    text_input_set_minimum_length(nfc_playlist->text_input, 1);
    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);
-   view_dispatcher_switch_to_view(nfc_playlist->view_dispatcher, NfcPlaylistScene_FileRename);
+   
+   view_dispatcher_switch_to_view(nfc_playlist->view_dispatcher, NfcPlaylistView_TextInput);
 }
 
 bool nfc_playlist_name_new_file_scene_on_event(void* context, SceneManagerEvent event) {

+ 25 - 20
scenes/nfc_playlist_scene_nfc_select.c

@@ -7,46 +7,51 @@ void nfc_playlist_nfc_select_menu_callback(void* context) {
 
    Storage* storage = furi_record_open(RECORD_STORAGE);
    File* file = storage_file_alloc(storage);
-   uint8_t buffer[MAX_PLAYLIST_SIZE];
-   storage_file_open(file, furi_string_get_cstr(nfc_playlist->settings.file_path), FSAM_READ_WRITE, FSOM_OPEN_EXISTING);
-   uint16_t read_count = storage_file_read(file, buffer, MAX_PLAYLIST_SIZE);
-   FuriString* playlist_content = furi_string_alloc();
+   
+   if (storage_file_open(file, furi_string_get_cstr(nfc_playlist->settings.file_path), FSAM_READ_WRITE, FSOM_OPEN_EXISTING)) {
+      uint8_t buffer[MAX_PLAYLIST_SIZE];
+      uint16_t read_count = storage_file_read(file, buffer, MAX_PLAYLIST_SIZE);
+      FuriString* playlist_content = furi_string_alloc();
 
-   for(uint16_t i = 0; i < read_count; i++) {
-      furi_string_push_back(playlist_content, buffer[i]);
-   }
+      for(uint16_t i = 0; i < read_count; i++) {
+         furi_string_push_back(playlist_content, buffer[i]);
+      }
 
-   if (read_count > 0) {
-      furi_string_printf(playlist_content, "\n%s", furi_string_get_cstr(nfc_playlist->file_browser_output));
-   } else {
-      furi_string_printf(playlist_content, "%s", furi_string_get_cstr(nfc_playlist->file_browser_output));
-   }
+      if (read_count > 0) {
+         furi_string_printf(playlist_content, "\n%s", furi_string_get_cstr(nfc_playlist->file_browser_output));
+      } else {
+         furi_string_printf(playlist_content, "%s", furi_string_get_cstr(nfc_playlist->file_browser_output));
+      }
 
-   storage_file_write(file, furi_string_get_cstr(playlist_content), sizeof(char) * furi_string_utf8_length(playlist_content));
+      storage_file_write(file, furi_string_get_cstr(playlist_content), sizeof(char) * furi_string_utf8_length(playlist_content));
+
+      furi_string_free(playlist_content);
+      storage_file_close(file);
+   }
 
-   furi_string_free(playlist_content);
-   storage_file_close(file);
    storage_file_free(file);
    furi_record_close(RECORD_STORAGE);
    furi_string_reset(nfc_playlist->file_browser_output);
+   
    scene_manager_previous_scene(nfc_playlist->scene_manager);
 }
 
 void nfc_playlist_nfc_select_scene_on_enter(void* context) {
    NfcPlaylist* nfc_playlist = context;
    file_browser_configure(
-      nfc_playlist->playlist_file_browser,
+      nfc_playlist->file_browser,
       ".nfc",
       "/ext/nfc/",
       true,
       true,
       &I_Nfc_10px,
       true);
-   view_dispatcher_switch_to_view(nfc_playlist->view_dispatcher, NfcPlaylistScene_PlaylistSelect);
-   file_browser_set_callback(nfc_playlist->playlist_file_browser, nfc_playlist_nfc_select_menu_callback, nfc_playlist);
+   file_browser_set_callback(nfc_playlist->file_browser, nfc_playlist_nfc_select_menu_callback, nfc_playlist);
    FuriString* tmp_str = furi_string_alloc_set_str("/ext/nfc/");
-   file_browser_start(nfc_playlist->playlist_file_browser, tmp_str);
+   file_browser_start(nfc_playlist->file_browser, tmp_str);
    furi_string_free(tmp_str);
+   
+   view_dispatcher_switch_to_view(nfc_playlist->view_dispatcher, NfcPlaylistView_FileBrowser);
 }
 
 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
 
 void nfc_playlist_nfc_select_scene_on_exit(void* context) {
    NfcPlaylist* nfc_playlist = context;
-   file_browser_stop(nfc_playlist->playlist_file_browser);
+   file_browser_stop(nfc_playlist->file_browser);
 }

+ 6 - 5
scenes/nfc_playlist_scene_playlist_select.c

@@ -10,18 +10,19 @@ void nfc_playlist_playlist_select_menu_callback(void* context) {
 void nfc_playlist_playlist_select_scene_on_enter(void* context) {
    NfcPlaylist* nfc_playlist = context;
    file_browser_configure(
-      nfc_playlist->playlist_file_browser,
+      nfc_playlist->file_browser,
       ".txt",
       PLAYLIST_LOCATION,
       true,
       true,
       &I_Nfc_10px,
       true);
-   view_dispatcher_switch_to_view(nfc_playlist->view_dispatcher, NfcPlaylistScene_PlaylistSelect);
-   file_browser_set_callback(nfc_playlist->playlist_file_browser, nfc_playlist_playlist_select_menu_callback, nfc_playlist);
+   file_browser_set_callback(nfc_playlist->file_browser, nfc_playlist_playlist_select_menu_callback, nfc_playlist);
    FuriString* tmp_str = furi_string_alloc_set_str(PLAYLIST_LOCATION);
-   file_browser_start(nfc_playlist->playlist_file_browser, tmp_str);
+   file_browser_start(nfc_playlist->file_browser, tmp_str);
    furi_string_free(tmp_str);
+   
+   view_dispatcher_switch_to_view(nfc_playlist->view_dispatcher, NfcPlaylistView_FileBrowser);
 }
 
 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
 
 void nfc_playlist_playlist_select_scene_on_exit(void* context) {
    NfcPlaylist* nfc_playlist = context;
-   file_browser_stop(nfc_playlist->playlist_file_browser);
+   file_browser_stop(nfc_playlist->file_browser);
 }

+ 2 - 1
scenes/nfc_playlist_scene_settings.c

@@ -80,8 +80,9 @@ void nfc_playlist_settings_scene_on_enter(void* context) {
    variable_item_set_current_value_text(credits, "Credits");
 
    variable_item_list_set_enter_callback(nfc_playlist->variable_item_list, nfc_playlist_settings_menu_callback, nfc_playlist);
-   view_dispatcher_switch_to_view(nfc_playlist->view_dispatcher, NfcPlaylistScene_Settings);
    furi_string_free(tmp_str);
+   
+   view_dispatcher_switch_to_view(nfc_playlist->view_dispatcher, NfcPlaylistView_VariableItemList);
 }
 
 bool nfc_playlist_settings_scene_on_event(void* context, SceneManagerEvent event) {

+ 15 - 12
scenes/nfc_playlist_scene_view_playlist_content.c

@@ -7,24 +7,27 @@ void nfc_playlist_view_playlist_content_scene_on_enter(void* context) {
 
    Storage* storage = furi_record_open(RECORD_STORAGE);
    File* file = storage_file_alloc(storage);
-   uint8_t buffer[MAX_PLAYLIST_SIZE];
-   storage_file_open(file, furi_string_get_cstr(nfc_playlist->settings.file_path), FSAM_READ, FSOM_OPEN_EXISTING);
-   uint16_t read_count = storage_file_read(file, buffer, MAX_PLAYLIST_SIZE);
-   FuriString* playlist_content = furi_string_alloc();
+   
+   if (storage_file_open(file, furi_string_get_cstr(nfc_playlist->settings.file_path), FSAM_READ, FSOM_OPEN_EXISTING)) {
+      uint8_t buffer[MAX_PLAYLIST_SIZE];
+      uint16_t read_count = storage_file_read(file, buffer, MAX_PLAYLIST_SIZE);
+      FuriString* playlist_content = furi_string_alloc();
 
-   for(uint16_t i = 0; i < read_count; i++) {
-      furi_string_push_back(playlist_content, buffer[i]);
-   }
+      for(uint16_t i = 0; i < read_count; i++) {
+         furi_string_push_back(playlist_content, buffer[i]);
+      }
+
+      widget_add_text_scroll_element(nfc_playlist->widget, 4, 4, 124, 60, furi_string_get_cstr(playlist_content));
+      widget_add_frame_element(nfc_playlist->widget, 0, 0, 128, 64, 0);
 
-   widget_add_text_scroll_element(nfc_playlist->widget, 4, 4, 124, 60, furi_string_get_cstr(playlist_content));
-   widget_add_frame_element(nfc_playlist->widget, 0, 0, 128, 64, 0);
+      furi_string_free(playlist_content);
+      storage_file_close(file);
+   }
 
-   furi_string_free(playlist_content);
-   storage_file_close(file);
    storage_file_free(file);
    furi_record_close(RECORD_STORAGE);
 
-   view_dispatcher_switch_to_view(nfc_playlist->view_dispatcher, NfcPlaylistScene_ViewPlaylistContent);
+   view_dispatcher_switch_to_view(nfc_playlist->view_dispatcher, NfcPlaylistView_Widget);
 }
 
 bool nfc_playlist_view_playlist_content_scene_on_event(void* context, SceneManagerEvent event) {