From 9a0f38e055ad09721ff116a3167583712529a995 Mon Sep 17 00:00:00 2001 From: darronschall Date: Wed, 13 Dec 2023 09:53:00 -0500 Subject: [PATCH] feat: Replace `minClusterSize` param with a more configurable `onClusterManager`. This allows callers to easily access the default `clusterManager` and renderer that the library sets up, allowing for further configuration beyond just `minClusterSize`, while keeping the number of params of `Composable` to a minimum. --- .../android/compose/MarkerClusteringActivity.kt | 8 ++++++-- .../maps/android/compose/clustering/Clustering.kt | 15 +++++++-------- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/com/google/maps/android/compose/MarkerClusteringActivity.kt b/app/src/main/java/com/google/maps/android/compose/MarkerClusteringActivity.kt index baf8742a..f38772d6 100644 --- a/app/src/main/java/com/google/maps/android/compose/MarkerClusteringActivity.kt +++ b/app/src/main/java/com/google/maps/android/compose/MarkerClusteringActivity.kt @@ -40,6 +40,7 @@ import com.google.android.gms.maps.model.CameraPosition import com.google.android.gms.maps.model.LatLng import com.google.maps.android.clustering.ClusterItem import com.google.maps.android.clustering.algo.NonHierarchicalViewBasedAlgorithm +import com.google.maps.android.clustering.view.DefaultClusterRenderer import com.google.maps.android.compose.clustering.Clustering import com.google.maps.android.compose.clustering.rememberClusterManager import com.google.maps.android.compose.clustering.rememberClusterRenderer @@ -145,7 +146,6 @@ private fun DefaultClustering(items: List) { private fun CustomUiClustering(items: List) { Clustering( items = items, - minClusterSize = 2, // Optional: Handle clicks on clusters, cluster items, and cluster item info windows onClusterClick = { Log.d(TAG, "Cluster clicked! $it") @@ -167,7 +167,11 @@ private fun CustomUiClustering(items: List) { ) }, // Optional: Custom rendering for non-clustered items - clusterItemContent = null + clusterItemContent = null, + // Optional: Customization hook for clusterManager and renderer when they're ready + onClusterManager = { clusterManager -> + (clusterManager.renderer as DefaultClusterRenderer).minClusterSize = 2 + }, ) } diff --git a/maps-compose-utils/src/main/java/com/google/maps/android/compose/clustering/Clustering.kt b/maps-compose-utils/src/main/java/com/google/maps/android/compose/clustering/Clustering.kt index e36eeeea..f7c27f73 100644 --- a/maps-compose-utils/src/main/java/com/google/maps/android/compose/clustering/Clustering.kt +++ b/maps-compose-utils/src/main/java/com/google/maps/android/compose/clustering/Clustering.kt @@ -127,13 +127,13 @@ public fun Clustering( ) { Clustering( items = items, - minClusterSize = null, onClusterClick = onClusterClick, onClusterItemClick = onClusterItemClick, onClusterItemInfoWindowClick = onClusterItemInfoWindowClick, onClusterItemInfoWindowLongClick = onClusterItemInfoWindowLongClick, clusterContent = clusterContent, clusterItemContent = clusterItemContent, + onClusterManager = null, ) } @@ -141,7 +141,6 @@ public fun Clustering( * Groups many items on a map based on zoom level. * * @param items all items to show - * @param minClusterSize optional minimum number of items needed to form a cluster (default 4) * @param onClusterClick a lambda invoked when the user clicks a cluster of items * @param onClusterItemClick a lambda invoked when the user clicks a non-clustered item * @param onClusterItemInfoWindowClick a lambda invoked when the user clicks the info window of a @@ -150,22 +149,24 @@ public fun Clustering( * window of a non-clustered item * @param clusterContent an optional Composable that is rendered for each [Cluster]. * @param clusterItemContent an optional Composable that is rendered for each non-clustered item. + * @param onClusterManager an optional lambda invoked with the clusterManager as a param when the + * clusterManager and renderer are set up, allowing further customization. */ @Composable @GoogleMapComposable @MapsComposeExperimentalApi public fun Clustering( items: Collection, - minClusterSize: Int? = null, onClusterClick: (Cluster) -> Boolean = { false }, onClusterItemClick: (T) -> Boolean = { false }, onClusterItemInfoWindowClick: (T) -> Unit = { }, onClusterItemInfoWindowLongClick: (T) -> Unit = { }, clusterContent: @[UiComposable Composable] ((Cluster) -> Unit)? = null, clusterItemContent: @[UiComposable Composable] ((T) -> Unit)? = null, + onClusterManager: ((ClusterManager) -> Unit)? = null, ) { val clusterManager = rememberClusterManager() - val renderer = rememberClusterRenderer(clusterContent, clusterItemContent, clusterManager, minClusterSize) + val renderer = rememberClusterRenderer(clusterContent, clusterItemContent, clusterManager) SideEffect { if (clusterManager?.renderer != renderer) { clusterManager?.renderer = renderer ?: return@SideEffect @@ -178,6 +179,8 @@ public fun Clustering( clusterManager.setOnClusterItemClickListener(onClusterItemClick) clusterManager.setOnClusterItemInfoWindowClickListener(onClusterItemInfoWindowClick) clusterManager.setOnClusterItemInfoWindowLongClickListener(onClusterItemInfoWindowLongClick) + + onClusterManager?.invoke(clusterManager) } if (clusterManager != null) { @@ -268,7 +271,6 @@ public fun rememberClusterRenderer( clusterContent: @Composable ((Cluster) -> Unit)?, clusterItemContent: @Composable ((T) -> Unit)?, clusterManager: ClusterManager?, - minClusterSize: Int? = null, ): ClusterRenderer? { val clusterContentState = rememberUpdatedState(clusterContent) val clusterItemContentState = rememberUpdatedState(clusterItemContent) @@ -287,9 +289,6 @@ public fun rememberClusterRenderer( clusterContentState, clusterItemContentState, ) - minClusterSize?.let { - renderer.minClusterSize = minClusterSize - } clusterRendererState.value = renderer } return clusterRendererState.value