// Header #include "create.h" // Constants #define KEYBOARD_STR_LEN 64 // Structures typedef enum { FP_Scene_Create_Event_Name, FP_Scene_Create_Event_Username, FP_Scene_Create_Event_Password, FP_Scene_Create_Event_Done } FP_Scene_Create_Event; // Functions void FP_Scene_Callback_Create(void* context, uint32_t index) { // Setting context FP_App* app = context; // Sending it to the scene manager scene_manager_handle_custom_event(app->scene_manager, index); } void FP_Scene_Enter_Create(void* context) { // Setting context FP_App* app = context; // Reset page submenu_reset(app->submenu); // Checking if we typed something before if (app->keyboard) { // Did we already start a password? if (!app->manager->new) { app->manager->new = pass_init("", "", "", 0); } // Checking what we selected switch (app->selection) { case 0: // Name free(app->manager->new->name); app->manager->new->name = malloc(sizeof(char) * KEYBOARD_STR_LEN); strcpy(app->manager->new->name, app->keyboard); break; case 1: // Username free(app->manager->new->user); app->manager->new->user = malloc(sizeof(char) * KEYBOARD_STR_LEN); strcpy(app->manager->new->user, app->keyboard); break; case 2: // Password free(app->manager->new->phrase); app->manager->new->phrase = malloc(sizeof(char) * KEYBOARD_STR_LEN); strcpy(app->manager->new->phrase, app->keyboard); break; } // Freeing temp free(app->keyboard); } // Options submenu_add_item( app->submenu, "Set Name", FP_Scene_Create_Event_Name, FP_Scene_Callback_Create, app ); submenu_add_item( app->submenu, "Set Username", FP_Scene_Create_Event_Username, FP_Scene_Callback_Create, app ); submenu_add_item( app->submenu, "Set Password", FP_Scene_Create_Event_Password, FP_Scene_Callback_Create, app ); submenu_add_item( app->submenu, "Finish", FP_Scene_Create_Event_Done, FP_Scene_Callback_Create, app ); // Send view to Flipper view_dispatcher_switch_to_view(app->view_dispatcher, FP_View_Submenu); } void FP_Scene_Exit_Create(void* context) { // Setting context FP_App* app = context; // Reset menu submenu_reset(app->submenu); } bool FP_Scene_Event_Create(void* context, SceneManagerEvent event) { // Setting context FP_App* app = context; bool consumed = false; // Switching based on event if (event.type == SceneManagerEventTypeCustom) { // We consumed it consumed = true; // What to do? switch (event.event) { case FP_Scene_Create_Event_Name: case FP_Scene_Create_Event_Username: case FP_Scene_Create_Event_Password: // Set selection app->selection = event.event; // Checking if our keyboard already has existing data if (app->keyboard) { free(app->keyboard); } // Setting the title app->keyboard = malloc(sizeof(char*) * KEYBOARD_STR_LEN); switch(app->selection){ case 0: app->keyboard = "Name"; break; case 1: app->keyboard = "Username"; break; case 2: app->keyboard = "Password"; break; } // Switch to keyboard scene scene_manager_next_scene(app->scene_manager, FP_Scene_Type); break; case FP_Scene_Create_Event_Done: // Save the password manager_savepass(app->manager, app->manager->new); // Saving key char* key = malloc(sizeof(char) * 64); strcpy(key, app->manager->secure_storage->key); // Reload manager manager_free(app->manager); app->manager = manager_init(key); // Freeing key free(key); // Switching scenes scene_manager_previous_scene(app->scene_manager); break; default: break; } } else { consumed = false; } // Return result return consumed; }