refactor: Store hidden items on LibraryManga

Not sure why we need it tbh, but J2K store it for some reason
This commit is contained in:
Ahmad Ansori Palembani 2024-06-22 10:39:50 +07:00
parent 1e7d6cbebe
commit 31c253f724
Signed by: null2264
GPG key ID: BA64F8B60AF3EFB6
2 changed files with 69 additions and 50 deletions

View file

@ -1,5 +1,6 @@
package eu.kanade.tachiyomi.data.database.models package eu.kanade.tachiyomi.data.database.models
import eu.kanade.tachiyomi.ui.library.LibraryItem
import yokai.data.updateStrategyAdapter import yokai.data.updateStrategyAdapter
import kotlin.math.roundToInt import kotlin.math.roundToInt
@ -15,15 +16,23 @@ data class LibraryManga(
) : MangaImpl() { ) : MangaImpl() {
var realMangaCount = 0 var realMangaCount = 0
get() = if (isBlank()) field else throw IllegalStateException("realMangaCount is only accessible for placeholders") get() = if (isBlank()) field else throw IllegalStateException("realMangaCount is only accessible by placeholders")
set(value) { set(value) {
if (!isBlank()) throw IllegalStateException("realMangaCount can only be set for placeholders") if (!isBlank()) throw IllegalStateException("realMangaCount can only be set by placeholders")
field = value field = value
} }
val hasRead val hasRead
get() = read > 0 get() = read > 0
@Transient
var items: List<LibraryItem>? = null
get() = if (isHidden()) field else throw IllegalStateException("items only accessible by placeholders")
set(value) {
if (!isHidden()) throw IllegalStateException("items can only be set by placeholders")
field = value
}
companion object { companion object {
fun createBlank(categoryId: Int): LibraryManga = LibraryManga().apply { fun createBlank(categoryId: Int): LibraryManga = LibraryManga().apply {
title = "" title = ""
@ -31,11 +40,12 @@ data class LibraryManga(
category = categoryId category = categoryId
} }
fun createHide(categoryId: Int, title: String, hideCount: Int): LibraryManga = fun createHide(categoryId: Int, title: String, hiddenItems: List<LibraryItem>): LibraryManga =
createBlank(categoryId).apply { createBlank(categoryId).apply {
this.title = title this.title = title
this.status = -1 this.status = -1
this.read = hideCount this.read = hiddenItems.size
this.items = hiddenItems
} }
fun mapper( fun mapper(

View file

@ -231,7 +231,8 @@ class LibraryPresenter(
categories = lastCategories ?: getCategories.await().toMutableList() categories = lastCategories ?: getCategories.await().toMutableList()
} }
val (library, hiddenItems) = withIOContext { getLibraryFromDB() } val (library, _) = withIOContext { getLibraryFromDB() }
val hiddenItems = library.filter { it.manga.isHidden() }.mapNotNull { it.manga.items }.flatten()
setDownloadCount(library) setDownloadCount(library)
setUnreadBadge(library) setUnreadBadge(library)
setSourceLanguage(library) setSourceLanguage(library)
@ -737,27 +738,30 @@ class LibraryPresenter(
} }
private fun MutableList<LibraryItem>.addRemovedManga( private fun MutableList<LibraryItem>.addRemovedManga(
removedManga: List<Pair<LibraryManga, LibraryHeaderItem>>, removedManga: Map<Category, List<LibraryItem>>,
): MutableList<LibraryItem> { ): MutableList<LibraryItem> {
val headerItem = try { removedManga.keys.forEach { key ->
removedManga.first().second val manga = removedManga[key] ?: return@forEach
} catch (e: NoSuchElementException) { val headerItem = try {
return this // No hidden manga to be handled manga.first().header
} } catch (e: NoSuchElementException) {
val mergedTitle = removedManga.joinToString("-") { return@forEach // No hidden manga to be handled
it.first.title + "-" + it.first.author }
} val mergedTitle = manga.joinToString("-") {
this.add( it.manga.title + "-" + it.manga.author
LibraryItem( }
LibraryManga.createHide( this.add(
headerItem.catId, LibraryItem(
mergedTitle, LibraryManga.createHide(
removedManga.size, headerItem.catId,
mergedTitle,
manga,
),
headerItem,
viewContext,
), ),
headerItem, )
viewContext, }
),
)
return this return this
} }
@ -806,7 +810,7 @@ class LibraryPresenter(
} }
val unknown = context.getString(R.string.unknown) val unknown = context.getString(R.string.unknown)
val removedManga = mutableListOf<Pair<LibraryManga, LibraryHeaderItem>>() val removedManga = mutableListOf<LibraryItem>()
val items = libraryMangaList.mapNotNull map@ { manga -> val items = libraryMangaList.mapNotNull map@ { manga ->
when (groupType) { when (groupType) {
BY_TAG -> { BY_TAG -> {
@ -820,11 +824,12 @@ class LibraryPresenter(
} }
tags.mapNotNull inner@ { tags.mapNotNull inner@ {
val header = makeOrGetHeader(it) val header = makeOrGetHeader(it)
val item = LibraryItem(manga, header, viewContext)
if (header.category.isHidden) { if (header.category.isHidden) {
removedManga.add(manga to header) removedManga.add(item)
return@inner null return@inner null
} }
LibraryItem(manga, header, viewContext) item
} }
} }
BY_TRACK_STATUS -> { BY_TRACK_STATUS -> {
@ -843,31 +848,32 @@ class LibraryPresenter(
view?.view?.context?.getString(R.string.not_tracked) ?: "" view?.view?.context?.getString(R.string.not_tracked) ?: ""
} }
val header = makeOrGetHeader(status) val header = makeOrGetHeader(status)
val item = LibraryItem(manga, header, viewContext)
if (header.category.isHidden) { if (header.category.isHidden) {
removedManga.add(manga to header) removedManga.add(item)
return@map null return@map null
} }
listOf(LibraryItem(manga, header, viewContext)) listOf(item)
} }
BY_SOURCE -> { BY_SOURCE -> {
val source = sourceManager.getOrStub(manga.source) val source = sourceManager.getOrStub(manga.source)
val header = makeOrGetHeader("${source.name}$sourceSplitter${source.id}") val header = makeOrGetHeader("${source.name}$sourceSplitter${source.id}")
val item = LibraryItem(manga, header, viewContext)
if (header.category.isHidden) { if (header.category.isHidden) {
removedManga.add(manga to header) removedManga.add(item)
return@map null return@map null
} }
listOf( listOf(item)
LibraryItem(manga, header, viewContext),
)
} }
BY_AUTHOR -> { BY_AUTHOR -> {
if (manga.artist.isNullOrBlank() && manga.author.isNullOrBlank()) { if (manga.artist.isNullOrBlank() && manga.author.isNullOrBlank()) {
val header = makeOrGetHeader(unknown) val header = makeOrGetHeader(unknown)
val item = LibraryItem(manga, header, viewContext)
if (header.category.isHidden) { if (header.category.isHidden) {
removedManga.add(manga to header) removedManga.add(item)
return@map null return@map null
} }
listOf(LibraryItem(manga, header, viewContext)) listOf(item)
} else { } else {
listOfNotNull( listOfNotNull(
manga.author.takeUnless { it.isNullOrBlank() }, manga.author.takeUnless { it.isNullOrBlank() },
@ -879,11 +885,12 @@ class LibraryPresenter(
} }
}.flatten().distinct().mapNotNull inner@ { }.flatten().distinct().mapNotNull inner@ {
val header = makeOrGetHeader(it, true) val header = makeOrGetHeader(it, true)
val item = LibraryItem(manga, header, viewContext)
if (header.category.isHidden) { if (header.category.isHidden) {
removedManga.add(manga to header) removedManga.add(item)
return@inner null return@inner null
} }
LibraryItem(manga, header, viewContext) item
} }
} }
} }
@ -898,26 +905,26 @@ class LibraryPresenter(
}, },
) ?: unknown, ) ?: unknown,
) )
val item = LibraryItem(manga, header, viewContext)
if (header.category.isHidden) { if (header.category.isHidden) {
removedManga.add(manga to header) removedManga.add(item)
return@map null return@map null
} }
listOf( listOf(item)
LibraryItem(manga, header, viewContext),
)
} }
BY_STATUS -> { BY_STATUS -> {
val header = makeOrGetHeader(context.mapStatus(manga.status)) val header = makeOrGetHeader(context.mapStatus(manga.status))
val item = LibraryItem(manga, header, viewContext)
if (header.category.isHidden) { if (header.category.isHidden) {
removedManga.add(manga to header) removedManga.add(item)
return@map null return@map null
} }
listOf(LibraryItem(manga, header, viewContext)) listOf(item)
} }
else -> throw IllegalStateException("Invalid group type") else -> throw IllegalStateException("Invalid group type")
} }
}.flatten().toMutableList() }.flatten().toMutableList()
.addRemovedManga(removedManga) .addRemovedManga(removedManga.groupBy { it.header.category })
.groupBy { it.header.category.id!! } .groupBy { it.header.category.id!! }
val categories = tagItems val categories = tagItems
@ -979,7 +986,7 @@ class LibraryPresenter(
}.toMap() }.toMap()
else null else null
val removedManga = mutableListOf<Pair<LibraryManga, LibraryHeaderItem>>() val removedManga = mutableListOf<LibraryItem>()
val libraryManga = libraryMangaList val libraryManga = libraryMangaList
.mapNotNull { .mapNotNull {
// Header item is used to identify which category the library manga is actually belong to, // Header item is used to identify which category the library manga is actually belong to,
@ -991,16 +998,18 @@ class LibraryPresenter(
headerItems[it.category] headerItems[it.category]
} ?: return@mapNotNull null } ?: return@mapNotNull null
val item = LibraryItem(it, headerItem, viewContext)
// We'll handle hidden manga separately // We'll handle hidden manga separately
if (headerItem.isHidden) { if (headerItem.isHidden) {
removedManga.add(it to headerItem) removedManga.add(item)
return@mapNotNull null return@mapNotNull null
} }
LibraryItem(it, headerItem, viewContext) item
} }
.toMutableList() .toMutableList()
.addRemovedManga(removedManga) .addRemovedManga(removedManga.groupBy { it.header.category })
.groupBy { it.header.category.id!! } .groupBy { it.header.category.id!! }
categories.associateWith { categories.associateWith {
@ -1106,7 +1115,7 @@ class LibraryPresenter(
LibraryManga.createHide( LibraryManga.createHide(
catId, catId,
mergedTitle, mergedTitle,
mangaToRemove.size, mangaToRemove,
), ),
headerItem, headerItem,
viewContext, viewContext,
@ -1295,7 +1304,7 @@ class LibraryPresenter(
if (headerItem != null) { if (headerItem != null) {
items.add( items.add(
LibraryItem( LibraryItem(
LibraryManga.createHide(catId, mergedTitle, mangaToRemove.size), LibraryManga.createHide(catId, mergedTitle, mangaToRemove),
headerItem, headerItem,
viewContext, viewContext,
), ),