Adapt location feature to maplibre.compose 0.18.0 API

This commit is contained in:
ganfra
2026-10-06 15:45:40 +02:00
parent 125c38c4d2
commit 604c5438c6
4 changed files with 19 additions and 22 deletions
@@ -140,7 +140,7 @@ fun MapBottomSheetScaffold(
isReady && mapState != null -> {
MaplibreMap(
state = mapState,
cameraPadding = sheetPadding,
viewportInsets = sheetPadding,
renderOptions = renderOptions,
interactions = interactions,
uiOptions = uiOptions,
@@ -8,33 +8,28 @@
package io.element.android.features.location.impl.common.ui
import androidx.compose.runtime.Composable
import androidx.compose.ui.unit.dp
import io.element.android.compound.theme.ElementTheme
import org.maplibre.compose.layers.LocationIndicatorDefaults
import org.maplibre.compose.layers.LocationIndicatorLayer
import org.maplibre.compose.location.LocationMeasurement
import org.maplibre.compose.location.LocationPuck
import org.maplibre.compose.location.LocationPuckColors
import org.maplibre.compose.location.LocationPuckSizes
import org.maplibre.spatialk.units.Length
@Composable
fun UserLocationPuck(
location: LocationMeasurement?,
) {
LocationPuck(
idPrefix = "user-location",
location = location,
// Hide the accuracy circle.
accuracyThreshold = Length.PositiveInfinity,
// Hide the bearing (and bearing accuracy) indicator.
LocationIndicatorLayer(
id = "user-location",
location = location?.position,
// Hide the accuracy circle and the bearing accuracy sector: leaving `accuracyRadius`
// and `bearingAccuracy` null is what hides them.
accuracyRadius = null,
bearingAccuracy = null,
// Hide the bearing indicator.
bearing = null,
sizes = LocationPuckSizes(
dotRadius = 8.dp,
dotStrokeWidth = 2.dp,
bearingImage = null,
topImage = LocationIndicatorDefaults.topImage(
color = ElementTheme.colors.iconAccentPrimary,
borderColor = ElementTheme.colors.bgCanvasDefault,
),
colors = LocationPuckColors(
dotFillColorCurrentLocation = ElementTheme.colors.iconAccentPrimary,
dotFillColorOldLocation = ElementTheme.colors.iconAccentTertiary,
dotStrokeColor = ElementTheme.colors.bgCanvasDefault,
)
)
}
@@ -17,6 +17,7 @@ import androidx.compose.runtime.setValue
import androidx.compose.runtime.snapshotFlow
import io.element.android.features.location.impl.common.MapDefaults
import kotlinx.coroutines.flow.distinctUntilChanged
import org.maplibre.compose.camera.CameraAnimation
import org.maplibre.compose.location.LocationMeasurement
import org.maplibre.compose.map.MapState
import kotlin.math.abs
@@ -77,7 +78,7 @@ internal fun UserLocationTrackingEffect(
zoom = mapState.cameraPosition.zoom.coerceAtLeast(MapDefaults.DEFAULT_ZOOM)
)
if (hasPositioned) {
mapState.animateCameraPosition(position)
mapState.animateCamera(position.toCameraUpdate(), CameraAnimation.Fly())
} else {
mapState.setCameraPosition(position)
hasPositioned = true
@@ -54,6 +54,7 @@ import io.element.android.libraries.designsystem.theme.components.TopAppBar
import io.element.android.libraries.ui.strings.CommonStrings
import kotlinx.collections.immutable.toImmutableList
import kotlinx.coroutines.launch
import org.maplibre.compose.camera.CameraAnimation
import org.maplibre.compose.camera.CameraMoveReason
import org.maplibre.compose.camera.CameraPosition
import org.maplibre.compose.map.MapState
@@ -149,7 +150,7 @@ private fun ShowLocationViewContent(
zoom = mapState.cameraPosition.zoom.coerceAtLeast(MapDefaults.DEFAULT_ZOOM),
)
coroutineScope.launch {
mapState.animateCameraPosition(position = position)
mapState.animateCamera(update = position.toCameraUpdate(), animation = CameraAnimation.Fly())
}
},
modifier = modifier,