Non-functional. Please debug

This commit is contained in:
VerstreuteSeele
2023-01-06 13:50:02 +01:00
parent 5937ac3c30
commit 80add04681
21 changed files with 744 additions and 0 deletions

View File

@@ -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",
)

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@@ -0,0 +1,162 @@
#include "namechanger.h"
#include "scenes/namechanger_scene.h"
#include <toolbox/path.h>
#include <flipper_format/flipper_format.h>
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;
}

View File

@@ -0,0 +1,49 @@
#pragma once
#include <furi_hal.h>
#include <gui/gui.h>
#include <gui/view.h>
#include <gui/view_dispatcher.h>
#include <gui/scene_manager.h>
#include <storage/storage.h>
#include <NameChanger_icons.h>
#include <gui/modules/submenu.h>
#include <gui/modules/popup.h>
#include <gui/modules/text_input.h>
#include <gui/modules/widget.h>
#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, ...);

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@@ -0,0 +1,6 @@
#pragma once
enum NameChangerCustomEvent {
NameChangerCustomEventBack,
NameChangerCustomEventTextEditResult,
};

View File

@@ -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,
};

View File

@@ -0,0 +1,29 @@
#pragma once
#include <gui/scene_manager.h>
// 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

View File

@@ -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);
}

View File

@@ -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();
}

View File

@@ -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)

View File

@@ -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);
}

View File

@@ -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();
}

View File

@@ -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);
}

View File

@@ -0,0 +1,7 @@
App(
appid="namechangersrv",
apptype=FlipperAppType.STARTUP,
entry_point="namechanger_on_system_start",
requires=["storage"],
order=1000,
)

View File

@@ -0,0 +1,160 @@
#include "namechangersrv.h"
#include "m-string.h"
#include <toolbox/path.h>
#include <flipper_format/flipper_format.h>
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);
}

View File

@@ -0,0 +1,9 @@
#pragma once
#include <furi_hal.h>
#include <storage/storage.h>
#define NAMECHANGER_TEXT_STORE_SIZE 9
#define NAMECHANGER_HEADER "Flipper Name File"
#define TAG "NameChangerSRV"