Skip to content
This repository was archived by the owner on Feb 22, 2023. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@

/** Conversions between JSON-like values and GoogleMaps data types. */
class Convert {

private static BitmapDescriptor toBitmapDescriptor(Object o) {
final List<?> data = toList(o);
switch (toString(data.get(0))) {
Expand Down Expand Up @@ -101,7 +102,7 @@ private static Float toFloatWrapper(Object o) {
return (o == null) ? null : toFloat(o);
}

static int toInt(Object o) {
private static int toInt(Object o) {
return ((Number) o).intValue();
}

Expand All @@ -117,6 +118,15 @@ static Object toJson(CameraPosition position) {
return data;
}

static Object toJson(String markerId) {
if (markerId == null) {
return null;
}
final Map<String, Object> data = new HashMap<>(1);
data.put("markerId", markerId);
return data;
}

private static Object toJson(LatLng latLng) {
return Arrays.asList(latLng.latitude, latLng.longitude);
}
Expand All @@ -138,19 +148,15 @@ private static List<?> toList(Object o) {
return (List<?>) o;
}

static long toLong(Object o) {
return ((Number) o).longValue();
}

static Map<?, ?> toMap(Object o) {
private static Map<?, ?> toMap(Object o) {
return (Map<?, ?>) o;
}

private static float toFractionalPixels(Object o, float density) {
return toFloat(o) * density;
}

static int toPixels(Object o, float density) {
private static int toPixels(Object o, float density) {
return (int) toFractionalPixels(o, density);
}

Expand Down Expand Up @@ -211,7 +217,8 @@ static void interpretGoogleMapOptions(Object o, GoogleMapOptionsSink sink) {
}
}

static void interpretMarkerOptions(Object o, MarkerOptionsSink sink) {
/** Returns the dartMarkerId of the interpreted marker. */
static String interpretMarkerOptions(Object o, MarkerOptionsSink sink) {
final Map<?, ?> data = toMap(o);
final Object alpha = data.get("alpha");
if (alpha != null) {
Expand All @@ -222,9 +229,9 @@ static void interpretMarkerOptions(Object o, MarkerOptionsSink sink) {
final List<?> anchorData = toList(anchor);
sink.setAnchor(toFloat(anchorData.get(0)), toFloat(anchorData.get(1)));
}
final Object consumesTapEvents = data.get("consumesTapEvents");
if (consumesTapEvents != null) {
sink.setConsumeTapEvents(toBoolean(consumesTapEvents));
final Object consumeTapEvents = data.get("consumeTapEvents");
if (consumeTapEvents != null) {
sink.setConsumeTapEvents(toBoolean(consumeTapEvents));
}
final Object draggable = data.get("draggable");
if (draggable != null) {
Expand All @@ -238,15 +245,10 @@ static void interpretMarkerOptions(Object o, MarkerOptionsSink sink) {
if (icon != null) {
sink.setIcon(toBitmapDescriptor(icon));
}
final Object infoWindowAnchor = data.get("infoWindowAnchor");
if (infoWindowAnchor != null) {
final List<?> anchorData = toList(infoWindowAnchor);
sink.setInfoWindowAnchor(toFloat(anchorData.get(0)), toFloat(anchorData.get(1)));
}
final Object infoWindowText = data.get("infoWindowText");
if (infoWindowText != null) {
final List<?> textData = toList(infoWindowText);
sink.setInfoWindowText(toString(textData.get(0)), toString(textData.get(1)));

final Object infoWindow = data.get("infoWindow");
if (infoWindow != null) {
interpretInfoWindowOptions(sink, (Map<String, Object>) infoWindow);
}
final Object position = data.get("position");
if (position != null) {
Expand All @@ -264,5 +266,26 @@ static void interpretMarkerOptions(Object o, MarkerOptionsSink sink) {
if (zIndex != null) {
sink.setZIndex(toFloat(zIndex));
}
final String markerId = (String) data.get("markerId");
if (markerId == null) {
throw new IllegalArgumentException("markerId was null");
} else {
return markerId;
}
}

private static void interpretInfoWindowOptions(
MarkerOptionsSink sink, Map<String, Object> infoWindow) {
String title = (String) infoWindow.get("title");
String snippet = (String) infoWindow.get("snippet");
// snippet is nullable.
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)));
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ class GoogleMapBuilder implements GoogleMapOptionsSink {
private final GoogleMapOptions options = new GoogleMapOptions();
private boolean trackCameraPosition = false;
private boolean myLocationEnabled = false;
private Object initialMarkers;

GoogleMapController build(
int id, Context context, AtomicInteger state, PluginRegistry.Registrar registrar) {
Expand All @@ -23,10 +24,11 @@ GoogleMapController build(
controller.init();
controller.setMyLocationEnabled(myLocationEnabled);
controller.setTrackCameraPosition(trackCameraPosition);
controller.setInitialMarkers(initialMarkers);
return controller;
}

public void setInitialCameraPosition(CameraPosition position) {
void setInitialCameraPosition(CameraPosition position) {
options.camera(position);
}

Expand Down Expand Up @@ -84,4 +86,9 @@ public void setZoomGesturesEnabled(boolean zoomGesturesEnabled) {
public void setMyLocationEnabled(boolean myLocationEnabled) {
this.myLocationEnabled = myLocationEnabled;
}

@Override
public void setInitialMarkers(Object initialMarkers) {
this.initialMarkers = initialMarkers;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import static io.flutter.plugins.googlemaps.GoogleMapsPlugin.STOPPED;

import android.Manifest;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.Application;
import android.content.Context;
Expand All @@ -27,13 +28,13 @@
import com.google.android.gms.maps.model.CameraPosition;
import com.google.android.gms.maps.model.LatLngBounds;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;
import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel;
import io.flutter.plugin.common.PluginRegistry;
import io.flutter.plugin.platform.PlatformView;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;

Expand All @@ -48,15 +49,13 @@ final class GoogleMapController
GoogleMapOptionsSink,
MethodChannel.MethodCallHandler,
OnMapReadyCallback,
OnMarkerTappedListener,
PlatformView {
private static final String TAG = "GoogleMapController";
private final int id;
private final AtomicInteger activityState;
private final MethodChannel methodChannel;
private final PluginRegistry.Registrar registrar;
private final MapView mapView;
private final Map<String, MarkerController> markers;
private GoogleMap googleMap;
private boolean trackCameraPosition = false;
private boolean myLocationEnabled = false;
Expand All @@ -65,6 +64,7 @@ final class GoogleMapController
private MethodChannel.Result mapReadyResult;
private final int registrarActivityHashCode;
private final Context context;
private final MarkersController markersController;

GoogleMapController(
int id,
Expand All @@ -77,12 +77,12 @@ final class GoogleMapController
this.activityState = activityState;
this.registrar = registrar;
this.mapView = new MapView(context, options);
this.markers = new HashMap<>();
this.density = context.getResources().getDisplayMetrics().density;
methodChannel =
new MethodChannel(registrar.messenger(), "plugins.flutter.io/google_maps_" + id);
methodChannel.setMethodCallHandler(this);
this.registrarActivityHashCode = registrar.activity().hashCode();
this.markersController = new MarkersController(methodChannel);
}

@Override
Expand Down Expand Up @@ -140,31 +140,6 @@ private CameraPosition getCameraPosition() {
return trackCameraPosition ? googleMap.getCameraPosition() : null;
}

private MarkerBuilder newMarkerBuilder() {
return new MarkerBuilder(this);
}

Marker addMarker(MarkerOptions markerOptions, boolean consumesTapEvents) {
final Marker marker = googleMap.addMarker(markerOptions);
markers.put(marker.getId(), new MarkerController(marker, consumesTapEvents, this));
return marker;
}

private void removeMarker(String markerId) {
final MarkerController markerController = markers.remove(markerId);
if (markerController != null) {
markerController.remove();
}
}

private MarkerController marker(String markerId) {
final MarkerController marker = markers.get(markerId);
if (marker == null) {
throw new IllegalArgumentException("Unknown marker: " + markerId);
}
return marker;
}

@Override
public void onMapReady(GoogleMap googleMap) {
this.googleMap = googleMap;
Expand All @@ -178,6 +153,7 @@ public void onMapReady(GoogleMap googleMap) {
googleMap.setOnCameraIdleListener(this);
googleMap.setOnMarkerClickListener(this);
updateMyLocationEnabled();
markersController.setGoogleMap(googleMap);
}

@Override
Expand Down Expand Up @@ -212,27 +188,14 @@ public void onMethodCall(MethodCall call, MethodChannel.Result result) {
result.success(null);
break;
}
case "marker#add":
{
final MarkerBuilder markerBuilder = newMarkerBuilder();
Convert.interpretMarkerOptions(call.argument("options"), markerBuilder);
final String markerId = markerBuilder.build();
result.success(markerId);
break;
}
case "marker#remove":
{
final String markerId = call.argument("marker");
removeMarker(markerId);
result.success(null);
break;
}
case "marker#update":
case "markers#update":
{
final String markerId = call.argument("marker");
final MarkerController marker = marker(markerId);
Convert.interpretMarkerOptions(call.argument("options"), marker);
result.success(null);
Object markersToAdd = call.argument("markersToAdd");
markersController.addMarkers((List<Object>) markersToAdd);
Object markersToChange = call.argument("markersToChange");
markersController.changeMarkers((List<Object>) markersToChange);
Object markerIdsToRemove = call.argument("markerIdsToRemove");
markersController.removeMarkers((List<Object>) markerIdsToRemove);
break;
}
default:
Expand All @@ -250,9 +213,7 @@ public void onCameraMoveStarted(int reason) {

@Override
public void onInfoWindowClick(Marker marker) {
final Map<String, Object> arguments = new HashMap<>(2);
arguments.put("marker", marker.getId());
methodChannel.invokeMethod("infoWindow#onTap", arguments);
markersController.onInfoWindowTap(marker.getId());
}

@Override
Expand All @@ -270,17 +231,9 @@ public void onCameraIdle() {
methodChannel.invokeMethod("camera#onIdle", Collections.singletonMap("map", id));
}

@Override
public void onMarkerTapped(Marker marker) {
final Map<String, Object> arguments = new HashMap<>(2);
arguments.put("marker", marker.getId());
methodChannel.invokeMethod("marker#onTap", arguments);
}

@Override
public boolean onMarkerClick(Marker marker) {
final MarkerController markerController = markers.get(marker.getId());
return (markerController != null && markerController.onTap());
return markersController.onMarkerTap(marker.getId());
}

@Override
Expand Down Expand Up @@ -414,6 +367,12 @@ public void setMyLocationEnabled(boolean myLocationEnabled) {
}
}

@Override
public void setInitialMarkers(Object initialMarkers) {
markersController.addMarkers((List<Object>) initialMarkers);
}

@SuppressLint("MissingPermission")
private void updateMyLocationEnabled() {
if (hasLocationPermission()) {
// The plugin doesn't add the location permission by default so that apps that don't need
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ public class GoogleMapFactory extends PlatformViewFactory {
private final AtomicInteger mActivityState;
private final Registrar mPluginRegistrar;

public GoogleMapFactory(AtomicInteger state, Registrar registrar) {
GoogleMapFactory(AtomicInteger state, Registrar registrar) {
super(StandardMessageCodec.INSTANCE);
mActivityState = state;
mPluginRegistrar = registrar;
Expand All @@ -32,6 +32,9 @@ public PlatformView create(Context context, int id, Object args) {
CameraPosition position = Convert.toCameraPosition(params.get("initialCameraPosition"));
builder.setInitialCameraPosition(position);
}
if (params.containsKey("markersToAdd")) {
builder.setInitialMarkers(params.get("markersToAdd"));
}
return builder.build(id, context, mActivityState, mPluginRegistrar);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,4 +27,6 @@ interface GoogleMapOptionsSink {
void setZoomGesturesEnabled(boolean zoomGesturesEnabled);

void setMyLocationEnabled(boolean myLocationEnabled);

void setInitialMarkers(Object initialMarkers);
}
Loading