From 64bf96ae6e008754152433bb6ca15d200574b100 Mon Sep 17 00:00:00 2001 From: kaytran2992 Date: Wed, 4 Dec 2024 12:30:29 +0700 Subject: [PATCH 1/2] Update multi color for mapbox --- .../providers/googlemap/W3WGoogleMapDrawer.kt | 29 ++++---- .../maps/providers/mapbox/W3WMapBoxDrawers.kt | 66 ++++++++++++++----- 2 files changed, 64 insertions(+), 31 deletions(-) diff --git a/lib-compose/src/main/java/com/what3words/components/compose/maps/providers/googlemap/W3WGoogleMapDrawer.kt b/lib-compose/src/main/java/com/what3words/components/compose/maps/providers/googlemap/W3WGoogleMapDrawer.kt index b07325f5..c5cbe8d9 100644 --- a/lib-compose/src/main/java/com/what3words/components/compose/maps/providers/googlemap/W3WGoogleMapDrawer.kt +++ b/lib-compose/src/main/java/com/what3words/components/compose/maps/providers/googlemap/W3WGoogleMapDrawer.kt @@ -19,6 +19,7 @@ import com.google.maps.android.compose.GroundOverlayPosition import com.google.maps.android.compose.Marker import com.google.maps.android.compose.Polyline import com.google.maps.android.compose.rememberMarkerState +import com.mapbox.maps.extension.compose.annotation.rememberIconImage import com.what3words.components.compose.maps.W3WMapDefaults import com.what3words.components.compose.maps.W3WMapDefaults.MUlTI_MAKERS_COLOR_DEFAULT import com.what3words.components.compose.maps.mapper.toGoogleLatLng @@ -229,9 +230,9 @@ private fun DrawZoomInSelectedAddress( fun W3WGoogleMapDrawMarkers( zoomLevel: Float, zoomSwitchLevel: Float, - selectedMarkerID: Long? = null, listMarkers: ImmutableMap>, - onMarkerClicked: (W3WMarker) -> Unit + selectedMarkerID: Long? = null, + onMarkerClicked: (W3WMarker) -> Unit, ) { if (zoomLevel < zoomSwitchLevel) { DrawZoomOutMarkers( @@ -284,8 +285,8 @@ private fun DrawZoomInMarkers( @Composable private fun DrawZoomOutMarkers( - selectedMarkerID: Long? = null, listMarkers: ImmutableMap>, + selectedMarkerID: Long? = null, onMarkerClicked: (W3WMarker) -> Unit ) { val context = LocalContext.current @@ -295,20 +296,18 @@ private fun DrawZoomOutMarkers( listMarkers.forEach { (listId, markerList) -> markerList.forEach { marker -> - val icon = remember(marker, listId) { - val color = if (isExistInOtherList(listId, marker, listMarkers)) { - MUlTI_MAKERS_COLOR_DEFAULT - } else { - marker.color + val color by remember(marker, listId, listMarkers) { + derivedStateOf { + if (isExistInOtherList(listId, marker, listMarkers)) { + MUlTI_MAKERS_COLOR_DEFAULT + } else { + marker.color + } } + } - BitmapDescriptorFactory.fromBitmap( - getPinBitmap( - context, - density = density, - colorMarker = color - ) - ) + val icon = remember(marker.id, color) { + BitmapDescriptorFactory.fromBitmap(getPinBitmap(context, density, color)) } Marker( diff --git a/lib-compose/src/main/java/com/what3words/components/compose/maps/providers/mapbox/W3WMapBoxDrawers.kt b/lib-compose/src/main/java/com/what3words/components/compose/maps/providers/mapbox/W3WMapBoxDrawers.kt index 1a90cdea..942bb8df 100644 --- a/lib-compose/src/main/java/com/what3words/components/compose/maps/providers/mapbox/W3WMapBoxDrawers.kt +++ b/lib-compose/src/main/java/com/what3words/components/compose/maps/providers/mapbox/W3WMapBoxDrawers.kt @@ -2,6 +2,9 @@ package com.what3words.components.compose.maps.providers.mapbox import android.content.Context import androidx.compose.runtime.Composable +import androidx.compose.runtime.derivedStateOf +import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.asImageBitmap import androidx.compose.ui.graphics.painter.BitmapPainter @@ -21,9 +24,13 @@ import com.mapbox.maps.extension.style.sources.generated.ImageSource import com.mapbox.maps.extension.style.sources.getSourceAs import com.mapbox.maps.extension.style.sources.updateImage import com.what3words.components.compose.maps.W3WMapDefaults +import com.what3words.components.compose.maps.W3WMapDefaults.MUlTI_MAKERS_COLOR_DEFAULT import com.what3words.components.compose.maps.models.W3WLatLng import com.what3words.components.compose.maps.models.W3WMarker +import com.what3words.components.compose.maps.state.MarkerStatus import com.what3words.components.compose.maps.state.W3WMapState +import com.what3words.components.compose.maps.state.isExistInOtherList +import com.what3words.components.compose.maps.state.isMarkerInSavedList import com.what3words.components.compose.maps.utils.getFillGridMarkerBitmap import com.what3words.components.compose.maps.utils.getMarkerBitmap import com.what3words.components.compose.maps.utils.getPinBitmap @@ -35,6 +42,13 @@ import kotlinx.collections.immutable.ImmutableMap @Composable @MapboxMapComposable fun W3WMapBoxDrawer(state: W3WMapState, mapConfig: W3WMapDefaults.MapConfig) { + // Check if selectedMarker exists in the saved list + val markerStatus by remember(state.listMakers, state.selectedAddress) { + derivedStateOf { + state.selectedAddress?.let { isMarkerInSavedList(state.listMakers, it) } + } + } + state.cameraState?.let { cameraState -> if (mapConfig.gridLineConfig.isGridEnabled && cameraState.getZoomLevel() >= mapConfig.gridLineConfig.zoomSwitchLevel) { W3WMapBoxDrawGridLines( @@ -58,7 +72,9 @@ fun W3WMapBoxDrawer(state: W3WMapState, mapConfig: W3WMapDefaults.MapConfig) { W3WMapBoxDrawSelectedAddress( zoomLevel = cameraState.getZoomLevel(), zoomSwitchLevel = mapConfig.gridLineConfig.zoomSwitchLevel, - selectedMarker = state.selectedAddress + selectedMarker = state.selectedAddress.copy( + color = if (markerStatus == MarkerStatus.InMultipleList) MUlTI_MAKERS_COLOR_DEFAULT else state.selectedAddress.color + ), ) } } @@ -110,8 +126,9 @@ fun W3WMapBoxDrawSelectedAddress( fun W3WMapBoxDrawMarkers( zoomLevel: Float, zoomSwitchLevel: Float, - listMakers: ImmutableMap> -) { + listMakers: ImmutableMap>, + selectedMarkerID: Long? = null, + ) { if (zoomLevel < zoomSwitchLevel) { DrawZoomOutMarkers(listMakers) } else { @@ -123,26 +140,43 @@ fun W3WMapBoxDrawMarkers( @MapboxMapComposable private fun DrawZoomOutMarkers( listMarkers: ImmutableMap>, + selectedMarkerID: Long? = null, ) { val context = LocalContext.current val density = LocalDensity.current.density - listMarkers.forEach { (_, markerList) -> + listMarkers.forEach { (listId, markerList) -> markerList.forEach { marker -> - val icon = rememberIconImage( - key = marker.words, - painter = BitmapPainter( - getPinBitmap(context, density, marker.color).asImageBitmap() - ) - ) + if(selectedMarkerID != marker.id) { + val color by remember(marker, listId, listMarkers) { + derivedStateOf { + if (isExistInOtherList(listId, marker, listMarkers)) { + MUlTI_MAKERS_COLOR_DEFAULT + } else { + marker.color + } + } + } + + val bitmap = remember(marker.id, color) { + getPinBitmap(context, density, color) + } - PointAnnotation( - point = Point.fromLngLat( - marker.latLng.lng, - marker.latLng.lat + val icon = rememberIconImage( + key = marker.id, + painter = BitmapPainter( + bitmap.asImageBitmap() + ) ) - ) { - iconImage = icon + + PointAnnotation( + point = Point.fromLngLat( + marker.latLng.lng, + marker.latLng.lat + ) + ) { + iconImage = icon + } } } } From 05821f17e582ab65bc222c7a185e920f346b910a Mon Sep 17 00:00:00 2001 From: kaytran2992 Date: Wed, 4 Dec 2024 16:06:45 +0700 Subject: [PATCH 2/2] Update markers and selected multi colors --- .../compose/maps/W3WMapComponent.kt | 5 +- .../providers/googlemap/W3WGoogleMapDrawer.kt | 34 ++++++----- .../maps/providers/mapbox/W3WMapBox.kt | 4 +- .../maps/providers/mapbox/W3WMapBoxDrawers.kt | 59 +++++++++++++------ 4 files changed, 66 insertions(+), 36 deletions(-) diff --git a/lib-compose/src/main/java/com/what3words/components/compose/maps/W3WMapComponent.kt b/lib-compose/src/main/java/com/what3words/components/compose/maps/W3WMapComponent.kt index 29bc70b3..45620ec9 100644 --- a/lib-compose/src/main/java/com/what3words/components/compose/maps/W3WMapComponent.kt +++ b/lib-compose/src/main/java/com/what3words/components/compose/maps/W3WMapComponent.kt @@ -322,9 +322,9 @@ internal fun W3WMapView( layoutConfig = layoutConfig, mapConfig = mapConfig, state = mapState, + content = content, onMapClicked = onMapClicked, onMarkerClicked = onMarkerClicked, - content = content, onCameraUpdated = { onCameraUpdated.invoke(it) } @@ -337,8 +337,9 @@ internal fun W3WMapView( layoutConfig = layoutConfig, mapConfig = mapConfig, state = mapState, - onMapClicked = onMapClicked, content = content, + onMapClicked = onMapClicked, + onMarkerClicked = onMarkerClicked, onCameraUpdated = { onCameraUpdated.invoke(it) } diff --git a/lib-compose/src/main/java/com/what3words/components/compose/maps/providers/googlemap/W3WGoogleMapDrawer.kt b/lib-compose/src/main/java/com/what3words/components/compose/maps/providers/googlemap/W3WGoogleMapDrawer.kt index c5cbe8d9..ea05a849 100644 --- a/lib-compose/src/main/java/com/what3words/components/compose/maps/providers/googlemap/W3WGoogleMapDrawer.kt +++ b/lib-compose/src/main/java/com/what3words/components/compose/maps/providers/googlemap/W3WGoogleMapDrawer.kt @@ -19,7 +19,6 @@ import com.google.maps.android.compose.GroundOverlayPosition import com.google.maps.android.compose.Marker import com.google.maps.android.compose.Polyline import com.google.maps.android.compose.rememberMarkerState -import com.mapbox.maps.extension.compose.annotation.rememberIconImage import com.what3words.components.compose.maps.W3WMapDefaults import com.what3words.components.compose.maps.W3WMapDefaults.MUlTI_MAKERS_COLOR_DEFAULT import com.what3words.components.compose.maps.mapper.toGoogleLatLng @@ -242,8 +241,7 @@ fun W3WGoogleMapDrawMarkers( ) } else { DrawZoomInMarkers( - listMarkers = listMarkers, - onMarkerClicked = onMarkerClicked + listMarkers = listMarkers ) } } @@ -251,20 +249,26 @@ fun W3WGoogleMapDrawMarkers( @Composable private fun DrawZoomInMarkers( listMarkers: ImmutableMap>, - onMarkerClicked: ((W3WMarker) -> Unit)? = null, ) { val context = LocalContext.current val density = LocalDensity.current.density - listMarkers.forEach { markers -> - markers.value.forEach { marker -> - val bitmap = BitmapDescriptorFactory.fromBitmap( - getFillGridMarkerBitmap( - context, - density, - marker.color - ) - ) + listMarkers.forEach { (listId, markers) -> + markers.forEach { marker -> + val color by remember(marker, listId, listMarkers) { + derivedStateOf { + if (isExistInOtherList(listId, marker, listMarkers)) { + MUlTI_MAKERS_COLOR_DEFAULT + } else { + marker.color + } + } + } + + val bitmap = remember(marker.id, color) { + BitmapDescriptorFactory.fromBitmap(getFillGridMarkerBitmap(context, density, color)) + } + val square = marker.square GroundOverlay( @@ -294,8 +298,8 @@ private fun DrawZoomOutMarkers( val currentOnMarkerClicked by rememberUpdatedState(onMarkerClicked) - listMarkers.forEach { (listId, markerList) -> - markerList.forEach { marker -> + listMarkers.forEach { (listId, markers) -> + markers.forEach { marker -> val color by remember(marker, listId, listMarkers) { derivedStateOf { if (isExistInOtherList(listId, marker, listMarkers)) { diff --git a/lib-compose/src/main/java/com/what3words/components/compose/maps/providers/mapbox/W3WMapBox.kt b/lib-compose/src/main/java/com/what3words/components/compose/maps/providers/mapbox/W3WMapBox.kt index 5123130a..3fa185d7 100644 --- a/lib-compose/src/main/java/com/what3words/components/compose/maps/providers/mapbox/W3WMapBox.kt +++ b/lib-compose/src/main/java/com/what3words/components/compose/maps/providers/mapbox/W3WMapBox.kt @@ -21,6 +21,7 @@ import com.mapbox.maps.plugin.locationcomponent.location import com.mapbox.maps.toCameraOptions import com.what3words.components.compose.maps.W3WMapDefaults import com.what3words.components.compose.maps.mapper.toMapBoxMapType +import com.what3words.components.compose.maps.models.W3WMarker import com.what3words.components.compose.maps.state.W3WMapState import com.what3words.components.compose.maps.state.camera.W3WCameraState import com.what3words.components.compose.maps.state.camera.W3WMapboxCameraState @@ -52,6 +53,7 @@ fun W3WMapBox( mapConfig: W3WMapDefaults.MapConfig, state: W3WMapState, content: (@Composable () -> Unit)? = null, + onMarkerClicked: (W3WMarker) -> Unit, onMapClicked: ((W3WCoordinates) -> Unit), onCameraUpdated: (W3WCameraState<*>) -> Unit ) { @@ -141,7 +143,7 @@ fun W3WMapBox( } } - W3WMapBoxDrawer(state, mapConfig) + W3WMapBoxDrawer(state, mapConfig, onMarkerClicked) content?.invoke() } } diff --git a/lib-compose/src/main/java/com/what3words/components/compose/maps/providers/mapbox/W3WMapBoxDrawers.kt b/lib-compose/src/main/java/com/what3words/components/compose/maps/providers/mapbox/W3WMapBoxDrawers.kt index 942bb8df..81ed47c1 100644 --- a/lib-compose/src/main/java/com/what3words/components/compose/maps/providers/mapbox/W3WMapBoxDrawers.kt +++ b/lib-compose/src/main/java/com/what3words/components/compose/maps/providers/mapbox/W3WMapBoxDrawers.kt @@ -5,6 +5,7 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.getValue import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberUpdatedState import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.asImageBitmap import androidx.compose.ui.graphics.painter.BitmapPainter @@ -41,7 +42,11 @@ import kotlinx.collections.immutable.ImmutableMap @Composable @MapboxMapComposable -fun W3WMapBoxDrawer(state: W3WMapState, mapConfig: W3WMapDefaults.MapConfig) { +fun W3WMapBoxDrawer( + state: W3WMapState, + mapConfig: W3WMapDefaults.MapConfig, + onMarkerClicked: (W3WMarker) -> Unit +) { // Check if selectedMarker exists in the saved list val markerStatus by remember(state.listMakers, state.selectedAddress) { derivedStateOf { @@ -61,9 +66,11 @@ fun W3WMapBoxDrawer(state: W3WMapState, mapConfig: W3WMapDefaults.MapConfig) { if (state.listMakers.isNotEmpty()) { W3WMapBoxDrawMarkers( - cameraState.getZoomLevel(), - mapConfig.gridLineConfig.zoomSwitchLevel, - state.listMakers + zoomLevel = cameraState.getZoomLevel(), + zoomSwitchLevel = mapConfig.gridLineConfig.zoomSwitchLevel, + listMakers = state.listMakers, + selectedMarkerID = if (markerStatus != MarkerStatus.NotSaved) state.selectedAddress?.id else null, + onMarkerClicked = onMarkerClicked ) } @@ -128,9 +135,14 @@ fun W3WMapBoxDrawMarkers( zoomSwitchLevel: Float, listMakers: ImmutableMap>, selectedMarkerID: Long? = null, + onMarkerClicked: (W3WMarker) -> Unit, ) { if (zoomLevel < zoomSwitchLevel) { - DrawZoomOutMarkers(listMakers) + DrawZoomOutMarkers( + listMakers, + selectedMarkerID, + onMarkerClicked + ) } else { DrawZoomInMarkers(listMakers) } @@ -141,12 +153,14 @@ fun W3WMapBoxDrawMarkers( private fun DrawZoomOutMarkers( listMarkers: ImmutableMap>, selectedMarkerID: Long? = null, + onMarkerClicked: (W3WMarker) -> Unit, ) { val context = LocalContext.current val density = LocalDensity.current.density + val currentOnMarkerClicked by rememberUpdatedState(onMarkerClicked) - listMarkers.forEach { (listId, markerList) -> - markerList.forEach { marker -> + listMarkers.forEach { (listId, markers) -> + markers.forEach { marker -> if(selectedMarkerID != marker.id) { val color by remember(marker, listId, listMarkers) { derivedStateOf { @@ -158,7 +172,7 @@ private fun DrawZoomOutMarkers( } } - val bitmap = remember(marker.id, color) { + val bitmap = remember(color) { getPinBitmap(context, density, color) } @@ -176,6 +190,10 @@ private fun DrawZoomOutMarkers( ) ) { iconImage = icon + interactionsState.onClicked { + currentOnMarkerClicked(marker) + true + } } } } @@ -190,15 +208,22 @@ private fun DrawZoomInMarkers( val context = LocalContext.current val density = LocalDensity.current.density - listMarkers.forEach { (_, markerList) -> - markerList.forEach { marker -> + listMarkers.forEach { (listId, markers) -> + markers.forEach { marker -> val square = marker.square + val color by remember(marker, listId, listMarkers) { + derivedStateOf { + if (isExistInOtherList(listId, marker, listMarkers)) { + MUlTI_MAKERS_COLOR_DEFAULT + } else { + marker.color + } + } + } - val bitmap = getFillGridMarkerBitmap( - context, - density, - marker.color - ) + val bitmap = remember(marker.id, color) { + getFillGridMarkerBitmap(context, density, color) + } MapEffect(Unit) { val imageSource: ImageSource = it.mapboxMap.getSourceAs(marker.id.toString())!! @@ -285,6 +310,4 @@ private fun getGridSelectedBorderSizeBasedOnZoomLevel( else -> context.resources.getDimension(R.dimen.grid_selected_width_mapbox_2px).toDouble() } -} - -private const val ID_SAVED_ADDRESS_IMAGE_SOURCE = "image_source-saved-address-%s" \ No newline at end of file +} \ No newline at end of file