This commit is contained in:
Horis
2025-01-28 11:13:48 +08:00
parent 86d424f854
commit fae0dd6ded
4 changed files with 52 additions and 57 deletions
@@ -8,7 +8,6 @@ import androidx.annotation.DrawableRes
import androidx.lifecycle.Lifecycle import androidx.lifecycle.Lifecycle
import com.bumptech.glide.Glide import com.bumptech.glide.Glide
import com.bumptech.glide.RequestBuilder import com.bumptech.glide.RequestBuilder
import com.bumptech.glide.request.RequestOptions
import io.legado.app.utils.isAbsUrl import io.legado.app.utils.isAbsUrl
import io.legado.app.utils.isContentScheme import io.legado.app.utils.isContentScheme
import io.legado.app.utils.isDataUrl import io.legado.app.utils.isDataUrl
@@ -55,8 +54,7 @@ object ImageLoader {
} }
fun loadBitmap(context: Context, path: String?): RequestBuilder<Bitmap> { fun loadBitmap(context: Context, path: String?): RequestBuilder<Bitmap> {
val requestManager = Glide.with(context).asBitmap() val requestManager = Glide.with(context).`as`(Bitmap::class.java)
.apply(RequestOptions.decodeTypeOf(Any::class.java))
return when { return when {
path.isNullOrEmpty() -> requestManager.load(path) path.isNullOrEmpty() -> requestManager.load(path)
path.isDataUrl() -> requestManager.load(path) path.isDataUrl() -> requestManager.load(path)
@@ -75,6 +75,10 @@ object ImageProvider {
return bitmapLruCache.get(key) return bitmapLruCache.get(key)
} }
fun remove(key: String): Bitmap? {
return bitmapLruCache.remove(key)
}
private fun getNotRecycled(key: String): Bitmap? { private fun getNotRecycled(key: String): Bitmap? {
val bitmap = bitmapLruCache.get(key) ?: return null val bitmap = bitmapLruCache.get(key) ?: return null
if (bitmap.isRecycled) { if (bitmap.isRecycled) {
@@ -2,21 +2,20 @@ package io.legado.app.ui.association
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.graphics.Bitmap import android.graphics.Bitmap
import android.graphics.drawable.Drawable
import android.os.Bundle import android.os.Bundle
import android.view.MenuItem import android.view.MenuItem
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.appcompat.widget.Toolbar 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.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.RequestOptions
import com.bumptech.glide.request.target.CustomTarget import com.bumptech.glide.request.target.Target
import com.bumptech.glide.request.transition.Transition
import io.legado.app.R import io.legado.app.R
import io.legado.app.base.BaseDialogFragment import io.legado.app.base.BaseDialogFragment
import io.legado.app.databinding.DialogVerificationCodeViewBinding 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.ImageLoader
import io.legado.app.help.glide.OkHttpModelLoader import io.legado.app.help.glide.OkHttpModelLoader
import io.legado.app.help.source.SourceVerificationHelp import io.legado.app.help.source.SourceVerificationHelp
@@ -79,37 +78,37 @@ class VerificationCodeDialog() : BaseDialogFragment(R.layout.dialog_verification
@SuppressLint("CheckResult") @SuppressLint("CheckResult")
private fun loadImage(url: String, sourceUrl: String?) { private fun loadImage(url: String, sourceUrl: String?) {
ImageProvider.bitmapLruCache.remove(url) ImageProvider.remove(url)
ImageLoader.loadBitmap(requireContext(), url).apply { ImageLoader.loadBitmap(requireContext(), url).apply {
sourceUrl?.let { sourceUrl?.let {
apply( apply(RequestOptions().set(OkHttpModelLoader.sourceOriginOption, it))
RequestOptions().set(OkHttpModelLoader.sourceOriginOption, it)
)
} }
}.error(R.drawable.image_loading_error) }.error(R.drawable.image_loading_error)
.diskCacheStrategy(DiskCacheStrategy.NONE) .diskCacheStrategy(DiskCacheStrategy.NONE)
.skipMemoryCache(true) .skipMemoryCache(true)
.into(object : CustomTarget<Bitmap>() { .listener(object : RequestListener<Bitmap> {
override fun onLoadFailed(errorDrawable: Drawable?) { override fun onLoadFailed(
errorDrawable?.toBitmap()?.let { e: GlideException?,
onResourceReady(it, null) model: Any?,
} target: Target<Bitmap?>,
isFirstResource: Boolean
): Boolean {
return false
} }
override fun onResourceReady( override fun onResourceReady(
resource: Bitmap, resource: Bitmap,
transition: Transition<in Bitmap>? model: Any,
) { target: Target<Bitmap?>?,
view ?: return dataSource: DataSource,
val bitmap = resource.copy(resource.config ?: Bitmap.Config.ARGB_8888, true) isFirstResource: Boolean
ImageProvider.bitmapLruCache.put(url, bitmap) ): Boolean {
binding.verificationCodeImageView.setImageBitmap(bitmap) val bitmap = resource.copy(resource.config!!, true)
} ImageProvider.put(url, bitmap) // 传给 PhotoDialog
return false
override fun onLoadCleared(placeholder: Drawable?) {
// do nothing
} }
}) })
.into(binding.verificationCodeImageView)
} }
@SuppressLint("InflateParams") @SuppressLint("InflateParams")
@@ -41,36 +41,30 @@ class PhotoDialog() : BaseDialogFragment(R.layout.dialog_photo_view) {
@SuppressLint("CheckResult") @SuppressLint("CheckResult")
override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) { override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) {
val arguments = arguments ?: return val arguments = arguments ?: return
arguments.getString("src")?.let { src -> val src = arguments.getString("src") ?: return
ImageProvider.bitmapLruCache.get(src)?.let { ImageProvider.get(src)?.let {
binding.photoView.setImageBitmap(it) binding.photoView.setImageBitmap(it)
return return
} }
val file = ReadBook.book?.let { book -> val file = ReadBook.book?.let { book ->
BookHelp.getImage(book, src) BookHelp.getImage(book, src)
} }
if (file?.exists() == true) { if (file?.exists() == true) {
ImageLoader.load(requireContext(), file) ImageLoader.load(requireContext(), file)
.error(R.drawable.image_loading_error) .error(R.drawable.image_loading_error)
.dontTransform() .dontTransform()
.downsample(DownsampleStrategy.NONE) .downsample(DownsampleStrategy.NONE)
.diskCacheStrategy(DiskCacheStrategy.NONE) .diskCacheStrategy(DiskCacheStrategy.NONE)
.into(binding.photoView) .into(binding.photoView)
} else { } else {
ImageLoader.load(requireContext(), src).apply { ImageLoader.load(requireContext(), src).apply {
arguments.getString("sourceOrigin")?.let { sourceOrigin -> arguments.getString("sourceOrigin")?.let { sourceOrigin ->
apply( apply(RequestOptions().set(OkHttpModelLoader.sourceOriginOption, sourceOrigin))
RequestOptions().set( }
OkHttpModelLoader.sourceOriginOption, }.error(BookCover.defaultDrawable)
sourceOrigin .dontTransform()
) .downsample(DownsampleStrategy.NONE)
) .into(binding.photoView)
}
}.error(BookCover.defaultDrawable)
.dontTransform()
.downsample(DownsampleStrategy.NONE)
.into(binding.photoView)
}
} }
} }