Skip to content

Commit f26c3b8

Browse files
committed
Use enum instead of boolean to indicate that marker is advanced
1 parent b847bc0 commit f26c3b8

File tree

8 files changed

+112
-32
lines changed

8 files changed

+112
-32
lines changed

packages/google_maps_flutter/google_maps_flutter_android/android/src/main/java/io/flutter/plugins/googlemaps/ClusterManagersController.java

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import android.content.Context;
88
import androidx.annotation.NonNull;
99
import androidx.annotation.Nullable;
10+
import androidx.annotation.VisibleForTesting;
1011
import com.google.android.gms.maps.GoogleMap;
1112
import com.google.android.gms.maps.model.AdvancedMarkerOptions;
1213
import com.google.android.gms.maps.model.Marker;
@@ -19,6 +20,7 @@
1920
import com.google.maps.android.clustering.view.DefaultClusterRenderer;
2021
import com.google.maps.android.collections.MarkerManager;
2122
import io.flutter.plugins.googlemaps.Messages.MapsCallbackApi;
23+
import io.flutter.plugins.googlemaps.Messages.PlatformMarkerType;
2224
import java.util.HashMap;
2325
import java.util.List;
2426
import java.util.Map;
@@ -32,10 +34,15 @@ class ClusterManagersController
3234
implements GoogleMap.OnCameraIdleListener,
3335
ClusterManager.OnClusterClickListener<MarkerBuilder> {
3436
@NonNull private final Context context;
35-
@NonNull private final HashMap<String, ClusterManager<MarkerBuilder>> clusterManagerIdToManager;
37+
38+
@VisibleForTesting
39+
@NonNull
40+
protected final HashMap<String, ClusterManager<MarkerBuilder>> clusterManagerIdToManager;
41+
3642
@NonNull private final MapsCallbackApi flutterApi;
3743
@Nullable private MarkerManager markerManager;
3844
@Nullable private GoogleMap googleMap;
45+
@NonNull private PlatformMarkerType markerType;
3946

4047
@Nullable
4148
private ClusterManager.OnClusterItemClickListener<MarkerBuilder> clusterItemClickListener;
@@ -44,10 +51,15 @@ class ClusterManagersController
4451
private ClusterManagersController.OnClusterItemRendered<MarkerBuilder>
4552
clusterItemRenderedListener;
4653

47-
ClusterManagersController(@NonNull MapsCallbackApi flutterApi, Context context) {
54+
ClusterManagersController(
55+
@NonNull MapsCallbackApi flutterApi,
56+
@NonNull Context context,
57+
@NonNull PlatformMarkerType markerType
58+
) {
4859
this.clusterManagerIdToManager = new HashMap<>();
4960
this.context = context;
5061
this.flutterApi = flutterApi;
62+
this.markerType = markerType;
5163
}
5264

5365
void init(GoogleMap googleMap, MarkerManager markerManager) {
@@ -92,6 +104,7 @@ void addClusterManagers(@NonNull List<Messages.PlatformClusterManager> clusterMa
92104
void addClusterManager(String clusterManagerId) {
93105
ClusterManager<MarkerBuilder> clusterManager =
94106
new ClusterManager<MarkerBuilder>(context, googleMap, markerManager);
107+
initializeRenderer(clusterManager);
95108
clusterManagerIdToManager.put(clusterManagerId, clusterManager);
96109
}
97110

@@ -100,13 +113,7 @@ void addClusterManager(String clusterManagerId) {
100113
* ClusterManager uses default renderer which should be changed to (legacy) renderer or
101114
* advanced renderer
102115
**/
103-
void initializeRenderer(String clusterManagerId, boolean isAdvanced) {
104-
final ClusterManager<MarkerBuilder> clusterManager = clusterManagerIdToManager.get(
105-
clusterManagerId);
106-
if (clusterManager == null) {
107-
return;
108-
}
109-
116+
private void initializeRenderer(ClusterManager<MarkerBuilder> clusterManager) {
110117
final ClusterRenderer<MarkerBuilder> renderer = clusterManager.getRenderer();
111118
if (renderer.getClass() == MarkerClusterRenderer.class
112119
|| renderer.getClass() == AdvancedMarkerClusterRenderer.class) {
@@ -115,7 +122,7 @@ void initializeRenderer(String clusterManagerId, boolean isAdvanced) {
115122
}
116123

117124
final ClusterRenderer<MarkerBuilder> clusterRenderer =
118-
isAdvanced
125+
markerType == PlatformMarkerType.ADVANCED
119126
? new AdvancedMarkerClusterRenderer<>(context, googleMap, clusterManager, this)
120127
: new MarkerClusterRenderer<>(context, googleMap, clusterManager, this);
121128
clusterManager.setRenderer(clusterRenderer);
@@ -148,8 +155,6 @@ private void removeClusterManager(Object clusterManagerId) {
148155

149156
/** Adds item to the ClusterManager it belongs to. */
150157
public void addItem(MarkerBuilder item) {
151-
initializeRenderer(item.clusterManagerId(), item.isAdvanced);
152-
153158
ClusterManager<MarkerBuilder> clusterManager =
154159
clusterManagerIdToManager.get(item.clusterManagerId());
155160
if (clusterManager != null) {
@@ -226,7 +231,8 @@ public boolean onClusterClick(Cluster<MarkerBuilder> cluster) {
226231
* MarkerClusterRenderer builds marker options for new markers to be rendered to the map. After
227232
* cluster item (marker) is rendered, it is sent to the listeners for control.
228233
*/
229-
private static class MarkerClusterRenderer<T extends MarkerBuilder> extends DefaultClusterRenderer<T> {
234+
@VisibleForTesting
235+
static class MarkerClusterRenderer<T extends MarkerBuilder> extends DefaultClusterRenderer<T> {
230236
private final ClusterManagersController clusterManagersController;
231237

232238
public MarkerClusterRenderer(
@@ -254,7 +260,8 @@ protected void onClusterItemRendered(@NonNull T item, @NonNull Marker marker) {
254260
}
255261

256262
/** AdvancedMarkerClusterRenderer is a ClusterRenderer that supports AdvancedMarkers */
257-
private static class AdvancedMarkerClusterRenderer<T extends MarkerBuilder> extends
263+
@VisibleForTesting
264+
static class AdvancedMarkerClusterRenderer<T extends MarkerBuilder> extends
258265
DefaultAdvancedMarkersClusterRenderer<T> {
259266

260267
private final ClusterManagersController clusterManagersController;

packages/google_maps_flutter/google_maps_flutter_android/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapController.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ class GoogleMapController
131131
MapsInspectorApi.setUp(binaryMessenger, Integer.toString(id), this);
132132
AssetManager assetManager = context.getAssets();
133133
this.lifecycleProvider = lifecycleProvider;
134-
this.clusterManagersController = new ClusterManagersController(flutterApi, context);
134+
this.clusterManagersController = new ClusterManagersController(flutterApi, context, markerType);
135135
this.markersController =
136136
new MarkersController(
137137
flutterApi,

packages/google_maps_flutter/google_maps_flutter_android/android/src/main/java/io/flutter/plugins/googlemaps/MarkerBuilder.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,19 +9,20 @@
99
import com.google.android.gms.maps.model.LatLng;
1010
import com.google.android.gms.maps.model.MarkerOptions;
1111
import com.google.maps.android.clustering.ClusterItem;
12+
import io.flutter.plugins.googlemaps.Messages.PlatformMarkerType;
1213

1314
class MarkerBuilder implements MarkerOptionsSink, ClusterItem {
1415
private final MarkerOptions markerOptions;
1516
private String clusterManagerId;
1617
private String markerId;
1718
private boolean consumeTapEvents;
18-
final boolean isAdvanced;
1919

20-
MarkerBuilder(String markerId, String clusterManagerId, boolean isAdvanced) {
21-
this.markerOptions = isAdvanced ? new AdvancedMarkerOptions() : new MarkerOptions();
20+
MarkerBuilder(String markerId, String clusterManagerId, PlatformMarkerType markerType) {
21+
this.markerOptions = markerType == PlatformMarkerType.ADVANCED
22+
? new AdvancedMarkerOptions()
23+
: new MarkerOptions();
2224
this.markerId = markerId;
2325
this.clusterManagerId = clusterManagerId;
24-
this.isAdvanced = isAdvanced;
2526
}
2627

2728
MarkerOptions build() {

packages/google_maps_flutter/google_maps_flutter_android/android/src/main/java/io/flutter/plugins/googlemaps/MarkersController.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -180,9 +180,8 @@ public void onClusterItemRendered(MarkerBuilder markerBuilder, Marker marker) {
180180
private void addMarker(@NonNull Messages.PlatformMarker marker) {
181181
String markerId = marker.getMarkerId();
182182
String clusterManagerId = marker.getClusterManagerId();
183-
boolean isAdvancedMarker = markerType == PlatformMarkerType.ADVANCED;
184183
MarkerBuilder markerBuilder = new MarkerBuilder(markerId, clusterManagerId,
185-
isAdvancedMarker);
184+
markerType);
186185
Convert.interpretMarkerOptions(
187186
marker, markerBuilder, assetManager, density, bitmapDescriptorFactoryWrapper);
188187
addMarker(markerBuilder);

packages/google_maps_flutter/google_maps_flutter_android/android/src/test/java/io/flutter/plugins/googlemaps/ClusterManagersControllerTest.java

Lines changed: 62 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
import static org.junit.Assert.assertEquals;
88
import static org.junit.Assert.assertNotNull;
9+
import static org.junit.Assert.assertSame;
910
import static org.junit.Assert.assertThrows;
1011
import static org.junit.Assert.assertTrue;
1112
import static org.mockito.ArgumentMatchers.eq;
@@ -22,11 +23,15 @@
2223
import com.google.android.gms.maps.model.CameraPosition;
2324
import com.google.android.gms.maps.model.LatLng;
2425
import com.google.maps.android.clustering.Cluster;
26+
import com.google.maps.android.clustering.ClusterManager;
2527
import com.google.maps.android.clustering.algo.StaticCluster;
2628
import com.google.maps.android.collections.MarkerManager;
2729
import io.flutter.plugin.common.BinaryMessenger;
30+
import io.flutter.plugins.googlemaps.ClusterManagersController.AdvancedMarkerClusterRenderer;
31+
import io.flutter.plugins.googlemaps.ClusterManagersController.MarkerClusterRenderer;
2832
import io.flutter.plugins.googlemaps.Messages.MapsCallbackApi;
2933
import io.flutter.plugins.googlemaps.Messages.PlatformMarkerCollisionBehavior;
34+
import io.flutter.plugins.googlemaps.Messages.PlatformMarkerType;
3035
import java.io.ByteArrayOutputStream;
3136
import java.util.ArrayList;
3237
import java.util.Collections;
@@ -35,7 +40,6 @@
3540
import java.util.Set;
3641
import org.junit.After;
3742
import org.junit.Before;
38-
import org.junit.Ignore;
3943
import org.junit.Test;
4044
import org.junit.runner.RunWith;
4145
import org.mockito.ArgumentMatchers;
@@ -66,7 +70,7 @@ public void setUp() {
6670
context = ApplicationProvider.getApplicationContext();
6771
assetManager = context.getAssets();
6872
flutterApi = spy(new MapsCallbackApi(mock(BinaryMessenger.class)));
69-
controller = spy(new ClusterManagersController(flutterApi, context));
73+
controller = spy(new ClusterManagersController(flutterApi, context, PlatformMarkerType.LEGACY));
7074
googleMap = mock(GoogleMap.class);
7175
markerManager = new MarkerManager(googleMap);
7276
controller.init(googleMap, markerManager);
@@ -102,8 +106,10 @@ public void AddClusterManagersAndMarkers() {
102106
clusterManagersToAdd.add(initialClusterManager);
103107
controller.addClusterManagers(clusterManagersToAdd);
104108

105-
MarkerBuilder markerBuilder1 = new MarkerBuilder(markerId1, clusterManagerId, false);
106-
MarkerBuilder markerBuilder2 = new MarkerBuilder(markerId2, clusterManagerId, false);
109+
MarkerBuilder markerBuilder1 = new MarkerBuilder(markerId1, clusterManagerId,
110+
PlatformMarkerType.LEGACY);
111+
MarkerBuilder markerBuilder2 = new MarkerBuilder(markerId2, clusterManagerId,
112+
PlatformMarkerType.LEGACY);
107113

108114
final Messages.PlatformMarker markerData1 =
109115
createPlatformMarker(markerId1, location1, clusterManagerId);
@@ -133,6 +139,56 @@ public void AddClusterManagersAndMarkers() {
133139
assertEquals("Cluster should contain exactly 2 markers", 2, cluster.getSize());
134140
}
135141

142+
@Test
143+
public void SelectClusterRenderer() {
144+
final String clusterManagerId1 = "cm_1";
145+
final String clusterManagerId2 = "cm_2";
146+
final String markerId1 = "mid_1";
147+
final String markerId2 = "mid_2";
148+
149+
when(googleMap.getCameraPosition())
150+
.thenReturn(CameraPosition.builder().target(new LatLng(0, 0)).build());
151+
152+
ClusterManagersController controller1 = spy(
153+
new ClusterManagersController(flutterApi, context, PlatformMarkerType.LEGACY));
154+
controller1.init(googleMap, markerManager);
155+
ClusterManagersController controller2 = spy(
156+
new ClusterManagersController(flutterApi, context, PlatformMarkerType.ADVANCED));
157+
controller2.init(googleMap, markerManager);
158+
159+
Messages.PlatformClusterManager initialClusterManager1 =
160+
new Messages.PlatformClusterManager.Builder().setIdentifier(clusterManagerId1).build();
161+
List<Messages.PlatformClusterManager> clusterManagersToAdd1 = new ArrayList<>();
162+
clusterManagersToAdd1.add(initialClusterManager1);
163+
controller1.addClusterManagers(clusterManagersToAdd1);
164+
165+
Messages.PlatformClusterManager initialClusterManager2 =
166+
new Messages.PlatformClusterManager.Builder().setIdentifier(clusterManagerId2).build();
167+
List<Messages.PlatformClusterManager> clusterManagersToAdd2 = new ArrayList<>();
168+
clusterManagersToAdd2.add(initialClusterManager2);
169+
controller2.addClusterManagers(clusterManagersToAdd2);
170+
171+
MarkerBuilder markerBuilder1 = new MarkerBuilder(markerId1, clusterManagerId1,
172+
PlatformMarkerType.LEGACY);
173+
markerBuilder1.setPosition(new LatLng(10.0, 20.0));
174+
controller1.addItem(markerBuilder1);
175+
176+
MarkerBuilder markerBuilder2 = new MarkerBuilder(markerId2, clusterManagerId2,
177+
PlatformMarkerType.ADVANCED);
178+
markerBuilder2.setPosition(new LatLng(20.0, 10.0));
179+
controller2.addItem(markerBuilder2);
180+
181+
ClusterManager<?> clusterManager1 = controller1.clusterManagerIdToManager.get(
182+
clusterManagerId1);
183+
assertNotNull(clusterManager1);
184+
assertSame(clusterManager1.getRenderer().getClass(), MarkerClusterRenderer.class);
185+
186+
ClusterManager<?> clusterManager2 = controller2.clusterManagerIdToManager.get(
187+
clusterManagerId2);
188+
assertNotNull(clusterManager2);
189+
assertSame(clusterManager2.getRenderer().getClass(), AdvancedMarkerClusterRenderer.class);
190+
}
191+
136192
@Test
137193
public void OnClusterClickCallsMethodChannel() {
138194
String clusterManagerId = "cm_1";
@@ -142,11 +198,11 @@ public void OnClusterClickCallsMethodChannel() {
142198

143199
StaticCluster<MarkerBuilder> cluster = new StaticCluster<>(clusterPosition);
144200

145-
MarkerBuilder marker1 = new MarkerBuilder("m_1", clusterManagerId, false);
201+
MarkerBuilder marker1 = new MarkerBuilder("m_1", clusterManagerId, PlatformMarkerType.LEGACY);
146202
marker1.setPosition(markerPosition1);
147203
cluster.add(marker1);
148204

149-
MarkerBuilder marker2 = new MarkerBuilder("m_2", clusterManagerId, false);
205+
MarkerBuilder marker2 = new MarkerBuilder("m_2", clusterManagerId, PlatformMarkerType.LEGACY);
150206
marker2.setPosition(markerPosition2);
151207
cluster.add(marker2);
152208

packages/google_maps_flutter/google_maps_flutter_android/android/src/test/java/io/flutter/plugins/googlemaps/ConvertTest.java

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,10 @@
3838
import com.google.maps.android.projection.SphericalMercatorProjection;
3939
import io.flutter.plugins.googlemaps.Convert.BitmapDescriptorFactoryWrapper;
4040
import io.flutter.plugins.googlemaps.Convert.FlutterInjectorWrapper;
41+
import io.flutter.plugins.googlemaps.Messages.PlatformMarkerType;
42+
import java.io.ByteArrayInputStream;
43+
import java.io.ByteArrayOutputStream;
44+
import java.io.InputStream;
4145
import java.util.Collections;
4246
import java.util.List;
4347
import java.util.Map;
@@ -100,11 +104,11 @@ public void ConvertClusterToPigeonReturnsCorrectData() {
100104

101105
StaticCluster<MarkerBuilder> cluster = new StaticCluster<>(clusterPosition);
102106

103-
MarkerBuilder marker1 = new MarkerBuilder("m_1", clusterManagerId, false);
107+
MarkerBuilder marker1 = new MarkerBuilder("m_1", clusterManagerId, PlatformMarkerType.LEGACY);
104108
marker1.setPosition(markerPosition1);
105109
cluster.add(marker1);
106110

107-
MarkerBuilder marker2 = new MarkerBuilder("m_2", clusterManagerId, false);
111+
MarkerBuilder marker2 = new MarkerBuilder("m_2", clusterManagerId, PlatformMarkerType.LEGACY);
108112
marker2.setPosition(markerPosition2);
109113
cluster.add(marker2);
110114

@@ -330,6 +334,18 @@ public void GetBitmapFromBytesThrowsErrorIfInvalidImageData() {
330334
fail("Expected an IllegalArgumentException to be thrown");
331335
}
332336

337+
@Test
338+
public void GetBitmapFromPinConfig() {
339+
Map<String, Object> assetDetails = new HashMap<>();
340+
assetDetails.put("backgroundColor", 0xFFFFFFFF);
341+
assetDetails.put("borderColor", 0xFFFFFFFF);
342+
343+
when(bitmapDescriptorFactoryWrapper.fromPinConfig(any())).thenReturn(mockBitmapDescriptor);
344+
BitmapDescriptor result = Convert.getBitmapFromPinConfig(
345+
assetDetails, assetManager, 1f, bitmapDescriptorFactoryWrapper);
346+
Assert.assertEquals(mockBitmapDescriptor, result);
347+
}
348+
333349
@Test
334350
public void interpretMapConfiguration_handlesNulls() {
335351
final Messages.PlatformMapConfiguration config =

packages/google_maps_flutter/google_maps_flutter_android/android/src/test/java/io/flutter/plugins/googlemaps/GoogleMapControllerTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@ public void SetInitialClusterManagers() {
221221
@Test
222222
public void OnClusterItemRenderedCallsMarkersController() {
223223
GoogleMapController googleMapController = getGoogleMapControllerWithMockedDependencies();
224-
MarkerBuilder markerBuilder = new MarkerBuilder("m_1", "cm_1", false);
224+
MarkerBuilder markerBuilder = new MarkerBuilder("m_1", "cm_1", PlatformMarkerType.LEGACY);
225225
final Marker marker = mock(Marker.class);
226226
googleMapController.onClusterItemRendered(markerBuilder, marker);
227227
verify(mockMarkersController, times(1)).onClusterItemRendered(markerBuilder, marker);
@@ -230,7 +230,7 @@ public void OnClusterItemRenderedCallsMarkersController() {
230230
@Test
231231
public void OnClusterItemClickCallsMarkersController() {
232232
GoogleMapController googleMapController = getGoogleMapControllerWithMockedDependencies();
233-
MarkerBuilder markerBuilder = new MarkerBuilder("m_1", "cm_1", false);
233+
MarkerBuilder markerBuilder = new MarkerBuilder("m_1", "cm_1", PlatformMarkerType.LEGACY);
234234

235235
googleMapController.onClusterItemClick(markerBuilder);
236236
verify(mockMarkersController, times(1)).onMarkerTap(markerBuilder.markerId());

packages/google_maps_flutter/google_maps_flutter_android/android/src/test/java/io/flutter/plugins/googlemaps/MarkersControllerTest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,8 @@ public void setUp() {
9696
assetManager = ApplicationProvider.getApplicationContext().getAssets();
9797
context = ApplicationProvider.getApplicationContext();
9898
flutterApi = spy(new MapsCallbackApi(mock(BinaryMessenger.class)));
99-
clusterManagersController = spy(new ClusterManagersController(flutterApi, context));
99+
clusterManagersController = spy(
100+
new ClusterManagersController(flutterApi, context, PlatformMarkerType.LEGACY));
100101
controller =
101102
new MarkersController(
102103
flutterApi,

0 commit comments

Comments
 (0)