@@ -3,11 +3,16 @@ package com.omega_r.libs.omegatypes.image
33import android.content.Context
44import android.graphics.Bitmap
55import android.graphics.drawable.Drawable
6+ import android.util.Log
67import android.view.View
78import android.widget.ImageView
89import com.bumptech.glide.Glide
910import com.bumptech.glide.RequestBuilder
11+ import com.bumptech.glide.load.DataSource
12+ import com.bumptech.glide.load.engine.GlideException
13+ import com.bumptech.glide.request.RequestListener
1014import com.bumptech.glide.request.target.CustomViewTarget
15+ import com.bumptech.glide.request.target.Target
1116import com.bumptech.glide.request.transition.Transition
1217import com.omega_r.libs.omegatypes.decoders.BitmapDecoders
1318import com.omega_r.libs.omegatypes.decoders.SimpleBitmapDecoders
@@ -18,8 +23,8 @@ import kotlin.reflect.KClass
1823/* *
1924 * Created by Anton Knyazev on 2019-10-03.
2025 */
21- class GlideImagesProcessor (
22- private val oldImagesProcessor : ImageProcessors ,
26+ open class GlideImagesProcessor (
27+ protected val oldImagesProcessor : ImageProcessors ,
2328 vararg excludeImageClasses : KClass <out Image >
2429) : ImageProcessors() {
2530
@@ -37,7 +42,7 @@ class GlideImagesProcessor(
3742
3843 private val excludeImageClasses = listOf (* excludeImageClasses)
3944
40- private fun <T > RequestBuilder<T>.createRequestBuilder (image : Image ): RequestBuilder <T >? {
45+ protected fun <T > RequestBuilder<T>.createRequestBuilder (image : Image ): RequestBuilder <T >? {
4146 if (excludeImageClasses.contains(image::class )) {
4247 return null
4348 }
@@ -53,11 +58,12 @@ class GlideImagesProcessor(
5358 }
5459 }
5560
56- override fun Image.applyImage (imageView : ImageView , placeholderResId : Int ) {
61+ override fun Image.applyImage (imageView : ImageView , placeholderResId : Int , onImageApplied : (() -> Unit ) ? ) {
5762 Glide .with (imageView)
5863 .asDrawable()
5964 .createRequestBuilder(this )
6065 ?.applyPlaceholder(placeholderResId)
66+ ?.listener(GlideImageRequestListener (onImageApplied))
6167 ?.into(imageView)
6268 ? : applyOld { applyImage(imageView, placeholderResId) }
6369 }
@@ -110,11 +116,45 @@ class GlideImagesProcessor(
110116 ? : applyOld { preload(context) }
111117 }
112118
113- private fun <T > RequestBuilder<T>.applyPlaceholder (placeholderResId : Int ): RequestBuilder <T > {
119+ protected fun <T > RequestBuilder<T>.applyPlaceholder (placeholderResId : Int ): RequestBuilder <T > {
114120 return if (placeholderResId != NO_PLACEHOLDER_RES ) placeholder(placeholderResId) else this
115121 }
116122
117- private inline fun <R > applyOld (block : ImageProcessors .() -> R ): R {
123+ protected inline fun <R > applyOld (block : ImageProcessors .() -> R ): R {
118124 return block(oldImagesProcessor)
119125 }
126+ }
127+
128+ class GlideImageRequestListener (private val onImageLoaded : (() -> Unit )? ) : RequestListener<Drawable> {
129+
130+ companion object {
131+ private val TAG = GlideImageRequestListener ::class .java.name
132+ }
133+
134+ override fun onLoadFailed (
135+ e : GlideException ? ,
136+ model : Any? ,
137+ target : Target <Drawable >? ,
138+ isFirstResource : Boolean
139+ ): Boolean {
140+ Log .e(TAG , " Image load failed: " , e)
141+ if (isFirstResource) {
142+ onImageLoaded?.invoke()
143+ }
144+ return false
145+ }
146+
147+ override fun onResourceReady (
148+ resource : Drawable ,
149+ model : Any? ,
150+ target : Target <Drawable >,
151+ dataSource : DataSource ,
152+ isFirstResource : Boolean
153+ ): Boolean {
154+ target.onResourceReady(resource, null )
155+ if (isFirstResource) {
156+ onImageLoaded?.invoke()
157+ }
158+ return true
159+ }
120160}
0 commit comments