diff --git a/app/src/main/java/com/keylesspalace/tusky/util/GlideExtensions.kt b/app/src/main/java/com/keylesspalace/tusky/util/GlideExtensions.kt index 01629c7314..a328a8e7cd 100644 --- a/app/src/main/java/com/keylesspalace/tusky/util/GlideExtensions.kt +++ b/app/src/main/java/com/keylesspalace/tusky/util/GlideExtensions.kt @@ -5,6 +5,7 @@ import com.bumptech.glide.load.DataSource import com.bumptech.glide.load.engine.GlideException import com.bumptech.glide.request.RequestListener import com.bumptech.glide.request.target.Target +import kotlin.coroutines.Continuation import kotlin.coroutines.resume import kotlin.coroutines.resumeWithException import kotlinx.coroutines.suspendCancellableCoroutine @@ -17,32 +18,41 @@ suspend fun RequestBuilder.submitAsync( height: Int = Target.SIZE_ORIGINAL ): R { return suspendCancellableCoroutine { continuation -> - val target = addListener( - object : RequestListener { - override fun onLoadFailed( - e: GlideException?, - model: Any?, - target: Target, - isFirstResource: Boolean - ): Boolean { - continuation.resumeWithException(e ?: GlideException("Image loading failed")) - return false - } + val target = addListener(ContinuationRequestListener(continuation)) + .submit(width, height) + continuation.invokeOnCancellation { target.cancel(true) } + } +} + +private class ContinuationRequestListener(continuation: Continuation) : RequestListener { + private var continuation: Continuation? = continuation - override fun onResourceReady( - resource: R & Any, - model: Any, - target: Target?, - dataSource: DataSource, - isFirstResource: Boolean - ): Boolean { - if (target?.request?.isComplete == true) { - continuation.resume(resource) - } - return false - } + override fun onLoadFailed( + e: GlideException?, + model: Any?, + target: Target, + isFirstResource: Boolean + ): Boolean { + continuation?.let { + continuation = null + it.resumeWithException(e ?: GlideException("Image loading failed")) + } + return false + } + + override fun onResourceReady( + resource: R & Any, + model: Any, + target: Target?, + dataSource: DataSource, + isFirstResource: Boolean + ): Boolean { + continuation?.let { + if (target?.request?.isComplete == true) { + continuation = null + it.resume(resource) } - ).submit(width, height) - continuation.invokeOnCancellation { target.cancel(true) } + } + return false } }