diff --git a/applications/services/desktop/animations/animation_manager.c b/applications/services/desktop/animations/animation_manager.c index d4e285e93..87a0eade7 100644 --- a/applications/services/desktop/animations/animation_manager.c +++ b/applications/services/desktop/animations/animation_manager.c @@ -201,8 +201,7 @@ static void animation_manager_start_new_idle(AnimationManager* animation_manager const BubbleAnimation* bubble_animation = animation_storage_get_bubble_animation(animation_manager->current_animation); animation_manager->state = AnimationManagerStateIdle; - XtremeSettings* xtreme = malloc(sizeof(XtremeSettings)); - XTREME_SETTINGS_LOAD(xtreme); + XtremeSettings* xtreme = XTREME_SETTINGS(); int32_t duration = 0; if (xtreme->cycle_animation == 0) { duration = bubble_animation->duration; @@ -210,7 +209,6 @@ static void animation_manager_start_new_idle(AnimationManager* animation_manager duration = xtreme->cycle_animation; } furi_timer_start(animation_manager->idle_animation_timer, duration * 1000); - free(xtreme); } static bool animation_manager_check_blocking(AnimationManager* animation_manager) { @@ -520,8 +518,7 @@ void animation_manager_load_and_continue_animation(AnimationManager* animation_m } else { const BubbleAnimation* bubble_animation = animation_storage_get_bubble_animation( animation_manager->current_animation); - XtremeSettings* xtreme = malloc(sizeof(XtremeSettings)); - XTREME_SETTINGS_LOAD(xtreme); + XtremeSettings* xtreme = XTREME_SETTINGS(); int32_t duration = 0; if (xtreme->cycle_animation == 0) { duration = bubble_animation->duration; @@ -530,7 +527,6 @@ void animation_manager_load_and_continue_animation(AnimationManager* animation_m } furi_timer_start( animation_manager->idle_animation_timer, duration * 1000); - free(xtreme); } } } else { 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 d2414b218..11c574a88 100644 --- a/applications/settings/xtreme_settings/scenes/xtreme_settings_scene_start.c +++ b/applications/settings/xtreme_settings/scenes/xtreme_settings_scene_start.c @@ -22,14 +22,15 @@ const int32_t cycle_animation_values[CYCLE_ANIMATION_COUNT] = {-1, 0, 30, 60, 300, 600, 900, 1800, 3600, 7200, 21600, 43200, 86400}; static void xtreme_settings_scene_start_cycle_animation_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_animation_names[index]); - app->settings.cycle_animation = cycle_animation_values[index]; + XTREME_SETTINGS()->cycle_animation = cycle_animation_values[index]; + XTREME_SETTINGS_SAVE(); } void xtreme_settings_scene_start_on_enter(void* context) { XtremeSettingsApp* app = context; + XtremeSettings* xtreme = XTREME_SETTINGS(); VariableItemList* var_item_list = app->var_item_list; VariableItem* item; uint8_t value_index; @@ -40,9 +41,8 @@ void xtreme_settings_scene_start_on_enter(void* context) { CYCLE_ANIMATION_COUNT, xtreme_settings_scene_start_cycle_animation_changed, app); - value_index = value_index_int32( - app->settings.cycle_animation, cycle_animation_values, CYCLE_ANIMATION_COUNT); + xtreme->unlock_animations, cycle_animation_values, CYCLE_ANIMATION_COUNT); variable_item_set_current_value_index(item, value_index); variable_item_set_current_value_text(item, cycle_animation_names[value_index]); diff --git a/applications/settings/xtreme_settings/xtreme_settings.c b/applications/settings/xtreme_settings/xtreme_settings.c index e1d1e13b4..f3a9f62e5 100644 --- a/applications/settings/xtreme_settings/xtreme_settings.c +++ b/applications/settings/xtreme_settings/xtreme_settings.c @@ -1,18 +1,35 @@ #include "xtreme_settings.h" -bool XTREME_SETTINGS_LOAD(XtremeSettings* xtreme_settings) { +XtremeSettings* xtreme_settings = NULL; + +XtremeSettings* XTREME_SETTINGS() { + if (xtreme_settings == NULL) { + xtreme_settings = malloc(sizeof(XtremeSettings)); + _XTREME_SETTINGS_LOAD(xtreme_settings); + } + return xtreme_settings; +} + +bool XTREME_SETTINGS_SAVE() { + if (xtreme_settings == NULL) { + XTREME_SETTINGS(); + } + return _XTREME_SETTINGS_SAVE(xtreme_settings); +} + +bool _XTREME_SETTINGS_LOAD(XtremeSettings* xtreme_settings) { furi_assert(xtreme_settings); bool loaded = saved_struct_load( XTREME_SETTINGS_PATH, xtreme_settings, sizeof(XtremeSettings), XTREME_SETTINGS_MAGIC, XTREME_SETTINGS_VERSION); if(!loaded) { memset(xtreme_settings, 0, sizeof(XtremeSettings)); - loaded = XTREME_SETTINGS_SAVE(xtreme_settings); + loaded = _XTREME_SETTINGS_SAVE(xtreme_settings); } return loaded; } -bool XTREME_SETTINGS_SAVE(XtremeSettings* xtreme_settings) { +bool _XTREME_SETTINGS_SAVE(XtremeSettings* xtreme_settings) { furi_assert(xtreme_settings); return saved_struct_save( diff --git a/applications/settings/xtreme_settings/xtreme_settings.h b/applications/settings/xtreme_settings/xtreme_settings.h index e46ad5da4..5df94c427 100644 --- a/applications/settings/xtreme_settings/xtreme_settings.h +++ b/applications/settings/xtreme_settings/xtreme_settings.h @@ -14,9 +14,14 @@ typedef struct { int32_t cycle_animation; + bool unlock_animations; // uint8_t sfw_mode; } XtremeSettings; -bool XTREME_SETTINGS_LOAD(XtremeSettings* xtreme_settings); +XtremeSettings* XTREME_SETTINGS(); -bool XTREME_SETTINGS_SAVE(XtremeSettings* xtreme_settings); +bool XTREME_SETTINGS_SAVE(); + +bool _XTREME_SETTINGS_LOAD(XtremeSettings* xtreme_settings); + +bool _XTREME_SETTINGS_SAVE(XtremeSettings* xtreme_settings); diff --git a/applications/settings/xtreme_settings/xtreme_settings_app.c b/applications/settings/xtreme_settings/xtreme_settings_app.c index b7b8b0c84..96b507bf6 100644 --- a/applications/settings/xtreme_settings/xtreme_settings_app.c +++ b/applications/settings/xtreme_settings/xtreme_settings_app.c @@ -14,9 +14,6 @@ static bool xtreme_settings_back_event_callback(void* context) { XtremeSettingsApp* xtreme_settings_app_alloc() { XtremeSettingsApp* app = malloc(sizeof(XtremeSettingsApp)); - - // Load settings - XTREME_SETTINGS_LOAD(&app->settings); app->gui = furi_record_open(RECORD_GUI); // View Dispatcher and Scene Manager @@ -46,7 +43,7 @@ XtremeSettingsApp* xtreme_settings_app_alloc() { void xtreme_settings_app_free(XtremeSettingsApp* app) { furi_assert(app); - XTREME_SETTINGS_SAVE(&app->settings); + // Gui modules view_dispatcher_remove_view(app->view_dispatcher, XtremeSettingsAppViewVarItemList); variable_item_list_free(app->var_item_list); diff --git a/applications/settings/xtreme_settings/xtreme_settings_app.h b/applications/settings/xtreme_settings/xtreme_settings_app.h index 64c31804c..0f59d5cae 100644 --- a/applications/settings/xtreme_settings/xtreme_settings_app.h +++ b/applications/settings/xtreme_settings/xtreme_settings_app.h @@ -11,7 +11,6 @@ #include "scenes/xtreme_settings_scene.h" typedef struct { - XtremeSettings settings; Gui* gui; SceneManager* scene_manager; ViewDispatcher* view_dispatcher;