瀏覽代碼

Bug/2894 covers not updating (#2908)

* Use a wrapper around Manga to supply glide with proper equals() and hashCode() impl. for caching

* reload image if url has changed

* ignore case for http scheme comparison

* more ignore case for http scheme comparison

* fix indenting

* use data class for MangaThumbnail
MCAxiaz 5 年之前
父節點
當前提交
b3611eef9d

+ 7 - 0
app/src/main/java/eu/kanade/tachiyomi/data/glide/MangaThumbnail.kt

@@ -0,0 +1,7 @@
+package eu.kanade.tachiyomi.data.glide
+
+import eu.kanade.tachiyomi.data.database.models.Manga
+
+data class MangaThumbnail(val manga: Manga, val url: String?)
+
+fun Manga.toMangaThumbnail() = MangaThumbnail(this, this.thumbnail_url)

+ 12 - 10
app/src/main/java/eu/kanade/tachiyomi/data/glide/MangaModelLoader.kt → app/src/main/java/eu/kanade/tachiyomi/data/glide/MangaThumbnailModelLoader.kt

@@ -31,7 +31,7 @@ import uy.kohesive.injekt.injectLazy
  *
  * @param context the application context.
  */
-class MangaModelLoader : ModelLoader<Manga, InputStream> {
+class MangaThumbnailModelLoader : ModelLoader<MangaThumbnail, InputStream> {
 
     /**
      * Cover cache where persistent covers are stored.
@@ -60,18 +60,18 @@ class MangaModelLoader : ModelLoader<Manga, InputStream> {
     private val cachedHeaders = hashMapOf<Long, LazyHeaders>()
 
     /**
-     * Factory class for creating [MangaModelLoader] instances.
+     * Factory class for creating [MangaThumbnailModelLoader] instances.
      */
-    class Factory : ModelLoaderFactory<Manga, InputStream> {
+    class Factory : ModelLoaderFactory<MangaThumbnail, InputStream> {
 
-        override fun build(multiFactory: MultiModelLoaderFactory): ModelLoader<Manga, InputStream> {
-            return MangaModelLoader()
+        override fun build(multiFactory: MultiModelLoaderFactory): ModelLoader<MangaThumbnail, InputStream> {
+            return MangaThumbnailModelLoader()
         }
 
         override fun teardown() {}
     }
 
-    override fun handles(model: Manga): Boolean {
+    override fun handles(model: MangaThumbnail): Boolean {
         return true
     }
 
@@ -83,18 +83,20 @@ class MangaModelLoader : ModelLoader<Manga, InputStream> {
      * @param height the height of the view where the resource will be loaded.
      */
     override fun buildLoadData(
-        manga: Manga,
+        mangaThumbnail: MangaThumbnail,
         width: Int,
         height: Int,
         options: Options
     ): ModelLoader.LoadData<InputStream>? {
         // Check thumbnail is not null or empty
-        val url = manga.thumbnail_url
+        val url = mangaThumbnail.url
         if (url == null || url.isEmpty()) {
             return null
         }
 
-        if (url.startsWith("http")) {
+        val manga = mangaThumbnail.manga
+
+        if (url.startsWith("http", true)) {
             val source = sourceManager.get(manga.source) as? HttpSource
             val glideUrl = GlideUrl(url, getHeaders(manga, source))
 
@@ -126,7 +128,7 @@ class MangaModelLoader : ModelLoader<Manga, InputStream> {
      *
      * @param manga the model.
      */
-    fun getHeaders(manga: Manga, source: HttpSource?): Headers {
+    private fun getHeaders(manga: Manga, source: HttpSource?): Headers {
         if (source == null) return LazyHeaders.DEFAULT
 
         return cachedHeaders.getOrPut(manga.source) {

+ 1 - 2
app/src/main/java/eu/kanade/tachiyomi/data/glide/TachiGlideModule.kt

@@ -13,7 +13,6 @@ import com.bumptech.glide.load.model.GlideUrl
 import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions
 import com.bumptech.glide.module.AppGlideModule
 import com.bumptech.glide.request.RequestOptions
-import eu.kanade.tachiyomi.data.database.models.Manga
 import eu.kanade.tachiyomi.network.NetworkHelper
 import java.io.InputStream
 import uy.kohesive.injekt.Injekt
@@ -36,7 +35,7 @@ class TachiGlideModule : AppGlideModule() {
         val networkFactory = OkHttpUrlLoader.Factory(Injekt.get<NetworkHelper>().client)
 
         registry.replace(GlideUrl::class.java, InputStream::class.java, networkFactory)
-        registry.append(Manga::class.java, InputStream::class.java, MangaModelLoader.Factory())
+        registry.append(MangaThumbnail::class.java, InputStream::class.java, MangaThumbnailModelLoader.Factory())
         registry.append(InputStream::class.java, InputStream::class.java, PassthroughModelLoader
                 .Factory())
     }

+ 2 - 1
app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateService.kt

@@ -22,6 +22,7 @@ import eu.kanade.tachiyomi.data.database.models.LibraryManga
 import eu.kanade.tachiyomi.data.database.models.Manga
 import eu.kanade.tachiyomi.data.download.DownloadManager
 import eu.kanade.tachiyomi.data.download.DownloadService
+import eu.kanade.tachiyomi.data.glide.toMangaThumbnail
 import eu.kanade.tachiyomi.data.library.LibraryUpdateRanker.rankingScheme
 import eu.kanade.tachiyomi.data.library.LibraryUpdateService.Companion.start
 import eu.kanade.tachiyomi.data.notification.NotificationReceiver
@@ -557,7 +558,7 @@ class LibraryUpdateService(
         return try {
             Glide.with(this)
                     .asBitmap()
-                    .load(manga)
+                    .load(manga.toMangaThumbnail())
                     .dontTransform()
                     .centerCrop()
                     .circleCrop()

+ 2 - 1
app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryGridHolder.kt

@@ -4,6 +4,7 @@ import android.view.View
 import com.bumptech.glide.load.engine.DiskCacheStrategy
 import eu.davidea.flexibleadapter.FlexibleAdapter
 import eu.kanade.tachiyomi.data.glide.GlideApp
+import eu.kanade.tachiyomi.data.glide.toMangaThumbnail
 import eu.kanade.tachiyomi.source.LocalSource
 import eu.kanade.tachiyomi.util.view.visibleIf
 import kotlinx.android.synthetic.main.source_grid_item.download_text
@@ -52,7 +53,7 @@ class LibraryGridHolder(
         // Update the cover.
         GlideApp.with(view.context).clear(thumbnail)
         GlideApp.with(view.context)
-                .load(item.manga)
+                .load(item.manga.toMangaThumbnail())
                 .diskCacheStrategy(DiskCacheStrategy.RESOURCE)
                 .centerCrop()
                 .into(thumbnail)

+ 2 - 1
app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryListHolder.kt

@@ -4,6 +4,7 @@ import android.view.View
 import com.bumptech.glide.load.engine.DiskCacheStrategy
 import eu.davidea.flexibleadapter.FlexibleAdapter
 import eu.kanade.tachiyomi.data.glide.GlideApp
+import eu.kanade.tachiyomi.data.glide.toMangaThumbnail
 import eu.kanade.tachiyomi.source.LocalSource
 import eu.kanade.tachiyomi.util.view.visibleIf
 import kotlinx.android.synthetic.main.source_list_item.download_text
@@ -59,7 +60,7 @@ class LibraryListHolder(
         // Update the cover.
         GlideApp.with(itemView.context).clear(thumbnail)
         GlideApp.with(itemView.context)
-                .load(item.manga)
+                .load(item.manga.toMangaThumbnail())
                 .diskCacheStrategy(DiskCacheStrategy.RESOURCE)
                 .centerCrop()
                 .circleCrop()

+ 9 - 3
app/src/main/java/eu/kanade/tachiyomi/ui/manga/info/MangaInfoController.kt

@@ -16,6 +16,7 @@ import eu.kanade.tachiyomi.R
 import eu.kanade.tachiyomi.data.database.models.Category
 import eu.kanade.tachiyomi.data.database.models.Manga
 import eu.kanade.tachiyomi.data.glide.GlideApp
+import eu.kanade.tachiyomi.data.glide.toMangaThumbnail
 import eu.kanade.tachiyomi.data.preference.PreferencesHelper
 import eu.kanade.tachiyomi.databinding.MangaInfoControllerBinding
 import eu.kanade.tachiyomi.source.Source
@@ -61,6 +62,8 @@ class MangaInfoController(private val fromSource: Boolean = false) :
 
     private var initialLoad: Boolean = true
 
+    private var thumbnailUrl: String? = null
+
     override fun createPresenter(): MangaInfoPresenter {
         val ctrl = parentController as MangaController
         return MangaInfoPresenter(ctrl.manga!!, ctrl.source!!, ctrl.mangaFavoriteRelay)
@@ -224,15 +227,18 @@ class MangaInfoController(private val fromSource: Boolean = false) :
         setFavoriteButtonState(manga.favorite)
 
         // Set cover if it wasn't already.
-        if (binding.mangaCover.drawable == null && !manga.thumbnail_url.isNullOrEmpty()) {
+        if (binding.mangaCover.drawable == null || manga.thumbnail_url != thumbnailUrl) {
+            thumbnailUrl = manga.thumbnail_url
+            val mangaThumbnail = manga.toMangaThumbnail()
+
             GlideApp.with(view.context)
-                    .load(manga)
+                    .load(mangaThumbnail)
                     .diskCacheStrategy(DiskCacheStrategy.RESOURCE)
                     .centerCrop()
                     .into(binding.mangaCover)
 
             GlideApp.with(view.context)
-                    .load(manga)
+                    .load(mangaThumbnail)
                     .diskCacheStrategy(DiskCacheStrategy.RESOURCE)
                     .centerCrop()
                     .into(binding.backdrop)

+ 2 - 1
app/src/main/java/eu/kanade/tachiyomi/ui/migration/MangaHolder.kt

@@ -4,6 +4,7 @@ import android.view.View
 import com.bumptech.glide.load.engine.DiskCacheStrategy
 import eu.davidea.flexibleadapter.FlexibleAdapter
 import eu.kanade.tachiyomi.data.glide.GlideApp
+import eu.kanade.tachiyomi.data.glide.toMangaThumbnail
 import eu.kanade.tachiyomi.ui.base.holder.BaseFlexibleViewHolder
 import kotlinx.android.synthetic.main.source_list_item.thumbnail
 import kotlinx.android.synthetic.main.source_list_item.title
@@ -26,7 +27,7 @@ class MangaHolder(
         // Update the cover.
         GlideApp.with(itemView.context).clear(thumbnail)
         GlideApp.with(itemView.context)
-                .load(item.manga)
+                .load(item.manga.toMangaThumbnail())
                 .diskCacheStrategy(DiskCacheStrategy.RESOURCE)
                 .centerCrop()
                 .circleCrop()

+ 1 - 1
app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/pager/PagerPageHolder.kt

@@ -411,7 +411,7 @@ class PagerPageHolder(
         }
 
         val imageUrl = page.imageUrl
-        if (imageUrl.orEmpty().startsWith("http")) {
+        if (imageUrl.orEmpty().startsWith("http", true)) {
             PagerButton(context, viewer).apply {
                 layoutParams = LayoutParams(WRAP_CONTENT, WRAP_CONTENT).apply {
                     setMargins(margins, margins, margins, margins)

+ 1 - 1
app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonPageHolder.kt

@@ -454,7 +454,7 @@ class WebtoonPageHolder(
         }
 
         val imageUrl = page?.imageUrl
-        if (imageUrl.orEmpty().startsWith("http")) {
+        if (imageUrl.orEmpty().startsWith("http", true)) {
             AppCompatButton(context).apply {
                 layoutParams = FrameLayout.LayoutParams(WRAP_CONTENT, WRAP_CONTENT).apply {
                     setMargins(0, margins, 0, margins)

+ 2 - 1
app/src/main/java/eu/kanade/tachiyomi/ui/recent/history/HistoryHolder.kt

@@ -5,6 +5,7 @@ import com.bumptech.glide.load.engine.DiskCacheStrategy
 import eu.kanade.tachiyomi.R
 import eu.kanade.tachiyomi.data.database.models.MangaChapterHistory
 import eu.kanade.tachiyomi.data.glide.GlideApp
+import eu.kanade.tachiyomi.data.glide.toMangaThumbnail
 import eu.kanade.tachiyomi.ui.base.holder.BaseFlexibleViewHolder
 import eu.kanade.tachiyomi.util.lang.toTimestampString
 import java.util.Date
@@ -67,7 +68,7 @@ class HistoryHolder(
         GlideApp.with(itemView.context).clear(cover)
         if (!manga.thumbnail_url.isNullOrEmpty()) {
             GlideApp.with(itemView.context)
-                    .load(manga)
+                    .load(manga.toMangaThumbnail())
                     .diskCacheStrategy(DiskCacheStrategy.RESOURCE)
                     .centerCrop()
                     .into(cover)

+ 2 - 1
app/src/main/java/eu/kanade/tachiyomi/ui/recent/updates/UpdatesHolder.kt

@@ -6,6 +6,7 @@ import com.bumptech.glide.load.engine.DiskCacheStrategy
 import eu.kanade.tachiyomi.R
 import eu.kanade.tachiyomi.data.download.model.Download
 import eu.kanade.tachiyomi.data.glide.GlideApp
+import eu.kanade.tachiyomi.data.glide.toMangaThumbnail
 import eu.kanade.tachiyomi.ui.base.holder.BaseFlexibleViewHolder
 import eu.kanade.tachiyomi.util.system.getResourceColor
 import kotlinx.android.synthetic.main.updates_item.chapter_title
@@ -58,7 +59,7 @@ class UpdatesHolder(private val view: View, private val adapter: UpdatesAdapter)
         GlideApp.with(itemView.context).clear(manga_cover)
         if (!item.manga.thumbnail_url.isNullOrEmpty()) {
             GlideApp.with(itemView.context)
-                    .load(item.manga)
+                    .load(item.manga.toMangaThumbnail())
                     .diskCacheStrategy(DiskCacheStrategy.RESOURCE)
                     .circleCrop()
                     .into(manga_cover)

+ 2 - 1
app/src/main/java/eu/kanade/tachiyomi/ui/source/browse/SourceGridHolder.kt

@@ -5,6 +5,7 @@ import com.bumptech.glide.load.engine.DiskCacheStrategy
 import eu.davidea.flexibleadapter.FlexibleAdapter
 import eu.kanade.tachiyomi.data.database.models.Manga
 import eu.kanade.tachiyomi.data.glide.GlideApp
+import eu.kanade.tachiyomi.data.glide.toMangaThumbnail
 import eu.kanade.tachiyomi.widget.StateImageViewTarget
 import kotlinx.android.synthetic.main.source_grid_item.progress
 import kotlinx.android.synthetic.main.source_grid_item.thumbnail
@@ -41,7 +42,7 @@ class SourceGridHolder(private val view: View, private val adapter: FlexibleAdap
         GlideApp.with(view.context).clear(thumbnail)
         if (!manga.thumbnail_url.isNullOrEmpty()) {
             GlideApp.with(view.context)
-                    .load(manga)
+                    .load(manga.toMangaThumbnail())
                     .diskCacheStrategy(DiskCacheStrategy.DATA)
                     .centerCrop()
                     .placeholder(android.R.color.transparent)

+ 2 - 1
app/src/main/java/eu/kanade/tachiyomi/ui/source/browse/SourceListHolder.kt

@@ -7,6 +7,7 @@ import eu.davidea.flexibleadapter.FlexibleAdapter
 import eu.kanade.tachiyomi.R
 import eu.kanade.tachiyomi.data.database.models.Manga
 import eu.kanade.tachiyomi.data.glide.GlideApp
+import eu.kanade.tachiyomi.data.glide.toMangaThumbnail
 import eu.kanade.tachiyomi.util.system.getResourceColor
 import kotlinx.android.synthetic.main.source_list_item.thumbnail
 import kotlinx.android.synthetic.main.source_list_item.title
@@ -42,7 +43,7 @@ class SourceListHolder(private val view: View, adapter: FlexibleAdapter<*>) :
         GlideApp.with(view.context).clear(thumbnail)
         if (!manga.thumbnail_url.isNullOrEmpty()) {
             GlideApp.with(view.context)
-                    .load(manga)
+                    .load(manga.toMangaThumbnail())
                     .diskCacheStrategy(DiskCacheStrategy.DATA)
                     .centerCrop()
                     .circleCrop()

+ 2 - 1
app/src/main/java/eu/kanade/tachiyomi/ui/source/global_search/GlobalSearchCardHolder.kt

@@ -4,6 +4,7 @@ import android.view.View
 import com.bumptech.glide.load.engine.DiskCacheStrategy
 import eu.kanade.tachiyomi.data.database.models.Manga
 import eu.kanade.tachiyomi.data.glide.GlideApp
+import eu.kanade.tachiyomi.data.glide.toMangaThumbnail
 import eu.kanade.tachiyomi.ui.base.holder.BaseFlexibleViewHolder
 import eu.kanade.tachiyomi.widget.StateImageViewTarget
 import kotlinx.android.synthetic.main.global_search_controller_card_item.itemImage
@@ -42,7 +43,7 @@ class GlobalSearchCardHolder(view: View, adapter: GlobalSearchCardAdapter) :
         GlideApp.with(itemView.context).clear(itemImage)
         if (!manga.thumbnail_url.isNullOrEmpty()) {
             GlideApp.with(itemView.context)
-                    .load(manga)
+                    .load(manga.toMangaThumbnail())
                     .diskCacheStrategy(DiskCacheStrategy.DATA)
                     .centerCrop()
                     .skipMemoryCache(true)