feat(library): Optimize library grouping

This commit is contained in:
Cuong-Tran 2025-08-27 13:04:14 +07:00
parent ea06631670
commit 379d36e586

View file

@ -1395,13 +1395,20 @@ class LibraryScreenModel(
return when (groupType) { return when (groupType) {
LibraryGroup.BY_TRACK_STATUS -> { LibraryGroup.BY_TRACK_STATUS -> {
val tracks = runBlocking { getTracks.await() }.groupBy { it.mangaId } val tracks = runBlocking { getTracks.await() }.groupBy { it.mangaId }
groupBy { item -> // KMK -->
val status = tracks[item.libraryManga.manga.id]?.firstNotNullOfOrNull { track -> val groupCache = mutableMapOf</* Track.status */ Int, MutableList</* LibraryItem */ Long>>()
forEach { item ->
val statuses = tracks[item.libraryManga.manga.id]?.mapNotNull { track ->
TrackStatus.parseTrackerStatus(trackerManager, track.trackerId, track.status) TrackStatus.parseTrackerStatus(trackerManager, track.trackerId, track.status)
} ?: TrackStatus.OTHER }
?.takeIf { it.isNotEmpty() }
status.int ?: listOf(TrackStatus.OTHER)
}.mapKeys { (id) -> statuses.forEach { status ->
groupCache.getOrPut(status.int) { mutableListOf() }.add(item.id)
}
}
// KMK <--
groupCache.mapKeys { (id) ->
Category( Category(
id = id.toLong(), id = id.toLong(),
name = TrackStatus.entries name = TrackStatus.entries
@ -1419,32 +1426,32 @@ class LibraryScreenModel(
} }
} }
LibraryGroup.BY_SOURCE -> { LibraryGroup.BY_SOURCE -> {
val sources: List<Long> // KMK -->
groupBy { item -> val groupCache = mutableMapOf</* Source.id */ Long, MutableList</* LibraryItem */ Long>>()
item.libraryManga.manga.source forEach { item ->
}.also { groupCache.getOrPut(item.libraryManga.manga.source) { mutableListOf() }.add(item.id)
sources = it.keys }
.map { val sources = groupCache.keys
sourceManager.getOrStub(it) .map { sourceManager.getOrStub(it) }
} .sortedWith(compareBy(String.CASE_INSENSITIVE_ORDER) { it.name.ifBlank { it.id.toString() } })
.sortedWith(compareBy(String.CASE_INSENSITIVE_ORDER) { it.name.ifBlank { it.id.toString() } })
.map { it.id } sources.associate {
}.mapKeys { val category = Category(
Category( id = it.id,
id = it.key, name = if (it.id == LocalSource.ID) {
name = if (it.key == LocalSource.ID) {
context.stringResource(MR.strings.local_source) context.stringResource(MR.strings.local_source)
} else { } else {
val source = sourceManager.getOrStub(it.key) it.name.ifBlank { it.id.toString() }
source.name.ifBlank { source.id.toString() }
}, },
order = sources.indexOf(it.key).takeUnless { it == -1 }?.toLong() ?: Long.MAX_VALUE, order = sources.indexOf(it).toLong(),
flags = 0, flags = 0,
// KMK --> // KMK -->
hidden = false, hidden = false,
// KMK <-- // KMK <--
) )
category to groupCache[it.id]?.distinct().orEmpty()
} }
// KMK <--
} }
LibraryGroup.BY_STATUS -> { LibraryGroup.BY_STATUS -> {
groupBy { item -> groupBy { item ->
@ -1476,12 +1483,12 @@ class LibraryScreenModel(
// KMK <-- // KMK <--
) )
} }
// KMK -->
.mapValues { (_, libraryItem) -> libraryItem.fastMap { it.id } }
// KMK <--
} }
else -> emptyMap() else -> emptyMap()
}.toSortedMap(compareBy { it.order }) }.toSortedMap(compareBy { it.order })
// KMK -->
.mapValues { (_, libraryItem) -> libraryItem.fastMap { it.id } }
// KMK <--
} }
fun runRecommendationSearch(selection: List<Manga>) { fun runRecommendationSearch(selection: List<Manga>) {