From 86026a4bfaeb6de129eb04ae82a190c947487e1d Mon Sep 17 00:00:00 2001 From: josh Date: Wed, 9 Apr 2025 15:43:43 -0500 Subject: [PATCH] fix: decode bitmaps off main thread in ImageElement --- .../ui/internal/ui/element/ImageElement.kt | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/adapty-ui/src/main/java/com/adapty/ui/internal/ui/element/ImageElement.kt b/adapty-ui/src/main/java/com/adapty/ui/internal/ui/element/ImageElement.kt index a79550b..4408870 100644 --- a/adapty-ui/src/main/java/com/adapty/ui/internal/ui/element/ImageElement.kt +++ b/adapty-ui/src/main/java/com/adapty/ui/internal/ui/element/ImageElement.kt @@ -6,9 +6,12 @@ import androidx.compose.foundation.layout.BoxWithConstraints import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.produceState import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.ColorFilter +import androidx.compose.ui.graphics.ImageBitmap import androidx.compose.ui.graphics.asImageBitmap import com.adapty.internal.utils.InternalAdaptyApi import com.adapty.ui.AdaptyUI.LocalizedViewConfiguration.Asset @@ -22,6 +25,8 @@ import com.adapty.ui.internal.ui.attributes.toComposeFill import com.adapty.ui.internal.utils.EventCallback import com.adapty.ui.internal.utils.getBitmap import com.adapty.ui.internal.utils.getForCurrentSystemTheme +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext @InternalAdaptyApi public class ImageElement internal constructor( @@ -53,14 +58,17 @@ public class ImageElement internal constructor( } val image = resolveAssets().getForCurrentSystemTheme(assetId) as? Asset.Image BoxWithConstraints { - val imageBitmap = remember(constraints.maxWidth, constraints.maxHeight, image?.source?.javaClass, isSystemInDarkTheme) { - image?.let { - getBitmap(image, constraints.maxWidth, constraints.maxHeight, if (aspectRatio == AspectRatio.FIT) ScaleType.FIT_MIN else ScaleType.FIT_MAX) - ?.asImageBitmap() + val imageBitmapState by produceState(null, constraints.maxWidth, constraints.maxHeight, image?.source?.javaClass, isSystemInDarkTheme) { + value = withContext(Dispatchers.Default) { + image?.let { + getBitmap(image, constraints.maxWidth, constraints.maxHeight, + if (aspectRatio == AspectRatio.FIT) ScaleType.FIT_MIN else ScaleType.FIT_MAX + )?.asImageBitmap() + } } } - if (imageBitmap == null) return@BoxWithConstraints + val imageBitmap = imageBitmapState ?: return@BoxWithConstraints Image( bitmap = imageBitmap,