Created creation screen & fixing major bugs

This commit is contained in:
Maddox Werts 2024-09-08 00:46:13 -04:00
parent b8e9067a8c
commit 89e49adf5a
6 changed files with 255 additions and 55 deletions

1
build/data.bin Normal file
View file

@ -0,0 +1 @@
Data: Q|A|S|0

View file

@ -35,10 +35,33 @@ char** split_string(const char* str, char delimiter, int* count) {
return result; return result;
} }
void string_append(char* first, const char* second) {
// Get to the end of string 1
while (*first) {
++first;
}
// Copying Strings
while (*second) {
*first++ = *second++;
}
}
void manager_loadnames(Manager* manager){ void manager_loadnames(Manager* manager){
// Loading the names of all passwords // Loading the names of all passwords
char* data = store_load("Data"); char* data = store_load("Data");
// Do we not have any passwords?
if (!data) {
// DEBUG
FURI_LOG_D(TAG, "No passwords found.");
// Creating names
manager->names = malloc(sizeof(char*));
// Returning
return;
}
// Splitting string // Splitting string
int count = 0; int count = 0;
char** split = split_string(data, '|', &count); char** split = split_string(data, '|', &count);
@ -88,6 +111,63 @@ Manager* manager_init() {
} }
// Functions // Functions
void manager_savepass(Manager* manager, Password* pass) {
// Not using Manager Right Now
UNUSED(manager);
// DEBUG
FURI_LOG_D(TAG, "Saving:\nN:%s\nU:%s\nP:%s",
pass->name,
pass->user,
pass->phrase);
// Our resulting string
char* result = store_load("Data");
// Is the result empty?
if(!result) {
// Allocating result
result = malloc(sizeof(char*));
// Setting stuff
string_append(result, pass->name);
string_append(result, "|");
string_append(result, pass->user);
string_append(result, "|");
string_append(result, pass->phrase);
string_append(result, "|0");
// Saving the data
store_save("Data", result);
// Cleanup
free(result);
free(pass);
} else {
// Our new stuff
char* new_addon = malloc(sizeof(char*));
// Adding the Name
string_append(new_addon, "|");
string_append(new_addon, pass->name);
string_append(new_addon, "|");
string_append(new_addon, pass->user);
string_append(new_addon, "|");
string_append(new_addon, pass->phrase);
string_append(new_addon, "|0");
// Appending addon to result
string_append(result, new_addon);
// Saving the data
store_save("Data", result);
// Cleanup
free(new_addon);
free(result);
free(pass);
}
}
void manager_loadpass(Manager* manager, char* name) { void manager_loadpass(Manager* manager, char* name) {
// Freeing previous password // Freeing previous password
if (manager->current != NULL) { if (manager->current != NULL) {

View file

@ -21,6 +21,7 @@ typedef struct {
Manager* manager_init(); Manager* manager_init();
// Functions // Functions
void manager_savepass(Manager* manager, Password* pass);
void manager_loadpass(Manager* manager, char* name); void manager_loadpass(Manager* manager, char* name);
void manager_free(Manager* manager); void manager_free(Manager* manager);

View file

@ -13,13 +13,14 @@ typedef enum {
FP_Scene_Cred, FP_Scene_Cred,
FP_Scene_Send, FP_Scene_Send,
FP_Scene_Create, FP_Scene_Create,
FP_Scene_Type,
FP_Scene_Archive, FP_Scene_Archive,
FP_Scene_About, FP_Scene_About,
FP_Scene_Count // Last Index, says how many scenes there are FP_Scene_Count // Last Index, says how many scenes there are
} FP_Scene; } FP_Scene;
/* Types of Views */ /* Types of Views */
typedef enum { FP_View_VariableItemList, FP_View_Submenu, FP_View_TextBox, FP_View_Dialog, FP_View_Popup } FP_View; typedef enum { FP_View_VariableItemList, FP_View_Submenu, FP_View_TextBox, FP_View_TextInput, FP_View_Dialog, FP_View_Popup } FP_View;
/* Scene events */ /* Scene events */
typedef enum { typedef enum {
@ -33,21 +34,12 @@ typedef enum {
FP_Scene_View_Event_Password, FP_Scene_View_Event_Password,
FP_Scene_View_Event_BadUSB FP_Scene_View_Event_BadUSB
} FP_Scene_View_Event; } FP_Scene_View_Event;
typedef enum {
/* Extras */ FP_Scene_Create_Event_Name,
typedef struct { FP_Scene_Create_Event_Username,
const char* title; FP_Scene_Create_Event_Password,
const char* options[MAX_OPTIONS]; FP_Scene_Create_Event_Done
int selection; } FP_Scene_Create_Event;
} FP_Variable_Item;
/* Variable Item Lists */
const FP_Variable_Item fp_scene_create_options[4] = {
{"Name", {""}, 0},
{"Username", {""}, 0},
{"Password", {""}, 0},
{"Create", {""}, 0}
};
// Page functions // Page functions
void FP_Scene_Callback_Default(void* context, uint32_t index) { void FP_Scene_Callback_Default(void* context, uint32_t index) {
@ -64,7 +56,16 @@ void FP_Scene_Callback_Dialog(DialogExResult result, void* context) {
// Sending it to the scene manager // Sending it to the scene manager
scene_manager_handle_custom_event(app->scene_manager, result); scene_manager_handle_custom_event(app->scene_manager, result);
} }
void FP_Scene_Callback_Type(void* context) {
// Setting context
FP_App* app = context;
// DEBUG
FURI_LOG_D(TAG, "Typed: %s", app->temp);
// Going back a page
scene_manager_previous_scene(app->scene_manager);
}
void FP_Scene_Enter_MainMenu(void* context) { void FP_Scene_Enter_MainMenu(void* context) {
// Setting context // Setting context
@ -226,47 +227,109 @@ void FP_Scene_Enter_Create(void* context) {
FP_App* app = context; FP_App* app = context;
// Reset page // Reset page
variable_item_list_reset(app->varitemlist); submenu_reset(app->submenu);
// Drawing // Did we already start a password?
variable_item_list_add( if (!app->manager->current) {
app->varitemlist, app->manager->current = malloc(sizeof(Password));
"Name", }
1,
NULL,
app
);
variable_item_list_add(
app->varitemlist,
"Username",
1,
NULL,
app
);
variable_item_list_add(
app->varitemlist,
"Password",
1,
NULL,
app
);
variable_item_list_add(
app->varitemlist,
"Create",
1,
NULL,
app
);
// Callbacks // Checking if we typed something before
variable_item_list_set_enter_callback( if (app->temp) {
app->varitemlist, // Checking what we selected
switch (app->selection) {
case 0: // Name
// Does name already exist?
if (app->manager->current->name) {
free(app->manager->current->name);
}
// Copying it
app->manager->current->name = malloc(sizeof(char*));
strcpy(app->manager->current->name, app->temp);
break;
case 1: // Username
// Does user already exist?
if (app->manager->current->user) {
free(app->manager->current->user);
}
// Copying it
app->manager->current->user = malloc(sizeof(char*));
strcpy(app->manager->current->user, app->temp);
break;
case 2: // Password
// Does phrase already exist?
if (app->manager->current->phrase) {
free(app->manager->current->phrase);
}
// Copying it
app->manager->current->phrase = malloc(sizeof(char*));
strcpy(app->manager->current->phrase, app->temp);
break;
}
// Freeing temp
free(app->temp);
}
// Options
submenu_add_item(
app->submenu,
"Set Name",
FP_Scene_Create_Event_Name,
FP_Scene_Callback_Default,
app
);
submenu_add_item(
app->submenu,
"Set Username",
FP_Scene_Create_Event_Username,
FP_Scene_Callback_Default,
app
);
submenu_add_item(
app->submenu,
"Set Password",
FP_Scene_Create_Event_Password,
FP_Scene_Callback_Default,
app
);
submenu_add_item(
app->submenu,
"Finish",
FP_Scene_Create_Event_Done,
FP_Scene_Callback_Default, FP_Scene_Callback_Default,
app app
); );
// Send view to Flipper // Send view to Flipper
view_dispatcher_switch_to_view(app->view_dispatcher, FP_View_VariableItemList); view_dispatcher_switch_to_view(app->view_dispatcher, FP_View_Submenu);
}
void FP_Scene_Enter_Type(void* context) {
// Set Context
FP_App* app = context;
// Reset view
text_input_reset(app->textinput);
// Creating temp string
app->temp = malloc(sizeof(char*));
// Setting stuff
text_input_set_result_callback(
app->textinput,
FP_Scene_Callback_Type,
app,
app->temp,
255,
true
);
// Send view to Flipper
view_dispatcher_switch_to_view(app->view_dispatcher, FP_View_TextInput);
} }
void FP_Scene_Exit_Default(void* context) { void FP_Scene_Exit_Default(void* context) {
@ -442,8 +505,52 @@ bool FP_Scene_Event_Create(void* context, SceneManagerEvent event) {
// We consumed it // We consumed it
consumed = true; consumed = true;
// Debug log about what we pressed // What to do?
FURI_LOG_D(TAG, "Pressed %li", event.event); 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;
// 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->current);
// Freeing temp string
if (app->temp) {
free(app->temp);
}
// Reload manager
manager_free(app->manager);
app->manager = manager_init();
// Switching scenes
scene_manager_previous_scene(app->scene_manager);
break;
default:
break;
}
} else {
consumed = false;
}
// Return result
return consumed;
}
bool FP_Scene_Event_Type(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;
UNUSED(app); UNUSED(app);
@ -467,7 +574,8 @@ void (*const FP_Scene_Enter_Handlers[])(void*) = {
FP_Scene_Enter_View, FP_Scene_Enter_View,
FP_Scene_Enter_Cred, FP_Scene_Enter_Cred,
FP_Scene_Enter_Send, FP_Scene_Enter_Send,
FP_Scene_Enter_Create FP_Scene_Enter_Create,
FP_Scene_Enter_Type
}; };
bool (*const FP_Scene_Event_Handlers[])(void*, SceneManagerEvent) = { bool (*const FP_Scene_Event_Handlers[])(void*, SceneManagerEvent) = {
FP_Scene_Event_MainMenu, FP_Scene_Event_MainMenu,
@ -475,7 +583,8 @@ bool (*const FP_Scene_Event_Handlers[])(void*, SceneManagerEvent) = {
FP_Scene_Event_View, FP_Scene_Event_View,
FP_Scene_Event_Cred, FP_Scene_Event_Cred,
FP_Scene_Event_Send, FP_Scene_Event_Send,
FP_Scene_Event_Create FP_Scene_Event_Create,
FP_Scene_Event_Type
}; };
void (*const FP_Scene_Exit_Handlers[])(void*) = { void (*const FP_Scene_Exit_Handlers[])(void*) = {
FP_Scene_Exit_Default, FP_Scene_Exit_Default,
@ -483,6 +592,7 @@ void (*const FP_Scene_Exit_Handlers[])(void*) = {
FP_Scene_Exit_Default, FP_Scene_Exit_Default,
FP_Scene_Exit_Cred, FP_Scene_Exit_Cred,
FP_Scene_Exit_Default, FP_Scene_Exit_Default,
FP_Scene_Exit_Default,
FP_Scene_Exit_Default FP_Scene_Exit_Default
}; };
@ -532,6 +642,7 @@ FP_App* fp_app_init() {
// Allocating all types of views // Allocating all types of views
result->varitemlist = variable_item_list_alloc(); result->varitemlist = variable_item_list_alloc();
result->textinput = text_input_alloc();
result->dialog = dialog_ex_alloc(); result->dialog = dialog_ex_alloc();
result->submenu = submenu_alloc(); result->submenu = submenu_alloc();
result->textbox = text_box_alloc(); result->textbox = text_box_alloc();
@ -544,6 +655,7 @@ FP_App* fp_app_init() {
// Adding views to dispatcher // Adding views to dispatcher
view_dispatcher_add_view(result->view_dispatcher, FP_View_VariableItemList, variable_item_list_get_view(result->varitemlist)); view_dispatcher_add_view(result->view_dispatcher, FP_View_VariableItemList, variable_item_list_get_view(result->varitemlist));
view_dispatcher_add_view(result->view_dispatcher, FP_View_TextInput, text_input_get_view(result->textinput));
view_dispatcher_add_view(result->view_dispatcher, FP_View_TextBox, text_box_get_view(result->textbox)); view_dispatcher_add_view(result->view_dispatcher, FP_View_TextBox, text_box_get_view(result->textbox));
view_dispatcher_add_view(result->view_dispatcher, FP_View_Dialog, dialog_ex_get_view(result->dialog)); view_dispatcher_add_view(result->view_dispatcher, FP_View_Dialog, dialog_ex_get_view(result->dialog));
view_dispatcher_add_view(result->view_dispatcher, FP_View_Submenu, submenu_get_view(result->submenu)); view_dispatcher_add_view(result->view_dispatcher, FP_View_Submenu, submenu_get_view(result->submenu));
@ -575,15 +687,18 @@ void fp_app_free(FP_App* app) {
manager_free(app->manager); manager_free(app->manager);
scene_manager_free(app->scene_manager); scene_manager_free(app->scene_manager);
view_dispatcher_remove_view(app->view_dispatcher, FP_View_VariableItemList); view_dispatcher_remove_view(app->view_dispatcher, FP_View_VariableItemList);
view_dispatcher_remove_view(app->view_dispatcher, FP_View_TextInput);
view_dispatcher_remove_view(app->view_dispatcher, FP_View_Submenu); view_dispatcher_remove_view(app->view_dispatcher, FP_View_Submenu);
view_dispatcher_remove_view(app->view_dispatcher, FP_View_TextBox); view_dispatcher_remove_view(app->view_dispatcher, FP_View_TextBox);
view_dispatcher_remove_view(app->view_dispatcher, FP_View_Dialog); view_dispatcher_remove_view(app->view_dispatcher, FP_View_Dialog);
view_dispatcher_remove_view(app->view_dispatcher, FP_View_Popup); view_dispatcher_remove_view(app->view_dispatcher, FP_View_Popup);
view_dispatcher_free(app->view_dispatcher); view_dispatcher_free(app->view_dispatcher);
variable_item_list_free(app->varitemlist); variable_item_list_free(app->varitemlist);
text_input_free(app->textinput);
dialog_ex_free(app->dialog); dialog_ex_free(app->dialog);
text_box_free(app->textbox); text_box_free(app->textbox);
submenu_free(app->submenu); submenu_free(app->submenu);
popup_free(app->popup); popup_free(app->popup);
free(app->temp);
free(app); free(app);
} }

View file

@ -15,6 +15,7 @@
#include <gui/modules/popup.h> #include <gui/modules/popup.h>
#include <gui/modules/variable_item_list.h> #include <gui/modules/variable_item_list.h>
#include <gui/modules/text_box.h> #include <gui/modules/text_box.h>
#include <gui/modules/text_input.h>
#include "app.h" #include "app.h"
#include "manager.h" #include "manager.h"
@ -24,12 +25,14 @@ typedef struct {
SceneManager* scene_manager; SceneManager* scene_manager;
ViewDispatcher* view_dispatcher; ViewDispatcher* view_dispatcher;
VariableItemList* varitemlist; VariableItemList* varitemlist;
TextInput* textinput;
DialogEx* dialog; DialogEx* dialog;
Submenu* submenu; Submenu* submenu;
TextBox* textbox; TextBox* textbox;
Popup* popup; Popup* popup;
Manager* manager; Manager* manager;
int selection;
char* temp; char* temp;
} FP_App; } FP_App;

View file

@ -14,7 +14,7 @@ int32_t flippypass_app(void* p) {
UNUSED(p); UNUSED(p);
// Saving to a default file: // Saving to a default file:
debug_template(); //debug_template();
// Creating App // Creating App
FP_App* app = fp_app_init(); FP_App* app = fp_app_init();