Horis 1 an în urmă
părinte
comite
96a0fb7dee

+ 1 - 3
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<Bitmap> {
-        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)

+ 4 - 0
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) {

+ 23 - 24
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<Bitmap>() {
-                override fun onLoadFailed(errorDrawable: Drawable?) {
-                    errorDrawable?.toBitmap()?.let {
-                        onResourceReady(it, null)
-                    }
+            .listener(object : RequestListener<Bitmap> {
+                override fun onLoadFailed(
+                    e: GlideException?,
+                    model: Any?,
+                    target: Target<Bitmap?>,
+                    isFirstResource: Boolean
+                ): Boolean {
+                    return false
                 }
 
                 override fun onResourceReady(
                     resource: Bitmap,
-                    transition: Transition<in Bitmap>?
-                ) {
-                    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<Bitmap?>?,
+                    dataSource: DataSource,
+                    isFirstResource: Boolean
+                ): Boolean {
+                    val bitmap = resource.copy(resource.config!!, true)
+                    ImageProvider.put(url, bitmap) // 传给 PhotoDialog
+                    return false
                 }
             })
+            .into(binding.verificationCodeImageView)
     }
 
     @SuppressLint("InflateParams")

+ 24 - 30
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)
         }
     }