From e16d7beb992191a66950ae6606e8d4b4dd9c9b83 Mon Sep 17 00:00:00 2001 From: Willy-JL Date: Fri, 20 Jan 2023 20:14:51 +0000 Subject: [PATCH] Add popup before asset swap reboot --- .../scenes/xtreme_settings_scene_start.c | 30 +++++++------------ .../xtreme_settings/xtreme_settings_app.c | 26 ++++++++++++++++ .../xtreme_settings/xtreme_settings_app.h | 5 ++++ 3 files changed, 42 insertions(+), 19 deletions(-) diff --git a/applications/settings/xtreme_settings/scenes/xtreme_settings_scene_start.c b/applications/settings/xtreme_settings/scenes/xtreme_settings_scene_start.c index e09d134bc..b445d8888 100644 --- a/applications/settings/xtreme_settings/scenes/xtreme_settings_scene_start.c +++ b/applications/settings/xtreme_settings/scenes/xtreme_settings_scene_start.c @@ -3,15 +3,13 @@ #include #include -bool settings_changed; -bool assets_changed; - static void xtreme_settings_scene_start_base_graphics_changed(VariableItem* item) { + XtremeSettingsApp* app = variable_item_get_context(item); bool value = variable_item_get_current_value_index(item); variable_item_set_current_value_text(item, value ? "SFW" : "NSFW"); XTREME_SETTINGS()->sfw_mode = value; - settings_changed = true; - assets_changed = true; + app->settings_changed = true; + app->assets_changed = true; } static void xtreme_settings_scene_start_asset_pack_changed(VariableItem* item) { @@ -19,8 +17,8 @@ static void xtreme_settings_scene_start_asset_pack_changed(VariableItem* item) { uint8_t index = variable_item_get_current_value_index(item); variable_item_set_current_value_text(item, index == 0 ? "OFF" : *asset_packs_get(app->asset_packs, index - 1)); strlcpy(XTREME_SETTINGS()->asset_pack, index == 0 ? "" : *asset_packs_get(app->asset_packs, index - 1), MAX_PACK_NAME_LEN); - settings_changed = true; - assets_changed = true; + app->settings_changed = true; + app->assets_changed = true; } #define CYCLE_ANIMS_COUNT 13 @@ -42,17 +40,19 @@ const char* const cycle_anims_names[CYCLE_ANIMS_COUNT] = { const int32_t cycle_anims_values[CYCLE_ANIMS_COUNT] = {-1, 0, 30, 60, 300, 600, 900, 1800, 3600, 7200, 21600, 43200, 86400}; static void xtreme_settings_scene_start_cycle_anims_changed(VariableItem* item) { + XtremeSettingsApp* app = variable_item_get_context(item); uint8_t index = variable_item_get_current_value_index(item); variable_item_set_current_value_text(item, cycle_anims_names[index]); XTREME_SETTINGS()->cycle_anims = cycle_anims_values[index]; - settings_changed = true; + app->settings_changed = true; } static void xtreme_settings_scene_start_unlock_anims_changed(VariableItem* item) { + XtremeSettingsApp* app = variable_item_get_context(item); bool value = variable_item_get_current_value_index(item); variable_item_set_current_value_text(item, value ? "ON" : "OFF"); XTREME_SETTINGS()->unlock_anims = value; - settings_changed = true; + app->settings_changed = true; } #define BATTERY_STYLE_COUNT 7 @@ -68,10 +68,11 @@ const uint32_t battery_style_values[BATTERY_STYLE_COUNT] = { BatteryStyleBarPercent }; static void xtreme_settings_scene_start_battery_style_changed(VariableItem* item) { + XtremeSettingsApp* app = variable_item_get_context(item); uint8_t index = variable_item_get_current_value_index(item); variable_item_set_current_value_text(item, battery_style_names[index]); XTREME_SETTINGS()->battery_style = battery_style_values[index]; - settings_changed = true; + app->settings_changed = true; } static void xtreme_settings_scene_start_xp_level_changed(VariableItem* item) { @@ -112,8 +113,6 @@ static void xtreme_settings_scene_start_subghz_bypass_changed(VariableItem* item void xtreme_settings_scene_start_on_enter(void* context) { XtremeSettingsApp* app = context; - settings_changed = false; - assets_changed = false; XtremeSettings* xtreme_settings = XTREME_SETTINGS(); VariableItemList* var_item_list = app->var_item_list; VariableItem* item; @@ -246,13 +245,6 @@ bool xtreme_settings_scene_start_on_event(void* context, SceneManagerEvent event void xtreme_settings_scene_start_on_exit(void* context) { XtremeSettingsApp* app = context; - if (settings_changed) { - XTREME_SETTINGS_SAVE(); - if (assets_changed) { - power_reboot(PowerBootModeNormal); - } - } - Dolphin* dolphin = furi_record_open(RECORD_DOLPHIN); DolphinStats stats = dolphin_stats(dolphin); if (app->dolphin_level != stats.level) { diff --git a/applications/settings/xtreme_settings/xtreme_settings_app.c b/applications/settings/xtreme_settings/xtreme_settings_app.c index 96b507bf6..53aa4e4c0 100644 --- a/applications/settings/xtreme_settings/xtreme_settings_app.c +++ b/applications/settings/xtreme_settings/xtreme_settings_app.c @@ -6,9 +6,27 @@ static bool xtreme_settings_custom_event_callback(void* context, uint32_t event) return scene_manager_handle_custom_event(app->scene_manager, event); } +void xtreme_settings_reboot(void* context) { + UNUSED(context); + power_reboot(PowerBootModeNormal); +} + static bool xtreme_settings_back_event_callback(void* context) { furi_assert(context); XtremeSettingsApp* app = context; + if (app->settings_changed) { + XTREME_SETTINGS_SAVE(); + if (app->assets_changed) { + popup_set_header(app->popup, "Rebooting...", 64, 24, AlignCenter, AlignCenter); + popup_set_text(app->popup, "Swapping assets...", 64, 42, AlignCenter, AlignCenter); + popup_set_callback(app->popup, xtreme_settings_reboot); + popup_set_context(app->popup, app); + popup_set_timeout(app->popup, 1000); + popup_enable_timeout(app->popup); + view_dispatcher_switch_to_view(app->view_dispatcher, XtremeSettingsAppViewPopup); + return true; + } + } return scene_manager_handle_back_event(app->scene_manager); } @@ -36,6 +54,12 @@ XtremeSettingsApp* xtreme_settings_app_alloc() { XtremeSettingsAppViewVarItemList, variable_item_list_get_view(app->var_item_list)); + app->popup = popup_alloc(); + view_dispatcher_add_view( + app->view_dispatcher, + XtremeSettingsAppViewPopup, + popup_get_view(app->popup)); + // Set first scene scene_manager_next_scene(app->scene_manager, XtremeSettingsAppSceneStart); return app; @@ -47,6 +71,8 @@ void xtreme_settings_app_free(XtremeSettingsApp* app) { // Gui modules view_dispatcher_remove_view(app->view_dispatcher, XtremeSettingsAppViewVarItemList); variable_item_list_free(app->var_item_list); + view_dispatcher_remove_view(app->view_dispatcher, XtremeSettingsAppViewPopup); + popup_free(app->popup); // View Dispatcher and Scene Manager view_dispatcher_free(app->view_dispatcher); diff --git a/applications/settings/xtreme_settings/xtreme_settings_app.h b/applications/settings/xtreme_settings/xtreme_settings_app.h index a130083ac..b38133b16 100644 --- a/applications/settings/xtreme_settings/xtreme_settings_app.h +++ b/applications/settings/xtreme_settings/xtreme_settings_app.h @@ -7,6 +7,7 @@ #include #include #include +#include #include "xtreme_settings.h" #include "xtreme_assets.h" #include "scenes/xtreme_settings_scene.h" @@ -22,10 +23,14 @@ typedef struct { SceneManager* scene_manager; ViewDispatcher* view_dispatcher; VariableItemList* var_item_list; + Popup* popup; int dolphin_level; + bool settings_changed; + bool assets_changed; asset_packs_t asset_packs; } XtremeSettingsApp; typedef enum { XtremeSettingsAppViewVarItemList, + XtremeSettingsAppViewPopup, } XtremeSettingsAppView;