Introduce GBPrefsMigrator

This commit is contained in:
José Rebelo
2026-01-07 18:46:26 +00:00
parent 3919059069
commit 1b34e6dfb6
4 changed files with 48 additions and 31 deletions
@@ -89,7 +89,7 @@ import nodomain.freeyourgadget.gadgetbridge.impl.GBDeviceService;
import nodomain.freeyourgadget.gadgetbridge.model.DeviceService;
import nodomain.freeyourgadget.gadgetbridge.model.weather.Weather;
import nodomain.freeyourgadget.gadgetbridge.model.weather.WeatherCacheManager;
import nodomain.freeyourgadget.gadgetbridge.prefs.migrators.PreferenceMigrator55;
import nodomain.freeyourgadget.gadgetbridge.prefs.GBPrefsMigrator;
import nodomain.freeyourgadget.gadgetbridge.service.NotificationCollectorMonitorService;
import nodomain.freeyourgadget.gadgetbridge.util.AndroidUtils;
import nodomain.freeyourgadget.gadgetbridge.util.BondingUtil;
@@ -118,9 +118,6 @@ public class GBApplication extends Application {
private static final Lock dbLock = new ReentrantLock();
private static DeviceService deviceService;
private static SharedPreferences sharedPrefs;
public static final String PREFS_VERSION = "shared_preferences_version";
//if preferences have to be migrated, increment the following and add the migration logic in migratePrefs below; see http://stackoverflow.com/questions/16397848/how-can-i-migrate-android-preferences-with-a-new-version
private static final int CURRENT_PREFS_VERSION = 55;
private static final LimitedQueue<Integer, String> mIDSenderLookup = new LimitedQueue<>(16);
private static GBPrefs prefs;
@@ -294,13 +291,7 @@ public class GBApplication extends Application {
// slf4j may be implicitly initialized before we properly configured it.
setupLogging(isFileLoggingEnabled());
if (getPrefsFileVersion() != CURRENT_PREFS_VERSION) {
migratePrefs(getPrefsFileVersion());
}
// Uncomment the line below to force a device key migration, after you updated
// the devicetype.json file
//migrateDeviceTypes();
migratePrefsIfNeeded();
setupExceptionHandler(prefs.getBoolean("crash_notification", isDebug()));
@@ -743,25 +734,9 @@ public class GBApplication extends Application {
return result;
}
private int getPrefsFileVersion() {
try {
return Integer.parseInt(sharedPrefs.getString(PREFS_VERSION, "0")); //0 is legacy
} catch (Exception e) {
//in version 1 this was an int
return 1;
}
}
@VisibleForTesting
protected void migratePrefs(int oldVersion) {
SharedPreferences.Editor editor = sharedPrefs.edit();
if (oldVersion < 55) {
new PreferenceMigrator55().migrate(oldVersion, sharedPrefs, editor);
}
editor.putString(PREFS_VERSION, Integer.toString(CURRENT_PREFS_VERSION));
editor.apply();
protected void migratePrefsIfNeeded() {
GBPrefsMigrator.migratePrefsIfNeeded(sharedPrefs);
}
public static SharedPreferences getDeviceSpecificSharedPrefs(CharSequence deviceIdentifier) {
@@ -7,13 +7,14 @@ import androidx.preference.PreferenceCategory
import nodomain.freeyourgadget.gadgetbridge.GBApplication
import nodomain.freeyourgadget.gadgetbridge.R
import nodomain.freeyourgadget.gadgetbridge.activities.debug.preferences.PreferenceManagerActivity
import nodomain.freeyourgadget.gadgetbridge.prefs.GBPrefsMigrator
class PreferencesDebugFragment : AbstractDebugFragment() {
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
setPreferencesFromResource(R.xml.debug_preferences_preferences, rootKey)
findPreference<Preference>(PREF_DEBUG_PREFERENCES_VERSION)!!.summary = GBApplication.getPrefs().getString(
GBApplication.PREFS_VERSION,
GBPrefsMigrator.PREFS_VERSION,
getString(R.string.unknown)
)
@@ -0,0 +1,41 @@
package nodomain.freeyourgadget.gadgetbridge.prefs;
import android.content.SharedPreferences;
import android.util.Log;
import nodomain.freeyourgadget.gadgetbridge.prefs.migrators.PreferenceMigrator55;
public class GBPrefsMigrator {
private static final String TAG = "GBPrefsMigrator";
public static final String PREFS_VERSION = "shared_preferences_version";
//if preferences have to be migrated, increment the following and add the migration logic in migratePrefs below
// see http://stackoverflow.com/questions/16397848/how-can-i-migrate-android-preferences-with-a-new-version
private static final int CURRENT_PREFS_VERSION = 55;
public static void migratePrefsIfNeeded(final SharedPreferences sharedPrefs) {
final int oldVersion = getPrefsFileVersion(sharedPrefs);
if (oldVersion != CURRENT_PREFS_VERSION) {
Log.i(TAG, "Migrating preferences from " + oldVersion + " to " + CURRENT_PREFS_VERSION);
final SharedPreferences.Editor editor = sharedPrefs.edit();
// Create new migrator classes as needed, one per version
if (oldVersion < 55) {
new PreferenceMigrator55().migrate(oldVersion, sharedPrefs, editor);
}
editor.putString(PREFS_VERSION, Integer.toString(CURRENT_PREFS_VERSION));
editor.apply();
}
}
private static int getPrefsFileVersion(final SharedPreferences sharedPrefs) {
try {
return Integer.parseInt(sharedPrefs.getString(PREFS_VERSION, "0")); //0 is legacy
} catch (final Exception e) {
//in version 1 this was an int
return 1;
}
}
}
@@ -6,7 +6,7 @@ import nodomain.freeyourgadget.gadgetbridge.GBApplication;
public class GBTestApplication extends GBApplication {
@Override
protected void migratePrefs(final int oldVersion) {
protected void migratePrefsIfNeeded() {
// In tests, do not migrate preferences
// FIXME: This is not ideal. In tests, do not migrate preferences. We should be able to initialize
// the database before the application is created so that this works and is actually testable., but