diff --git a/app/src/main/java/io/legado/app/help/glide/ImageLoader.kt b/app/src/main/java/io/legado/app/help/glide/ImageLoader.kt index d478f95577c9..145a58b69817 100644 --- a/app/src/main/java/io/legado/app/help/glide/ImageLoader.kt +++ b/app/src/main/java/io/legado/app/help/glide/ImageLoader.kt @@ -8,7 +8,6 @@ import androidx.annotation.DrawableRes import androidx.lifecycle.Lifecycle import com.bumptech.glide.Glide import com.bumptech.glide.RequestBuilder -import com.bumptech.glide.request.RequestOptions import io.legado.app.utils.isAbsUrl import io.legado.app.utils.isContentScheme import io.legado.app.utils.isDataUrl @@ -55,8 +54,7 @@ object ImageLoader { } fun loadBitmap(context: Context, path: String?): RequestBuilder { - val requestManager = Glide.with(context).asBitmap() - .apply(RequestOptions.decodeTypeOf(Any::class.java)) + val requestManager = Glide.with(context).`as`(Bitmap::class.java) return when { path.isNullOrEmpty() -> requestManager.load(path) path.isDataUrl() -> requestManager.load(path) diff --git a/app/src/main/java/io/legado/app/model/ImageProvider.kt b/app/src/main/java/io/legado/app/model/ImageProvider.kt index 4cc0d8c4bc2d..d2a3da50b8c9 100644 --- a/app/src/main/java/io/legado/app/model/ImageProvider.kt +++ b/app/src/main/java/io/legado/app/model/ImageProvider.kt @@ -75,6 +75,10 @@ object ImageProvider { return bitmapLruCache.get(key) } + fun remove(key: String): Bitmap? { + return bitmapLruCache.remove(key) + } + private fun getNotRecycled(key: String): Bitmap? { val bitmap = bitmapLruCache.get(key) ?: return null if (bitmap.isRecycled) { diff --git a/app/src/main/java/io/legado/app/ui/association/VerificationCodeDialog.kt b/app/src/main/java/io/legado/app/ui/association/VerificationCodeDialog.kt index 14953bfd4d67..479b065383c9 100644 --- a/app/src/main/java/io/legado/app/ui/association/VerificationCodeDialog.kt +++ b/app/src/main/java/io/legado/app/ui/association/VerificationCodeDialog.kt @@ -2,21 +2,20 @@ package io.legado.app.ui.association import android.annotation.SuppressLint import android.graphics.Bitmap -import android.graphics.drawable.Drawable import android.os.Bundle import android.view.MenuItem import android.view.View import android.view.ViewGroup import androidx.appcompat.widget.Toolbar -import androidx.core.graphics.drawable.toBitmap +import com.bumptech.glide.load.DataSource import com.bumptech.glide.load.engine.DiskCacheStrategy +import com.bumptech.glide.load.engine.GlideException +import com.bumptech.glide.request.RequestListener import com.bumptech.glide.request.RequestOptions -import com.bumptech.glide.request.target.CustomTarget -import com.bumptech.glide.request.transition.Transition +import com.bumptech.glide.request.target.Target import io.legado.app.R import io.legado.app.base.BaseDialogFragment import io.legado.app.databinding.DialogVerificationCodeViewBinding -import io.legado.app.help.CacheManager import io.legado.app.help.glide.ImageLoader import io.legado.app.help.glide.OkHttpModelLoader import io.legado.app.help.source.SourceVerificationHelp @@ -79,37 +78,37 @@ class VerificationCodeDialog() : BaseDialogFragment(R.layout.dialog_verification @SuppressLint("CheckResult") private fun loadImage(url: String, sourceUrl: String?) { - ImageProvider.bitmapLruCache.remove(url) + ImageProvider.remove(url) ImageLoader.loadBitmap(requireContext(), url).apply { sourceUrl?.let { - apply( - RequestOptions().set(OkHttpModelLoader.sourceOriginOption, it) - ) + apply(RequestOptions().set(OkHttpModelLoader.sourceOriginOption, it)) } }.error(R.drawable.image_loading_error) .diskCacheStrategy(DiskCacheStrategy.NONE) .skipMemoryCache(true) - .into(object : CustomTarget() { - override fun onLoadFailed(errorDrawable: Drawable?) { - errorDrawable?.toBitmap()?.let { - onResourceReady(it, null) - } + .listener(object : RequestListener { + override fun onLoadFailed( + e: GlideException?, + model: Any?, + target: Target, + isFirstResource: Boolean + ): Boolean { + return false } override fun onResourceReady( resource: Bitmap, - transition: Transition? - ) { - view ?: return - val bitmap = resource.copy(resource.config ?: Bitmap.Config.ARGB_8888, true) - ImageProvider.bitmapLruCache.put(url, bitmap) - binding.verificationCodeImageView.setImageBitmap(bitmap) - } - - override fun onLoadCleared(placeholder: Drawable?) { - // do nothing + model: Any, + target: Target?, + dataSource: DataSource, + isFirstResource: Boolean + ): Boolean { + val bitmap = resource.copy(resource.config!!, true) + ImageProvider.put(url, bitmap) // 传给 PhotoDialog + return false } }) + .into(binding.verificationCodeImageView) } @SuppressLint("InflateParams") diff --git a/app/src/main/java/io/legado/app/ui/widget/dialog/PhotoDialog.kt b/app/src/main/java/io/legado/app/ui/widget/dialog/PhotoDialog.kt index 08b2c8fe4008..5154dc84bf45 100644 --- a/app/src/main/java/io/legado/app/ui/widget/dialog/PhotoDialog.kt +++ b/app/src/main/java/io/legado/app/ui/widget/dialog/PhotoDialog.kt @@ -41,36 +41,30 @@ class PhotoDialog() : BaseDialogFragment(R.layout.dialog_photo_view) { @SuppressLint("CheckResult") override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) { val arguments = arguments ?: return - arguments.getString("src")?.let { src -> - ImageProvider.bitmapLruCache.get(src)?.let { - binding.photoView.setImageBitmap(it) - return - } - val file = ReadBook.book?.let { book -> - BookHelp.getImage(book, src) - } - if (file?.exists() == true) { - ImageLoader.load(requireContext(), file) - .error(R.drawable.image_loading_error) - .dontTransform() - .downsample(DownsampleStrategy.NONE) - .diskCacheStrategy(DiskCacheStrategy.NONE) - .into(binding.photoView) - } else { - ImageLoader.load(requireContext(), src).apply { - arguments.getString("sourceOrigin")?.let { sourceOrigin -> - apply( - RequestOptions().set( - OkHttpModelLoader.sourceOriginOption, - sourceOrigin - ) - ) - } - }.error(BookCover.defaultDrawable) - .dontTransform() - .downsample(DownsampleStrategy.NONE) - .into(binding.photoView) - } + val src = arguments.getString("src") ?: return + ImageProvider.get(src)?.let { + binding.photoView.setImageBitmap(it) + return + } + val file = ReadBook.book?.let { book -> + BookHelp.getImage(book, src) + } + if (file?.exists() == true) { + ImageLoader.load(requireContext(), file) + .error(R.drawable.image_loading_error) + .dontTransform() + .downsample(DownsampleStrategy.NONE) + .diskCacheStrategy(DiskCacheStrategy.NONE) + .into(binding.photoView) + } else { + ImageLoader.load(requireContext(), src).apply { + arguments.getString("sourceOrigin")?.let { sourceOrigin -> + apply(RequestOptions().set(OkHttpModelLoader.sourceOriginOption, sourceOrigin)) + } + }.error(BookCover.defaultDrawable) + .dontTransform() + .downsample(DownsampleStrategy.NONE) + .into(binding.photoView) } }