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

Add initial warning screen if using zero keys

Eric Betts 9 месяцев назад
Родитель
Сommit
21a3d15604
5 измененных файлов с 58 добавлено и 2 удалено
  1. 1 0
      scenes/seos_scene_config.h
  2. 3 0
      scenes/seos_scene_main_menu.c
  3. 46 0
      scenes/seos_scene_zero_keys.c
  4. 6 2
      seos.c
  5. 2 0
      seos_i.h

+ 1 - 0
scenes/seos_scene_config.h

@@ -14,3 +14,4 @@ ADD_SCENE(seos, info, Info)
 ADD_SCENE(seos, ble_peripheral, BlePeripheral)
 ADD_SCENE(seos, ble_central, BleCentral)
 ADD_SCENE(seos, scanner_menu, ScannerMenu)
+ADD_SCENE(seos, zero_keys, ZeroKeys)

+ 3 - 0
scenes/seos_scene_main_menu.c

@@ -105,6 +105,9 @@ bool seos_scene_main_menu_on_event(void* context, SceneManagerEvent event) {
             scene_manager_next_scene(seos->scene_manager, SeosSceneAbout);
             consumed = true;
         }
+    } else if(event.type == SceneManagerEventTypeBack) {
+        consumed = scene_manager_previous_scene(seos->scene_manager);
+        consumed = scene_manager_previous_scene(seos->scene_manager);
     }
 
     return consumed;

+ 46 - 0
scenes/seos_scene_zero_keys.c

@@ -0,0 +1,46 @@
+#include "../seos_i.h"
+#include <dolphin/dolphin.h>
+
+#define TAG "SeosSceneZeroKeys"
+
+void seos_scene_zero_keys_popup_callback(void* context) {
+    Seos* seos = context;
+    view_dispatcher_send_custom_event(seos->view_dispatcher, SeosCustomEventViewExit);
+}
+
+void seos_scene_zero_keys_on_enter(void* context) {
+    Seos* seos = context;
+    dolphin_deed(DolphinDeedNfcRead);
+
+    // Setup view
+    Popup* popup = seos->popup;
+    popup_set_header(popup, "NO KEYS", 64, 16, AlignCenter, AlignTop);
+    popup_set_text(popup, "Using all zero keys", 64, 36, AlignCenter, AlignTop);
+    popup_set_timeout(popup, 5 * 1000);
+    popup_set_context(popup, seos);
+    popup_set_callback(popup, seos_scene_zero_keys_popup_callback);
+    popup_enable_timeout(popup);
+
+    view_dispatcher_switch_to_view(seos->view_dispatcher, SeosViewPopup);
+}
+
+bool seos_scene_zero_keys_on_event(void* context, SceneManagerEvent event) {
+    Seos* seos = context;
+    bool consumed = false;
+
+    if(event.type == SceneManagerEventTypeCustom) {
+        if(event.event == SeosCustomEventViewExit) {
+            scene_manager_next_scene(seos->scene_manager, SeosSceneMainMenu);
+            consumed = true;
+        }
+    }
+
+    return consumed;
+}
+
+void seos_scene_zero_keys_on_exit(void* context) {
+    Seos* seos = context;
+
+    // Clear view
+    popup_reset(seos->popup);
+}

+ 6 - 2
seos.c

@@ -128,7 +128,7 @@ Seos* seos_alloc() {
 
     seos->seos_emulator = seos_emulator_alloc(&seos->credential);
 
-    seos_load_keys(seos);
+    seos->keys_loaded = seos_load_keys(seos);
 
     return seos;
 }
@@ -291,7 +291,11 @@ int32_t seos_app(void* p) {
     UNUSED(p);
     Seos* seos = seos_alloc();
 
-    scene_manager_next_scene(seos->scene_manager, SeosSceneMainMenu);
+    if(seos->keys_loaded) {
+        scene_manager_next_scene(seos->scene_manager, SeosSceneMainMenu);
+    } else {
+        scene_manager_next_scene(seos->scene_manager, SeosSceneZeroKeys);
+    }
 
     view_dispatcher_run(seos->view_dispatcher);
 

+ 2 - 0
seos_i.h

@@ -101,6 +101,8 @@ struct Seos {
     char dev_name[SEOS_FILE_NAME_MAX_LENGTH + 1];
     FuriString* load_path;
     DialogsApp* dialogs;
+
+    bool keys_loaded;
 };
 
 typedef enum {