From 5518330d194f8e352522438fd49c71c8b6e3b87a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Enrique=20Lo=CC=81pez=20Man=CC=83as?= Date: Wed, 15 Apr 2026 18:14:36 +0200 Subject: [PATCH] fix: prevent NPE in LatLngBounds.contains by adding null checks for positions --- .../android/clustering/view/ClusterRendererMultipleItems.java | 2 +- .../view/DefaultAdvancedMarkersClusterRenderer.java | 4 ++-- .../maps/android/clustering/view/DefaultClusterRenderer.java | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) 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 fd7abcb2a..b59c7a5e5 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 @@ -524,7 +524,7 @@ public void run() { } for (final MarkerWithPosition marker : markersToRemove) { - boolean onScreen = visibleBounds.contains(marker.position); + boolean onScreen = marker.position != null && visibleBounds.contains(marker.position); if (onScreen && mAnimate) { final Point point = mSphericalMercatorProjection.toPoint(marker.position); final Point closest = findClosestCluster(newClustersOnScreen, point); 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..a8fa75b3c 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 @@ -453,7 +453,7 @@ public void run() { if (DefaultAdvancedMarkersClusterRenderer.this.mClusters != null && mAnimate) { existingClustersOnScreen = new ArrayList<>(); for (Cluster c : DefaultAdvancedMarkersClusterRenderer.this.mClusters) { - if (shouldRenderAsCluster(c) && visibleBounds.contains(c.getPosition())) { + if (shouldRenderAsCluster(c) && c.getPosition() != null && visibleBounds.contains(c.getPosition())) { Point point = mSphericalMercatorProjection.toPoint(c.getPosition()); existingClustersOnScreen.add(point); } @@ -492,7 +492,7 @@ public void run() { if (mAnimate) { newClustersOnScreen = new ArrayList<>(); for (Cluster c : clusters) { - if (shouldRenderAsCluster(c) && visibleBounds.contains(c.getPosition())) { + if (shouldRenderAsCluster(c) && c.getPosition() != null && visibleBounds.contains(c.getPosition())) { Point p = mSphericalMercatorProjection.toPoint(c.getPosition()); newClustersOnScreen.add(p); } 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 0f0d6ba19..24e49c494 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 @@ -492,7 +492,7 @@ public void run() { // Remove the old markers, animating them into clusters if zooming out. for (final MarkerWithPosition marker : markersToRemove) { - boolean onScreen = visibleBounds.contains(marker.position); + boolean onScreen = marker.position != null && visibleBounds.contains(marker.position); // Don't animate when zooming out more than 3 zoom levels. // TODO: drop animation based on speed of device & number of markers to animate. if (!zoomingIn && zoomDelta > -3 && onScreen && mAnimate) {