Explorar o código

Merge pull request #23 from acegoal07/dev

Dev
acegoal07 hai 1 ano
pai
achega
0dcfd59a72

+ 1 - 1
application.fam

@@ -8,7 +8,7 @@ App(
     fap_category="NFC",
     fap_author="@acegoal07",
     fap_weburl="https://github.com/acegoal07/FlipperZero_NFC_Playlist/tree/main",
-    fap_version="1.8",
+    fap_version="1.9",
     fap_icon="assets/icon.png",
     fap_private_libs=[
         Lib(

+ 1 - 1
nfc_playlist.h

@@ -39,6 +39,7 @@ typedef enum {
 
 typedef struct {
    FuriString* file_path;
+   uint8_t playlist_length;
    bool playlist_selected;
    uint8_t emulate_timeout;
    uint8_t emulate_delay;
@@ -73,7 +74,6 @@ static const bool default_skip_error = false;
 
 #define PLAYLIST_LOCATION "/ext/apps_data/nfc_playlist/"
 #define PLAYLIST_DIR "/ext/apps_data/nfc_playlist"
-#define PLAYLIST_VIEW_MAX_SIZE 1000
 
 typedef enum NfcPlaylistLedState {
    NfcPlaylistLedState_Normal,

+ 1 - 0
scenes/nfc_playlist_scene_config.h

@@ -5,6 +5,7 @@ ADD_SCENE(nfc_playlist, file_rename, FileRename)
 ADD_SCENE(nfc_playlist, main_menu, MainMenu)
 ADD_SCENE(nfc_playlist, name_new_file, NameNewFile)
 ADD_SCENE(nfc_playlist, nfc_select, NfcSelect)
+ADD_SCENE(nfc_playlist, nfc_remove, NfcRemove)
 ADD_SCENE(nfc_playlist, playlist_select, PlaylistSelect)
 ADD_SCENE(nfc_playlist, settings, Settings)
 ADD_SCENE(nfc_playlist, view_playlist_content, ViewPlaylistContent)

+ 3 - 1
scenes/nfc_playlist_scene_emulation.c

@@ -32,7 +32,9 @@ int32_t nfc_playlist_emulation_task(void* context) {
 
          char* file_path = (char*)furi_string_get_cstr(line);
 
-         if (strlen(file_path) <= 1) {continue;}
+         if (strspn(file_path, " \t\n\r") == strlen(file_path)) {
+            continue;
+         }
 
          if (nfc_playlist->settings.emulate_delay > 0 && file_position != 0 && !skip_delay) {
             popup_set_header(nfc_playlist->popup, "Delaying", 64, 10, AlignCenter, AlignTop);

+ 24 - 10
scenes/nfc_playlist_scene_file_edit.c

@@ -4,8 +4,9 @@ typedef enum {
    NfcPlaylistMenuSelection_CreatePlaylist,
    NfcPlaylistMenuSelection_DeletePlaylist,
    NfcPlaylistMenuSelection_RenamePlaylist,
-   NfcPlaylistMenuSelection_ViewPlaylistContent,
-   NfcPlaylistMenuSelection_AddNfcItem
+   NfcPlaylistMenuSelection_AddNfcItem,
+   NfcPlaylistMenuSelection_RemoveNfcItem,
+   NfcPlaylistMenuSelection_ViewPlaylistContent
 } NfcPlaylistFileEditMenuSelection;
 
 void nfc_playlist_file_edit_menu_callback(void* context, uint32_t index) {
@@ -45,8 +46,8 @@ void nfc_playlist_file_edit_scene_on_enter(void* context) {
 
    submenu_add_lockable_item(
       nfc_playlist->submenu,
-      "View Playlist Content",
-      NfcPlaylistMenuSelection_ViewPlaylistContent,
+      "Add NFC Item",
+      NfcPlaylistMenuSelection_AddNfcItem,
       nfc_playlist_file_edit_menu_callback,
       nfc_playlist,
       furi_string_empty(nfc_playlist->settings.file_path),
@@ -54,8 +55,17 @@ void nfc_playlist_file_edit_scene_on_enter(void* context) {
 
    submenu_add_lockable_item(
       nfc_playlist->submenu,
-      "Add NFC Item",
-      NfcPlaylistMenuSelection_AddNfcItem,
+      "Remove NFC Item",
+      NfcPlaylistMenuSelection_RemoveNfcItem,
+      nfc_playlist_file_edit_menu_callback,
+      nfc_playlist,
+      furi_string_empty(nfc_playlist->settings.file_path),
+      "No\nplaylist\nselected");
+
+   submenu_add_lockable_item(
+      nfc_playlist->submenu,
+      "View Playlist Content",
+      NfcPlaylistMenuSelection_ViewPlaylistContent,
       nfc_playlist_file_edit_menu_callback,
       nfc_playlist,
       furi_string_empty(nfc_playlist->settings.file_path),
@@ -81,14 +91,18 @@ bool nfc_playlist_file_edit_scene_on_event(void* context, SceneManagerEvent even
             scene_manager_next_scene(nfc_playlist->scene_manager, NfcPlaylistScene_FileRename);
             consumed = true;
             break;
-         case NfcPlaylistMenuSelection_ViewPlaylistContent:
-            scene_manager_next_scene(nfc_playlist->scene_manager, NfcPlaylistScene_ViewPlaylistContent);
-            consumed = true;
-            break;
          case NfcPlaylistMenuSelection_AddNfcItem:
             scene_manager_next_scene(nfc_playlist->scene_manager, NfcPlaylistScene_NfcSelect);
             consumed = true;
             break;
+         case NfcPlaylistMenuSelection_RemoveNfcItem:
+            scene_manager_next_scene(nfc_playlist->scene_manager, NfcPlaylistScene_NfcRemove);
+            consumed = true;
+            break;
+         case NfcPlaylistMenuSelection_ViewPlaylistContent:
+            scene_manager_next_scene(nfc_playlist->scene_manager, NfcPlaylistScene_ViewPlaylistContent);
+            consumed = true;
+            break;
          default:
             break;
       }

+ 5 - 1
scenes/nfc_playlist_scene_file_rename.c

@@ -33,7 +33,11 @@ void nfc_playlist_file_rename_scene_on_enter(void* context) {
    FuriString* tmp_file_name_furi = furi_string_alloc_set_str(tmp_file_name);
    furi_string_replace(tmp_file_name_furi, ".txt", "");
 
-   nfc_playlist->text_input_output = (char*)furi_string_get_cstr(tmp_file_name_furi);
+   nfc_playlist->text_input_output = (char*)malloc(sizeof(furi_string_get_cstr(tmp_file_name_furi)));
+   strcpy(nfc_playlist->text_input_output, furi_string_get_cstr(tmp_file_name_furi));
+   
+   furi_string_free(tmp_file_name_furi);
+
    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, false);

+ 2 - 0
scenes/nfc_playlist_scene_name_new_file.c

@@ -13,6 +13,8 @@ void nfc_playlist_name_new_file_menu_callback(void* context) {
       furi_string_swap(nfc_playlist->settings.file_path, file_name);
    }
 
+   nfc_playlist->settings.playlist_length = 0;
+   
    storage_file_free(file);
    furi_string_free(file_name);
    furi_record_close(RECORD_STORAGE);

+ 123 - 0
scenes/nfc_playlist_scene_nfc_remove.c

@@ -0,0 +1,123 @@
+#include "../nfc_playlist.h"
+
+typedef enum {
+   NfcPlaylistSettings_LineSelector,
+   NfcPlaylistSettings_RemoveLine
+} NfcPlaylistSettingsMenuSelection;
+
+uint8_t selected_line;
+
+void nfc_playlist_nfc_remove_menu_callback(void* context, uint32_t index) {
+   NfcPlaylist* nfc_playlist = context;
+   scene_manager_handle_custom_event(nfc_playlist->scene_manager, index);
+}
+
+void nfc_playlist_nfc_remove_options_change_callback(VariableItem* item) {
+   NfcPlaylist* nfc_playlist = variable_item_get_context(item);
+
+   uint8_t current_option = variable_item_list_get_selected_item_index(nfc_playlist->variable_item_list);
+   uint8_t option_value_index = variable_item_get_current_value_index(item);
+   FuriString* tmp_str = furi_string_alloc();
+   switch(current_option) {
+      case NfcPlaylistSettings_LineSelector:
+         selected_line = option_value_index + 1;
+         furi_string_printf(tmp_str, "%d", selected_line);
+         variable_item_set_current_value_text(item, furi_string_get_cstr(tmp_str));
+         break;
+      default:
+         break;
+   }
+   furi_string_free(tmp_str);
+}
+
+void nfc_playlist_nfc_remove_scene_on_enter(void* context) {
+   NfcPlaylist* nfc_playlist = context;
+   FuriString* tmp_str = furi_string_alloc();
+
+   selected_line = nfc_playlist->settings.playlist_length;
+
+   variable_item_list_set_header(nfc_playlist->variable_item_list, "Settings");
+
+   VariableItem* Line_selector = variable_item_list_add(
+      nfc_playlist->variable_item_list,
+      "Select Line",
+      nfc_playlist->settings.playlist_length,
+      nfc_playlist_nfc_remove_options_change_callback,
+      nfc_playlist);
+   variable_item_set_current_value_index(Line_selector, nfc_playlist->settings.playlist_length - 1);
+   furi_string_printf(tmp_str, "%d", selected_line);
+   variable_item_set_current_value_text(Line_selector, furi_string_get_cstr(tmp_str));
+   variable_item_set_locked(Line_selector, nfc_playlist->settings.playlist_length == 0 ? true : false, "Playlist\nis empty");
+
+   variable_item_list_add(nfc_playlist->variable_item_list, "Remove Line", 0, NULL, NULL);
+   variable_item_set_locked(variable_item_list_get(nfc_playlist->variable_item_list, NfcPlaylistSettings_RemoveLine), nfc_playlist->settings.playlist_length == 0 ? true : false, "Playlist\nis empty");
+
+   variable_item_list_set_enter_callback(nfc_playlist->variable_item_list, nfc_playlist_nfc_remove_menu_callback, nfc_playlist);
+   furi_string_free(tmp_str);
+
+   view_dispatcher_switch_to_view(nfc_playlist->view_dispatcher, NfcPlaylistView_VariableItemList);
+}
+
+bool nfc_playlist_nfc_remove_scene_on_event(void* context, SceneManagerEvent event) {
+   NfcPlaylist* nfc_playlist = context;
+   bool consumed = false;
+   if (event.type == SceneManagerEventTypeCustom) {
+      switch(event.event) {
+         case NfcPlaylistSettings_RemoveLine:
+            Storage* storage = furi_record_open(RECORD_STORAGE);
+            Stream* stream = file_stream_alloc(storage);
+
+            if (file_stream_open(stream, furi_string_get_cstr(nfc_playlist->settings.file_path), FSAM_READ_WRITE, FSOM_OPEN_EXISTING)) {
+               FuriString* line = furi_string_alloc();
+               FuriString* tmp_str = furi_string_alloc();
+               uint8_t current_line = 0;
+               while(stream_read_line(stream, line)) {
+                  current_line++;
+                  if (current_line != selected_line) {
+                     furi_string_replace_all(line, "\n", "");
+                     if (furi_string_empty(tmp_str)) {
+                        furi_string_cat_printf(tmp_str, "%s", furi_string_get_cstr(line));
+                     } else {
+                        furi_string_cat_printf(tmp_str, "\n%s", furi_string_get_cstr(line));
+                     }
+                  }
+               }
+
+               stream_clean(stream);
+               furi_string_free(line);
+               stream_write_string(stream, tmp_str);
+               furi_string_free(tmp_str);
+               file_stream_close(stream);
+               nfc_playlist->settings.playlist_length--;
+               selected_line = nfc_playlist->settings.playlist_length;
+            }
+            stream_free(stream);
+            furi_record_close(RECORD_STORAGE);
+
+            if (selected_line == 0) {
+               scene_manager_previous_scene(nfc_playlist->scene_manager);
+            } else {
+               FuriString* tmp_str = furi_string_alloc();
+
+               VariableItem* Line_selector = variable_item_list_get(nfc_playlist->variable_item_list, NfcPlaylistSettings_LineSelector);
+               variable_item_set_values_count(Line_selector, nfc_playlist->settings.playlist_length);
+               variable_item_set_current_value_index(Line_selector, selected_line - 1);
+               furi_string_printf(tmp_str, "%d", selected_line);
+               variable_item_set_current_value_text(Line_selector, furi_string_get_cstr(tmp_str));
+
+               furi_string_free(tmp_str);
+            }
+
+            consumed = true;
+            break;
+         default:
+            break;
+      }
+   }
+   return consumed;
+}
+
+void nfc_playlist_nfc_remove_scene_on_exit(void* context) {
+   NfcPlaylist* nfc_playlist = context;
+   variable_item_list_reset(nfc_playlist->variable_item_list);
+}

+ 16 - 16
scenes/nfc_playlist_scene_nfc_select.c

@@ -4,30 +4,30 @@ void nfc_playlist_nfc_select_menu_callback(void* context) {
    NfcPlaylist* nfc_playlist = context;
 
    Storage* storage = furi_record_open(RECORD_STORAGE);
-   File* file = storage_file_alloc(storage);
+   Stream* stream = file_stream_alloc(storage);
 
-   if (storage_file_open(file, furi_string_get_cstr(nfc_playlist->settings.file_path), FSAM_READ_WRITE, FSOM_OPEN_EXISTING)) {
-      uint8_t buffer[PLAYLIST_VIEW_MAX_SIZE];
-      uint16_t read_count = storage_file_read(file, buffer, PLAYLIST_VIEW_MAX_SIZE);
-      FuriString* playlist_content = furi_string_alloc();
-
-      for(uint16_t i = 0; i < read_count; i++) {
-         furi_string_push_back(playlist_content, buffer[i]);
+   if (file_stream_open(stream, furi_string_get_cstr(nfc_playlist->settings.file_path), FSAM_READ_WRITE, FSOM_OPEN_EXISTING)) {
+      FuriString* line = furi_string_alloc();
+      FuriString* tmp_str = furi_string_alloc();
+      while(stream_read_line(stream, line)) {
+         furi_string_cat_printf(tmp_str, "%s", furi_string_get_cstr(line));
       }
 
-      if (read_count > 0) {
-         furi_string_printf(playlist_content, "\n%s", furi_string_get_cstr(nfc_playlist->file_browser_output));
+      if (!furi_string_empty(tmp_str)) {
+         furi_string_cat_printf(tmp_str, "\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));
+         furi_string_printf(tmp_str, "%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));
-
-      furi_string_free(playlist_content);
-      storage_file_close(file);
+      stream_clean(stream);
+      furi_string_free(line);
+      stream_write_string(stream, tmp_str);
+      file_stream_close(stream);
+      furi_string_free(tmp_str);
+      nfc_playlist->settings.playlist_length++;
    }
 
-   storage_file_free(file);
+   stream_free(stream);
    furi_record_close(RECORD_STORAGE);
    furi_string_reset(nfc_playlist->file_browser_output);
 

+ 16 - 0
scenes/nfc_playlist_scene_playlist_select.c

@@ -4,6 +4,22 @@ void nfc_playlist_playlist_select_menu_callback(void* context) {
    NfcPlaylist* nfc_playlist = context;
    furi_string_swap(nfc_playlist->settings.file_path, nfc_playlist->file_browser_output);
    furi_string_reset(nfc_playlist->file_browser_output);
+
+   Storage* storage = furi_record_open(RECORD_STORAGE);
+   Stream* stream = file_stream_alloc(storage);
+
+   if (file_stream_open(stream, furi_string_get_cstr(nfc_playlist->settings.file_path), FSAM_READ, FSOM_OPEN_EXISTING)) {
+      nfc_playlist->settings.playlist_length = 0;
+      FuriString* line = furi_string_alloc();
+      while(stream_read_line(stream, line)) {
+         nfc_playlist->settings.playlist_length++;
+      }
+      furi_string_free(line);
+      file_stream_close(stream);
+   }
+   stream_free(stream);
+   furi_record_close(RECORD_STORAGE);
+
    scene_manager_previous_scene(nfc_playlist->scene_manager);
 }
 

+ 13 - 11
scenes/nfc_playlist_scene_view_playlist_content.c

@@ -4,27 +4,29 @@ void nfc_playlist_view_playlist_content_scene_on_enter(void* context) {
    NfcPlaylist* nfc_playlist = context;
 
    Storage* storage = furi_record_open(RECORD_STORAGE);
-   File* file = storage_file_alloc(storage);
+   Stream* stream = file_stream_alloc(storage);
 
-   if (storage_file_open(file, furi_string_get_cstr(nfc_playlist->settings.file_path), FSAM_READ, FSOM_OPEN_EXISTING)) {
-      uint8_t buffer[PLAYLIST_VIEW_MAX_SIZE];
-      uint16_t read_count = storage_file_read(file, buffer, PLAYLIST_VIEW_MAX_SIZE);
-      FuriString* playlist_content = furi_string_alloc();
+   if (file_stream_open(stream, furi_string_get_cstr(nfc_playlist->settings.file_path), FSAM_READ, FSOM_OPEN_EXISTING)) {
+      FuriString* line = furi_string_alloc();
+      FuriString* tmp_str = furi_string_alloc();
 
-      for(uint16_t i = 0; i < read_count; i++) {
-         furi_string_push_back(playlist_content, buffer[i]);
+      while(stream_read_line(stream, line)) {
+         furi_string_cat_printf(tmp_str, "%s", furi_string_get_cstr(line));
       }
 
-      widget_add_text_scroll_element(nfc_playlist->widget, 4, 4, 124, 60, furi_string_get_cstr(playlist_content));
+      stream_clean(stream);
+      furi_string_free(line);
+      file_stream_close(stream);
+
+      widget_add_text_scroll_element(nfc_playlist->widget, 4, 4, 124, 60, furi_string_get_cstr(tmp_str));
       widget_add_frame_element(nfc_playlist->widget, 0, 0, 128, 64, 0);
 
-      furi_string_free(playlist_content);
-      storage_file_close(file);
+      furi_string_free(tmp_str);
    } else {
       widget_add_text_box_element(nfc_playlist->widget, 0, 0, 128, 64, AlignCenter, AlignCenter, "\eFailed to open playlist\n\nPress back\e", false);
    }
 
-   storage_file_free(file);
+   stream_free(stream);
    furi_record_close(RECORD_STORAGE);
 
    view_dispatcher_switch_to_view(nfc_playlist->view_dispatcher, NfcPlaylistView_Widget);