Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add support for MultiSelectListPreference #258

Merged
merged 4 commits into from
Nov 28, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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<String> values) { throw new RuntimeException("Stub!"); }
public void setValues(Set<String> values) {
throw new RuntimeException("Stub!");
}

@JsonIgnore
public Set<String> getValues() { throw new RuntimeException("Stub!"); }
public Set<String> 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<String>";
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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<String>":
return sharedPreferences.getStringSet(key, (Set<String>)defaultValue);
default:
throw new RuntimeException("Unsupported type");
}
}

/** Tachidesk specific API */
@SuppressWarnings("unchecked")
public void saveNewValue(Object value) {
switch (getDefaultValueType()) {
case "String":
Expand All @@ -133,6 +138,9 @@ public void saveNewValue(Object value) {
case "Boolean":
sharedPreferences.edit().putBoolean(key, (Boolean)value).apply();
break;
case "Set<String>":
sharedPreferences.edit().putStringSet(key, (Set<String>)value).apply();
break;
default:
throw new RuntimeException("Unsupported type");
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -40,13 +40,13 @@ class JavaSharedPreferences(key: String) : SharedPreferences {
}
}

override fun getStringSet(key: String, defValues: MutableSet<String>?): MutableSet<String>? {
override fun getStringSet(key: String, defValues: Set<String>?): Set<String>? {
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")
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -81,11 +82,12 @@ object Source {
private val context by DI.global.instance<CustomContext>()

/**
* (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,
Expand Down Expand Up @@ -123,13 +125,18 @@ object Source {
val value: String
)

private val jsonMapper by DI.global.instance<JsonMapper>()

@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<String>" -> jsonMapper.fromJsonString(change.value, List::class.java as Class<List<String>>).toSet()
else -> throw RuntimeException("Unsupported type conversion")
}

Expand Down