diff --git a/AndroidCompat/src/main/java/androidx/preference/MultiSelectListPreference.java b/AndroidCompat/src/main/java/androidx/preference/MultiSelectListPreference.java index 11f3bcda0..0ca3a3cd9 100644 --- a/AndroidCompat/src/main/java/androidx/preference/MultiSelectListPreference.java +++ b/AndroidCompat/src/main/java/androidx/preference/MultiSelectListPreference.java @@ -13,33 +13,49 @@ import java.util.Set; public class MultiSelectListPreference extends DialogPreference { + // reference: https://android.googlesource.com/platform/frameworks/support/+/996971f962fcd554339a7cb2859cef9ca89dbcb7/preference/preference/src/main/java/androidx/preference/MultiSelectListPreference.java // Note: remove @JsonIgnore and implement methods if any extension ever uses these methods or the variables behind them - public MultiSelectListPreference(Context context) { super(context); } + private CharSequence[] entries; + private CharSequence[] entryValues; - @JsonIgnore - public void setEntries(CharSequence[] entries) { throw new RuntimeException("Stub!"); } + public MultiSelectListPreference(Context context) { + super(context); + } - @JsonIgnore - public CharSequence[] getEntries() { throw new RuntimeException("Stub!"); } + public void setEntries(CharSequence[] entries) { + this.entries = entries; + } - @JsonIgnore - public void setEntryValues(CharSequence[] entryValues) { throw new RuntimeException("Stub!"); } + public CharSequence[] getEntries() { + return entries; + } - @JsonIgnore - public CharSequence[] getEntryValues() { throw new RuntimeException("Stub!"); } + public void setEntryValues(CharSequence[] entryValues) { + this.entryValues = entryValues; + } + + public CharSequence[] getEntryValues() { + return entryValues; + } @JsonIgnore - public void setValues(Set values) { throw new RuntimeException("Stub!"); } + public void setValues(Set values) { + throw new RuntimeException("Stub!"); + } @JsonIgnore - public Set getValues() { throw new RuntimeException("Stub!"); } + public Set getValues() { + throw new RuntimeException("Stub!"); + } - public int findIndexOfValue(String value) { throw new RuntimeException("Stub!"); } + public int findIndexOfValue(String value) { + throw new RuntimeException("Stub!"); + } /** Tachidesk specific API */ @Override public String getDefaultValueType() { - return "Set"; + return "Set"; } } \ No newline at end of file diff --git a/AndroidCompat/src/main/java/androidx/preference/Preference.java b/AndroidCompat/src/main/java/androidx/preference/Preference.java index d92ec4409..2fb71b2c7 100644 --- a/AndroidCompat/src/main/java/androidx/preference/Preference.java +++ b/AndroidCompat/src/main/java/androidx/preference/Preference.java @@ -10,6 +10,7 @@ import android.content.Context; import android.content.SharedPreferences; import com.fasterxml.jackson.annotation.JsonIgnore; +import java.util.Set; /** * A minimal implementation of androidx.preference.Preference @@ -113,18 +114,22 @@ public interface OnPreferenceClickListener { } /** Tachidesk specific API */ + @SuppressWarnings("unchecked") public Object getCurrentValue() { switch (getDefaultValueType()) { case "String": return sharedPreferences.getString(key, (String)defaultValue); case "Boolean": return sharedPreferences.getBoolean(key, (Boolean)defaultValue); + case "Set": + return sharedPreferences.getStringSet(key, (Set)defaultValue); default: throw new RuntimeException("Unsupported type"); } } /** Tachidesk specific API */ + @SuppressWarnings("unchecked") public void saveNewValue(Object value) { switch (getDefaultValueType()) { case "String": @@ -133,6 +138,9 @@ public void saveNewValue(Object value) { case "Boolean": sharedPreferences.edit().putBoolean(key, (Boolean)value).apply(); break; + case "Set": + sharedPreferences.edit().putStringSet(key, (Set)value).apply(); + break; default: throw new RuntimeException("Unsupported type"); } diff --git a/AndroidCompat/src/main/java/xyz/nulldev/androidcompat/io/sharedprefs/JavaSharedPreferences.kt b/AndroidCompat/src/main/java/xyz/nulldev/androidcompat/io/sharedprefs/JavaSharedPreferences.kt index 4b61d5e59..9bdf85d2a 100644 --- a/AndroidCompat/src/main/java/xyz/nulldev/androidcompat/io/sharedprefs/JavaSharedPreferences.kt +++ b/AndroidCompat/src/main/java/xyz/nulldev/androidcompat/io/sharedprefs/JavaSharedPreferences.kt @@ -12,11 +12,11 @@ import com.russhwolf.settings.ExperimentalSettingsApi import com.russhwolf.settings.ExperimentalSettingsImplementation import com.russhwolf.settings.JvmPreferencesSettings import com.russhwolf.settings.serialization.decodeValue +import com.russhwolf.settings.serialization.decodeValueOrNull import com.russhwolf.settings.serialization.encodeValue import kotlinx.serialization.ExperimentalSerializationApi import kotlinx.serialization.SerializationException import kotlinx.serialization.builtins.SetSerializer -import kotlinx.serialization.builtins.nullable import kotlinx.serialization.builtins.serializer import java.util.prefs.PreferenceChangeListener import java.util.prefs.Preferences @@ -40,13 +40,13 @@ class JavaSharedPreferences(key: String) : SharedPreferences { } } - override fun getStringSet(key: String, defValues: MutableSet?): MutableSet? { + override fun getStringSet(key: String, defValues: Set?): Set? { try { return if (defValues != null) { - preferences.decodeValue(SetSerializer(String.serializer()).nullable, key, defValues) + preferences.decodeValue(SetSerializer(String.serializer()), key, defValues) } else { - preferences.decodeValue(SetSerializer(String.serializer()).nullable, key, null) - }?.toMutableSet() + preferences.decodeValueOrNull(SetSerializer(String.serializer()), key) + } } catch (e: SerializationException) { throw ClassCastException("$key was not a StringSet") } diff --git a/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/Source.kt b/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/Source.kt index ec3decc47..68c7ae090 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/Source.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/Source.kt @@ -12,6 +12,7 @@ import android.content.Context import androidx.preference.PreferenceScreen import eu.kanade.tachiyomi.source.ConfigurableSource import eu.kanade.tachiyomi.source.getPreferenceKey +import io.javalin.plugin.json.JsonMapper import mu.KotlinLogging import org.jetbrains.exposed.sql.select import org.jetbrains.exposed.sql.selectAll @@ -81,11 +82,12 @@ object Source { private val context by DI.global.instance() /** - * (2021-08) Clients should support these types for extensions to work properly + * (2021-11) Clients should support these types for extensions to work properly * - EditTextPreference * - SwitchPreferenceCompat * - ListPreference * - CheckBoxPreference + * - MultiSelectListPreference */ data class PreferenceObject( val type: String, @@ -123,13 +125,18 @@ object Source { val value: String ) + private val jsonMapper by DI.global.instance() + + @Suppress("IMPLICIT_CAST_TO_ANY", "UNCHECKED_CAST") fun setSourcePreference(sourceId: Long, change: SourcePreferenceChange) { val screen = preferenceScreenMap[sourceId]!! val pref = screen.preferences[change.position] + println(jsonMapper::class.java.name) val newValue = when (pref.defaultValueType) { "String" -> change.value "Boolean" -> change.value.toBoolean() + "Set" -> jsonMapper.fromJsonString(change.value, List::class.java as Class>).toSet() else -> throw RuntimeException("Unsupported type conversion") }