LocationPin : disable hardware rendering if needed

This commit is contained in:
ganfra 2026-03-05 18:03:29 +01:00
parent 785587911b
commit 5f16a5658b
3 changed files with 24 additions and 6 deletions

View file

@ -182,7 +182,11 @@ private fun LocationPinMarkerLayer(
@Composable @Composable
private fun rememberLocationPinImage(variant: PinVariant): ImageBitmap { private fun rememberLocationPinImage(variant: PinVariant): ImageBitmap {
val bitmap = rememberMarkerBitmap(variant) { val bitmap = rememberMarkerBitmap(variant) {
LocationPin(variant = variant) LocationPin(
variant = variant,
// Disable as it doesn't work with the rememberMarkerBitmap method
allowHardwareBitmapRendering = false
)
} }
return bitmap.asImageBitmap() return bitmap.asImageBitmap()
} }

View file

@ -25,12 +25,13 @@ import androidx.compose.ui.graphics.drawscope.DrawScope
import androidx.compose.ui.graphics.drawscope.Fill import androidx.compose.ui.graphics.drawscope.Fill
import androidx.compose.ui.graphics.drawscope.Stroke import androidx.compose.ui.graphics.drawscope.Stroke
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import coil3.request.allowHardware
import io.element.android.compound.theme.ElementTheme import io.element.android.compound.theme.ElementTheme
import io.element.android.libraries.designsystem.components.avatar.Avatar
import io.element.android.libraries.designsystem.components.avatar.AvatarData import io.element.android.libraries.designsystem.components.avatar.AvatarData
import io.element.android.libraries.designsystem.components.avatar.AvatarSize import io.element.android.libraries.designsystem.components.avatar.AvatarSize
import io.element.android.libraries.designsystem.components.avatar.AvatarType import io.element.android.libraries.designsystem.components.avatar.AvatarType
import io.element.android.libraries.designsystem.components.avatar.avatarShape import io.element.android.libraries.designsystem.components.avatar.avatarShape
import io.element.android.libraries.designsystem.components.avatar.internal.ImageAvatar
import io.element.android.libraries.designsystem.preview.ElementPreview import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight import io.element.android.libraries.designsystem.preview.PreviewsDayNight
@ -61,6 +62,7 @@ private val CONTENT_OFFSET = 5.dp
fun LocationPin( fun LocationPin(
variant: PinVariant, variant: PinVariant,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
allowHardwareBitmapRendering: Boolean = true,
) { ) {
val colors = LocationPinColors.fromVariant(variant) val colors = LocationPinColors.fromVariant(variant)
Box( Box(
@ -80,12 +82,16 @@ fun LocationPin(
when (variant) { when (variant) {
is PinVariant.UserLocation -> { is PinVariant.UserLocation -> {
Avatar( val avatarShape = AvatarType.User.avatarShape()
ImageAvatar(
avatarData = variant.avatarData, avatarData = variant.avatarData,
forcedAvatarSize = avatarSize, forcedAvatarSize = avatarSize,
avatarType = AvatarType.User, avatarShape = avatarShape,
modifier = contentModifier modifier = contentModifier
.border(width = 1.dp, color = colors.avatarStoke, shape = AvatarType.User.avatarShape()), .border(width = 1.dp, color = colors.avatarStoke, shape = avatarShape),
configureRequest = { builder ->
builder.allowHardware(allowHardwareBitmapRendering)
}
) )
} }
PinVariant.PinnedLocation, PinVariant.StaleLocation -> { PinVariant.PinnedLocation, PinVariant.StaleLocation -> {

View file

@ -17,10 +17,12 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Shape import androidx.compose.ui.graphics.Shape
import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.Dp
import coil3.compose.AsyncImagePainter import coil3.compose.AsyncImagePainter
import coil3.compose.SubcomposeAsyncImage import coil3.compose.SubcomposeAsyncImage
import coil3.compose.SubcomposeAsyncImageContent import coil3.compose.SubcomposeAsyncImageContent
import coil3.request.ImageRequest
import io.element.android.libraries.designsystem.components.avatar.AvatarData import io.element.android.libraries.designsystem.components.avatar.AvatarData
import timber.log.Timber import timber.log.Timber
@ -31,10 +33,16 @@ internal fun ImageAvatar(
forcedAvatarSize: Dp?, forcedAvatarSize: Dp?,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
contentDescription: String? = null, contentDescription: String? = null,
configureRequest: (ImageRequest.Builder) -> ImageRequest.Builder = { it },
) { ) {
val size = forcedAvatarSize ?: avatarData.size.dp val size = forcedAvatarSize ?: avatarData.size.dp
val request = ImageRequest.Builder(LocalContext.current)
.data(avatarData)
.let(configureRequest)
.build()
SubcomposeAsyncImage( SubcomposeAsyncImage(
model = avatarData, model = request,
contentDescription = contentDescription, contentDescription = contentDescription,
contentScale = ContentScale.Crop, contentScale = ContentScale.Crop,
modifier = modifier modifier = modifier