From 1bd7986823e774a929c8a9102a7cc96e245d5274 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Sun, 16 Feb 2025 15:16:24 +0200 Subject: [PATCH] fix: Allow changing default settings for existing app installs (#4464) --- .../shared/settings/BooleanSetting.java | 10 +++--- .../shared/settings/EnumSetting.java | 6 ++-- .../shared/settings/FloatSetting.java | 6 ++-- .../shared/settings/IntegerSetting.java | 6 ++-- .../shared/settings/LongSetting.java | 6 ++-- .../extension/shared/settings/Setting.java | 36 +++++++++++++++++-- .../shared/settings/StringSetting.java | 6 ++-- 7 files changed, 50 insertions(+), 26 deletions(-) diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/BooleanSetting.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/BooleanSetting.java index 7e84034d0..58745a16c 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/BooleanSetting.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/BooleanSetting.java @@ -47,6 +47,10 @@ public class BooleanSetting extends Setting { */ public static void privateSetValue(@NonNull BooleanSetting setting, @NonNull Boolean newValue) { setting.value = Objects.requireNonNull(newValue); + + if (setting.isSetToDefault()) { + setting.removeFromPreferences(); + } } @Override @@ -65,10 +69,8 @@ public class BooleanSetting extends Setting { } @Override - public void save(@NonNull Boolean newValue) { - // Must set before saving to preferences (otherwise importing fails to update UI correctly). - value = Objects.requireNonNull(newValue); - preferences.saveBoolean(key, newValue); + public void saveToPreferences() { + preferences.saveBoolean(key, value); } @NonNull diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/EnumSetting.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/EnumSetting.java index a2b82dd21..60972f0f5 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/EnumSetting.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/EnumSetting.java @@ -89,10 +89,8 @@ public class EnumSetting> extends Setting { } @Override - public void save(@NonNull T newValue) { - // Must set before saving to preferences (otherwise importing fails to update UI correctly). - value = Objects.requireNonNull(newValue); - preferences.saveEnumAsString(key, newValue); + public void saveToPreferences() { + preferences.saveEnumAsString(key, value); } @NonNull diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/FloatSetting.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/FloatSetting.java index 7419741e0..59846e037 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/FloatSetting.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/FloatSetting.java @@ -55,10 +55,8 @@ public class FloatSetting extends Setting { } @Override - public void save(@NonNull Float newValue) { - // Must set before saving to preferences (otherwise importing fails to update UI correctly). - value = Objects.requireNonNull(newValue); - preferences.saveFloatString(key, newValue); + public void saveToPreferences() { + preferences.saveFloatString(key, value); } @NonNull diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/IntegerSetting.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/IntegerSetting.java index 58f39a910..ccf128dfd 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/IntegerSetting.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/IntegerSetting.java @@ -55,10 +55,8 @@ public class IntegerSetting extends Setting { } @Override - public void save(@NonNull Integer newValue) { - // Must set before saving to preferences (otherwise importing fails to update UI correctly). - value = Objects.requireNonNull(newValue); - preferences.saveIntegerString(key, newValue); + public void saveToPreferences() { + preferences.saveIntegerString(key, value); } @NonNull diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/LongSetting.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/LongSetting.java index 4d7f8114f..ea3adceba 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/LongSetting.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/LongSetting.java @@ -55,10 +55,8 @@ public class LongSetting extends Setting { } @Override - public void save(@NonNull Long newValue) { - // Must set before saving to preferences (otherwise importing fails to update UI correctly). - value = Objects.requireNonNull(newValue); - preferences.saveLongString(key, newValue); + public void saveToPreferences() { + preferences.saveLongString(key, value); } @NonNull diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/Setting.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/Setting.java index 78852d370..2f6405d6b 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/Setting.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/Setting.java @@ -14,7 +14,6 @@ import java.util.*; import static app.revanced.extension.shared.StringRef.str; -@SuppressWarnings("unused") public abstract class Setting { /** @@ -288,6 +287,13 @@ public abstract class Setting { */ public static void privateSetValueFromString(@NonNull Setting setting, @NonNull String newValue) { setting.setValueFromString(newValue); + + // Clear the preference value since default is used, to allow changing + // the changing the default for a future release. Without this after upgrading + // the saved value will be whatever was the default when the app was first installed. + if (setting.isSetToDefault()) { + setting.removeFromPreferences(); + } } /** @@ -303,7 +309,33 @@ public abstract class Setting { /** * Persistently saves the value. */ - public abstract void save(@NonNull T newValue); + public final void save(@NonNull T newValue) { + if (value.equals(newValue)) { + return; + } + + // Must set before saving to preferences (otherwise importing fails to update UI correctly). + value = Objects.requireNonNull(newValue); + + if (defaultValue.equals(newValue)) { + removeFromPreferences(); + } else { + saveToPreferences(); + } + } + + /** + * Save {@link #value} to {@link #preferences}. + */ + protected abstract void saveToPreferences(); + + /** + * Remove {@link #value} from {@link #preferences}. + */ + protected final void removeFromPreferences() { + Logger.printDebug(() -> "Clearing stored preference value (reset to default): " + key); + preferences.removeKey(key); + } @NonNull public abstract T get(); diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/StringSetting.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/StringSetting.java index 0fa5e03fc..adb9beaa1 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/StringSetting.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/StringSetting.java @@ -55,10 +55,8 @@ public class StringSetting extends Setting { } @Override - public void save(@NonNull String newValue) { - // Must set before saving to preferences (otherwise importing fails to update UI correctly). - value = Objects.requireNonNull(newValue); - preferences.saveString(key, newValue); + public void saveToPreferences() { + preferences.saveString(key, value); } @NonNull