diff --git a/library/src/main/java/com/google/maps/android/clustering/ClusterManager.java b/library/src/main/java/com/google/maps/android/clustering/ClusterManager.java index 52474f2f5..6fd7f56ea 100644 --- a/library/src/main/java/com/google/maps/android/clustering/ClusterManager.java +++ b/library/src/main/java/com/google/maps/android/clustering/ClusterManager.java @@ -65,8 +65,10 @@ public class ClusterManager implements private OnClusterItemClickListener mOnClusterItemClickListener; private OnClusterInfoWindowClickListener mOnClusterInfoWindowClickListener; + private OnClusterInfoWindowCloseListener mOnClusterInfoWindowCloseListener; private OnClusterInfoWindowLongClickListener mOnClusterInfoWindowLongClickListener; private OnClusterItemInfoWindowClickListener mOnClusterItemInfoWindowClickListener; + private OnClusterItemInfoWindowCloseListener mOnClusterItemInfoWindowCloseListener; private OnClusterItemInfoWindowLongClickListener mOnClusterItemInfoWindowLongClickListener; private OnClusterClickListener mOnClusterClickListener; @@ -109,9 +111,11 @@ public void setRenderer(ClusterRenderer renderer) { mRenderer.onAdd(); mRenderer.setOnClusterClickListener(mOnClusterClickListener); mRenderer.setOnClusterInfoWindowClickListener(mOnClusterInfoWindowClickListener); + mRenderer.setOnClusterInfoWindowCloseListener(mOnClusterInfoWindowCloseListener); mRenderer.setOnClusterInfoWindowLongClickListener(mOnClusterInfoWindowLongClickListener); mRenderer.setOnClusterItemClickListener(mOnClusterItemClickListener); mRenderer.setOnClusterItemInfoWindowClickListener(mOnClusterItemInfoWindowClickListener); + mRenderer.setOnClusterItemInfoWindowCloseListener(mOnClusterItemInfoWindowCloseListener); mRenderer.setOnClusterItemInfoWindowLongClickListener(mOnClusterItemInfoWindowLongClickListener); cluster(); } @@ -370,6 +374,16 @@ public void setOnClusterInfoWindowClickListener(OnClusterInfoWindowClickListener mRenderer.setOnClusterInfoWindowClickListener(listener); } + /** + * Sets a callback that's invoked when a Cluster info window is closed. Note: For this listener to function, + * the ClusterManager must be added as a info window click listener to the map. + */ + public void setOnClusterInfoWindowCloseListener(OnClusterInfoWindowCloseListener listener) { + mOnClusterInfoWindowCloseListener = listener; + mRenderer.setOnClusterInfoWindowCloseListener(listener); + } + + /** * Sets a callback that's invoked when a Cluster info window is long-pressed. Note: For this listener to function, * the ClusterManager must be added as a info window click listener to the map. @@ -397,6 +411,16 @@ public void setOnClusterItemInfoWindowClickListener(OnClusterItemInfoWindowClick mRenderer.setOnClusterItemInfoWindowClickListener(listener); } + + /** + * Sets a callback that's invoked when an individual ClusterItem's Info Window is closed. Note: For this + * listener to function, the ClusterManager must be added as a info window click listener to the map. + */ + public void setOnClusterItemInfoWindowCloseListener(OnClusterItemInfoWindowCloseListener listener) { + mOnClusterItemInfoWindowCloseListener = listener; + mRenderer.setOnClusterItemInfoWindowCloseListener(listener); + } + /** * Sets a callback that's invoked when an individual ClusterItem's Info Window is long-pressed. Note: For this * listener to function, the ClusterManager must be added as a info window click listener to the map. @@ -425,6 +449,13 @@ public interface OnClusterInfoWindowClickListener { void onClusterInfoWindowClick(Cluster cluster); } + /** + * Called when a Cluster's Info Window is closed. + */ + public interface OnClusterInfoWindowCloseListener { + void onClusterInfoWindowClose(Cluster cluster); + } + /** * Called when a Cluster's Info Window is long clicked. */ @@ -456,6 +487,13 @@ public interface OnClusterItemInfoWindowClickListener { void onClusterItemInfoWindowClick(T item); } + /** + * Called when an individual ClusterItem's Info Window is closed. + */ + public interface OnClusterItemInfoWindowCloseListener { + void onClusterItemInfoWindowClose(T item); + } + /** * Called when an individual ClusterItem's Info Window is long clicked. */ diff --git a/library/src/main/java/com/google/maps/android/clustering/view/ClusterRenderer.java b/library/src/main/java/com/google/maps/android/clustering/view/ClusterRenderer.java index 974c5bddd..462606039 100644 --- a/library/src/main/java/com/google/maps/android/clustering/view/ClusterRenderer.java +++ b/library/src/main/java/com/google/maps/android/clustering/view/ClusterRenderer.java @@ -40,12 +40,16 @@ public interface ClusterRenderer { void setOnClusterInfoWindowClickListener(ClusterManager.OnClusterInfoWindowClickListener listener); + void setOnClusterInfoWindowCloseListener(ClusterManager.OnClusterInfoWindowCloseListener listener); + void setOnClusterInfoWindowLongClickListener(ClusterManager.OnClusterInfoWindowLongClickListener listener); void setOnClusterItemClickListener(ClusterManager.OnClusterItemClickListener listener); void setOnClusterItemInfoWindowClickListener(ClusterManager.OnClusterItemInfoWindowClickListener listener); + void setOnClusterItemInfoWindowCloseListener(ClusterManager.OnClusterItemInfoWindowCloseListener listener); + void setOnClusterItemInfoWindowLongClickListener(ClusterManager.OnClusterItemInfoWindowLongClickListener listener); /** diff --git a/library/src/main/java/com/google/maps/android/clustering/view/ClusterRendererMultipleItems.java b/library/src/main/java/com/google/maps/android/clustering/view/ClusterRendererMultipleItems.java index 9b1c5adf2..33ec75ee6 100644 --- a/library/src/main/java/com/google/maps/android/clustering/view/ClusterRendererMultipleItems.java +++ b/library/src/main/java/com/google/maps/android/clustering/view/ClusterRendererMultipleItems.java @@ -172,9 +172,11 @@ public void setAnimationType(AnimationType type) { private ClusterManager.OnClusterClickListener mClickListener; private ClusterManager.OnClusterInfoWindowClickListener mInfoWindowClickListener; + private ClusterManager.OnClusterInfoWindowCloseListener mInfoWindowCloseListener; private ClusterManager.OnClusterInfoWindowLongClickListener mInfoWindowLongClickListener; private ClusterManager.OnClusterItemClickListener mItemClickListener; private ClusterManager.OnClusterItemInfoWindowClickListener mItemInfoWindowClickListener; + private ClusterManager.OnClusterItemInfoWindowCloseListener mItemInfoWindowCloseListener; private ClusterManager.OnClusterItemInfoWindowLongClickListener mItemInfoWindowLongClickListener; public ClusterRendererMultipleItems(Context context, GoogleMap map, ClusterManager clusterManager) { @@ -205,6 +207,13 @@ public void onAdd() { } }); + mClusterManager.getMarkerCollection().setOnInfoWindowCloseListener(marker -> { + RendererLogger.d("ClusterRenderer", "Info window closed for marker: " + marker); + if (mItemInfoWindowCloseListener != null) { + mItemInfoWindowCloseListener.onClusterItemInfoWindowClose(mMarkerCache.get(marker)); + } + }); + mClusterManager.getMarkerCollection().setOnInfoWindowLongClickListener(marker -> { RendererLogger.d("ClusterRenderer", "Info window long-clicked for marker: " + marker); if (mItemInfoWindowLongClickListener != null) { @@ -223,6 +232,13 @@ public void onAdd() { } }); + mClusterManager.getClusterMarkerCollection().setOnInfoWindowCloseListener(marker -> { + RendererLogger.d("ClusterRenderer", "Info window closed for cluster marker: " + marker); + if (mInfoWindowCloseListener != null) { + mInfoWindowCloseListener.onClusterInfoWindowClose(mClusterMarkerCache.get(marker)); + } + }); + mClusterManager.getClusterMarkerCollection().setOnInfoWindowLongClickListener(marker -> { RendererLogger.d("ClusterRenderer", "Info window long-clicked for cluster marker: " + marker); if (mInfoWindowLongClickListener != null) { @@ -236,9 +252,11 @@ public void onAdd() { public void onRemove() { mClusterManager.getMarkerCollection().setOnMarkerClickListener(null); mClusterManager.getMarkerCollection().setOnInfoWindowClickListener(null); + mClusterManager.getMarkerCollection().setOnInfoWindowCloseListener(null); mClusterManager.getMarkerCollection().setOnInfoWindowLongClickListener(null); mClusterManager.getClusterMarkerCollection().setOnMarkerClickListener(null); mClusterManager.getClusterMarkerCollection().setOnInfoWindowClickListener(null); + mClusterManager.getClusterMarkerCollection().setOnInfoWindowCloseListener(null); mClusterManager.getClusterMarkerCollection().setOnInfoWindowLongClickListener(null); } @@ -591,6 +609,11 @@ public void setOnClusterInfoWindowClickListener(ClusterManager.OnClusterInfoWind mInfoWindowClickListener = listener; } + @Override + public void setOnClusterInfoWindowCloseListener(ClusterManager.OnClusterInfoWindowCloseListener listener) { + mInfoWindowCloseListener = listener; + } + @Override public void setOnClusterInfoWindowLongClickListener(ClusterManager.OnClusterInfoWindowLongClickListener listener) { mInfoWindowLongClickListener = listener; @@ -606,6 +629,11 @@ public void setOnClusterItemInfoWindowClickListener(ClusterManager.OnClusterItem mItemInfoWindowClickListener = listener; } + @Override + public void setOnClusterItemInfoWindowCloseListener(ClusterManager.OnClusterItemInfoWindowCloseListener listener) { + mItemInfoWindowCloseListener = listener; + } + @Override public void setOnClusterItemInfoWindowLongClickListener(ClusterManager.OnClusterItemInfoWindowLongClickListener listener) { mItemInfoWindowLongClickListener = listener; diff --git a/library/src/main/java/com/google/maps/android/clustering/view/DefaultAdvancedMarkersClusterRenderer.java b/library/src/main/java/com/google/maps/android/clustering/view/DefaultAdvancedMarkersClusterRenderer.java index f79207cde..96eaaa457 100644 --- a/library/src/main/java/com/google/maps/android/clustering/view/DefaultAdvancedMarkersClusterRenderer.java +++ b/library/src/main/java/com/google/maps/android/clustering/view/DefaultAdvancedMarkersClusterRenderer.java @@ -127,9 +127,11 @@ public class DefaultAdvancedMarkersClusterRenderer implem private ClusterManager.OnClusterClickListener mClickListener; private ClusterManager.OnClusterInfoWindowClickListener mInfoWindowClickListener; + private ClusterManager.OnClusterInfoWindowCloseListener mInfoWindowCloseListener; private ClusterManager.OnClusterInfoWindowLongClickListener mInfoWindowLongClickListener; private ClusterManager.OnClusterItemClickListener mItemClickListener; private ClusterManager.OnClusterItemInfoWindowClickListener mItemInfoWindowClickListener; + private ClusterManager.OnClusterItemInfoWindowCloseListener mItemInfoWindowCloseListener; private ClusterManager.OnClusterItemInfoWindowLongClickListener mItemInfoWindowLongClickListener; public DefaultAdvancedMarkersClusterRenderer(Context context, GoogleMap map, ClusterManager clusterManager) { @@ -162,6 +164,15 @@ public void onInfoWindowClick(@NonNull Marker marker) { } }); + mClusterManager.getMarkerCollection().setOnInfoWindowCloseListener(new GoogleMap.OnInfoWindowCloseListener() { + @Override + public void onInfoWindowClose(@NonNull Marker marker) { + if (mItemInfoWindowCloseListener != null) { + mItemInfoWindowCloseListener.onClusterItemInfoWindowClose(mMarkerCache.get(marker)); + } + } + }); + mClusterManager.getMarkerCollection().setOnInfoWindowLongClickListener(marker -> { if (mItemInfoWindowLongClickListener != null) { mItemInfoWindowLongClickListener.onClusterItemInfoWindowLongClick(mMarkerCache.get(marker)); @@ -177,6 +188,12 @@ public void onInfoWindowClick(@NonNull Marker marker) { } }); + mClusterManager.getClusterMarkerCollection().setOnInfoWindowCloseListener(marker -> { + if (mInfoWindowCloseListener != null) { + mInfoWindowCloseListener.onClusterInfoWindowClose(mClusterMarkerCache.get(marker)); + } + }); + mClusterManager.getClusterMarkerCollection().setOnInfoWindowLongClickListener(marker -> { if (mInfoWindowLongClickListener != null) { mInfoWindowLongClickListener.onClusterInfoWindowLongClick(mClusterMarkerCache.get(marker)); @@ -188,9 +205,11 @@ public void onInfoWindowClick(@NonNull Marker marker) { public void onRemove() { mClusterManager.getMarkerCollection().setOnMarkerClickListener(null); mClusterManager.getMarkerCollection().setOnInfoWindowClickListener(null); + mClusterManager.getMarkerCollection().setOnInfoWindowCloseListener(null); mClusterManager.getMarkerCollection().setOnInfoWindowLongClickListener(null); mClusterManager.getClusterMarkerCollection().setOnMarkerClickListener(null); mClusterManager.getClusterMarkerCollection().setOnInfoWindowClickListener(null); + mClusterManager.getClusterMarkerCollection().setOnInfoWindowCloseListener(null); mClusterManager.getClusterMarkerCollection().setOnInfoWindowLongClickListener(null); } @@ -543,6 +562,11 @@ public void setOnClusterInfoWindowClickListener(ClusterManager.OnClusterInfoWind mInfoWindowClickListener = listener; } + @Override + public void setOnClusterInfoWindowCloseListener(ClusterManager.OnClusterInfoWindowCloseListener listener) { + mInfoWindowCloseListener = listener; + } + @Override public void setOnClusterInfoWindowLongClickListener(ClusterManager.OnClusterInfoWindowLongClickListener listener) { mInfoWindowLongClickListener = listener; @@ -558,6 +582,11 @@ public void setOnClusterItemInfoWindowClickListener(ClusterManager.OnClusterItem mItemInfoWindowClickListener = listener; } + @Override + public void setOnClusterItemInfoWindowCloseListener(ClusterManager.OnClusterItemInfoWindowCloseListener listener) { + mItemInfoWindowCloseListener = listener; + } + @Override public void setOnClusterItemInfoWindowLongClickListener(ClusterManager.OnClusterItemInfoWindowLongClickListener listener) { mItemInfoWindowLongClickListener = listener; diff --git a/library/src/main/java/com/google/maps/android/clustering/view/DefaultClusterRenderer.java b/library/src/main/java/com/google/maps/android/clustering/view/DefaultClusterRenderer.java index 08ab0e081..460d08b3e 100644 --- a/library/src/main/java/com/google/maps/android/clustering/view/DefaultClusterRenderer.java +++ b/library/src/main/java/com/google/maps/android/clustering/view/DefaultClusterRenderer.java @@ -126,9 +126,11 @@ public class DefaultClusterRenderer implements ClusterRen private ClusterManager.OnClusterClickListener mClickListener; private ClusterManager.OnClusterInfoWindowClickListener mInfoWindowClickListener; + private ClusterManager.OnClusterInfoWindowCloseListener mInfoWindowCloseListener; private ClusterManager.OnClusterInfoWindowLongClickListener mInfoWindowLongClickListener; private ClusterManager.OnClusterItemClickListener mItemClickListener; private ClusterManager.OnClusterItemInfoWindowClickListener mItemInfoWindowClickListener; + private ClusterManager.OnClusterItemInfoWindowCloseListener mItemInfoWindowCloseListener; private ClusterManager.OnClusterItemInfoWindowLongClickListener mItemInfoWindowLongClickListener; public DefaultClusterRenderer(Context context, GoogleMap map, ClusterManager clusterManager) { @@ -153,6 +155,12 @@ public void onAdd() { } }); + mClusterManager.getMarkerCollection().setOnInfoWindowCloseListener(marker -> { + if (mItemInfoWindowCloseListener != null) { + mItemInfoWindowCloseListener.onClusterItemInfoWindowClose(mMarkerCache.get(marker)); + } + }); + mClusterManager.getMarkerCollection().setOnInfoWindowLongClickListener(marker -> { if (mItemInfoWindowLongClickListener != null) { mItemInfoWindowLongClickListener.onClusterItemInfoWindowLongClick(mMarkerCache.get(marker)); @@ -168,6 +176,12 @@ public void onAdd() { } }); + mClusterManager.getClusterMarkerCollection().setOnInfoWindowCloseListener(marker -> { + if (mInfoWindowCloseListener != null) { + mInfoWindowCloseListener.onClusterInfoWindowClose(mClusterMarkerCache.get(marker)); + } + }); + mClusterManager.getClusterMarkerCollection().setOnInfoWindowLongClickListener(marker -> { if (mInfoWindowLongClickListener != null) { mInfoWindowLongClickListener.onClusterInfoWindowLongClick(mClusterMarkerCache.get(marker)); @@ -179,9 +193,11 @@ public void onAdd() { public void onRemove() { mClusterManager.getMarkerCollection().setOnMarkerClickListener(null); mClusterManager.getMarkerCollection().setOnInfoWindowClickListener(null); + mClusterManager.getMarkerCollection().setOnInfoWindowCloseListener(null); mClusterManager.getMarkerCollection().setOnInfoWindowLongClickListener(null); mClusterManager.getClusterMarkerCollection().setOnMarkerClickListener(null); mClusterManager.getClusterMarkerCollection().setOnInfoWindowClickListener(null); + mClusterManager.getClusterMarkerCollection().setOnInfoWindowCloseListener(null); mClusterManager.getClusterMarkerCollection().setOnInfoWindowLongClickListener(null); } @@ -534,6 +550,11 @@ public void setOnClusterInfoWindowClickListener(ClusterManager.OnClusterInfoWind mInfoWindowClickListener = listener; } + @Override + public void setOnClusterInfoWindowCloseListener(ClusterManager.OnClusterInfoWindowCloseListener listener) { + mInfoWindowCloseListener = listener; + } + @Override public void setOnClusterInfoWindowLongClickListener(ClusterManager.OnClusterInfoWindowLongClickListener listener) { mInfoWindowLongClickListener = listener; @@ -549,6 +570,11 @@ public void setOnClusterItemInfoWindowClickListener(ClusterManager.OnClusterItem mItemInfoWindowClickListener = listener; } + @Override + public void setOnClusterItemInfoWindowCloseListener(ClusterManager.OnClusterItemInfoWindowCloseListener listener) { + mItemInfoWindowCloseListener = listener; + } + @Override public void setOnClusterItemInfoWindowLongClickListener(ClusterManager.OnClusterItemInfoWindowLongClickListener listener) { mItemInfoWindowLongClickListener = listener; diff --git a/library/src/main/java/com/google/maps/android/collections/MarkerManager.java b/library/src/main/java/com/google/maps/android/collections/MarkerManager.java index 70cb7f927..b44ce48a9 100644 --- a/library/src/main/java/com/google/maps/android/collections/MarkerManager.java +++ b/library/src/main/java/com/google/maps/android/collections/MarkerManager.java @@ -34,6 +34,7 @@ */ public class MarkerManager extends MapObjectManager implements GoogleMap.OnInfoWindowClickListener, + GoogleMap.OnInfoWindowCloseListener, GoogleMap.OnMarkerClickListener, GoogleMap.OnMarkerDragListener, GoogleMap.InfoWindowAdapter, @@ -47,6 +48,7 @@ public MarkerManager(GoogleMap map) { void setListenersOnUiThread() { if (mMap != null) { mMap.setOnInfoWindowClickListener(this); + mMap.setOnInfoWindowCloseListener(this); mMap.setOnInfoWindowLongClickListener(this); mMap.setOnMarkerClickListener(this); mMap.setOnMarkerDragListener(this); @@ -84,6 +86,14 @@ public void onInfoWindowClick(@NonNull Marker marker) { } } + @Override + public void onInfoWindowClose(@NonNull Marker marker) { + Collection collection = mAllObjects.get(marker); + if (collection != null && collection.mInfoWindowCloseListener != null) { + collection.mInfoWindowCloseListener.onInfoWindowClose(marker); + } + } + @Override public void onInfoWindowLongClick(@NonNull Marker marker) { Collection collection = mAllObjects.get(marker); @@ -132,6 +142,7 @@ protected void removeObjectFromMap(Marker object) { public class Collection extends MapObjectManager.Collection { private GoogleMap.OnInfoWindowClickListener mInfoWindowClickListener; + private GoogleMap.OnInfoWindowCloseListener mInfoWindowCloseListener; private GoogleMap.OnInfoWindowLongClickListener mInfoWindowLongClickListener; private GoogleMap.OnMarkerClickListener mMarkerClickListener; private GoogleMap.OnMarkerDragListener mMarkerDragListener; @@ -187,6 +198,10 @@ public void setOnInfoWindowClickListener(GoogleMap.OnInfoWindowClickListener inf mInfoWindowClickListener = infoWindowClickListener; } + public void setOnInfoWindowCloseListener(GoogleMap.OnInfoWindowCloseListener infoWindowCloseListener) { + mInfoWindowCloseListener = infoWindowCloseListener; + } + public void setOnInfoWindowLongClickListener(GoogleMap.OnInfoWindowLongClickListener infoWindowLongClickListener) { mInfoWindowLongClickListener = infoWindowLongClickListener; }