Skip to content

feat!: migrate android-maps-ktx into android-maps-utils (v6.0.0) - #1716

Merged
dkhawk merged 17 commits into
mainfrom
feat/migrate-ktx-to-utils
Sep 30, 2026
Merged

dkhawk merged 17 commits into
mainfrom
feat/migrate-ktx-to-utils

Conversation

@dkhawk

@dkhawk dkhawk commented Jul 13, 2026 •

Copy link
Copy Markdown
Contributor

Summary

Migrates all Kotlin extensions from android-maps-ktx (maps-ktx and maps-utils-ktx) directly into android-maps-utils, establishing v6.0.0 as the consolidated, single-source release for both Java utilities and Kotlin Coroutine/Flow extensions.

Key Changes

  1. Consolidated Kotlin Extensions:
    • Reactive coroutine suspensions (awaitMap(), awaitMapsSdkInitialized(), awaitAnimateCamera()).
    • Reactive Flow event streams (mapClickEvents(), cameraMoveEvents(), markerClickEvents()).
    • DSL option builders (addMarker { ... }, addPolyline { ... }, addPolygon { ... }).
  2. Canonical & Compatibility Packages:
    • All extensions and builders live under canonical com.google.maps.android.* packages.
    • Preserves com.google.maps.android.ktx.* with @Deprecated(level = DeprecationLevel.WARNING) forwarding wrappers and typealiases for seamless backward compatibility.
  3. Release Please Configuration:
    • Configured release-please-config.json and .release-please-manifest.json for final v6.0.0 stable release.
    • Updated documentation (README.md, MIGRATION.md, llm-integration-prompt.md, .gemini/skills/android-maps-utils/SKILL.md).
  4. Rebase & Test Validation:
    • Rebased onto latest main (e8ef093c, Kover migration).
    • 100% unit tests pass across all modules (:library, :clustering, :data, :heatmaps, :ui, :demo).

Base automatically changed from feat/rewrite-android-maps-utils to main July 15, 2026 16:38
dkhawk added a commit that referenced this pull request Aug 5, 2026
…1716)

- Consolidate Kotlin Extensions (KTX into Utils): Move all reactive Coroutine/Flow extensions (awaitMap, mapClickEvents, cameraMoveEvents) and option builder DSLs (addMarker, addPolyline, addPolygon) from android-maps-ktx directly into android-maps-utils.

- Canonical Non-KTX Packages: Place all reactive Coroutine/Flow extensions and DSL builders in canonical com.google.maps.android.* packages.

- Deprecated Compatibility Layer: Preserve the legacy com.google.maps.android.ktx.* package structure with @deprecated(level = DeprecationLevel.WARNING, replaceWith = ReplaceWith(...)) forwarding wrappers and typealiases so existing imports compile seamlessly with deprecation warnings.

- Multi-Module Integration: Integrate KTX extensions across :library, :clustering, :heatmaps, and :data modules.

- Demo & Test Consolidation: Include KtxExtensionsDemoActivity in :demo and integrate all 18 KTX unit test suites with both canonical and shim test coverage.
@dkhawk
dkhawk force-pushed the feat/migrate-ktx-to-utils branch from d5b5d7a to f4a5753 Compare August 5, 2026 17:27
dkhawk added a commit that referenced this pull request Aug 5, 2026
…1716)

- Consolidate Kotlin Extensions (KTX into Utils): Move all reactive Coroutine/Flow extensions (awaitMap, mapClickEvents, cameraMoveEvents) and option builder DSLs (addMarker, addPolyline, addPolygon) from android-maps-ktx directly into android-maps-utils.

- Canonical Non-KTX Packages: Place all reactive Coroutine/Flow extensions and DSL builders in canonical com.google.maps.android.* packages.

- Deprecated Compatibility Layer: Preserve the legacy com.google.maps.android.ktx.* package structure with @deprecated(level = DeprecationLevel.WARNING, replaceWith = ReplaceWith(...)) forwarding wrappers and typealiases so existing imports compile seamlessly with deprecation warnings.

- Multi-Module Integration: Integrate KTX extensions across :library, :clustering, :heatmaps, and :data modules.

- Demo & Test Consolidation: Include KtxExtensionsDemoActivity in :demo and integrate all 18 KTX unit test suites with both canonical and shim test coverage.
@dkhawk
dkhawk force-pushed the feat/migrate-ktx-to-utils branch from f4a5753 to 407fded Compare August 5, 2026 17:48
Comment thread demo/src/main/res/values/strings.xml Fixed
@googlemaps-bot

googlemaps-bot commented Aug 5, 2026 •

Copy link
Copy Markdown
Contributor

Code Coverage

Overall Project 56.95% -5.89% 🍏
Files changed 69.5% 🍏

Module Coverage
Kover Gradle Plugin XML report for :library 89.61% -6.77% 🍏
Kover Gradle Plugin XML report for :heatmaps 88.62% -4.12% 🍏
Kover Gradle Plugin XML report for :ui 80.78% 🍏
Kover Gradle Plugin XML report for :data 54.29% -7.82% ❌
Kover Gradle Plugin XML report for :clustering 33.26% -2.19% 🍏
Files
Module File Coverage
Kover Gradle Plugin XML report for :library SupportStreetViewPanoramaFragment.kt 100% 🍏
MapView.kt 100% 🍏
MapFragment.kt 100% 🍏
SupportMapFragment.kt 100% 🍏
StreetViewPanoramaFragment.kt 100% 🍏
Polyline.kt 100% 🍏
LatLng.kt 100% 🍏
SupportStreetViewPanoramaFragment.kt 100% 🍏
MapView.kt 100% 🍏
SupportMapFragment.kt 100% 🍏
Polyline.kt 100% 🍏
LatLng.kt 100% 🍏
StreetViewJavaHelper.kt 100% 🍏
StreetViewPanoramaView.kt 100% 🍏
MapFragment.kt 100% 🍏
MapsInitializer.kt 100% 🍏
MathUtil.kt 100% 🍏
StreetViewPanoramaFragment.kt 100% 🍏
PolylineOptions.kt 100% 🍏
MarkerOptions.kt 100% 🍏
PolygonOptions.kt 100% 🍏
CircleOptions.kt 100% 🍏
StreetViewPanoramaOrientation.kt 100% 🍏
CameraPosition.kt 100% 🍏
GroundOverlayOptions.kt 100% 🍏
TileOverlayOptions.kt 100% 🍏
StreetViewPanoramaCamera.kt 100% 🍏
PolylineOptions.kt 100% 🍏
MarkerOptions.kt 100% 🍏
PolygonOptions.kt 100% 🍏
CircleOptions.kt 100% 🍏
StreetViewPanoramaOrientation.kt 100% 🍏
CameraPosition.kt 100% 🍏
GroundOverlayOptions.kt 100% 🍏
TileOverlayOptions.kt 100% 🍏
StreetViewPanoramaCamera.kt 100% 🍏
SphericalUtil.kt 99.71% 🍏
PolyUtil.kt 99.37% 🍏
FlexiblePolyline.kt 97.84% 🍏
MapObjectManager.kt 94.05% -3.97% 🍏
MarkerManager.kt 91.98% 🍏
MarkerManagerFlows.kt 91.2% -8.8% 🍏
PolygonManager.kt 87.84% 🍏
CircleManager.kt 87.84% 🍏
GroundOverlayManager.kt 87.84% 🍏
PolylineManager.kt 87.84% 🍏
FusedLocationProvider.kt 84.62% -15.38% 🍏
LocationManager.kt 84.62% -15.38% 🍏
GoogleMap.kt 83.83% -16.17% 🍏
Polygon.kt 80.95% -19.05% 🍏
PolylineManagerFlows.kt 78% -22% 🍏
GroundOverlayManagerFlows.kt 78% -22% 🍏
PolygonManagerFlows.kt 78% -22% 🍏
CircleManagerFlows.kt 78% -22% 🍏
Polygon.kt 70.73% -29.27% 🍏
MapsInitializer.kt 66.67% -33.33% 🍏
MarkerManager.kt 60% -40% 🍏
FusedLocationProvider.kt 38.46% -61.54% ❌
LocationManager.kt 35.71% -64.29% ❌
StreetViewUtil.kt 34.02% -3.73% ❌
PolygonManager.kt 33.33% -66.67% ❌
CircleManager.kt 33.33% -66.67% ❌
GroundOverlayManager.kt 33.33% -66.67% ❌
PolylineManager.kt 33.33% -66.67% ❌
GoogleMap.kt 28.44% -71.56% ❌
StreetViewPanoramaView.kt 27.27% -72.73% ❌
Kover Gradle Plugin XML report for :heatmaps WeightedLatLng.kt 100% 🍏
HeatmapTileProvider.kt 92.61% -0.27% 🍏
Gradient.kt 88.4% -1.9% 🍏
Heatmap.kt 15.15% -84.85% ❌
Heatmap.kt 13.73% -86.27% ❌
Kover Gradle Plugin XML report for :ui AnimationUtil.kt 92.7% 🍏
IconGenerator.kt 90.34% 🍏
RotationLayout.kt 88.97% 🍏
SquareTextView.kt 0% 🍏
Kover Gradle Plugin XML report for :data GroundOverlay.kt 100% 🍏
Point.kt 100% 🍏
Style.kt 100% 🍏
Feature.kt 100% 🍏
GroundOverlayStyle.kt 100% 🍏
Geometry.kt 100% 🍏
GeoJsonObjects.kt 96.92% 🍏
LatLngAlt.kt 91.67% 🍏
KmlParser.kt 90.53% -5.33% ❌
GeoJsonParser.kt 89.39% -1.4% ❌
GpxParser.kt 88.68% -8.49% ❌
KmzParser.kt 87.85% -0.4% 🍏
KmlMapper.kt 87.53% 🍏
DataLayer.kt 87.35% 🍏
Layer.kt 86.05% 🍏
MapViewRenderer.kt 76.13% -16.55% 🍏
GpxMapper.kt 69.05% -3.4% ❌
GeoJsonMapper.kt 56.42% 🍏
GeoJsonPolygon.kt 56.25% -2.5% 🍏
GeoJsonLayer.kt 55.37% -10.74% 🍏
KmlModel.kt 53.36% -0.6% 🍏
GpxModel.kt 52.22% -1.37% 🍏
DataScene.kt 52.22% -17.78% ❌
KmlLayer.kt 51.35% -17.09% ❌
Style.kt 51.22% 🍏
UrlIconProvider.kt 48.9% 🍏
GeoJsonPointStyle.kt 35.52% 🍏
KmlPolygon.kt 32.22% -3.33% 🍏
GeoJsonLineStringStyle.kt 22.51% 🍏
GeoJsonPolygonStyle.kt 21.43% 🍏
KmlStyle.kt 8.48% 🍏
GoogleMapRenderer.kt 0.76% -0.96% ❌
DataLayerLoader.kt 0% 🍏
GeoJson.kt 0% ❌
GeoJson.kt 0% ❌
Kml.kt 0% ❌
Kml.kt 0% ❌
Model.kt 0% ❌
MapObject.kt 0% 🍏
Polyline.kt 0% -99.13% ❌
Layer.kt 0% -18.75% ❌
Marker.kt 0% -99.16% ❌
Circle.kt 0% -98.85% ❌
Polygon.kt 0% -94.87% ❌
Kover Gradle Plugin XML report for :clustering ClusterManagerFlows.kt 100% 🍏
ClusterManager.kt 100% 🍏
SphericalMercatorProjection.kt 100% 🍏
CentroidNonHierarchicalDistanceBasedAlgorithm.kt 100% 🍏
NonHierarchicalViewBasedAlgorithm.kt 100% 🍏
AbstractAlgorithm.kt 100% 🍏
ScreenBasedAlgorithmAdapter.kt 100% 🍏
GridBasedAlgorithm.kt 100% 🍏
PreCachingAlgorithmDecorator.kt 100% 🍏
StaticCluster.kt 100% 🍏
Point.kt 100% 🍏
PointExtensions.kt 100% 🍏
Bounds.kt 100% 🍏
ContinuousZoomEuclideanCentroidAlgorithm.kt 99.63% 🍏
NonHierarchicalDistanceBasedAlgorithm.kt 99.48% 🍏
Point.kt 94.87% 🍏
PointQuadTree.kt 94.71% 🍏
ClusterManager.kt 71.59% 🍏
DefaultClusterRenderer.kt 17.25% -2.17% ❌
ClusterRendererMultipleItems.kt 0.15% -3.29% ❌
DefaultAdvancedMarkersClusterRenderer.kt 0% -4.12% ❌

dkhawk added a commit that referenced this pull request Aug 5, 2026
…1716)

- Consolidate Kotlin Extensions (KTX into Utils): Move all reactive Coroutine/Flow extensions (awaitMap, mapClickEvents, cameraMoveEvents) and option builder DSLs (addMarker, addPolyline, addPolygon) from android-maps-ktx directly into android-maps-utils.

- Canonical Non-KTX Packages: Place all reactive Coroutine/Flow extensions and DSL builders in canonical com.google.maps.android.* packages.

- Deprecated Compatibility Layer: Preserve the legacy com.google.maps.android.ktx.* package structure with @deprecated(level = DeprecationLevel.WARNING, replaceWith = ReplaceWith(...)) forwarding wrappers and typealiases so existing imports compile seamlessly with deprecation warnings.

- Multi-Module Integration: Integrate KTX extensions across :library, :clustering, :heatmaps, and :data modules.

- Demo & Test Consolidation: Include KtxExtensionsDemoActivity in :demo and integrate all 18 KTX unit test suites with both canonical and shim test coverage.
@dkhawk
dkhawk force-pushed the feat/migrate-ktx-to-utils branch from 407fded to 96b0801 Compare August 5, 2026 19:48
dkhawk added a commit that referenced this pull request Aug 5, 2026
…1716)

- Consolidate Kotlin Extensions (KTX into Utils): Move all reactive Coroutine/Flow extensions (awaitMap, mapClickEvents, cameraMoveEvents) and option builder DSLs (addMarker, addPolyline, addPolygon) from android-maps-ktx directly into android-maps-utils.

- Canonical Non-KTX Packages: Place all reactive Coroutine/Flow extensions and DSL builders in canonical com.google.maps.android.* packages.

- Deprecated Compatibility Layer: Preserve the legacy com.google.maps.android.ktx.* package structure with @deprecated(level = DeprecationLevel.WARNING, replaceWith = ReplaceWith(...)) forwarding wrappers and typealiases so existing imports compile seamlessly with deprecation warnings.

- Multi-Module Integration: Integrate KTX extensions across :library, :clustering, :heatmaps, and :data modules.

- Demo & Test Consolidation: Include KtxExtensionsDemoActivity in :demo and integrate all 18 KTX unit test suites with both canonical and shim test coverage.
@dkhawk
dkhawk force-pushed the feat/migrate-ktx-to-utils branch from 96b0801 to ff8f979 Compare August 5, 2026 19:56
dkhawk added a commit that referenced this pull request Aug 7, 2026
…1716)

- Consolidate Kotlin Extensions (KTX into Utils): Move all reactive Coroutine/Flow extensions (awaitMap, mapClickEvents, cameraMoveEvents) and option builder DSLs (addMarker, addPolyline, addPolygon) from android-maps-ktx directly into android-maps-utils.

- Canonical Non-KTX Packages: Place all reactive Coroutine/Flow extensions and DSL builders in canonical com.google.maps.android.* packages.

- Deprecated Compatibility Layer: Preserve the legacy com.google.maps.android.ktx.* package structure with @deprecated(level = DeprecationLevel.WARNING, replaceWith = ReplaceWith(...)) forwarding wrappers and typealiases so existing imports compile seamlessly with deprecation warnings.

- Multi-Module Integration: Integrate KTX extensions across :library, :clustering, :heatmaps, and :data modules.

- Demo & Test Consolidation: Include KtxExtensionsDemoActivity in :demo and integrate all 18 KTX unit test suites with both canonical and shim test coverage.
@dkhawk
dkhawk force-pushed the feat/migrate-ktx-to-utils branch 3 times, most recently from d00d357 to f1a4793 Compare August 10, 2026 17:42
dkhawk added a commit that referenced this pull request Aug 20, 2026
…1716)

- Consolidate Kotlin Extensions (KTX into Utils): Move all reactive Coroutine/Flow extensions (awaitMap, mapClickEvents, cameraMoveEvents) and option builder DSLs (addMarker, addPolyline, addPolygon) from android-maps-ktx directly into android-maps-utils.

- Canonical Non-KTX Packages: Place all reactive Coroutine/Flow extensions and DSL builders in canonical com.google.maps.android.* packages.

- Deprecated Compatibility Layer: Preserve the legacy com.google.maps.android.ktx.* package structure with @deprecated(level = DeprecationLevel.WARNING, replaceWith = ReplaceWith(...)) forwarding wrappers and typealiases so existing imports compile seamlessly with deprecation warnings.

- Multi-Module Integration: Integrate KTX extensions across :library, :clustering, :heatmaps, and :data modules.

- Demo & Test Consolidation: Include KtxExtensionsDemoActivity in :demo and integrate all 18 KTX unit test suites with both canonical and shim test coverage.
@dkhawk
dkhawk force-pushed the feat/migrate-ktx-to-utils branch 2 times, most recently from 5cdce08 to 3ce966a Compare August 21, 2026 22:15
dkhawk added a commit that referenced this pull request Aug 31, 2026
…1716)

- Consolidate Kotlin Extensions (KTX into Utils): Move all reactive Coroutine/Flow extensions (awaitMap, mapClickEvents, cameraMoveEvents) and option builder DSLs (addMarker, addPolyline, addPolygon) from android-maps-ktx directly into android-maps-utils.

- Canonical Non-KTX Packages: Place all reactive Coroutine/Flow extensions and DSL builders in canonical com.google.maps.android.* packages.

- Deprecated Compatibility Layer: Preserve the legacy com.google.maps.android.ktx.* package structure with @deprecated(level = DeprecationLevel.WARNING, replaceWith = ReplaceWith(...)) forwarding wrappers and typealiases so existing imports compile seamlessly with deprecation warnings.

- Multi-Module Integration: Integrate KTX extensions across :library, :clustering, :heatmaps, and :data modules.

- Demo & Test Consolidation: Include KtxExtensionsDemoActivity in :demo and integrate all 18 KTX unit test suites with both canonical and shim test coverage.
@dkhawk
dkhawk force-pushed the feat/migrate-ktx-to-utils branch from 3ce966a to 5f6c90f Compare August 31, 2026 23:45
@dkhawk dkhawk changed the title feat: migrate android-maps-ktx into android-maps-utils (v6.0.0-rc01) feat: migrate android-maps-ktx into android-maps-utils (v6.0.0-rc03) Aug 31, 2026
@dkhawk
dkhawk requested a review from LoyalAbbas August 31, 2026 23:59
dkhawk added a commit that referenced this pull request Sep 4, 2026
…1716)

- Consolidate Kotlin Extensions (KTX into Utils): Move all reactive Coroutine/Flow extensions (awaitMap, mapClickEvents, cameraMoveEvents) and option builder DSLs (addMarker, addPolyline, addPolygon) from android-maps-ktx directly into android-maps-utils.

- Canonical Non-KTX Packages: Place all reactive Coroutine/Flow extensions and DSL builders in canonical com.google.maps.android.* packages.

- Deprecated Compatibility Layer: Preserve the legacy com.google.maps.android.ktx.* package structure with @deprecated(level = DeprecationLevel.WARNING, replaceWith = ReplaceWith(...)) forwarding wrappers and typealiases so existing imports compile seamlessly with deprecation warnings.

- Multi-Module Integration: Integrate KTX extensions across :library, :clustering, :heatmaps, and :data modules.

- Demo & Test Consolidation: Include KtxExtensionsDemoActivity in :demo and integrate all 18 KTX unit test suites with both canonical and shim test coverage.
@dkhawk
dkhawk force-pushed the feat/migrate-ktx-to-utils branch from 5f6c90f to a2164ec Compare September 4, 2026 17:10
dkhawk added a commit that referenced this pull request Sep 14, 2026
…1716)

- Consolidate Kotlin Extensions (KTX into Utils): Move all reactive Coroutine/Flow extensions (awaitMap, mapClickEvents, cameraMoveEvents) and option builder DSLs (addMarker, addPolyline, addPolygon) from android-maps-ktx directly into android-maps-utils.

- Canonical Non-KTX Packages: Place all reactive Coroutine/Flow extensions and DSL builders in canonical com.google.maps.android.* packages.

- Deprecated Compatibility Layer: Preserve the legacy com.google.maps.android.ktx.* package structure with @deprecated(level = DeprecationLevel.WARNING, replaceWith = ReplaceWith(...)) forwarding wrappers and typealiases so existing imports compile seamlessly with deprecation warnings.

- Multi-Module Integration: Integrate KTX extensions across :library, :clustering, :heatmaps, and :data modules.

- Demo & Test Consolidation: Include KtxExtensionsDemoActivity in :demo and integrate all 18 KTX unit test suites with both canonical and shim test coverage.
@dkhawk
dkhawk force-pushed the feat/migrate-ktx-to-utils branch from a2164ec to a0a837d Compare September 14, 2026 20:41
@dkhawk dkhawk changed the title feat: migrate android-maps-ktx into android-maps-utils (v6.0.0-rc03) feat!: migrate android-maps-ktx into android-maps-utils (v6.0.0) Sep 14, 2026
@dkhawk
dkhawk marked this pull request as ready for review September 14, 2026 20:46
@dkhawk
dkhawk requested a review from a team as a code owner September 14, 2026 20:46
@dkhawk
dkhawk requested a review from kikoso September 14, 2026 20:58
* for multi-observer configurations.
*/
@RequiresPermission(Manifest.permission.ACCESS_COARSE_LOCATION)
public fun LocationManager.coarseLocationEvents(

@LoyalAbbas LoyalAbbas Sep 28, 2026 •

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Falling back to PASSIVE_PROVIDER here will throw a SecurityException if the caller only holds ACCESS_COARSE_LOCATION, since Android's LocationManagerService strictly requires ACCESS_FINE_LOCATION for passive updates. Also, we should check allProviders.contains(...) before calling requestLocationUpdates in both coarseLocationEvents and fineLocationEvents (and close() the flow if missing) so this doesn't crash with IllegalArgumentException: provider doesn't exist on devices without GPS/network hardware.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great catch! Fixed in 7429314c — removed the PASSIVE_PROVIDER fallback in coarseLocationEvents and added an upfront if (!allProviders.contains(...)) { close(); return@callbackFlow } check in both coarseLocationEvents (NETWORK_PROVIDER) and fineLocationEvents (GPS_PROVIDER), along with unit tests in LocationManagerTest verifying that missing providers complete the flow cleanly without invoking requestLocationUpdates.

…1716)

- Consolidate Kotlin Extensions (KTX into Utils): Move all reactive Coroutine/Flow extensions (awaitMap, mapClickEvents, cameraMoveEvents) and option builder DSLs (addMarker, addPolyline, addPolygon) from android-maps-ktx directly into android-maps-utils.

- Canonical Non-KTX Packages: Place all reactive Coroutine/Flow extensions and DSL builders in canonical com.google.maps.android.* packages.

- Deprecated Compatibility Layer: Preserve the legacy com.google.maps.android.ktx.* package structure with @deprecated(level = DeprecationLevel.WARNING, replaceWith = ReplaceWith(...)) forwarding wrappers and typealiases so existing imports compile seamlessly with deprecation warnings.

- Multi-Module Integration: Integrate KTX extensions across :library, :clustering, :heatmaps, and :data modules.

- Demo & Test Consolidation: Include KtxExtensionsDemoActivity in :demo and integrate all 18 KTX unit test suites with both canonical and shim test coverage.
…aps-ktx

- Add canonical Context.awaitMapsSdkInitialized(preferredRenderer) suspending extension in com.google.maps.android.
- Add deprecated backward-compatibility shim in com.google.maps.android.ktx.
- Add canonical and shim unit test suites for MapsInitializer coroutine extensions.
- Showcase awaitMapsSdkInitialized in KtxExtensionsDemoActivity and register demo in MainActivity.
- Update README.md documentation with awaitMapsSdkInitialized usage example.
@dkhawk
dkhawk force-pushed the feat/migrate-ktx-to-utils branch from e7d9d13 to 7dbc806 Compare September 30, 2026 16:43
@dkhawk
dkhawk requested review from LoyalAbbas and kikoso September 30, 2026 16:51

@kikoso kikoso left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM!

)

* fix: resolve 10 defects uncovered by Android Maps Testing Toolkit

Fixes 10 production issues across `:data`, `:heatmaps`, `:clustering`,
`:library`, and `:ui` uncovered by deterministic JVM and visual testing
with Android Maps Testing Toolkit v1.1.0-rc01:

1. `:data` (`KmlLayer`): Cache `KmlGroundOverlay -> ModelFeature` in
   `mGroundOverlayMap` so `removeLayerFromMap()` removes ground overlays
   from `MapViewRenderer`'s `IdentityHashMap` instead of leaking them.
2. `:data` (`Style`, `MapViewRenderer`, `GeoJsonLayer`, `KmlLayer`):
   Propagate `clickable` (defaulting to `true`) and `visible` to
   `PolylineOptions` and `PolygonOptions` so GeoJSON and KML polygons
   and polylines dispatch `OnFeatureClickListener` callbacks.
3. `:data` (`GeoJsonLayer`, `KmlLayer`, `MapViewRenderer`): Route
   markers, polygons, polylines, and ground overlays through passed-in
   `MarkerManager`, `PolygonManager`, `PolylineManager`, and
   `GroundOverlayManager` collections when provided, and register click
   listeners on those collections instead of clobbering global
   `GoogleMap` click listeners.
4. `:data` (`KmlLayer`, `GeoJsonLayer`, `Style`, `MapViewRenderer`):
   Aggregate placemarks and ground overlays from `<Document>` containers
   in `hasPlacemarks()`, `getPlacemarks()`, `features`, and
   `getGroundOverlays()`, and preserve styles on `MultiGeometry`
   features via `CompositeStyle`.
5. `:data` (`GeoJsonLayer`, `Style`, `MapViewRenderer`): Propagate
   `GeoJsonPointStyle` `title`, `snippet`, `isDraggable`, `isFlat`,
   `isVisible`, `infoWindowAnchorU/V`, and custom `icon` (`BitmapDescriptor`)
   to `MarkerOptions` and `AdvancedMarkerOptions`.
6. `:heatmaps` (`HeatmapTileProvider`): Clamp `zoom` when indexing
   `maxIntensity` (preventing `ArrayIndexOutOfBoundsException` at zoom
   level 22) and clamp `bucketX`/`bucketY` to `0 until gridDim` so points
   on the inclusive upper boundary `maxX`/`maxY` do not throw
   `ArrayIndexOutOfBoundsException`.
7. `:heatmaps` (`HeatmapTileProvider`): Check `&& wrappedPoints.isEmpty()`
   before returning `TileProvider.NO_TILE` so cross-antimeridian points
   render across the International Date Line, and enforce `MIN_RADIUS..MAX_RADIUS`
   and `0.0..1.0` bounds validation in `setRadius` and `setOpacity`.
8. `:clustering` (`DefaultClusterRenderer`): Clear stale `marker.title`
   and `marker.snippet` when a `ClusterItem`'s title/snippet is updated
   to `null`, and update `marker.zIndex` in `onClusterItemUpdated` even
   when `position` is unchanged.
9. `:library` (`MapObjectManager`): Invoke `setListenersOnUiThread()`
   synchronously when constructed on the main thread instead of
   unconditionally posting to the back of the main looper queue.
10. `:ui` (`AnimationUtil`, `IconGenerator`, `RotationLayout`): Snap
    directly to `finalPosition` when `durationInMs <= 0L` (avoiding
    `0 / 0.0f = NaN`), clamp `t` to `[0f, 1f]` so
    `AccelerateDecelerateInterpolator` never rebounds on frame overshoot,
    and use `degrees.mod(360)` so negative multi-turn rotations do not
    throw `IllegalStateException`.

* fix: address PR review comments on layer managers, KML accessors, Style, and cluster renderers
… (.api dumps) (#1800)

* chore: enable Kotlin explicitApi() and Binary Compatibility Validator (.api dumps)

- Enable kotlin explicitApi() across published modules (:library, :clustering, :data, :heatmaps, :ui)
- Add explicit public visibility and return types to all public Kotlin symbols across modules
- Configure Binary Compatibility Validator (BCV) for AGP 9.3 via build-logic convention plugin and root aggregate tasks
- Generate and commit baseline .api dumps for :library, :clustering, :data, :heatmaps, and :ui
- Add apiCheck to the CI Pull Request test workflow

Fixes #1794

* fix: restore public visibility on ResponseStreetView and update library.api
@dkhawk
dkhawk removed the request for review from LoyalAbbas September 30, 2026 23:35
@dkhawk
dkhawk merged commit de264f8 into main Sep 30, 2026
12 checks passed
@dkhawk
dkhawk deleted the feat/migrate-ktx-to-utils branch September 30, 2026 23:37
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants