Skip to content

Commit cec00a5

Browse files
[google_maps_flutter_android] Convert Circle and Marker to Pigeon (flutter#7326)
Utilize static typing for pigeon message objects for Marker and Circle in `google_maps_flutter_android`. Draft for now to run tests. [*List which issues are fixed by this PR. You must list at least one issue.*](flutter#152925) ## Pre-launch Checklist - [x] I read the [Contributor Guide] and followed the process outlined there for submitting PRs. - [x] I read the [Tree Hygiene] page, which explains my responsibilities. - [x] I read and followed the [relevant style guides] and ran the auto-formatter. (Unlike the flutter/flutter repo, the flutter/packages repo does use `dart format`.) - [ ] I signed the [CLA]. - [x] The title of the PR starts with the name of the package surrounded by square brackets, e.g. `[shared_preferences]` - [x] I [linked to at least one issue that this PR fixes] in the description above. - [ ] I updated `pubspec.yaml` with an appropriate new version according to the [pub versioning philosophy], or this PR is [exempt from version changes]. - [ ] I updated `CHANGELOG.md` to add a description of the change, [following repository CHANGELOG style], or this PR is [exempt from CHANGELOG changes]. - [x] I updated/added relevant documentation (doc comments with `///`). - [x] I added new tests to check the change I am making, or this PR is [test-exempt]. - [ ] All existing and new tests are passing. If you need help, consider asking for advice on the #hackers-new channel on [Discord]. <!-- Links --> [Contributor Guide]: https://github.com/flutter/packages/blob/main/CONTRIBUTING.md [Tree Hygiene]: https://github.com/flutter/flutter/blob/master/docs/contributing/Tree-hygiene.md [relevant style guides]: https://github.com/flutter/packages/blob/main/CONTRIBUTING.md#style [CLA]: https://cla.developers.google.com/ [Discord]: https://github.com/flutter/flutter/blob/master/docs/contributing/Chat.md [linked to at least one issue that this PR fixes]: https://github.com/flutter/flutter/blob/master/docs/contributing/Tree-hygiene.md#overview [pub versioning philosophy]: https://dart.dev/tools/pub/versioning [exempt from version changes]: https://github.com/flutter/flutter/blob/master/docs/ecosystem/contributing/README.md#version [following repository CHANGELOG style]: https://github.com/flutter/flutter/blob/master/docs/ecosystem/contributing/README.md#changelog-style [exempt from CHANGELOG changes]: https://github.com/flutter/flutter/blob/master/docs/ecosystem/contributing/README.md#changelog [test-exempt]: https://github.com/flutter/flutter/blob/master/docs/contributing/Tree-hygiene.md#tests --------- Co-authored-by: Reid Baker <[email protected]>
1 parent f118119 commit cec00a5

File tree

14 files changed

+1574
-493
lines changed

14 files changed

+1574
-493
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.1
2+
3+
* Converts `PlatformCircle` and `PlatformMarker` to pigeon.
4+
15
## 2.14.0
26

37
* Updates map configuration and platform view creation parameters to use Pigeon.

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

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,13 @@ void setGoogleMap(GoogleMap googleMap) {
3434

3535
void addCircles(@NonNull List<Messages.PlatformCircle> circlesToAdd) {
3636
for (Messages.PlatformCircle circleToAdd : circlesToAdd) {
37-
addJsonCircle(circleToAdd.getJson());
37+
addCircle(circleToAdd);
3838
}
3939
}
4040

4141
void changeCircles(@NonNull List<Messages.PlatformCircle> circlesToChange) {
4242
for (Messages.PlatformCircle circleToChange : circlesToChange) {
43-
changeJsonCircle(circleToChange.getJson());
43+
changeCircle(circleToChange);
4444
}
4545
}
4646

@@ -67,10 +67,7 @@ boolean onCircleTap(String googleCircleId) {
6767
return false;
6868
}
6969

70-
private void addJsonCircle(Map<String, ?> circle) {
71-
if (circle == null) {
72-
return;
73-
}
70+
void addCircle(@NonNull Messages.PlatformCircle circle) {
7471
CircleBuilder circleBuilder = new CircleBuilder(density);
7572
String circleId = Convert.interpretCircleOptions(circle, circleBuilder);
7673
CircleOptions options = circleBuilder.build();
@@ -84,18 +81,11 @@ private void addCircle(String circleId, CircleOptions circleOptions, boolean con
8481
googleMapsCircleIdToDartCircleId.put(circle.getId(), circleId);
8582
}
8683

87-
private void changeJsonCircle(Map<String, ?> circle) {
88-
if (circle == null) {
89-
return;
90-
}
91-
String circleId = getCircleId(circle);
84+
private void changeCircle(@NonNull Messages.PlatformCircle circle) {
85+
String circleId = circle.getCircleId();
9286
CircleController circleController = circleIdToController.get(circleId);
9387
if (circleController != null) {
9488
Convert.interpretCircleOptions(circle, circleController);
9589
}
9690
}
97-
98-
private static String getCircleId(Map<String, ?> circle) {
99-
return (String) circle.get("circleId");
100-
}
10191
}

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

Lines changed: 40 additions & 103 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,11 @@ class Convert {
6262

6363
private static BitmapDescriptor toBitmapDescriptor(
6464
Object o, AssetManager assetManager, float density) {
65+
return toBitmapDescriptor(o, assetManager, density, new BitmapDescriptorFactoryWrapper());
66+
}
67+
68+
private static BitmapDescriptor toBitmapDescriptor(
69+
Object o, AssetManager assetManager, float density, BitmapDescriptorFactoryWrapper wrapper) {
6570
final List<?> data = toList(o);
6671
final String descriptorType = toString(data.get(0));
6772
switch (descriptorType) {
@@ -101,17 +106,13 @@ private static BitmapDescriptor toBitmapDescriptor(
101106
}
102107
final Map<?, ?> assetData = toMap(data.get(1));
103108
return getBitmapFromAsset(
104-
assetData,
105-
assetManager,
106-
density,
107-
new BitmapDescriptorFactoryWrapper(),
108-
new FlutterInjectorWrapper());
109+
assetData, assetManager, density, wrapper, new FlutterInjectorWrapper());
109110
case "bytes":
110111
if (!(data.get(1) instanceof Map)) {
111112
throw new IllegalArgumentException("'bytes' expected a map as the second parameter");
112113
}
113114
final Map<?, ?> byteData = toMap(data.get(1));
114-
return getBitmapFromBytes(byteData, density, new BitmapDescriptorFactoryWrapper());
115+
return getBitmapFromBytes(byteData, density, wrapper);
115116
default:
116117
throw new IllegalArgumentException("Cannot interpret " + o + " as BitmapDescriptor");
117118
}
@@ -659,68 +660,34 @@ static void interpretMapConfiguration(
659660

660661
/** Set the options in the given object to marker options sink. */
661662
static void interpretMarkerOptions(
662-
Map<String, ?> data, MarkerOptionsSink sink, AssetManager assetManager, float density) {
663-
final Object alpha = data.get("alpha");
664-
if (alpha != null) {
665-
sink.setAlpha(toFloat(alpha));
666-
}
667-
final Object anchor = data.get("anchor");
668-
if (anchor != null) {
669-
final List<?> anchorData = toList(anchor);
670-
sink.setAnchor(toFloat(anchorData.get(0)), toFloat(anchorData.get(1)));
671-
}
672-
final Object consumeTapEvents = data.get("consumeTapEvents");
673-
if (consumeTapEvents != null) {
674-
sink.setConsumeTapEvents(toBoolean(consumeTapEvents));
675-
}
676-
final Object draggable = data.get("draggable");
677-
if (draggable != null) {
678-
sink.setDraggable(toBoolean(draggable));
679-
}
680-
final Object flat = data.get("flat");
681-
if (flat != null) {
682-
sink.setFlat(toBoolean(flat));
683-
}
684-
final Object icon = data.get("icon");
685-
if (icon != null) {
686-
sink.setIcon(toBitmapDescriptor(icon, assetManager, density));
687-
}
688-
689-
final Object infoWindow = data.get("infoWindow");
690-
if (infoWindow != null) {
691-
interpretInfoWindowOptions(sink, toObjectMap(infoWindow));
692-
}
693-
final Object position = data.get("position");
694-
if (position != null) {
695-
sink.setPosition(toLatLng(position));
696-
}
697-
final Object rotation = data.get("rotation");
698-
if (rotation != null) {
699-
sink.setRotation(toFloat(rotation));
700-
}
701-
final Object visible = data.get("visible");
702-
if (visible != null) {
703-
sink.setVisible(toBoolean(visible));
704-
}
705-
final Object zIndex = data.get("zIndex");
706-
if (zIndex != null) {
707-
sink.setZIndex(toFloat(zIndex));
708-
}
663+
Messages.PlatformMarker marker,
664+
MarkerOptionsSink sink,
665+
AssetManager assetManager,
666+
float density,
667+
BitmapDescriptorFactoryWrapper wrapper) {
668+
sink.setAlpha(marker.getAlpha().floatValue());
669+
sink.setAnchor(
670+
marker.getAnchor().getDx().floatValue(), marker.getAnchor().getDy().floatValue());
671+
sink.setConsumeTapEvents(marker.getConsumeTapEvents());
672+
sink.setDraggable(marker.getDraggable());
673+
sink.setFlat(marker.getFlat());
674+
sink.setIcon(toBitmapDescriptor(marker.getIcon(), assetManager, density, wrapper));
675+
interpretInfoWindowOptions(sink, marker.getInfoWindow());
676+
sink.setPosition(toLatLng(marker.getPosition().toList()));
677+
sink.setRotation(marker.getRotation().floatValue());
678+
sink.setVisible(marker.getVisible());
679+
sink.setZIndex(marker.getZIndex().floatValue());
709680
}
710681

711682
private static void interpretInfoWindowOptions(
712-
MarkerOptionsSink sink, Map<String, Object> infoWindow) {
713-
String title = (String) infoWindow.get("title");
714-
String snippet = (String) infoWindow.get("snippet");
715-
// snippet is nullable.
683+
MarkerOptionsSink sink, Messages.PlatformInfoWindow infoWindow) {
684+
String title = infoWindow.getTitle();
716685
if (title != null) {
717-
sink.setInfoWindowText(title, snippet);
718-
}
719-
Object infoWindowAnchor = infoWindow.get("anchor");
720-
if (infoWindowAnchor != null) {
721-
final List<?> anchorData = toList(infoWindowAnchor);
722-
sink.setInfoWindowAnchor(toFloat(anchorData.get(0)), toFloat(anchorData.get(1)));
686+
sink.setInfoWindowText(title, infoWindow.getSnippet());
723687
}
688+
Messages.PlatformOffset infoWindowAnchor = infoWindow.getAnchor();
689+
sink.setInfoWindowAnchor(
690+
infoWindowAnchor.getDx().floatValue(), infoWindowAnchor.getDy().floatValue());
724691
}
725692

726693
static String interpretPolygonOptions(Map<String, ?> data, PolygonOptionsSink sink) {
@@ -822,45 +789,16 @@ static String interpretPolylineOptions(
822789
}
823790
}
824791

825-
static String interpretCircleOptions(Map<String, ?> data, CircleOptionsSink sink) {
826-
final Object consumeTapEvents = data.get("consumeTapEvents");
827-
if (consumeTapEvents != null) {
828-
sink.setConsumeTapEvents(toBoolean(consumeTapEvents));
829-
}
830-
final Object fillColor = data.get("fillColor");
831-
if (fillColor != null) {
832-
sink.setFillColor(toInt(fillColor));
833-
}
834-
final Object strokeColor = data.get("strokeColor");
835-
if (strokeColor != null) {
836-
sink.setStrokeColor(toInt(strokeColor));
837-
}
838-
final Object visible = data.get("visible");
839-
if (visible != null) {
840-
sink.setVisible(toBoolean(visible));
841-
}
842-
final Object strokeWidth = data.get("strokeWidth");
843-
if (strokeWidth != null) {
844-
sink.setStrokeWidth(toInt(strokeWidth));
845-
}
846-
final Object zIndex = data.get("zIndex");
847-
if (zIndex != null) {
848-
sink.setZIndex(toFloat(zIndex));
849-
}
850-
final Object center = data.get("center");
851-
if (center != null) {
852-
sink.setCenter(toLatLng(center));
853-
}
854-
final Object radius = data.get("radius");
855-
if (radius != null) {
856-
sink.setRadius(toDouble(radius));
857-
}
858-
final String circleId = (String) data.get("circleId");
859-
if (circleId == null) {
860-
throw new IllegalArgumentException("circleId was null");
861-
} else {
862-
return circleId;
863-
}
792+
static String interpretCircleOptions(Messages.PlatformCircle circle, CircleOptionsSink sink) {
793+
sink.setConsumeTapEvents(circle.getConsumeTapEvents());
794+
sink.setFillColor(circle.getFillColor().intValue());
795+
sink.setStrokeColor(circle.getStrokeColor().intValue());
796+
sink.setStrokeWidth(circle.getStrokeWidth());
797+
sink.setZIndex(circle.getZIndex().floatValue());
798+
sink.setCenter(toLatLng(circle.getCenter().toList()));
799+
sink.setRadius(circle.getRadius());
800+
sink.setVisible(circle.getVisible());
801+
return circle.getCircleId();
864802
}
865803

866804
/**
@@ -1069,7 +1007,6 @@ static Tile tileFromPigeon(Messages.PlatformTile tile) {
10691007
return new Tile(tile.getWidth().intValue(), tile.getHeight().intValue(), tile.getData());
10701008
}
10711009

1072-
@VisibleForTesting
10731010
static class BitmapDescriptorFactoryWrapper {
10741011
/**
10751012
* Creates a BitmapDescriptor from the provided asset key using the {@link

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,12 @@ class GoogleMapController
126126
this.lifecycleProvider = lifecycleProvider;
127127
this.clusterManagersController = new ClusterManagersController(flutterApi, context);
128128
this.markersController =
129-
new MarkersController(flutterApi, clusterManagersController, assetManager, density);
129+
new MarkersController(
130+
flutterApi,
131+
clusterManagersController,
132+
assetManager,
133+
density,
134+
new Convert.BitmapDescriptorFactoryWrapper());
130135
this.polygonsController = new PolygonsController(flutterApi, density);
131136
this.polylinesController = new PolylinesController(flutterApi, assetManager, density);
132137
this.circlesController = new CirclesController(flutterApi, density);

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

Lines changed: 19 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
import io.flutter.plugins.googlemaps.Messages.MapsCallbackApi;
1414
import java.util.HashMap;
1515
import java.util.List;
16-
import java.util.Map;
1716
import java.util.Objects;
1817

1918
class MarkersController {
@@ -25,19 +24,22 @@ class MarkersController {
2524
private final ClusterManagersController clusterManagersController;
2625
private final AssetManager assetManager;
2726
private final float density;
27+
private final Convert.BitmapDescriptorFactoryWrapper bitmapDescriptorFactoryWrapper;
2828

2929
MarkersController(
3030
@NonNull MapsCallbackApi flutterApi,
3131
ClusterManagersController clusterManagersController,
3232
AssetManager assetManager,
33-
float density) {
33+
float density,
34+
Convert.BitmapDescriptorFactoryWrapper bitmapDescriptorFactoryWrapper) {
3435
this.markerIdToMarkerBuilder = new HashMap<>();
3536
this.markerIdToController = new HashMap<>();
3637
this.googleMapsMarkerIdToDartMarkerId = new HashMap<>();
3738
this.flutterApi = flutterApi;
3839
this.clusterManagersController = clusterManagersController;
3940
this.assetManager = assetManager;
4041
this.density = density;
42+
this.bitmapDescriptorFactoryWrapper = bitmapDescriptorFactoryWrapper;
4143
}
4244

4345
void setCollection(MarkerManager.Collection markerCollection) {
@@ -46,13 +48,13 @@ void setCollection(MarkerManager.Collection markerCollection) {
4648

4749
void addMarkers(@NonNull List<Messages.PlatformMarker> markersToAdd) {
4850
for (Messages.PlatformMarker markerToAdd : markersToAdd) {
49-
addJsonMarker(markerToAdd.getJson());
51+
addMarker(markerToAdd);
5052
}
5153
}
5254

5355
void changeMarkers(@NonNull List<Messages.PlatformMarker> markersToChange) {
5456
for (Messages.PlatformMarker markerToChange : markersToChange) {
55-
changeJsonMarker(markerToChange.getJson());
57+
changeMarker(markerToChange);
5658
}
5759
}
5860

@@ -169,17 +171,12 @@ public void onClusterItemRendered(MarkerBuilder markerBuilder, Marker marker) {
169171
}
170172
}
171173

172-
private void addJsonMarker(Map<String, ?> marker) {
173-
if (marker == null) {
174-
return;
175-
}
176-
String markerId = getMarkerId(marker);
177-
if (markerId == null) {
178-
throw new IllegalArgumentException("markerId was null");
179-
}
180-
String clusterManagerId = getClusterManagerId(marker);
174+
private void addMarker(@NonNull Messages.PlatformMarker marker) {
175+
String markerId = marker.getMarkerId();
176+
String clusterManagerId = marker.getClusterManagerId();
181177
MarkerBuilder markerBuilder = new MarkerBuilder(markerId, clusterManagerId);
182-
Convert.interpretMarkerOptions(marker, markerBuilder, assetManager, density);
178+
Convert.interpretMarkerOptions(
179+
marker, markerBuilder, assetManager, density, bitmapDescriptorFactoryWrapper);
183180
addMarker(markerBuilder);
184181
}
185182

@@ -215,43 +212,34 @@ private void createControllerForMarker(String markerId, Marker marker, boolean c
215212
googleMapsMarkerIdToDartMarkerId.put(marker.getId(), markerId);
216213
}
217214

218-
private void changeJsonMarker(Map<String, ?> marker) {
219-
if (marker == null) {
220-
return;
221-
}
222-
String markerId = getMarkerId(marker);
215+
private void changeMarker(@NonNull Messages.PlatformMarker marker) {
216+
String markerId = marker.getMarkerId();
223217

224218
MarkerBuilder markerBuilder = markerIdToMarkerBuilder.get(markerId);
225219
if (markerBuilder == null) {
226220
return;
227221
}
228222

229-
String clusterManagerId = getClusterManagerId(marker);
223+
String clusterManagerId = marker.getClusterManagerId();
230224
String oldClusterManagerId = markerBuilder.clusterManagerId();
231225

232226
// If the cluster ID on the updated marker has changed, the marker needs to
233227
// be removed and re-added to update its cluster manager state.
234228
if (!(Objects.equals(clusterManagerId, oldClusterManagerId))) {
235229
removeMarker(markerId);
236-
addJsonMarker(marker);
230+
addMarker(marker);
237231
return;
238232
}
239233

240234
// Update marker builder.
241-
Convert.interpretMarkerOptions(marker, markerBuilder, assetManager, density);
235+
Convert.interpretMarkerOptions(
236+
marker, markerBuilder, assetManager, density, bitmapDescriptorFactoryWrapper);
242237

243238
// Update existing marker on map.
244239
MarkerController markerController = markerIdToController.get(markerId);
245240
if (markerController != null) {
246-
Convert.interpretMarkerOptions(marker, markerController, assetManager, density);
241+
Convert.interpretMarkerOptions(
242+
marker, markerController, assetManager, density, bitmapDescriptorFactoryWrapper);
247243
}
248244
}
249-
250-
private static String getMarkerId(Map<String, ?> marker) {
251-
return (String) marker.get("markerId");
252-
}
253-
254-
private static String getClusterManagerId(Map<String, ?> marker) {
255-
return (String) marker.get("clusterManagerId");
256-
}
257245
}

0 commit comments

Comments
 (0)