diff --git a/applications/settings/storage_settings/scenes/storage_settings_scene_config.h b/applications/settings/storage_settings/scenes/storage_settings_scene_config.h index 18e7ba5aa..19c7434a9 100644 --- a/applications/settings/storage_settings/scenes/storage_settings_scene_config.h +++ b/applications/settings/storage_settings/scenes/storage_settings_scene_config.h @@ -7,3 +7,4 @@ ADD_SCENE(storage_settings, sd_info, SDInfo) ADD_SCENE(storage_settings, internal_info, InternalInfo) ADD_SCENE(storage_settings, benchmark, Benchmark) ADD_SCENE(storage_settings, factory_reset, FactoryReset) +ADD_SCENE(storage_settings, wipe_device, WipeDevice) \ No newline at end of file diff --git a/applications/settings/storage_settings/scenes/storage_settings_scene_format_confirm.c b/applications/settings/storage_settings/scenes/storage_settings_scene_format_confirm.c index 8af065bf8..63848e1c0 100644 --- a/applications/settings/storage_settings/scenes/storage_settings_scene_format_confirm.c +++ b/applications/settings/storage_settings/scenes/storage_settings_scene_format_confirm.c @@ -44,6 +44,7 @@ bool storage_settings_scene_format_confirm_on_event(void* context, SceneManagerE consumed = scene_manager_previous_scene(app->scene_manager); break; case DialogExResultRight: + scene_manager_set_scene_state(app->scene_manager, StorageSettingsFormatting, false); scene_manager_next_scene(app->scene_manager, StorageSettingsFormatting); consumed = true; break; diff --git a/applications/settings/storage_settings/scenes/storage_settings_scene_formatting.c b/applications/settings/storage_settings/scenes/storage_settings_scene_formatting.c index df5e3cc17..9ec655222 100644 --- a/applications/settings/storage_settings/scenes/storage_settings_scene_formatting.c +++ b/applications/settings/storage_settings/scenes/storage_settings_scene_formatting.c @@ -1,4 +1,5 @@ #include "../storage_settings.h" +#include static const NotificationMessage message_green_165 = { .type = NotificationMessageTypeLedGreen, @@ -47,8 +48,12 @@ void storage_settings_scene_formatting_on_enter(void* context) { dialog_ex_set_text( dialog_ex, storage_error_get_desc(error), 64, 32, AlignCenter, AlignCenter); } else { - dialog_ex_set_icon(dialog_ex, 72, 17, &I_DolphinCommon_56x48); - dialog_ex_set_header(dialog_ex, "Format\ncomplete!", 14, 15, AlignLeft, AlignTop); + if(scene_manager_get_scene_state(app->scene_manager, StorageSettingsFormatting)) { + power_reboot(PowerBootModeNormal); + } else { + dialog_ex_set_icon(dialog_ex, 72, 17, &I_DolphinCommon_56x48); + dialog_ex_set_header(dialog_ex, "Format\ncomplete!", 14, 15, AlignLeft, AlignTop); + } } dialog_ex_set_center_button_text(dialog_ex, "OK"); } diff --git a/applications/settings/storage_settings/scenes/storage_settings_scene_start.c b/applications/settings/storage_settings/scenes/storage_settings_scene_start.c index 9f41061b8..906ff9556 100644 --- a/applications/settings/storage_settings/scenes/storage_settings_scene_start.c +++ b/applications/settings/storage_settings/scenes/storage_settings_scene_start.c @@ -6,7 +6,8 @@ enum StorageSettingsStartSubmenuIndex { StorageSettingsStartSubmenuIndexUnmount, StorageSettingsStartSubmenuIndexFormat, StorageSettingsStartSubmenuIndexBenchy, - StorageSettingsStartSubmenuIndexFactoryReset + StorageSettingsStartSubmenuIndexFactoryReset, + StorageSettingsStartSubmenuIndexWipeDevice, }; static void storage_settings_scene_start_submenu_callback(void* context, uint32_t index) { @@ -55,6 +56,12 @@ void storage_settings_scene_start_on_enter(void* context) { StorageSettingsStartSubmenuIndexFactoryReset, storage_settings_scene_start_submenu_callback, app); + submenu_add_item( + submenu, + "Wipe Device", + StorageSettingsStartSubmenuIndexWipeDevice, + storage_settings_scene_start_submenu_callback, + app); submenu_set_selected_item( submenu, scene_manager_get_scene_state(app->scene_manager, StorageSettingsStart)); @@ -108,6 +115,14 @@ bool storage_settings_scene_start_on_event(void* context, SceneManagerEvent even scene_manager_next_scene(app->scene_manager, StorageSettingsFactoryReset); consumed = true; break; + case StorageSettingsStartSubmenuIndexWipeDevice: + scene_manager_set_scene_state( + app->scene_manager, + StorageSettingsStart, + StorageSettingsStartSubmenuIndexWipeDevice); + scene_manager_next_scene(app->scene_manager, StorageSettingsWipeDevice); + consumed = true; + break; } } return consumed; diff --git a/applications/settings/storage_settings/scenes/storage_settings_scene_wipe_device.c b/applications/settings/storage_settings/scenes/storage_settings_scene_wipe_device.c new file mode 100644 index 000000000..4c5e6728e --- /dev/null +++ b/applications/settings/storage_settings/scenes/storage_settings_scene_wipe_device.c @@ -0,0 +1,87 @@ +#include "../storage_settings.h" +#include + +#define STORAGE_SETTINGS_SCENE_WIPE_DEVICE_CONFIRM_COUNT 5 + +static void + storage_settings_scene_wipe_device_dialog_callback(DialogExResult result, void* context) { + StorageSettings* app = context; + + view_dispatcher_send_custom_event(app->view_dispatcher, result); +} + +void storage_settings_scene_wipe_device_on_enter(void* context) { + StorageSettings* app = context; + DialogEx* dialog_ex = app->dialog_ex; + + dialog_ex_set_context(dialog_ex, app); + dialog_ex_set_result_callback(dialog_ex, storage_settings_scene_wipe_device_dialog_callback); + + dialog_ex_set_left_button_text(dialog_ex, "Cancel"); + dialog_ex_set_right_button_text(dialog_ex, "Erase"); + + dialog_ex_set_header(dialog_ex, "Confirm full Wipe", 64, 10, AlignCenter, AlignCenter); + dialog_ex_set_text( + dialog_ex, + "Everything will be erased\r\nData and settings will be lost!", + 64, + 32, + AlignCenter, + AlignCenter); + + view_dispatcher_switch_to_view(app->view_dispatcher, StorageSettingsViewDialogEx); +} + +bool storage_settings_scene_wipe_device_on_event(void* context, SceneManagerEvent event) { + StorageSettings* app = context; + bool consumed = false; + + uint32_t counter = + scene_manager_get_scene_state(app->scene_manager, StorageSettingsWipeDevice); + + if(event.type == SceneManagerEventTypeCustom) { + switch(event.event) { + case DialogExResultLeft: + scene_manager_set_scene_state(app->scene_manager, StorageSettingsWipeDevice, 0); + consumed = scene_manager_previous_scene(app->scene_manager); + break; + case DialogExResultRight: + counter++; + if(counter < STORAGE_SETTINGS_SCENE_WIPE_DEVICE_CONFIRM_COUNT) { + furi_string_printf( + app->text_string, + "%ld presses left", + STORAGE_SETTINGS_SCENE_WIPE_DEVICE_CONFIRM_COUNT - counter); + dialog_ex_set_text( + app->dialog_ex, + furi_string_get_cstr(app->text_string), + 64, + 32, + AlignCenter, + AlignCenter); + scene_manager_set_scene_state( + app->scene_manager, StorageSettingsWipeDevice, counter); + } else { + furi_hal_rtc_set_flag(FuriHalRtcFlagFactoryReset); + scene_manager_set_scene_state(app->scene_manager, StorageSettingsFormatting, true); + scene_manager_next_scene(app->scene_manager, StorageSettingsFormatting); + } + + consumed = true; + break; + } + } else if(event.type == SceneManagerEventTypeBack) { + consumed = true; + } + + return consumed; +} + +void storage_settings_scene_wipe_device_on_exit(void* context) { + StorageSettings* app = context; + DialogEx* dialog_ex = app->dialog_ex; + + dialog_ex_reset(dialog_ex); + + furi_string_reset(app->text_string); +} diff --git a/applications/settings/storage_settings/storage_settings.c b/applications/settings/storage_settings/storage_settings.c index 77a8f0f22..4865a3f7c 100644 --- a/applications/settings/storage_settings/storage_settings.c +++ b/applications/settings/storage_settings/storage_settings.c @@ -41,8 +41,6 @@ static StorageSettings* storage_settings_alloc() { view_dispatcher_add_view( app->view_dispatcher, StorageSettingsViewDialogEx, dialog_ex_get_view(app->dialog_ex)); - scene_manager_next_scene(app->scene_manager, StorageSettingsStart); - return app; } @@ -65,10 +63,15 @@ static void storage_settings_free(StorageSettings* app) { free(app); } -int32_t storage_settings_app(void* p) { - UNUSED(p); +int32_t storage_settings_app(char* p) { StorageSettings* app = storage_settings_alloc(); + if(p && strlen(p) && strcmp(p, "wipe") == 0) { + scene_manager_next_scene(app->scene_manager, StorageSettingsWipeDevice); + } else { + scene_manager_next_scene(app->scene_manager, StorageSettingsStart); + } + view_dispatcher_run(app->view_dispatcher); storage_settings_free(app);