From 3012b2d7bdd2428e12f6ecff85c1344fa142f7ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Enrique=20Lo=CC=81pez=20Man=CC=83as?= Date: Fri, 24 Apr 2026 17:29:46 +0200 Subject: [PATCH] feat: add constructor parameter for custom Executor in cluster renderers Adds overloaded constructors to `ClusterRendererMultipleItems`, `DefaultClusterRenderer`, and `DefaultAdvancedMarkersClusterRenderer` that accept an `Executor` parameter. This allows injecting a synchronous executor (or any custom executor) during testing, resolving issues with `Executors.newSingleThreadExecutor()` creating background threads in test environments. --- .../clustering/view/ClusterRendererMultipleItems.java | 7 ++++++- .../view/DefaultAdvancedMarkersClusterRenderer.java | 7 ++++++- .../android/clustering/view/DefaultClusterRenderer.java | 7 ++++++- 3 files changed, 18 insertions(+), 3 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 b59c7a5e5..b539f2c94 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 @@ -88,7 +88,7 @@ public class ClusterRendererMultipleItems implements Clus private final float mDensity; private boolean mAnimate; private long mAnimationDurationMs; - private final Executor mExecutor = Executors.newSingleThreadExecutor(); + private final Executor mExecutor; private final Queue ongoingAnimations = new LinkedList<>(); private static TimeInterpolator animationInterp = new DecelerateInterpolator(); @@ -171,7 +171,12 @@ public void setAnimationInterpolator(TimeInterpolator interpolator) { private ClusterManager.OnClusterItemInfoWindowLongClickListener mItemInfoWindowLongClickListener; public ClusterRendererMultipleItems(Context context, GoogleMap map, ClusterManager clusterManager) { + this(context, map, clusterManager, Executors.newSingleThreadExecutor()); + } + + public ClusterRendererMultipleItems(Context context, GoogleMap map, ClusterManager clusterManager, Executor executor) { mMap = map; + mExecutor = executor; mAnimate = true; mAnimationDurationMs = 300; mDensity = context.getResources().getDisplayMetrics().density; 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 a8fa75b3c..afc34c56c 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 @@ -82,7 +82,7 @@ public class DefaultAdvancedMarkersClusterRenderer implem private final float mDensity; private boolean mAnimate; private long mAnimationDurationMs; - private final Executor mExecutor = Executors.newSingleThreadExecutor(); + private final Executor mExecutor; private static final int[] BUCKETS = {10, 20, 50, 100, 200, 500, 1000}; private ShapeDrawable mColoredCircleBackground; @@ -133,7 +133,12 @@ public class DefaultAdvancedMarkersClusterRenderer implem private ClusterManager.OnClusterItemInfoWindowLongClickListener mItemInfoWindowLongClickListener; public DefaultAdvancedMarkersClusterRenderer(Context context, GoogleMap map, ClusterManager clusterManager) { + this(context, map, clusterManager, Executors.newSingleThreadExecutor()); + } + + public DefaultAdvancedMarkersClusterRenderer(Context context, GoogleMap map, ClusterManager clusterManager, Executor executor) { mMap = map; + mExecutor = executor; mAnimate = true; mAnimationDurationMs = 300; mDensity = context.getResources().getDisplayMetrics().density; 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 24e49c494..09fb6080b 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 @@ -81,7 +81,7 @@ public class DefaultClusterRenderer implements ClusterRen private final float mDensity; private boolean mAnimate; private long mAnimationDurationMs; - private final Executor mExecutor = Executors.newSingleThreadExecutor(); + private final Executor mExecutor; private static final int[] BUCKETS = {10, 20, 50, 100, 200, 500, 1000}; private ShapeDrawable mColoredCircleBackground; @@ -132,7 +132,12 @@ public class DefaultClusterRenderer implements ClusterRen private ClusterManager.OnClusterItemInfoWindowLongClickListener mItemInfoWindowLongClickListener; public DefaultClusterRenderer(Context context, GoogleMap map, ClusterManager clusterManager) { + this(context, map, clusterManager, Executors.newSingleThreadExecutor()); + } + + public DefaultClusterRenderer(Context context, GoogleMap map, ClusterManager clusterManager, Executor executor) { mMap = map; + mExecutor = executor; mAnimate = true; mAnimationDurationMs = 300; mDensity = context.getResources().getDisplayMetrics().density;