diff --git a/packages/google_maps_flutter/google_maps_flutter_android/CHANGELOG.md b/packages/google_maps_flutter/google_maps_flutter_android/CHANGELOG.md index c2c7aec6aa75..d9649c412566 100644 --- a/packages/google_maps_flutter/google_maps_flutter_android/CHANGELOG.md +++ b/packages/google_maps_flutter/google_maps_flutter_android/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.14.1 + +* Converts `PlatformCircle` and `PlatformMarker` to pigeon. + ## 2.14.0 * Updates map configuration and platform view creation parameters to use Pigeon. diff --git a/packages/google_maps_flutter/google_maps_flutter_android/android/src/main/java/io/flutter/plugins/googlemaps/CirclesController.java b/packages/google_maps_flutter/google_maps_flutter_android/android/src/main/java/io/flutter/plugins/googlemaps/CirclesController.java index 8b28fe6aada8..d768b7da8576 100644 --- a/packages/google_maps_flutter/google_maps_flutter_android/android/src/main/java/io/flutter/plugins/googlemaps/CirclesController.java +++ b/packages/google_maps_flutter/google_maps_flutter_android/android/src/main/java/io/flutter/plugins/googlemaps/CirclesController.java @@ -34,13 +34,13 @@ void setGoogleMap(GoogleMap googleMap) { void addCircles(@NonNull List circlesToAdd) { for (Messages.PlatformCircle circleToAdd : circlesToAdd) { - addJsonCircle(circleToAdd.getJson()); + addCircle(circleToAdd); } } void changeCircles(@NonNull List circlesToChange) { for (Messages.PlatformCircle circleToChange : circlesToChange) { - changeJsonCircle(circleToChange.getJson()); + changeCircle(circleToChange); } } @@ -67,10 +67,7 @@ boolean onCircleTap(String googleCircleId) { return false; } - private void addJsonCircle(Map circle) { - if (circle == null) { - return; - } + void addCircle(@NonNull Messages.PlatformCircle circle) { CircleBuilder circleBuilder = new CircleBuilder(density); String circleId = Convert.interpretCircleOptions(circle, circleBuilder); CircleOptions options = circleBuilder.build(); @@ -84,18 +81,11 @@ private void addCircle(String circleId, CircleOptions circleOptions, boolean con googleMapsCircleIdToDartCircleId.put(circle.getId(), circleId); } - private void changeJsonCircle(Map circle) { - if (circle == null) { - return; - } - String circleId = getCircleId(circle); + private void changeCircle(@NonNull Messages.PlatformCircle circle) { + String circleId = circle.getCircleId(); CircleController circleController = circleIdToController.get(circleId); if (circleController != null) { Convert.interpretCircleOptions(circle, circleController); } } - - private static String getCircleId(Map circle) { - return (String) circle.get("circleId"); - } } diff --git a/packages/google_maps_flutter/google_maps_flutter_android/android/src/main/java/io/flutter/plugins/googlemaps/Convert.java b/packages/google_maps_flutter/google_maps_flutter_android/android/src/main/java/io/flutter/plugins/googlemaps/Convert.java index 01285d9ca706..91c039e25373 100644 --- a/packages/google_maps_flutter/google_maps_flutter_android/android/src/main/java/io/flutter/plugins/googlemaps/Convert.java +++ b/packages/google_maps_flutter/google_maps_flutter_android/android/src/main/java/io/flutter/plugins/googlemaps/Convert.java @@ -62,6 +62,11 @@ class Convert { private static BitmapDescriptor toBitmapDescriptor( Object o, AssetManager assetManager, float density) { + return toBitmapDescriptor(o, assetManager, density, new BitmapDescriptorFactoryWrapper()); + } + + private static BitmapDescriptor toBitmapDescriptor( + Object o, AssetManager assetManager, float density, BitmapDescriptorFactoryWrapper wrapper) { final List data = toList(o); final String descriptorType = toString(data.get(0)); switch (descriptorType) { @@ -101,17 +106,13 @@ private static BitmapDescriptor toBitmapDescriptor( } final Map assetData = toMap(data.get(1)); return getBitmapFromAsset( - assetData, - assetManager, - density, - new BitmapDescriptorFactoryWrapper(), - new FlutterInjectorWrapper()); + assetData, assetManager, density, wrapper, new FlutterInjectorWrapper()); case "bytes": if (!(data.get(1) instanceof Map)) { throw new IllegalArgumentException("'bytes' expected a map as the second parameter"); } final Map byteData = toMap(data.get(1)); - return getBitmapFromBytes(byteData, density, new BitmapDescriptorFactoryWrapper()); + return getBitmapFromBytes(byteData, density, wrapper); default: throw new IllegalArgumentException("Cannot interpret " + o + " as BitmapDescriptor"); } @@ -659,68 +660,34 @@ static void interpretMapConfiguration( /** Set the options in the given object to marker options sink. */ static void interpretMarkerOptions( - Map data, MarkerOptionsSink sink, AssetManager assetManager, float density) { - final Object alpha = data.get("alpha"); - if (alpha != null) { - sink.setAlpha(toFloat(alpha)); - } - final Object anchor = data.get("anchor"); - if (anchor != null) { - final List anchorData = toList(anchor); - sink.setAnchor(toFloat(anchorData.get(0)), toFloat(anchorData.get(1))); - } - final Object consumeTapEvents = data.get("consumeTapEvents"); - if (consumeTapEvents != null) { - sink.setConsumeTapEvents(toBoolean(consumeTapEvents)); - } - final Object draggable = data.get("draggable"); - if (draggable != null) { - sink.setDraggable(toBoolean(draggable)); - } - final Object flat = data.get("flat"); - if (flat != null) { - sink.setFlat(toBoolean(flat)); - } - final Object icon = data.get("icon"); - if (icon != null) { - sink.setIcon(toBitmapDescriptor(icon, assetManager, density)); - } - - final Object infoWindow = data.get("infoWindow"); - if (infoWindow != null) { - interpretInfoWindowOptions(sink, toObjectMap(infoWindow)); - } - final Object position = data.get("position"); - if (position != null) { - sink.setPosition(toLatLng(position)); - } - final Object rotation = data.get("rotation"); - if (rotation != null) { - sink.setRotation(toFloat(rotation)); - } - final Object visible = data.get("visible"); - if (visible != null) { - sink.setVisible(toBoolean(visible)); - } - final Object zIndex = data.get("zIndex"); - if (zIndex != null) { - sink.setZIndex(toFloat(zIndex)); - } + Messages.PlatformMarker marker, + MarkerOptionsSink sink, + AssetManager assetManager, + float density, + BitmapDescriptorFactoryWrapper wrapper) { + sink.setAlpha(marker.getAlpha().floatValue()); + sink.setAnchor( + marker.getAnchor().getDx().floatValue(), marker.getAnchor().getDy().floatValue()); + sink.setConsumeTapEvents(marker.getConsumeTapEvents()); + sink.setDraggable(marker.getDraggable()); + sink.setFlat(marker.getFlat()); + sink.setIcon(toBitmapDescriptor(marker.getIcon(), assetManager, density, wrapper)); + interpretInfoWindowOptions(sink, marker.getInfoWindow()); + sink.setPosition(toLatLng(marker.getPosition().toList())); + sink.setRotation(marker.getRotation().floatValue()); + sink.setVisible(marker.getVisible()); + sink.setZIndex(marker.getZIndex().floatValue()); } private static void interpretInfoWindowOptions( - MarkerOptionsSink sink, Map infoWindow) { - String title = (String) infoWindow.get("title"); - String snippet = (String) infoWindow.get("snippet"); - // snippet is nullable. + MarkerOptionsSink sink, Messages.PlatformInfoWindow infoWindow) { + String title = infoWindow.getTitle(); if (title != null) { - sink.setInfoWindowText(title, snippet); - } - Object infoWindowAnchor = infoWindow.get("anchor"); - if (infoWindowAnchor != null) { - final List anchorData = toList(infoWindowAnchor); - sink.setInfoWindowAnchor(toFloat(anchorData.get(0)), toFloat(anchorData.get(1))); + sink.setInfoWindowText(title, infoWindow.getSnippet()); } + Messages.PlatformOffset infoWindowAnchor = infoWindow.getAnchor(); + sink.setInfoWindowAnchor( + infoWindowAnchor.getDx().floatValue(), infoWindowAnchor.getDy().floatValue()); } static String interpretPolygonOptions(Map data, PolygonOptionsSink sink) { @@ -822,45 +789,16 @@ static String interpretPolylineOptions( } } - static String interpretCircleOptions(Map data, CircleOptionsSink sink) { - final Object consumeTapEvents = data.get("consumeTapEvents"); - if (consumeTapEvents != null) { - sink.setConsumeTapEvents(toBoolean(consumeTapEvents)); - } - final Object fillColor = data.get("fillColor"); - if (fillColor != null) { - sink.setFillColor(toInt(fillColor)); - } - final Object strokeColor = data.get("strokeColor"); - if (strokeColor != null) { - sink.setStrokeColor(toInt(strokeColor)); - } - final Object visible = data.get("visible"); - if (visible != null) { - sink.setVisible(toBoolean(visible)); - } - final Object strokeWidth = data.get("strokeWidth"); - if (strokeWidth != null) { - sink.setStrokeWidth(toInt(strokeWidth)); - } - final Object zIndex = data.get("zIndex"); - if (zIndex != null) { - sink.setZIndex(toFloat(zIndex)); - } - final Object center = data.get("center"); - if (center != null) { - sink.setCenter(toLatLng(center)); - } - final Object radius = data.get("radius"); - if (radius != null) { - sink.setRadius(toDouble(radius)); - } - final String circleId = (String) data.get("circleId"); - if (circleId == null) { - throw new IllegalArgumentException("circleId was null"); - } else { - return circleId; - } + static String interpretCircleOptions(Messages.PlatformCircle circle, CircleOptionsSink sink) { + sink.setConsumeTapEvents(circle.getConsumeTapEvents()); + sink.setFillColor(circle.getFillColor().intValue()); + sink.setStrokeColor(circle.getStrokeColor().intValue()); + sink.setStrokeWidth(circle.getStrokeWidth()); + sink.setZIndex(circle.getZIndex().floatValue()); + sink.setCenter(toLatLng(circle.getCenter().toList())); + sink.setRadius(circle.getRadius()); + sink.setVisible(circle.getVisible()); + return circle.getCircleId(); } /** @@ -1069,7 +1007,6 @@ static Tile tileFromPigeon(Messages.PlatformTile tile) { return new Tile(tile.getWidth().intValue(), tile.getHeight().intValue(), tile.getData()); } - @VisibleForTesting static class BitmapDescriptorFactoryWrapper { /** * Creates a BitmapDescriptor from the provided asset key using the {@link diff --git a/packages/google_maps_flutter/google_maps_flutter_android/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapController.java b/packages/google_maps_flutter/google_maps_flutter_android/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapController.java index 9327669e927b..561206717860 100644 --- a/packages/google_maps_flutter/google_maps_flutter_android/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapController.java +++ b/packages/google_maps_flutter/google_maps_flutter_android/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapController.java @@ -126,7 +126,12 @@ class GoogleMapController this.lifecycleProvider = lifecycleProvider; this.clusterManagersController = new ClusterManagersController(flutterApi, context); this.markersController = - new MarkersController(flutterApi, clusterManagersController, assetManager, density); + new MarkersController( + flutterApi, + clusterManagersController, + assetManager, + density, + new Convert.BitmapDescriptorFactoryWrapper()); this.polygonsController = new PolygonsController(flutterApi, density); this.polylinesController = new PolylinesController(flutterApi, assetManager, density); this.circlesController = new CirclesController(flutterApi, density); diff --git a/packages/google_maps_flutter/google_maps_flutter_android/android/src/main/java/io/flutter/plugins/googlemaps/MarkersController.java b/packages/google_maps_flutter/google_maps_flutter_android/android/src/main/java/io/flutter/plugins/googlemaps/MarkersController.java index 6edee43be2d3..24326fe53056 100644 --- a/packages/google_maps_flutter/google_maps_flutter_android/android/src/main/java/io/flutter/plugins/googlemaps/MarkersController.java +++ b/packages/google_maps_flutter/google_maps_flutter_android/android/src/main/java/io/flutter/plugins/googlemaps/MarkersController.java @@ -13,7 +13,6 @@ import io.flutter.plugins.googlemaps.Messages.MapsCallbackApi; import java.util.HashMap; import java.util.List; -import java.util.Map; import java.util.Objects; class MarkersController { @@ -25,12 +24,14 @@ class MarkersController { private final ClusterManagersController clusterManagersController; private final AssetManager assetManager; private final float density; + private final Convert.BitmapDescriptorFactoryWrapper bitmapDescriptorFactoryWrapper; MarkersController( @NonNull MapsCallbackApi flutterApi, ClusterManagersController clusterManagersController, AssetManager assetManager, - float density) { + float density, + Convert.BitmapDescriptorFactoryWrapper bitmapDescriptorFactoryWrapper) { this.markerIdToMarkerBuilder = new HashMap<>(); this.markerIdToController = new HashMap<>(); this.googleMapsMarkerIdToDartMarkerId = new HashMap<>(); @@ -38,6 +39,7 @@ class MarkersController { this.clusterManagersController = clusterManagersController; this.assetManager = assetManager; this.density = density; + this.bitmapDescriptorFactoryWrapper = bitmapDescriptorFactoryWrapper; } void setCollection(MarkerManager.Collection markerCollection) { @@ -46,13 +48,13 @@ void setCollection(MarkerManager.Collection markerCollection) { void addMarkers(@NonNull List markersToAdd) { for (Messages.PlatformMarker markerToAdd : markersToAdd) { - addJsonMarker(markerToAdd.getJson()); + addMarker(markerToAdd); } } void changeMarkers(@NonNull List markersToChange) { for (Messages.PlatformMarker markerToChange : markersToChange) { - changeJsonMarker(markerToChange.getJson()); + changeMarker(markerToChange); } } @@ -169,17 +171,12 @@ public void onClusterItemRendered(MarkerBuilder markerBuilder, Marker marker) { } } - private void addJsonMarker(Map marker) { - if (marker == null) { - return; - } - String markerId = getMarkerId(marker); - if (markerId == null) { - throw new IllegalArgumentException("markerId was null"); - } - String clusterManagerId = getClusterManagerId(marker); + private void addMarker(@NonNull Messages.PlatformMarker marker) { + String markerId = marker.getMarkerId(); + String clusterManagerId = marker.getClusterManagerId(); MarkerBuilder markerBuilder = new MarkerBuilder(markerId, clusterManagerId); - Convert.interpretMarkerOptions(marker, markerBuilder, assetManager, density); + Convert.interpretMarkerOptions( + marker, markerBuilder, assetManager, density, bitmapDescriptorFactoryWrapper); addMarker(markerBuilder); } @@ -215,43 +212,34 @@ private void createControllerForMarker(String markerId, Marker marker, boolean c googleMapsMarkerIdToDartMarkerId.put(marker.getId(), markerId); } - private void changeJsonMarker(Map marker) { - if (marker == null) { - return; - } - String markerId = getMarkerId(marker); + private void changeMarker(@NonNull Messages.PlatformMarker marker) { + String markerId = marker.getMarkerId(); MarkerBuilder markerBuilder = markerIdToMarkerBuilder.get(markerId); if (markerBuilder == null) { return; } - String clusterManagerId = getClusterManagerId(marker); + String clusterManagerId = marker.getClusterManagerId(); String oldClusterManagerId = markerBuilder.clusterManagerId(); // If the cluster ID on the updated marker has changed, the marker needs to // be removed and re-added to update its cluster manager state. if (!(Objects.equals(clusterManagerId, oldClusterManagerId))) { removeMarker(markerId); - addJsonMarker(marker); + addMarker(marker); return; } // Update marker builder. - Convert.interpretMarkerOptions(marker, markerBuilder, assetManager, density); + Convert.interpretMarkerOptions( + marker, markerBuilder, assetManager, density, bitmapDescriptorFactoryWrapper); // Update existing marker on map. MarkerController markerController = markerIdToController.get(markerId); if (markerController != null) { - Convert.interpretMarkerOptions(marker, markerController, assetManager, density); + Convert.interpretMarkerOptions( + marker, markerController, assetManager, density, bitmapDescriptorFactoryWrapper); } } - - private static String getMarkerId(Map marker) { - return (String) marker.get("markerId"); - } - - private static String getClusterManagerId(Map marker) { - return (String) marker.get("clusterManagerId"); - } } diff --git a/packages/google_maps_flutter/google_maps_flutter_android/android/src/main/java/io/flutter/plugins/googlemaps/Messages.java b/packages/google_maps_flutter/google_maps_flutter_android/android/src/main/java/io/flutter/plugins/googlemaps/Messages.java index c51fdd5166af..18a3b0e5452d 100644 --- a/packages/google_maps_flutter/google_maps_flutter_android/android/src/main/java/io/flutter/plugins/googlemaps/Messages.java +++ b/packages/google_maps_flutter/google_maps_flutter_android/android/src/main/java/io/flutter/plugins/googlemaps/Messages.java @@ -331,8 +331,305 @@ ArrayList toList() { *

Generated class from Pigeon that represents data sent in messages. */ public static final class PlatformCircle { + private @NonNull Boolean consumeTapEvents; + + public @NonNull Boolean getConsumeTapEvents() { + return consumeTapEvents; + } + + public void setConsumeTapEvents(@NonNull Boolean setterArg) { + if (setterArg == null) { + throw new IllegalStateException("Nonnull field \"consumeTapEvents\" is null."); + } + this.consumeTapEvents = setterArg; + } + + private @NonNull Long fillColor; + + public @NonNull Long getFillColor() { + return fillColor; + } + + public void setFillColor(@NonNull Long setterArg) { + if (setterArg == null) { + throw new IllegalStateException("Nonnull field \"fillColor\" is null."); + } + this.fillColor = setterArg; + } + + private @NonNull Long strokeColor; + + public @NonNull Long getStrokeColor() { + return strokeColor; + } + + public void setStrokeColor(@NonNull Long setterArg) { + if (setterArg == null) { + throw new IllegalStateException("Nonnull field \"strokeColor\" is null."); + } + this.strokeColor = setterArg; + } + + private @NonNull Boolean visible; + + public @NonNull Boolean getVisible() { + return visible; + } + + public void setVisible(@NonNull Boolean setterArg) { + if (setterArg == null) { + throw new IllegalStateException("Nonnull field \"visible\" is null."); + } + this.visible = setterArg; + } + + private @NonNull Long strokeWidth; + + public @NonNull Long getStrokeWidth() { + return strokeWidth; + } + + public void setStrokeWidth(@NonNull Long setterArg) { + if (setterArg == null) { + throw new IllegalStateException("Nonnull field \"strokeWidth\" is null."); + } + this.strokeWidth = setterArg; + } + + private @NonNull Double zIndex; + + public @NonNull Double getZIndex() { + return zIndex; + } + + public void setZIndex(@NonNull Double setterArg) { + if (setterArg == null) { + throw new IllegalStateException("Nonnull field \"zIndex\" is null."); + } + this.zIndex = setterArg; + } + + private @NonNull PlatformLatLng center; + + public @NonNull PlatformLatLng getCenter() { + return center; + } + + public void setCenter(@NonNull PlatformLatLng setterArg) { + if (setterArg == null) { + throw new IllegalStateException("Nonnull field \"center\" is null."); + } + this.center = setterArg; + } + + private @NonNull Double radius; + + public @NonNull Double getRadius() { + return radius; + } + + public void setRadius(@NonNull Double setterArg) { + if (setterArg == null) { + throw new IllegalStateException("Nonnull field \"radius\" is null."); + } + this.radius = setterArg; + } + + private @NonNull String circleId; + + public @NonNull String getCircleId() { + return circleId; + } + + public void setCircleId(@NonNull String setterArg) { + if (setterArg == null) { + throw new IllegalStateException("Nonnull field \"circleId\" is null."); + } + this.circleId = setterArg; + } + + /** Constructor is non-public to enforce null safety; use Builder. */ + PlatformCircle() {} + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + PlatformCircle that = (PlatformCircle) o; + return consumeTapEvents.equals(that.consumeTapEvents) + && fillColor.equals(that.fillColor) + && strokeColor.equals(that.strokeColor) + && visible.equals(that.visible) + && strokeWidth.equals(that.strokeWidth) + && zIndex.equals(that.zIndex) + && center.equals(that.center) + && radius.equals(that.radius) + && circleId.equals(that.circleId); + } + + @Override + public int hashCode() { + return Objects.hash( + consumeTapEvents, + fillColor, + strokeColor, + visible, + strokeWidth, + zIndex, + center, + radius, + circleId); + } + + public static final class Builder { + + private @Nullable Boolean consumeTapEvents; + + @CanIgnoreReturnValue + public @NonNull Builder setConsumeTapEvents(@NonNull Boolean setterArg) { + this.consumeTapEvents = setterArg; + return this; + } + + private @Nullable Long fillColor; + + @CanIgnoreReturnValue + public @NonNull Builder setFillColor(@NonNull Long setterArg) { + this.fillColor = setterArg; + return this; + } + + private @Nullable Long strokeColor; + + @CanIgnoreReturnValue + public @NonNull Builder setStrokeColor(@NonNull Long setterArg) { + this.strokeColor = setterArg; + return this; + } + + private @Nullable Boolean visible; + + @CanIgnoreReturnValue + public @NonNull Builder setVisible(@NonNull Boolean setterArg) { + this.visible = setterArg; + return this; + } + + private @Nullable Long strokeWidth; + + @CanIgnoreReturnValue + public @NonNull Builder setStrokeWidth(@NonNull Long setterArg) { + this.strokeWidth = setterArg; + return this; + } + + private @Nullable Double zIndex; + + @CanIgnoreReturnValue + public @NonNull Builder setZIndex(@NonNull Double setterArg) { + this.zIndex = setterArg; + return this; + } + + private @Nullable PlatformLatLng center; + + @CanIgnoreReturnValue + public @NonNull Builder setCenter(@NonNull PlatformLatLng setterArg) { + this.center = setterArg; + return this; + } + + private @Nullable Double radius; + + @CanIgnoreReturnValue + public @NonNull Builder setRadius(@NonNull Double setterArg) { + this.radius = setterArg; + return this; + } + + private @Nullable String circleId; + + @CanIgnoreReturnValue + public @NonNull Builder setCircleId(@NonNull String setterArg) { + this.circleId = setterArg; + return this; + } + + public @NonNull PlatformCircle build() { + PlatformCircle pigeonReturn = new PlatformCircle(); + pigeonReturn.setConsumeTapEvents(consumeTapEvents); + pigeonReturn.setFillColor(fillColor); + pigeonReturn.setStrokeColor(strokeColor); + pigeonReturn.setVisible(visible); + pigeonReturn.setStrokeWidth(strokeWidth); + pigeonReturn.setZIndex(zIndex); + pigeonReturn.setCenter(center); + pigeonReturn.setRadius(radius); + pigeonReturn.setCircleId(circleId); + return pigeonReturn; + } + } + + @NonNull + ArrayList toList() { + ArrayList toListResult = new ArrayList(9); + toListResult.add(consumeTapEvents); + toListResult.add(fillColor); + toListResult.add(strokeColor); + toListResult.add(visible); + toListResult.add(strokeWidth); + toListResult.add(zIndex); + toListResult.add(center); + toListResult.add(radius); + toListResult.add(circleId); + return toListResult; + } + + static @NonNull PlatformCircle fromList(@NonNull ArrayList __pigeon_list) { + PlatformCircle pigeonResult = new PlatformCircle(); + Object consumeTapEvents = __pigeon_list.get(0); + pigeonResult.setConsumeTapEvents((Boolean) consumeTapEvents); + Object fillColor = __pigeon_list.get(1); + pigeonResult.setFillColor( + (fillColor == null) + ? null + : ((fillColor instanceof Integer) ? (Integer) fillColor : (Long) fillColor)); + Object strokeColor = __pigeon_list.get(2); + pigeonResult.setStrokeColor( + (strokeColor == null) + ? null + : ((strokeColor instanceof Integer) ? (Integer) strokeColor : (Long) strokeColor)); + Object visible = __pigeon_list.get(3); + pigeonResult.setVisible((Boolean) visible); + Object strokeWidth = __pigeon_list.get(4); + pigeonResult.setStrokeWidth( + (strokeWidth == null) + ? null + : ((strokeWidth instanceof Integer) ? (Integer) strokeWidth : (Long) strokeWidth)); + Object zIndex = __pigeon_list.get(5); + pigeonResult.setZIndex((Double) zIndex); + Object center = __pigeon_list.get(6); + pigeonResult.setCenter((PlatformLatLng) center); + Object radius = __pigeon_list.get(7); + pigeonResult.setRadius((Double) radius); + Object circleId = __pigeon_list.get(8); + pigeonResult.setCircleId((String) circleId); + return pigeonResult; + } + } + + /** + * Pigeon equivalent of the Heatmap class. + * + *

Generated class from Pigeon that represents data sent in messages. + */ + public static final class PlatformHeatmap { /** - * The circle data, as JSON. This should only be set from Circle.toJson, and the native code + * The heatmap data, as JSON. This should only be set from Heatmap.toJson, and the native code * must interpret it according to the internal implementation details of that method. */ private @NonNull Map json; @@ -349,7 +646,7 @@ public void setJson(@NonNull Map setterArg) { } /** Constructor is non-public to enforce null safety; use Builder. */ - PlatformCircle() {} + PlatformHeatmap() {} @Override public boolean equals(Object o) { @@ -359,7 +656,7 @@ public boolean equals(Object o) { if (o == null || getClass() != o.getClass()) { return false; } - PlatformCircle that = (PlatformCircle) o; + PlatformHeatmap that = (PlatformHeatmap) o; return json.equals(that.json); } @@ -378,8 +675,8 @@ public static final class Builder { return this; } - public @NonNull PlatformCircle build() { - PlatformCircle pigeonReturn = new PlatformCircle(); + public @NonNull PlatformHeatmap build() { + PlatformHeatmap pigeonReturn = new PlatformHeatmap(); pigeonReturn.setJson(json); return pigeonReturn; } @@ -392,8 +689,8 @@ ArrayList toList() { return toListResult; } - static @NonNull PlatformCircle fromList(@NonNull ArrayList __pigeon_list) { - PlatformCircle pigeonResult = new PlatformCircle(); + static @NonNull PlatformHeatmap fromList(@NonNull ArrayList __pigeon_list) { + PlatformHeatmap pigeonResult = new PlatformHeatmap(); Object json = __pigeon_list.get(0); pigeonResult.setJson((Map) json); return pigeonResult; @@ -401,30 +698,463 @@ ArrayList toList() { } /** - * Pigeon equivalent of the Heatmap class. + * Pigeon equivalent of the ClusterManager class. * *

Generated class from Pigeon that represents data sent in messages. */ - public static final class PlatformHeatmap { - /** - * The heatmap data, as JSON. This should only be set from Heatmap.toJson, and the native code - * must interpret it according to the internal implementation details of that method. - */ - private @NonNull Map json; + public static final class PlatformClusterManager { + private @NonNull String identifier; + + public @NonNull String getIdentifier() { + return identifier; + } + + public void setIdentifier(@NonNull String setterArg) { + if (setterArg == null) { + throw new IllegalStateException("Nonnull field \"identifier\" is null."); + } + this.identifier = setterArg; + } + + /** Constructor is non-public to enforce null safety; use Builder. */ + PlatformClusterManager() {} + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + PlatformClusterManager that = (PlatformClusterManager) o; + return identifier.equals(that.identifier); + } + + @Override + public int hashCode() { + return Objects.hash(identifier); + } + + public static final class Builder { + + private @Nullable String identifier; + + @CanIgnoreReturnValue + public @NonNull Builder setIdentifier(@NonNull String setterArg) { + this.identifier = setterArg; + return this; + } + + public @NonNull PlatformClusterManager build() { + PlatformClusterManager pigeonReturn = new PlatformClusterManager(); + pigeonReturn.setIdentifier(identifier); + return pigeonReturn; + } + } + + @NonNull + ArrayList toList() { + ArrayList toListResult = new ArrayList(1); + toListResult.add(identifier); + return toListResult; + } + + static @NonNull PlatformClusterManager fromList(@NonNull ArrayList __pigeon_list) { + PlatformClusterManager pigeonResult = new PlatformClusterManager(); + Object identifier = __pigeon_list.get(0); + pigeonResult.setIdentifier((String) identifier); + return pigeonResult; + } + } + + /** + * Pigeon equivalent of the Offset class. + * + *

Generated class from Pigeon that represents data sent in messages. + */ + public static final class PlatformOffset { + private @NonNull Double dx; + + public @NonNull Double getDx() { + return dx; + } + + public void setDx(@NonNull Double setterArg) { + if (setterArg == null) { + throw new IllegalStateException("Nonnull field \"dx\" is null."); + } + this.dx = setterArg; + } + + private @NonNull Double dy; + + public @NonNull Double getDy() { + return dy; + } + + public void setDy(@NonNull Double setterArg) { + if (setterArg == null) { + throw new IllegalStateException("Nonnull field \"dy\" is null."); + } + this.dy = setterArg; + } + + /** Constructor is non-public to enforce null safety; use Builder. */ + PlatformOffset() {} + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + PlatformOffset that = (PlatformOffset) o; + return dx.equals(that.dx) && dy.equals(that.dy); + } + + @Override + public int hashCode() { + return Objects.hash(dx, dy); + } + + public static final class Builder { + + private @Nullable Double dx; + + @CanIgnoreReturnValue + public @NonNull Builder setDx(@NonNull Double setterArg) { + this.dx = setterArg; + return this; + } + + private @Nullable Double dy; + + @CanIgnoreReturnValue + public @NonNull Builder setDy(@NonNull Double setterArg) { + this.dy = setterArg; + return this; + } + + public @NonNull PlatformOffset build() { + PlatformOffset pigeonReturn = new PlatformOffset(); + pigeonReturn.setDx(dx); + pigeonReturn.setDy(dy); + return pigeonReturn; + } + } + + @NonNull + ArrayList toList() { + ArrayList toListResult = new ArrayList(2); + toListResult.add(dx); + toListResult.add(dy); + return toListResult; + } + + static @NonNull PlatformOffset fromList(@NonNull ArrayList __pigeon_list) { + PlatformOffset pigeonResult = new PlatformOffset(); + Object dx = __pigeon_list.get(0); + pigeonResult.setDx((Double) dx); + Object dy = __pigeon_list.get(1); + pigeonResult.setDy((Double) dy); + return pigeonResult; + } + } + + /** + * Pigeon equivalent of the InfoWindow class. + * + *

Generated class from Pigeon that represents data sent in messages. + */ + public static final class PlatformInfoWindow { + private @Nullable String title; + + public @Nullable String getTitle() { + return title; + } + + public void setTitle(@Nullable String setterArg) { + this.title = setterArg; + } + + private @Nullable String snippet; + + public @Nullable String getSnippet() { + return snippet; + } + + public void setSnippet(@Nullable String setterArg) { + this.snippet = setterArg; + } + + private @NonNull PlatformOffset anchor; + + public @NonNull PlatformOffset getAnchor() { + return anchor; + } + + public void setAnchor(@NonNull PlatformOffset setterArg) { + if (setterArg == null) { + throw new IllegalStateException("Nonnull field \"anchor\" is null."); + } + this.anchor = setterArg; + } + + /** Constructor is non-public to enforce null safety; use Builder. */ + PlatformInfoWindow() {} + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + PlatformInfoWindow that = (PlatformInfoWindow) o; + return Objects.equals(title, that.title) + && Objects.equals(snippet, that.snippet) + && anchor.equals(that.anchor); + } + + @Override + public int hashCode() { + return Objects.hash(title, snippet, anchor); + } + + public static final class Builder { + + private @Nullable String title; + + @CanIgnoreReturnValue + public @NonNull Builder setTitle(@Nullable String setterArg) { + this.title = setterArg; + return this; + } + + private @Nullable String snippet; + + @CanIgnoreReturnValue + public @NonNull Builder setSnippet(@Nullable String setterArg) { + this.snippet = setterArg; + return this; + } + + private @Nullable PlatformOffset anchor; + + @CanIgnoreReturnValue + public @NonNull Builder setAnchor(@NonNull PlatformOffset setterArg) { + this.anchor = setterArg; + return this; + } + + public @NonNull PlatformInfoWindow build() { + PlatformInfoWindow pigeonReturn = new PlatformInfoWindow(); + pigeonReturn.setTitle(title); + pigeonReturn.setSnippet(snippet); + pigeonReturn.setAnchor(anchor); + return pigeonReturn; + } + } + + @NonNull + ArrayList toList() { + ArrayList toListResult = new ArrayList(3); + toListResult.add(title); + toListResult.add(snippet); + toListResult.add(anchor); + return toListResult; + } + + static @NonNull PlatformInfoWindow fromList(@NonNull ArrayList __pigeon_list) { + PlatformInfoWindow pigeonResult = new PlatformInfoWindow(); + Object title = __pigeon_list.get(0); + pigeonResult.setTitle((String) title); + Object snippet = __pigeon_list.get(1); + pigeonResult.setSnippet((String) snippet); + Object anchor = __pigeon_list.get(2); + pigeonResult.setAnchor((PlatformOffset) anchor); + return pigeonResult; + } + } + + /** + * Pigeon equivalent of the Marker class. + * + *

Generated class from Pigeon that represents data sent in messages. + */ + public static final class PlatformMarker { + private @NonNull Double alpha; + + public @NonNull Double getAlpha() { + return alpha; + } + + public void setAlpha(@NonNull Double setterArg) { + if (setterArg == null) { + throw new IllegalStateException("Nonnull field \"alpha\" is null."); + } + this.alpha = setterArg; + } + + private @NonNull PlatformOffset anchor; + + public @NonNull PlatformOffset getAnchor() { + return anchor; + } + + public void setAnchor(@NonNull PlatformOffset setterArg) { + if (setterArg == null) { + throw new IllegalStateException("Nonnull field \"anchor\" is null."); + } + this.anchor = setterArg; + } + + private @NonNull Boolean consumeTapEvents; + + public @NonNull Boolean getConsumeTapEvents() { + return consumeTapEvents; + } + + public void setConsumeTapEvents(@NonNull Boolean setterArg) { + if (setterArg == null) { + throw new IllegalStateException("Nonnull field \"consumeTapEvents\" is null."); + } + this.consumeTapEvents = setterArg; + } + + private @NonNull Boolean draggable; + + public @NonNull Boolean getDraggable() { + return draggable; + } + + public void setDraggable(@NonNull Boolean setterArg) { + if (setterArg == null) { + throw new IllegalStateException("Nonnull field \"draggable\" is null."); + } + this.draggable = setterArg; + } + + private @NonNull Boolean flat; + + public @NonNull Boolean getFlat() { + return flat; + } + + public void setFlat(@NonNull Boolean setterArg) { + if (setterArg == null) { + throw new IllegalStateException("Nonnull field \"flat\" is null."); + } + this.flat = setterArg; + } + + private @NonNull Object icon; + + public @NonNull Object getIcon() { + return icon; + } + + public void setIcon(@NonNull Object setterArg) { + if (setterArg == null) { + throw new IllegalStateException("Nonnull field \"icon\" is null."); + } + this.icon = setterArg; + } + + private @NonNull PlatformInfoWindow infoWindow; + + public @NonNull PlatformInfoWindow getInfoWindow() { + return infoWindow; + } + + public void setInfoWindow(@NonNull PlatformInfoWindow setterArg) { + if (setterArg == null) { + throw new IllegalStateException("Nonnull field \"infoWindow\" is null."); + } + this.infoWindow = setterArg; + } + + private @NonNull PlatformLatLng position; + + public @NonNull PlatformLatLng getPosition() { + return position; + } + + public void setPosition(@NonNull PlatformLatLng setterArg) { + if (setterArg == null) { + throw new IllegalStateException("Nonnull field \"position\" is null."); + } + this.position = setterArg; + } + + private @NonNull Double rotation; + + public @NonNull Double getRotation() { + return rotation; + } + + public void setRotation(@NonNull Double setterArg) { + if (setterArg == null) { + throw new IllegalStateException("Nonnull field \"rotation\" is null."); + } + this.rotation = setterArg; + } + + private @NonNull Boolean visible; + + public @NonNull Boolean getVisible() { + return visible; + } + + public void setVisible(@NonNull Boolean setterArg) { + if (setterArg == null) { + throw new IllegalStateException("Nonnull field \"visible\" is null."); + } + this.visible = setterArg; + } + + private @NonNull Double zIndex; + + public @NonNull Double getZIndex() { + return zIndex; + } + + public void setZIndex(@NonNull Double setterArg) { + if (setterArg == null) { + throw new IllegalStateException("Nonnull field \"zIndex\" is null."); + } + this.zIndex = setterArg; + } - public @NonNull Map getJson() { - return json; + private @NonNull String markerId; + + public @NonNull String getMarkerId() { + return markerId; } - public void setJson(@NonNull Map setterArg) { + public void setMarkerId(@NonNull String setterArg) { if (setterArg == null) { - throw new IllegalStateException("Nonnull field \"json\" is null."); + throw new IllegalStateException("Nonnull field \"markerId\" is null."); } - this.json = setterArg; + this.markerId = setterArg; + } + + private @Nullable String clusterManagerId; + + public @Nullable String getClusterManagerId() { + return clusterManagerId; + } + + public void setClusterManagerId(@Nullable String setterArg) { + this.clusterManagerId = setterArg; } /** Constructor is non-public to enforce null safety; use Builder. */ - PlatformHeatmap() {} + PlatformMarker() {} @Override public boolean equals(Object o) { @@ -434,189 +1164,212 @@ public boolean equals(Object o) { if (o == null || getClass() != o.getClass()) { return false; } - PlatformHeatmap that = (PlatformHeatmap) o; - return json.equals(that.json); + PlatformMarker that = (PlatformMarker) o; + return alpha.equals(that.alpha) + && anchor.equals(that.anchor) + && consumeTapEvents.equals(that.consumeTapEvents) + && draggable.equals(that.draggable) + && flat.equals(that.flat) + && icon.equals(that.icon) + && infoWindow.equals(that.infoWindow) + && position.equals(that.position) + && rotation.equals(that.rotation) + && visible.equals(that.visible) + && zIndex.equals(that.zIndex) + && markerId.equals(that.markerId) + && Objects.equals(clusterManagerId, that.clusterManagerId); } @Override public int hashCode() { - return Objects.hash(json); + return Objects.hash( + alpha, + anchor, + consumeTapEvents, + draggable, + flat, + icon, + infoWindow, + position, + rotation, + visible, + zIndex, + markerId, + clusterManagerId); } public static final class Builder { - private @Nullable Map json; + private @Nullable Double alpha; @CanIgnoreReturnValue - public @NonNull Builder setJson(@NonNull Map setterArg) { - this.json = setterArg; + public @NonNull Builder setAlpha(@NonNull Double setterArg) { + this.alpha = setterArg; return this; } - public @NonNull PlatformHeatmap build() { - PlatformHeatmap pigeonReturn = new PlatformHeatmap(); - pigeonReturn.setJson(json); - return pigeonReturn; - } - } + private @Nullable PlatformOffset anchor; - @NonNull - ArrayList toList() { - ArrayList toListResult = new ArrayList(1); - toListResult.add(json); - return toListResult; - } + @CanIgnoreReturnValue + public @NonNull Builder setAnchor(@NonNull PlatformOffset setterArg) { + this.anchor = setterArg; + return this; + } - static @NonNull PlatformHeatmap fromList(@NonNull ArrayList __pigeon_list) { - PlatformHeatmap pigeonResult = new PlatformHeatmap(); - Object json = __pigeon_list.get(0); - pigeonResult.setJson((Map) json); - return pigeonResult; - } - } + private @Nullable Boolean consumeTapEvents; - /** - * Pigeon equivalent of the ClusterManager class. - * - *

Generated class from Pigeon that represents data sent in messages. - */ - public static final class PlatformClusterManager { - private @NonNull String identifier; + @CanIgnoreReturnValue + public @NonNull Builder setConsumeTapEvents(@NonNull Boolean setterArg) { + this.consumeTapEvents = setterArg; + return this; + } - public @NonNull String getIdentifier() { - return identifier; - } + private @Nullable Boolean draggable; - public void setIdentifier(@NonNull String setterArg) { - if (setterArg == null) { - throw new IllegalStateException("Nonnull field \"identifier\" is null."); + @CanIgnoreReturnValue + public @NonNull Builder setDraggable(@NonNull Boolean setterArg) { + this.draggable = setterArg; + return this; } - this.identifier = setterArg; - } - /** Constructor is non-public to enforce null safety; use Builder. */ - PlatformClusterManager() {} + private @Nullable Boolean flat; - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; + @CanIgnoreReturnValue + public @NonNull Builder setFlat(@NonNull Boolean setterArg) { + this.flat = setterArg; + return this; } - PlatformClusterManager that = (PlatformClusterManager) o; - return identifier.equals(that.identifier); - } - @Override - public int hashCode() { - return Objects.hash(identifier); - } + private @Nullable Object icon; - public static final class Builder { + @CanIgnoreReturnValue + public @NonNull Builder setIcon(@NonNull Object setterArg) { + this.icon = setterArg; + return this; + } - private @Nullable String identifier; + private @Nullable PlatformInfoWindow infoWindow; @CanIgnoreReturnValue - public @NonNull Builder setIdentifier(@NonNull String setterArg) { - this.identifier = setterArg; + public @NonNull Builder setInfoWindow(@NonNull PlatformInfoWindow setterArg) { + this.infoWindow = setterArg; return this; } - public @NonNull PlatformClusterManager build() { - PlatformClusterManager pigeonReturn = new PlatformClusterManager(); - pigeonReturn.setIdentifier(identifier); - return pigeonReturn; - } - } + private @Nullable PlatformLatLng position; - @NonNull - ArrayList toList() { - ArrayList toListResult = new ArrayList(1); - toListResult.add(identifier); - return toListResult; - } + @CanIgnoreReturnValue + public @NonNull Builder setPosition(@NonNull PlatformLatLng setterArg) { + this.position = setterArg; + return this; + } - static @NonNull PlatformClusterManager fromList(@NonNull ArrayList __pigeon_list) { - PlatformClusterManager pigeonResult = new PlatformClusterManager(); - Object identifier = __pigeon_list.get(0); - pigeonResult.setIdentifier((String) identifier); - return pigeonResult; - } - } + private @Nullable Double rotation; - /** - * Pigeon equivalent of the Marker class. - * - *

Generated class from Pigeon that represents data sent in messages. - */ - public static final class PlatformMarker { - /** - * The marker data, as JSON. This should only be set from Marker.toJson, and the native code - * must interpret it according to the internal implementation details of that method. - */ - private @NonNull Map json; + @CanIgnoreReturnValue + public @NonNull Builder setRotation(@NonNull Double setterArg) { + this.rotation = setterArg; + return this; + } - public @NonNull Map getJson() { - return json; - } + private @Nullable Boolean visible; - public void setJson(@NonNull Map setterArg) { - if (setterArg == null) { - throw new IllegalStateException("Nonnull field \"json\" is null."); + @CanIgnoreReturnValue + public @NonNull Builder setVisible(@NonNull Boolean setterArg) { + this.visible = setterArg; + return this; } - this.json = setterArg; - } - /** Constructor is non-public to enforce null safety; use Builder. */ - PlatformMarker() {} + private @Nullable Double zIndex; - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; + @CanIgnoreReturnValue + public @NonNull Builder setZIndex(@NonNull Double setterArg) { + this.zIndex = setterArg; + return this; } - PlatformMarker that = (PlatformMarker) o; - return json.equals(that.json); - } - @Override - public int hashCode() { - return Objects.hash(json); - } + private @Nullable String markerId; - public static final class Builder { + @CanIgnoreReturnValue + public @NonNull Builder setMarkerId(@NonNull String setterArg) { + this.markerId = setterArg; + return this; + } - private @Nullable Map json; + private @Nullable String clusterManagerId; @CanIgnoreReturnValue - public @NonNull Builder setJson(@NonNull Map setterArg) { - this.json = setterArg; + public @NonNull Builder setClusterManagerId(@Nullable String setterArg) { + this.clusterManagerId = setterArg; return this; } public @NonNull PlatformMarker build() { PlatformMarker pigeonReturn = new PlatformMarker(); - pigeonReturn.setJson(json); + pigeonReturn.setAlpha(alpha); + pigeonReturn.setAnchor(anchor); + pigeonReturn.setConsumeTapEvents(consumeTapEvents); + pigeonReturn.setDraggable(draggable); + pigeonReturn.setFlat(flat); + pigeonReturn.setIcon(icon); + pigeonReturn.setInfoWindow(infoWindow); + pigeonReturn.setPosition(position); + pigeonReturn.setRotation(rotation); + pigeonReturn.setVisible(visible); + pigeonReturn.setZIndex(zIndex); + pigeonReturn.setMarkerId(markerId); + pigeonReturn.setClusterManagerId(clusterManagerId); return pigeonReturn; } } @NonNull ArrayList toList() { - ArrayList toListResult = new ArrayList(1); - toListResult.add(json); + ArrayList toListResult = new ArrayList(13); + toListResult.add(alpha); + toListResult.add(anchor); + toListResult.add(consumeTapEvents); + toListResult.add(draggable); + toListResult.add(flat); + toListResult.add(icon); + toListResult.add(infoWindow); + toListResult.add(position); + toListResult.add(rotation); + toListResult.add(visible); + toListResult.add(zIndex); + toListResult.add(markerId); + toListResult.add(clusterManagerId); return toListResult; } static @NonNull PlatformMarker fromList(@NonNull ArrayList __pigeon_list) { PlatformMarker pigeonResult = new PlatformMarker(); - Object json = __pigeon_list.get(0); - pigeonResult.setJson((Map) json); + Object alpha = __pigeon_list.get(0); + pigeonResult.setAlpha((Double) alpha); + Object anchor = __pigeon_list.get(1); + pigeonResult.setAnchor((PlatformOffset) anchor); + Object consumeTapEvents = __pigeon_list.get(2); + pigeonResult.setConsumeTapEvents((Boolean) consumeTapEvents); + Object draggable = __pigeon_list.get(3); + pigeonResult.setDraggable((Boolean) draggable); + Object flat = __pigeon_list.get(4); + pigeonResult.setFlat((Boolean) flat); + Object icon = __pigeon_list.get(5); + pigeonResult.setIcon(icon); + Object infoWindow = __pigeon_list.get(6); + pigeonResult.setInfoWindow((PlatformInfoWindow) infoWindow); + Object position = __pigeon_list.get(7); + pigeonResult.setPosition((PlatformLatLng) position); + Object rotation = __pigeon_list.get(8); + pigeonResult.setRotation((Double) rotation); + Object visible = __pigeon_list.get(9); + pigeonResult.setVisible((Boolean) visible); + Object zIndex = __pigeon_list.get(10); + pigeonResult.setZIndex((Double) zIndex); + Object markerId = __pigeon_list.get(11); + pigeonResult.setMarkerId((String) markerId); + Object clusterManagerId = __pigeon_list.get(12); + pigeonResult.setClusterManagerId((String) clusterManagerId); return pigeonResult; } } @@ -2695,43 +3448,47 @@ protected Object readValueOfType(byte type, @NonNull ByteBuffer buffer) { case (byte) 133: return PlatformClusterManager.fromList((ArrayList) readValue(buffer)); case (byte) 134: - return PlatformMarker.fromList((ArrayList) readValue(buffer)); + return PlatformOffset.fromList((ArrayList) readValue(buffer)); case (byte) 135: - return PlatformPolygon.fromList((ArrayList) readValue(buffer)); + return PlatformInfoWindow.fromList((ArrayList) readValue(buffer)); case (byte) 136: - return PlatformPolyline.fromList((ArrayList) readValue(buffer)); + return PlatformMarker.fromList((ArrayList) readValue(buffer)); case (byte) 137: - return PlatformTile.fromList((ArrayList) readValue(buffer)); + return PlatformPolygon.fromList((ArrayList) readValue(buffer)); case (byte) 138: - return PlatformTileOverlay.fromList((ArrayList) readValue(buffer)); + return PlatformPolyline.fromList((ArrayList) readValue(buffer)); case (byte) 139: - return PlatformEdgeInsets.fromList((ArrayList) readValue(buffer)); + return PlatformTile.fromList((ArrayList) readValue(buffer)); case (byte) 140: - return PlatformLatLng.fromList((ArrayList) readValue(buffer)); + return PlatformTileOverlay.fromList((ArrayList) readValue(buffer)); case (byte) 141: - return PlatformLatLngBounds.fromList((ArrayList) readValue(buffer)); + return PlatformEdgeInsets.fromList((ArrayList) readValue(buffer)); case (byte) 142: - return PlatformCluster.fromList((ArrayList) readValue(buffer)); + return PlatformLatLng.fromList((ArrayList) readValue(buffer)); case (byte) 143: - return PlatformCameraTargetBounds.fromList((ArrayList) readValue(buffer)); + return PlatformLatLngBounds.fromList((ArrayList) readValue(buffer)); case (byte) 144: - return PlatformMapViewCreationParams.fromList((ArrayList) readValue(buffer)); + return PlatformCluster.fromList((ArrayList) readValue(buffer)); case (byte) 145: - return PlatformMapConfiguration.fromList((ArrayList) readValue(buffer)); + return PlatformCameraTargetBounds.fromList((ArrayList) readValue(buffer)); case (byte) 146: - return PlatformPoint.fromList((ArrayList) readValue(buffer)); + return PlatformMapViewCreationParams.fromList((ArrayList) readValue(buffer)); case (byte) 147: - return PlatformTileLayer.fromList((ArrayList) readValue(buffer)); + return PlatformMapConfiguration.fromList((ArrayList) readValue(buffer)); case (byte) 148: - return PlatformZoomRange.fromList((ArrayList) readValue(buffer)); + return PlatformPoint.fromList((ArrayList) readValue(buffer)); case (byte) 149: + return PlatformTileLayer.fromList((ArrayList) readValue(buffer)); + case (byte) 150: + return PlatformZoomRange.fromList((ArrayList) readValue(buffer)); + case (byte) 151: // Manual edit to fix https://github.com/flutter/flutter/issues/150108 // the way the generator will fix it once the PR lands. { Object value = readValue(buffer); return value == null ? null : PlatformMapType.values()[(int) value]; } - case (byte) 150: + case (byte) 152: // Manual edit to fix https://github.com/flutter/flutter/issues/150108 // the way the generator will fix it once the PR lands. { @@ -2760,56 +3517,62 @@ protected void writeValue(@NonNull ByteArrayOutputStream stream, Object value) { } else if (value instanceof PlatformClusterManager) { stream.write(133); writeValue(stream, ((PlatformClusterManager) value).toList()); - } else if (value instanceof PlatformMarker) { + } else if (value instanceof PlatformOffset) { stream.write(134); + writeValue(stream, ((PlatformOffset) value).toList()); + } else if (value instanceof PlatformInfoWindow) { + stream.write(135); + writeValue(stream, ((PlatformInfoWindow) value).toList()); + } else if (value instanceof PlatformMarker) { + stream.write(136); writeValue(stream, ((PlatformMarker) value).toList()); } else if (value instanceof PlatformPolygon) { - stream.write(135); + stream.write(137); writeValue(stream, ((PlatformPolygon) value).toList()); } else if (value instanceof PlatformPolyline) { - stream.write(136); + stream.write(138); writeValue(stream, ((PlatformPolyline) value).toList()); } else if (value instanceof PlatformTile) { - stream.write(137); + stream.write(139); writeValue(stream, ((PlatformTile) value).toList()); } else if (value instanceof PlatformTileOverlay) { - stream.write(138); + stream.write(140); writeValue(stream, ((PlatformTileOverlay) value).toList()); } else if (value instanceof PlatformEdgeInsets) { - stream.write(139); + stream.write(141); writeValue(stream, ((PlatformEdgeInsets) value).toList()); } else if (value instanceof PlatformLatLng) { - stream.write(140); + stream.write(142); writeValue(stream, ((PlatformLatLng) value).toList()); } else if (value instanceof PlatformLatLngBounds) { - stream.write(141); + stream.write(143); writeValue(stream, ((PlatformLatLngBounds) value).toList()); } else if (value instanceof PlatformCluster) { - stream.write(142); + stream.write(144); writeValue(stream, ((PlatformCluster) value).toList()); } else if (value instanceof PlatformCameraTargetBounds) { - stream.write(143); + stream.write(145); writeValue(stream, ((PlatformCameraTargetBounds) value).toList()); } else if (value instanceof PlatformMapViewCreationParams) { - stream.write(144); + stream.write(146); writeValue(stream, ((PlatformMapViewCreationParams) value).toList()); } else if (value instanceof PlatformMapConfiguration) { - stream.write(145); + stream.write(147); writeValue(stream, ((PlatformMapConfiguration) value).toList()); } else if (value instanceof PlatformPoint) { - stream.write(146); + stream.write(148); writeValue(stream, ((PlatformPoint) value).toList()); } else if (value instanceof PlatformTileLayer) { - stream.write(147); + stream.write(149); writeValue(stream, ((PlatformTileLayer) value).toList()); } else if (value instanceof PlatformZoomRange) { - stream.write(148); + stream.write(150); writeValue(stream, ((PlatformZoomRange) value).toList()); } else if (value instanceof PlatformMapType) { - stream.write(149); + stream.write(151); writeValue(stream, value == null ? null : ((PlatformMapType) value).index); } else if (value instanceof PlatformRendererType) { - stream.write(150); + stream.write(152); writeValue(stream, value == null ? null : ((PlatformRendererType) value).index); } else { super.writeValue(stream, value); diff --git a/packages/google_maps_flutter/google_maps_flutter_android/android/src/test/java/io/flutter/plugins/googlemaps/CirclesControllerTest.java b/packages/google_maps_flutter/google_maps_flutter_android/android/src/test/java/io/flutter/plugins/googlemaps/CirclesControllerTest.java index 2df310d13c3d..6d09d704722f 100644 --- a/packages/google_maps_flutter/google_maps_flutter_android/android/src/test/java/io/flutter/plugins/googlemaps/CirclesControllerTest.java +++ b/packages/google_maps_flutter/google_maps_flutter_android/android/src/test/java/io/flutter/plugins/googlemaps/CirclesControllerTest.java @@ -15,10 +15,7 @@ import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.model.Circle; import com.google.android.gms.maps.model.CircleOptions; -import java.util.Arrays; import java.util.Collections; -import java.util.HashMap; -import java.util.Map; import org.junit.After; import org.junit.Assert; import org.junit.Before; @@ -50,27 +47,25 @@ public void controller_changeCircles_updatesExistingCircle() { controller.setGoogleMap(mockGoogleMap); final String id = "a_circle"; - final Map circleJson = new HashMap<>(); - circleJson.put("circleId", id); - circleJson.put("consumeTapEvents", false); - circleJson.put("fillColor", 0); - circleJson.put("center", Arrays.asList(0.0, 0.0)); - circleJson.put("radius", 1.0); - circleJson.put("strokeColor", 0); - circleJson.put("strokeWidth", 1.0); - circleJson.put("visible", true); - circleJson.put("zIndex", 0); - controller.addCircles( - Collections.singletonList( - new Messages.PlatformCircle.Builder().setJson(circleJson).build())); + final Messages.PlatformCircle.Builder builder = new Messages.PlatformCircle.Builder(); + builder + .setCircleId(id) + .setConsumeTapEvents(false) + .setFillColor(0L) + .setCenter(new Messages.PlatformLatLng.Builder().setLatitude(0.0).setLongitude(0.0).build()) + .setRadius(1.0) + .setStrokeColor(0L) + .setStrokeWidth(1L) + .setVisible(true) + .setZIndex(0.0); + + controller.addCircles(Collections.singletonList(builder.build())); // There should be exactly one circle. Assert.assertEquals(1, controller.circleIdToController.size()); - circleJson.put("consumeTapEvents", true); - controller.changeCircles( - Collections.singletonList( - new Messages.PlatformCircle.Builder().setJson(circleJson).build())); + builder.setConsumeTapEvents(true); + controller.changeCircles(Collections.singletonList(builder.build())); // There should still only be one circle, and it should be updated. Assert.assertEquals(1, controller.circleIdToController.size()); verify(circle, times(1)).setClickable(true); diff --git a/packages/google_maps_flutter/google_maps_flutter_android/android/src/test/java/io/flutter/plugins/googlemaps/ClusterManagersControllerTest.java b/packages/google_maps_flutter/google_maps_flutter_android/android/src/test/java/io/flutter/plugins/googlemaps/ClusterManagersControllerTest.java index cee54cb685b4..dd41a3fbd027 100644 --- a/packages/google_maps_flutter/google_maps_flutter_android/android/src/test/java/io/flutter/plugins/googlemaps/ClusterManagersControllerTest.java +++ b/packages/google_maps_flutter/google_maps_flutter_android/android/src/test/java/io/flutter/plugins/googlemaps/ClusterManagersControllerTest.java @@ -15,6 +15,7 @@ import android.content.Context; import android.content.res.AssetManager; +import android.graphics.Bitmap; import android.os.Build; import androidx.test.core.app.ApplicationProvider; import com.google.android.gms.maps.GoogleMap; @@ -25,18 +26,23 @@ import com.google.maps.android.collections.MarkerManager; import io.flutter.plugin.common.BinaryMessenger; import io.flutter.plugins.googlemaps.Messages.MapsCallbackApi; +import java.io.ByteArrayOutputStream; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; +import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentMatchers; +import org.mockito.Mock; import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; import org.robolectric.RobolectricTestRunner; import org.robolectric.annotation.Config; @@ -51,8 +57,13 @@ public class ClusterManagersControllerTest { private AssetManager assetManager; private final float density = 1; + @Mock Convert.BitmapDescriptorFactoryWrapper bitmapFactory; + + private AutoCloseable mocksClosable; + @Before public void setUp() { + mocksClosable = MockitoAnnotations.openMocks(this); context = ApplicationProvider.getApplicationContext(); assetManager = context.getAssets(); flutterApi = spy(new MapsCallbackApi(mock(BinaryMessenger.class))); @@ -62,6 +73,11 @@ public void setUp() { controller.init(googleMap, markerManager); } + @After + public void close() throws Exception { + mocksClosable.close(); + } + @Test public void AddClusterManagersAndMarkers() { final String clusterManagerId = "cm_1"; @@ -90,13 +106,15 @@ public void AddClusterManagersAndMarkers() { MarkerBuilder markerBuilder1 = new MarkerBuilder(markerId1, clusterManagerId); MarkerBuilder markerBuilder2 = new MarkerBuilder(markerId2, clusterManagerId); - final Map markerData1 = - createMarkerData(markerId1, location1, clusterManagerId); - final Map markerData2 = - createMarkerData(markerId2, location2, clusterManagerId); + final Messages.PlatformMarker markerData1 = + createPlatformMarker(markerId1, location1, clusterManagerId); + final Messages.PlatformMarker markerData2 = + createPlatformMarker(markerId2, location2, clusterManagerId); - Convert.interpretMarkerOptions(markerData1, markerBuilder1, assetManager, density); - Convert.interpretMarkerOptions(markerData2, markerBuilder2, assetManager, density); + Convert.interpretMarkerOptions( + markerData1, markerBuilder1, assetManager, density, bitmapFactory); + Convert.interpretMarkerOptions( + markerData2, markerBuilder2, assetManager, density, bitmapFactory); controller.addItem(markerBuilder1); controller.addItem(markerBuilder2); @@ -161,12 +179,36 @@ public void RemoveClusterManagers() { () -> controller.getClustersWithClusterManagerId(clusterManagerId)); } - private Map createMarkerData( + private Messages.PlatformMarker createPlatformMarker( String markerId, List location, String clusterManagerId) { - Map markerData = new HashMap<>(); - markerData.put("markerId", markerId); - markerData.put("position", location); - markerData.put("clusterManagerId", clusterManagerId); - return markerData; + Bitmap fakeBitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888); + ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + fakeBitmap.compress(Bitmap.CompressFormat.PNG, 100, byteArrayOutputStream); + byte[] byteArray = byteArrayOutputStream.toByteArray(); + Map byteData = new HashMap<>(); + byteData.put("byteData", byteArray); + byteData.put("bitmapScaling", "none"); + byteData.put("imagePixelRatio", ""); + Messages.PlatformOffset anchor = + new Messages.PlatformOffset.Builder().setDx(0.0).setDy(0.0).build(); + return new Messages.PlatformMarker.Builder() + .setMarkerId(markerId) + .setConsumeTapEvents(false) + .setIcon(Arrays.asList("bytes", byteData)) + .setAlpha(1.0) + .setDraggable(false) + .setFlat(false) + .setVisible(true) + .setRotation(0.0) + .setZIndex(0.0) + .setPosition( + new Messages.PlatformLatLng.Builder() + .setLatitude(location.get(0)) + .setLongitude(location.get(1)) + .build()) + .setClusterManagerId(clusterManagerId) + .setAnchor(anchor) + .setInfoWindow(new Messages.PlatformInfoWindow.Builder().setAnchor(anchor).build()) + .build(); } } diff --git a/packages/google_maps_flutter/google_maps_flutter_android/android/src/test/java/io/flutter/plugins/googlemaps/MarkersControllerTest.java b/packages/google_maps_flutter/google_maps_flutter_android/android/src/test/java/io/flutter/plugins/googlemaps/MarkersControllerTest.java index 1a50fbc9f7ad..9df0b8d523db 100644 --- a/packages/google_maps_flutter/google_maps_flutter_android/android/src/test/java/io/flutter/plugins/googlemaps/MarkersControllerTest.java +++ b/packages/google_maps_flutter/google_maps_flutter_android/android/src/test/java/io/flutter/plugins/googlemaps/MarkersControllerTest.java @@ -14,6 +14,7 @@ import android.content.Context; import android.content.res.AssetManager; +import android.graphics.Bitmap; import android.os.Build; import androidx.test.core.app.ApplicationProvider; import com.google.android.gms.maps.GoogleMap; @@ -23,16 +24,20 @@ import com.google.maps.android.collections.MarkerManager; import io.flutter.plugin.common.BinaryMessenger; import io.flutter.plugins.googlemaps.Messages.MapsCallbackApi; -import java.util.ArrayList; +import java.io.ByteArrayOutputStream; +import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; +import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; +import org.mockito.Mock; import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; import org.robolectric.RobolectricTestRunner; import org.robolectric.annotation.Config; @@ -48,15 +53,52 @@ public class MarkersControllerTest { private MarkerManager.Collection markerCollection; private AssetManager assetManager; private final float density = 1; + private AutoCloseable mocksClosable; + + @Mock private Convert.BitmapDescriptorFactoryWrapper bitmapDescriptorFactoryWrapper; + + private static Messages.PlatformMarker.Builder defaultMarkerBuilder() { + Bitmap fakeBitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888); + ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + fakeBitmap.compress(Bitmap.CompressFormat.PNG, 100, byteArrayOutputStream); + byte[] byteArray = byteArrayOutputStream.toByteArray(); + Map byteData = new HashMap<>(); + byteData.put("byteData", byteArray); + byteData.put("bitmapScaling", "none"); + byteData.put("imagePixelRatio", ""); + Messages.PlatformOffset anchor = + new Messages.PlatformOffset.Builder().setDx(0.5).setDy(0.0).build(); + Messages.PlatformInfoWindow infoWindow = + new Messages.PlatformInfoWindow.Builder().setAnchor(anchor).build(); + return new Messages.PlatformMarker.Builder() + .setPosition( + new Messages.PlatformLatLng.Builder().setLatitude(0.0).setLongitude(0.0).build()) + .setAnchor(new Messages.PlatformOffset.Builder().setDx(0.0).setDy(0.0).build()) + .setFlat(false) + .setDraggable(false) + .setVisible(true) + .setAlpha(1.0) + .setRotation(0.0) + .setZIndex(0.0) + .setConsumeTapEvents(false) + .setIcon(Arrays.asList("bytes", byteData)) + .setInfoWindow(infoWindow); + } @Before public void setUp() { + mocksClosable = MockitoAnnotations.openMocks(this); assetManager = ApplicationProvider.getApplicationContext().getAssets(); context = ApplicationProvider.getApplicationContext(); flutterApi = spy(new MapsCallbackApi(mock(BinaryMessenger.class))); clusterManagersController = spy(new ClusterManagersController(flutterApi, context)); controller = - new MarkersController(flutterApi, clusterManagersController, assetManager, density); + new MarkersController( + flutterApi, + clusterManagersController, + assetManager, + density, + bitmapDescriptorFactoryWrapper); googleMap = mock(GoogleMap.class); markerManager = new MarkerManager(googleMap); markerCollection = markerManager.newCollection(); @@ -64,6 +106,11 @@ public void setUp() { clusterManagersController.init(googleMap, markerManager); } + @After + public void close() throws Exception { + mocksClosable.close(); + } + @Test public void controller_OnMarkerDragStart() { final Marker marker = mock(Marker.class); @@ -74,12 +121,9 @@ public void controller_OnMarkerDragStart() { when(googleMap.addMarker(any(MarkerOptions.class))).thenReturn(marker); final LatLng latLng = new LatLng(1.1, 2.2); - final Map markerOptions = new HashMap<>(); - markerOptions.put("markerId", googleMarkerId); final List markers = - Collections.singletonList( - new Messages.PlatformMarker.Builder().setJson(markerOptions).build()); + Collections.singletonList(defaultMarkerBuilder().setMarkerId(googleMarkerId).build()); controller.addMarkers(markers); controller.onMarkerDragStart(googleMarkerId, latLng); @@ -97,12 +141,9 @@ public void controller_OnMarkerDragEnd() { when(googleMap.addMarker(any(MarkerOptions.class))).thenReturn(marker); final LatLng latLng = new LatLng(1.1, 2.2); - final Map markerOptions = new HashMap<>(); - markerOptions.put("markerId", googleMarkerId); final List markers = - Collections.singletonList( - new Messages.PlatformMarker.Builder().setJson(markerOptions).build()); + Collections.singletonList(defaultMarkerBuilder().setMarkerId(googleMarkerId).build()); controller.addMarkers(markers); controller.onMarkerDragEnd(googleMarkerId, latLng); @@ -120,12 +161,10 @@ public void controller_OnMarkerDrag() { when(googleMap.addMarker(any(MarkerOptions.class))).thenReturn(marker); final LatLng latLng = new LatLng(1.1, 2.2); - final Map markerOptions = new HashMap<>(); - markerOptions.put("markerId", googleMarkerId); final List markers = - Collections.singletonList( - new Messages.PlatformMarker.Builder().setJson(markerOptions).build()); + Collections.singletonList(defaultMarkerBuilder().setMarkerId(googleMarkerId).build()); + controller.addMarkers(markers); controller.onMarkerDrag(googleMarkerId, latLng); @@ -133,16 +172,13 @@ public void controller_OnMarkerDrag() { .onMarkerDrag(eq(googleMarkerId), eq(Convert.latLngToPigeon(latLng)), any()); } - @Test(expected = IllegalArgumentException.class) + @Test(expected = IllegalStateException.class) public void controller_AddMarkerThrowsErrorIfMarkerIdIsNull() { - final Map markerOptions = new HashMap<>(); - final List markers = - Collections.singletonList( - new Messages.PlatformMarker.Builder().setJson(markerOptions).build()); + Collections.singletonList(defaultMarkerBuilder().build()); try { controller.addMarkers(markers); - } catch (IllegalArgumentException e) { + } catch (IllegalStateException e) { assertEquals("markerId was null", e.getMessage()); throw e; } @@ -155,24 +191,17 @@ public void controller_AddChangeAndRemoveMarkerWithClusterManagerId() { final String googleMarkerId = "abc123"; final String clusterManagerId = "cm123"; - when(marker.getId()).thenReturn(googleMarkerId); - - final LatLng latLng1 = new LatLng(1.1, 2.2); - final List location1 = new ArrayList<>(); - location1.add(latLng1.latitude); - location1.add(latLng1.longitude); - - final Map markerOptions1 = new HashMap<>(); - markerOptions1.put("markerId", googleMarkerId); - markerOptions1.put("position", location1); - markerOptions1.put("clusterManagerId", clusterManagerId); + final Messages.PlatformMarker.Builder builder = defaultMarkerBuilder(); + builder + .setMarkerId(googleMarkerId) + .setClusterManagerId(clusterManagerId) + .setPosition( + new Messages.PlatformLatLng.Builder().setLatitude(1.1).setLongitude(2.2).build()); - final List markers = - Collections.singletonList( - new Messages.PlatformMarker.Builder().setJson(markerOptions1).build()); + when(marker.getId()).thenReturn(googleMarkerId); // Add marker and capture the markerBuilder - controller.addMarkers(markers); + controller.addMarkers(Collections.singletonList(builder.build())); ArgumentCaptor captor = ArgumentCaptor.forClass(MarkerBuilder.class); Mockito.verify(clusterManagersController, times(1)).addItem(captor.capture()); MarkerBuilder capturedMarkerBuilder = captor.getValue(); @@ -183,17 +212,13 @@ public void controller_AddChangeAndRemoveMarkerWithClusterManagerId() { // Change marker to test that markerController is created and the marker can be updated final LatLng latLng2 = new LatLng(3.3, 4.4); - final List location2 = new ArrayList<>(); - location2.add(latLng2.latitude); - location2.add(latLng2.longitude); - - final Map markerOptions2 = new HashMap<>(); - markerOptions2.put("markerId", googleMarkerId); - markerOptions2.put("position", location2); - markerOptions2.put("clusterManagerId", clusterManagerId); - final List updatedMarkers = - Collections.singletonList( - new Messages.PlatformMarker.Builder().setJson(markerOptions2).build()); + + builder.setPosition( + new Messages.PlatformLatLng.Builder() + .setLatitude(latLng2.latitude) + .setLongitude(latLng2.longitude) + .build()); + final List updatedMarkers = Collections.singletonList(builder.build()); controller.changeMarkers(updatedMarkers); Mockito.verify(marker, times(1)).setPosition(latLng2); @@ -219,13 +244,9 @@ public void controller_AddChangeAndRemoveMarkerWithoutClusterManagerId() { when(marker.getId()).thenReturn(googleMarkerId); when(googleMap.addMarker(any(MarkerOptions.class))).thenReturn(marker); - final Map markerOptions1 = new HashMap<>(); - markerOptions1.put("markerId", googleMarkerId); - - final List markers = - Collections.singletonList( - new Messages.PlatformMarker.Builder().setJson(markerOptions1).build()); - controller.addMarkers(markers); + final Messages.PlatformMarker.Builder builder = defaultMarkerBuilder(); + builder.setMarkerId(googleMarkerId); + controller.addMarkers(Collections.singletonList(builder.build())); // clusterManagersController should not be called when adding the marker Mockito.verify(clusterManagersController, times(0)).addItem(any()); @@ -233,13 +254,9 @@ public void controller_AddChangeAndRemoveMarkerWithoutClusterManagerId() { Mockito.verify(spyMarkerCollection, times(1)).addMarker(any(MarkerOptions.class)); final float alpha = 0.1f; - final Map markerOptions2 = new HashMap<>(); - markerOptions2.put("markerId", googleMarkerId); - markerOptions2.put("alpha", alpha); final List markerUpdates = - Collections.singletonList( - new Messages.PlatformMarker.Builder().setJson(markerOptions2).build()); + Collections.singletonList(builder.setAlpha((double) alpha).build()); controller.changeMarkers(markerUpdates); Mockito.verify(marker, times(1)).setAlpha(alpha); diff --git a/packages/google_maps_flutter/google_maps_flutter_android/lib/src/google_maps_flutter_android.dart b/packages/google_maps_flutter/google_maps_flutter_android/lib/src/google_maps_flutter_android.dart index f8b4f158ec94..b7051ca679ef 100644 --- a/packages/google_maps_flutter/google_maps_flutter_android/lib/src/google_maps_flutter_android.dart +++ b/packages/google_maps_flutter/google_maps_flutter_android/lib/src/google_maps_flutter_android.dart @@ -681,6 +681,10 @@ class GoogleMapsFlutterAndroid extends GoogleMapsFlutterPlatform { latitude: latLng.latitude, longitude: latLng.longitude); } + static PlatformOffset _platformOffsetFromOffset(Offset offset) { + return PlatformOffset(dx: offset.dx, dy: offset.dy); + } + static ScreenCoordinate _screenCoordinateFromPlatformPoint( PlatformPoint point) { return ScreenCoordinate(x: point.x, y: point.y); @@ -692,10 +696,17 @@ class GoogleMapsFlutterAndroid extends GoogleMapsFlutterPlatform { } static PlatformCircle _platformCircleFromCircle(Circle circle) { - // This cast is not ideal, but the Java code already assumes this format. - // See the TODOs at the top of this file and on the 'json' field in - // messages.dart. - return PlatformCircle(json: circle.toJson() as Map); + return PlatformCircle( + consumeTapEvents: circle.consumeTapEvents, + fillColor: circle.fillColor.value, + strokeColor: circle.strokeColor.value, + visible: circle.visible, + strokeWidth: circle.strokeWidth, + zIndex: circle.zIndex.toDouble(), + center: _platformLatLngFromLatLng(circle.center), + radius: circle.radius, + circleId: circle.circleId.value, + ); } static PlatformHeatmap _platformHeatmapFromHeatmap(Heatmap heatmap) { @@ -708,11 +719,30 @@ class GoogleMapsFlutterAndroid extends GoogleMapsFlutterPlatform { identifier: clusterManager.clusterManagerId.value); } + static PlatformInfoWindow _platformInfoWindowFromInfoWindow( + InfoWindow window) { + return PlatformInfoWindow( + title: window.title, + snippet: window.snippet, + anchor: _platformOffsetFromOffset(window.anchor)); + } + static PlatformMarker _platformMarkerFromMarker(Marker marker) { - // This cast is not ideal, but the Java code already assumes this format. - // See the TODOs at the top of this file and on the 'json' field in - // messages.dart. - return PlatformMarker(json: marker.toJson() as Map); + return PlatformMarker( + alpha: marker.alpha, + anchor: _platformOffsetFromOffset(marker.anchor), + consumeTapEvents: marker.consumeTapEvents, + draggable: marker.draggable, + flat: marker.flat, + icon: marker.icon.toJson(), + infoWindow: _platformInfoWindowFromInfoWindow(marker.infoWindow), + position: _platformLatLngFromLatLng(marker.position), + rotation: marker.rotation, + visible: marker.visible, + zIndex: marker.zIndex, + markerId: marker.markerId.value, + clusterManagerId: marker.clusterManagerId?.value, + ); } static PlatformPolygon _platformPolygonFromPolygon(Polygon polygon) { diff --git a/packages/google_maps_flutter/google_maps_flutter_android/lib/src/messages.g.dart b/packages/google_maps_flutter/google_maps_flutter_android/lib/src/messages.g.dart index 92c53604baaf..d28a12eb1b52 100644 --- a/packages/google_maps_flutter/google_maps_flutter_android/lib/src/messages.g.dart +++ b/packages/google_maps_flutter/google_maps_flutter_android/lib/src/messages.g.dart @@ -108,24 +108,61 @@ class PlatformCameraUpdate { /// Pigeon equivalent of the Circle class. class PlatformCircle { PlatformCircle({ - required this.json, + this.consumeTapEvents = false, + this.fillColor = 0x00000000, + this.strokeColor = 0xFF000000, + this.visible = true, + this.strokeWidth = 10, + this.zIndex = 0.0, + required this.center, + this.radius = 0, + required this.circleId, }); - /// The circle data, as JSON. This should only be set from - /// Circle.toJson, and the native code must interpret it according to the - /// internal implementation details of that method. - Map json; + bool consumeTapEvents; + + int fillColor; + + int strokeColor; + + bool visible; + + int strokeWidth; + + double zIndex; + + PlatformLatLng center; + + double radius; + + String circleId; Object encode() { return [ - json, + consumeTapEvents, + fillColor, + strokeColor, + visible, + strokeWidth, + zIndex, + center, + radius, + circleId, ]; } static PlatformCircle decode(Object result) { result as List; return PlatformCircle( - json: (result[0] as Map?)!.cast(), + consumeTapEvents: result[0]! as bool, + fillColor: result[1]! as int, + strokeColor: result[2]! as int, + visible: result[3]! as bool, + strokeWidth: result[4]! as int, + zIndex: result[5]! as double, + center: result[6]! as PlatformLatLng, + radius: result[7]! as double, + circleId: result[8]! as String, ); } } @@ -177,27 +214,143 @@ class PlatformClusterManager { } } +/// Pigeon equivalent of the Offset class. +class PlatformOffset { + PlatformOffset({ + required this.dx, + required this.dy, + }); + + double dx; + + double dy; + + Object encode() { + return [ + dx, + dy, + ]; + } + + static PlatformOffset decode(Object result) { + result as List; + return PlatformOffset( + dx: result[0]! as double, + dy: result[1]! as double, + ); + } +} + +/// Pigeon equivalent of the InfoWindow class. +class PlatformInfoWindow { + PlatformInfoWindow({ + this.title, + this.snippet, + required this.anchor, + }); + + String? title; + + String? snippet; + + PlatformOffset anchor; + + Object encode() { + return [ + title, + snippet, + anchor, + ]; + } + + static PlatformInfoWindow decode(Object result) { + result as List; + return PlatformInfoWindow( + title: result[0] as String?, + snippet: result[1] as String?, + anchor: result[2]! as PlatformOffset, + ); + } +} + /// Pigeon equivalent of the Marker class. class PlatformMarker { PlatformMarker({ - required this.json, + this.alpha = 1.0, + required this.anchor, + this.consumeTapEvents = false, + this.draggable = false, + this.flat = false, + this.icon = const ['defaultMarker'], + required this.infoWindow, + required this.position, + this.rotation = 0.0, + this.visible = true, + this.zIndex = 0.0, + required this.markerId, + this.clusterManagerId, }); - /// The marker data, as JSON. This should only be set from - /// Marker.toJson, and the native code must interpret it according to the - /// internal implementation details of that method. - Map json; + double alpha; + + PlatformOffset anchor; + + bool consumeTapEvents; + + bool draggable; + + bool flat; + + Object icon; + + PlatformInfoWindow infoWindow; + + PlatformLatLng position; + + double rotation; + + bool visible; + + double zIndex; + + String markerId; + + String? clusterManagerId; Object encode() { return [ - json, + alpha, + anchor, + consumeTapEvents, + draggable, + flat, + icon, + infoWindow, + position, + rotation, + visible, + zIndex, + markerId, + clusterManagerId, ]; } static PlatformMarker decode(Object result) { result as List; return PlatformMarker( - json: (result[0] as Map?)!.cast(), + alpha: result[0]! as double, + anchor: result[1]! as PlatformOffset, + consumeTapEvents: result[2]! as bool, + draggable: result[3]! as bool, + flat: result[4]! as bool, + icon: result[5]!, + infoWindow: result[6]! as PlatformInfoWindow, + position: result[7]! as PlatformLatLng, + rotation: result[8]! as double, + visible: result[9]! as bool, + zIndex: result[10]! as double, + markerId: result[11]! as String, + clusterManagerId: result[12] as String?, ); } } @@ -754,56 +907,62 @@ class _PigeonCodec extends StandardMessageCodec { } else if (value is PlatformClusterManager) { buffer.putUint8(133); writeValue(buffer, value.encode()); - } else if (value is PlatformMarker) { + } else if (value is PlatformOffset) { buffer.putUint8(134); writeValue(buffer, value.encode()); - } else if (value is PlatformPolygon) { + } else if (value is PlatformInfoWindow) { buffer.putUint8(135); writeValue(buffer, value.encode()); - } else if (value is PlatformPolyline) { + } else if (value is PlatformMarker) { buffer.putUint8(136); writeValue(buffer, value.encode()); - } else if (value is PlatformTile) { + } else if (value is PlatformPolygon) { buffer.putUint8(137); writeValue(buffer, value.encode()); - } else if (value is PlatformTileOverlay) { + } else if (value is PlatformPolyline) { buffer.putUint8(138); writeValue(buffer, value.encode()); - } else if (value is PlatformEdgeInsets) { + } else if (value is PlatformTile) { buffer.putUint8(139); writeValue(buffer, value.encode()); - } else if (value is PlatformLatLng) { + } else if (value is PlatformTileOverlay) { buffer.putUint8(140); writeValue(buffer, value.encode()); - } else if (value is PlatformLatLngBounds) { + } else if (value is PlatformEdgeInsets) { buffer.putUint8(141); writeValue(buffer, value.encode()); - } else if (value is PlatformCluster) { + } else if (value is PlatformLatLng) { buffer.putUint8(142); writeValue(buffer, value.encode()); - } else if (value is PlatformCameraTargetBounds) { + } else if (value is PlatformLatLngBounds) { buffer.putUint8(143); writeValue(buffer, value.encode()); - } else if (value is PlatformMapViewCreationParams) { + } else if (value is PlatformCluster) { buffer.putUint8(144); writeValue(buffer, value.encode()); - } else if (value is PlatformMapConfiguration) { + } else if (value is PlatformCameraTargetBounds) { buffer.putUint8(145); writeValue(buffer, value.encode()); - } else if (value is PlatformPoint) { + } else if (value is PlatformMapViewCreationParams) { buffer.putUint8(146); writeValue(buffer, value.encode()); - } else if (value is PlatformTileLayer) { + } else if (value is PlatformMapConfiguration) { buffer.putUint8(147); writeValue(buffer, value.encode()); - } else if (value is PlatformZoomRange) { + } else if (value is PlatformPoint) { buffer.putUint8(148); writeValue(buffer, value.encode()); - } else if (value is PlatformMapType) { + } else if (value is PlatformTileLayer) { buffer.putUint8(149); + writeValue(buffer, value.encode()); + } else if (value is PlatformZoomRange) { + buffer.putUint8(150); + writeValue(buffer, value.encode()); + } else if (value is PlatformMapType) { + buffer.putUint8(151); writeValue(buffer, value.index); } else if (value is PlatformRendererType) { - buffer.putUint8(150); + buffer.putUint8(152); writeValue(buffer, value.index); } else { super.writeValue(buffer, value); @@ -824,39 +983,43 @@ class _PigeonCodec extends StandardMessageCodec { case 133: return PlatformClusterManager.decode(readValue(buffer)!); case 134: - return PlatformMarker.decode(readValue(buffer)!); + return PlatformOffset.decode(readValue(buffer)!); case 135: - return PlatformPolygon.decode(readValue(buffer)!); + return PlatformInfoWindow.decode(readValue(buffer)!); case 136: - return PlatformPolyline.decode(readValue(buffer)!); + return PlatformMarker.decode(readValue(buffer)!); case 137: - return PlatformTile.decode(readValue(buffer)!); + return PlatformPolygon.decode(readValue(buffer)!); case 138: - return PlatformTileOverlay.decode(readValue(buffer)!); + return PlatformPolyline.decode(readValue(buffer)!); case 139: - return PlatformEdgeInsets.decode(readValue(buffer)!); + return PlatformTile.decode(readValue(buffer)!); case 140: - return PlatformLatLng.decode(readValue(buffer)!); + return PlatformTileOverlay.decode(readValue(buffer)!); case 141: - return PlatformLatLngBounds.decode(readValue(buffer)!); + return PlatformEdgeInsets.decode(readValue(buffer)!); case 142: - return PlatformCluster.decode(readValue(buffer)!); + return PlatformLatLng.decode(readValue(buffer)!); case 143: - return PlatformCameraTargetBounds.decode(readValue(buffer)!); + return PlatformLatLngBounds.decode(readValue(buffer)!); case 144: - return PlatformMapViewCreationParams.decode(readValue(buffer)!); + return PlatformCluster.decode(readValue(buffer)!); case 145: - return PlatformMapConfiguration.decode(readValue(buffer)!); + return PlatformCameraTargetBounds.decode(readValue(buffer)!); case 146: - return PlatformPoint.decode(readValue(buffer)!); + return PlatformMapViewCreationParams.decode(readValue(buffer)!); case 147: - return PlatformTileLayer.decode(readValue(buffer)!); + return PlatformMapConfiguration.decode(readValue(buffer)!); case 148: - return PlatformZoomRange.decode(readValue(buffer)!); + return PlatformPoint.decode(readValue(buffer)!); case 149: + return PlatformTileLayer.decode(readValue(buffer)!); + case 150: + return PlatformZoomRange.decode(readValue(buffer)!); + case 151: final int? value = readValue(buffer) as int?; return value == null ? null : PlatformMapType.values[value]; - case 150: + case 152: final int? value = readValue(buffer) as int?; return value == null ? null : PlatformRendererType.values[value]; default: diff --git a/packages/google_maps_flutter/google_maps_flutter_android/pigeons/messages.dart b/packages/google_maps_flutter/google_maps_flutter_android/pigeons/messages.dart index 205ce4191b73..778aa17f5471 100644 --- a/packages/google_maps_flutter/google_maps_flutter_android/pigeons/messages.dart +++ b/packages/google_maps_flutter/google_maps_flutter_android/pigeons/messages.dart @@ -55,14 +55,27 @@ class PlatformCameraUpdate { /// Pigeon equivalent of the Circle class. class PlatformCircle { - PlatformCircle(this.json); + PlatformCircle({ + required this.circleId, + required this.center, + this.consumeTapEvents = false, + this.fillColor = 0x00000000, + this.strokeColor = 0xFF000000, + this.visible = true, + this.strokeWidth = 10, + this.zIndex = 0.0, + this.radius = 0, + }); - /// The circle data, as JSON. This should only be set from - /// Circle.toJson, and the native code must interpret it according to the - /// internal implementation details of that method. - // TODO(stuartmorgan): Replace this with structured data. This exists only to - // allow incremental migration to Pigeon. - final Map json; + final bool consumeTapEvents; + final int fillColor; + final int strokeColor; + final bool visible; + final int strokeWidth; + final double zIndex; + final PlatformLatLng center; + final double radius; + final String circleId; } /// Pigeon equivalent of the Heatmap class. @@ -84,16 +97,61 @@ class PlatformClusterManager { final String identifier; } +/// Pigeon equivalent of the Offset class. +class PlatformOffset { + PlatformOffset(this.dx, this.dy); + + final double dx; + final double dy; +} + +/// Pigeon equivalent of the InfoWindow class. +class PlatformInfoWindow { + PlatformInfoWindow({ + required this.anchor, + this.title, + this.snippet, + }); + + final String? title; + final String? snippet; + final PlatformOffset anchor; +} + /// Pigeon equivalent of the Marker class. class PlatformMarker { - PlatformMarker(this.json); + PlatformMarker({ + required this.markerId, + this.alpha = 1.0, + required this.anchor, + this.consumeTapEvents = false, + this.draggable = false, + this.flat = false, + this.icon = const ['defaultMarker'], + required this.infoWindow, + required this.position, + this.rotation = 0.0, + this.visible = true, + this.zIndex = 0.0, + this.clusterManagerId, + }); - /// The marker data, as JSON. This should only be set from - /// Marker.toJson, and the native code must interpret it according to the - /// internal implementation details of that method. - // TODO(stuartmorgan): Replace this with structured data. This exists only to - // allow incremental migration to Pigeon. - final Map json; + final double alpha; + final PlatformOffset anchor; + final bool consumeTapEvents; + final bool draggable; + final bool flat; + + /// The icon as JSON data. + // TODO(schectman): replace this with structured data. + final Object icon; + final PlatformInfoWindow infoWindow; + final PlatformLatLng position; + final double rotation; + final bool visible; + final double zIndex; + final String markerId; + final String? clusterManagerId; } /// Pigeon equivalent of the Polygon class. diff --git a/packages/google_maps_flutter/google_maps_flutter_android/pubspec.yaml b/packages/google_maps_flutter/google_maps_flutter_android/pubspec.yaml index 56c520593ff2..204de6405720 100644 --- a/packages/google_maps_flutter/google_maps_flutter_android/pubspec.yaml +++ b/packages/google_maps_flutter/google_maps_flutter_android/pubspec.yaml @@ -2,7 +2,7 @@ name: google_maps_flutter_android description: Android implementation of the google_maps_flutter plugin. repository: https://github.com/flutter/packages/tree/main/packages/google_maps_flutter/google_maps_flutter_android issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+maps%22 -version: 2.14.0 +version: 2.14.1 environment: sdk: ^3.4.0 diff --git a/packages/google_maps_flutter/google_maps_flutter_android/test/google_maps_flutter_android_test.dart b/packages/google_maps_flutter/google_maps_flutter_android/test/google_maps_flutter_android_test.dart index b6808bc61ee2..95a06148a3ba 100644 --- a/packages/google_maps_flutter/google_maps_flutter_android/test/google_maps_flutter_android_test.dart +++ b/packages/google_maps_flutter/google_maps_flutter_android/test/google_maps_flutter_android_test.dart @@ -300,11 +300,46 @@ void main() { expect(toRemove.length, 1); expect(toRemove.first, object1.circleId.value); // Object two should be changed. - expect(toChange.length, 1); - expect(toChange.first?.json, object2new.toJson()); + { + expect(toChange.length, 1); + final List? encoded = toChange.first?.encode() as List?; + expect(encoded?.getRange(0, 6), [ + object2new.consumeTapEvents, + object2new.fillColor.value, + object2new.strokeColor.value, + object2new.visible, + object2new.strokeWidth, + object2new.zIndex.toDouble(), + ]); + final PlatformLatLng? latLng = encoded?[6] as PlatformLatLng?; + expect(latLng?.latitude, object2new.center.latitude); + expect(latLng?.longitude, object2new.center.longitude); + expect(encoded?.getRange(7, 9), [ + object2new.radius, + object2new.circleId.value, + ]); + } // Object 3 should be added. expect(toAdd.length, 1); - expect(toAdd.first?.json, object3.toJson()); + { + expect(toAdd.length, 1); + final List? encoded = toAdd.first?.encode() as List?; + expect(encoded?.getRange(0, 6), [ + object3.consumeTapEvents, + object3.fillColor.value, + object3.strokeColor.value, + object3.visible, + object3.strokeWidth, + object3.zIndex.toDouble(), + ]); + final PlatformLatLng? latLng = encoded?[6] as PlatformLatLng?; + expect(latLng?.latitude, object3.center.latitude); + expect(latLng?.longitude, object3.center.longitude); + expect(encoded?.getRange(7, 9), [ + object3.radius, + object3.circleId.value, + ]); + } }); test('updateClusterManagers passes expected arguments', () async { @@ -361,11 +396,65 @@ void main() { expect(toRemove.length, 1); expect(toRemove.first, object1.markerId.value); // Object two should be changed. - expect(toChange.length, 1); - expect(toChange.first?.json, object2new.toJson()); + { + expect(toChange.length, 1); + final List? encoded = toChange.first?.encode() as List?; + expect(encoded?[0], object2new.alpha); + final PlatformOffset? offset = encoded?[1] as PlatformOffset?; + expect(offset?.dx, object2new.anchor.dx); + expect(offset?.dy, object2new.anchor.dy); + expect(encoded?.getRange(2, 6).toList(), [ + object2new.consumeTapEvents, + object2new.draggable, + object2new.flat, + object2new.icon.toJson(), + ]); + final PlatformInfoWindow? window = encoded?[6] as PlatformInfoWindow?; + expect(window?.title, object2new.infoWindow.title); + expect(window?.snippet, object2new.infoWindow.snippet); + expect(window?.anchor.dx, object2new.infoWindow.anchor.dx); + expect(window?.anchor.dy, object2new.infoWindow.anchor.dy); + final PlatformLatLng? latLng = encoded?[7] as PlatformLatLng?; + expect(latLng?.latitude, object2new.position.latitude); + expect(latLng?.longitude, object2new.position.longitude); + expect(encoded?.getRange(8, 13), [ + object2new.rotation, + object2new.visible, + object2new.zIndex, + object2new.markerId.value, + object2new.clusterManagerId?.value, + ]); + } // Object 3 should be added. - expect(toAdd.length, 1); - expect(toAdd.first?.json, object3.toJson()); + { + expect(toAdd.length, 1); + final List? encoded = toAdd.first?.encode() as List?; + expect(encoded?[0], object3.alpha); + final PlatformOffset? offset = encoded?[1] as PlatformOffset?; + expect(offset?.dx, object3.anchor.dx); + expect(offset?.dy, object3.anchor.dy); + expect(encoded?.getRange(2, 6).toList(), [ + object3.consumeTapEvents, + object3.draggable, + object3.flat, + object3.icon.toJson(), + ]); + final PlatformInfoWindow? window = encoded?[6] as PlatformInfoWindow?; + expect(window?.title, object3.infoWindow.title); + expect(window?.snippet, object3.infoWindow.snippet); + expect(window?.anchor.dx, object3.infoWindow.anchor.dx); + expect(window?.anchor.dy, object3.infoWindow.anchor.dy); + final PlatformLatLng? latLng = encoded?[7] as PlatformLatLng?; + expect(latLng?.latitude, object3.position.latitude); + expect(latLng?.longitude, object3.position.longitude); + expect(encoded?.getRange(8, 13), [ + object3.rotation, + object3.visible, + object3.zIndex, + object3.markerId.value, + object3.clusterManagerId?.value, + ]); + } }); test('updatePolygons passes expected arguments', () async {