Просмотр исходного кода

FlipStore - v0.7.2

- Final memory allocation improvements
jblanked 1 год назад
Родитель
Сommit
376da75952

+ 3 - 114
alloc/flip_store_alloc.c

@@ -6,116 +6,27 @@ FlipStoreApp *flip_store_app_alloc()
 
     Gui *gui = furi_record_open(RECORD_GUI);
 
-    // Allocate the text input buffer
-    app->uart_text_input_buffer_size_ssid = 64;
-    app->uart_text_input_buffer_size_pass = 64;
-    if (!easy_flipper_set_buffer(&app->uart_text_input_buffer_ssid, app->uart_text_input_buffer_size_ssid))
-    {
-        return NULL;
-    }
-    if (!easy_flipper_set_buffer(&app->uart_text_input_temp_buffer_ssid, app->uart_text_input_buffer_size_ssid))
-    {
-        return NULL;
-    }
-    if (!easy_flipper_set_buffer(&app->uart_text_input_buffer_pass, app->uart_text_input_buffer_size_pass))
-    {
-        return NULL;
-    }
-    if (!easy_flipper_set_buffer(&app->uart_text_input_temp_buffer_pass, app->uart_text_input_buffer_size_pass))
-    {
-        return NULL;
-    }
-
     // Allocate ViewDispatcher
     if (!easy_flipper_set_view_dispatcher(&app->view_dispatcher, gui, app))
     {
         return NULL;
     }
     view_dispatcher_set_custom_event_callback(app->view_dispatcher, flip_store_custom_event_callback);
+
     // Main view
     if (!easy_flipper_set_view(&app->view_loader, FlipStoreViewLoader, flip_store_loader_draw_callback, NULL, callback_to_submenu_options, &app->view_dispatcher, app))
     {
         return NULL;
     }
     flip_store_loader_init(app->view_loader);
-    if (!easy_flipper_set_widget(&app->widget_result, FlipStoreViewWidgetResult, "Error, try again.", callback_to_submenu_options, &app->view_dispatcher))
-    {
-        return NULL;
-    }
-
-    // Main view
-    if (!easy_flipper_set_view(&app->view_app_info, FlipStoreViewAppInfo, flip_store_view_draw_callback_app_list, flip_store_input_callback, callback_to_app_list, &app->view_dispatcher, app))
-    {
-        return NULL;
-    }
 
-    // Popup
-    if (!easy_flipper_set_popup(&app->popup, FlipStoreViewPopup, "Failed", 0, 0, "You are not connected to Wifi.\n\nIf you have the FlipperHTTP\nflash installed, then update\nyour WiFi credentials.", 0, 10, popup_callback, callback_to_submenu, &app->view_dispatcher, app))
-    {
-        FURI_LOG_E(TAG, "Failed to create popup");
-    }
-
-    // Dialog
-    if (!easy_flipper_set_dialog_ex(
-            &app->dialog_delete,
-            FlipStoreViewAppDelete,
-            "Delete App",
-            0,
-            0,
-            "Are you sure you want to delete this app?",
-            0,
-            10,
-            "No",
-            "Yes",
-            NULL,
-            dialog_delete_callback,
-            callback_to_app_list,
-            &app->view_dispatcher,
-            app))
-    {
-        return NULL;
-    }
-
-    if (!easy_flipper_set_dialog_ex(
-            &app->dialog_firmware,
-            FlipStoreViewFirmwareDialog,
-            "Download Firmware",
-            0,
-            0,
-            "Are you sure you want to\ndownload this firmware?",
-            0,
-            10,
-            "No",
-            "Yes",
-            NULL,
-            dialog_firmware_callback,
-            callback_to_firmware_list,
-            &app->view_dispatcher,
-            app))
-    {
-        return NULL;
-    }
-
-    // Text Input
-    if (!easy_flipper_set_uart_text_input(&app->uart_text_input_ssid, FlipStoreViewTextInputSSID, "Enter SSID", app->uart_text_input_temp_buffer_ssid, app->uart_text_input_buffer_size_ssid, flip_store_text_updated_ssid, callback_to_submenu, &app->view_dispatcher, app))
-    {
-        return NULL;
-    }
-    if (!easy_flipper_set_uart_text_input(&app->uart_text_input_pass, FlipStoreViewTextInputPass, "Enter Password", app->uart_text_input_temp_buffer_pass, app->uart_text_input_buffer_size_pass, flip_store_text_updated_pass, callback_to_submenu, &app->view_dispatcher, app))
-    {
-        return NULL;
-    }
-
-    // Variable Item List
-    if (!easy_flipper_set_variable_item_list(&app->variable_item_list, FlipStoreViewSettings, settings_item_selected, callback_to_submenu, &app->view_dispatcher, app))
+    if (!easy_flipper_set_widget(&app->widget_result, FlipStoreViewWidgetResult, "Error, try again.", callback_to_submenu_options, &app->view_dispatcher))
     {
         return NULL;
     }
-    app->variable_item_ssid = variable_item_list_add(app->variable_item_list, "SSID", 0, NULL, NULL);
-    app->variable_item_pass = variable_item_list_add(app->variable_item_list, "Password", 0, NULL, NULL);
 
     // Submenu
-    if (!easy_flipper_set_submenu(&app->submenu_main, FlipStoreViewSubmenu, "FlipStore v0.7.1", callback_exit_app, &app->view_dispatcher))
+    if (!easy_flipper_set_submenu(&app->submenu_main, FlipStoreViewSubmenu, VERSION_TAG, callback_exit_app, &app->view_dispatcher))
     {
         return NULL;
     }
@@ -153,28 +64,6 @@ FlipStoreApp *flip_store_app_alloc()
     submenu_add_item(app->submenu_app_list, "Tools", FlipStoreSubmenuIndexAppListTools, callback_submenu_choices, app);
     submenu_add_item(app->submenu_app_list, "USB", FlipStoreSubmenuIndexAppListUSB, callback_submenu_choices, app);
     //
-    // dont add any items to the app list submenu of each category yet
-
-    // load settings
-    if (load_settings(app->uart_text_input_buffer_ssid, app->uart_text_input_buffer_size_ssid, app->uart_text_input_buffer_pass, app->uart_text_input_buffer_size_pass))
-    {
-        // Update variable items
-        if (app->variable_item_ssid)
-            variable_item_set_current_value_text(app->variable_item_ssid, app->uart_text_input_buffer_ssid);
-        // do not display the password
-
-        // Copy items into their temp buffers with safety checks
-        if (app->uart_text_input_buffer_ssid && app->uart_text_input_temp_buffer_ssid)
-        {
-            strncpy(app->uart_text_input_temp_buffer_ssid, app->uart_text_input_buffer_ssid, app->uart_text_input_buffer_size_ssid - 1);
-            app->uart_text_input_temp_buffer_ssid[app->uart_text_input_buffer_size_ssid - 1] = '\0';
-        }
-        if (app->uart_text_input_buffer_pass && app->uart_text_input_temp_buffer_pass)
-        {
-            strncpy(app->uart_text_input_temp_buffer_pass, app->uart_text_input_buffer_pass, app->uart_text_input_buffer_size_pass - 1);
-            app->uart_text_input_temp_buffer_pass[app->uart_text_input_buffer_size_pass - 1] = '\0';
-        }
-    }
 
     // Switch to the main view
     view_dispatcher_switch_to_view(app->view_dispatcher, FlipStoreViewSubmenu);

+ 1 - 1
application.fam

@@ -10,5 +10,5 @@ App(
     fap_description="Download apps via WiFi directly to your Flipper Zero",
     fap_author="JBlanked",
     fap_weburl="https://github.com/jblanked/FlipStore",
-    fap_version="0.7.1",
+    fap_version="0.7.2",
 )

+ 3 - 34
apps/flip_store_apps.c

@@ -26,47 +26,16 @@ char *categories[] = {
 
 FlipStoreAppInfo *flip_catalog_alloc()
 {
-    FlipStoreAppInfo *app_catalog = (FlipStoreAppInfo *)malloc(MAX_APP_COUNT * sizeof(FlipStoreAppInfo));
+    FlipStoreAppInfo *app_catalog = malloc(MAX_APP_COUNT * sizeof(FlipStoreAppInfo));
     if (!app_catalog)
     {
         FURI_LOG_E(TAG, "Failed to allocate memory for flip_catalog.");
         return NULL;
     }
-    for (int i = 0; i < MAX_APP_COUNT; i++)
-    {
-        app_catalog[i].app_name = (char *)malloc(MAX_APP_NAME_LENGTH * sizeof(char));
-        if (!app_catalog[i].app_name)
-        {
-            FURI_LOG_E(TAG, "Failed to allocate memory for app_name.");
-            return NULL;
-        }
-        app_catalog[i].app_id = (char *)malloc(MAX_APP_NAME_LENGTH * sizeof(char));
-        if (!app_catalog[i].app_id)
-        {
-            FURI_LOG_E(TAG, "Failed to allocate memory for app_id.");
-            return NULL;
-        }
-        app_catalog[i].app_build_id = (char *)malloc(MAX_ID_LENGTH * sizeof(char));
-        if (!app_catalog[i].app_build_id)
-        {
-            FURI_LOG_E(TAG, "Failed to allocate memory for app_build_id.");
-            return NULL;
-        }
-        app_catalog[i].app_version = (char *)malloc(MAX_APP_VERSION_LENGTH * sizeof(char));
-        if (!app_catalog[i].app_version)
-        {
-            FURI_LOG_E(TAG, "Failed to allocate memory for app_version.");
-            return NULL;
-        }
-        app_catalog[i].app_description = (char *)malloc(MAX_APP_DESCRIPTION_LENGTH * sizeof(char));
-        if (!app_catalog[i].app_description)
-        {
-            FURI_LOG_E(TAG, "Failed to allocate memory for app_description.");
-            return NULL;
-        }
-    }
+    // No need for a loop since all memory is allocated in one block
     return app_catalog;
 }
+
 void flip_catalog_free()
 {
     if (flip_catalog)

+ 5 - 5
apps/flip_store_apps.h

@@ -17,11 +17,11 @@ extern char *categories[];
 
 typedef struct
 {
-    char *app_name;
-    char *app_id;
-    char *app_build_id;
-    char *app_version;
-    char *app_description;
+    char app_name[MAX_APP_NAME_LENGTH];
+    char app_id[MAX_APP_NAME_LENGTH];
+    char app_build_id[MAX_ID_LENGTH];
+    char app_version[MAX_APP_VERSION_LENGTH];
+    char app_description[MAX_APP_DESCRIPTION_LENGTH];
 } FlipStoreAppInfo;
 
 extern FlipStoreAppInfo *flip_catalog;

+ 3 - 0
assets/CHANGELOG.md

@@ -1,3 +1,6 @@
+## v0.7.2
+- Final memory allocation improvements
+
 ## v0.7.1
 - Improved memory allocation
 - Fixed a crash when re-entering the same app list  

+ 422 - 112
callback/flip_store_callback.c

@@ -12,6 +12,7 @@
 
 bool flip_store_app_does_exist = false;
 uint32_t selected_firmware_index = 0;
+static uint32_t callback_to_app_category_list(void *context);
 
 static bool flip_store_dl_app_fetch(DataLoaderModel *model)
 {
@@ -31,7 +32,7 @@ static char *flip_store_dl_app_parse(DataLoaderModel *model)
 }
 static void flip_store_dl_app_switch_to_view(FlipStoreApp *app)
 {
-    flip_store_generic_switch_to_view(app, flip_catalog[app_selected_index].app_name, flip_store_dl_app_fetch, flip_store_dl_app_parse, 1, callback_to_app_list, FlipStoreViewLoader);
+    flip_store_generic_switch_to_view(app, flip_catalog[app_selected_index].app_name, flip_store_dl_app_fetch, flip_store_dl_app_parse, 1, callback_to_app_category_list, FlipStoreViewLoader);
 }
 //
 static bool flip_store_fetch_app_list(DataLoaderModel *model)
@@ -186,7 +187,7 @@ static char *flip_store_parse_firmware(DataLoaderModel *model)
 }
 static void flip_store_switch_to_firmware_list(FlipStoreApp *app)
 {
-    flip_store_generic_switch_to_view(app, firmwares[selected_firmware_index].name, flip_store_fetch_firmware, flip_store_parse_firmware, FIRMWARE_LINKS, callback_to_submenu, FlipStoreViewLoader);
+    flip_store_generic_switch_to_view(app, firmwares[selected_firmware_index].name, flip_store_fetch_firmware, flip_store_parse_firmware, FIRMWARE_LINKS, callback_to_firmware_list, FlipStoreViewLoader);
 }
 
 // Function to draw the message on the canvas with word wrapping
@@ -255,8 +256,8 @@ void flip_store_view_draw_callback_app_list(Canvas *canvas, void *model)
     UNUSED(model);
     canvas_clear(canvas);
     canvas_set_font(canvas, FontPrimary);
-    char title[30];
-    snprintf(title, 30, "%s (v.%s)", flip_catalog[app_selected_index].app_name, flip_catalog[app_selected_index].app_version);
+    char title[64];
+    snprintf(title, 64, "%s (v.%s)", flip_catalog[app_selected_index].app_name, flip_catalog[app_selected_index].app_version);
     canvas_draw_str(canvas, 0, 10, title);
     canvas_set_font(canvas, FontSecondary);
     draw_description(canvas, flip_catalog[app_selected_index].app_description, 0, 13);
@@ -304,7 +305,7 @@ bool flip_store_input_callback(InputEvent *event, void *context)
         if (event->key == InputKeyBack)
         {
             // Back button clicked, switch to the previous view.
-            view_dispatcher_switch_to_view(app->view_dispatcher, FlipStoreViewAppList);
+            view_dispatcher_switch_to_view(app->view_dispatcher, FlipStoreViewAppListCategory);
             return true;
         }
     }
@@ -322,27 +323,45 @@ void flip_store_text_updated_ssid(void *context)
     }
 
     // store the entered text
-    strncpy(app->uart_text_input_buffer_ssid, app->uart_text_input_temp_buffer_ssid, app->uart_text_input_buffer_size_ssid);
+    strncpy(app->uart_text_input_buffer, app->uart_text_input_temp_buffer, app->uart_text_input_buffer_size);
 
     // Ensure null-termination
-    app->uart_text_input_buffer_ssid[app->uart_text_input_buffer_size_ssid - 1] = '\0';
+    app->uart_text_input_buffer[app->uart_text_input_buffer_size - 1] = '\0';
+
+    // save the setting
+    save_char("WiFi-SSID", app->uart_text_input_buffer);
 
     // update the variable item text
     if (app->variable_item_ssid)
     {
-        variable_item_set_current_value_text(app->variable_item_ssid, app->uart_text_input_buffer_ssid);
-    }
-
-    // save the settings
-    save_settings(app->uart_text_input_buffer_ssid, app->uart_text_input_buffer_pass);
+        variable_item_set_current_value_text(app->variable_item_ssid, app->uart_text_input_buffer);
 
-    // if SSID and PASS are not empty, connect to the WiFi
-    if (strlen(app->uart_text_input_buffer_ssid) > 0 && strlen(app->uart_text_input_buffer_pass) > 0)
-    {
-        // save wifi settings
-        if (!flipper_http_save_wifi(app->uart_text_input_buffer_ssid, app->uart_text_input_buffer_pass))
+        // get value of password
+        char pass[64];
+        if (load_char("WiFi-Password", pass, sizeof(pass)))
         {
-            FURI_LOG_E(TAG, "Failed to save WiFi settings");
+            if (strlen(pass) > 0 && strlen(app->uart_text_input_buffer) > 0)
+            {
+                // save the settings
+                save_settings(app->uart_text_input_buffer, pass);
+
+                // initialize the http
+                if (flipper_http_init(flipper_http_rx_callback, app))
+                {
+                    // save the wifi if the device is connected
+                    if (!flipper_http_save_wifi(app->uart_text_input_buffer, pass))
+                    {
+                        easy_flipper_dialog("FlipperHTTP Error", "Ensure your WiFi Developer\nBoard or Pico W is connected\nand the latest FlipperHTTP\nfirmware is installed.");
+                    }
+
+                    // free the resources
+                    flipper_http_deinit();
+                }
+                else
+                {
+                    easy_flipper_dialog("FlipperHTTP Error", "The UART is likely busy.\nEnsure you have the correct\nflash for your board then\nrestart your Flipper Zero.");
+                }
+            }
         }
     }
 
@@ -359,27 +378,45 @@ void flip_store_text_updated_pass(void *context)
     }
 
     // store the entered text
-    strncpy(app->uart_text_input_buffer_pass, app->uart_text_input_temp_buffer_pass, app->uart_text_input_buffer_size_pass);
+    strncpy(app->uart_text_input_buffer, app->uart_text_input_temp_buffer, app->uart_text_input_buffer_size);
 
     // Ensure null-termination
-    app->uart_text_input_buffer_pass[app->uart_text_input_buffer_size_pass - 1] = '\0';
+    app->uart_text_input_buffer[app->uart_text_input_buffer_size - 1] = '\0';
+
+    // save the setting
+    save_char("WiFi-Password", app->uart_text_input_buffer);
 
     // update the variable item text
     if (app->variable_item_pass)
     {
-        variable_item_set_current_value_text(app->variable_item_pass, app->uart_text_input_buffer_pass);
+        // variable_item_set_current_value_text(app->variable_item_pass, app->uart_text_input_buffer);
     }
 
-    // save the settings
-    save_settings(app->uart_text_input_buffer_ssid, app->uart_text_input_buffer_pass);
-
-    // if SSID and PASS are not empty, connect to the WiFi
-    if (strlen(app->uart_text_input_buffer_ssid) > 0 && strlen(app->uart_text_input_buffer_pass) > 0)
+    // get value of ssid
+    char ssid[64];
+    if (load_char("WiFi-SSID", ssid, sizeof(ssid)))
     {
-        // save wifi settings
-        if (!flipper_http_save_wifi(app->uart_text_input_buffer_ssid, app->uart_text_input_buffer_pass))
+        if (strlen(ssid) > 0 && strlen(app->uart_text_input_buffer) > 0)
         {
-            FURI_LOG_E(TAG, "Failed to save WiFi settings");
+            // save the settings
+            save_settings(ssid, app->uart_text_input_buffer);
+
+            // initialize the http
+            if (flipper_http_init(flipper_http_rx_callback, app))
+            {
+                // save the wifi if the device is connected
+                if (!flipper_http_save_wifi(ssid, app->uart_text_input_buffer))
+                {
+                    easy_flipper_dialog("FlipperHTTP Error", "Ensure your WiFi Developer\nBoard or Pico W is connected\nand the latest FlipperHTTP\nfirmware is installed.");
+                }
+
+                // free the resources
+                flipper_http_deinit();
+            }
+            else
+            {
+                easy_flipper_dialog("FlipperHTTP Error", "The UART is likely busy.\nEnsure you have the correct\nflash for your board then\nrestart your Flipper Zero.");
+            }
         }
     }
 
@@ -389,11 +426,6 @@ void flip_store_text_updated_pass(void *context)
 
 uint32_t callback_to_submenu(void *context)
 {
-    if (!context)
-    {
-        FURI_LOG_E(TAG, "Context is NULL");
-        return VIEW_NONE;
-    }
     UNUSED(context);
     firmware_free();
     return FlipStoreViewSubmenu;
@@ -401,11 +433,6 @@ uint32_t callback_to_submenu(void *context)
 
 uint32_t callback_to_submenu_options(void *context)
 {
-    if (!context)
-    {
-        FURI_LOG_E(TAG, "Context is NULL");
-        return VIEW_NONE;
-    }
     UNUSED(context);
     firmware_free();
     return FlipStoreViewSubmenuOptions;
@@ -413,11 +440,6 @@ uint32_t callback_to_submenu_options(void *context)
 
 uint32_t callback_to_firmware_list(void *context)
 {
-    if (!context)
-    {
-        FURI_LOG_E(TAG, "Context is NULL");
-        return VIEW_NONE;
-    }
     UNUSED(context);
     sent_firmware_request = false;
     sent_firmware_request_2 = false;
@@ -432,14 +454,13 @@ uint32_t callback_to_firmware_list(void *context)
     firmware_download_success_3 = false;
     return FlipStoreViewFirmwares;
 }
-
+static uint32_t callback_to_app_category_list(void *context)
+{
+    UNUSED(context);
+    return FlipStoreViewAppListCategory;
+}
 uint32_t callback_to_app_list(void *context)
 {
-    if (!context)
-    {
-        FURI_LOG_E(TAG, "Context is NULL");
-        return VIEW_NONE;
-    }
     UNUSED(context);
     flip_store_sent_request = false;
     flip_store_success = false;
@@ -450,7 +471,13 @@ uint32_t callback_to_app_list(void *context)
     return FlipStoreViewAppList;
 }
 
-void settings_item_selected(void *context, uint32_t index)
+static uint32_t callback_to_wifi_settings(void *context)
+{
+    UNUSED(context);
+    return FlipStoreViewSettings;
+}
+
+void dialog_delete_callback(DialogExResult result, void *context)
 {
     FlipStoreApp *app = (FlipStoreApp *)context;
     if (!app)
@@ -458,24 +485,6 @@ void settings_item_selected(void *context, uint32_t index)
         FURI_LOG_E(TAG, "FlipStoreApp is NULL");
         return;
     }
-    switch (index)
-    {
-    case 0: // Input SSID
-        view_dispatcher_switch_to_view(app->view_dispatcher, FlipStoreViewTextInputSSID);
-        break;
-    case 1: // Input Password
-        view_dispatcher_switch_to_view(app->view_dispatcher, FlipStoreViewTextInputPass);
-        break;
-    default:
-        FURI_LOG_E(TAG, "Unknown configuration item index");
-        break;
-    }
-}
-
-void dialog_delete_callback(DialogExResult result, void *context)
-{
-    furi_assert(context);
-    FlipStoreApp *app = (FlipStoreApp *)context;
     if (result == DialogExResultLeft) // No
     {
         view_dispatcher_switch_to_view(app->view_dispatcher, FlipStoreViewAppList);
@@ -486,18 +495,14 @@ void dialog_delete_callback(DialogExResult result, void *context)
         if (!delete_app(flip_catalog[app_selected_index].app_id, categories[flip_store_category_index]))
         {
             // pop up a message
-            popup_set_header(app->popup, "[ERROR]", 0, 0, AlignLeft, AlignTop);
-            popup_set_text(app->popup, "Issue deleting app.", 0, 50, AlignLeft, AlignTop);
-            view_dispatcher_switch_to_view(app->view_dispatcher, FlipStoreViewPopup);
+            easy_flipper_dialog("Error", "Issue deleting app.");
             furi_delay_ms(2000); // delay for 2 seconds
             view_dispatcher_switch_to_view(app->view_dispatcher, FlipStoreViewAppList);
         }
         else
         {
             // pop up a message
-            popup_set_header(app->popup, "[SUCCESS]", 0, 0, AlignLeft, AlignTop);
-            popup_set_text(app->popup, "App deleted successfully.", 0, 50, AlignLeft, AlignTop);
-            view_dispatcher_switch_to_view(app->view_dispatcher, FlipStoreViewPopup);
+            easy_flipper_dialog("Success", "App deleted successfully.");
             furi_delay_ms(2000); // delay for 2 seconds
             view_dispatcher_switch_to_view(app->view_dispatcher, FlipStoreViewAppList);
         }
@@ -506,8 +511,12 @@ void dialog_delete_callback(DialogExResult result, void *context)
 
 void dialog_firmware_callback(DialogExResult result, void *context)
 {
-    furi_assert(context);
     FlipStoreApp *app = (FlipStoreApp *)context;
+    if (!app)
+    {
+        FURI_LOG_E(TAG, "FlipStoreApp is NULL");
+        return;
+    }
     if (result == DialogExResultLeft) // No
     {
         // switch to the firmware list
@@ -520,16 +529,6 @@ void dialog_firmware_callback(DialogExResult result, void *context)
     }
 }
 
-void popup_callback(void *context)
-{
-    FlipStoreApp *app = (FlipStoreApp *)context;
-    if (!app)
-    {
-        FURI_LOG_E(TAG, "FlipStoreApp is NULL");
-        return;
-    }
-    view_dispatcher_switch_to_view(app->view_dispatcher, FlipStoreViewSubmenu);
-}
 static bool alloc_about_view(FlipStoreApp *app)
 {
     if (!app)
@@ -537,10 +536,10 @@ static bool alloc_about_view(FlipStoreApp *app)
         FURI_LOG_E(TAG, "FlipStoreApp is NULL");
         return false;
     }
-    if (!app->widget)
+    if (!app->widget_about)
     {
         if (!easy_flipper_set_widget(
-                &app->widget,
+                &app->widget_about,
                 FlipStoreViewAbout,
                 "Welcome to the FlipStore!\n------\nDownload apps via WiFi and\nrun them on your Flipper!\n------\nwww.github.com/jblanked",
                 callback_to_submenu,
@@ -548,7 +547,7 @@ static bool alloc_about_view(FlipStoreApp *app)
         {
             return false;
         }
-        if (!app->widget)
+        if (!app->widget_about)
         {
             return false;
         }
@@ -563,29 +562,275 @@ static void free_about_view()
         FURI_LOG_E(TAG, "FlipStoreApp is NULL");
         return;
     }
-    if (app_instance->widget != NULL)
+    if (app_instance->widget_about != NULL)
     {
         view_dispatcher_remove_view(app_instance->view_dispatcher, FlipStoreViewAbout);
-        widget_free(app_instance->widget);
-        app_instance->widget = NULL;
+        widget_free(app_instance->widget_about);
+        app_instance->widget_about = NULL;
+    }
+}
+static bool alloc_text_input_view(void *context, char *title)
+{
+    FlipStoreApp *app = (FlipStoreApp *)context;
+    if (!app)
+    {
+        FURI_LOG_E(TAG, "FlipStoreApp is NULL");
+        return false;
+    }
+    if (!title)
+    {
+        FURI_LOG_E(TAG, "Title is NULL");
+        return false;
+    }
+    app->uart_text_input_buffer_size = 64;
+    if (!app->uart_text_input_buffer)
+    {
+        if (!easy_flipper_set_buffer(&app->uart_text_input_buffer, app->uart_text_input_buffer_size))
+        {
+            return false;
+        }
+    }
+    if (!app->uart_text_input_temp_buffer)
+    {
+        if (!easy_flipper_set_buffer(&app->uart_text_input_temp_buffer, app->uart_text_input_buffer_size))
+        {
+            return false;
+        }
+    }
+    if (!app->uart_text_input)
+    {
+        if (!easy_flipper_set_uart_text_input(
+                &app->uart_text_input,
+                FlipStoreViewTextInput,
+                title,
+                app->uart_text_input_temp_buffer,
+                app->uart_text_input_buffer_size,
+                strcmp(title, "SSID") == 0 ? flip_store_text_updated_ssid : flip_store_text_updated_pass,
+                callback_to_wifi_settings,
+                &app->view_dispatcher,
+                app))
+        {
+            return false;
+        }
+        if (!app->uart_text_input)
+        {
+            return false;
+        }
+        char ssid[64];
+        char pass[64];
+        if (load_settings(ssid, sizeof(ssid), pass, sizeof(pass)))
+        {
+            if (strcmp(title, "SSID") == 0)
+            {
+                strncpy(app->uart_text_input_temp_buffer, ssid, app->uart_text_input_buffer_size);
+            }
+            else
+            {
+                strncpy(app->uart_text_input_temp_buffer, pass, app->uart_text_input_buffer_size);
+            }
+        }
     }
+    return true;
 }
-static void free_all_views()
+static void free_text_input_view(void *context)
+{
+    FlipStoreApp *app = (FlipStoreApp *)context;
+    if (!app)
+    {
+        FURI_LOG_E(TAG, "FlipStoreApp is NULL");
+        return;
+    }
+    if (app->uart_text_input)
+    {
+        view_dispatcher_remove_view(app->view_dispatcher, FlipStoreViewTextInput);
+        uart_text_input_free(app->uart_text_input);
+        app->uart_text_input = NULL;
+    }
+    if (app->uart_text_input_buffer)
+    {
+        free(app->uart_text_input_buffer);
+        app->uart_text_input_buffer = NULL;
+    }
+    if (app->uart_text_input_temp_buffer)
+    {
+        free(app->uart_text_input_temp_buffer);
+        app->uart_text_input_temp_buffer = NULL;
+    }
+}
+static bool alloc_variable_item_list(void *context)
+{
+    FlipStoreApp *app = (FlipStoreApp *)context;
+    if (!app)
+    {
+        FURI_LOG_E(TAG, "FlipStoreApp is NULL");
+        return false;
+    }
+    if (!app->variable_item_list)
+    {
+        if (!easy_flipper_set_variable_item_list(&app->variable_item_list, FlipStoreViewSettings, settings_item_selected, callback_to_submenu, &app->view_dispatcher, app))
+            return false;
+
+        if (!app->variable_item_list)
+            return false;
+
+        if (!app->variable_item_ssid)
+        {
+            app->variable_item_ssid = variable_item_list_add(app->variable_item_list, "SSID", 0, NULL, NULL);
+            variable_item_set_current_value_text(app->variable_item_ssid, "");
+        }
+        if (!app->variable_item_pass)
+        {
+            app->variable_item_pass = variable_item_list_add(app->variable_item_list, "Password", 0, NULL, NULL);
+            variable_item_set_current_value_text(app->variable_item_pass, "");
+        }
+        char ssid[64];
+        char pass[64];
+        if (load_settings(ssid, sizeof(ssid), pass, sizeof(pass)))
+        {
+            variable_item_set_current_value_text(app->variable_item_ssid, ssid);
+            // variable_item_set_current_value_text(app->variable_item_pass, pass);
+            save_char("WiFi-SSID", ssid);
+            save_char("WiFi-Password", pass);
+        }
+    }
+    return true;
+}
+static void free_variable_item_list()
+{
+    if (!app_instance)
+    {
+        FURI_LOG_E(TAG, "FlipStoreApp is NULL");
+        return;
+    }
+    if (app_instance->variable_item_list)
+    {
+        view_dispatcher_remove_view(app_instance->view_dispatcher, FlipStoreViewSettings);
+        variable_item_list_free(app_instance->variable_item_list);
+        app_instance->variable_item_list = NULL;
+    }
+    if (app_instance->variable_item_ssid)
+    {
+        free(app_instance->variable_item_ssid);
+        app_instance->variable_item_ssid = NULL;
+    }
+    if (app_instance->variable_item_pass)
+    {
+        free(app_instance->variable_item_pass);
+        app_instance->variable_item_pass = NULL;
+    }
+}
+static bool alloc_dialog_firmware(void *context)
+{
+    FlipStoreApp *app = (FlipStoreApp *)context;
+    if (!app->dialog_firmware)
+    {
+        if (!easy_flipper_set_dialog_ex(
+                &app->dialog_firmware,
+                FlipStoreViewFirmwareDialog,
+                "Download Firmware",
+                0,
+                0,
+                "Are you sure you want to\ndownload this firmware?",
+                0,
+                10,
+                "No",
+                "Yes",
+                NULL,
+                dialog_firmware_callback,
+                callback_to_firmware_list,
+                &app->view_dispatcher,
+                app))
+        {
+            return false;
+        }
+        if (!app->dialog_firmware)
+        {
+            return false;
+        }
+        dialog_ex_set_header(app->dialog_firmware, firmwares[selected_firmware_index].name, 0, 0, AlignLeft, AlignTop);
+    }
+    return true;
+}
+static void free_dialog_firmware(void *context)
+{
+    FlipStoreApp *app = (FlipStoreApp *)context;
+    if (!app)
+    {
+        FURI_LOG_E(TAG, "FlipStoreApp is NULL");
+        return;
+    }
+    if (app->dialog_firmware)
+    {
+        view_dispatcher_remove_view(app->view_dispatcher, FlipStoreViewFirmwareDialog);
+        dialog_ex_free(app->dialog_firmware);
+        app->dialog_firmware = NULL;
+    }
+}
+static bool alloc_app_info_view(void *context)
+{
+    FlipStoreApp *app = (FlipStoreApp *)context;
+    if (!app)
+    {
+        FURI_LOG_E(TAG, "FlipStoreApp is NULL");
+        return false;
+    }
+    if (!app->view_app_info)
+    {
+        if (!easy_flipper_set_view(
+                &app->view_app_info,
+                FlipStoreViewAppInfo,
+                flip_store_view_draw_callback_app_list,
+                flip_store_input_callback,
+                callback_to_app_category_list,
+                &app->view_dispatcher,
+                app))
+        {
+            return false;
+        }
+        if (!app->view_app_info)
+        {
+            return false;
+        }
+    }
+    return true;
+}
+static void free_app_info_view(void *context)
+{
+    FlipStoreApp *app = (FlipStoreApp *)context;
+    if (!app)
+    {
+        FURI_LOG_E(TAG, "FlipStoreApp is NULL");
+        return;
+    }
+    if (app->view_app_info)
+    {
+        view_dispatcher_remove_view(app->view_dispatcher, FlipStoreViewAppInfo);
+        view_free(app->view_app_info);
+        app->view_app_info = NULL;
+    }
+}
+static void free_all_views(bool should_free_variable_item_list)
 {
     free_about_view();
-    // clear app list views
+    flip_catalog_free();
+    if (should_free_variable_item_list)
+    {
+        free_variable_item_list();
+    }
     if (app_instance->submenu_app_list_category)
     {
         view_dispatcher_remove_view(app_instance->view_dispatcher, FlipStoreViewAppListCategory);
         submenu_free(app_instance->submenu_app_list_category);
         app_instance->submenu_app_list_category = NULL;
     }
+    free_text_input_view(app_instance);
+    free_dialog_firmware(app_instance);
+    free_app_info_view(app_instance);
 }
-
 uint32_t callback_exit_app(void *context)
 {
     UNUSED(context);
-    free_all_views();
+    free_all_views(true);
     return VIEW_NONE; // Return VIEW_NONE to exit the app
 }
 
@@ -601,7 +846,7 @@ void callback_submenu_choices(void *context, uint32_t index)
     switch (index)
     {
     case FlipStoreSubmenuIndexAbout:
-        free_all_views();
+        free_all_views(true);
         if (!alloc_about_view(app))
         {
             FURI_LOG_E(TAG, "Failed to set about view");
@@ -610,9 +855,16 @@ void callback_submenu_choices(void *context, uint32_t index)
         view_dispatcher_switch_to_view(app->view_dispatcher, FlipStoreViewAbout);
         break;
     case FlipStoreSubmenuIndexSettings:
+        free_all_views(true);
+        if (!alloc_variable_item_list(app))
+        {
+            FURI_LOG_E(TAG, "Failed to allocate variable item list");
+            return;
+        }
         view_dispatcher_switch_to_view(app->view_dispatcher, FlipStoreViewSettings);
         break;
     case FlipStoreSubmenuIndexOptions:
+        free_all_views(true);
         view_dispatcher_switch_to_view(app->view_dispatcher, FlipStoreViewSubmenuOptions);
         break;
     case FlipStoreSubmenuIndexAppList:
@@ -641,67 +893,67 @@ void callback_submenu_choices(void *context, uint32_t index)
         view_dispatcher_switch_to_view(app->view_dispatcher, FlipStoreViewFirmwares);
         break;
     case FlipStoreSubmenuIndexAppListBluetooth:
-        free_all_views();
+        free_all_views(true);
         flip_store_category_index = 0;
         flip_store_app_does_exist = false;
         flip_store_switch_to_app_list(app);
         break;
     case FlipStoreSubmenuIndexAppListGames:
-        free_all_views();
+        free_all_views(true);
         flip_store_category_index = 1;
         flip_store_app_does_exist = false;
         flip_store_switch_to_app_list(app);
         break;
     case FlipStoreSubmenuIndexAppListGPIO:
-        free_all_views();
+        free_all_views(true);
         flip_store_category_index = 2;
         flip_store_app_does_exist = false;
         flip_store_switch_to_app_list(app);
         break;
     case FlipStoreSubmenuIndexAppListInfrared:
-        free_all_views();
+        free_all_views(true);
         flip_store_category_index = 3;
         flip_store_app_does_exist = false;
         flip_store_switch_to_app_list(app);
         break;
     case FlipStoreSubmenuIndexAppListiButton:
-        free_all_views();
+        free_all_views(true);
         flip_store_category_index = 4;
         flip_store_app_does_exist = false;
         flip_store_switch_to_app_list(app);
         break;
     case FlipStoreSubmenuIndexAppListMedia:
-        free_all_views();
+        free_all_views(true);
         flip_store_category_index = 5;
         flip_store_app_does_exist = false;
         flip_store_switch_to_app_list(app);
         break;
     case FlipStoreSubmenuIndexAppListNFC:
-        free_all_views();
+        free_all_views(true);
         flip_store_category_index = 6;
         flip_store_app_does_exist = false;
         flip_store_switch_to_app_list(app);
         break;
     case FlipStoreSubmenuIndexAppListRFID:
-        free_all_views();
+        free_all_views(true);
         flip_store_category_index = 7;
         flip_store_app_does_exist = false;
         flip_store_switch_to_app_list(app);
         break;
     case FlipStoreSubmenuIndexAppListSubGHz:
-        free_all_views();
+        free_all_views(true);
         flip_store_category_index = 8;
         flip_store_app_does_exist = false;
         flip_store_switch_to_app_list(app);
         break;
     case FlipStoreSubmenuIndexAppListTools:
-        free_all_views();
+        free_all_views(true);
         flip_store_category_index = 9;
         flip_store_app_does_exist = false;
         flip_store_switch_to_app_list(app);
         break;
     case FlipStoreSubmenuIndexAppListUSB:
-        free_all_views();
+        free_all_views(true);
         flip_store_category_index = 10;
         flip_store_app_does_exist = false;
         flip_store_switch_to_app_list(app);
@@ -720,15 +972,18 @@ void callback_submenu_choices(void *context, uint32_t index)
                 selected_firmware_index = firmware_index;
 
                 // Switch to the firmware download view
-                dialog_ex_set_header(app->dialog_firmware, firmwares[firmware_index].name, 0, 0, AlignLeft, AlignTop);
+                free_all_views(true);
+                if (!alloc_dialog_firmware(app))
+                {
+                    FURI_LOG_E(TAG, "Failed to allocate dialog firmware");
+                    return;
+                }
                 view_dispatcher_switch_to_view(app->view_dispatcher, FlipStoreViewFirmwareDialog);
             }
             else
             {
                 FURI_LOG_E(TAG, "Invalid firmware index");
-                popup_set_header(app->popup, "[ERROR]", 0, 0, AlignLeft, AlignTop);
-                popup_set_text(app->popup, "Issue parsing firmwarex", 0, 50, AlignLeft, AlignTop);
-                view_dispatcher_switch_to_view(app->view_dispatcher, FlipStoreViewPopup);
+                easy_flipper_dialog("Error", "Issue parsing firmware.");
             }
         }
         // Check if the index is within the app list range
@@ -748,6 +1003,12 @@ void callback_submenu_choices(void *context, uint32_t index)
                 {
                     app_selected_index = app_index;
                     flip_store_app_does_exist = app_exists(flip_catalog[app_selected_index].app_id, categories[flip_store_category_index]);
+                    free_app_info_view(app);
+                    if (!alloc_app_info_view(app))
+                    {
+                        FURI_LOG_E(TAG, "Failed to allocate app info view");
+                        return;
+                    }
                     view_dispatcher_switch_to_view(app->view_dispatcher, FlipStoreViewAppInfo);
                 }
                 else
@@ -768,6 +1029,55 @@ void callback_submenu_choices(void *context, uint32_t index)
     }
 }
 
+void settings_item_selected(void *context, uint32_t index)
+{
+    FlipStoreApp *app = (FlipStoreApp *)context;
+    if (!app)
+    {
+        FURI_LOG_E(TAG, "FlipStoreApp is NULL");
+        return;
+    }
+    char ssid[64];
+    char pass[64];
+    switch (index)
+    {
+    case 0: // Input SSID
+        // Text Input
+        free_all_views(false);
+        if (!alloc_text_input_view(app, "SSID"))
+        {
+            FURI_LOG_E(TAG, "Failed to allocate text input view");
+            return;
+        }
+        // load SSID
+        if (load_settings(ssid, sizeof(ssid), pass, sizeof(pass)))
+        {
+            strncpy(app->uart_text_input_temp_buffer, ssid, app->uart_text_input_buffer_size - 1);
+            app->uart_text_input_temp_buffer[app->uart_text_input_buffer_size - 1] = '\0';
+        }
+        view_dispatcher_switch_to_view(app->view_dispatcher, FlipStoreViewTextInput);
+        break;
+    case 1: // Input Password
+        free_all_views(false);
+        if (!alloc_text_input_view(app, "Password"))
+        {
+            FURI_LOG_E(TAG, "Failed to allocate text input view");
+            return;
+        }
+        // load password
+        if (load_settings(ssid, sizeof(ssid), pass, sizeof(pass)))
+        {
+            strncpy(app->uart_text_input_temp_buffer, pass, app->uart_text_input_buffer_size - 1);
+            app->uart_text_input_temp_buffer[app->uart_text_input_buffer_size - 1] = '\0';
+        }
+        view_dispatcher_switch_to_view(app->view_dispatcher, FlipStoreViewTextInput);
+        break;
+    default:
+        FURI_LOG_E(TAG, "Unknown configuration item index");
+        break;
+    }
+}
+
 static void flip_store_widget_set_text(char *message, Widget **widget)
 {
     if (widget == NULL)

+ 0 - 2
callback/flip_store_callback.h

@@ -39,8 +39,6 @@ void settings_item_selected(void *context, uint32_t index);
 void dialog_delete_callback(DialogExResult result, void *context);
 void dialog_firmware_callback(DialogExResult result, void *context);
 
-void popup_callback(void *context);
-
 uint32_t callback_exit_app(void *context);
 void callback_submenu_choices(void *context, uint32_t index);
 

+ 91 - 0
flip_storage/flip_store_storage.c

@@ -315,4 +315,95 @@ cleanup:
         furi_record_close(RECORD_STORAGE);
     }
     return false;
+}
+
+bool save_char(
+    const char *path_name, const char *value)
+{
+    if (!value)
+    {
+        return false;
+    }
+    // Create the directory for saving settings
+    char directory_path[256];
+    snprintf(directory_path, sizeof(directory_path), STORAGE_EXT_PATH_PREFIX "/apps_data/flip_store");
+
+    // Create the directory
+    Storage *storage = furi_record_open(RECORD_STORAGE);
+    storage_common_mkdir(storage, directory_path);
+
+    // Open the settings file
+    File *file = storage_file_alloc(storage);
+    char file_path[256];
+    snprintf(file_path, sizeof(file_path), STORAGE_EXT_PATH_PREFIX "/apps_data/flip_store/%s.txt", path_name);
+
+    // Open the file in write mode
+    if (!storage_file_open(file, file_path, FSAM_WRITE, FSOM_CREATE_ALWAYS))
+    {
+        FURI_LOG_E(HTTP_TAG, "Failed to open file for writing: %s", file_path);
+        storage_file_free(file);
+        furi_record_close(RECORD_STORAGE);
+        return false;
+    }
+
+    // Write the data to the file
+    size_t data_size = strlen(value) + 1; // Include null terminator
+    if (storage_file_write(file, value, data_size) != data_size)
+    {
+        FURI_LOG_E(HTTP_TAG, "Failed to append data to file");
+        storage_file_close(file);
+        storage_file_free(file);
+        furi_record_close(RECORD_STORAGE);
+        return false;
+    }
+
+    storage_file_close(file);
+    storage_file_free(file);
+    furi_record_close(RECORD_STORAGE);
+
+    return true;
+}
+
+bool load_char(
+    const char *path_name,
+    char *value,
+    size_t value_size)
+{
+    if (!value)
+    {
+        return false;
+    }
+    Storage *storage = furi_record_open(RECORD_STORAGE);
+    File *file = storage_file_alloc(storage);
+
+    char file_path[256];
+    snprintf(file_path, sizeof(file_path), STORAGE_EXT_PATH_PREFIX "/apps_data/flip_store/%s.txt", path_name);
+
+    // Open the file for reading
+    if (!storage_file_open(file, file_path, FSAM_READ, FSOM_OPEN_EXISTING))
+    {
+        storage_file_free(file);
+        furi_record_close(RECORD_STORAGE);
+        return NULL; // Return false if the file does not exist
+    }
+
+    // Read data into the buffer
+    size_t read_count = storage_file_read(file, value, value_size);
+    if (storage_file_get_error(file) != FSE_OK)
+    {
+        FURI_LOG_E(HTTP_TAG, "Error reading from file.");
+        storage_file_close(file);
+        storage_file_free(file);
+        furi_record_close(RECORD_STORAGE);
+        return false;
+    }
+
+    // Ensure null-termination
+    value[read_count - 1] = '\0';
+
+    storage_file_close(file);
+    storage_file_free(file);
+    furi_record_close(RECORD_STORAGE);
+
+    return true;
 }

+ 8 - 0
flip_storage/flip_store_storage.h

@@ -27,4 +27,12 @@ bool app_exists(const char *app_id, const char *app_category);
 // Function to parse JSON incrementally from a file
 bool parse_json_incrementally(const char *file_path, const char *target_key, char *value_buffer, size_t value_buffer_size);
 
+bool save_char(
+    const char *path_name, const char *value);
+
+bool load_char(
+    const char *path_name,
+    char *value,
+    size_t value_size);
+
 #endif

+ 0 - 46
flip_store.c

@@ -12,8 +12,6 @@ void flip_store_app_free(FlipStoreApp *app)
         return;
     }
 
-    flip_catalog_free();
-
     // Free Widget(s)
     if (app->widget_result)
     {
@@ -29,12 +27,6 @@ void flip_store_app_free(FlipStoreApp *app)
         view_free(app->view_loader);
     }
 
-    if (app->view_app_info)
-    {
-        view_dispatcher_remove_view(app->view_dispatcher, FlipStoreViewAppInfo);
-        view_free(app->view_app_info);
-    }
-
     // Free Submenu(s)
     if (app->submenu_main)
     {
@@ -57,44 +49,6 @@ void flip_store_app_free(FlipStoreApp *app)
         submenu_free(app->submenu_firmwares);
     }
 
-    // Free Variable Item List(s)
-    if (app->variable_item_list)
-    {
-        view_dispatcher_remove_view(app->view_dispatcher, FlipStoreViewSettings);
-        variable_item_list_free(app->variable_item_list);
-    }
-
-    // Free Text Input(s)
-    if (app->uart_text_input_ssid)
-    {
-        view_dispatcher_remove_view(app->view_dispatcher, FlipStoreViewTextInputSSID);
-        uart_text_input_free(app->uart_text_input_ssid);
-    }
-    if (app->uart_text_input_pass)
-    {
-        view_dispatcher_remove_view(app->view_dispatcher, FlipStoreViewTextInputPass);
-        uart_text_input_free(app->uart_text_input_pass);
-    }
-
-    // Free popup
-    if (app->popup)
-    {
-        view_dispatcher_remove_view(app->view_dispatcher, FlipStoreViewPopup);
-        popup_free(app->popup);
-    }
-
-    // Free dialog
-    if (app->dialog_delete)
-    {
-        view_dispatcher_remove_view(app->view_dispatcher, FlipStoreViewAppDelete);
-        dialog_ex_free(app->dialog_delete);
-    }
-    if (app->dialog_firmware)
-    {
-        view_dispatcher_remove_view(app->view_dispatcher, FlipStoreViewFirmwareDialog);
-        dialog_ex_free(app->dialog_firmware);
-    }
-
     // free the view dispatcher
     view_dispatcher_free(app->view_dispatcher);
 

+ 11 - 19
flip_store.h

@@ -13,7 +13,10 @@
 #include <dialogs/dialogs.h>
 #include <jsmn/jsmn.h>
 #include <flip_store_icons.h>
+
 #define TAG "FlipStore"
+#define VERSION_TAG "FlipStore v0.7.2"
+
 #define FIRMWARE_COUNT 3
 #define FIRMWARE_LINKS 3
 
@@ -55,10 +58,7 @@ typedef enum
                                   //
     FlipStoreViewAbout,           // The about screen
     FlipStoreViewSettings,        // The settings screen
-    FlipStoreViewTextInputSSID,   // The text input screen for SSID
-    FlipStoreViewTextInputPass,   // The text input screen for password
-                                  //
-    FlipStoreViewPopup,           // The popup screen
+    FlipStoreViewTextInput,       // The text input screen
                                   //
     FlipStoreViewAppList,         // The app list screen
     FlipStoreViewFirmwares,       // The firmwares screen (submenu)
@@ -84,8 +84,7 @@ typedef struct
     ViewDispatcher *view_dispatcher; // Switches between our views
     View *view_app_info;             // The app info screen (view) of the selected app
     //
-    DialogEx *dialog_firmware;    // The dialog for installing a firmware
-    View *view_firmware_download; // The firmware download screen (view) of the selected firmware
+    DialogEx *dialog_firmware; // The dialog for installing a firmware
     //
     Submenu *submenu_main; // The submenu (main)
     //
@@ -93,22 +92,15 @@ typedef struct
     Submenu *submenu_app_list;            // The submenu (app list) for the selected category
     Submenu *submenu_firmwares;           // The submenu (firmwares)
     Submenu *submenu_app_list_category;   // The submenu (app list) for each category
-    Widget *widget;                       // The widget
-    Popup *popup;                         // The popup
-    DialogEx *dialog_delete;              // The dialog for deleting an app
+    Widget *widget_about;                 // The widget
     VariableItemList *variable_item_list; // The variable item list (settngs)
     VariableItem *variable_item_ssid;     // The variable item
     VariableItem *variable_item_pass;     // The variable item
-    UART_TextInput *uart_text_input_ssid; // The text input
-    UART_TextInput *uart_text_input_pass; // The text input
-
-    char *uart_text_input_buffer_ssid;         // Buffer for the text input
-    char *uart_text_input_temp_buffer_ssid;    // Temporary buffer for the text input
-    uint32_t uart_text_input_buffer_size_ssid; // Size of the text input buffer
-
-    char *uart_text_input_buffer_pass;         // Buffer for the text input
-    char *uart_text_input_temp_buffer_pass;    // Temporary buffer for the text input
-    uint32_t uart_text_input_buffer_size_pass; // Size of the text input buffer
+    //
+    UART_TextInput *uart_text_input;      // The text input
+    char *uart_text_input_buffer;         // Buffer for the text input
+    char *uart_text_input_temp_buffer;    // Temporary buffer for the text input
+    uint32_t uart_text_input_buffer_size; // Size of the text input buffer
 } FlipStoreApp;
 
 void flip_store_app_free(FlipStoreApp *app);