From 2280e8c7257f312f011dde40d5cf44bb8ff2584b Mon Sep 17 00:00:00 2001 From: Aria Moradi Date: Fri, 30 Jul 2021 15:05:21 +0430 Subject: [PATCH] initial PreferenceScreen support, works with 'NeoXXX Scans' (pt-br) --- .../preference/EditTextPreference.java | 46 ++++++++++++++ .../java/androidx/preference/Preference.java | 61 +++++++++++++++++++ .../androidx/preference/PreferenceScreen.java | 30 ++++++++- .../animesource/ConfigurableAnimeSource.kt | 2 +- .../tachiyomi/source/ConfigurableSource.kt | 1 - .../suwayomi/tachidesk/manga/TachideskAPI.kt | 7 +++ .../suwayomi/tachidesk/manga/impl/Source.kt | 26 +++++++- .../manga/model/dataclass/SourceDataClass.kt | 3 +- 8 files changed, 170 insertions(+), 6 deletions(-) create mode 100644 AndroidCompat/src/main/java/androidx/preference/EditTextPreference.java create mode 100644 AndroidCompat/src/main/java/androidx/preference/Preference.java diff --git a/AndroidCompat/src/main/java/androidx/preference/EditTextPreference.java b/AndroidCompat/src/main/java/androidx/preference/EditTextPreference.java new file mode 100644 index 00000000..088f8392 --- /dev/null +++ b/AndroidCompat/src/main/java/androidx/preference/EditTextPreference.java @@ -0,0 +1,46 @@ +package androidx.preference; + +import android.content.Context; + +public class EditTextPreference extends Preference { + private String title; + private CharSequence summary; + private CharSequence dialogTitle; + private CharSequence dialogMessage; + + public EditTextPreference(Context context) { + super(context); + } + + public String getTitle() { + return title; + } + + public void setTitle(CharSequence title) { + this.title = (String) title; + } + + public CharSequence getSummary() { + return summary; + } + + public void setSummary(CharSequence summary) { + this.summary = summary; + } + + public CharSequence getDialogTitle() { + return dialogTitle; + } + + public void setDialogTitle(CharSequence dialogTitle) { + this.dialogTitle = dialogTitle; + } + + public CharSequence getDialogMessage() { + return dialogMessage; + } + + public void setDialogMessage(CharSequence dialogMessage) { + this.dialogMessage = dialogMessage; + } +} diff --git a/AndroidCompat/src/main/java/androidx/preference/Preference.java b/AndroidCompat/src/main/java/androidx/preference/Preference.java new file mode 100644 index 00000000..7029b703 --- /dev/null +++ b/AndroidCompat/src/main/java/androidx/preference/Preference.java @@ -0,0 +1,61 @@ +package androidx.preference; + +/* + * Copyright (C) Contributors to the Suwayomi project + * + * This Source Code Form is subject to the terms of the Mozilla Public + * 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.content.Context; + +/** A minimal implementation of androidx.preference.Preference */ +public class Preference { + // reference: https://android.googlesource.com/platform/frameworks/support/+/996971f962fcd554339a7cb2859cef9ca89dbcb7/preference/preference/src/main/java/androidx/preference/Preference.java + // Note: `Preference` doesn't actually hold or persist the value, `OnPreferenceChangeListener` is called and it's up to the extension to persist it. + + protected Context context; + + private String key; + private CharSequence title; + private Object defaultValue; + private OnPreferenceChangeListener onChangeListener; + + public Preference(Context context) { + this.context = context; + } + + public Context getContext() { + return context; + } + + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public void setDefaultValue(Object defaultValue) { + this.defaultValue = defaultValue; + } + + public CharSequence getTitle() { + return title; + } + + public void setOnPreferenceChangeListener(OnPreferenceChangeListener onPreferenceChangeListener) { + this.onChangeListener = onPreferenceChangeListener; + } + + public boolean callChangeListener(Object newValue) { + return onChangeListener == null || onChangeListener.onPreferenceChange(this, newValue); + } + + public interface OnPreferenceChangeListener { + boolean onPreferenceChange(Preference preference, Object newValue); + } + +} diff --git a/AndroidCompat/src/main/java/androidx/preference/PreferenceScreen.java b/AndroidCompat/src/main/java/androidx/preference/PreferenceScreen.java index cf1832e0..0b91501c 100644 --- a/AndroidCompat/src/main/java/androidx/preference/PreferenceScreen.java +++ b/AndroidCompat/src/main/java/androidx/preference/PreferenceScreen.java @@ -1,4 +1,32 @@ package androidx.preference; -public class PreferenceScreen { +/* + * Copyright (C) Contributors to the Suwayomi project + * + * This Source Code Form is subject to the terms of the Mozilla Public + * 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.content.Context; + +import java.util.LinkedList; +import java.util.List; + +public class PreferenceScreen extends Preference { + private List preferences = new LinkedList<>(); + + + public PreferenceScreen(Context context) { + super(context); + } + + public boolean addPreference(Preference preference) { + preferences.add(preference); + + return true; + } + + public List getPreferences(){ + return preferences; + } } diff --git a/server/src/main/kotlin/eu/kanade/tachiyomi/animesource/ConfigurableAnimeSource.kt b/server/src/main/kotlin/eu/kanade/tachiyomi/animesource/ConfigurableAnimeSource.kt index 4358a7f5..5d4e872f 100644 --- a/server/src/main/kotlin/eu/kanade/tachiyomi/animesource/ConfigurableAnimeSource.kt +++ b/server/src/main/kotlin/eu/kanade/tachiyomi/animesource/ConfigurableAnimeSource.kt @@ -1,6 +1,6 @@ package eu.kanade.tachiyomi.animesource -import android.support.v7.preference.PreferenceScreen +import androidx.preference.PreferenceScreen interface ConfigurableAnimeSource : AnimeSource { diff --git a/server/src/main/kotlin/eu/kanade/tachiyomi/source/ConfigurableSource.kt b/server/src/main/kotlin/eu/kanade/tachiyomi/source/ConfigurableSource.kt index 0dd9bb4e..ac5b780a 100644 --- a/server/src/main/kotlin/eu/kanade/tachiyomi/source/ConfigurableSource.kt +++ b/server/src/main/kotlin/eu/kanade/tachiyomi/source/ConfigurableSource.kt @@ -7,7 +7,6 @@ package eu.kanade.tachiyomi.source * 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 androidx.preference.PreferenceScreen interface ConfigurableSource : Source { diff --git a/server/src/main/kotlin/suwayomi/tachidesk/manga/TachideskAPI.kt b/server/src/main/kotlin/suwayomi/tachidesk/manga/TachideskAPI.kt index 88421c6b..e70ce519 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/manga/TachideskAPI.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/manga/TachideskAPI.kt @@ -30,6 +30,7 @@ import suwayomi.tachidesk.manga.impl.Search.sourceGlobalSearch import suwayomi.tachidesk.manga.impl.Search.sourceSearch import suwayomi.tachidesk.manga.impl.Source.getSource import suwayomi.tachidesk.manga.impl.Source.getSourceList +import suwayomi.tachidesk.manga.impl.Source.getSourcePreferences import suwayomi.tachidesk.manga.impl.backup.BackupFlags import suwayomi.tachidesk.manga.impl.backup.legacy.LegacyBackupExport.createLegacyBackup import suwayomi.tachidesk.manga.impl.backup.legacy.LegacyBackupImport.restoreLegacyBackup @@ -109,6 +110,12 @@ object TachideskAPI { ctx.json(getSource(sourceId)) } + // fetch preferences of source with id `sourceId` + app.get("/api/v1/source/:sourceId/preference-screen") { ctx -> + val sourceId = ctx.pathParam("sourceId").toLong() + ctx.json(getSourcePreferences(sourceId)) + } + // popular mangas from source with id `sourceId` app.get("/api/v1/source/:sourceId/popular/:pageNum") { ctx -> val sourceId = ctx.pathParam("sourceId").toLong() 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 7f8373d5..1d0948b8 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/Source.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/Source.kt @@ -7,15 +7,21 @@ 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 androidx.preference.PreferenceScreen +import eu.kanade.tachiyomi.source.ConfigurableSource import mu.KotlinLogging import org.jetbrains.exposed.sql.select import org.jetbrains.exposed.sql.selectAll import org.jetbrains.exposed.sql.transactions.transaction +import org.kodein.di.DI +import org.kodein.di.conf.global +import org.kodein.di.instance import suwayomi.tachidesk.manga.impl.extension.Extension.getExtensionIconUrl import suwayomi.tachidesk.manga.impl.util.GetHttpSource.getHttpSource import suwayomi.tachidesk.manga.model.dataclass.SourceDataClass import suwayomi.tachidesk.manga.model.table.ExtensionTable import suwayomi.tachidesk.manga.model.table.SourceTable +import xyz.nulldev.androidcompat.androidimpl.CustomContext object Source { private val logger = KotlinLogging.logger {} @@ -28,7 +34,8 @@ object Source { it[SourceTable.name], it[SourceTable.lang], getExtensionIconUrl(ExtensionTable.select { ExtensionTable.id eq it[SourceTable.extension] }.first()[ExtensionTable.apkName]), - getHttpSource(it[SourceTable.id].value).supportsLatest + getHttpSource(it[SourceTable.id].value).supportsLatest, + getHttpSource(it[SourceTable.id].value) is ConfigurableSource ) } } @@ -43,8 +50,23 @@ object Source { source?.get(SourceTable.name), source?.get(SourceTable.lang), source?.let { ExtensionTable.select { ExtensionTable.id eq source[SourceTable.extension] }.first()[ExtensionTable.iconUrl] }, - source?.let { getHttpSource(sourceId).supportsLatest } + source?.let { getHttpSource(sourceId).supportsLatest }, + source?.let { getHttpSource(sourceId) is ConfigurableSource }, ) } } + + private val context by DI.global.instance() + + fun getSourcePreferences(sourceId: Long) { + val source = getHttpSource(sourceId) + + if (source is ConfigurableSource) { + val screen = PreferenceScreen(context) + + source.setupPreferenceScreen(screen) + + screen.preferences.forEach { println(it) } + } + } } diff --git a/server/src/main/kotlin/suwayomi/tachidesk/manga/model/dataclass/SourceDataClass.kt b/server/src/main/kotlin/suwayomi/tachidesk/manga/model/dataclass/SourceDataClass.kt index 939a356a..022356cc 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/manga/model/dataclass/SourceDataClass.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/manga/model/dataclass/SourceDataClass.kt @@ -12,5 +12,6 @@ data class SourceDataClass( val name: String?, val lang: String?, val iconUrl: String?, - val supportsLatest: Boolean? + val supportsLatest: Boolean?, + val isConfigurable: Boolean? )