Sfoglia il codice sorgente

show hidden file setting, about screen, cleanup

rdefeo 1 anno fa
parent
commit
77091131f0
12 ha cambiato i file con 157 aggiunte e 43 eliminazioni
  1. 2 10
      actions/action_subghz.c
  2. BIN
      images/quac.png
  3. 11 3
      item.c
  4. 4 0
      quac.c
  5. 9 3
      quac.h
  6. 17 6
      quac_settings.c
  7. 41 0
      scenes/scene_about.c
  8. 8 0
      scenes/scene_about.h
  9. 57 19
      scenes/scene_settings.c
  10. 4 1
      scenes/scenes.c
  11. 2 0
      scenes/scenes.h
  12. 2 1
      views/action_menu.c

+ 2 - 10
actions/action_subghz.c

@@ -74,7 +74,7 @@ static const SubGhzDevice* action_subghz_get_device(uint32_t* device_ind) {
 void action_subghz_tx(void* context, const FuriString* action_path, FuriString* error) {
 void action_subghz_tx(void* context, const FuriString* action_path, FuriString* error) {
     App* app = context;
     App* app = context;
     const char* file_name = furi_string_get_cstr(action_path);
     const char* file_name = furi_string_get_cstr(action_path);
-    uint32_t repeat = 1; //
+    uint32_t repeat = 1; // This is set to 10 in the cli - why?
     uint32_t device_ind = app->settings.subghz_use_ext_antenna ? 1 : 0;
     uint32_t device_ind = app->settings.subghz_use_ext_antenna ? 1 : 0;
 
 
     FlipperFormat* fff_data_file = flipper_format_file_alloc(app->storage);
     FlipperFormat* fff_data_file = flipper_format_file_alloc(app->storage);
@@ -114,15 +114,6 @@ void action_subghz_tx(void* context, const FuriString* action_path, FuriString*
             break;
             break;
         }
         }
 
 
-        // // SUBGHZ_DEVICE_CC1101_INT_NAME = "cc1101_int"
-        // device = subghz_devices_get_by_name("cc1101_int");
-        // if(!subghz_devices_is_connect(device)) {
-        //     // power off
-        //     if(furi_hal_power_is_otg_enabled()) furi_hal_power_disable_otg();
-        //     device = subghz_devices_get_by_name("cc1101_int");
-        //     // device_ind = 0;
-        // }
-
         if(!flipper_format_file_open_existing(fff_data_file, file_name)) {
         if(!flipper_format_file_open_existing(fff_data_file, file_name)) {
             FURI_LOG_E(TAG, "Error opening %s", file_name);
             FURI_LOG_E(TAG, "Error opening %s", file_name);
             ACTION_SET_ERROR("SUBGHZ: Error opening %s", file_name);
             ACTION_SET_ERROR("SUBGHZ: Error opening %s", file_name);
@@ -244,6 +235,7 @@ void action_subghz_tx(void* context, const FuriString* action_path, FuriString*
                 status = subghz_transmitter_deserialize(transmitter, fff_data_file);
                 status = subghz_transmitter_deserialize(transmitter, fff_data_file);
                 if(status != SubGhzProtocolStatusOk) {
                 if(status != SubGhzProtocolStatusOk) {
                     FURI_LOG_E(TAG, "Error deserialize protocol");
                     FURI_LOG_E(TAG, "Error deserialize protocol");
+                    ACTION_SET_ERROR("SUBGHZ: Protocol error");
                     is_init_protocol = false;
                     is_init_protocol = false;
                 }
                 }
             }
             }

BIN
images/quac.png


+ 11 - 3
item.c

@@ -16,10 +16,13 @@ ItemsView* item_get_items_view_from_path(void* context, const FuriString* input_
     // Handle the app start condition
     // Handle the app start condition
     FuriString* in_path;
     FuriString* in_path;
     if(input_path == NULL) {
     if(input_path == NULL) {
-        in_path = furi_string_alloc_set_str(QUAC_DATA_PATH);
+        in_path = furi_string_alloc_set_str(APP_DATA_PATH(""));
     } else {
     } else {
         in_path = furi_string_alloc_set(input_path);
         in_path = furi_string_alloc_set(input_path);
     }
     }
+    if(furi_string_get_char(in_path, furi_string_size(in_path) - 1) == '/') {
+        furi_string_left(in_path, furi_string_size(in_path) - 1);
+    }
     const char* cpath = furi_string_get_cstr(in_path);
     const char* cpath = furi_string_get_cstr(in_path);
 
 
     FURI_LOG_I(TAG, "Reading items from path: %s", cpath);
     FURI_LOG_I(TAG, "Reading items from path: %s", cpath);
@@ -50,10 +53,15 @@ ItemsView* item_get_items_view_from_path(void* context, const FuriString* input_
             // FURI_LOG_I(TAG, "> dir_walk: %s", furi_string_get_cstr(path));
             // FURI_LOG_I(TAG, "> dir_walk: %s", furi_string_get_cstr(path));
             const char* cpath = furi_string_get_cstr(path);
             const char* cpath = furi_string_get_cstr(path);
 
 
-            // Skip "hidden" files
             path_extract_filename(path, filename_tmp, false);
             path_extract_filename(path, filename_tmp, false);
+            // Always skip our .quac.conf file!
+            if(!furi_string_cmp_str(filename_tmp, QUAC_SETTINGS_FILENAME)) {
+                continue;
+            }
+
+            // Skip "hidden" files
             char first_char = furi_string_get_char(filename_tmp, 0);
             char first_char = furi_string_get_char(filename_tmp, 0);
-            if(first_char == '.') {
+            if(first_char == '.' && !app->settings.show_hidden) {
                 // FURI_LOG_I(TAG, ">> skipping hidden file: %s", furi_string_get_cstr(filename_tmp));
                 // FURI_LOG_I(TAG, ">> skipping hidden file: %s", furi_string_get_cstr(filename_tmp));
                 continue;
                 continue;
             }
             }

+ 4 - 0
quac.c

@@ -39,6 +39,9 @@ App* app_alloc() {
     view_dispatcher_add_view(
     view_dispatcher_add_view(
         app->view_dispatcher, QView_ActionTextInput, text_input_get_view(app->text_input));
         app->view_dispatcher, QView_ActionTextInput, text_input_get_view(app->text_input));
 
 
+    app->popup = popup_alloc();
+    view_dispatcher_add_view(app->view_dispatcher, QView_Popup, popup_get_view(app->popup));
+
     // Storage
     // Storage
     app->storage = furi_record_open(RECORD_STORAGE);
     app->storage = furi_record_open(RECORD_STORAGE);
 
 
@@ -65,6 +68,7 @@ void app_free(App* app) {
     view_dispatcher_remove_view(app->view_dispatcher, QView_Settings);
     view_dispatcher_remove_view(app->view_dispatcher, QView_Settings);
     view_dispatcher_remove_view(app->view_dispatcher, QView_ActionSettings);
     view_dispatcher_remove_view(app->view_dispatcher, QView_ActionSettings);
     view_dispatcher_remove_view(app->view_dispatcher, QView_ActionTextInput);
     view_dispatcher_remove_view(app->view_dispatcher, QView_ActionTextInput);
+    view_dispatcher_remove_view(app->view_dispatcher, QView_Popup);
 
 
     action_menu_free(app->action_menu);
     action_menu_free(app->action_menu);
     variable_item_list_free(app->vil_settings);
     variable_item_list_free(app->vil_settings);

+ 9 - 3
quac.h

@@ -7,6 +7,7 @@
 #include <gui/modules/variable_item_list.h>
 #include <gui/modules/variable_item_list.h>
 #include <gui/modules/submenu.h>
 #include <gui/modules/submenu.h>
 #include <gui/modules/text_input.h>
 #include <gui/modules/text_input.h>
+#include <gui/modules/popup.h>
 #include <dialogs/dialogs.h>
 #include <dialogs/dialogs.h>
 
 
 #include <storage/storage.h>
 #include <storage/storage.h>
@@ -20,12 +21,15 @@
 // #pragma GCC optimize("O0")
 // #pragma GCC optimize("O0")
 
 
 #define QUAC_NAME "Quac!"
 #define QUAC_NAME "Quac!"
+#define QUAC_VERSION "v0.5.0"
+#define QUAC_ABOUT                                    \
+    "Quick Action remote control\n" QUAC_VERSION "\n" \
+    "github.com/rdefeo/quac"
 #define TAG "Quac" // log statement id
 #define TAG "Quac" // log statement id
 
 
 // Location of our actions and folders
 // Location of our actions and folders
-#define QUAC_PATH "apps_data/quac"
-// Full path to actions
-#define QUAC_DATA_PATH EXT_PATH(QUAC_PATH)
+#define QUAC_SETTINGS_FILENAME ".quac.conf"
+#define QUAC_SETTINGS_PATH APP_DATA_PATH(QUAC_SETTINGS_FILENAME)
 
 
 typedef enum { QUAC_APP_PORTRAIT, QUAC_APP_LANDSCAPE } QuacAppLayout;
 typedef enum { QUAC_APP_PORTRAIT, QUAC_APP_LANDSCAPE } QuacAppLayout;
 
 
@@ -38,6 +42,7 @@ typedef struct App {
     DialogsApp* dialog;
     DialogsApp* dialog;
     Submenu* sub_menu;
     Submenu* sub_menu;
     TextInput* text_input;
     TextInput* text_input;
+    Popup* popup;
 
 
     Storage* storage;
     Storage* storage;
     NotificationApp* notifications;
     NotificationApp* notifications;
@@ -55,6 +60,7 @@ typedef struct App {
         bool show_headers; // Defaults to True
         bool show_headers; // Defaults to True
         uint32_t rfid_duration; // Defaults to 2500 ms
         uint32_t rfid_duration; // Defaults to 2500 ms
         bool subghz_use_ext_antenna; // Defaults to False
         bool subghz_use_ext_antenna; // Defaults to False
+        bool show_hidden; // Defaults to False
     } settings;
     } settings;
 
 
 } App;
 } App;

+ 17 - 6
quac_settings.c

@@ -3,8 +3,6 @@
 #include <flipper_format/flipper_format.h>
 #include <flipper_format/flipper_format.h>
 
 
 // Quac Settings File Info
 // Quac Settings File Info
-// "/ext/apps_data/quac/.quac.conf"
-#define QUAC_SETTINGS_FILENAME QUAC_DATA_PATH "/.quac.conf"
 #define QUAC_SETTINGS_FILE_TYPE "Quac Settings File"
 #define QUAC_SETTINGS_FILE_TYPE "Quac Settings File"
 #define QUAC_SETTINGS_FILE_VERSION 1
 #define QUAC_SETTINGS_FILE_VERSION 1
 
 
@@ -14,6 +12,7 @@ void quac_set_default_settings(App* app) {
     app->settings.show_icons = true;
     app->settings.show_icons = true;
     app->settings.show_headers = true;
     app->settings.show_headers = true;
     app->settings.subghz_use_ext_antenna = false;
     app->settings.subghz_use_ext_antenna = false;
+    app->settings.show_hidden = false;
 }
 }
 
 
 void quac_load_settings(App* app) {
 void quac_load_settings(App* app) {
@@ -22,10 +21,10 @@ void quac_load_settings(App* app) {
     temp_str = furi_string_alloc();
     temp_str = furi_string_alloc();
     uint32_t temp_data32 = 0;
     uint32_t temp_data32 = 0;
 
 
-    FURI_LOG_I(TAG, "SETTINGS: Reading: %s", QUAC_SETTINGS_FILENAME);
+    FURI_LOG_I(TAG, "SETTINGS: Reading: %s", QUAC_SETTINGS_PATH);
     bool successful = false;
     bool successful = false;
     do {
     do {
-        if(!flipper_format_file_open_existing(fff_settings, QUAC_SETTINGS_FILENAME)) {
+        if(!flipper_format_file_open_existing(fff_settings, QUAC_SETTINGS_PATH)) {
             FURI_LOG_I(TAG, "SETTINGS: File not found, loading defaults");
             FURI_LOG_I(TAG, "SETTINGS: File not found, loading defaults");
             break;
             break;
         }
         }
@@ -66,7 +65,7 @@ void quac_load_settings(App* app) {
             FURI_LOG_E(TAG, "SETTINGS: Missing 'Show Headers'");
             FURI_LOG_E(TAG, "SETTINGS: Missing 'Show Headers'");
             break;
             break;
         }
         }
-        app->settings.show_headers = (temp_data32 == 0) ? false : true;
+        app->settings.show_headers = (temp_data32 == 1) ? true : false;
 
 
         if(!flipper_format_read_uint32(fff_settings, "RFID Duration", &temp_data32, 1)) {
         if(!flipper_format_read_uint32(fff_settings, "RFID Duration", &temp_data32, 1)) {
             FURI_LOG_E(TAG, "SETTINGS: Missing 'RFID Duration'");
             FURI_LOG_E(TAG, "SETTINGS: Missing 'RFID Duration'");
@@ -80,6 +79,12 @@ void quac_load_settings(App* app) {
         }
         }
         app->settings.subghz_use_ext_antenna = (temp_data32 == 1) ? true : false;
         app->settings.subghz_use_ext_antenna = (temp_data32 == 1) ? true : false;
 
 
+        if(!flipper_format_read_uint32(fff_settings, "Show Hidden", &temp_data32, 1)) {
+            FURI_LOG_E(TAG, "SETTINGS: Missing 'Show Hidden'");
+            break;
+        }
+        app->settings.show_hidden = (temp_data32 == 1) ? true : false;
+
         successful = true;
         successful = true;
     } while(false);
     } while(false);
 
 
@@ -98,7 +103,7 @@ void quac_save_settings(App* app) {
     FURI_LOG_I(TAG, "SETTINGS: Saving");
     FURI_LOG_I(TAG, "SETTINGS: Saving");
     bool successful = false;
     bool successful = false;
     do {
     do {
-        if(!flipper_format_file_open_always(fff_settings, QUAC_SETTINGS_FILENAME)) {
+        if(!flipper_format_file_open_always(fff_settings, QUAC_SETTINGS_PATH)) {
             FURI_LOG_E(TAG, "SETTINGS: Unable to open file for save!!");
             FURI_LOG_E(TAG, "SETTINGS: Unable to open file for save!!");
             break;
             break;
         }
         }
@@ -137,6 +142,12 @@ void quac_save_settings(App* app) {
             FURI_LOG_E(TAG, "SETTINGS: Failed to write 'SubGHz Ext Antenna'");
             FURI_LOG_E(TAG, "SETTINGS: Failed to write 'SubGHz Ext Antenna'");
             break;
             break;
         }
         }
+        temp_data32 = app->settings.show_hidden ? 1 : 0;
+        if(!flipper_format_write_uint32(fff_settings, "Show Hidden", &temp_data32, 1)) {
+            FURI_LOG_E(TAG, "SETTINGS: Failed to write 'Show Hidden'");
+            break;
+        }
+
         successful = true;
         successful = true;
     } while(false);
     } while(false);
 
 

+ 41 - 0
scenes/scene_about.c

@@ -0,0 +1,41 @@
+#include <furi.h>
+
+#include <gui/view_dispatcher.h>
+#include <gui/scene_manager.h>
+#include <flipper_application/flipper_application.h>
+
+#include "quac.h"
+#include "scenes.h"
+#include "scene_about.h"
+#include "../actions/action.h"
+#include "quac_icons.h"
+
+enum {
+    SceneActionRenameEvent,
+};
+
+void scene_about_callback(void* context) {
+    App* app = context;
+    view_dispatcher_send_custom_event(app->view_dispatcher, SceneActionRenameEvent);
+}
+
+void scene_about_on_enter(void* context) {
+    App* app = context;
+
+    Popup* popup = app->popup;
+    popup_set_header(popup, QUAC_NAME, 68, 1, AlignCenter, AlignTop);
+    popup_set_text(popup, QUAC_ABOUT, 0, 15, AlignLeft, AlignTop);
+    popup_set_icon(popup, 38, 0, &I_quac);
+    view_dispatcher_switch_to_view(app->view_dispatcher, QView_Popup);
+}
+
+bool scene_about_on_event(void* context, SceneManagerEvent event) {
+    UNUSED(context);
+    UNUSED(event);
+    return false;
+}
+
+void scene_about_on_exit(void* context) {
+    App* app = context;
+    popup_reset(app->popup);
+}

+ 8 - 0
scenes/scene_about.h

@@ -0,0 +1,8 @@
+#pragma once
+
+#include <gui/scene_manager.h>
+
+// For each scene, implement handler callbacks
+void scene_about_on_enter(void* context);
+bool scene_about_on_event(void* context, SceneManagerEvent event);
+void scene_about_on_exit(void* context);

+ 57 - 19
scenes/scene_settings.c

@@ -14,14 +14,21 @@
 
 
 #include <lib/toolbox/path.h>
 #include <lib/toolbox/path.h>
 
 
+typedef enum {
+    SceneSettingsLayout,
+    SceneSettingsIcons,
+    SceneSettingsHeaders,
+    SceneSettingsRFIDDuration,
+    SceneSettingsSubGHzExtAnt,
+    SceneSettingsHidden,
+    SceneSettingsAbout
+} SceneSettingsIndex;
+
 static const char* const layout_text[2] = {"Vert", "Horiz"};
 static const char* const layout_text[2] = {"Vert", "Horiz"};
 static const uint32_t layout_value[2] = {QUAC_APP_PORTRAIT, QUAC_APP_LANDSCAPE};
 static const uint32_t layout_value[2] = {QUAC_APP_PORTRAIT, QUAC_APP_LANDSCAPE};
 
 
-static const char* const show_icons_text[2] = {"OFF", "ON"};
-static const uint32_t show_icons_value[2] = {false, true};
-
-static const char* const show_headers_text[2] = {"OFF", "ON"};
-static const uint32_t show_headers_value[2] = {false, true};
+static const char* const show_offon_text[2] = {"OFF", "ON"};
+static const uint32_t show_offon_value[2] = {false, true};
 
 
 #define V_RFID_DURATION_COUNT 8
 #define V_RFID_DURATION_COUNT 8
 static const char* const rfid_duration_text[V_RFID_DURATION_COUNT] = {
 static const char* const rfid_duration_text[V_RFID_DURATION_COUNT] = {
@@ -58,15 +65,15 @@ static void scene_settings_layout_changed(VariableItem* item) {
 static void scene_settings_show_icons_changed(VariableItem* item) {
 static void scene_settings_show_icons_changed(VariableItem* item) {
     App* app = variable_item_get_context(item);
     App* app = variable_item_get_context(item);
     uint8_t index = variable_item_get_current_value_index(item);
     uint8_t index = variable_item_get_current_value_index(item);
-    variable_item_set_current_value_text(item, show_icons_text[index]);
-    app->settings.show_icons = show_icons_value[index];
+    variable_item_set_current_value_text(item, show_offon_text[index]);
+    app->settings.show_icons = show_offon_value[index];
 }
 }
 
 
 static void scene_settings_show_headers_changed(VariableItem* item) {
 static void scene_settings_show_headers_changed(VariableItem* item) {
     App* app = variable_item_get_context(item);
     App* app = variable_item_get_context(item);
     uint8_t index = variable_item_get_current_value_index(item);
     uint8_t index = variable_item_get_current_value_index(item);
-    variable_item_set_current_value_text(item, show_headers_text[index]);
-    app->settings.show_headers = show_headers_value[index];
+    variable_item_set_current_value_text(item, show_offon_text[index]);
+    app->settings.show_headers = show_offon_value[index];
 }
 }
 
 
 static void scene_settings_rfid_duration_changed(VariableItem* item) {
 static void scene_settings_rfid_duration_changed(VariableItem* item) {
@@ -83,6 +90,18 @@ static void scene_settings_subghz_ext_changed(VariableItem* item) {
     app->settings.subghz_use_ext_antenna = subghz_ext_value[index];
     app->settings.subghz_use_ext_antenna = subghz_ext_value[index];
 }
 }
 
 
+static void scene_settings_show_hidden_changed(VariableItem* item) {
+    App* app = variable_item_get_context(item);
+    uint8_t index = variable_item_get_current_value_index(item);
+    variable_item_set_current_value_text(item, show_offon_text[index]);
+    app->settings.show_hidden = show_offon_value[index];
+}
+
+static void scene_settings_enter_callback(void* context, uint32_t index) {
+    App* app = context;
+    view_dispatcher_send_custom_event(app->view_dispatcher, index);
+}
+
 // For each scene, implement handler callbacks
 // For each scene, implement handler callbacks
 void scene_settings_on_enter(void* context) {
 void scene_settings_on_enter(void* context) {
     App* app = context;
     App* app = context;
@@ -99,15 +118,15 @@ void scene_settings_on_enter(void* context) {
     variable_item_set_current_value_text(item, layout_text[value_index]);
     variable_item_set_current_value_text(item, layout_text[value_index]);
 
 
     item = variable_item_list_add(vil, "Show Icons", 2, scene_settings_show_icons_changed, app);
     item = variable_item_list_add(vil, "Show Icons", 2, scene_settings_show_icons_changed, app);
-    value_index = value_index_uint32(app->settings.show_icons, show_icons_value, 2);
+    value_index = value_index_uint32(app->settings.show_icons, show_offon_value, 2);
     variable_item_set_current_value_index(item, value_index);
     variable_item_set_current_value_index(item, value_index);
-    variable_item_set_current_value_text(item, show_icons_text[value_index]);
+    variable_item_set_current_value_text(item, show_offon_text[value_index]);
 
 
     item =
     item =
         variable_item_list_add(vil, "Show Headers", 2, scene_settings_show_headers_changed, app);
         variable_item_list_add(vil, "Show Headers", 2, scene_settings_show_headers_changed, app);
-    value_index = value_index_uint32(app->settings.show_headers, show_headers_value, 2);
+    value_index = value_index_uint32(app->settings.show_headers, show_offon_value, 2);
     variable_item_set_current_value_index(item, value_index);
     variable_item_set_current_value_index(item, value_index);
-    variable_item_set_current_value_text(item, show_headers_text[value_index]);
+    variable_item_set_current_value_text(item, show_offon_text[value_index]);
 
 
     item = variable_item_list_add(
     item = variable_item_list_add(
         vil, "RFID Duration", V_RFID_DURATION_COUNT, scene_settings_rfid_duration_changed, app);
         vil, "RFID Duration", V_RFID_DURATION_COUNT, scene_settings_rfid_duration_changed, app);
@@ -122,16 +141,35 @@ void scene_settings_on_enter(void* context) {
     variable_item_set_current_value_index(item, value_index);
     variable_item_set_current_value_index(item, value_index);
     variable_item_set_current_value_text(item, subghz_ext_text[value_index]);
     variable_item_set_current_value_text(item, subghz_ext_text[value_index]);
 
 
-    // TODO: Set Enter callback here - why?? All settings have custom callbacks
-    // variable_item_list_set_enter_callback(vil, my_cb, app);
+    item = variable_item_list_add(vil, "Show Hidden", 2, scene_settings_show_hidden_changed, app);
+    value_index = value_index_uint32(app->settings.show_hidden, show_offon_value, 2);
+    variable_item_set_current_value_index(item, value_index);
+    variable_item_set_current_value_text(item, show_offon_text[value_index]);
+
+    // Last item is always "About"
+    item = variable_item_list_add(vil, "About", 1, NULL, NULL);
+    variable_item_list_set_enter_callback(vil, scene_settings_enter_callback, app);
 
 
     view_dispatcher_switch_to_view(app->view_dispatcher, QView_Settings);
     view_dispatcher_switch_to_view(app->view_dispatcher, QView_Settings);
 }
 }
-bool scene_settings_on_event(void* context, SceneManagerEvent event) {
-    UNUSED(context);
-    UNUSED(event);
 
 
-    return false;
+bool scene_settings_on_event(void* context, SceneManagerEvent event) {
+    App* app = context;
+    bool consumed = false;
+
+    if(event.type == SceneManagerEventTypeCustom) {
+        switch(event.event) {
+        case SceneSettingsAbout:
+            consumed = true;
+            FURI_LOG_I(TAG, "About popup");
+            scene_manager_next_scene(app->scene_manager, QScene_About);
+            break;
+        default:
+            break;
+        }
+    }
+
+    return consumed;
 }
 }
 
 
 void scene_settings_on_exit(void* context) {
 void scene_settings_on_exit(void* context) {

+ 4 - 1
scenes/scenes.c

@@ -7,6 +7,7 @@
 #include "scene_action_settings.h"
 #include "scene_action_settings.h"
 #include "scene_action_rename.h"
 #include "scene_action_rename.h"
 #include "scene_action_create_group.h"
 #include "scene_action_create_group.h"
+#include "scene_about.h"
 
 
 // define handler callbacks - order must match appScenes enum!
 // define handler callbacks - order must match appScenes enum!
 void (*const app_on_enter_handlers[])(void* context) = {
 void (*const app_on_enter_handlers[])(void* context) = {
@@ -15,6 +16,7 @@ void (*const app_on_enter_handlers[])(void* context) = {
     scene_action_settings_on_enter,
     scene_action_settings_on_enter,
     scene_action_rename_on_enter,
     scene_action_rename_on_enter,
     scene_action_create_group_on_enter,
     scene_action_create_group_on_enter,
+    scene_about_on_enter,
 };
 };
 bool (*const app_on_event_handlers[])(void* context, SceneManagerEvent event) = {
 bool (*const app_on_event_handlers[])(void* context, SceneManagerEvent event) = {
     scene_items_on_event,
     scene_items_on_event,
@@ -22,7 +24,7 @@ bool (*const app_on_event_handlers[])(void* context, SceneManagerEvent event) =
     scene_action_settings_on_event,
     scene_action_settings_on_event,
     scene_action_rename_on_event,
     scene_action_rename_on_event,
     scene_action_create_group_on_event,
     scene_action_create_group_on_event,
-
+    scene_about_on_event,
 };
 };
 void (*const app_on_exit_handlers[])(void* context) = {
 void (*const app_on_exit_handlers[])(void* context) = {
     scene_items_on_exit,
     scene_items_on_exit,
@@ -30,6 +32,7 @@ void (*const app_on_exit_handlers[])(void* context) = {
     scene_action_settings_on_exit,
     scene_action_settings_on_exit,
     scene_action_rename_on_exit,
     scene_action_rename_on_exit,
     scene_action_create_group_on_exit,
     scene_action_create_group_on_exit,
+    scene_about_on_exit,
 };
 };
 
 
 const SceneManagerHandlers app_scene_handlers = {
 const SceneManagerHandlers app_scene_handlers = {

+ 2 - 0
scenes/scenes.h

@@ -6,6 +6,7 @@ typedef enum {
     QScene_ActionSettings,
     QScene_ActionSettings,
     QScene_ActionRename,
     QScene_ActionRename,
     QScene_ActionCreateGroup,
     QScene_ActionCreateGroup,
+    QScene_About,
     QScene_count
     QScene_count
 } appScenes;
 } appScenes;
 
 
@@ -14,6 +15,7 @@ typedef enum {
     QView_Settings, // Variable Item List for settings
     QView_Settings, // Variable Item List for settings
     QView_ActionSettings, // [SubMenu] Action: Rename, Delete, Import (copies from elsewhere)
     QView_ActionSettings, // [SubMenu] Action: Rename, Delete, Import (copies from elsewhere)
     QView_ActionTextInput, // Action: Rename, Create Group
     QView_ActionTextInput, // Action: Rename, Create Group
+    QView_Popup, // About screen
 } appView;
 } appView;
 
 
 typedef enum {
 typedef enum {

+ 2 - 1
views/action_menu.c

@@ -308,7 +308,8 @@ static bool action_menu_view_input_callback(InputEvent* event, void* context) {
         case InputKeyRight:
         case InputKeyRight:
             break;
             break;
         default:
         default:
-            FURI_LOG_E("AM", "Unknown key!");
+            // FURI_LOG_E("AM", "Unknown key!");
+            break;
         }
         }
     } else if(event->type == InputTypeLong) {
     } else if(event->type == InputTypeLong) {
         if(event->key == InputKeyRight) {
         if(event->key == InputKeyRight) {