From 02ed644097226541d2ad73cad7bd4df49194b6e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Artur=20G=C4=99siarz?= <126520293+arturgesiarz@users.noreply.github.com> Date: Wed, 4 Feb 2026 12:43:18 +0100 Subject: [PATCH 1/6] fix: Change marker state and add onMarkerDragEnd callback --- .../com/swmansion/kmpmaps/core/Extensions.kt | 14 ++++----- .../kotlin/com/swmansion/kmpmaps/core/Map.kt | 29 ++++++++++++++++--- .../swmansion/kmpmaps/core/AndroidMapTypes.kt | 3 ++ .../kotlin/com/swmansion/kmpmaps/core/Map.kt | 6 ++-- .../kotlin/com/swmansion/kmpmaps/core/Map.kt | 1 + .../kotlin/com/swmansion/kmpmaps/core/Map.kt | 1 + .../com/swmansion/kmpmaps/googlemaps/Map.kt | 2 ++ .../com/swmansion/kmpmaps/googlemaps/Map.kt | 2 ++ .../com/swmansion/kmpmaps/googlemaps/Map.kt | 1 + .../com/swmansion/kmpmaps/googlemaps/Map.kt | 2 ++ .../swmansion/kmpmaps/sample/MapWrapper.kt | 3 ++ 11 files changed, 50 insertions(+), 14 deletions(-) diff --git a/kmp-maps/core/src/androidMain/kotlin/com/swmansion/kmpmaps/core/Extensions.kt b/kmp-maps/core/src/androidMain/kotlin/com/swmansion/kmpmaps/core/Extensions.kt index 45961d30..689f9e90 100644 --- a/kmp-maps/core/src/androidMain/kotlin/com/swmansion/kmpmaps/core/Extensions.kt +++ b/kmp-maps/core/src/androidMain/kotlin/com/swmansion/kmpmaps/core/Extensions.kt @@ -22,7 +22,6 @@ import com.google.maps.android.compose.ComposeMapColorScheme import com.google.maps.android.compose.MapProperties as GoogleMapProperties import com.google.maps.android.compose.MapType import com.google.maps.android.compose.MapUiSettings as GoogleMapUiSettings -import com.google.maps.android.compose.MarkerState import com.google.maps.android.data.geojson.GeoJsonFeature import com.google.maps.android.data.geojson.GeoJsonLayer as GoogleGeoJsonLayer import com.google.maps.android.data.geojson.GeoJsonLineString @@ -61,19 +60,18 @@ internal fun GoogleCameraPosition.toCameraPosition() = ) /** - * Converts MapMarker to Google Maps MarkerState. + * Converts Coordinates to Google Maps LatLng. * - * @return MarkerState with position coordinates + * @return LatLng with latitude and longitude */ -internal fun Marker.toGoogleMapsMarkerState() = - MarkerState(position = LatLng(coordinates.latitude, coordinates.longitude)) +internal fun Coordinates.toGoogleMapsLatLng(): LatLng = LatLng(latitude, longitude) /** - * Converts Coordinates to Google Maps LatLng. + * Converts Google Maps LatLng back to [Coordinates]. * - * @return LatLng with latitude and longitude + * @return Coordinates with latitude and longitude */ -internal fun Coordinates.toGoogleMapsLatLng(): LatLng = LatLng(latitude, longitude) +internal fun LatLng.toCoordinates() = Coordinates(latitude, longitude) /** * Converts MapTheme to native ComposeMapColorScheme. diff --git a/kmp-maps/core/src/androidMain/kotlin/com/swmansion/kmpmaps/core/Map.kt b/kmp-maps/core/src/androidMain/kotlin/com/swmansion/kmpmaps/core/Map.kt index 2a7a6d10..771a748e 100644 --- a/kmp-maps/core/src/androidMain/kotlin/com/swmansion/kmpmaps/core/Map.kt +++ b/kmp-maps/core/src/androidMain/kotlin/com/swmansion/kmpmaps/core/Map.kt @@ -24,6 +24,7 @@ import com.google.maps.android.compose.MapEffect import com.google.maps.android.compose.MapsComposeExperimentalApi import com.google.maps.android.compose.Marker import com.google.maps.android.compose.MarkerComposable +import com.google.maps.android.compose.MarkerState import com.google.maps.android.compose.Polygon import com.google.maps.android.compose.Polyline import com.google.maps.android.compose.clustering.Clustering @@ -46,6 +47,7 @@ public actual fun Map( polylines: List, onCameraMove: ((CameraPosition) -> Unit)?, onMarkerClick: ((Marker) -> Unit)?, + onMarkerDragEnd: ((Marker, Coordinates) -> Unit)?, onCircleClick: ((Circle) -> Unit)?, onPolygonClick: ((Polygon) -> Unit)?, onPolylineClick: ((Polyline) -> Unit)?, @@ -173,32 +175,51 @@ public actual fun Map( } else { markers.forEach { marker -> key(marker.getId(), marker.contentId) { + val markerState = + remember(marker.getId()) { + MarkerState(marker.coordinates.toGoogleMapsLatLng()) + } val content = customMarkerContent[marker.contentId] + if (marker.androidMarkerOptions.draggable) { + LaunchedEffect(markerState.isDragging) { + if (!markerState.isDragging) { + onMarkerDragEnd?.invoke( + marker, + markerState.position.toCoordinates(), + ) + } + } + } + if (content != null) { MarkerComposable( - state = marker.toGoogleMapsMarkerState(), + state = markerState, title = marker.title, anchor = marker.androidMarkerOptions.anchor.toOffset(), draggable = marker.androidMarkerOptions.draggable, snippet = marker.androidMarkerOptions.snippet, zIndex = marker.androidMarkerOptions.zIndex ?: 0.0f, onClick = { - onMarkerClick?.invoke(marker) + onMarkerClick?.invoke( + marker.copy(coordinates = markerState.position.toCoordinates()) + ) onMarkerClick == null }, content = { content(marker) }, ) } else { Marker( - state = marker.toGoogleMapsMarkerState(), + state = markerState, title = marker.title, anchor = marker.androidMarkerOptions.anchor.toOffset(), draggable = marker.androidMarkerOptions.draggable, snippet = marker.androidMarkerOptions.snippet, zIndex = marker.androidMarkerOptions.zIndex ?: 0.0f, onClick = { - onMarkerClick?.invoke(marker) + onMarkerClick?.invoke( + marker.copy(coordinates = markerState.position.toCoordinates()) + ) onMarkerClick == null }, ) diff --git a/kmp-maps/core/src/commonMain/kotlin/com/swmansion/kmpmaps/core/AndroidMapTypes.kt b/kmp-maps/core/src/commonMain/kotlin/com/swmansion/kmpmaps/core/AndroidMapTypes.kt index 79d04550..d931a94e 100644 --- a/kmp-maps/core/src/commonMain/kotlin/com/swmansion/kmpmaps/core/AndroidMapTypes.kt +++ b/kmp-maps/core/src/commonMain/kotlin/com/swmansion/kmpmaps/core/AndroidMapTypes.kt @@ -41,6 +41,9 @@ public data class AndroidUISettings( * @property draggable Whether the marker can be dragged by the user * @property snippet Additional text displayed below the title * @property zIndex The z-index for layering markers + * + * Note: In the current Android implementation, draggability is only supported when + * [ClusterSettings.enabled] is set to `false`. */ @Serializable public data class AndroidMarkerOptions( diff --git a/kmp-maps/core/src/commonMain/kotlin/com/swmansion/kmpmaps/core/Map.kt b/kmp-maps/core/src/commonMain/kotlin/com/swmansion/kmpmaps/core/Map.kt index c9b33074..4b91d933 100644 --- a/kmp-maps/core/src/commonMain/kotlin/com/swmansion/kmpmaps/core/Map.kt +++ b/kmp-maps/core/src/commonMain/kotlin/com/swmansion/kmpmaps/core/Map.kt @@ -95,6 +95,7 @@ import androidx.compose.ui.Modifier * @param polylines List of polylines to display on the map * @param onCameraMove Callback invoked when the map camera position changes due to user interaction * @param onMarkerClick Callback invoked when a marker is clicked + * @param onMarkerDragEnd Callback invoked when a marker is dragged * @param onCircleClick Callback invoked when a circle is clicked * @param onPolygonClick Callback invoked when a polygon is clicked * @param onPolylineClick Callback invoked when a polyline is clicked @@ -103,8 +104,8 @@ import androidx.compose.ui.Modifier * @param onPOIClick Callback invoked when the user clicks on a Point of Interest * @param onMapLoaded Callback invoked when the map has finished loading * @param geoJsonLayers List of GeoJSON layers to display on the map - * @param customMarkerContent Map of content IDs to Composable functions for custom marker content. - * @param webCustomMarkerContent Map of content IDs to a function returning an HTML string. + * @param customMarkerContent Map of content IDs to Composable functions for custom marker content + * @param webCustomMarkerContent Map of content IDs to a function returning an HTML string */ @Composable public expect fun Map( @@ -119,6 +120,7 @@ public expect fun Map( polylines: List = emptyList(), onCameraMove: ((CameraPosition) -> Unit)? = null, onMarkerClick: ((Marker) -> Unit)? = null, + onMarkerDragEnd: ((Marker, Coordinates) -> Unit)? = null, onCircleClick: ((Circle) -> Unit)? = null, onPolygonClick: ((Polygon) -> Unit)? = null, onPolylineClick: ((Polyline) -> Unit)? = null, diff --git a/kmp-maps/core/src/iosMain/kotlin/com/swmansion/kmpmaps/core/Map.kt b/kmp-maps/core/src/iosMain/kotlin/com/swmansion/kmpmaps/core/Map.kt index e94a4938..00e1fa8d 100644 --- a/kmp-maps/core/src/iosMain/kotlin/com/swmansion/kmpmaps/core/Map.kt +++ b/kmp-maps/core/src/iosMain/kotlin/com/swmansion/kmpmaps/core/Map.kt @@ -41,6 +41,7 @@ public actual fun Map( polylines: List, onCameraMove: ((CameraPosition) -> Unit)?, onMarkerClick: ((Marker) -> Unit)?, + onMarkerDragEnd: ((Marker, Coordinates) -> Unit)?, onCircleClick: ((Circle) -> Unit)?, onPolygonClick: ((Polygon) -> Unit)?, onPolylineClick: ((Polyline) -> Unit)?, diff --git a/kmp-maps/core/src/jvmMain/kotlin/com/swmansion/kmpmaps/core/Map.kt b/kmp-maps/core/src/jvmMain/kotlin/com/swmansion/kmpmaps/core/Map.kt index 09077692..25ad3d47 100644 --- a/kmp-maps/core/src/jvmMain/kotlin/com/swmansion/kmpmaps/core/Map.kt +++ b/kmp-maps/core/src/jvmMain/kotlin/com/swmansion/kmpmaps/core/Map.kt @@ -30,6 +30,7 @@ public actual fun Map( polylines: List, onCameraMove: ((CameraPosition) -> Unit)?, onMarkerClick: ((Marker) -> Unit)?, + onMarkerDragEnd: ((Marker, Coordinates) -> Unit)?, onCircleClick: ((Circle) -> Unit)?, onPolygonClick: ((Polygon) -> Unit)?, onPolylineClick: ((Polyline) -> Unit)?, diff --git a/kmp-maps/google-maps/src/androidMain/kotlin/com/swmansion/kmpmaps/googlemaps/Map.kt b/kmp-maps/google-maps/src/androidMain/kotlin/com/swmansion/kmpmaps/googlemaps/Map.kt index 1482efb3..9b57539b 100644 --- a/kmp-maps/google-maps/src/androidMain/kotlin/com/swmansion/kmpmaps/googlemaps/Map.kt +++ b/kmp-maps/google-maps/src/androidMain/kotlin/com/swmansion/kmpmaps/googlemaps/Map.kt @@ -28,6 +28,7 @@ public actual fun Map( polylines: List, onCameraMove: ((CameraPosition) -> Unit)?, onMarkerClick: ((Marker) -> Unit)?, + onMarkerDragEnd: ((Marker, Coordinates) -> Unit)?, onCircleClick: ((Circle) -> Unit)?, onPolygonClick: ((Polygon) -> Unit)?, onPolylineClick: ((Polyline) -> Unit)?, @@ -51,6 +52,7 @@ public actual fun Map( polylines, onCameraMove, onMarkerClick, + onMarkerDragEnd, onCircleClick, onPolygonClick, onPolylineClick, diff --git a/kmp-maps/google-maps/src/commonMain/kotlin/com/swmansion/kmpmaps/googlemaps/Map.kt b/kmp-maps/google-maps/src/commonMain/kotlin/com/swmansion/kmpmaps/googlemaps/Map.kt index 3f041c51..8d2107fa 100644 --- a/kmp-maps/google-maps/src/commonMain/kotlin/com/swmansion/kmpmaps/googlemaps/Map.kt +++ b/kmp-maps/google-maps/src/commonMain/kotlin/com/swmansion/kmpmaps/googlemaps/Map.kt @@ -34,6 +34,7 @@ import com.swmansion.kmpmaps.core.Polyline * @param polylines List of polylines to display on the map * @param onCameraMove Callback invoked when the map camera position changes due to user interaction * @param onMarkerClick Callback invoked when a marker is clicked + * @param onMarkerDragEnd Callback invoked when a marker is dragged * @param onCircleClick Callback invoked when a circle is clicked * @param onPolygonClick Callback invoked when a polygon is clicked * @param onPolylineClick Callback invoked when a polyline is clicked @@ -58,6 +59,7 @@ public expect fun Map( polylines: List = emptyList(), onCameraMove: ((CameraPosition) -> Unit)? = null, onMarkerClick: ((Marker) -> Unit)? = null, + onMarkerDragEnd: ((Marker, Coordinates) -> Unit)? = null, onCircleClick: ((Circle) -> Unit)? = null, onPolygonClick: ((Polygon) -> Unit)? = null, onPolylineClick: ((Polyline) -> Unit)? = null, diff --git a/kmp-maps/google-maps/src/iosMain/kotlin/com/swmansion/kmpmaps/googlemaps/Map.kt b/kmp-maps/google-maps/src/iosMain/kotlin/com/swmansion/kmpmaps/googlemaps/Map.kt index d5d30faa..d782de5c 100644 --- a/kmp-maps/google-maps/src/iosMain/kotlin/com/swmansion/kmpmaps/googlemaps/Map.kt +++ b/kmp-maps/google-maps/src/iosMain/kotlin/com/swmansion/kmpmaps/googlemaps/Map.kt @@ -56,6 +56,7 @@ public actual fun Map( polylines: List, onCameraMove: ((CameraPosition) -> Unit)?, onMarkerClick: ((Marker) -> Unit)?, + onMarkerDragEnd: ((Marker, Coordinates) -> Unit)?, onCircleClick: ((Circle) -> Unit)?, onPolygonClick: ((Polygon) -> Unit)?, onPolylineClick: ((Polyline) -> Unit)?, diff --git a/kmp-maps/google-maps/src/jvmMain/kotlin/com/swmansion/kmpmaps/googlemaps/Map.kt b/kmp-maps/google-maps/src/jvmMain/kotlin/com/swmansion/kmpmaps/googlemaps/Map.kt index 49022ea4..5f31bcf5 100644 --- a/kmp-maps/google-maps/src/jvmMain/kotlin/com/swmansion/kmpmaps/googlemaps/Map.kt +++ b/kmp-maps/google-maps/src/jvmMain/kotlin/com/swmansion/kmpmaps/googlemaps/Map.kt @@ -28,6 +28,7 @@ public actual fun Map( polylines: List, onCameraMove: ((CameraPosition) -> Unit)?, onMarkerClick: ((Marker) -> Unit)?, + onMarkerDragEnd: ((Marker, Coordinates) -> Unit)?, onCircleClick: ((Circle) -> Unit)?, onPolygonClick: ((Polygon) -> Unit)?, onPolylineClick: ((Polyline) -> Unit)?, @@ -51,6 +52,7 @@ public actual fun Map( polylines, onCameraMove, onMarkerClick, + onMarkerDragEnd, onCircleClick, onPolygonClick, onPolylineClick, diff --git a/sample/src/commonMain/kotlin/com/swmansion/kmpmaps/sample/MapWrapper.kt b/sample/src/commonMain/kotlin/com/swmansion/kmpmaps/sample/MapWrapper.kt index 761c7414..d195351f 100644 --- a/sample/src/commonMain/kotlin/com/swmansion/kmpmaps/sample/MapWrapper.kt +++ b/sample/src/commonMain/kotlin/com/swmansion/kmpmaps/sample/MapWrapper.kt @@ -118,6 +118,7 @@ private fun Map( polylines: List = emptyList(), onCameraMove: ((CameraPosition) -> Unit)? = null, onMarkerClick: ((Marker) -> Unit)? = null, + onMarkerDragEnd: ((Marker, Coordinates) -> Unit)? = null, onCircleClick: ((Circle) -> Unit)? = null, onPolygonClick: ((Polygon) -> Unit)? = null, onPolylineClick: ((Polyline) -> Unit)? = null, @@ -143,6 +144,7 @@ private fun Map( polylines = polylines, onCameraMove = onCameraMove, onMarkerClick = onMarkerClick, + onMarkerDragEnd = onMarkerDragEnd, onCircleClick = onCircleClick, onPolygonClick = onPolygonClick, onPolylineClick = onPolylineClick, @@ -167,6 +169,7 @@ private fun Map( polylines = polylines, onCameraMove = onCameraMove, onMarkerClick = onMarkerClick, + onMarkerDragEnd = onMarkerDragEnd, onCircleClick = onCircleClick, onPolygonClick = onPolygonClick, onPolylineClick = onPolylineClick, From 0faa86010dd9e04b81a2d1b48f031f8bd77877fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Artur=20G=C4=99siarz?= <126520293+arturgesiarz@users.noreply.github.com> Date: Wed, 4 Feb 2026 15:03:15 +0100 Subject: [PATCH 2/6] Makes coordiantes mutable --- .../kotlin/com/swmansion/kmpmaps/core/Map.kt | 24 ++++++++++--------- .../kotlin/com/swmansion/kmpmaps/core/Map.kt | 4 ++-- .../com/swmansion/kmpmaps/core/MapTypes.kt | 2 +- .../kotlin/com/swmansion/kmpmaps/core/Map.kt | 2 +- .../kotlin/com/swmansion/kmpmaps/core/Map.kt | 2 +- .../com/swmansion/kmpmaps/googlemaps/Map.kt | 2 +- .../com/swmansion/kmpmaps/googlemaps/Map.kt | 4 ++-- .../com/swmansion/kmpmaps/googlemaps/Map.kt | 2 +- .../com/swmansion/kmpmaps/googlemaps/Map.kt | 2 +- .../com/swmansion/kmpmaps/sample/Examples.kt | 3 ++- .../swmansion/kmpmaps/sample/MapWrapper.kt | 10 ++++---- 11 files changed, 31 insertions(+), 26 deletions(-) diff --git a/kmp-maps/core/src/androidMain/kotlin/com/swmansion/kmpmaps/core/Map.kt b/kmp-maps/core/src/androidMain/kotlin/com/swmansion/kmpmaps/core/Map.kt index 771a748e..a536b549 100644 --- a/kmp-maps/core/src/androidMain/kotlin/com/swmansion/kmpmaps/core/Map.kt +++ b/kmp-maps/core/src/androidMain/kotlin/com/swmansion/kmpmaps/core/Map.kt @@ -47,7 +47,7 @@ public actual fun Map( polylines: List, onCameraMove: ((CameraPosition) -> Unit)?, onMarkerClick: ((Marker) -> Unit)?, - onMarkerDragEnd: ((Marker, Coordinates) -> Unit)?, + onMarkerDragEnd: ((Marker) -> Unit)?, onCircleClick: ((Circle) -> Unit)?, onPolygonClick: ((Polygon) -> Unit)?, onPolylineClick: ((Polyline) -> Unit)?, @@ -179,15 +179,21 @@ public actual fun Map( remember(marker.getId()) { MarkerState(marker.coordinates.toGoogleMapsLatLng()) } + + LaunchedEffect(marker.coordinates) { + val newLatLng = marker.coordinates.toGoogleMapsLatLng() + if (markerState.position != newLatLng) { + markerState.position = newLatLng + } + } + val content = customMarkerContent[marker.contentId] if (marker.androidMarkerOptions.draggable) { LaunchedEffect(markerState.isDragging) { if (!markerState.isDragging) { - onMarkerDragEnd?.invoke( - marker, - markerState.position.toCoordinates(), - ) + marker.coordinates = markerState.position.toCoordinates() + onMarkerDragEnd?.invoke(marker) } } } @@ -201,9 +207,7 @@ public actual fun Map( snippet = marker.androidMarkerOptions.snippet, zIndex = marker.androidMarkerOptions.zIndex ?: 0.0f, onClick = { - onMarkerClick?.invoke( - marker.copy(coordinates = markerState.position.toCoordinates()) - ) + onMarkerClick?.invoke(marker) onMarkerClick == null }, content = { content(marker) }, @@ -217,9 +221,7 @@ public actual fun Map( snippet = marker.androidMarkerOptions.snippet, zIndex = marker.androidMarkerOptions.zIndex ?: 0.0f, onClick = { - onMarkerClick?.invoke( - marker.copy(coordinates = markerState.position.toCoordinates()) - ) + onMarkerClick?.invoke(marker) onMarkerClick == null }, ) diff --git a/kmp-maps/core/src/commonMain/kotlin/com/swmansion/kmpmaps/core/Map.kt b/kmp-maps/core/src/commonMain/kotlin/com/swmansion/kmpmaps/core/Map.kt index 4b91d933..4b9ca431 100644 --- a/kmp-maps/core/src/commonMain/kotlin/com/swmansion/kmpmaps/core/Map.kt +++ b/kmp-maps/core/src/commonMain/kotlin/com/swmansion/kmpmaps/core/Map.kt @@ -95,7 +95,7 @@ import androidx.compose.ui.Modifier * @param polylines List of polylines to display on the map * @param onCameraMove Callback invoked when the map camera position changes due to user interaction * @param onMarkerClick Callback invoked when a marker is clicked - * @param onMarkerDragEnd Callback invoked when a marker is dragged + * @param onMarkerDragEnd Callback invoked when dragging a marker completes (drag operation ends) * @param onCircleClick Callback invoked when a circle is clicked * @param onPolygonClick Callback invoked when a polygon is clicked * @param onPolylineClick Callback invoked when a polyline is clicked @@ -120,7 +120,7 @@ public expect fun Map( polylines: List = emptyList(), onCameraMove: ((CameraPosition) -> Unit)? = null, onMarkerClick: ((Marker) -> Unit)? = null, - onMarkerDragEnd: ((Marker, Coordinates) -> Unit)? = null, + onMarkerDragEnd: ((Marker) -> Unit)? = null, onCircleClick: ((Circle) -> Unit)? = null, onPolygonClick: ((Polygon) -> Unit)? = null, onPolylineClick: ((Polyline) -> Unit)? = null, diff --git a/kmp-maps/core/src/commonMain/kotlin/com/swmansion/kmpmaps/core/MapTypes.kt b/kmp-maps/core/src/commonMain/kotlin/com/swmansion/kmpmaps/core/MapTypes.kt index c377213d..f108de4c 100644 --- a/kmp-maps/core/src/commonMain/kotlin/com/swmansion/kmpmaps/core/MapTypes.kt +++ b/kmp-maps/core/src/commonMain/kotlin/com/swmansion/kmpmaps/core/MapTypes.kt @@ -92,7 +92,7 @@ public data class MapUISettings( @JsonIgnoreUnknownKeys @OptIn(ExperimentalSerializationApi::class) public data class Marker( - val coordinates: Coordinates, + var coordinates: Coordinates, val title: String? = "No title was provided", val androidMarkerOptions: AndroidMarkerOptions = AndroidMarkerOptions(), val iosMarkerOptions: IosMarkerOptions? = null, diff --git a/kmp-maps/core/src/iosMain/kotlin/com/swmansion/kmpmaps/core/Map.kt b/kmp-maps/core/src/iosMain/kotlin/com/swmansion/kmpmaps/core/Map.kt index 00e1fa8d..25766f24 100644 --- a/kmp-maps/core/src/iosMain/kotlin/com/swmansion/kmpmaps/core/Map.kt +++ b/kmp-maps/core/src/iosMain/kotlin/com/swmansion/kmpmaps/core/Map.kt @@ -41,7 +41,7 @@ public actual fun Map( polylines: List, onCameraMove: ((CameraPosition) -> Unit)?, onMarkerClick: ((Marker) -> Unit)?, - onMarkerDragEnd: ((Marker, Coordinates) -> Unit)?, + onMarkerDragEnd: ((Marker) -> Unit)?, onCircleClick: ((Circle) -> Unit)?, onPolygonClick: ((Polygon) -> Unit)?, onPolylineClick: ((Polyline) -> Unit)?, diff --git a/kmp-maps/core/src/jvmMain/kotlin/com/swmansion/kmpmaps/core/Map.kt b/kmp-maps/core/src/jvmMain/kotlin/com/swmansion/kmpmaps/core/Map.kt index 25ad3d47..10c74a40 100644 --- a/kmp-maps/core/src/jvmMain/kotlin/com/swmansion/kmpmaps/core/Map.kt +++ b/kmp-maps/core/src/jvmMain/kotlin/com/swmansion/kmpmaps/core/Map.kt @@ -30,7 +30,7 @@ public actual fun Map( polylines: List, onCameraMove: ((CameraPosition) -> Unit)?, onMarkerClick: ((Marker) -> Unit)?, - onMarkerDragEnd: ((Marker, Coordinates) -> Unit)?, + onMarkerDragEnd: ((Marker) -> Unit)?, onCircleClick: ((Circle) -> Unit)?, onPolygonClick: ((Polygon) -> Unit)?, onPolylineClick: ((Polyline) -> Unit)?, diff --git a/kmp-maps/google-maps/src/androidMain/kotlin/com/swmansion/kmpmaps/googlemaps/Map.kt b/kmp-maps/google-maps/src/androidMain/kotlin/com/swmansion/kmpmaps/googlemaps/Map.kt index 9b57539b..a8ca89d0 100644 --- a/kmp-maps/google-maps/src/androidMain/kotlin/com/swmansion/kmpmaps/googlemaps/Map.kt +++ b/kmp-maps/google-maps/src/androidMain/kotlin/com/swmansion/kmpmaps/googlemaps/Map.kt @@ -28,7 +28,7 @@ public actual fun Map( polylines: List, onCameraMove: ((CameraPosition) -> Unit)?, onMarkerClick: ((Marker) -> Unit)?, - onMarkerDragEnd: ((Marker, Coordinates) -> Unit)?, + onMarkerDragEnd: ((Marker) -> Unit)?, onCircleClick: ((Circle) -> Unit)?, onPolygonClick: ((Polygon) -> Unit)?, onPolylineClick: ((Polyline) -> Unit)?, diff --git a/kmp-maps/google-maps/src/commonMain/kotlin/com/swmansion/kmpmaps/googlemaps/Map.kt b/kmp-maps/google-maps/src/commonMain/kotlin/com/swmansion/kmpmaps/googlemaps/Map.kt index 8d2107fa..65594938 100644 --- a/kmp-maps/google-maps/src/commonMain/kotlin/com/swmansion/kmpmaps/googlemaps/Map.kt +++ b/kmp-maps/google-maps/src/commonMain/kotlin/com/swmansion/kmpmaps/googlemaps/Map.kt @@ -34,7 +34,7 @@ import com.swmansion.kmpmaps.core.Polyline * @param polylines List of polylines to display on the map * @param onCameraMove Callback invoked when the map camera position changes due to user interaction * @param onMarkerClick Callback invoked when a marker is clicked - * @param onMarkerDragEnd Callback invoked when a marker is dragged + * @param onMarkerDragEnd Callback invoked when a marker drag operation ends * @param onCircleClick Callback invoked when a circle is clicked * @param onPolygonClick Callback invoked when a polygon is clicked * @param onPolylineClick Callback invoked when a polyline is clicked @@ -59,7 +59,7 @@ public expect fun Map( polylines: List = emptyList(), onCameraMove: ((CameraPosition) -> Unit)? = null, onMarkerClick: ((Marker) -> Unit)? = null, - onMarkerDragEnd: ((Marker, Coordinates) -> Unit)? = null, + onMarkerDragEnd: ((Marker) -> Unit)? = null, onCircleClick: ((Circle) -> Unit)? = null, onPolygonClick: ((Polygon) -> Unit)? = null, onPolylineClick: ((Polyline) -> Unit)? = null, diff --git a/kmp-maps/google-maps/src/iosMain/kotlin/com/swmansion/kmpmaps/googlemaps/Map.kt b/kmp-maps/google-maps/src/iosMain/kotlin/com/swmansion/kmpmaps/googlemaps/Map.kt index d782de5c..56eb555b 100644 --- a/kmp-maps/google-maps/src/iosMain/kotlin/com/swmansion/kmpmaps/googlemaps/Map.kt +++ b/kmp-maps/google-maps/src/iosMain/kotlin/com/swmansion/kmpmaps/googlemaps/Map.kt @@ -56,7 +56,7 @@ public actual fun Map( polylines: List, onCameraMove: ((CameraPosition) -> Unit)?, onMarkerClick: ((Marker) -> Unit)?, - onMarkerDragEnd: ((Marker, Coordinates) -> Unit)?, + onMarkerDragEnd: ((Marker) -> Unit)?, onCircleClick: ((Circle) -> Unit)?, onPolygonClick: ((Polygon) -> Unit)?, onPolylineClick: ((Polyline) -> Unit)?, diff --git a/kmp-maps/google-maps/src/jvmMain/kotlin/com/swmansion/kmpmaps/googlemaps/Map.kt b/kmp-maps/google-maps/src/jvmMain/kotlin/com/swmansion/kmpmaps/googlemaps/Map.kt index 5f31bcf5..4138a41d 100644 --- a/kmp-maps/google-maps/src/jvmMain/kotlin/com/swmansion/kmpmaps/googlemaps/Map.kt +++ b/kmp-maps/google-maps/src/jvmMain/kotlin/com/swmansion/kmpmaps/googlemaps/Map.kt @@ -28,7 +28,7 @@ public actual fun Map( polylines: List, onCameraMove: ((CameraPosition) -> Unit)?, onMarkerClick: ((Marker) -> Unit)?, - onMarkerDragEnd: ((Marker, Coordinates) -> Unit)?, + onMarkerDragEnd: ((Marker) -> Unit)?, onCircleClick: ((Circle) -> Unit)?, onPolygonClick: ((Polygon) -> Unit)?, onPolylineClick: ((Polyline) -> Unit)?, diff --git a/sample/src/commonMain/kotlin/com/swmansion/kmpmaps/sample/Examples.kt b/sample/src/commonMain/kotlin/com/swmansion/kmpmaps/sample/Examples.kt index b7337b20..5c3dad76 100644 --- a/sample/src/commonMain/kotlin/com/swmansion/kmpmaps/sample/Examples.kt +++ b/sample/src/commonMain/kotlin/com/swmansion/kmpmaps/sample/Examples.kt @@ -49,7 +49,8 @@ val exampleMarkers = Marker( coordinates = softwareMansionPin, title = "Software Mansion", - androidMarkerOptions = AndroidMarkerOptions(snippet = "Software house"), + androidMarkerOptions = + AndroidMarkerOptions(snippet = "Software house", draggable = true), contentId = "swmansion_marker", ), Marker( diff --git a/sample/src/commonMain/kotlin/com/swmansion/kmpmaps/sample/MapWrapper.kt b/sample/src/commonMain/kotlin/com/swmansion/kmpmaps/sample/MapWrapper.kt index d195351f..bec8c141 100644 --- a/sample/src/commonMain/kotlin/com/swmansion/kmpmaps/sample/MapWrapper.kt +++ b/sample/src/commonMain/kotlin/com/swmansion/kmpmaps/sample/MapWrapper.kt @@ -27,14 +27,14 @@ internal data class MapOptions( val cameraPosition: CameraPosition = CameraPosition( coordinates = Coordinates(latitude = 50.0619, longitude = 19.9373), - zoom = 10f, + zoom = 14f, ), val showAllComponents: Boolean = true, val useGoogleMapsMapView: Boolean = true, val showPointGeoJson: Boolean = false, val showPolygonGeoJson: Boolean = false, val showLineGeoJson: Boolean = false, - val clusteringEnabled: Boolean = true, + val clusteringEnabled: Boolean = false, ) @Composable @@ -91,7 +91,9 @@ internal fun MapWrapper( onPOIClick = { println("POI clicked: $it") }, onMapLoaded = { println("Map loaded") }, onMapLongClick = { println("Map long clicked: $it") }, - onMarkerClick = { marker -> println("Marker clicked: ${marker.title}") }, + onMarkerClick = { marker -> + println("Marker clicked: ${marker.title} ${marker.coordinates}") + }, onMapClick = { coordinates -> println("Map clicked at: $coordinates") }, geoJsonLayers = geoJsonLayers, customMarkerContent = customMarkerContent, @@ -118,7 +120,7 @@ private fun Map( polylines: List = emptyList(), onCameraMove: ((CameraPosition) -> Unit)? = null, onMarkerClick: ((Marker) -> Unit)? = null, - onMarkerDragEnd: ((Marker, Coordinates) -> Unit)? = null, + onMarkerDragEnd: ((Marker) -> Unit)? = null, onCircleClick: ((Circle) -> Unit)? = null, onPolygonClick: ((Polygon) -> Unit)? = null, onPolylineClick: ((Polyline) -> Unit)? = null, From e785287d95d8d1d543748c0c309c56de62447a7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Artur=20G=C4=99siarz?= <126520293+arturgesiarz@users.noreply.github.com> Date: Fri, 6 Feb 2026 15:45:26 +0100 Subject: [PATCH 3/6] Delete LatLng type --- .../androidMain/kotlin/com/swmansion/kmpmaps/core/Extensions.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kmp-maps/core/src/androidMain/kotlin/com/swmansion/kmpmaps/core/Extensions.kt b/kmp-maps/core/src/androidMain/kotlin/com/swmansion/kmpmaps/core/Extensions.kt index 689f9e90..fe696676 100644 --- a/kmp-maps/core/src/androidMain/kotlin/com/swmansion/kmpmaps/core/Extensions.kt +++ b/kmp-maps/core/src/androidMain/kotlin/com/swmansion/kmpmaps/core/Extensions.kt @@ -64,7 +64,7 @@ internal fun GoogleCameraPosition.toCameraPosition() = * * @return LatLng with latitude and longitude */ -internal fun Coordinates.toGoogleMapsLatLng(): LatLng = LatLng(latitude, longitude) +internal fun Coordinates.toGoogleMapsLatLng() = LatLng(latitude, longitude) /** * Converts Google Maps LatLng back to [Coordinates]. From 5e8b93735718ec3bd3faebd68a58809f5c59a679 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Artur=20G=C4=99siarz?= <126520293+arturgesiarz@users.noreply.github.com> Date: Mon, 9 Feb 2026 10:02:49 +0100 Subject: [PATCH 4/6] Add coordiantes note --- .../kotlin/com/swmansion/kmpmaps/core/MapTypes.kt | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/kmp-maps/core/src/commonMain/kotlin/com/swmansion/kmpmaps/core/MapTypes.kt b/kmp-maps/core/src/commonMain/kotlin/com/swmansion/kmpmaps/core/MapTypes.kt index f108de4c..c612a12d 100644 --- a/kmp-maps/core/src/commonMain/kotlin/com/swmansion/kmpmaps/core/MapTypes.kt +++ b/kmp-maps/core/src/commonMain/kotlin/com/swmansion/kmpmaps/core/MapTypes.kt @@ -79,7 +79,14 @@ public data class MapUISettings( /** * Represents a marker on the map. * - * @property coordinates The geographical coordinates where the marker should be placed + * @property coordinates The geographical coordinates where the marker should be placed. + * + * Note on Mutability: Although this is a `var` to allow the library to update positions during + * dragging, you should treat it as **immutable**. To move the marker programmatically, pass a new + * [Marker] instance to the map. + * + * *Directly mutating this field may not trigger UI updates, especially on iOS.* + * * @property title The title text displayed when the marker is tapped * @property androidMarkerOptions Android-specific options for customizing a marker * @property iosMarkerOptions iOS-specific options for customizing a marker From d860757fcfc1ddb020bfbcea842e7667a6bf9cbe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Artur=20G=C4=99siarz?= <126520293+arturgesiarz@users.noreply.github.com> Date: Mon, 9 Feb 2026 10:03:24 +0100 Subject: [PATCH 5/6] Update note --- .../commonMain/kotlin/com/swmansion/kmpmaps/core/MapTypes.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kmp-maps/core/src/commonMain/kotlin/com/swmansion/kmpmaps/core/MapTypes.kt b/kmp-maps/core/src/commonMain/kotlin/com/swmansion/kmpmaps/core/MapTypes.kt index c612a12d..c6553460 100644 --- a/kmp-maps/core/src/commonMain/kotlin/com/swmansion/kmpmaps/core/MapTypes.kt +++ b/kmp-maps/core/src/commonMain/kotlin/com/swmansion/kmpmaps/core/MapTypes.kt @@ -85,7 +85,7 @@ public data class MapUISettings( * dragging, you should treat it as **immutable**. To move the marker programmatically, pass a new * [Marker] instance to the map. * - * *Directly mutating this field may not trigger UI updates, especially on iOS.* + * Directly mutating this field may not trigger UI updates, especially on iOS. * * @property title The title text displayed when the marker is tapped * @property androidMarkerOptions Android-specific options for customizing a marker From d48c4034664a229c9914edea5d177a0b5b8f8146 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Artur=20G=C4=99siarz?= <126520293+arturgesiarz@users.noreply.github.com> Date: Mon, 9 Feb 2026 10:06:50 +0100 Subject: [PATCH 6/6] Update KDocs --- .../commonMain/kotlin/com/swmansion/kmpmaps/core/MapTypes.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kmp-maps/core/src/commonMain/kotlin/com/swmansion/kmpmaps/core/MapTypes.kt b/kmp-maps/core/src/commonMain/kotlin/com/swmansion/kmpmaps/core/MapTypes.kt index c6553460..333d22a8 100644 --- a/kmp-maps/core/src/commonMain/kotlin/com/swmansion/kmpmaps/core/MapTypes.kt +++ b/kmp-maps/core/src/commonMain/kotlin/com/swmansion/kmpmaps/core/MapTypes.kt @@ -82,7 +82,7 @@ public data class MapUISettings( * @property coordinates The geographical coordinates where the marker should be placed. * * Note on Mutability: Although this is a `var` to allow the library to update positions during - * dragging, you should treat it as **immutable**. To move the marker programmatically, pass a new + * dragging, you should treat it as immutable. To move the marker programmatically, pass a new * [Marker] instance to the map. * * Directly mutating this field may not trigger UI updates, especially on iOS.