From 2658c80272fe7716d334dc3c91c0f8cd1a459854 Mon Sep 17 00:00:00 2001 From: Willy-JL <49810075+Willy-JL@users.noreply.github.com> Date: Wed, 5 Feb 2025 06:12:40 +0000 Subject: [PATCH] Draft plugin for migrating desktop settings --- applications/services/desktop/application.fam | 8 + .../services/desktop/desktop_settings.c | 22 ++- .../desktop/desktop_settings_migrate.c | 168 ++++++++++++++++++ 3 files changed, 194 insertions(+), 4 deletions(-) create mode 100644 applications/services/desktop/desktop_settings_migrate.c diff --git a/applications/services/desktop/application.fam b/applications/services/desktop/application.fam index da6e2b802..29579a1c6 100644 --- a/applications/services/desktop/application.fam +++ b/applications/services/desktop/application.fam @@ -15,3 +15,11 @@ App( stack_size=2 * 1024, order=60, ) + +App( + appid="desktop_settings_migrate", + apptype=FlipperAppType.PLUGIN, + entry_point="desktop_settings_migrate_ep", + requires=["desktop"], + sources=["desktop_settings_migrate.c"], +) diff --git a/applications/services/desktop/desktop_settings.c b/applications/services/desktop/desktop_settings.c index 794d777f3..438b1fa48 100644 --- a/applications/services/desktop/desktop_settings.c +++ b/applications/services/desktop/desktop_settings.c @@ -3,6 +3,7 @@ #include #include +#include #define TAG "DesktopSettings" @@ -12,7 +13,7 @@ void desktop_settings_load(DesktopSettings* settings) { furi_assert(settings); - const bool success = saved_struct_load( + bool success = saved_struct_load( DESKTOP_SETTINGS_PATH, settings, sizeof(DesktopSettings), @@ -20,9 +21,22 @@ void desktop_settings_load(DesktopSettings* settings) { DESKTOP_SETTINGS_VER); if(!success) { - FURI_LOG_W(TAG, "Failed to load file, using defaults"); - memset(settings, 0, sizeof(DesktopSettings)); - // desktop_settings_save(settings); + if(storage_file_exists(furi_record_open(RECORD_STORAGE), DESKTOP_SETTINGS_PATH)) { + bool (*desktop_settings_migrate)(DesktopSettings* settings, const char* path) = NULL; + PluginManager* manager = NULL; + if(load_plugin( + "desktop", 1, "desktop_settings_migrate", &desktop_settings_migrate, &manager)) { + success = desktop_settings_migrate(settings, DESKTOP_SETTINGS_PATH); + plugin_manager_free(manager); + } + } + furi_record_close(RECORD_STORAGE); + + if(!success) { + FURI_LOG_W(TAG, "Failed to load file, using defaults"); + memset(settings, 0, sizeof(DesktopSettings)); + // desktop_settings_save(settings); + } } } diff --git a/applications/services/desktop/desktop_settings_migrate.c b/applications/services/desktop/desktop_settings_migrate.c new file mode 100644 index 000000000..2e036cfb2 --- /dev/null +++ b/applications/services/desktop/desktop_settings_migrate.c @@ -0,0 +1,168 @@ +#include "desktop_settings.h" + +#include +#include +#include + +#define DESKTOP_SETTINGS_MAGIC_MNTM (0x13) +typedef struct { + uint32_t auto_lock_delay_ms; + uint8_t auto_lock_with_pin; + uint8_t display_clock; +} DesktopSettingsMntmV11; + +#define DESKTOP_SETTINGS_MAGIC_OFW_UL (0x17) +typedef struct { + char name_or_path[128]; +} FavoriteApp; +typedef struct { + uint32_t auto_lock_delay_ms; + uint8_t dummy_mode; + uint8_t display_clock; + FavoriteApp favorite_apps[4]; + FavoriteApp dummy_apps[4]; +} DesktopSettingsOfwV11; +typedef struct { + uint8_t reserved[11]; + DesktopSettingsOfwV11 settings; +} DesktopSettingsOfwV10; +typedef struct { + uint32_t auto_lock_delay_ms; + uint8_t usb_inhibit_auto_lock; + uint8_t displayBatteryPercentage; + uint8_t dummy_mode; + uint8_t display_clock; + FavoriteApp favorite_apps[4]; + FavoriteApp dummy_apps[9]; +} DesktopSettingsUlV16; +typedef struct { + uint32_t auto_lock_delay_ms; + uint32_t auto_poweroff_delay_ms; + uint8_t displayBatteryPercentage; + uint8_t dummy_mode; + uint8_t display_clock; + FavoriteApp favorite_apps[4]; + FavoriteApp dummy_apps[9]; +} DesktopSettingsUlV15; +typedef struct { + uint32_t auto_lock_delay_ms; + uint8_t displayBatteryPercentage; + uint8_t dummy_mode; + uint8_t display_clock; + FavoriteApp favorite_apps[4]; + FavoriteApp dummy_apps[9]; +} DesktopSettingsUlV14; +typedef struct { + uint8_t reserved[11]; + uint32_t auto_lock_delay_ms; + uint8_t displayBatteryPercentage; + uint8_t dummy_mode; + uint8_t display_clock; + FavoriteApp favorite_apps[4]; + FavoriteApp dummy_apps[9]; +} DesktopSettingsUlV13; + +bool desktop_settings_migrate(DesktopSettings* settings, const char* path) { + uint8_t magic, version; + size_t size; + if(!saved_struct_get_metadata(path, &magic, &version, &size)) { + return false; + } + + // Set defaults + memset(settings, 0, sizeof(DesktopSettings)); + + // Try to migrate from Momentum + if(magic == DESKTOP_SETTINGS_MAGIC_MNTM) { + if(version == 11 && size == sizeof(DesktopSettingsMntmV11)) { + DesktopSettingsMntmV11 mntm_v11; + bool success = saved_struct_load(path, &mntm_v11, sizeof(mntm_v11), magic, version); + if(success) { + settings->auto_lock_delay_ms = mntm_v11.auto_lock_delay_ms; + settings->auto_lock_with_pin = mntm_v11.auto_lock_with_pin; + settings->display_clock = mntm_v11.display_clock; + } + return success; + } + } + + if(magic == DESKTOP_SETTINGS_MAGIC_OFW_UL) { + // Try to migrate from OFW + if(version == 11 && size == sizeof(DesktopSettingsOfwV11)) { + DesktopSettingsOfwV11* ofw_v11 = malloc(sizeof(DesktopSettingsOfwV11)); + bool success = saved_struct_load(path, ofw_v11, sizeof(*ofw_v11), magic, version); + if(success) { + settings->auto_lock_delay_ms = ofw_v11->auto_lock_delay_ms; + settings->display_clock = ofw_v11->display_clock; + } + free(ofw_v11); + return success; + } + if(version == 10 && size == sizeof(DesktopSettingsOfwV10)) { + DesktopSettingsOfwV10* ofw_v10 = malloc(sizeof(DesktopSettingsOfwV10)); + bool success = saved_struct_load(path, ofw_v10, sizeof(*ofw_v10), magic, version); + if(success) { + settings->auto_lock_delay_ms = ofw_v10->settings.auto_lock_delay_ms; + settings->display_clock = ofw_v10->settings.display_clock; + } + free(ofw_v10); + return success; + } + + // Try to migrate from Unleashed + if(version == 16 && size == sizeof(DesktopSettingsUlV16)) { + DesktopSettingsUlV16* ul_v16 = malloc(sizeof(DesktopSettingsUlV16)); + bool success = saved_struct_load(path, ul_v16, sizeof(*ul_v16), magic, version); + if(success) { + settings->auto_lock_delay_ms = ul_v16->auto_lock_delay_ms; + settings->usb_inhibit_auto_lock = ul_v16->usb_inhibit_auto_lock; + settings->display_clock = ul_v16->display_clock; + } + free(ul_v16); + return success; + } + if(version == 15 && size == sizeof(DesktopSettingsUlV15)) { + DesktopSettingsUlV15* ul_v15 = malloc(sizeof(DesktopSettingsUlV15)); + bool success = saved_struct_load(path, ul_v15, sizeof(*ul_v15), magic, version); + if(success) { + settings->auto_lock_delay_ms = ul_v15->auto_lock_delay_ms; + settings->display_clock = ul_v15->display_clock; + } + free(ul_v15); + return success; + } + if(version == 14 && size == sizeof(DesktopSettingsUlV14)) { + DesktopSettingsUlV14* ul_v14 = malloc(sizeof(DesktopSettingsUlV14)); + bool success = saved_struct_load(path, ul_v14, sizeof(*ul_v14), magic, version); + if(success) { + settings->auto_lock_delay_ms = ul_v14->auto_lock_delay_ms; + settings->display_clock = ul_v14->display_clock; + } + free(ul_v14); + return success; + } + if(version == 13 && size == sizeof(DesktopSettingsUlV13)) { + DesktopSettingsUlV13* ul_v13 = malloc(sizeof(DesktopSettingsUlV13)); + bool success = saved_struct_load(path, ul_v13, sizeof(*ul_v13), magic, version); + if(success) { + settings->auto_lock_delay_ms = ul_v13->auto_lock_delay_ms; + settings->display_clock = ul_v13->display_clock; + } + free(ul_v13); + return success; + } + } + return false; +} + +#include + +static const FlipperAppPluginDescriptor plugin_descriptor = { + .appid = "desktop", + .ep_api_version = 1, + .entry_point = &desktop_settings_migrate, +}; + +const FlipperAppPluginDescriptor* desktop_settings_migrate_ep(void) { + return &plugin_descriptor; +}