diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/download/coil/LibraryMangaImageTarget.kt b/app/src/main/java/eu/kanade/tachiyomi/data/download/coil/LibraryMangaImageTarget.kt new file mode 100644 index 0000000000..a2e1841526 --- /dev/null +++ b/app/src/main/java/eu/kanade/tachiyomi/data/download/coil/LibraryMangaImageTarget.kt @@ -0,0 +1,51 @@ +package eu.kanade.tachiyomi.data.download.coil + +import android.graphics.BitmapFactory +import android.graphics.drawable.Drawable +import android.widget.ImageView +import coil.Coil +import coil.ImageLoader +import coil.request.LoadRequest +import coil.request.LoadRequestBuilder +import coil.request.RequestDisposable +import coil.target.ImageViewTarget +import eu.kanade.tachiyomi.data.cache.CoverCache +import eu.kanade.tachiyomi.data.database.models.Manga +import uy.kohesive.injekt.injectLazy + +class LibraryMangaImageTarget( + override val view: ImageView, + val manga: Manga +) : ImageViewTarget(view) { + + private val coverCache: CoverCache by injectLazy() + + override fun onError(error: Drawable?) { + super.onError(error) + val file = coverCache.getCoverFile(manga) + // if the file exists and the there was still an error then the file is corrupted + if (file.exists()) { + val options = BitmapFactory.Options() + options.inJustDecodeBounds = true + BitmapFactory.decodeFile(file.path, options) + if (options.outWidth == -1 || options.outHeight == -1) { + file.delete() + Coil.imageLoader(view.context).invalidate(manga.key()) + } + } + } +} + +@JvmSynthetic +inline fun ImageView.loadLibraryManga( + manga: Manga, + imageLoader: ImageLoader = Coil.imageLoader(context), + builder: LoadRequestBuilder.() -> Unit = {} +): RequestDisposable { + val request = LoadRequest.Builder(context) + .data(manga) + .target(LibraryMangaImageTarget(this, manga)) + .apply(builder) + .build() + return imageLoader.execute(request) +} diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/download/coil/MangaFetcher.kt b/app/src/main/java/eu/kanade/tachiyomi/data/download/coil/MangaFetcher.kt index dc5d8488ca..d6aeb9fd50 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/download/coil/MangaFetcher.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/download/coil/MangaFetcher.kt @@ -62,7 +62,7 @@ class MangaFetcher : Fetcher { return fileLoader(customCoverFile) } val coverFile = coverCache.getCoverFile(manga) - if (coverFile.exists()) { + if (coverFile.exists() && options.diskCachePolicy.readEnabled) { return fileLoader(coverFile) } if (!manga.favorite) { diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryGridHolder.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryGridHolder.kt index be11cb6ad9..784cbaeb6a 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryGridHolder.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryGridHolder.kt @@ -5,10 +5,10 @@ import android.view.Gravity import android.view.View import android.widget.FrameLayout import coil.api.clear -import coil.api.loadAny import coil.size.Precision import coil.size.Scale import eu.kanade.tachiyomi.data.database.models.Manga +import eu.kanade.tachiyomi.data.download.coil.loadLibraryManga import eu.kanade.tachiyomi.util.view.gone import eu.kanade.tachiyomi.util.view.visibleIf import kotlinx.android.synthetic.main.manga_grid_item.* @@ -79,7 +79,7 @@ class LibraryGridHolder( private fun setCover(manga: Manga) { if ((adapter.recyclerView.context as? Activity)?.isDestroyed == true) return - cover_thumbnail.loadAny(manga) { + cover_thumbnail.loadLibraryManga(manga) { if (!fixedSize) { precision(Precision.INEXACT) scale(Scale.FIT) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryListHolder.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryListHolder.kt index 44eb38672c..556c12798c 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryListHolder.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryListHolder.kt @@ -3,8 +3,8 @@ package eu.kanade.tachiyomi.ui.library import android.view.View import android.view.ViewGroup import coil.api.clear -import coil.api.loadAny import eu.kanade.tachiyomi.R +import eu.kanade.tachiyomi.data.download.coil.loadLibraryManga import eu.kanade.tachiyomi.util.system.dpToPx import eu.kanade.tachiyomi.util.view.gone import eu.kanade.tachiyomi.util.view.updateLayoutParams @@ -79,7 +79,7 @@ class LibraryListHolder( cover_thumbnail.clear() } else { val id = item.manga.id ?: return - cover_thumbnail.loadAny(item.manga) + cover_thumbnail.loadLibraryManga(item.manga) } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaDetailsController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaDetailsController.kt index f581ad3786..af00eabddc 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaDetailsController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaDetailsController.kt @@ -307,7 +307,7 @@ class MangaDetailsController : BaseController, val view = view ?: return val request = LoadRequest.Builder(view.context).data(presenter.manga).allowHardware(false) - .target { drawable -> + .target(onSuccess = { drawable -> val bitmap = (drawable as BitmapDrawable).bitmap // Generate the Palette on a background thread. Palette.from(bitmap).generate { @@ -316,7 +316,8 @@ class MangaDetailsController : BaseController, android.R.attr.colorBackground ) // this makes the color more consistent regardless of theme - val backDropColor = ColorUtils.blendARGB(it.getVibrantColor(colorBack), colorBack, .35f) + val backDropColor = + ColorUtils.blendARGB(it.getVibrantColor(colorBack), colorBack, .35f) coverColor = backDropColor getHeader()?.setBackDrop(backDropColor) @@ -328,7 +329,13 @@ class MangaDetailsController : BaseController, } manga_cover_full.setImageDrawable(drawable) getHeader()?.updateCover(manga!!) - }.build() + }, onError = { + val file = presenter.coverCache.getCoverFile(manga!!) + if (file.exists()) { + file.delete() + setPaletteColor() + } + }).build() Coil.imageLoader(view.context).execute(request) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaDetailsPresenter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaDetailsPresenter.kt index 063dc27b7b..ec39de7ff3 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaDetailsPresenter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaDetailsPresenter.kt @@ -411,9 +411,9 @@ class MangaDetailsPresenter( if (thumbnailUrl != networkManga.thumbnail_url) { coverCache.deleteFromCache(thumbnailUrl) - withContext(Dispatchers.Main) { - controller.setPaletteColor() - } + } + withContext(Dispatchers.Main) { + controller.setPaletteColor() } db.insertManga(manga).executeAsBlocking() } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/recent_updates/RecentChapterHolder.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/recent_updates/RecentChapterHolder.kt index 680a4a824c..cf37b12c99 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/recent_updates/RecentChapterHolder.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/recent_updates/RecentChapterHolder.kt @@ -4,9 +4,9 @@ import android.app.Activity import android.view.View import androidx.core.content.ContextCompat import coil.api.clear -import coil.api.loadAny import coil.transform.CircleCropTransformation import eu.kanade.tachiyomi.R +import eu.kanade.tachiyomi.data.download.coil.loadLibraryManga import eu.kanade.tachiyomi.ui.manga.chapter.BaseChapterHolder import eu.kanade.tachiyomi.util.chapter.ChapterUtil import eu.kanade.tachiyomi.util.system.getResourceColor @@ -73,7 +73,7 @@ class RecentChapterHolder(private val view: View, private val adapter: RecentCha // Set cover if ((view.context as? Activity)?.isDestroyed != true) { manga_cover.clear() - manga_cover.loadAny(item.manga) { + manga_cover.loadLibraryManga(item.manga) { transformations(CircleCropTransformation()) } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/recently_read/RecentlyReadHolder.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/recently_read/RecentlyReadHolder.kt index c18d040fec..d8e1fd94c4 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/recently_read/RecentlyReadHolder.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/recently_read/RecentlyReadHolder.kt @@ -2,9 +2,9 @@ package eu.kanade.tachiyomi.ui.recently_read import android.view.View import coil.api.clear -import coil.api.loadAny import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.database.models.MangaChapterHistory +import eu.kanade.tachiyomi.data.download.coil.loadLibraryManga import eu.kanade.tachiyomi.ui.base.holder.BaseFlexibleViewHolder import eu.kanade.tachiyomi.util.lang.toTimestampString import kotlinx.android.synthetic.main.recently_read_item.* @@ -60,6 +60,6 @@ class RecentlyReadHolder( // Set cover cover.clear() - cover.loadAny(manga) + cover.loadLibraryManga(manga) } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/recents/RecentMangaHolder.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/recents/RecentMangaHolder.kt index 620c807767..aa185ce3cd 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/recents/RecentMangaHolder.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/recents/RecentMangaHolder.kt @@ -2,8 +2,8 @@ package eu.kanade.tachiyomi.ui.recents import android.app.Activity import android.view.View -import coil.api.loadAny import eu.kanade.tachiyomi.R +import eu.kanade.tachiyomi.data.download.coil.loadLibraryManga import eu.kanade.tachiyomi.data.download.model.Download import eu.kanade.tachiyomi.source.LocalSource import eu.kanade.tachiyomi.ui.manga.chapter.BaseChapterHolder @@ -69,7 +69,7 @@ class RecentMangaHolder( ) } if ((itemView.context as? Activity)?.isDestroyed != true) { - cover_thumbnail.loadAny(item.mch.manga) + cover_thumbnail.loadLibraryManga(item.mch.manga) } notifyStatus( if (adapter.isSelected(adapterPosition)) Download.CHECKED else item.status,