diff --git a/packages/google_maps_flutter/google_maps_flutter_android/CHANGELOG.md b/packages/google_maps_flutter/google_maps_flutter_android/CHANGELOG.md index d19b5b24f8c0..6ce7cb2dd0e4 100644 --- a/packages/google_maps_flutter/google_maps_flutter_android/CHANGELOG.md +++ b/packages/google_maps_flutter/google_maps_flutter_android/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.19.6 + +* Fixes the onTap callback for clustered pin info window taps. + ## 2.19.5 * Fixes a crash when using the legacy map renderer by adding the `org.apache.http.legacy` library. diff --git a/packages/google_maps_flutter/google_maps_flutter_android/android/src/main/java/io/flutter/plugins/googlemaps/ClusterManagersController.java b/packages/google_maps_flutter/google_maps_flutter_android/android/src/main/java/io/flutter/plugins/googlemaps/ClusterManagersController.java index 0b28e6a485ec..5921d690a0de 100644 --- a/packages/google_maps_flutter/google_maps_flutter_android/android/src/main/java/io/flutter/plugins/googlemaps/ClusterManagersController.java +++ b/packages/google_maps_flutter/google_maps_flutter_android/android/src/main/java/io/flutter/plugins/googlemaps/ClusterManagersController.java @@ -46,6 +46,10 @@ class ClusterManagersController @Nullable private ClusterManager.OnClusterItemClickListener clusterItemClickListener; + @Nullable + private ClusterManager.OnClusterItemInfoWindowClickListener + clusterItemInfoWindowClickListener; + @Nullable private ClusterManagersController.OnClusterItemRendered clusterItemRenderedListener; @@ -71,6 +75,12 @@ void setClusterItemClickListener( initListenersForClusterManagers(); } + void setClusterItemInfoWindowClickListener( + @Nullable ClusterManager.OnClusterItemInfoWindowClickListener listener) { + clusterItemInfoWindowClickListener = listener; + initListenersForClusterManagers(); + } + void setClusterItemRenderedListener( @Nullable ClusterManagersController.OnClusterItemRendered listener) { clusterItemRenderedListener = listener; @@ -79,16 +89,21 @@ void setClusterItemRenderedListener( private void initListenersForClusterManagers() { for (Map.Entry> entry : clusterManagerIdToManager.entrySet()) { - initListenersForClusterManager(entry.getValue(), this, clusterItemClickListener); + initListenersForClusterManager( + entry.getValue(), this, clusterItemClickListener, clusterItemInfoWindowClickListener); } } private void initListenersForClusterManager( ClusterManager clusterManager, @Nullable ClusterManager.OnClusterClickListener clusterClickListener, - @Nullable ClusterManager.OnClusterItemClickListener clusterItemClickListener) { + @Nullable ClusterManager.OnClusterItemClickListener clusterItemClickListener, + @Nullable + ClusterManager.OnClusterItemInfoWindowClickListener + clusterItemInfoWindowClickListener) { clusterManager.setOnClusterClickListener(clusterClickListener); clusterManager.setOnClusterItemClickListener(clusterItemClickListener); + clusterManager.setOnClusterItemInfoWindowClickListener(clusterItemInfoWindowClickListener); } /** Adds new ClusterManagers to the controller. */ @@ -123,7 +138,8 @@ private void initializeRenderer(ClusterManager clusterManager) { break; } clusterManager.setRenderer(clusterRenderer); - initListenersForClusterManager(clusterManager, this, clusterItemClickListener); + initListenersForClusterManager( + clusterManager, this, clusterItemClickListener, clusterItemInfoWindowClickListener); } /** Removes ClusterManagers by given cluster manager IDs from the controller. */ @@ -145,7 +161,7 @@ private void removeClusterManager(Object clusterManagerId) { if (clusterManager == null) { return; } - initListenersForClusterManager(clusterManager, null, null); + initListenersForClusterManager(clusterManager, null, null, null); clusterManager.clearItems(); clusterManager.cluster(); } diff --git a/packages/google_maps_flutter/google_maps_flutter_android/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapController.java b/packages/google_maps_flutter/google_maps_flutter_android/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapController.java index 5a29cd588086..8da755db70ed 100644 --- a/packages/google_maps_flutter/google_maps_flutter_android/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapController.java +++ b/packages/google_maps_flutter/google_maps_flutter_android/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapController.java @@ -62,6 +62,7 @@ class GoogleMapController implements ActivityPluginBinding.OnSaveInstanceStateListener, ClusterManager.OnClusterItemClickListener, + ClusterManager.OnClusterItemInfoWindowClickListener, ClusterManagersController.OnClusterItemRendered, DefaultLifecycleObserver, GoogleMapListener, @@ -223,6 +224,7 @@ public void onMapReady(@NonNull GoogleMap googleMap) { groundOverlaysController.setGoogleMap(googleMap); setMarkerCollectionListener(this); setClusterItemClickListener(this); + setClusterItemInfoWindowClickListener(this); setClusterItemRenderedListener(this); updateInitialClusterManagers(); updateInitialMarkers(); @@ -398,6 +400,7 @@ public void dispose() { setGoogleMapListener(null); setMarkerCollectionListener(null); setClusterItemClickListener(null); + setClusterItemInfoWindowClickListener(null); setClusterItemRenderedListener(null); destroyMapViewIfNecessary(); Lifecycle lifecycle = lifecycleProvider.getLifecycle(); @@ -445,6 +448,17 @@ public void setClusterItemClickListener( clusterManagersController.setClusterItemClickListener(listener); } + @VisibleForTesting + public void setClusterItemInfoWindowClickListener( + @Nullable ClusterManager.OnClusterItemInfoWindowClickListener listener) { + if (googleMap == null) { + Log.v(TAG, "Controller was disposed before GoogleMap was ready."); + return; + } + + clusterManagersController.setClusterItemInfoWindowClickListener(listener); + } + @VisibleForTesting public void setClusterItemRenderedListener( @Nullable ClusterManagersController.OnClusterItemRendered listener) { @@ -827,6 +841,11 @@ public boolean onClusterItemClick(MarkerBuilder item) { return markersController.onMarkerTap(item.markerId()); } + @Override + public void onClusterItemInfoWindowClick(MarkerBuilder item) { + markersController.onClusterItemInfoWindowTap(item.markerId()); + } + public void setMapStyle(@Nullable String style) { if (googleMap == null) { initialMapStyle = style; diff --git a/packages/google_maps_flutter/google_maps_flutter_android/android/src/main/java/io/flutter/plugins/googlemaps/MarkersController.java b/packages/google_maps_flutter/google_maps_flutter_android/android/src/main/java/io/flutter/plugins/googlemaps/MarkersController.java index 7f95e5d44efe..68550f3daee9 100644 --- a/packages/google_maps_flutter/google_maps_flutter_android/android/src/main/java/io/flutter/plugins/googlemaps/MarkersController.java +++ b/packages/google_maps_flutter/google_maps_flutter_android/android/src/main/java/io/flutter/plugins/googlemaps/MarkersController.java @@ -307,6 +307,14 @@ void onInfoWindowTap(String googleMarkerId) { flutterApi.onInfoWindowTap(markerId, new NoOpVoidResult()); } + /** + * Called when a cluster-managed marker's info window is tapped. Takes the Dart marker ID + * directly. + */ + void onClusterItemInfoWindowTap(String markerId) { + flutterApi.onInfoWindowTap(markerId, new NoOpVoidResult()); + } + /** * Called each time clusterManager adds new visible marker to the map. Creates markerController * for marker for realtime marker updates. diff --git a/packages/google_maps_flutter/google_maps_flutter_android/android/src/test/java/io/flutter/plugins/googlemaps/GoogleMapControllerTest.java b/packages/google_maps_flutter/google_maps_flutter_android/android/src/test/java/io/flutter/plugins/googlemaps/GoogleMapControllerTest.java index 42ca991ef712..d063cb17317a 100644 --- a/packages/google_maps_flutter/google_maps_flutter_android/android/src/test/java/io/flutter/plugins/googlemaps/GoogleMapControllerTest.java +++ b/packages/google_maps_flutter/google_maps_flutter_android/android/src/test/java/io/flutter/plugins/googlemaps/GoogleMapControllerTest.java @@ -185,6 +185,21 @@ public void OnMapReadySetsClusterItemClickListener() { verify(spyGoogleMapController, times(1)).setClusterItemClickListener(null); } + @Test + @SuppressWarnings("unchecked") + public void OnMapReadySetsClusterItemInfoWindowClickListener() { + GoogleMapController googleMapController = getGoogleMapController(); + GoogleMapController spyGoogleMapController = spy(googleMapController); + spyGoogleMapController.onMapReady(mockGoogleMap); + + verify(spyGoogleMapController, times(1)) + .setClusterItemInfoWindowClickListener( + any(ClusterManager.OnClusterItemInfoWindowClickListener.class)); + + spyGoogleMapController.dispose(); + verify(spyGoogleMapController, times(1)).setClusterItemInfoWindowClickListener(null); + } + @Test @SuppressWarnings("unchecked") public void OnMapReadySetsClusterItemRenderedListener() { @@ -235,6 +250,15 @@ public void OnClusterItemClickCallsMarkersController() { verify(mockMarkersController, times(1)).onMarkerTap(markerBuilder.markerId()); } + @Test + public void OnClusterItemInfoWindowClickCallsMarkersController() { + GoogleMapController googleMapController = getGoogleMapControllerWithMockedDependencies(); + MarkerBuilder markerBuilder = new MarkerBuilder("m_1", "cm_1", PlatformMarkerType.MARKER); + + googleMapController.onClusterItemInfoWindowClick(markerBuilder); + verify(mockMarkersController, times(1)).onClusterItemInfoWindowTap(markerBuilder.markerId()); + } + @Test public void SetInitialHeatmaps() { GoogleMapController googleMapController = getGoogleMapControllerWithMockedDependencies(); diff --git a/packages/google_maps_flutter/google_maps_flutter_android/pubspec.yaml b/packages/google_maps_flutter/google_maps_flutter_android/pubspec.yaml index 748e38273331..dea5e50d236c 100644 --- a/packages/google_maps_flutter/google_maps_flutter_android/pubspec.yaml +++ b/packages/google_maps_flutter/google_maps_flutter_android/pubspec.yaml @@ -2,7 +2,7 @@ name: google_maps_flutter_android description: Android implementation of the google_maps_flutter plugin. repository: https://github.com/flutter/packages/tree/main/packages/google_maps_flutter/google_maps_flutter_android issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+maps%22 -version: 2.19.5 +version: 2.19.6 environment: sdk: ^3.9.0