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

Picopass: More info view (raw bytes) (#86)

Co-authored-by: あく <alleteam@gmail.com>
Eric Betts 2 лет назад
Родитель
Сommit
e95daa1679

+ 11 - 0
picopass.c

@@ -76,6 +76,12 @@ Picopass* picopass_alloc() {
         PicopassViewByteInput,
         byte_input_get_view(picopass->byte_input));
 
+    // TextBox
+    picopass->text_box = text_box_alloc();
+    view_dispatcher_add_view(
+        picopass->view_dispatcher, PicopassViewTextBox, text_box_get_view(picopass->text_box));
+    picopass->text_box_store = furi_string_alloc();
+
     // Custom Widget
     picopass->widget = widget_alloc();
     view_dispatcher_add_view(
@@ -123,6 +129,11 @@ void picopass_free(Picopass* picopass) {
     view_dispatcher_remove_view(picopass->view_dispatcher, PicopassViewByteInput);
     byte_input_free(picopass->byte_input);
 
+    // TextBox
+    view_dispatcher_remove_view(picopass->view_dispatcher, PicopassViewTextBox);
+    text_box_free(picopass->text_box);
+    furi_string_free(picopass->text_box_store);
+
     // Custom Widget
     view_dispatcher_remove_view(picopass->view_dispatcher, PicopassViewWidget);
     widget_free(picopass->widget);

+ 3 - 0
picopass_i.h

@@ -16,6 +16,7 @@
 #include <gui/modules/loading.h>
 #include <gui/modules/text_input.h>
 #include <gui/modules/byte_input.h>
+#include <gui/modules/text_box.h>
 #include <gui/modules/widget.h>
 
 #include <input/input.h>
@@ -100,6 +101,7 @@ struct Picopass {
     Loading* loading;
     TextInput* text_input;
     ByteInput* byte_input;
+    TextBox* text_box;
     Widget* widget;
     DictAttack* dict_attack;
     Loclass* loclass;
@@ -115,6 +117,7 @@ typedef enum {
     PicopassViewLoading,
     PicopassViewTextInput,
     PicopassViewByteInput,
+    PicopassViewTextBox,
     PicopassViewWidget,
     PicopassViewDictAttack,
     PicopassViewLoclass,

+ 1 - 0
scenes/picopass_scene_config.h

@@ -20,3 +20,4 @@ ADD_SCENE(picopass, emulate, Emulate)
 ADD_SCENE(picopass, loclass, Loclass)
 ADD_SCENE(picopass, key_input, KeyInput)
 ADD_SCENE(picopass, nr_mac_saved, NrMacSaved)
+ADD_SCENE(picopass, more_info, MoreInfo)

+ 9 - 0
scenes/picopass_scene_device_info.c

@@ -77,6 +77,12 @@ void picopass_scene_device_info_on_enter(void* context) {
         "Back",
         picopass_scene_device_info_widget_callback,
         picopass);
+    widget_add_button_element(
+        picopass->widget,
+        GuiButtonTypeRight,
+        "More",
+        picopass_scene_device_info_widget_callback,
+        picopass);
 
     view_dispatcher_switch_to_view(picopass->view_dispatcher, PicopassViewWidget);
 }
@@ -88,6 +94,9 @@ bool picopass_scene_device_info_on_event(void* context, SceneManagerEvent event)
     if(event.type == SceneManagerEventTypeCustom) {
         if(event.event == GuiButtonTypeLeft) {
             consumed = scene_manager_previous_scene(picopass->scene_manager);
+        } else if(event.event == GuiButtonTypeRight) {
+            scene_manager_next_scene(picopass->scene_manager, PicopassSceneMoreInfo);
+            consumed = true;
         } else if(event.event == PicopassCustomEventViewExit) {
             view_dispatcher_switch_to_view(picopass->view_dispatcher, PicopassViewWidget);
             consumed = true;

+ 50 - 0
scenes/picopass_scene_more_info.c

@@ -0,0 +1,50 @@
+#include "../picopass_i.h"
+#include <dolphin/dolphin.h>
+
+void picopass_scene_more_info_widget_callback(GuiButtonType result, InputType type, void* context) {
+    Picopass* picopass = context;
+    if(type == InputTypeShort) {
+        view_dispatcher_send_custom_event(picopass->view_dispatcher, result);
+    }
+}
+
+void picopass_scene_more_info_on_enter(void* context) {
+    Picopass* picopass = context;
+    PicopassBlock* AA1 = picopass->dev->dev_data.AA1;
+
+    furi_string_reset(picopass->text_box_store);
+
+    size_t app_limit = MIN(AA1[PICOPASS_CONFIG_BLOCK_INDEX].data[0], PICOPASS_MAX_APP_LIMIT);
+    FuriString* str = picopass->text_box_store;
+
+    for(size_t i = 0; i < app_limit; i++) {
+        for(size_t j = 0; j < PICOPASS_BLOCK_LEN; j += 2) {
+            furi_string_cat_printf(str, "%02X%02X ", AA1[i].data[j], AA1[i].data[j + 1]);
+        }
+    }
+
+    text_box_set_font(picopass->text_box, TextBoxFontHex);
+    text_box_set_text(picopass->text_box, furi_string_get_cstr(picopass->text_box_store));
+    view_dispatcher_switch_to_view(picopass->view_dispatcher, PicopassViewTextBox);
+}
+
+bool picopass_scene_more_info_on_event(void* context, SceneManagerEvent event) {
+    Picopass* picopass = context;
+    bool consumed = false;
+
+    if(event.type == SceneManagerEventTypeCustom) {
+        if(event.event == GuiButtonTypeLeft) {
+            consumed = scene_manager_previous_scene(picopass->scene_manager);
+        }
+    } else if(event.type == SceneManagerEventTypeBack) {
+        consumed = scene_manager_previous_scene(picopass->scene_manager);
+    }
+    return consumed;
+}
+
+void picopass_scene_more_info_on_exit(void* context) {
+    Picopass* picopass = context;
+
+    // Clear views
+    widget_reset(picopass->widget);
+}