@@ -10,6 +10,7 @@ import android.util.AttributeSet
1010import androidx.core.content.withStyledAttributes
1111import androidx.core.graphics.drawable.toBitmap
1212import coil.Coil
13+ import coil.request.CachePolicy
1314import coil.request.ImageRequest
1415import com.ae.imageharamblur.R
1516import com.ae.imageharamblur.utils.StackBlur
@@ -35,7 +36,7 @@ class ImageViewFilter @JvmOverloads constructor(
3536 var imageModel: Any? = null
3637 set(value) {
3738 field = value
38- value?. let { loadImage(it) }
39+ loadImage(value)
3940 }
4041
4142 var onModerationResult: ((Boolean ) -> Unit )? = null
@@ -57,27 +58,73 @@ class ImageViewFilter @JvmOverloads constructor(
5758 }
5859 }
5960
60- private fun loadImage (model : Any ) {
61+ private var currentImageModel: Any? = null
62+
63+ private fun loadImage (model : Any? ) {
6164 moderationJob?.cancel()
6265
66+ if (model == null ) {
67+ currentImageModel = null
68+ // Center the placeholder and make it smaller
69+ scaleType = ScaleType .CENTER
70+ setImageResource(R .drawable.place_holder)
71+ return
72+ }
73+
74+ val key = model.toString()
75+ if (currentImageModel == model) return
76+ currentImageModel = model
77+
78+ // Reset to normal for real images
79+ scaleType = ScaleType .CENTER_CROP
80+
81+ // Check cache first
82+ ModerationCacheManager .get(key)?.let { cachedState ->
83+ cachedState.blurredBitmap?.let { blurred ->
84+ setImageBitmap(blurred)
85+ onModerationResult?.invoke(true )
86+ return
87+ }
88+ cachedState.originalBitmap?.let { original ->
89+ setImageBitmap(original)
90+ onModerationResult?.invoke(false )
91+ return
92+ }
93+ }
94+
95+ setImageResource(R .drawable.loading)
96+
97+ // Coil loading
6398 Coil .imageLoader(context).enqueue(
6499 ImageRequest .Builder (context)
65100 .data(model)
66- .placeholder(R .drawable.place_holder)
67- .error(R .drawable.place_holder)
68- .target { drawable ->
69- if (config.forceBlur) {
70- applyBlur(drawable)
71- onModerationResult?.invoke(true )
72- } else if (config.enableModeration) {
73- moderationJob = coroutineScope.launch(Dispatchers .Default ) {
74- processModeration(drawable)
101+ .diskCachePolicy(CachePolicy .ENABLED )
102+ .memoryCachePolicy(CachePolicy .ENABLED )
103+ .crossfade(true )
104+ .target(
105+ onStart = { placeholder ->
106+ scaleType = ScaleType .CENTER // small placeholder
107+ setImageDrawable(placeholder ? : context.getDrawable(R .drawable.loading))
108+ },
109+ onSuccess = { drawable ->
110+ scaleType = ScaleType .CENTER_CROP // real image
111+ if (config.forceBlur) {
112+ applyBlur(drawable)
113+ onModerationResult?.invoke(true )
114+ } else if (config.enableModeration) {
115+ moderationJob = coroutineScope.launch(Dispatchers .Default ) {
116+ processModeration(drawable)
117+ }
118+ } else {
119+ setImageDrawable(drawable)
120+ onModerationResult?.invoke(false )
75121 }
76- } else {
77- setImageDrawable(drawable)
78- onModerationResult?.invoke(false )
122+ },
123+ onError = {
124+ scaleType = ScaleType .CENTER
125+ setImageResource(R .drawable.place_holder)
79126 }
80- }
127+ )
81128 .build()
82129 )
83130 }
0 commit comments