From afabaccf1dff12936edf64e7f40070eca892fdb6 Mon Sep 17 00:00:00 2001 From: Aria Moradi Date: Fri, 6 Aug 2021 03:37:09 +0430 Subject: [PATCH] implement data store for extension prefs --- .../java/androidx/preference/Preference.java | 41 +++++++++++++++++++ .../androidx/preference/PreferenceScreen.java | 3 ++ .../eu/kanade/tachiyomi/source/Source.kt | 2 +- .../suwayomi/tachidesk/manga/impl/Source.kt | 9 ++++ 4 files changed, 54 insertions(+), 1 deletion(-) diff --git a/AndroidCompat/src/main/java/androidx/preference/Preference.java b/AndroidCompat/src/main/java/androidx/preference/Preference.java index cbf9596c..d92ec440 100644 --- a/AndroidCompat/src/main/java/androidx/preference/Preference.java +++ b/AndroidCompat/src/main/java/androidx/preference/Preference.java @@ -8,6 +8,7 @@ package androidx.preference; * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ import android.content.Context; +import android.content.SharedPreferences; import com.fasterxml.jackson.annotation.JsonIgnore; /** @@ -25,6 +26,10 @@ public class Preference { private CharSequence summary; private Object defaultValue; + /** Tachidesk specific API */ + @JsonIgnore + private SharedPreferences sharedPreferences; + @JsonIgnore public OnPreferenceChangeListener onChangeListener; @@ -89,6 +94,16 @@ public class Preference { return defaultValue.getClass().getSimpleName(); } + /** Tachidesk specific API */ + public SharedPreferences getSharedPreferences() { + return sharedPreferences; + } + + /** Tachidesk specific API */ + public void setSharedPreferences(SharedPreferences sharedPreferences) { + this.sharedPreferences = sharedPreferences; + } + public interface OnPreferenceChangeListener { boolean onPreferenceChange(Preference preference, Object newValue); } @@ -96,4 +111,30 @@ public class Preference { public interface OnPreferenceClickListener { boolean onPreferenceClick(Preference preference); } + + /** Tachidesk specific API */ + public Object getCurrentValue() { + switch (getDefaultValueType()) { + case "String": + return sharedPreferences.getString(key, (String)defaultValue); + case "Boolean": + return sharedPreferences.getBoolean(key, (Boolean)defaultValue); + default: + throw new RuntimeException("Unsupported type"); + } + } + + /** Tachidesk specific API */ + public void saveNewValue(Object value) { + switch (getDefaultValueType()) { + case "String": + sharedPreferences.edit().putString(key, (String)value).apply(); + break; + case "Boolean": + sharedPreferences.edit().putBoolean(key, (Boolean)value).apply(); + break; + default: + throw new RuntimeException("Unsupported type"); + } + } } diff --git a/AndroidCompat/src/main/java/androidx/preference/PreferenceScreen.java b/AndroidCompat/src/main/java/androidx/preference/PreferenceScreen.java index 44cfd4c1..91032b3e 100644 --- a/AndroidCompat/src/main/java/androidx/preference/PreferenceScreen.java +++ b/AndroidCompat/src/main/java/androidx/preference/PreferenceScreen.java @@ -21,6 +21,9 @@ public class PreferenceScreen extends Preference { } public boolean addPreference(Preference preference) { + // propagate own shared preferences + preference.setSharedPreferences(getSharedPreferences()); + preferences.add(preference); return true; diff --git a/server/src/main/kotlin/eu/kanade/tachiyomi/source/Source.kt b/server/src/main/kotlin/eu/kanade/tachiyomi/source/Source.kt index 4dce2c51..f6436476 100644 --- a/server/src/main/kotlin/eu/kanade/tachiyomi/source/Source.kt +++ b/server/src/main/kotlin/eu/kanade/tachiyomi/source/Source.kt @@ -44,4 +44,4 @@ interface Source { // fun Source.icon(): Drawable? = Injekt.get().getAppIconForSource(this) -// fun Source.getPreferenceKey(): String = "source_$id" +fun Source.getPreferenceKey(): String = "source_$id" 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 b58981d2..d17c4406 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/Source.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/Source.kt @@ -7,8 +7,11 @@ package suwayomi.tachidesk.manga.impl * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ +import android.app.Application +import android.content.Context import androidx.preference.PreferenceScreen import eu.kanade.tachiyomi.source.ConfigurableSource +import eu.kanade.tachiyomi.source.getPreferenceKey import mu.KotlinLogging import org.jetbrains.exposed.sql.select import org.jetbrains.exposed.sql.selectAll @@ -22,6 +25,8 @@ import suwayomi.tachidesk.manga.impl.util.GetHttpSource.invalidateSourceCache import suwayomi.tachidesk.manga.model.dataclass.SourceDataClass import suwayomi.tachidesk.manga.model.table.ExtensionTable import suwayomi.tachidesk.manga.model.table.SourceTable +import uy.kohesive.injekt.Injekt +import uy.kohesive.injekt.api.get import xyz.nulldev.androidcompat.androidimpl.CustomContext object Source { @@ -80,7 +85,10 @@ object Source { val source = getHttpSource(sourceId) if (source is ConfigurableSource) { + val sourceShardPreferences = Injekt.get().getSharedPreferences(source.getPreferenceKey(), Context.MODE_PRIVATE) + val screen = PreferenceScreen(context) + screen.sharedPreferences = sourceShardPreferences source.setupPreferenceScreen(screen) @@ -112,6 +120,7 @@ object Source { else -> throw RuntimeException("Unsupported type conversion") } + pref.saveNewValue(newValue) pref.callChangeListener(newValue) // must reload the source cache because a preference was changed