Draft plugin for migrating desktop settings

This commit is contained in:
Willy-JL
2025-02-05 06:12:40 +00:00
parent 76303fdc24
commit 2658c80272
3 changed files with 194 additions and 4 deletions
@@ -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"],
)
@@ -3,6 +3,7 @@
#include <saved_struct.h>
#include <storage/storage.h>
#include <lib/toolbox/load_plugin.h>
#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);
}
}
}
@@ -0,0 +1,168 @@
#include "desktop_settings.h"
#include <stdlib.h>
#include <toolbox/saved_struct.h>
#include <string.h>
#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 <flipper_application/flipper_application.h>
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;
}