mirror of
				https://github.com/mihonapp/mihon.git
				synced 2025-10-31 14:27:57 +01:00 
			
		
		
		
	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
This commit is contained in:
		| @@ -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) | ||||
| @@ -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) { | ||||
| @@ -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()) | ||||
|     } | ||||
|   | ||||
| @@ -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() | ||||
|   | ||||
| @@ -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) | ||||
|   | ||||
| @@ -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() | ||||
|   | ||||
| @@ -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) | ||||
|   | ||||
| @@ -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() | ||||
|   | ||||
| @@ -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) | ||||
|   | ||||
| @@ -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) | ||||
|   | ||||
| @@ -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) | ||||
|   | ||||
| @@ -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) | ||||
|   | ||||
| @@ -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) | ||||
|   | ||||
| @@ -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() | ||||
|   | ||||
| @@ -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) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user