Sfoglia il codice sorgente

Duplicate detection

Adds an error that shows if you try adding an NFC item that's already in the playlist it will then prompt you with the option to add anyway or choose another one
acegoal07 1 anno fa
parent
commit
0af7f26a80

+ 1 - 0
scenes/nfc_playlist_scene_config.h

@@ -1,4 +1,5 @@
 ADD_SCENE(nfc_playlist, confirm_delete, ConfirmDelete)
+ADD_SCENE(nfc_playlist, nfc_duplicate, NfcDuplicate)
 ADD_SCENE(nfc_playlist, emulation, Emulation)
 ADD_SCENE(nfc_playlist, error_playlist_already_exists, ErrorPlaylistAlreadyExists)
 ADD_SCENE(nfc_playlist, main_menu, MainMenu)

+ 19 - 12
scenes/nfc_playlist_scene_nfc_add.c

@@ -5,6 +5,7 @@ void nfc_playlist_nfc_add_menu_callback(void* context) {
 
    Storage* storage = furi_record_open(RECORD_STORAGE);
    Stream* stream = file_stream_alloc(storage);
+   bool item_already_in_playlist = false;
 
    if(file_stream_open(
          stream,
@@ -14,28 +15,34 @@ void nfc_playlist_nfc_add_menu_callback(void* context) {
       FuriString* line = furi_string_alloc();
       FuriString* tmp_str = furi_string_alloc();
       while(stream_read_line(stream, line)) {
+         if(furi_string_cmp(line, nfc_playlist->file_browser_output) == 0) {
+            item_already_in_playlist = true;
+            break;
+         }
          furi_string_cat_printf(tmp_str, "%s", furi_string_get_cstr(line));
       }
       furi_string_free(line);
-
-      if(!furi_string_empty(tmp_str)) {
-         furi_string_cat_printf(tmp_str, "\n");
+      if(!item_already_in_playlist) {
+         if(!furi_string_empty(tmp_str)) {
+            furi_string_cat(tmp_str, "\n");
+         }
+         furi_string_cat(tmp_str, furi_string_get_cstr(nfc_playlist->file_browser_output));
+         stream_clean(stream);
+         stream_write_string(stream, tmp_str);
+         nfc_playlist->settings.playlist_length++;
+         furi_string_reset(nfc_playlist->file_browser_output);
       }
-      furi_string_cat_printf(
-         tmp_str, "%s", furi_string_get_cstr(nfc_playlist->file_browser_output));
-
-      stream_clean(stream);
-      stream_write_string(stream, tmp_str);
       file_stream_close(stream);
       furi_string_free(tmp_str);
-      nfc_playlist->settings.playlist_length++;
    }
 
    stream_free(stream);
    furi_record_close(RECORD_STORAGE);
-   furi_string_reset(nfc_playlist->file_browser_output);
-
-   scene_manager_previous_scene(nfc_playlist->scene_manager);
+   if(!item_already_in_playlist) {
+      scene_manager_previous_scene(nfc_playlist->scene_manager);
+   } else {
+      scene_manager_next_scene(nfc_playlist->scene_manager, NfcPlaylistScene_NfcDuplicate);
+   }
 }
 
 void nfc_playlist_nfc_add_scene_on_enter(void* context) {

+ 97 - 0
scenes/nfc_playlist_scene_nfc_duplicate.c

@@ -0,0 +1,97 @@
+#include "../nfc_playlist.h"
+
+void nfc_playlist_nfc_duplicate_menu_callback(GuiButtonType result, InputType type, void* context) {
+   NfcPlaylist* nfc_playlist = context;
+   if(type == InputTypeShort) {
+      view_dispatcher_send_custom_event(nfc_playlist->view_dispatcher, result);
+   }
+}
+
+void nfc_playlist_nfc_duplicate_scene_on_enter(void* context) {
+   NfcPlaylist* nfc_playlist = context;
+
+   widget_add_text_box_element(
+      nfc_playlist->widget,
+      0,
+      0,
+      128,
+      23,
+      AlignCenter,
+      AlignCenter,
+      "\e#This item is already\nin the playlist\e#",
+      false);
+   widget_add_button_element(
+      nfc_playlist->widget,
+      GuiButtonTypeLeft,
+      "Try Again",
+      nfc_playlist_nfc_duplicate_menu_callback,
+      nfc_playlist);
+   widget_add_button_element(
+      nfc_playlist->widget,
+      GuiButtonTypeRight,
+      "Continue",
+      nfc_playlist_nfc_duplicate_menu_callback,
+      nfc_playlist);
+
+   view_dispatcher_switch_to_view(nfc_playlist->view_dispatcher, NfcPlaylistView_Widget);
+}
+
+bool nfc_playlist_nfc_duplicate_scene_on_event(void* context, SceneManagerEvent event) {
+   NfcPlaylist* nfc_playlist = context;
+   bool consumed = false;
+   if(event.type == SceneManagerEventTypeCustom) {
+      switch(event.event) {
+      case GuiButtonTypeRight: {
+         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.playlist_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));
+            }
+            furi_string_free(line);
+
+            if(!furi_string_empty(tmp_str)) {
+               furi_string_cat(tmp_str, "\n");
+            }
+            furi_string_cat(tmp_str, furi_string_get_cstr(nfc_playlist->file_browser_output));
+            stream_clean(stream);
+            stream_write_string(stream, tmp_str);
+            nfc_playlist->settings.playlist_length++;
+            furi_string_reset(nfc_playlist->file_browser_output);
+
+            file_stream_close(stream);
+            furi_string_free(tmp_str);
+         }
+         stream_free(stream);
+         furi_record_close(RECORD_STORAGE);
+
+         furi_string_reset(nfc_playlist->file_browser_output);
+         scene_manager_search_and_switch_to_previous_scene(
+            nfc_playlist->scene_manager, NfcPlaylistScene_PlaylistEdit);
+         consumed = true;
+         break;
+      }
+      case GuiButtonTypeLeft:
+         furi_string_reset(nfc_playlist->file_browser_output);
+         scene_manager_previous_scene(nfc_playlist->scene_manager);
+         consumed = true;
+         break;
+      default:
+         break;
+      }
+   }
+   return consumed;
+}
+
+void nfc_playlist_nfc_duplicate_scene_on_exit(void* context) {
+   NfcPlaylist* nfc_playlist = context;
+   widget_reset(nfc_playlist->widget);
+}