Skip to content

Commit bb797b9

Browse files
[google_maps_flutter] Converts map configuration and platform view creation params to Pigeon (flutter#7207)
For both Android and iOS, convert the platform view creation parameters to a typed structure using Pigeon, via the ability to set a custom codec for the parameter, instead of a JSON dictionary, as well as converting the map configuration structure used in both those params and `updateMapConfiguration`. This change removes the last high-level use of non-Pigeon code in the plugin. The remaining uses of JSON are now internal to individual maps objects, which means that it should now be the case that all future changes to this plugin use Pigeon structures rather than JSON. (The individual objects don't change often, if at all, and it would be reasonable if someone does want to add a new parameter to one of those objects to require converting that specific object, as that would not require sweeping changes or knowledge of how to do a more holistic Pigeon conversion.) Part of flutter/flutter#117907
1 parent bd8db03 commit bb797b9

File tree

62 files changed

+3697
-1252
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

62 files changed

+3697
-1252
lines changed

packages/google_maps_flutter/google_maps_flutter_android/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
## 2.14.0
2+
3+
* Updates map configuration and platform view creation parameters to use Pigeon.
4+
15
## 2.13.0
26

37
* Adds support for heatmap layers.

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

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -32,16 +32,6 @@ void setGoogleMap(GoogleMap googleMap) {
3232
this.googleMap = googleMap;
3333
}
3434

35-
void addJsonCircles(List<Object> circlesToAdd) {
36-
if (circlesToAdd != null) {
37-
for (Object circleToAdd : circlesToAdd) {
38-
@SuppressWarnings("unchecked")
39-
Map<String, ?> circleMap = (Map<String, ?>) circleToAdd;
40-
addJsonCircle(circleMap);
41-
}
42-
}
43-
}
44-
4535
void addCircles(@NonNull List<Messages.PlatformCircle> circlesToAdd) {
4636
for (Messages.PlatformCircle circleToAdd : circlesToAdd) {
4737
addJsonCircle(circleToAdd.getJson());

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

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -78,17 +78,6 @@ private void initListenersForClusterManager(
7878
clusterManager.setOnClusterItemClickListener(clusterItemClickListener);
7979
}
8080

81-
/** Adds new ClusterManagers to the controller. */
82-
void addJsonClusterManagers(@NonNull List<Object> clusterManagersToAdd) {
83-
for (Object clusterToAdd : clusterManagersToAdd) {
84-
String clusterManagerId = getClusterManagerId(clusterToAdd);
85-
if (clusterManagerId == null) {
86-
throw new IllegalArgumentException("clusterManagerId was null");
87-
}
88-
addClusterManager(clusterManagerId);
89-
}
90-
}
91-
9281
/** Adds new ClusterManagers to the controller. */
9382
void addClusterManagers(@NonNull List<Messages.PlatformClusterManager> clusterManagersToAdd) {
9483
for (Messages.PlatformClusterManager clusterToAdd : clusterManagersToAdd) {

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

Lines changed: 85 additions & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,12 @@
44

55
package io.flutter.plugins.googlemaps;
66

7+
import static com.google.android.gms.maps.GoogleMap.MAP_TYPE_HYBRID;
8+
import static com.google.android.gms.maps.GoogleMap.MAP_TYPE_NONE;
9+
import static com.google.android.gms.maps.GoogleMap.MAP_TYPE_NORMAL;
10+
import static com.google.android.gms.maps.GoogleMap.MAP_TYPE_SATELLITE;
11+
import static com.google.android.gms.maps.GoogleMap.MAP_TYPE_TERRAIN;
12+
713
import android.content.res.AssetManager;
814
import android.graphics.Bitmap;
915
import android.graphics.BitmapFactory;
@@ -44,7 +50,6 @@
4450
/** Conversions between JSON-like values and GoogleMaps data types. */
4551
class Convert {
4652
// These constants must match the corresponding constants in serialization.dart
47-
public static final String HEATMAPS_TO_ADD_KEY = "heatmapsToAdd";
4853
public static final String HEATMAP_ID_KEY = "heatmapId";
4954
public static final String HEATMAP_DATA_KEY = "data";
5055
public static final String HEATMAP_GRADIENT_KEY = "gradient";
@@ -313,6 +318,16 @@ private static boolean toBoolean(Object o) {
313318
return (Boolean) o;
314319
}
315320

321+
static @NonNull CameraPosition cameraPositionFromPigeon(
322+
@NonNull Messages.PlatformCameraPosition position) {
323+
final CameraPosition.Builder builder = CameraPosition.builder();
324+
builder.bearing(position.getBearing().floatValue());
325+
builder.target(latLngFromPigeon(position.getTarget()));
326+
builder.tilt(position.getTilt().floatValue());
327+
builder.zoom(position.getZoom().floatValue());
328+
return builder.build();
329+
}
330+
316331
static CameraPosition toCameraPosition(Object o) {
317332
final Map<?, ?> data = toMap(o);
318333
final CameraPosition.Builder builder = CameraPosition.builder();
@@ -364,14 +379,30 @@ private static float toFloat(Object o) {
364379
return ((Number) o).floatValue();
365380
}
366381

367-
private static Float toFloatWrapper(Object o) {
368-
return (o == null) ? null : toFloat(o);
382+
private static @Nullable Float nullableDoubleToFloat(@Nullable Double d) {
383+
return (d == null) ? null : d.floatValue();
369384
}
370385

371386
private static int toInt(Object o) {
372387
return ((Number) o).intValue();
373388
}
374389

390+
static int toMapType(@NonNull Messages.PlatformMapType type) {
391+
switch (type) {
392+
case NONE:
393+
return MAP_TYPE_NONE;
394+
case NORMAL:
395+
return MAP_TYPE_NORMAL;
396+
case SATELLITE:
397+
return MAP_TYPE_SATELLITE;
398+
case TERRAIN:
399+
return MAP_TYPE_TERRAIN;
400+
case HYBRID:
401+
return MAP_TYPE_HYBRID;
402+
}
403+
return MAP_TYPE_NORMAL;
404+
}
405+
375406
static @Nullable MapsInitializer.Renderer toMapRendererType(
376407
@Nullable Messages.PlatformRendererType type) {
377408
if (type == null) {
@@ -396,49 +427,17 @@ private static int toInt(Object o) {
396427
.build();
397428
}
398429

399-
static Object latLngBoundsToJson(LatLngBounds latLngBounds) {
400-
final Map<String, Object> arguments = new HashMap<>(2);
401-
arguments.put("southwest", latLngToJson(latLngBounds.southwest));
402-
arguments.put("northeast", latLngToJson(latLngBounds.northeast));
403-
return arguments;
404-
}
405-
406430
static Messages.PlatformLatLngBounds latLngBoundsToPigeon(LatLngBounds latLngBounds) {
407431
return new Messages.PlatformLatLngBounds.Builder()
408432
.setNortheast(latLngToPigeon(latLngBounds.northeast))
409433
.setSouthwest(latLngToPigeon(latLngBounds.southwest))
410434
.build();
411435
}
412436

413-
static Object markerIdToJson(String markerId) {
414-
if (markerId == null) {
415-
return null;
416-
}
417-
final Map<String, Object> data = new HashMap<>(1);
418-
data.put("markerId", markerId);
419-
return data;
420-
}
421-
422-
static Object polygonIdToJson(String polygonId) {
423-
if (polygonId == null) {
424-
return null;
425-
}
426-
final Map<String, Object> data = new HashMap<>(1);
427-
data.put("polygonId", polygonId);
428-
return data;
429-
}
430-
431-
static Object polylineIdToJson(String polylineId) {
432-
if (polylineId == null) {
433-
return null;
434-
}
435-
final Map<String, Object> data = new HashMap<>(1);
436-
data.put("polylineId", polylineId);
437-
return data;
438-
}
439-
440-
static Object latLngToJson(LatLng latLng) {
441-
return Arrays.asList(latLng.latitude, latLng.longitude);
437+
static @NonNull LatLngBounds latLngBoundsFromPigeon(
438+
@NonNull Messages.PlatformLatLngBounds bounds) {
439+
return new LatLngBounds(
440+
latLngFromPigeon(bounds.getSouthwest()), latLngFromPigeon(bounds.getNortheast()));
442441
}
443442

444443
static Messages.PlatformLatLng latLngToPigeon(LatLng latLng) {
@@ -571,92 +570,90 @@ private static String toString(Object o) {
571570
return (String) o;
572571
}
573572

574-
static void interpretGoogleMapOptions(Object o, GoogleMapOptionsSink sink) {
575-
final Map<?, ?> data = toMap(o);
576-
final Object cameraTargetBounds = data.get("cameraTargetBounds");
573+
static void interpretMapConfiguration(
574+
@NonNull Messages.PlatformMapConfiguration config, @NonNull GoogleMapOptionsSink sink) {
575+
final Messages.PlatformCameraTargetBounds cameraTargetBounds = config.getCameraTargetBounds();
577576
if (cameraTargetBounds != null) {
578-
final List<?> targetData = toList(cameraTargetBounds);
579-
sink.setCameraTargetBounds(toLatLngBounds(targetData.get(0)));
577+
final @Nullable Messages.PlatformLatLngBounds bounds = cameraTargetBounds.getBounds();
578+
sink.setCameraTargetBounds(bounds == null ? null : latLngBoundsFromPigeon(bounds));
580579
}
581-
final Object compassEnabled = data.get("compassEnabled");
580+
final Boolean compassEnabled = config.getCompassEnabled();
582581
if (compassEnabled != null) {
583-
sink.setCompassEnabled(toBoolean(compassEnabled));
582+
sink.setCompassEnabled(compassEnabled);
584583
}
585-
final Object mapToolbarEnabled = data.get("mapToolbarEnabled");
584+
final Boolean mapToolbarEnabled = config.getMapToolbarEnabled();
586585
if (mapToolbarEnabled != null) {
587-
sink.setMapToolbarEnabled(toBoolean(mapToolbarEnabled));
586+
sink.setMapToolbarEnabled(mapToolbarEnabled);
588587
}
589-
final Object mapType = data.get("mapType");
588+
final Messages.PlatformMapType mapType = config.getMapType();
590589
if (mapType != null) {
591-
sink.setMapType(toInt(mapType));
590+
sink.setMapType(toMapType(mapType));
592591
}
593-
final Object minMaxZoomPreference = data.get("minMaxZoomPreference");
592+
final Messages.PlatformZoomRange minMaxZoomPreference = config.getMinMaxZoomPreference();
594593
if (minMaxZoomPreference != null) {
595-
final List<?> zoomPreferenceData = toList(minMaxZoomPreference);
596-
sink.setMinMaxZoomPreference( //
597-
toFloatWrapper(zoomPreferenceData.get(0)), //
598-
toFloatWrapper(zoomPreferenceData.get(1)));
594+
sink.setMinMaxZoomPreference(
595+
nullableDoubleToFloat(minMaxZoomPreference.getMin()),
596+
nullableDoubleToFloat(minMaxZoomPreference.getMax()));
599597
}
600-
final Object padding = data.get("padding");
598+
final Messages.PlatformEdgeInsets padding = config.getPadding();
601599
if (padding != null) {
602-
final List<?> paddingData = toList(padding);
603600
sink.setPadding(
604-
toFloat(paddingData.get(0)),
605-
toFloat(paddingData.get(1)),
606-
toFloat(paddingData.get(2)),
607-
toFloat(paddingData.get(3)));
601+
padding.getTop().floatValue(),
602+
padding.getLeft().floatValue(),
603+
padding.getBottom().floatValue(),
604+
padding.getRight().floatValue());
608605
}
609-
final Object rotateGesturesEnabled = data.get("rotateGesturesEnabled");
606+
final Boolean rotateGesturesEnabled = config.getRotateGesturesEnabled();
610607
if (rotateGesturesEnabled != null) {
611-
sink.setRotateGesturesEnabled(toBoolean(rotateGesturesEnabled));
608+
sink.setRotateGesturesEnabled(rotateGesturesEnabled);
612609
}
613-
final Object scrollGesturesEnabled = data.get("scrollGesturesEnabled");
610+
final Boolean scrollGesturesEnabled = config.getScrollGesturesEnabled();
614611
if (scrollGesturesEnabled != null) {
615-
sink.setScrollGesturesEnabled(toBoolean(scrollGesturesEnabled));
612+
sink.setScrollGesturesEnabled(scrollGesturesEnabled);
616613
}
617-
final Object tiltGesturesEnabled = data.get("tiltGesturesEnabled");
614+
final Boolean tiltGesturesEnabled = config.getTiltGesturesEnabled();
618615
if (tiltGesturesEnabled != null) {
619-
sink.setTiltGesturesEnabled(toBoolean(tiltGesturesEnabled));
616+
sink.setTiltGesturesEnabled(tiltGesturesEnabled);
620617
}
621-
final Object trackCameraPosition = data.get("trackCameraPosition");
618+
final Boolean trackCameraPosition = config.getTrackCameraPosition();
622619
if (trackCameraPosition != null) {
623-
sink.setTrackCameraPosition(toBoolean(trackCameraPosition));
620+
sink.setTrackCameraPosition(trackCameraPosition);
624621
}
625-
final Object zoomGesturesEnabled = data.get("zoomGesturesEnabled");
622+
final Boolean zoomGesturesEnabled = config.getZoomGesturesEnabled();
626623
if (zoomGesturesEnabled != null) {
627-
sink.setZoomGesturesEnabled(toBoolean(zoomGesturesEnabled));
624+
sink.setZoomGesturesEnabled(zoomGesturesEnabled);
628625
}
629-
final Object liteModeEnabled = data.get("liteModeEnabled");
626+
final Boolean liteModeEnabled = config.getLiteModeEnabled();
630627
if (liteModeEnabled != null) {
631-
sink.setLiteModeEnabled(toBoolean(liteModeEnabled));
628+
sink.setLiteModeEnabled(liteModeEnabled);
632629
}
633-
final Object myLocationEnabled = data.get("myLocationEnabled");
630+
final Boolean myLocationEnabled = config.getMyLocationEnabled();
634631
if (myLocationEnabled != null) {
635-
sink.setMyLocationEnabled(toBoolean(myLocationEnabled));
632+
sink.setMyLocationEnabled(myLocationEnabled);
636633
}
637-
final Object zoomControlsEnabled = data.get("zoomControlsEnabled");
634+
final Boolean zoomControlsEnabled = config.getZoomControlsEnabled();
638635
if (zoomControlsEnabled != null) {
639-
sink.setZoomControlsEnabled(toBoolean(zoomControlsEnabled));
636+
sink.setZoomControlsEnabled(zoomControlsEnabled);
640637
}
641-
final Object myLocationButtonEnabled = data.get("myLocationButtonEnabled");
638+
final Boolean myLocationButtonEnabled = config.getMyLocationButtonEnabled();
642639
if (myLocationButtonEnabled != null) {
643-
sink.setMyLocationButtonEnabled(toBoolean(myLocationButtonEnabled));
640+
sink.setMyLocationButtonEnabled(myLocationButtonEnabled);
644641
}
645-
final Object indoorEnabled = data.get("indoorEnabled");
642+
final Boolean indoorEnabled = config.getIndoorViewEnabled();
646643
if (indoorEnabled != null) {
647-
sink.setIndoorEnabled(toBoolean(indoorEnabled));
644+
sink.setIndoorEnabled(indoorEnabled);
648645
}
649-
final Object trafficEnabled = data.get("trafficEnabled");
646+
final Boolean trafficEnabled = config.getTrafficEnabled();
650647
if (trafficEnabled != null) {
651-
sink.setTrafficEnabled(toBoolean(trafficEnabled));
648+
sink.setTrafficEnabled(trafficEnabled);
652649
}
653-
final Object buildingsEnabled = data.get("buildingsEnabled");
650+
final Boolean buildingsEnabled = config.getBuildingsEnabled();
654651
if (buildingsEnabled != null) {
655-
sink.setBuildingsEnabled(toBoolean(buildingsEnabled));
652+
sink.setBuildingsEnabled(buildingsEnabled);
656653
}
657-
final Object style = data.get("style");
654+
final String style = config.getStyle();
658655
if (style != null) {
659-
sink.setMapStyle(toString(style));
656+
sink.setMapStyle(style);
660657
}
661658
}
662659

@@ -869,7 +866,7 @@ static String interpretCircleOptions(Map<String, ?> data, CircleOptionsSink sink
869866
/**
870867
* Set the options in the given heatmap object to the given sink.
871868
*
872-
* @param o the object expected to be a Map containing the heatmap options. The options map is
869+
* @param data the object expected to be a Map containing the heatmap options. The options map is
873870
* expected to have the following structure:
874871
* <pre>{@code
875872
* {

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

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,13 @@
66

77
import android.content.Context;
88
import android.graphics.Rect;
9+
import androidx.annotation.NonNull;
910
import androidx.annotation.Nullable;
1011
import com.google.android.gms.maps.GoogleMapOptions;
1112
import com.google.android.gms.maps.model.CameraPosition;
1213
import com.google.android.gms.maps.model.LatLngBounds;
1314
import io.flutter.plugin.common.BinaryMessenger;
1415
import java.util.List;
15-
import java.util.Map;
1616

1717
class GoogleMapBuilder implements GoogleMapOptionsSink {
1818
private final GoogleMapOptions options = new GoogleMapOptions();
@@ -22,13 +22,13 @@ class GoogleMapBuilder implements GoogleMapOptionsSink {
2222
private boolean indoorEnabled = true;
2323
private boolean trafficEnabled = false;
2424
private boolean buildingsEnabled = true;
25-
private Object initialMarkers;
26-
private Object initialClusterManagers;
27-
private Object initialPolygons;
28-
private Object initialPolylines;
29-
private Object initialCircles;
30-
private Object initialHeatmaps;
31-
private List<Map<String, ?>> initialTileOverlays;
25+
private List<Messages.PlatformMarker> initialMarkers;
26+
private List<Messages.PlatformClusterManager> initialClusterManagers;
27+
private List<Messages.PlatformPolygon> initialPolygons;
28+
private List<Messages.PlatformPolyline> initialPolylines;
29+
private List<Messages.PlatformCircle> initialCircles;
30+
private List<Messages.PlatformHeatmap> initialHeatmaps;
31+
private List<Messages.PlatformTileOverlay> initialTileOverlays;
3232
private Rect padding = new Rect(0, 0, 0, 0);
3333
private @Nullable String style;
3434

@@ -162,37 +162,38 @@ public void setMyLocationButtonEnabled(boolean myLocationButtonEnabled) {
162162
}
163163

164164
@Override
165-
public void setInitialMarkers(Object initialMarkers) {
165+
public void setInitialMarkers(@NonNull List<Messages.PlatformMarker> initialMarkers) {
166166
this.initialMarkers = initialMarkers;
167167
}
168168

169169
@Override
170-
public void setInitialClusterManagers(Object initialClusterManagers) {
170+
public void setInitialClusterManagers(
171+
@NonNull List<Messages.PlatformClusterManager> initialClusterManagers) {
171172
this.initialClusterManagers = initialClusterManagers;
172173
}
173174

174175
@Override
175-
public void setInitialPolygons(Object initialPolygons) {
176+
public void setInitialPolygons(@NonNull List<Messages.PlatformPolygon> initialPolygons) {
176177
this.initialPolygons = initialPolygons;
177178
}
178179

179180
@Override
180-
public void setInitialPolylines(Object initialPolylines) {
181+
public void setInitialPolylines(@NonNull List<Messages.PlatformPolyline> initialPolylines) {
181182
this.initialPolylines = initialPolylines;
182183
}
183184

184185
@Override
185-
public void setInitialCircles(Object initialCircles) {
186+
public void setInitialCircles(@NonNull List<Messages.PlatformCircle> initialCircles) {
186187
this.initialCircles = initialCircles;
187188
}
188189

189190
@Override
190-
public void setInitialHeatmaps(Object initialHeatmaps) {
191+
public void setInitialHeatmaps(@NonNull List<Messages.PlatformHeatmap> initialHeatmaps) {
191192
this.initialHeatmaps = initialHeatmaps;
192193
}
193194

194-
@Override
195-
public void setInitialTileOverlays(List<Map<String, ?>> initialTileOverlays) {
195+
public void setInitialTileOverlays(
196+
@NonNull List<Messages.PlatformTileOverlay> initialTileOverlays) {
196197
this.initialTileOverlays = initialTileOverlays;
197198
}
198199

0 commit comments

Comments
 (0)