Skip to content

Commit

Permalink
Draft plugin for migrating desktop settings
Browse files Browse the repository at this point in the history
  • Loading branch information
Willy-JL committed Feb 5, 2025
1 parent 76303fd commit 2658c80
Show file tree
Hide file tree
Showing 3 changed files with 194 additions and 4 deletions.
8 changes: 8 additions & 0 deletions applications/services/desktop/application.fam
Original file line number Diff line number Diff line change
Expand Up @@ -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"],
)
22 changes: 18 additions & 4 deletions applications/services/desktop/desktop_settings.c
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

#include <saved_struct.h>
#include <storage/storage.h>
#include <lib/toolbox/load_plugin.h>

#define TAG "DesktopSettings"

Expand All @@ -12,17 +13,30 @@
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),
DESKTOP_SETTINGS_MAGIC,
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);
}
}
}

Expand Down
168 changes: 168 additions & 0 deletions applications/services/desktop/desktop_settings_migrate.c
Original file line number Diff line number Diff line change
@@ -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;
}

0 comments on commit 2658c80

Please sign in to comment.