Skip to content

Commit 0b01773

Browse files
committed
feat!: Add support for setOnInfoWindowCloseListener() for Markers
BREAKING CHANGE: ClusterRenderer adds two InfoWindowClose listeners. Applications that used ClusterRenderer or MarkerManager with GoogleMap.setOnInfoWindowCloseListener must now register their listener(s) with relevant collection/clustering management class. Circa 2020, we added some more InfoWindow-related events to Marker/ClusterManager but InfoWindowClose was not included. This change addresses a discrepancy in the class documentation for MarkerManager which claims to "[d]elegates all Marker-related events to each ...". The close handler has been missing. [1] 8a3fc01
1 parent 4948bda commit 0b01773

File tree

6 files changed

+140
-0
lines changed

6 files changed

+140
-0
lines changed

library/src/main/java/com/google/maps/android/clustering/ClusterManager.java

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,10 @@ public class ClusterManager<T extends ClusterItem> implements
6565

6666
private OnClusterItemClickListener<T> mOnClusterItemClickListener;
6767
private OnClusterInfoWindowClickListener<T> mOnClusterInfoWindowClickListener;
68+
private OnClusterInfoWindowCloseListener<T> mOnClusterInfoWindowCloseListener;
6869
private OnClusterInfoWindowLongClickListener<T> mOnClusterInfoWindowLongClickListener;
6970
private OnClusterItemInfoWindowClickListener<T> mOnClusterItemInfoWindowClickListener;
71+
private OnClusterItemInfoWindowCloseListener<T> mOnClusterItemInfoWindowCloseListener;
7072
private OnClusterItemInfoWindowLongClickListener<T> mOnClusterItemInfoWindowLongClickListener;
7173
private OnClusterClickListener<T> mOnClusterClickListener;
7274

@@ -109,9 +111,11 @@ public void setRenderer(ClusterRenderer<T> renderer) {
109111
mRenderer.onAdd();
110112
mRenderer.setOnClusterClickListener(mOnClusterClickListener);
111113
mRenderer.setOnClusterInfoWindowClickListener(mOnClusterInfoWindowClickListener);
114+
mRenderer.setOnClusterInfoWindowCloseListener(mOnClusterInfoWindowCloseListener);
112115
mRenderer.setOnClusterInfoWindowLongClickListener(mOnClusterInfoWindowLongClickListener);
113116
mRenderer.setOnClusterItemClickListener(mOnClusterItemClickListener);
114117
mRenderer.setOnClusterItemInfoWindowClickListener(mOnClusterItemInfoWindowClickListener);
118+
mRenderer.setOnClusterItemInfoWindowCloseListener(mOnClusterItemInfoWindowCloseListener);
115119
mRenderer.setOnClusterItemInfoWindowLongClickListener(mOnClusterItemInfoWindowLongClickListener);
116120
cluster();
117121
}
@@ -370,6 +374,16 @@ public void setOnClusterInfoWindowClickListener(OnClusterInfoWindowClickListener
370374
mRenderer.setOnClusterInfoWindowClickListener(listener);
371375
}
372376

377+
/**
378+
* Sets a callback that's invoked when a Cluster info window is closed. Note: For this listener to function,
379+
* the ClusterManager must be added as a info window click listener to the map.
380+
*/
381+
public void setOnClusterInfoWindowCloseListener(OnClusterInfoWindowCloseListener<T> listener) {
382+
mOnClusterInfoWindowCloseListener = listener;
383+
mRenderer.setOnClusterInfoWindowCloseListener(listener);
384+
}
385+
386+
373387
/**
374388
* Sets a callback that's invoked when a Cluster info window is long-pressed. Note: For this listener to function,
375389
* the ClusterManager must be added as a info window click listener to the map.
@@ -397,6 +411,16 @@ public void setOnClusterItemInfoWindowClickListener(OnClusterItemInfoWindowClick
397411
mRenderer.setOnClusterItemInfoWindowClickListener(listener);
398412
}
399413

414+
415+
/**
416+
* Sets a callback that's invoked when an individual ClusterItem's Info Window is closed. Note: For this
417+
* listener to function, the ClusterManager must be added as a info window click listener to the map.
418+
*/
419+
public void setOnClusterItemInfoWindowCloseListener(OnClusterItemInfoWindowCloseListener<T> listener) {
420+
mOnClusterItemInfoWindowCloseListener = listener;
421+
mRenderer.setOnClusterItemInfoWindowCloseListener(listener);
422+
}
423+
400424
/**
401425
* Sets a callback that's invoked when an individual ClusterItem's Info Window is long-pressed. Note: For this
402426
* listener to function, the ClusterManager must be added as a info window click listener to the map.
@@ -425,6 +449,13 @@ public interface OnClusterInfoWindowClickListener<T extends ClusterItem> {
425449
void onClusterInfoWindowClick(Cluster<T> cluster);
426450
}
427451

452+
/**
453+
* Called when a Cluster's Info Window is closed.
454+
*/
455+
public interface OnClusterInfoWindowCloseListener<T extends ClusterItem> {
456+
void onClusterInfoWindowClose(Cluster<T> cluster);
457+
}
458+
428459
/**
429460
* Called when a Cluster's Info Window is long clicked.
430461
*/
@@ -456,6 +487,13 @@ public interface OnClusterItemInfoWindowClickListener<T extends ClusterItem> {
456487
void onClusterItemInfoWindowClick(T item);
457488
}
458489

490+
/**
491+
* Called when an individual ClusterItem's Info Window is closed.
492+
*/
493+
public interface OnClusterItemInfoWindowCloseListener<T extends ClusterItem> {
494+
void onClusterItemInfoWindowClose(T item);
495+
}
496+
459497
/**
460498
* Called when an individual ClusterItem's Info Window is long clicked.
461499
*/

library/src/main/java/com/google/maps/android/clustering/view/ClusterRenderer.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,12 +40,16 @@ public interface ClusterRenderer<T extends ClusterItem> {
4040

4141
void setOnClusterInfoWindowClickListener(ClusterManager.OnClusterInfoWindowClickListener<T> listener);
4242

43+
void setOnClusterInfoWindowCloseListener(ClusterManager.OnClusterInfoWindowCloseListener<T> listener);
44+
4345
void setOnClusterInfoWindowLongClickListener(ClusterManager.OnClusterInfoWindowLongClickListener<T> listener);
4446

4547
void setOnClusterItemClickListener(ClusterManager.OnClusterItemClickListener<T> listener);
4648

4749
void setOnClusterItemInfoWindowClickListener(ClusterManager.OnClusterItemInfoWindowClickListener<T> listener);
4850

51+
void setOnClusterItemInfoWindowCloseListener(ClusterManager.OnClusterItemInfoWindowCloseListener<T> listener);
52+
4953
void setOnClusterItemInfoWindowLongClickListener(ClusterManager.OnClusterItemInfoWindowLongClickListener<T> listener);
5054

5155
/**

library/src/main/java/com/google/maps/android/clustering/view/ClusterRendererMultipleItems.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,9 +172,11 @@ public void setAnimationType(AnimationType type) {
172172

173173
private ClusterManager.OnClusterClickListener<T> mClickListener;
174174
private ClusterManager.OnClusterInfoWindowClickListener<T> mInfoWindowClickListener;
175+
private ClusterManager.OnClusterInfoWindowCloseListener<T> mInfoWindowCloseListener;
175176
private ClusterManager.OnClusterInfoWindowLongClickListener<T> mInfoWindowLongClickListener;
176177
private ClusterManager.OnClusterItemClickListener<T> mItemClickListener;
177178
private ClusterManager.OnClusterItemInfoWindowClickListener<T> mItemInfoWindowClickListener;
179+
private ClusterManager.OnClusterItemInfoWindowCloseListener<T> mItemInfoWindowCloseListener;
178180
private ClusterManager.OnClusterItemInfoWindowLongClickListener<T> mItemInfoWindowLongClickListener;
179181

180182
public ClusterRendererMultipleItems(Context context, GoogleMap map, ClusterManager<T> clusterManager) {
@@ -205,6 +207,13 @@ public void onAdd() {
205207
}
206208
});
207209

210+
mClusterManager.getMarkerCollection().setOnInfoWindowCloseListener(marker -> {
211+
RendererLogger.d("ClusterRenderer", "Info window closed for marker: " + marker);
212+
if (mItemInfoWindowCloseListener != null) {
213+
mItemInfoWindowCloseListener.onClusterItemInfoWindowClose(mMarkerCache.get(marker));
214+
}
215+
});
216+
208217
mClusterManager.getMarkerCollection().setOnInfoWindowLongClickListener(marker -> {
209218
RendererLogger.d("ClusterRenderer", "Info window long-clicked for marker: " + marker);
210219
if (mItemInfoWindowLongClickListener != null) {
@@ -223,6 +232,13 @@ public void onAdd() {
223232
}
224233
});
225234

235+
mClusterManager.getClusterMarkerCollection().setOnInfoWindowCloseListener(marker -> {
236+
RendererLogger.d("ClusterRenderer", "Info window closed for cluster marker: " + marker);
237+
if (mInfoWindowCloseListener != null) {
238+
mInfoWindowCloseListener.onClusterInfoWindowClose(mClusterMarkerCache.get(marker));
239+
}
240+
});
241+
226242
mClusterManager.getClusterMarkerCollection().setOnInfoWindowLongClickListener(marker -> {
227243
RendererLogger.d("ClusterRenderer", "Info window long-clicked for cluster marker: " + marker);
228244
if (mInfoWindowLongClickListener != null) {
@@ -236,9 +252,11 @@ public void onAdd() {
236252
public void onRemove() {
237253
mClusterManager.getMarkerCollection().setOnMarkerClickListener(null);
238254
mClusterManager.getMarkerCollection().setOnInfoWindowClickListener(null);
255+
mClusterManager.getMarkerCollection().setOnInfoWindowCloseListener(null);
239256
mClusterManager.getMarkerCollection().setOnInfoWindowLongClickListener(null);
240257
mClusterManager.getClusterMarkerCollection().setOnMarkerClickListener(null);
241258
mClusterManager.getClusterMarkerCollection().setOnInfoWindowClickListener(null);
259+
mClusterManager.getClusterMarkerCollection().setOnInfoWindowCloseListener(null);
242260
mClusterManager.getClusterMarkerCollection().setOnInfoWindowLongClickListener(null);
243261
}
244262

@@ -591,6 +609,11 @@ public void setOnClusterInfoWindowClickListener(ClusterManager.OnClusterInfoWind
591609
mInfoWindowClickListener = listener;
592610
}
593611

612+
@Override
613+
public void setOnClusterInfoWindowCloseListener(ClusterManager.OnClusterInfoWindowCloseListener<T> listener) {
614+
mInfoWindowCloseListener = listener;
615+
}
616+
594617
@Override
595618
public void setOnClusterInfoWindowLongClickListener(ClusterManager.OnClusterInfoWindowLongClickListener<T> listener) {
596619
mInfoWindowLongClickListener = listener;
@@ -606,6 +629,11 @@ public void setOnClusterItemInfoWindowClickListener(ClusterManager.OnClusterItem
606629
mItemInfoWindowClickListener = listener;
607630
}
608631

632+
@Override
633+
public void setOnClusterItemInfoWindowCloseListener(ClusterManager.OnClusterItemInfoWindowCloseListener<T> listener) {
634+
mItemInfoWindowCloseListener = listener;
635+
}
636+
609637
@Override
610638
public void setOnClusterItemInfoWindowLongClickListener(ClusterManager.OnClusterItemInfoWindowLongClickListener<T> listener) {
611639
mItemInfoWindowLongClickListener = listener;

library/src/main/java/com/google/maps/android/clustering/view/DefaultAdvancedMarkersClusterRenderer.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,9 +127,11 @@ public class DefaultAdvancedMarkersClusterRenderer<T extends ClusterItem> implem
127127

128128
private ClusterManager.OnClusterClickListener<T> mClickListener;
129129
private ClusterManager.OnClusterInfoWindowClickListener<T> mInfoWindowClickListener;
130+
private ClusterManager.OnClusterInfoWindowCloseListener<T> mInfoWindowCloseListener;
130131
private ClusterManager.OnClusterInfoWindowLongClickListener<T> mInfoWindowLongClickListener;
131132
private ClusterManager.OnClusterItemClickListener<T> mItemClickListener;
132133
private ClusterManager.OnClusterItemInfoWindowClickListener<T> mItemInfoWindowClickListener;
134+
private ClusterManager.OnClusterItemInfoWindowCloseListener<T> mItemInfoWindowCloseListener;
133135
private ClusterManager.OnClusterItemInfoWindowLongClickListener<T> mItemInfoWindowLongClickListener;
134136

135137
public DefaultAdvancedMarkersClusterRenderer(Context context, GoogleMap map, ClusterManager<T> clusterManager) {
@@ -162,6 +164,15 @@ public void onInfoWindowClick(@NonNull Marker marker) {
162164
}
163165
});
164166

167+
mClusterManager.getMarkerCollection().setOnInfoWindowCloseListener(new GoogleMap.OnInfoWindowCloseListener() {
168+
@Override
169+
public void onInfoWindowClose(@NonNull Marker marker) {
170+
if (mItemInfoWindowCloseListener != null) {
171+
mItemInfoWindowCloseListener.onClusterItemInfoWindowClose(mMarkerCache.get(marker));
172+
}
173+
}
174+
});
175+
165176
mClusterManager.getMarkerCollection().setOnInfoWindowLongClickListener(marker -> {
166177
if (mItemInfoWindowLongClickListener != null) {
167178
mItemInfoWindowLongClickListener.onClusterItemInfoWindowLongClick(mMarkerCache.get(marker));
@@ -177,6 +188,12 @@ public void onInfoWindowClick(@NonNull Marker marker) {
177188
}
178189
});
179190

191+
mClusterManager.getClusterMarkerCollection().setOnInfoWindowCloseListener(marker -> {
192+
if (mInfoWindowCloseListener != null) {
193+
mInfoWindowCloseListener.onClusterInfoWindowClose(mClusterMarkerCache.get(marker));
194+
}
195+
});
196+
180197
mClusterManager.getClusterMarkerCollection().setOnInfoWindowLongClickListener(marker -> {
181198
if (mInfoWindowLongClickListener != null) {
182199
mInfoWindowLongClickListener.onClusterInfoWindowLongClick(mClusterMarkerCache.get(marker));
@@ -188,9 +205,11 @@ public void onInfoWindowClick(@NonNull Marker marker) {
188205
public void onRemove() {
189206
mClusterManager.getMarkerCollection().setOnMarkerClickListener(null);
190207
mClusterManager.getMarkerCollection().setOnInfoWindowClickListener(null);
208+
mClusterManager.getMarkerCollection().setOnInfoWindowCloseListener(null);
191209
mClusterManager.getMarkerCollection().setOnInfoWindowLongClickListener(null);
192210
mClusterManager.getClusterMarkerCollection().setOnMarkerClickListener(null);
193211
mClusterManager.getClusterMarkerCollection().setOnInfoWindowClickListener(null);
212+
mClusterManager.getClusterMarkerCollection().setOnInfoWindowCloseListener(null);
194213
mClusterManager.getClusterMarkerCollection().setOnInfoWindowLongClickListener(null);
195214
}
196215

@@ -543,6 +562,11 @@ public void setOnClusterInfoWindowClickListener(ClusterManager.OnClusterInfoWind
543562
mInfoWindowClickListener = listener;
544563
}
545564

565+
@Override
566+
public void setOnClusterInfoWindowCloseListener(ClusterManager.OnClusterInfoWindowCloseListener<T> listener) {
567+
mInfoWindowCloseListener = listener;
568+
}
569+
546570
@Override
547571
public void setOnClusterInfoWindowLongClickListener(ClusterManager.OnClusterInfoWindowLongClickListener<T> listener) {
548572
mInfoWindowLongClickListener = listener;
@@ -558,6 +582,11 @@ public void setOnClusterItemInfoWindowClickListener(ClusterManager.OnClusterItem
558582
mItemInfoWindowClickListener = listener;
559583
}
560584

585+
@Override
586+
public void setOnClusterItemInfoWindowCloseListener(ClusterManager.OnClusterItemInfoWindowCloseListener<T> listener) {
587+
mItemInfoWindowCloseListener = listener;
588+
}
589+
561590
@Override
562591
public void setOnClusterItemInfoWindowLongClickListener(ClusterManager.OnClusterItemInfoWindowLongClickListener<T> listener) {
563592
mItemInfoWindowLongClickListener = listener;

library/src/main/java/com/google/maps/android/clustering/view/DefaultClusterRenderer.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,9 +126,11 @@ public class DefaultClusterRenderer<T extends ClusterItem> implements ClusterRen
126126

127127
private ClusterManager.OnClusterClickListener<T> mClickListener;
128128
private ClusterManager.OnClusterInfoWindowClickListener<T> mInfoWindowClickListener;
129+
private ClusterManager.OnClusterInfoWindowCloseListener<T> mInfoWindowCloseListener;
129130
private ClusterManager.OnClusterInfoWindowLongClickListener<T> mInfoWindowLongClickListener;
130131
private ClusterManager.OnClusterItemClickListener<T> mItemClickListener;
131132
private ClusterManager.OnClusterItemInfoWindowClickListener<T> mItemInfoWindowClickListener;
133+
private ClusterManager.OnClusterItemInfoWindowCloseListener<T> mItemInfoWindowCloseListener;
132134
private ClusterManager.OnClusterItemInfoWindowLongClickListener<T> mItemInfoWindowLongClickListener;
133135

134136
public DefaultClusterRenderer(Context context, GoogleMap map, ClusterManager<T> clusterManager) {
@@ -153,6 +155,12 @@ public void onAdd() {
153155
}
154156
});
155157

158+
mClusterManager.getMarkerCollection().setOnInfoWindowCloseListener(marker -> {
159+
if (mItemInfoWindowCloseListener != null) {
160+
mItemInfoWindowCloseListener.onClusterItemInfoWindowClose(mMarkerCache.get(marker));
161+
}
162+
});
163+
156164
mClusterManager.getMarkerCollection().setOnInfoWindowLongClickListener(marker -> {
157165
if (mItemInfoWindowLongClickListener != null) {
158166
mItemInfoWindowLongClickListener.onClusterItemInfoWindowLongClick(mMarkerCache.get(marker));
@@ -168,6 +176,12 @@ public void onAdd() {
168176
}
169177
});
170178

179+
mClusterManager.getClusterMarkerCollection().setOnInfoWindowCloseListener(marker -> {
180+
if (mInfoWindowCloseListener != null) {
181+
mInfoWindowCloseListener.onClusterInfoWindowClose(mClusterMarkerCache.get(marker));
182+
}
183+
});
184+
171185
mClusterManager.getClusterMarkerCollection().setOnInfoWindowLongClickListener(marker -> {
172186
if (mInfoWindowLongClickListener != null) {
173187
mInfoWindowLongClickListener.onClusterInfoWindowLongClick(mClusterMarkerCache.get(marker));
@@ -179,9 +193,11 @@ public void onAdd() {
179193
public void onRemove() {
180194
mClusterManager.getMarkerCollection().setOnMarkerClickListener(null);
181195
mClusterManager.getMarkerCollection().setOnInfoWindowClickListener(null);
196+
mClusterManager.getMarkerCollection().setOnInfoWindowCloseListener(null);
182197
mClusterManager.getMarkerCollection().setOnInfoWindowLongClickListener(null);
183198
mClusterManager.getClusterMarkerCollection().setOnMarkerClickListener(null);
184199
mClusterManager.getClusterMarkerCollection().setOnInfoWindowClickListener(null);
200+
mClusterManager.getClusterMarkerCollection().setOnInfoWindowCloseListener(null);
185201
mClusterManager.getClusterMarkerCollection().setOnInfoWindowLongClickListener(null);
186202
}
187203

@@ -534,6 +550,11 @@ public void setOnClusterInfoWindowClickListener(ClusterManager.OnClusterInfoWind
534550
mInfoWindowClickListener = listener;
535551
}
536552

553+
@Override
554+
public void setOnClusterInfoWindowCloseListener(ClusterManager.OnClusterInfoWindowCloseListener<T> listener) {
555+
mInfoWindowCloseListener = listener;
556+
}
557+
537558
@Override
538559
public void setOnClusterInfoWindowLongClickListener(ClusterManager.OnClusterInfoWindowLongClickListener<T> listener) {
539560
mInfoWindowLongClickListener = listener;
@@ -549,6 +570,11 @@ public void setOnClusterItemInfoWindowClickListener(ClusterManager.OnClusterItem
549570
mItemInfoWindowClickListener = listener;
550571
}
551572

573+
@Override
574+
public void setOnClusterItemInfoWindowCloseListener(ClusterManager.OnClusterItemInfoWindowCloseListener<T> listener) {
575+
mItemInfoWindowCloseListener = listener;
576+
}
577+
552578
@Override
553579
public void setOnClusterItemInfoWindowLongClickListener(ClusterManager.OnClusterItemInfoWindowLongClickListener<T> listener) {
554580
mItemInfoWindowLongClickListener = listener;

library/src/main/java/com/google/maps/android/collections/MarkerManager.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
*/
3535
public class MarkerManager extends MapObjectManager<Marker, MarkerManager.Collection> implements
3636
GoogleMap.OnInfoWindowClickListener,
37+
GoogleMap.OnInfoWindowCloseListener,
3738
GoogleMap.OnMarkerClickListener,
3839
GoogleMap.OnMarkerDragListener,
3940
GoogleMap.InfoWindowAdapter,
@@ -47,6 +48,7 @@ public MarkerManager(GoogleMap map) {
4748
void setListenersOnUiThread() {
4849
if (mMap != null) {
4950
mMap.setOnInfoWindowClickListener(this);
51+
mMap.setOnInfoWindowCloseListener(this);
5052
mMap.setOnInfoWindowLongClickListener(this);
5153
mMap.setOnMarkerClickListener(this);
5254
mMap.setOnMarkerDragListener(this);
@@ -84,6 +86,14 @@ public void onInfoWindowClick(@NonNull Marker marker) {
8486
}
8587
}
8688

89+
@Override
90+
public void onInfoWindowClose(@NonNull Marker marker) {
91+
Collection collection = mAllObjects.get(marker);
92+
if (collection != null && collection.mInfoWindowCloseListener != null) {
93+
collection.mInfoWindowCloseListener.onInfoWindowClose(marker);
94+
}
95+
}
96+
8797
@Override
8898
public void onInfoWindowLongClick(@NonNull Marker marker) {
8999
Collection collection = mAllObjects.get(marker);
@@ -132,6 +142,7 @@ protected void removeObjectFromMap(Marker object) {
132142

133143
public class Collection extends MapObjectManager.Collection {
134144
private GoogleMap.OnInfoWindowClickListener mInfoWindowClickListener;
145+
private GoogleMap.OnInfoWindowCloseListener mInfoWindowCloseListener;
135146
private GoogleMap.OnInfoWindowLongClickListener mInfoWindowLongClickListener;
136147
private GoogleMap.OnMarkerClickListener mMarkerClickListener;
137148
private GoogleMap.OnMarkerDragListener mMarkerDragListener;
@@ -187,6 +198,10 @@ public void setOnInfoWindowClickListener(GoogleMap.OnInfoWindowClickListener inf
187198
mInfoWindowClickListener = infoWindowClickListener;
188199
}
189200

201+
public void setOnInfoWindowCloseListener(GoogleMap.OnInfoWindowCloseListener infoWindowCloseListener) {
202+
mInfoWindowCloseListener = infoWindowCloseListener;
203+
}
204+
190205
public void setOnInfoWindowLongClickListener(GoogleMap.OnInfoWindowLongClickListener infoWindowLongClickListener) {
191206
mInfoWindowLongClickListener = infoWindowLongClickListener;
192207
}

0 commit comments

Comments
 (0)