From 80add046818d2c9ed7ff04cff7fcf3946f70c6b7 Mon Sep 17 00:00:00 2001 From: VerstreuteSeele Date: Fri, 6 Jan 2023 13:50:02 +0100 Subject: [PATCH] Non-functional. Please debug --- .../plugins/namechanger/application.fam | 13 ++ .../namechanger/icons/Cry_dolph_55x52.png | Bin 0 -> 3898 bytes .../namechanger/icons/DolphinMafia_115x62.png | Bin 0 -> 2504 bytes .../namechanger/icons/DolphinNice_96x59.png | Bin 0 -> 2459 bytes .../plugins/namechanger/icons/MarioBlock.png | Bin 0 -> 4616 bytes .../namechanger/icons/namechanger_10px.png | Bin 0 -> 1611 bytes .../plugins/namechanger/namechanger.c | 162 ++++++++++++++++++ .../plugins/namechanger/namechanger.h | 49 ++++++ .../plugins/namechanger/namechanger_10px.png | Bin 0 -> 1611 bytes .../namechanger/namechanger_custom_event.h | 6 + .../namechanger/scenes/namechanger_scene.c | 30 ++++ .../namechanger/scenes/namechanger_scene.h | 29 ++++ .../scenes/namechanger_scene_change.c | 56 ++++++ .../scenes/namechanger_scene_change_success.c | 51 ++++++ .../scenes/namechanger_scene_config.h | 5 + .../scenes/namechanger_scene_revert.c | 54 ++++++ .../scenes/namechanger_scene_revert_success.c | 55 ++++++ .../scenes/namechanger_scene_start.c | 58 +++++++ .../services/namechangersrv/application.fam | 7 + .../services/namechangersrv/namechangersrv.c | 160 +++++++++++++++++ .../services/namechangersrv/namechangersrv.h | 9 + 21 files changed, 744 insertions(+) create mode 100644 applications/plugins/namechanger/application.fam create mode 100644 applications/plugins/namechanger/icons/Cry_dolph_55x52.png create mode 100644 applications/plugins/namechanger/icons/DolphinMafia_115x62.png create mode 100644 applications/plugins/namechanger/icons/DolphinNice_96x59.png create mode 100644 applications/plugins/namechanger/icons/MarioBlock.png create mode 100644 applications/plugins/namechanger/icons/namechanger_10px.png create mode 100644 applications/plugins/namechanger/namechanger.c create mode 100644 applications/plugins/namechanger/namechanger.h create mode 100644 applications/plugins/namechanger/namechanger_10px.png create mode 100644 applications/plugins/namechanger/namechanger_custom_event.h create mode 100644 applications/plugins/namechanger/scenes/namechanger_scene.c create mode 100644 applications/plugins/namechanger/scenes/namechanger_scene.h create mode 100644 applications/plugins/namechanger/scenes/namechanger_scene_change.c create mode 100644 applications/plugins/namechanger/scenes/namechanger_scene_change_success.c create mode 100644 applications/plugins/namechanger/scenes/namechanger_scene_config.h create mode 100644 applications/plugins/namechanger/scenes/namechanger_scene_revert.c create mode 100644 applications/plugins/namechanger/scenes/namechanger_scene_revert_success.c create mode 100644 applications/plugins/namechanger/scenes/namechanger_scene_start.c create mode 100644 applications/services/namechangersrv/application.fam create mode 100644 applications/services/namechangersrv/namechangersrv.c create mode 100644 applications/services/namechangersrv/namechangersrv.h diff --git a/applications/plugins/namechanger/application.fam b/applications/plugins/namechanger/application.fam new file mode 100644 index 000000000..545f0b905 --- /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 0000000000000000000000000000000000000000..86d9db1b497cd9e49bb62987cb35075b4bc7a410 GIT binary patch literal 3898 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 literal 0 HcmV?d00001 diff --git a/applications/plugins/namechanger/icons/DolphinNice_96x59.png b/applications/plugins/namechanger/icons/DolphinNice_96x59.png new file mode 100644 index 0000000000000000000000000000000000000000..a299d3630239b4486e249cc501872bed5996df3b GIT binary patch literal 2459 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 I=KY7S0iJXAHUIzs literal 0 HcmV?d00001 diff --git a/applications/plugins/namechanger/namechanger.c b/applications/plugins/namechanger/namechanger.c new file mode 100644 index 000000000..17abcea72 --- /dev/null +++ b/applications/plugins/namechanger/namechanger.c @@ -0,0 +1,162 @@ +#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); +} + +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_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); +} + +int32_t namechanger_app() { + NameChanger* namechanger = namechanger_alloc(); + + 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; +} + +bool namechanger_name_write(NameChanger* namechanger, char* name) { + FuriString* file_path = furi_string_alloc(); + furi_string_set(file_path, "/ext/dolphin/name.txt"); + + bool result = false; + + //If name is not "eraseerase" (set by Revert) then write name to file + //otherwise, remove name.txt + + if(strcmp(name, "eraseerase") != 0) { + //save + FlipperFormat* file = flipper_format_file_alloc(namechanger->storage); + + do { + // 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(!flipper_format_write_string_cstr(file, "Name", name)) { + break; + } + + result = true; + } while(false); + + flipper_format_free(file); + + if(!result) { + FURI_LOG_E(TAG, "Cannot save name file."); + } + } else { + result = storage_simply_remove(namechanger->storage, furi_string_get_cstr(file_path)); + } + + return result; +} \ 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 000000000..e3355db1d --- /dev/null +++ b/applications/plugins/namechanger/namechanger.h @@ -0,0 +1,49 @@ +#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]; + + 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_write(NameChanger* namechanger, char* name); +void namechanger_text_store_set(NameChanger* namechanger, const char* text, ...); diff --git a/applications/plugins/namechanger/namechanger_10px.png b/applications/plugins/namechanger/namechanger_10px.png new file mode 100644 index 0000000000000000000000000000000000000000..60facf25e0e1615f2c3606324af8d7aa29d04a17 GIT binary patch literal 1611 zcmcIkzi-<{6s7|dNZn*fQNZX#T$TjL@wY0G2%9>VV=E|K!%-S_%kl0g5f*t2dA1~v z*#ZPG0whaOphLF|ow{Z4lBHYw2XyMzrCZuD?<9&1ip22}g1kHOzWd(ye(*io-PyXh z`uVD+X%~Cj-94DqdiDG{7|-nv{(|Y_V*9&F(?0oBJuBMxKdfomN57{1fgD6%2UKJR zVItt+WJSdWAEnzzCBJjD)2B!K)Mx0% zm-_W-00bGAM4x8kyb7ivn)3#*R-a9z&mnR@MC;0+K8SYp4N-EvZP=JvmZi6SgEQj9 zZgNd`EXOu&xIJt;folbxqt_P#b0tfHz3#2r7`%mOBxMnp=43K4CaxjMp=tZRZ(5G& zI2aJPn&pyAab8_sGIV)G%e0WG$aTd?VsRit1X341WJN=pS9P2qV&;?-rfpctrzJ3o zPKRb$gRbP}Ay}#PzLmJ@&kAnt@k$(&ly4sLTwY!pW3)M29F*g^r;M6>%rk&hAk1z| z6(b=U2nlxShE!INufYK!s18U(_uV6gZj)1syM8mhCd!PF#Y0Hm4*p z=CSL09wCgk+Do=?$`pPbGJca)sbawBQrd|V*1^oS+nBYy1e4gaG2xEww_9!EC7_DY zAQ5Fopia_^47pk4L!|$wW0HoGMjS{_N&W&>i9}9F$=8Pv>Gu|w`7ZGlIXqqZ*%JQ&rPpDl zBa#m}bWRf~XH3;%7D+MxpRf7e8|`QbhaRVvO?QQtra$u>s7vU+uU=hx37z{&ue;t~ zdq)2~US0c5TS?hxqvyZh{c3F>e|j>wu=VZjU;cPHyKv%Z=%3>U#^WFVRPDaExzqjm I=KY7S0iJXAHUIzs literal 0 HcmV?d00001 diff --git a/applications/plugins/namechanger/namechanger_custom_event.h b/applications/plugins/namechanger/namechanger_custom_event.h new file mode 100644 index 000000000..3485c870b --- /dev/null +++ b/applications/plugins/namechanger/namechanger_custom_event.h @@ -0,0 +1,6 @@ +#pragma once + +enum NameChangerCustomEvent { + NameChangerCustomEventBack, + NameChangerCustomEventTextEditResult, +}; diff --git a/applications/plugins/namechanger/scenes/namechanger_scene.c b/applications/plugins/namechanger/scenes/namechanger_scene.c new file mode 100644 index 000000000..82f96e466 --- /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 000000000..42071ab98 --- /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 000000000..32977d51a --- /dev/null +++ b/applications/plugins/namechanger/scenes/namechanger_scene_change.c @@ -0,0 +1,56 @@ +#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; + + namechanger_text_store_set(namechanger, "%s", furi_hal_version_get_name_ptr()); + + 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); +} + +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_name_write(namechanger, namechanger->text_store)) { + scene_manager_next_scene( + namechanger->scene_manager, NameChangerSceneChangeSuccess); + } else { + scene_manager_search_and_switch_to_previous_scene( + namechanger->scene_manager, NameChangerSceneStart); + } + } else { + scene_manager_search_and_switch_to_previous_scene( + namechanger->scene_manager, NameChangerSceneStart); + } + } + 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 000000000..1e0c3c2bb --- /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 000000000..41bbaef6b --- /dev/null +++ b/applications/plugins/namechanger/scenes/namechanger_scene_config.h @@ -0,0 +1,5 @@ +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) \ No newline at end of file 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 000000000..f030f8f8f --- /dev/null +++ b/applications/plugins/namechanger/scenes/namechanger_scene_revert.c @@ -0,0 +1,54 @@ +#include "../namechanger.h" + +static void + namechanger_scene_revert_widget_callback(GuiButtonType result, InputType type, void* context) { + NameChanger* namechanger = context; + if(type == InputTypeShort) { + view_dispatcher_send_custom_event(namechanger->view_dispatcher, result); + } +} + +void namechanger_scene_revert_on_enter(void* context) { + NameChanger* namechanger = context; + Widget* widget = namechanger->widget; + 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); + widget_add_button_element( + widget, + GuiButtonTypeRight, + "Revert", + namechanger_scene_revert_widget_callback, + namechanger); + 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; + if(event.type == SceneManagerEventTypeBack) { + consumed = true; + } else if(event.type == SceneManagerEventTypeCustom) { + consumed = true; + if(event.event == GuiButtonTypeRight) { + if(namechanger_name_write(namechanger, "eraseerase")) { + scene_manager_next_scene( + namechanger->scene_manager, NameChangerSceneRevertSuccess); + } else { + scene_manager_search_and_switch_to_previous_scene( + namechanger->scene_manager, NameChangerSceneStart); + } + } else if(event.event == GuiButtonTypeLeft) { + scene_manager_search_and_switch_to_previous_scene( + namechanger->scene_manager, NameChangerSceneStart); + } + } + return consumed; +} + +void namechanger_scene_revert_on_exit(void* context) { + NameChanger* namechanger = context; + widget_reset(namechanger->widget); +} 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 000000000..0be0a40ef --- /dev/null +++ b/applications/plugins/namechanger/scenes/namechanger_scene_revert_success.c @@ -0,0 +1,55 @@ +#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_start.c b/applications/plugins/namechanger/scenes/namechanger_scene_start.c new file mode 100644 index 000000000..3fe93f5a2 --- /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); +} diff --git a/applications/services/namechangersrv/application.fam b/applications/services/namechangersrv/application.fam new file mode 100644 index 000000000..b4bace40d --- /dev/null +++ b/applications/services/namechangersrv/application.fam @@ -0,0 +1,7 @@ +App( + appid="namechangersrv", + apptype=FlipperAppType.STARTUP, + entry_point="namechanger_on_system_start", + requires=["storage"], + order=1000, +) \ No newline at end of file diff --git a/applications/services/namechangersrv/namechangersrv.c b/applications/services/namechangersrv/namechangersrv.c new file mode 100644 index 000000000..933882ce2 --- /dev/null +++ b/applications/services/namechangersrv/namechangersrv.c @@ -0,0 +1,160 @@ +#include "namechangersrv.h" +#include "m-string.h" +#include +#include + +void namechanger_on_system_start() { + Storage* storage = furi_record_open(RECORD_STORAGE); + FlipperFormat* file = flipper_format_file_alloc(storage); + + FuriString* NAMEHEADER; + NAMEHEADER = furi_string_alloc_set("Flipper Name File"); + + FuriString* filepath; + filepath = furi_string_alloc_set("/ext/dolphin/name.txt"); + + bool result = false; + + FuriString* data; + data = furi_string_alloc(); + + do { + if(!flipper_format_file_open_existing(file, furi_string_get_cstr(filepath))) { + break; + } + + // header + uint32_t version; + + if(!flipper_format_read_header(file, data, &version)) { + break; + } + + if(furi_string_cmp_str(data, furi_string_get_cstr(NAMEHEADER)) != 0) { + break; + } + + if(version != 1) { + break; + } + + // get Name + if(!flipper_format_read_string(file, "Name", data)) { + break; + } + + result = true; + } while(false); + + flipper_format_free(file); + + if(!result) { + //file not good - write new one + FlipperFormat* file = flipper_format_file_alloc(storage); + + bool res = false; + + do { + // Open file for write + if(!flipper_format_file_open_always(file, furi_string_get_cstr(filepath))) { + break; + } + + // Write header + if(!flipper_format_write_header_cstr(file, furi_string_get_cstr(NAMEHEADER), 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 can contain other characters but use at your own risk.")) { + break; + } + + //Write name + if(!flipper_format_write_string_cstr(file, "Name", furi_hal_version_get_name_ptr())) { + break; + } + + res = true; + } while(false); + + flipper_format_free(file); + + if(!res) { + FURI_LOG_E(TAG, "Save failed."); + } + } else { + if(!furi_string_size(data)) { + //Empty file - get default name and write to file. + FlipperFormat* file = flipper_format_file_alloc(storage); + + bool res = false; + + do { + // Open file for write + if(!flipper_format_file_open_always(file, furi_string_get_cstr(filepath))) { + break; + } + + // Write header + if(!flipper_format_write_header_cstr(file, furi_string_get_cstr(NAMEHEADER), 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; + } + + //Write name + if(!flipper_format_write_string_cstr( + file, "Name", furi_hal_version_get_name_ptr())) { + break; + } + + res = true; + } while(false); + + flipper_format_free(file); + + if(!res) { + FURI_LOG_E(TAG, "Save failed."); + } + } else { + char newdata[9]; + snprintf(newdata, 9, "%s", furi_string_get_cstr(data)); + //set name from file + furi_hal_version_set_custom_name(newdata); + } + } + + furi_string_free(data); + + furi_string_free(filepath); + furi_record_close(RECORD_STORAGE); +} \ No newline at end of file diff --git a/applications/services/namechangersrv/namechangersrv.h b/applications/services/namechangersrv/namechangersrv.h new file mode 100644 index 000000000..c5014355b --- /dev/null +++ b/applications/services/namechangersrv/namechangersrv.h @@ -0,0 +1,9 @@ +#pragma once + +#include +#include + +#define NAMECHANGER_TEXT_STORE_SIZE 9 +#define NAMECHANGER_HEADER "Flipper Name File" + +#define TAG "NameChangerSRV"