From 52084764b792fff97ceb8943cd43c40859b0a328 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Boro=C5=84?= Date: Fri, 10 Oct 2025 15:16:41 +0200 Subject: [PATCH 1/2] Move image loader logic to TabsImageLoader --- .../gamma/tabs/TabScreenViewManager.kt | 12 +---------- .../gamma/tabs/image/TabsImageLoader.kt | 20 +++++++++++++++++++ 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/TabScreenViewManager.kt b/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/TabScreenViewManager.kt index 6b27eb3a88..6ce717d342 100644 --- a/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/TabScreenViewManager.kt +++ b/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/TabScreenViewManager.kt @@ -1,7 +1,5 @@ package com.swmansion.rnscreens.gamma.tabs -import android.os.Handler -import android.os.Looper import com.facebook.react.bridge.Dynamic import com.facebook.react.bridge.ReadableMap import com.facebook.react.module.annotations.ReactModule @@ -194,15 +192,7 @@ class TabScreenViewManager : ) { val uri = value?.getString("uri") if (uri != null) { - val context = view.context - loadTabImage(context, uri) { drawable -> - // Since image loading might happen on a background thread - // ref. https://frescolib.org/docs/intro-image-pipeline.html - // We should schedule rendering the result on the UI thread - Handler(Looper.getMainLooper()).post { - view.icon = drawable - } - } + loadTabImage(view.context, uri, view) } } diff --git a/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/image/TabsImageLoader.kt b/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/image/TabsImageLoader.kt index 3aebea1f5c..66c7fef58f 100644 --- a/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/image/TabsImageLoader.kt +++ b/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/image/TabsImageLoader.kt @@ -2,6 +2,8 @@ package com.swmansion.rnscreens.gamma.tabs.image import android.content.Context import android.graphics.drawable.Drawable +import android.os.Handler +import android.os.Looper import android.util.Log import androidx.core.graphics.drawable.toDrawable import androidx.core.net.toUri @@ -13,8 +15,26 @@ import com.facebook.drawee.backends.pipeline.Fresco import com.facebook.imagepipeline.image.CloseableImage import com.facebook.imagepipeline.image.CloseableStaticBitmap import com.facebook.imagepipeline.request.ImageRequestBuilder +import com.swmansion.rnscreens.gamma.tabs.TabScreen internal fun loadTabImage( + context: Context, + uri: String, + view: TabScreen, + onIconLoaded: ((Drawable?) -> Unit)? = null, +) { + // Since image loading might happen on a background thread + // ref. https://frescolib.org/docs/intro-image-pipeline.html + // We should schedule rendering the result on the UI thread + loadTabImageInternal(context, uri) { drawable -> + Handler(Looper.getMainLooper()).post { + view.icon = drawable + onIconLoaded?.invoke(drawable) + } + } +} + +private fun loadTabImageInternal( context: Context, uri: String, onLoaded: (Drawable) -> Unit, From 1c00b2a8eb90793e3606c374483d3a821501df67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Boro=C5=84?= Date: Fri, 10 Oct 2025 15:20:36 +0200 Subject: [PATCH 2/2] Remove extra callback --- .../com/swmansion/rnscreens/gamma/tabs/image/TabsImageLoader.kt | 2 -- 1 file changed, 2 deletions(-) diff --git a/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/image/TabsImageLoader.kt b/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/image/TabsImageLoader.kt index 66c7fef58f..2676a21f3b 100644 --- a/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/image/TabsImageLoader.kt +++ b/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/image/TabsImageLoader.kt @@ -21,7 +21,6 @@ internal fun loadTabImage( context: Context, uri: String, view: TabScreen, - onIconLoaded: ((Drawable?) -> Unit)? = null, ) { // Since image loading might happen on a background thread // ref. https://frescolib.org/docs/intro-image-pipeline.html @@ -29,7 +28,6 @@ internal fun loadTabImage( loadTabImageInternal(context, uri) { drawable -> Handler(Looper.getMainLooper()).post { view.icon = drawable - onIconLoaded?.invoke(drawable) } } }