fix: sorting extensions order

This commit is contained in:
rebelonion 2024-02-04 01:19:34 -06:00
parent 15abcd77d0
commit c2f108bf44
12 changed files with 146 additions and 82 deletions

View file

@ -4,21 +4,16 @@ import android.content.Context
import ani.dantotsu.Lazier
import ani.dantotsu.lazyList
import ani.dantotsu.settings.saving.PrefManager
import ani.dantotsu.settings.saving.PrefManager.asLiveString
import ani.dantotsu.settings.saving.PrefManager.asLiveStringSet
import ani.dantotsu.settings.saving.PrefName
import eu.kanade.tachiyomi.extension.anime.model.AnimeExtension
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.launch
object AnimeSources : WatchSources() {
override var list: List<Lazier<BaseParser>> = emptyList()
var pinnedAnimeSources: List<String> = emptyList()
suspend fun init(fromExtensions: StateFlow<List<AnimeExtension.Installed>>, context: Context) {
suspend fun init(fromExtensions: StateFlow<List<AnimeExtension.Installed>>) {
pinnedAnimeSources = PrefManager.getNullableVal<List<String>>(PrefName.AnimeSourcesOrder, null)
?: emptyList()
@ -58,17 +53,15 @@ object AnimeSources : WatchSources() {
}
private fun sortPinnedAnimeSources(
Sources: List<Lazier<BaseParser>>,
sources: List<Lazier<BaseParser>>,
pinnedAnimeSources: List<String>
): List<Lazier<BaseParser>> {
val pinnedSourcesMap = Sources.filter { pinnedAnimeSources.contains(it.name) }
val pinnedSourcesMap = sources.filter { pinnedAnimeSources.contains(it.name) }
.associateBy { it.name }
val orderedPinnedSources = pinnedAnimeSources.mapNotNull { name ->
pinnedSourcesMap[name]
}
//find the unpinned sources
val unpinnedSources = Sources.filter { !pinnedAnimeSources.contains(it.name) }
//put the pinned sources at the top of the list
val unpinnedSources = sources.filterNot { pinnedAnimeSources.contains(it.name) }
return orderedPinnedSources + unpinnedSources
}
}

View file

@ -52,26 +52,20 @@ object MangaSources : MangaReadSources() {
}
private fun sortPinnedMangaSources(
Sources: List<Lazier<BaseParser>>,
sources: List<Lazier<BaseParser>>,
pinnedMangaSources: List<String>
): List<Lazier<BaseParser>> {
val pinnedSourcesMap = Sources.filter { pinnedMangaSources.contains(it.name) }
val pinnedSourcesMap = sources.filter { pinnedMangaSources.contains(it.name) }
.associateBy { it.name }
val orderedPinnedSources = pinnedMangaSources.mapNotNull { name ->
pinnedSourcesMap[name]
}
//find the unpinned sources
val unpinnedSources = Sources.filter { !pinnedMangaSources.contains(it.name) }
//put the pinned sources at the top of the list
val unpinnedSources = sources.filterNot { pinnedMangaSources.contains(it.name) }
return orderedPinnedSources + unpinnedSources
}
}
object HMangaSources : MangaReadSources() {
val aList: List<Lazier<BaseParser>> = lazyList()
suspend fun init(fromExtensions: StateFlow<List<MangaExtension.Installed>>) {
//todo
}
private val aList: List<Lazier<BaseParser>> = lazyList()
override val list = listOf(aList, MangaSources.list).flatten()
}

View file

@ -4,13 +4,19 @@ import android.util.Log
import ani.dantotsu.Lazier
import ani.dantotsu.parsers.novel.DynamicNovelParser
import ani.dantotsu.parsers.novel.NovelExtension
import ani.dantotsu.settings.saving.PrefManager
import ani.dantotsu.settings.saving.PrefName
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.first
object NovelSources : NovelReadSources() {
override var list: List<Lazier<BaseParser>> = emptyList()
var pinnedNovelSources: List<String> = emptyList()
suspend fun init(fromExtensions: StateFlow<List<NovelExtension.Installed>>) {
pinnedNovelSources = PrefManager.getNullableVal<List<String>>(PrefName.NovelSourcesOrder, null)
?: emptyList()
// Initialize with the first value from StateFlow
val initialExtensions = fromExtensions.first()
list = createParsersFromExtensions(initialExtensions) + Lazier(
@ -20,13 +26,25 @@ object NovelSources : NovelReadSources() {
// Update as StateFlow emits new values
fromExtensions.collect { extensions ->
list = createParsersFromExtensions(extensions) + Lazier(
list = sortPinnedNovelSources(
createParsersFromExtensions(extensions),
pinnedNovelSources
) + Lazier(
{ OfflineNovelParser() },
"Downloaded"
)
}
}
fun performReorderNovelSources() {
//remove the downloaded source from the list to avoid duplicates
list = list.filter { it.name != "Downloaded" }
list = sortPinnedNovelSources(list, pinnedNovelSources) + Lazier(
{ OfflineNovelParser() },
"Downloaded"
)
}
private fun createParsersFromExtensions(extensions: List<NovelExtension.Installed>): List<Lazier<BaseParser>> {
Log.d("NovelSources", "createParsersFromExtensions")
Log.d("NovelSources", extensions.toString())
@ -35,4 +53,17 @@ object NovelSources : NovelReadSources() {
Lazier({ DynamicNovelParser(extension) }, name)
}
}
private fun sortPinnedNovelSources(
parsers: List<Lazier<BaseParser>>,
pinnedSources: List<String>
): List<Lazier<BaseParser>> {
val pinnedSourcesMap = parsers.filter { pinnedSources.contains(it.name) }
.associateBy { it.name }
val orderedPinnedSources = pinnedSources.mapNotNull { name ->
pinnedSourcesMap[name]
}
val unpinnedSources = parsers.filterNot { pinnedSources.contains(it.name) }
return orderedPinnedSources + unpinnedSources
}
}