diff --git a/applications/plugins/namechanger/application.fam b/applications/plugins/namechanger/application.fam new file mode 100644 index 00000000000..545f0b9051f --- /dev/null +++ b/applications/plugins/namechanger/application.fam @@ -0,0 +1,13 @@ +App( + appid="NameChanger", + name="Name Changer", + apptype=FlipperAppType.EXTERNAL, + entry_point="namechanger_app", + cdefines=["APP_NAMECHANGER"], + requires=["gui","storage"], + stack_size=2 * 1024, + order=90, + fap_icon="namechanger_10px.png", + fap_category="Tools", + fap_icon_assets="icons", +) \ No newline at end of file diff --git a/applications/plugins/namechanger/icons/Cry_dolph_55x52.png b/applications/plugins/namechanger/icons/Cry_dolph_55x52.png new file mode 100644 index 00000000000..86d9db1b497 Binary files /dev/null and b/applications/plugins/namechanger/icons/Cry_dolph_55x52.png differ diff --git a/applications/plugins/namechanger/icons/DolphinMafia_115x62.png b/applications/plugins/namechanger/icons/DolphinMafia_115x62.png new file mode 100644 index 00000000000..66fdb40ff26 Binary files /dev/null and b/applications/plugins/namechanger/icons/DolphinMafia_115x62.png differ diff --git a/applications/plugins/namechanger/icons/DolphinNice_96x59.png b/applications/plugins/namechanger/icons/DolphinNice_96x59.png new file mode 100644 index 00000000000..a299d363023 Binary files /dev/null and b/applications/plugins/namechanger/icons/DolphinNice_96x59.png differ diff --git a/applications/plugins/namechanger/icons/MarioBlock.png b/applications/plugins/namechanger/icons/MarioBlock.png new file mode 100644 index 00000000000..86f159966d8 Binary files /dev/null and b/applications/plugins/namechanger/icons/MarioBlock.png differ diff --git a/applications/plugins/namechanger/icons/namechanger_10px.png b/applications/plugins/namechanger/icons/namechanger_10px.png new file mode 100644 index 00000000000..60facf25e0e Binary files /dev/null and b/applications/plugins/namechanger/icons/namechanger_10px.png differ diff --git a/applications/plugins/namechanger/namechanger.- b/applications/plugins/namechanger/namechanger.- new file mode 100644 index 00000000000..1519f581400 --- /dev/null +++ b/applications/plugins/namechanger/namechanger.- @@ -0,0 +1,3 @@ +#pragma once + +typedef struct NameChanger NameChanger; diff --git a/applications/plugins/namechanger/namechanger.c b/applications/plugins/namechanger/namechanger.c new file mode 100644 index 00000000000..649f139a328 --- /dev/null +++ b/applications/plugins/namechanger/namechanger.c @@ -0,0 +1,278 @@ +#include "namechanger.h" +#include "scenes/namechanger_scene.h" + +#include +#include + +bool namechanger_custom_event_callback(void* context, uint32_t event) { + furi_assert(context); + NameChanger* namechanger = context; + return scene_manager_handle_custom_event(namechanger->scene_manager, event); +} + +bool namechanger_back_event_callback(void* context) { + furi_assert(context); + NameChanger* namechanger = context; + return scene_manager_handle_back_event(namechanger->scene_manager); +} + +bool namechanger_make_app_folder(NameChanger* namechanger) { + bool created = false; + FURI_LOG_I(TAG, "folder1"); + + FuriString* folderpath = furi_string_alloc(); + furi_string_set(folderpath, "/ext/dolphin"); + FURI_LOG_I(TAG, "folder2"); + + //Make dir if doesn't exist + if(!storage_simply_mkdir(namechanger->storage, furi_string_get_cstr(folderpath))) { + FURI_LOG_I(TAG, "folder3"); + furi_string_set_str(namechanger->error, "Cannot create\napp folder."); + } else { + FURI_LOG_I(TAG, "folder4"); + created = true; + } + FURI_LOG_I(TAG, "folder5"); + furi_string_free(folderpath); + FURI_LOG_I(TAG, "folder6"); + return created; +} + +bool namechanger_name_read_write(NameChanger* namechanger, char* name, uint8_t mode) { + FuriString* file_path = furi_string_alloc(); + furi_string_set(file_path, "/ext/dolphin/name.txt"); + FURI_LOG_I(TAG, "name1"); + + bool result = false; + + if(mode == 2) { + FURI_LOG_I(TAG, "name2"); + UNUSED(name); + FlipperFormat* file = flipper_format_file_alloc(namechanger->storage); + //read + FuriString* data = furi_string_alloc(); + FURI_LOG_I(TAG, "name3"); + + do { + FURI_LOG_I(TAG, "name4"); + if(!flipper_format_file_open_existing(file, furi_string_get_cstr(file_path))) { + break; + } + FURI_LOG_I(TAG, "name4a"); + + // header + uint32_t version; + + if(!flipper_format_read_header(file, data, &version)) { + break; + } + FURI_LOG_I(TAG, "name4b"); + + if(furi_string_cmp_str(data, NAMECHANGER_HEADER) != 0) { + break; + } + FURI_LOG_I(TAG, "name4c"); + + if(version != 1) { + break; + } + FURI_LOG_I(TAG, "name4d"); + + // get Name + if(!flipper_format_read_string(file, "Name", data)) { + break; + } + FURI_LOG_I(TAG, "name4e"); + + result = true; + FURI_LOG_I(TAG, "name5"); + } while(false); + + flipper_format_free(file); + FURI_LOG_I(TAG, "name6"); + + if(!result) { + FURI_LOG_I(TAG, "name7"); + FURI_LOG_E(TAG, "Cannot load data from file."); + namechanger_text_store_set(namechanger, "%s", furi_hal_version_get_name_ptr()); + } else { + FURI_LOG_I(TAG, "name8"); + furi_string_trim(data); + + if(!furi_string_size(data)) { + FURI_LOG_I(TAG, "name9"); + namechanger_text_store_set(namechanger, "%s", furi_hal_version_get_name_ptr()); + } else { + FURI_LOG_I(TAG, "name10"); + char newname[8]; + snprintf(newname, 8, "%s", furi_string_get_cstr(data)); + namechanger_text_store_set(namechanger, "%s", newname); + } + } + FURI_LOG_I(TAG, "name11"); + + furi_string_free(data); + } else if(mode == 3) { + FURI_LOG_I(TAG, "name12"); + //save + FlipperFormat* file = flipper_format_file_alloc(namechanger->storage); + + do { + FURI_LOG_I(TAG, "name13"); + // Open file for write + if(!flipper_format_file_open_always(file, furi_string_get_cstr(file_path))) { + break; + } + + // Write header + if(!flipper_format_write_header_cstr(file, NAMECHANGER_HEADER, 1)) { + break; + } + + // Write comments + if(!flipper_format_write_comment_cstr( + file, "Changing the value below will change your FlipperZero device name.")) { + break; + } + + if(!flipper_format_write_comment_cstr( + file, + "Note: This is limited to 8 characters using the following: a-z, A-Z, 0-9, and _")) { + break; + } + + if(!flipper_format_write_comment_cstr( + file, "It cannot contain any other characters.")) { + break; + } + + //If name is eraseerase (set by Revert) - then don't write any name + //otherwise, write name as set in the variable + if(strcmp(name, "eraseerase") == 0) + { + if(!flipper_format_write_string_cstr(file, "Name", "")) { + break; + } + } + else + { + if(!flipper_format_write_string_cstr(file, "Name", name)) { + break; + } + } + + FURI_LOG_I(TAG, "name14"); + result = true; + } while(false); + + flipper_format_free(file); + FURI_LOG_I(TAG, "name15"); + + if(!result) { + FURI_LOG_I(TAG, "name16"); + FURI_LOG_E(TAG, "Cannot save name file."); + furi_string_set_str(namechanger->error, "Cannot save\nname file."); + } + } else { + FURI_LOG_I(TAG, "name17"); + FURI_LOG_E(TAG, "Something broke."); + furi_string_set_str(namechanger->error, "Something broke."); + } + FURI_LOG_I(TAG, "name18"); + + return result; +} + +NameChanger* namechanger_alloc() { + NameChanger* namechanger = malloc(sizeof(namechanger)); + + namechanger->scene_manager = scene_manager_alloc(&namechanger_scene_handlers, namechanger); + + namechanger->view_dispatcher = view_dispatcher_alloc(); + view_dispatcher_enable_queue(namechanger->view_dispatcher); + view_dispatcher_set_event_callback_context(namechanger->view_dispatcher, namechanger); + view_dispatcher_set_custom_event_callback( + namechanger->view_dispatcher, namechanger_custom_event_callback); + view_dispatcher_set_navigation_event_callback( + namechanger->view_dispatcher, namechanger_back_event_callback); + + namechanger->gui = furi_record_open(RECORD_GUI); + namechanger->storage = furi_record_open(RECORD_STORAGE); + + namechanger->submenu = submenu_alloc(); + view_dispatcher_add_view( + namechanger->view_dispatcher, + NameChangerViewSubmenu, + submenu_get_view(namechanger->submenu)); + + namechanger->text_input = text_input_alloc(); + view_dispatcher_add_view( + namechanger->view_dispatcher, + NameChangerViewTextInput, + text_input_get_view(namechanger->text_input)); + + namechanger->popup = popup_alloc(); + view_dispatcher_add_view( + namechanger->view_dispatcher, NameChangerViewPopup, popup_get_view(namechanger->popup)); + + namechanger->widget = widget_alloc(); + view_dispatcher_add_view( + namechanger->view_dispatcher, NameChangerViewWidget, widget_get_view(namechanger->widget)); + + return namechanger; +} + +void namechanger_free(NameChanger* namechanger) { + furi_assert(namechanger); + + view_dispatcher_remove_view(namechanger->view_dispatcher, NameChangerViewWidget); + widget_free(namechanger->widget); + view_dispatcher_remove_view(namechanger->view_dispatcher, NameChangerViewPopup); + popup_free(namechanger->popup); + + view_dispatcher_remove_view(namechanger->view_dispatcher, NameChangerViewTextInput); + text_input_free(namechanger->text_input); + + view_dispatcher_remove_view(namechanger->view_dispatcher, NameChangerViewSubmenu); + submenu_free(namechanger->submenu); + + view_dispatcher_free(namechanger->view_dispatcher); + scene_manager_free(namechanger->scene_manager); + + furi_string_free(namechanger->error); + + furi_record_close(RECORD_STORAGE); + + furi_record_close(RECORD_GUI); + + free(namechanger); +} + +void namechanger_text_store_set(NameChanger* namechanger, const char* text, ...) { + va_list args; + va_start(args, text); + + vsnprintf(namechanger->text_store, NAMECHANGER_TEXT_STORE_SIZE, text, args); + + va_end(args); +} + +void namechanger_text_store_clear(NameChanger* namechanger) { + memset(namechanger->text_store, 0, NAMECHANGER_TEXT_STORE_SIZE); +} + +int32_t namechanger_app() { + NameChanger* namechanger = namechanger_alloc(); + + namechanger->error = furi_string_alloc(); + furi_string_set(namechanger->error, "Default"); + + view_dispatcher_attach_to_gui( + namechanger->view_dispatcher, namechanger->gui, ViewDispatcherTypeFullscreen); + scene_manager_next_scene(namechanger->scene_manager, NameChangerSceneStart); + + view_dispatcher_run(namechanger->view_dispatcher); + + namechanger_free(namechanger); + return 0; +} \ No newline at end of file diff --git a/applications/plugins/namechanger/namechanger.h b/applications/plugins/namechanger/namechanger.h new file mode 100644 index 00000000000..9500c1c178c --- /dev/null +++ b/applications/plugins/namechanger/namechanger.h @@ -0,0 +1,51 @@ +#pragma once + +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include + +#include "namechanger_custom_event.h" +#include "scenes/namechanger_scene.h" + +#define NAMECHANGER_TEXT_STORE_SIZE 9 +#define NAMECHANGER_HEADER "Flipper Name File" + +#define TAG "NameChanger" + +typedef struct { + SceneManager* scene_manager; + ViewDispatcher* view_dispatcher; + + Gui* gui; + Storage* storage; + + char text_store[NAMECHANGER_TEXT_STORE_SIZE + 1]; + FuriString* error; + + Submenu* submenu; + TextInput* text_input; + Popup* popup; + Widget* widget; +} NameChanger; + +typedef enum { + NameChangerViewSubmenu, + NameChangerViewTextInput, + NameChangerViewPopup, + NameChangerViewWidget, +} NameChangerView; + +bool namechanger_make_app_folder(NameChanger* namechanger); +bool namechanger_name_read_write(NameChanger* namechanger, char* name, uint8_t mode); +void namechanger_text_store_set(NameChanger* namechanger, const char* text, ...); +void namechanger_text_store_clear(NameChanger* namechanger); diff --git a/applications/plugins/namechanger/namechanger_10px.png b/applications/plugins/namechanger/namechanger_10px.png new file mode 100644 index 00000000000..60facf25e0e Binary files /dev/null and b/applications/plugins/namechanger/namechanger_10px.png differ diff --git a/applications/plugins/namechanger/namechanger_custom_event.h b/applications/plugins/namechanger/namechanger_custom_event.h new file mode 100644 index 00000000000..61418642f6b --- /dev/null +++ b/applications/plugins/namechanger/namechanger_custom_event.h @@ -0,0 +1,7 @@ +#pragma once + +enum NameChangerCustomEvent { + NameChangerCustomEventBack, + NameChangerCustomEventTextEditResult, + NameChangerCustomEventError, +}; diff --git a/applications/plugins/namechanger/scenes/namechanger_scene.c b/applications/plugins/namechanger/scenes/namechanger_scene.c new file mode 100644 index 00000000000..82f96e466f0 --- /dev/null +++ b/applications/plugins/namechanger/scenes/namechanger_scene.c @@ -0,0 +1,30 @@ +#include "namechanger_scene.h" + +// Generate scene on_enter handlers array +#define ADD_SCENE(prefix, name, id) prefix##_scene_##name##_on_enter, +void (*const namechanger_on_enter_handlers[])(void*) = { +#include "namechanger_scene_config.h" +}; +#undef ADD_SCENE + +// Generate scene on_event handlers array +#define ADD_SCENE(prefix, name, id) prefix##_scene_##name##_on_event, +bool (*const namechanger_on_event_handlers[])(void* context, SceneManagerEvent event) = { +#include "namechanger_scene_config.h" +}; +#undef ADD_SCENE + +// Generate scene on_exit handlers array +#define ADD_SCENE(prefix, name, id) prefix##_scene_##name##_on_exit, +void (*const namechanger_on_exit_handlers[])(void* context) = { +#include "namechanger_scene_config.h" +}; +#undef ADD_SCENE + +// Initialize scene handlers configuration structure +const SceneManagerHandlers namechanger_scene_handlers = { + .on_enter_handlers = namechanger_on_enter_handlers, + .on_event_handlers = namechanger_on_event_handlers, + .on_exit_handlers = namechanger_on_exit_handlers, + .scene_num = NameChangerSceneNum, +}; diff --git a/applications/plugins/namechanger/scenes/namechanger_scene.h b/applications/plugins/namechanger/scenes/namechanger_scene.h new file mode 100644 index 00000000000..42071ab98e0 --- /dev/null +++ b/applications/plugins/namechanger/scenes/namechanger_scene.h @@ -0,0 +1,29 @@ +#pragma once + +#include + +// Generate scene id and total number +#define ADD_SCENE(prefix, name, id) NameChangerScene##id, +typedef enum { +#include "namechanger_scene_config.h" + NameChangerSceneNum, +} NameChangerScene; +#undef ADD_SCENE + +extern const SceneManagerHandlers namechanger_scene_handlers; + +// Generate scene on_enter handlers declaration +#define ADD_SCENE(prefix, name, id) void prefix##_scene_##name##_on_enter(void*); +#include "namechanger_scene_config.h" +#undef ADD_SCENE + +// Generate scene on_event handlers declaration +#define ADD_SCENE(prefix, name, id) \ + bool prefix##_scene_##name##_on_event(void* context, SceneManagerEvent event); +#include "namechanger_scene_config.h" +#undef ADD_SCENE + +// Generate scene on_exit handlers declaration +#define ADD_SCENE(prefix, name, id) void prefix##_scene_##name##_on_exit(void* context); +#include "namechanger_scene_config.h" +#undef ADD_SCENE diff --git a/applications/plugins/namechanger/scenes/namechanger_scene_change.c b/applications/plugins/namechanger/scenes/namechanger_scene_change.c new file mode 100644 index 00000000000..9838db5853e --- /dev/null +++ b/applications/plugins/namechanger/scenes/namechanger_scene_change.c @@ -0,0 +1,63 @@ +#include "../namechanger.h" + +static void namechanger_scene_change_text_input_callback(void* context) { + NameChanger* namechanger = context; + + view_dispatcher_send_custom_event( + namechanger->view_dispatcher, NameChangerCustomEventTextEditResult); +} + +void namechanger_scene_change_on_enter(void* context) { + NameChanger* namechanger = context; + TextInput* text_input = namechanger->text_input; + + if(namechanger_name_read_write(namechanger, NULL, 2)) { + text_input_set_header_text(text_input, "Set Flipper Name"); + + text_input_set_result_callback( + text_input, + namechanger_scene_change_text_input_callback, + namechanger, + namechanger->text_store, + NAMECHANGER_TEXT_STORE_SIZE, + true); + + view_dispatcher_switch_to_view(namechanger->view_dispatcher, NameChangerViewTextInput); + } else { + view_dispatcher_send_custom_event( + namechanger->view_dispatcher, NameChangerCustomEventError); + } +} + +bool namechanger_scene_change_on_event(void* context, SceneManagerEvent event) { + NameChanger* namechanger = context; + bool consumed = false; + + if(event.type == SceneManagerEventTypeCustom) { + consumed = true; + if(event.event == NameChangerCustomEventTextEditResult) { + if(namechanger_make_app_folder(namechanger)) { + if(namechanger_name_read_write(namechanger, namechanger->text_store, 3)) { + scene_manager_next_scene(namechanger->scene_manager, NameChangerSceneChangeSuccess); + } else { + scene_manager_search_and_switch_to_previous_scene( + namechanger->scene_manager, NameChangerSceneError); + } + } else { + scene_manager_search_and_switch_to_previous_scene( + namechanger->scene_manager, NameChangerSceneError); + } + } else if(event.event == NameChangerCustomEventError) { + scene_manager_search_and_switch_to_previous_scene( + namechanger->scene_manager, NameChangerSceneError); + } + } + return consumed; +} + +void namechanger_scene_change_on_exit(void* context) { + NameChanger* namechanger = context; + TextInput* text_input = namechanger->text_input; + + text_input_reset(text_input); +} diff --git a/applications/plugins/namechanger/scenes/namechanger_scene_change_success.c b/applications/plugins/namechanger/scenes/namechanger_scene_change_success.c new file mode 100644 index 00000000000..63f2939bc55 --- /dev/null +++ b/applications/plugins/namechanger/scenes/namechanger_scene_change_success.c @@ -0,0 +1,51 @@ +#include "../namechanger.h" + +static void namechanger_scene_change_success_popup_callback(void* context) { + NameChanger* namechanger = context; + view_dispatcher_send_custom_event(namechanger->view_dispatcher, NameChangerCustomEventBack); +} + +void namechanger_scene_change_success_on_enter(void* context) { + NameChanger* namechanger = context; + Popup* popup = namechanger->popup; + + popup_set_icon(popup, 32, 5, &I_DolphinNice_96x59); + popup_set_header(popup, "Saved!", 5, 5, AlignLeft, AlignTop); + popup_set_text(popup, "Rebooting...", 5, 17, AlignLeft, AlignTop); + + popup_set_callback(popup, namechanger_scene_change_success_popup_callback); + popup_set_context(popup, namechanger); + popup_set_timeout(popup, 5000); + popup_enable_timeout(popup); + + view_dispatcher_switch_to_view(namechanger->view_dispatcher, NameChangerViewPopup); +} + +bool namechanger_scene_change_success_on_event(void* context, SceneManagerEvent event) { + NameChanger* namechanger = context; + bool consumed = false; + + if(event.type == SceneManagerEventTypeCustom) { + consumed = true; + if(event.event == NameChangerCustomEventBack) { + scene_manager_search_and_switch_to_previous_scene( + namechanger->scene_manager, NameChangerSceneChange); + } + } + + return consumed; +} + +void namechanger_scene_change_success_on_exit(void* context) { + NameChanger* namechanger = context; + Popup* popup = namechanger->popup; + + popup_set_text(popup, NULL, 0, 0, AlignCenter, AlignTop); + popup_set_icon(popup, 0, 0, NULL); + + popup_disable_timeout(popup); + popup_set_context(popup, NULL); + popup_set_callback(popup, NULL); + + furi_hal_power_reset(); +} diff --git a/applications/plugins/namechanger/scenes/namechanger_scene_config.h b/applications/plugins/namechanger/scenes/namechanger_scene_config.h new file mode 100644 index 00000000000..26236a057d6 --- /dev/null +++ b/applications/plugins/namechanger/scenes/namechanger_scene_config.h @@ -0,0 +1,6 @@ +ADD_SCENE(namechanger, start, Start) +ADD_SCENE(namechanger, change, Change) +ADD_SCENE(namechanger, change_success, ChangeSuccess) +ADD_SCENE(namechanger, revert, Revert) +ADD_SCENE(namechanger, revert_success, RevertSuccess) +ADD_SCENE(namechanger, error, Error) \ No newline at end of file diff --git a/applications/plugins/namechanger/scenes/namechanger_scene_error.c b/applications/plugins/namechanger/scenes/namechanger_scene_error.c new file mode 100644 index 00000000000..3fe2e7276b8 --- /dev/null +++ b/applications/plugins/namechanger/scenes/namechanger_scene_error.c @@ -0,0 +1,49 @@ +#include "../namechanger.h" + +static void namechanger_scene_error_popup_callback(void* context) { + NameChanger* namechanger = context; + view_dispatcher_send_custom_event(namechanger->view_dispatcher, NameChangerCustomEventBack); +} + +void namechanger_scene_error_on_enter(void* context) { + NameChanger* namechanger = context; + Popup* popup = namechanger->popup; + + popup_set_icon(popup, 60, 12, &I_Cry_dolph_55x52); + popup_set_header(popup, "Error", 5, 7, AlignLeft, AlignTop); + + popup_set_text(popup, furi_string_get_cstr(namechanger->error), 5, 20, AlignLeft, AlignTop); + + popup_set_callback(popup, namechanger_scene_error_popup_callback); + popup_set_context(popup, namechanger); + popup_set_timeout(popup, 10000); + popup_enable_timeout(popup); + + view_dispatcher_switch_to_view(namechanger->view_dispatcher, NameChangerViewPopup); +} + +bool namechanger_scene_error_on_event(void* context, SceneManagerEvent event) { + NameChanger* namechanger = context; + bool consumed = false; + + if(event.type == SceneManagerEventTypeCustom) { + consumed = true; + if(event.event == NameChangerCustomEventBack) { + view_dispatcher_stop(namechanger->view_dispatcher); + } + } + + return consumed; +} + +void namechanger_scene_error_on_exit(void* context) { + NameChanger* namechanger = context; + Popup* popup = namechanger->popup; + + popup_set_text(popup, NULL, 0, 0, AlignCenter, AlignTop); + popup_set_icon(popup, 0, 0, NULL); + + popup_disable_timeout(popup); + popup_set_context(popup, NULL); + popup_set_callback(popup, NULL); +} diff --git a/applications/plugins/namechanger/scenes/namechanger_scene_revert.c b/applications/plugins/namechanger/scenes/namechanger_scene_revert.c new file mode 100644 index 00000000000..d4cfb13e6e4 --- /dev/null +++ b/applications/plugins/namechanger/scenes/namechanger_scene_revert.c @@ -0,0 +1,67 @@ +#include "../namechanger.h" + +static void + namechanger_scene_revert_widget_callback(GuiButtonType result, InputType type, void* context) { + NameChanger* namechanger = context; + FURI_LOG_I(TAG, "revert1"); + if(type == InputTypeShort) { + FURI_LOG_I(TAG, "revert2"); + view_dispatcher_send_custom_event(namechanger->view_dispatcher, result); + } +} + +void namechanger_scene_revert_on_enter(void* context) { + NameChanger* namechanger = context; + Widget* widget = namechanger->widget; + FURI_LOG_I(TAG, "revert3"); + widget_add_text_box_element( + widget, 0, 0, 128, 25, AlignCenter, AlignCenter, "\e#Revert Name?\e#", false); + widget_add_icon_element(widget, 48, 20, &I_MarioBlock); + widget_add_button_element( + widget, GuiButtonTypeLeft, "Cancel", namechanger_scene_revert_widget_callback, namechanger); + FURI_LOG_I(TAG, "revert4"); + widget_add_button_element( + widget, + GuiButtonTypeRight, + "Revert", + namechanger_scene_revert_widget_callback, + namechanger); + FURI_LOG_I(TAG, "revert5"); + view_dispatcher_switch_to_view(namechanger->view_dispatcher, NameChangerViewWidget); +} + +bool namechanger_scene_revert_on_event(void* context, SceneManagerEvent event) { + NameChanger* namechanger = context; + bool consumed = false; + FURI_LOG_I(TAG, "revert6"); + if(event.type == SceneManagerEventTypeBack) { + consumed = true; + FURI_LOG_I(TAG, "revert7"); + } else if(event.type == SceneManagerEventTypeCustom) { + consumed = true; + FURI_LOG_I(TAG, "revert8"); + if(event.event == GuiButtonTypeRight) { + FURI_LOG_I(TAG, "revert9"); + if(namechanger_name_read_write(namechanger, "eraseerase", 3)) { + FURI_LOG_I(TAG, "revert10"); + scene_manager_next_scene(namechanger->scene_manager, NameChangerSceneRevertSuccess); + } else { + FURI_LOG_I(TAG, "revert11"); + scene_manager_search_and_switch_to_previous_scene( + namechanger->scene_manager, NameChangerSceneError); + } + } else if(event.event == GuiButtonTypeLeft) { + FURI_LOG_I(TAG, "revert12"); + scene_manager_search_and_switch_to_previous_scene( + namechanger->scene_manager, NameChangerSceneStart); + } + } + FURI_LOG_I(TAG, "revert13"); + return consumed; +} + +void namechanger_scene_revert_on_exit(void* context) { + NameChanger* namechanger = context; + FURI_LOG_I(TAG, "revert14"); + widget_reset(namechanger->widget); +} diff --git a/applications/plugins/namechanger/scenes/namechanger_scene_revert_failed.- b/applications/plugins/namechanger/scenes/namechanger_scene_revert_failed.- new file mode 100644 index 00000000000..636eb8034ae --- /dev/null +++ b/applications/plugins/namechanger/scenes/namechanger_scene_revert_failed.- @@ -0,0 +1,50 @@ +#include "../namechanger_i.h" +#include + +static void namechanger_scene_revert_failed_popup_callback(void* context) { + NameChanger* namechanger = context; + view_dispatcher_send_custom_event(namechanger->view_dispatcher, NameChangerCustomEventBack); +} + +void namechanger_scene_revert_failed_on_enter(void* context) { + NameChanger* namechanger = context; + Popup* popup = namechanger->popup; + + popup_set_icon(popup, 5, 10, &I_Cry_dolph_55x52); + popup_set_header(popup, "Revert", 80, 20, AlignLeft, AlignTop); + popup_set_text(popup, "Failed.", 80, 35, AlignLeft, AlignTop); + + popup_set_callback(popup, namechanger_scene_revert_failed_popup_callback); + popup_set_context(popup, namechanger); + popup_set_timeout(popup, 5000); + popup_enable_timeout(popup); + + view_dispatcher_switch_to_view(namechanger->view_dispatcher, NameChangerViewPopup); +} + +bool namechanger_scene_revert_failed_on_event(void* context, SceneManagerEvent event) { + NameChanger* namechanger = context; + bool consumed = false; + + if(event.type == SceneManagerEventTypeCustom) { + consumed = true; + if(event.event == NameChangerCustomEventBack) { + scene_manager_search_and_switch_to_previous_scene( + namechanger->scene_manager, NameChangerSceneStart); + } + } + + return consumed; +} + +void namechanger_scene_revert_failed_on_exit(void* context) { + NameChanger* namechanger = context; + Popup* popup = namechanger->popup; + + popup_set_text(popup, NULL, 0, 0, AlignCenter, AlignTop); + popup_set_icon(popup, 0, 0, NULL); + + popup_disable_timeout(popup); + popup_set_context(popup, NULL); + popup_set_callback(popup, NULL); +} diff --git a/applications/plugins/namechanger/scenes/namechanger_scene_revert_success.c b/applications/plugins/namechanger/scenes/namechanger_scene_revert_success.c new file mode 100644 index 00000000000..14a3e723972 --- /dev/null +++ b/applications/plugins/namechanger/scenes/namechanger_scene_revert_success.c @@ -0,0 +1,54 @@ +#include "../namechanger.h" + +static void namechanger_scene_revert_success_popup_callback(void* context) { + NameChanger* namechanger = context; + view_dispatcher_send_custom_event(namechanger->view_dispatcher, NameChangerCustomEventBack); +} + +void namechanger_scene_revert_success_on_enter(void* context) { + NameChanger* namechanger = context; + Popup* popup = namechanger->popup; + + popup_set_icon(popup, 0, 2, &I_DolphinMafia_115x62); + popup_set_header(popup, "Reverted!", 70, 5, AlignLeft, AlignTop); + popup_set_text(popup, "Rebooting...", 70, 16, AlignLeft, AlignTop); + + popup_set_callback(popup, namechanger_scene_revert_success_popup_callback); + popup_set_context(popup, namechanger); + popup_set_timeout(popup, 5000); + popup_enable_timeout(popup); + + view_dispatcher_switch_to_view(namechanger->view_dispatcher, NameChangerViewPopup); +} + +bool namechanger_scene_revert_success_on_event(void* context, SceneManagerEvent event) { + NameChanger* namechanger = context; + bool consumed = false; + + if(event.type == SceneManagerEventTypeBack) { + consumed = true; + scene_manager_search_and_switch_to_previous_scene(namechanger->scene_manager, NameChangerSceneStart); + } else if(event.type == SceneManagerEventTypeCustom) { + consumed = true; + if(event.event == NameChangerCustomEventBack) { + scene_manager_search_and_switch_to_previous_scene( + namechanger->scene_manager, NameChangerSceneStart); + } + } + + return consumed; +} + +void namechanger_scene_revert_success_on_exit(void* context) { + NameChanger* namechanger = context; + Popup* popup = namechanger->popup; + + popup_set_text(popup, NULL, 0, 0, AlignCenter, AlignTop); + popup_set_icon(popup, 0, 0, NULL); + + popup_disable_timeout(popup); + popup_set_context(popup, NULL); + popup_set_callback(popup, NULL); + + furi_hal_power_reset(); +} \ No newline at end of file diff --git a/applications/plugins/namechanger/scenes/namechanger_scene_save_failed.- b/applications/plugins/namechanger/scenes/namechanger_scene_save_failed.- new file mode 100644 index 00000000000..9c9ee1bc7ca --- /dev/null +++ b/applications/plugins/namechanger/scenes/namechanger_scene_save_failed.- @@ -0,0 +1,50 @@ +#include "../namechanger_i.h" +#include + +static void namechanger_scene_save_failed_popup_callback(void* context) { + NameChanger* namechanger = context; + view_dispatcher_send_custom_event(namechanger->view_dispatcher, NameChangerCustomEventBack); +} + +void namechanger_scene_save_failed_on_enter(void* context) { + NameChanger* namechanger = context; + Popup* popup = namechanger->popup; + + popup_set_icon(popup, 5, 10, &I_Cry_dolph_55x52); + popup_set_header(popup, "Save", 80, 20, AlignLeft, AlignTop); + popup_set_text(popup, "Failed.", 80, 35, AlignLeft, AlignTop); + + popup_set_callback(popup, namechanger_scene_save_failed_popup_callback); + popup_set_context(popup, namechanger); + popup_set_timeout(popup, 5000); + popup_enable_timeout(popup); + + view_dispatcher_switch_to_view(namechanger->view_dispatcher, NameChangerViewPopup); +} + +bool namechanger_scene_save_failed_on_event(void* context, SceneManagerEvent event) { + NameChanger* namechanger = context; + bool consumed = false; + + if(event.type == SceneManagerEventTypeCustom) { + consumed = true; + if(event.event == NameChangerCustomEventBack) { + scene_manager_search_and_switch_to_previous_scene( + namechanger->scene_manager, NameChangerSceneStart); + } + } + + return consumed; +} + +void namechanger_scene_save_failed_on_exit(void* context) { + NameChanger* namechanger = context; + Popup* popup = namechanger->popup; + + popup_set_text(popup, NULL, 0, 0, AlignCenter, AlignTop); + popup_set_icon(popup, 0, 0, NULL); + + popup_disable_timeout(popup); + popup_set_context(popup, NULL); + popup_set_callback(popup, NULL); +} diff --git a/applications/plugins/namechanger/scenes/namechanger_scene_start.c b/applications/plugins/namechanger/scenes/namechanger_scene_start.c new file mode 100644 index 00000000000..3fe93f5a203 --- /dev/null +++ b/applications/plugins/namechanger/scenes/namechanger_scene_start.c @@ -0,0 +1,58 @@ +#include "../namechanger.h" + +enum SubmenuIndex { + SubmenuIndexChange, + SubmenuIndexRevert, +}; + +void namechanger_scene_start_submenu_callback(void* context, uint32_t index) { + NameChanger* namechanger = context; + view_dispatcher_send_custom_event(namechanger->view_dispatcher, index); +} + +void namechanger_scene_start_on_enter(void* context) { + NameChanger* namechanger = context; + Submenu* submenu = namechanger->submenu; + + submenu_add_item( + submenu, + "Change", + SubmenuIndexChange, + namechanger_scene_start_submenu_callback, + namechanger); + + submenu_add_item( + submenu, + "Revert", + SubmenuIndexRevert, + namechanger_scene_start_submenu_callback, + namechanger); + + submenu_set_selected_item( + submenu, scene_manager_get_scene_state(namechanger->scene_manager, NameChangerSceneStart)); + + view_dispatcher_switch_to_view(namechanger->view_dispatcher, NameChangerViewSubmenu); +} + +bool namechanger_scene_start_on_event(void* context, SceneManagerEvent event) { + NameChanger* namechanger = context; + bool consumed = false; + + if(event.type == SceneManagerEventTypeCustom) { + scene_manager_set_scene_state( + namechanger->scene_manager, NameChangerSceneStart, event.event); + consumed = true; + if(event.event == SubmenuIndexChange) { + scene_manager_next_scene(namechanger->scene_manager, NameChangerSceneChange); + } + if(event.event == SubmenuIndexRevert) { + scene_manager_next_scene(namechanger->scene_manager, NameChangerSceneRevert); + } + } + return consumed; +} + +void namechanger_scene_start_on_exit(void* context) { + NameChanger* namechanger = context; + submenu_reset(namechanger->submenu); +}