Manage ImageView load status through coil

Will implement retry later
This commit is contained in:
tarsin committed 2023-02-20 13:32:53 +08:00
1 parent 473ff4d308
commit bf651c7e40
3 files changed
+26 -91

No files matched your search

@@ -185,7 +185,7 @@ class EhApplication : Application(), DefaultLifecycleObserver, ImageLoaderFactor
return ImageLoader.Builder(this).apply {
okHttpClient(okHttpClient)
components { add(MergeInterceptor) }
crossfade(true)
crossfade(300)
}.build()
}
@@ -572,7 +572,7 @@ class GalleryDetailScene : CollapsingToolbarScene(), View.OnClickListener, Downl
_binding ?: return
val resources = resources
binding.content.header.run {
(thumb as LoadImageView).load(gd.thumb!!, true)
(thumb as LoadImageView).load(gd.thumb!!, false)
setTitle(EhUtils.getSuitableTitle(gd))
uploader.text = gd.uploader
if (gd.disowned) {
@@ -727,14 +727,14 @@ class GalleryDetailScene : CollapsingToolbarScene(), View.OnClickListener, Downl
for (i in 0 until previewSet.size()) {
val view = inflater.inflate(R.layout.item_gallery_preview, gridLayout, false)
val image = view.findViewById<LoadImageView>(R.id.image)
previewSet.load(image, gd.gid, i)
image.setTag(R.id.index, i)
withUIContext {
gridLayout.addView(view)
image.setTag(R.id.index, i)
image.setOnClickListener(this@GalleryDetailScene)
val text = view.findViewById<TextView>(R.id.text)
text.text = (previewSet.getPosition(i) + 1).toString()
}
previewSet.load(image, gd.gid, i)
}
}
}
@@ -17,15 +17,11 @@
package com.hippo.widget
import android.content.Context
import android.graphics.Color
import android.graphics.drawable.ColorDrawable
import android.graphics.drawable.Drawable
import android.graphics.drawable.TransitionDrawable
import android.util.AttributeSet
import android.view.View
import androidx.annotation.IntDef
import androidx.core.content.ContextCompat
import coil.imageLoader
import coil.load
import coil.request.Disposable
import coil.request.ImageRequest
import coil.size.Size
@@ -44,19 +40,6 @@ open class LoadImageView @JvmOverloads constructor(
private var mRetryType: Int = 0
private var mFailed: Boolean = false
private var task: Disposable? = null
private val imageDrawable: Drawable?
get() {
var drawable = drawable
if (drawable is TransitionDrawable) {
if (drawable.numberOfLayers == 2) {
drawable = drawable.getDrawable(1)
}
}
if (drawable is PreciselyClipDrawable) {
drawable = drawable.wrappedDrawable
}
return drawable
}
init {
val a = context.obtainStyledAttributes(attrs, R.styleable.LoadImageView, defStyleAttr, 0)
@@ -64,22 +47,6 @@ open class LoadImageView @JvmOverloads constructor(
a.recycle()
}
override fun onAttachedToWindow() {
super.onAttachedToWindow()
if (mFailed) onFailure()
else task?.run { if (isDisposed) reload() }
}
override fun onDetachedFromWindow() {
super.onDetachedFromWindow()
task?.dispose()
clearDrawable()
}
private fun clearDrawable() {
setImageDrawable(null)
}
private fun clearRetry() {
if (mRetryType == RETRY_TYPE_CLICK) {
setOnClickListener(null)
@@ -127,63 +94,33 @@ open class LoadImageView @JvmOverloads constructor(
mClipHeight = Integer.MIN_VALUE
}
@JvmOverloads
fun load(url: String, isLoaded: Boolean = false) {
if ((mRequest?.data as? String?) == url)
return
mFailed = false
clearRetry()
task?.dispose()
mRequest =
ImageRequest.Builder(context).data(url).crossfade(false)
.size(Size.ORIGINAL).target(
{ onWait() },
{ onFailure() },
{ onGetValue(it, isLoaded) }
).build().also { load(it) }
}
fun load(request: ImageRequest) {
task = context.imageLoader.enqueue(request)
}
private fun reload() {
mRequest?.let { load(it) }
}
private fun onWait() {
mFailed = false
clearDrawable()
}
private fun onGetValue(drawable: Drawable, isLoaded: Boolean) {
var drawable = drawable
clearDrawable()
if (Integer.MIN_VALUE != mOffsetX) {
drawable = PreciselyClipDrawable(drawable, mOffsetX, mOffsetY, mClipWidth, mClipHeight)
fun load(url: String, crossfade: Boolean = true) {
load(url) {
size(Size.ORIGINAL)
if (!crossfade) crossfade(false)
}
}
onPreSetImageDrawable(drawable, true)
if (isShown && !isLoaded) {
val layers = arrayOfNulls<Drawable>(2)
layers[0] = ColorDrawable(Color.TRANSPARENT)
layers[1] = drawable
val transitionDrawable = TransitionDrawable(layers)
setImageDrawable(transitionDrawable)
transitionDrawable.startTransition(300)
} else {
setImageDrawable(drawable)
override fun setImageDrawable(drawable: Drawable?) {
var newDrawable = drawable
if (newDrawable != null) {
if (Integer.MIN_VALUE != mOffsetX) {
newDrawable = PreciselyClipDrawable(drawable, mOffsetX, mOffsetY, mClipWidth, mClipHeight)
}
onPreSetImageDrawable(newDrawable, true)
}
super.setImageDrawable(newDrawable)
}
override fun getDrawable(): Drawable? {
var newDrawable = super.getDrawable()
if (newDrawable is PreciselyClipDrawable) {
newDrawable = newDrawable.wrappedDrawable
}
return newDrawable
}
fun onFailure() {
mFailed = true
clearDrawable()
val drawable = ContextCompat.getDrawable(context, R.drawable.image_failed)
onPreSetImageDrawable(drawable, true)
setImageDrawable(drawable)
when (mRetryType) {
RETRY_TYPE_CLICK -> {
setOnClickListener(this)
@@ -200,11 +137,9 @@ open class LoadImageView @JvmOverloads constructor(
}
override fun onClick(v: View) {
reload()
}
override fun onLongClick(v: View): Boolean {
reload()
return true
}