fix: Allow changing default settings for existing app installs (#4464)

This commit is contained in:
LisoUseInAIKyrios 2025-02-16 15:16:24 +02:00 committed by GitHub
parent 564c07c5a3
commit 1bd7986823
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 50 additions and 26 deletions

View File

@ -47,6 +47,10 @@ public class BooleanSetting extends Setting<Boolean> {
*/ */
public static void privateSetValue(@NonNull BooleanSetting setting, @NonNull Boolean newValue) { public static void privateSetValue(@NonNull BooleanSetting setting, @NonNull Boolean newValue) {
setting.value = Objects.requireNonNull(newValue); setting.value = Objects.requireNonNull(newValue);
if (setting.isSetToDefault()) {
setting.removeFromPreferences();
}
} }
@Override @Override
@ -65,10 +69,8 @@ public class BooleanSetting extends Setting<Boolean> {
} }
@Override @Override
public void save(@NonNull Boolean newValue) { public void saveToPreferences() {
// Must set before saving to preferences (otherwise importing fails to update UI correctly). preferences.saveBoolean(key, value);
value = Objects.requireNonNull(newValue);
preferences.saveBoolean(key, newValue);
} }
@NonNull @NonNull

View File

@ -89,10 +89,8 @@ public class EnumSetting<T extends Enum<?>> extends Setting<T> {
} }
@Override @Override
public void save(@NonNull T newValue) { public void saveToPreferences() {
// Must set before saving to preferences (otherwise importing fails to update UI correctly). preferences.saveEnumAsString(key, value);
value = Objects.requireNonNull(newValue);
preferences.saveEnumAsString(key, newValue);
} }
@NonNull @NonNull

View File

@ -55,10 +55,8 @@ public class FloatSetting extends Setting<Float> {
} }
@Override @Override
public void save(@NonNull Float newValue) { public void saveToPreferences() {
// Must set before saving to preferences (otherwise importing fails to update UI correctly). preferences.saveFloatString(key, value);
value = Objects.requireNonNull(newValue);
preferences.saveFloatString(key, newValue);
} }
@NonNull @NonNull

View File

@ -55,10 +55,8 @@ public class IntegerSetting extends Setting<Integer> {
} }
@Override @Override
public void save(@NonNull Integer newValue) { public void saveToPreferences() {
// Must set before saving to preferences (otherwise importing fails to update UI correctly). preferences.saveIntegerString(key, value);
value = Objects.requireNonNull(newValue);
preferences.saveIntegerString(key, newValue);
} }
@NonNull @NonNull

View File

@ -55,10 +55,8 @@ public class LongSetting extends Setting<Long> {
} }
@Override @Override
public void save(@NonNull Long newValue) { public void saveToPreferences() {
// Must set before saving to preferences (otherwise importing fails to update UI correctly). preferences.saveLongString(key, value);
value = Objects.requireNonNull(newValue);
preferences.saveLongString(key, newValue);
} }
@NonNull @NonNull

View File

@ -14,7 +14,6 @@ import java.util.*;
import static app.revanced.extension.shared.StringRef.str; import static app.revanced.extension.shared.StringRef.str;
@SuppressWarnings("unused")
public abstract class Setting<T> { public abstract class Setting<T> {
/** /**
@ -288,6 +287,13 @@ public abstract class Setting<T> {
*/ */
public static void privateSetValueFromString(@NonNull Setting<?> setting, @NonNull String newValue) { public static void privateSetValueFromString(@NonNull Setting<?> setting, @NonNull String newValue) {
setting.setValueFromString(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<T> {
/** /**
* Persistently saves the value. * 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 @NonNull
public abstract T get(); public abstract T get();

View File

@ -55,10 +55,8 @@ public class StringSetting extends Setting<String> {
} }
@Override @Override
public void save(@NonNull String newValue) { public void saveToPreferences() {
// Must set before saving to preferences (otherwise importing fails to update UI correctly). preferences.saveString(key, value);
value = Objects.requireNonNull(newValue);
preferences.saveString(key, newValue);
} }
@NonNull @NonNull