Add Better Extension Search (#6359)

Add support to searching with source name, id and baseUrl for a extension's sources.

(cherry picked from commit 9e83130bd8a8fac1b13b0d093c301cd93892c27e)
This commit is contained in:
FourTOne5 2021-12-19 01:46:45 +06:00 committed by Jobobby04
parent a9f037dc8b
commit 13beef4ebe
3 changed files with 52 additions and 6 deletions

View File

@ -2,6 +2,7 @@ package eu.kanade.tachiyomi.extension.api
import android.content.Context
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import eu.kanade.tachiyomi.extension.model.AvailableExtensionSources
import eu.kanade.tachiyomi.extension.model.Extension
import eu.kanade.tachiyomi.extension.model.LoadResult
import eu.kanade.tachiyomi.extension.util.ExtensionLoader
@ -98,6 +99,7 @@ internal class ExtensionGithubApi {
versionCode = it.code,
lang = it.lang,
isNsfw = it.nsfw == 1,
sources = it.sources.toExtensionSources(),
apkName = it.apk,
iconUrl = "${/* SY --> */ repoUrl /* SY <-- */}icon/${it.apk.replace(".apk", ".png")}",
// SY -->
@ -107,6 +109,16 @@ internal class ExtensionGithubApi {
}
}
private fun List<ExtensionSourceJsonObject>.toExtensionSources(): List<AvailableExtensionSources> {
return this.map {
AvailableExtensionSources(
name = it.name,
id = it.id,
baseUrl = it.baseUrl
)
}
}
fun getApkUrl(extension: Extension.Available): String {
return /* SY --> */ "${extension.repoUrl}/apk/${extension.apkName}" /* SY <-- */
}
@ -128,8 +140,17 @@ private data class ExtensionJsonObject(
val name: String,
val pkg: String,
val apk: String,
val version: String,
val code: Long,
val lang: String,
val code: Long,
val version: String,
val nsfw: Int,
val sources: List<ExtensionSourceJsonObject>,
)
@Serializable
private data class ExtensionSourceJsonObject(
val name: String,
val id: Long,
val baseUrl: String
)

View File

@ -35,6 +35,7 @@ sealed class Extension {
override val versionCode: Long,
override val lang: String,
override val isNsfw: Boolean,
val sources: List<AvailableExtensionSources>,
val apkName: String,
val iconUrl: String,
// SY -->
@ -52,3 +53,9 @@ sealed class Extension {
override val isNsfw: Boolean = false
) : Extension()
}
data class AvailableExtensionSources(
val name: String,
val id: Long,
val baseUrl: String
)

View File

@ -15,6 +15,7 @@ import eu.davidea.flexibleadapter.items.IFlexible
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.databinding.ExtensionControllerBinding
import eu.kanade.tachiyomi.extension.model.Extension
import eu.kanade.tachiyomi.source.online.HttpSource
import eu.kanade.tachiyomi.ui.base.controller.NucleusController
import eu.kanade.tachiyomi.ui.base.controller.withFadeTransaction
import eu.kanade.tachiyomi.ui.browse.BrowseController
@ -56,7 +57,8 @@ open class ExtensionController :
return ExtensionPresenter()
}
override fun createBinding(inflater: LayoutInflater) = ExtensionControllerBinding.inflate(inflater)
override fun createBinding(inflater: LayoutInflater) =
ExtensionControllerBinding.inflate(inflater)
override fun onViewCreated(view: View) {
super.onViewCreated(view)
@ -189,11 +191,27 @@ open class ExtensionController :
private fun updateExtensionsList() {
if (query.isNotBlank()) {
val extensionNames = query.split(",")
val queries = query.split(",")
adapter?.updateDataSet(
extensions.filter {
extensionNames.any { queriedName ->
it.extension.name.contains(queriedName, ignoreCase = true)
queries.any { query ->
when (it.extension) {
is Extension.Available -> {
it.extension.sources.any {
it.name.contains(query, ignoreCase = true) ||
it.baseUrl.contains(query, ignoreCase = true) ||
it.id == query.toLongOrNull()
} || it.extension.name.contains(query, ignoreCase = true)
}
is Extension.Installed -> {
it.extension.sources.any {
it.name.contains(query, ignoreCase = true) ||
it.id == query.toLongOrNull() ||
if (it is HttpSource) { it.baseUrl.contains(query, ignoreCase = true) } else false
} || it.extension.name.contains(query, ignoreCase = true)
}
is Extension.Untrusted -> it.extension.name.contains(query, ignoreCase = true)
}
}
}
)