Pārlūkot izejas kodu

Clean up LibraryItem (#9072)

* Move LibraryItem vars to constructor vals

* Convert LibraryItem to data class

Remove redundant equals and hashCode

* Remove unused LibraryItem.displayMode

* Simplify LibraryItem.matches()

* Align types in LibraryItem and LibraryBadges

* fixup! Simplify LibraryItem.matches()
Two-Ai 2 gadi atpakaļ
vecāks
revīzija
7b118eba22

+ 2 - 2
app/src/main/java/eu/kanade/presentation/library/components/LibraryBadges.kt

@@ -7,7 +7,7 @@ import eu.kanade.presentation.components.Badge
 import eu.kanade.tachiyomi.R
 
 @Composable
-fun DownloadsBadge(count: Int) {
+fun DownloadsBadge(count: Long) {
     if (count > 0) {
         Badge(
             text = "$count",
@@ -18,7 +18,7 @@ fun DownloadsBadge(count: Int) {
 }
 
 @Composable
-fun UnreadBadge(count: Int) {
+fun UnreadBadge(count: Long) {
     if (count > 0) {
         Badge(text = "$count")
     }

+ 2 - 2
app/src/main/java/eu/kanade/presentation/library/components/LibraryComfortableGrid.kt

@@ -46,8 +46,8 @@ fun LibraryComfortableGrid(
                     lastModified = manga.coverLastModified,
                 ),
                 coverBadgeStart = {
-                    DownloadsBadge(count = libraryItem.downloadCount.toInt())
-                    UnreadBadge(count = libraryItem.unreadCount.toInt())
+                    DownloadsBadge(count = libraryItem.downloadCount)
+                    UnreadBadge(count = libraryItem.unreadCount)
                 },
                 coverBadgeEnd = {
                     LanguageBadge(

+ 2 - 2
app/src/main/java/eu/kanade/presentation/library/components/LibraryCompactGrid.kt

@@ -47,8 +47,8 @@ fun LibraryCompactGrid(
                     lastModified = manga.coverLastModified,
                 ),
                 coverBadgeStart = {
-                    DownloadsBadge(count = libraryItem.downloadCount.toInt())
-                    UnreadBadge(count = libraryItem.unreadCount.toInt())
+                    DownloadsBadge(count = libraryItem.downloadCount)
+                    UnreadBadge(count = libraryItem.unreadCount)
                 },
                 coverBadgeEnd = {
                     LanguageBadge(

+ 2 - 2
app/src/main/java/eu/kanade/presentation/library/components/LibraryList.kt

@@ -56,8 +56,8 @@ fun LibraryList(
                     lastModified = manga.coverLastModified,
                 ),
                 badge = {
-                    DownloadsBadge(count = libraryItem.downloadCount.toInt())
-                    UnreadBadge(count = libraryItem.unreadCount.toInt())
+                    DownloadsBadge(count = libraryItem.downloadCount)
+                    UnreadBadge(count = libraryItem.unreadCount)
                     LanguageBadge(
                         isLocal = libraryItem.isLocal,
                         sourceLanguage = libraryItem.sourceLanguage,

+ 22 - 64
app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryItem.kt

@@ -6,17 +6,14 @@ import tachiyomi.domain.library.model.LibraryManga
 import uy.kohesive.injekt.Injekt
 import uy.kohesive.injekt.api.get
 
-class LibraryItem(
+data class LibraryItem(
     val libraryManga: LibraryManga,
+    val downloadCount: Long = -1,
+    val unreadCount: Long = -1,
+    val isLocal: Boolean = false,
+    val sourceLanguage: String = "",
     private val sourceManager: SourceManager = Injekt.get(),
 ) {
-
-    var displayMode: Long = -1
-    var downloadCount: Long = -1
-    var unreadCount: Long = -1
-    var isLocal = false
-    var sourceLanguage = ""
-
     /**
      * Checks if a query matches the manga
      *
@@ -25,73 +22,34 @@ class LibraryItem(
      */
     fun matches(constraint: String): Boolean {
         val sourceName by lazy { sourceManager.getOrStub(libraryManga.manga.source).getNameForMangaInfo() }
-        val genres by lazy { libraryManga.manga.genre }
         return libraryManga.manga.title.contains(constraint, true) ||
             (libraryManga.manga.author?.contains(constraint, true) ?: false) ||
             (libraryManga.manga.artist?.contains(constraint, true) ?: false) ||
             (libraryManga.manga.description?.contains(constraint, true) ?: false) ||
-            if (constraint.contains(",")) {
-                constraint.split(",").all { containsSourceOrGenre(it.trim(), sourceName, genres) }
-            } else {
-                containsSourceOrGenre(constraint, sourceName, genres)
+            constraint.split(",").map { it.trim() }.all { subconstraint ->
+                checkNegatableConstraint(subconstraint) {
+                    sourceName.contains(it, true) ||
+                        (libraryManga.manga.genre?.any { genre -> genre.equals(it, true) } ?: false)
+                }
             }
     }
 
     /**
-     * Filters a manga by checking whether the query is the manga's source OR part of
-     * the genres of the manga
-     * Checking for genre is done only if the query isn't part of the source name.
+     * Checks a predicate on a negatable constraint. If the constraint starts with a minus character,
+     * the minus is stripped and the result of the predicate is inverted.
      *
-     * @param query the query to check
-     * @param sourceName name of the manga's source
-     * @param genres list containing manga's genres
+     * @param constraint the argument to the predicate. Inverts the predicate if it starts with '-'.
+     * @param predicate the check to be run against the constraint.
+     * @return !predicate(x) if constraint = "-x", otherwise predicate(constraint)
      */
-    private fun containsSourceOrGenre(query: String, sourceName: String, genres: List<String>?): Boolean {
-        val minus = query.startsWith("-")
-        val tag = if (minus) { query.substringAfter("-") } else query
-        return when (sourceName.contains(tag, true)) {
-            false -> containsGenre(query, genres)
-            else -> !minus
-        }
-    }
-
-    private fun containsGenre(tag: String, genres: List<String>?): Boolean {
-        return if (tag.startsWith("-")) {
-            genres?.find {
-                it.trim().equals(tag.substringAfter("-"), ignoreCase = true)
-            } == null
+    private fun checkNegatableConstraint(
+        constraint: String,
+        predicate: (String) -> Boolean,
+    ): Boolean {
+        return if (constraint.startsWith("-")) {
+            !predicate(constraint.substringAfter("-").trimStart())
         } else {
-            genres?.find {
-                it.trim().equals(tag, ignoreCase = true)
-            } != null
+            predicate(constraint)
         }
     }
-
-    override fun equals(other: Any?): Boolean {
-        if (this === other) return true
-        if (javaClass != other?.javaClass) return false
-
-        other as LibraryItem
-
-        if (libraryManga != other.libraryManga) return false
-        if (sourceManager != other.sourceManager) return false
-        if (displayMode != other.displayMode) return false
-        if (downloadCount != other.downloadCount) return false
-        if (unreadCount != other.unreadCount) return false
-        if (isLocal != other.isLocal) return false
-        if (sourceLanguage != other.sourceLanguage) return false
-
-        return true
-    }
-
-    override fun hashCode(): Int {
-        var result = libraryManga.hashCode()
-        result = 31 * result + sourceManager.hashCode()
-        result = 31 * result + displayMode.hashCode()
-        result = 31 * result + downloadCount.toInt()
-        result = 31 * result + unreadCount.toInt()
-        result = 31 * result + isLocal.hashCode()
-        result = 31 * result + sourceLanguage.hashCode()
-        return result
-    }
 }

+ 7 - 6
app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryScreenModel.kt

@@ -371,20 +371,21 @@ class LibraryScreenModel(
             libraryMangaList
                 .map { libraryManga ->
                     // Display mode based on user preference: take it from global library setting or category
-                    LibraryItem(libraryManga).apply {
+                    LibraryItem(
+                        libraryManga,
                         downloadCount = if (prefs.downloadBadge) {
                             downloadManager.getDownloadCount(libraryManga.manga).toLong()
                         } else {
                             0
-                        }
-                        unreadCount = libraryManga.unreadCount
-                        isLocal = if (prefs.localBadge) libraryManga.manga.isLocal() else false
+                        },
+                        unreadCount = libraryManga.unreadCount,
+                        isLocal = if (prefs.localBadge) libraryManga.manga.isLocal() else false,
                         sourceLanguage = if (prefs.languageBadge) {
                             sourceManager.getOrStub(libraryManga.manga.source).lang
                         } else {
                             ""
-                        }
-                    }
+                        },
+                    )
                 }
                 .groupBy { it.libraryManga.category }
         }