Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions MIGRATION.md
Original file line number Diff line number Diff line change
Expand Up @@ -109,3 +109,13 @@ geoJsonLayer.setOnFeatureClickListener { feature ->
}
```
Unlike the previous version, this SAM conversion is fully supported for native Kotlin callers without requiring anonymous object syntax (`object : Layer.OnFeatureClickListener { ... }`).

---

## 4. Data Renderer Model Style Updates (v6.0.0)

In `v6.0.0`, the `com.google.maps.android.data.renderer.model.Style` hierarchy was expanded to support complete feature styling and heterogeneous multi-geometries:

- **`PointStyle`**, **`LineStyle`**, and **`PolygonStyle`**: Added default-valued constructor properties (`title`, `snippet`, `draggable`, `flat`, `visible`, `infoWindowAnchorU`, and `infoWindowAnchorV` on `PointStyle`; `clickable` and `visible` on `LineStyle` and `PolygonStyle`). Source calls with named or positional arguments continue to compile unchanged, though recompilation is required against the updated data class `copy()` and constructor signatures.
- **`CompositeStyle`**: Added `CompositeStyle(pointStyle, lineStyle, polygonStyle)` as a new subtype of the `sealed interface Style` to support heterogeneous `MultiGeometry` features. Exhaustive `when (style)` expressions over `Style` in consumer code should add a `is CompositeStyle ->` branch (or an `else ->` branch).

Original file line number Diff line number Diff line change
Expand Up @@ -904,7 +904,7 @@ open class ClusterRendererMultipleItems<T : ClusterItem> @JvmOverloads construct
marker: Marker,
) {
var changed = false
// Update marker text if the item text changed - same logic as adding marker in CreateMarkerTask.perform()
// Update marker text if the item text changed - same logic as adding marker in onBeforeClusterItemRendered()
if (item.title != null && item.snippet != null) {
if (item.title != marker.title) {
marker.title = item.title
Expand All @@ -914,19 +914,33 @@ open class ClusterRendererMultipleItems<T : ClusterItem> @JvmOverloads construct
marker.snippet = item.snippet
changed = true
}
} else if (item.snippet != null && item.snippet != marker.title) {
marker.title = item.snippet
changed = true
} else if (item.title != null && item.title != marker.title) {
marker.title = item.title
changed = true
} else if (item.snippet != null) {
if (item.snippet != marker.title) {
marker.title = item.snippet
changed = true
}
if (marker.snippet != null) {
marker.snippet = null
changed = true
}
} else if (item.title != null) {
if (item.title != marker.title) {
marker.title = item.title
changed = true
}
if (marker.snippet != null) {
marker.snippet = null
changed = true
}
}
// Update marker position if the item changed position
if (marker.position != item.position) {
marker.position = item.position
if (item.zIndex != null) {
marker.zIndex = item.zIndex!!
}
changed = true
}
val itemZIndex = item.zIndex
if (itemZIndex != null && marker.zIndex != itemZIndex) {
marker.zIndex = itemZIndex
changed = true
}
if (changed && marker.isInfoWindowShown) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -833,7 +833,7 @@ open class DefaultAdvancedMarkersClusterRenderer<T : ClusterItem> @JvmOverloads
marker: Marker,
) {
var changed = false
// Update marker text if the item text changed - same logic as adding marker in CreateMarkerTask.perform()
// Update marker text if the item text changed - same logic as adding marker in onBeforeClusterItemRendered()
if (item.title != null && item.snippet != null) {
if (item.title != marker.title) {
marker.title = item.title
Expand All @@ -843,19 +843,33 @@ open class DefaultAdvancedMarkersClusterRenderer<T : ClusterItem> @JvmOverloads
marker.snippet = item.snippet
changed = true
}
} else if (item.snippet != null && item.snippet != marker.title) {
marker.title = item.snippet
changed = true
} else if (item.title != null && item.title != marker.title) {
marker.title = item.title
changed = true
} else if (item.snippet != null) {
if (item.snippet != marker.title) {
marker.title = item.snippet
changed = true
}
if (marker.snippet != null) {
marker.snippet = null
changed = true
}
} else if (item.title != null) {
if (item.title != marker.title) {
marker.title = item.title
changed = true
}
if (marker.snippet != null) {
marker.snippet = null
changed = true
}
}
// Update marker position if the item changed position
if (marker.position != item.position) {
marker.position = item.position
if (item.zIndex != null) {
marker.zIndex = item.zIndex!!
}
changed = true
}
val itemZIndex = item.zIndex
if (itemZIndex != null && marker.zIndex != itemZIndex) {
marker.zIndex = itemZIndex
changed = true
}
if (changed && marker.isInfoWindowShown) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -835,7 +835,7 @@ open class DefaultClusterRenderer<T : ClusterItem> @JvmOverloads constructor(
marker: Marker,
) {
var changed = false
// Update marker text if the item text changed - same logic as adding marker in CreateMarkerTask.perform()
// Update marker text if the item text changed - same logic as adding marker in onBeforeClusterItemRendered()
if (item.title != null && item.snippet != null) {
if (item.title != marker.title) {
marker.title = item.title
Expand All @@ -845,19 +845,33 @@ open class DefaultClusterRenderer<T : ClusterItem> @JvmOverloads constructor(
marker.snippet = item.snippet
changed = true
}
} else if (item.snippet != null && item.snippet != marker.title) {
marker.title = item.snippet
changed = true
} else if (item.title != null && item.title != marker.title) {
marker.title = item.title
changed = true
} else if (item.snippet != null) {
if (item.snippet != marker.title) {
marker.title = item.snippet
changed = true
}
if (marker.snippet != null) {
marker.snippet = null
changed = true
}
} else if (item.title != null) {
if (item.title != marker.title) {
marker.title = item.title
changed = true
}
if (marker.snippet != null) {
marker.snippet = null
changed = true
}
}
// Update marker position if the item changed position
if (marker.position != item.position) {
marker.position = item.position
if (item.zIndex != null) {
marker.zIndex = item.zIndex!!
}
changed = true
}
val itemZIndex = item.zIndex
if (itemZIndex != null && marker.zIndex != itemZIndex) {
marker.zIndex = itemZIndex
changed = true
}
if (changed && marker.isInfoWindowShown) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -117,4 +117,51 @@ class ClusterManagerTest {
clusterManager.setOnClusterInfoWindowClickListener(clusterInfoClickListener)
clusterManager.setOnClusterItemInfoWindowClickListener(itemInfoClickListener)
}

private class MutableTestItem(
override var position: LatLng,
override var title: String?,
override var snippet: String?,
override var zIndex: Float?,
) : ClusterItem

private class TestableDefaultClusterRenderer(
context: Context,
map: GoogleMap,
clusterManager: ClusterManager<MutableTestItem>,
) : com.google.maps.android.clustering.view.DefaultClusterRenderer<MutableTestItem>(context, map, clusterManager) {
fun invokeOnClusterItemUpdated(
item: MutableTestItem,
marker: Marker,
) {
onClusterItemUpdated(item, marker)
}
}

@Test
fun testOnClusterItemUpdated_clearsNullSnippetAndUpdatesZIndex() {
val mutableClusterManager = ClusterManager<MutableTestItem>(context, map, markerManager)
val renderer = TestableDefaultClusterRenderer(context, map, mutableClusterManager)
val mockMarker = mockk<Marker>(relaxed = true)
var markerPosition = LatLng(37.7749, -122.4194)
var markerTitle: String? = "Initial Title"
var markerSnippet: String? = "Initial Snippet"
var markerZIndex = 1.0f

every { mockMarker.position } answers { markerPosition }
every { mockMarker.setPosition(any()) } answers { markerPosition = firstArg() }
every { mockMarker.title } answers { markerTitle }
every { mockMarker.setTitle(any()) } answers { markerTitle = firstArg() }
every { mockMarker.snippet } answers { markerSnippet }
every { mockMarker.setSnippet(any()) } answers { markerSnippet = firstArg() }
every { mockMarker.zIndex } answers { markerZIndex }
every { mockMarker.setZIndex(any()) } answers { markerZIndex = firstArg() }
every { mockMarker.isInfoWindowShown } returns false

val item = MutableTestItem(LatLng(37.7749, -122.4194), "Initial Title", null, 10.0f)
renderer.invokeOnClusterItemUpdated(item, mockMarker)

assertThat(markerSnippet).isNull()
assertThat(markerZIndex).isEqualTo(10.0f)
}
}
Loading
Loading