Skip to content
This repository was archived by the owner on Feb 22, 2023. It is now read-only.

Commit 2db1f4b

Browse files
authored
GoogleMaps on iOS (#525)
1 parent 46affd4 commit 2db1f4b

27 files changed

+795
-179
lines changed

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

Lines changed: 23 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,6 @@ private static BitmapDescriptor toBitmapDescriptor(Object o) {
3737
return BitmapDescriptorFactory.fromAsset(
3838
FlutterMain.getLookupKeyForAsset(toString(data.get(1)), toString(data.get(2))));
3939
}
40-
case "fromFile":
41-
return BitmapDescriptorFactory.fromFile(toString(data.get(1)));
42-
case "fromPath":
43-
return BitmapDescriptorFactory.fromPath(toString(data.get(1)));
4440
}
4541
throw new IllegalArgumentException("Cannot interpret " + o + " as BitmapDescriptor");
4642
}
@@ -59,24 +55,27 @@ private static CameraPosition toCameraPosition(Object o) {
5955
return builder.build();
6056
}
6157

62-
static CameraUpdate toCameraUpdate(Object o) {
58+
static CameraUpdate toCameraUpdate(Object o, float density) {
6359
final List<?> data = toList(o);
6460
switch (toString(data.get(0))) {
6561
case "newCameraPosition":
6662
return CameraUpdateFactory.newCameraPosition(toCameraPosition(data.get(1)));
6763
case "newLatLng":
6864
return CameraUpdateFactory.newLatLng(toLatLng(data.get(1)));
6965
case "newLatLngBounds":
70-
return CameraUpdateFactory.newLatLngBounds(toLatLngBounds(data.get(1)), toInt(data.get(2)));
66+
return CameraUpdateFactory.newLatLngBounds(
67+
toLatLngBounds(data.get(1)), toPixels(data.get(2), density));
7168
case "newLatLngZoom":
7269
return CameraUpdateFactory.newLatLngZoom(toLatLng(data.get(1)), toFloat(data.get(2)));
7370
case "scrollBy":
74-
return CameraUpdateFactory.scrollBy(toFloat(data.get(1)), toFloat(data.get(2)));
71+
return CameraUpdateFactory.scrollBy( //
72+
toFractionalPixels(data.get(1), density), //
73+
toFractionalPixels(data.get(2), density));
7574
case "zoomBy":
7675
if (data.size() == 2) {
7776
return CameraUpdateFactory.zoomBy(toFloat(data.get(1)));
7877
} else {
79-
return CameraUpdateFactory.zoomBy(toFloat(data.get(1)), toPoint(data.get(2)));
78+
return CameraUpdateFactory.zoomBy(toFloat(data.get(1)), toPoint(data.get(2), density));
8079
}
8180
case "zoomIn":
8281
return CameraUpdateFactory.zoomIn();
@@ -142,9 +141,17 @@ static long toLong(Object o) {
142141
return (Map<?, ?>) o;
143142
}
144143

145-
private static Point toPoint(Object o) {
144+
private static float toFractionalPixels(Object o, float density) {
145+
return toFloat(o) * density;
146+
}
147+
148+
static int toPixels(Object o, float density) {
149+
return (int) toFractionalPixels(o, density);
150+
}
151+
152+
private static Point toPoint(Object o, float density) {
146153
final List<?> data = toList(o);
147-
return new Point(toInt(data.get(0)), toInt(data.get(1)));
154+
return new Point(toPixels(data.get(0), density), toPixels(data.get(1), density));
148155
}
149156

150157
private static String toString(Object o) {
@@ -157,15 +164,15 @@ static void interpretGoogleMapOptions(Object o, GoogleMapOptionsSink sink) {
157164
if (cameraPosition != null) {
158165
sink.setCameraPosition(toCameraPosition(cameraPosition));
159166
}
167+
final Object cameraTargetBounds = data.get("cameraTargetBounds");
168+
if (cameraTargetBounds != null) {
169+
final List<?> targetData = toList(cameraTargetBounds);
170+
sink.setCameraTargetBounds(toLatLngBounds(targetData.get(0)));
171+
}
160172
final Object compassEnabled = data.get("compassEnabled");
161173
if (compassEnabled != null) {
162174
sink.setCompassEnabled(toBoolean(compassEnabled));
163175
}
164-
final Object latLngCameraTargetBounds = data.get("latLngCameraTargetBounds");
165-
if (latLngCameraTargetBounds != null) {
166-
final List<?> targetData = toList(latLngCameraTargetBounds);
167-
sink.setLatLngBoundsForCameraTarget(toLatLngBounds(targetData.get(0)));
168-
}
169176
final Object mapType = data.get("mapType");
170177
if (mapType != null) {
171178
sink.setMapType(toInt(mapType));
@@ -212,7 +219,7 @@ static void interpretMarkerOptions(Object o, MarkerOptionsSink sink) {
212219
}
213220
final Object consumesTapEvents = data.get("consumesTapEvents");
214221
if (consumesTapEvents != null) {
215-
sink.setConsumesTapEvents(toBoolean(consumesTapEvents));
222+
sink.setConsumeTapEvents(toBoolean(consumesTapEvents));
216223
}
217224
final Object draggable = data.get("draggable");
218225
if (draggable != null) {
@@ -231,10 +238,6 @@ static void interpretMarkerOptions(Object o, MarkerOptionsSink sink) {
231238
final List<?> anchorData = toList(infoWindowAnchor);
232239
sink.setInfoWindowAnchor(toFloat(anchorData.get(0)), toFloat(anchorData.get(1)));
233240
}
234-
final Object infoWindowShown = data.get("infoWindowShown");
235-
if (infoWindowShown != null) {
236-
sink.setInfoWindowShown(toBoolean(infoWindowShown));
237-
}
238241
final Object infoWindowText = data.get("infoWindowText");
239242
if (infoWindowText != null) {
240243
final List<?> textData = toList(infoWindowText);

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ public void setCompassEnabled(boolean compassEnabled) {
3939
}
4040

4141
@Override
42-
public void setLatLngBoundsForCameraTarget(LatLngBounds bounds) {
42+
public void setCameraTargetBounds(LatLngBounds bounds) {
4343
options.latLngBoundsForCameraTarget(bounds);
4444
}
4545

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

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,8 @@ public void onMapReady(GoogleMap googleMap) {
216216

217217
@Override
218218
public void onCameraMoveStarted(int reason) {
219-
onCameraMoveListener.onCameraMoveStarted(reason);
219+
onCameraMoveListener.onCameraMoveStarted(
220+
reason == GoogleMap.OnCameraMoveStartedListener.REASON_GESTURE);
220221
cancelSnapshotTimerTasks();
221222
}
222223

@@ -347,6 +348,11 @@ public void setCameraPosition(CameraPosition position) {
347348
googleMap.moveCamera(CameraUpdateFactory.newCameraPosition(position));
348349
}
349350

351+
@Override
352+
public void setCameraTargetBounds(LatLngBounds bounds) {
353+
googleMap.setLatLngBoundsForCameraTarget(bounds);
354+
}
355+
350356
@Override
351357
public void setCompassEnabled(boolean compassEnabled) {
352358
googleMap.getUiSettings().setCompassEnabled(compassEnabled);
@@ -357,11 +363,6 @@ public void setMapType(int mapType) {
357363
googleMap.setMapType(mapType);
358364
}
359365

360-
@Override
361-
public void setLatLngBoundsForCameraTarget(LatLngBounds bounds) {
362-
googleMap.setLatLngBoundsForCameraTarget(bounds);
363-
}
364-
365366
@Override
366367
public void setTrackCameraPosition(boolean trackCameraPosition) {
367368
this.trackCameraPosition = trackCameraPosition;

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,21 +11,21 @@
1111
interface GoogleMapOptionsSink {
1212
void setCameraPosition(CameraPosition position);
1313

14-
void setLatLngBoundsForCameraTarget(LatLngBounds bounds);
14+
void setCameraTargetBounds(LatLngBounds bounds);
1515

1616
void setCompassEnabled(boolean compassEnabled);
1717

1818
void setMapType(int mapType);
1919

20-
void setTrackCameraPosition(boolean reportCameraMoveEvents);
20+
void setMinMaxZoomPreference(Float min, Float max);
2121

2222
void setRotateGesturesEnabled(boolean rotateGesturesEnabled);
2323

2424
void setScrollGesturesEnabled(boolean scrollGesturesEnabled);
2525

2626
void setTiltGesturesEnabled(boolean tiltGesturesEnabled);
2727

28-
void setMinMaxZoomPreference(Float min, Float max);
28+
void setTrackCameraPosition(boolean trackCameraPosition);
2929

3030
void setZoomGesturesEnabled(boolean zoomGesturesEnabled);
3131
}

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

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ public class GoogleMapsPlugin implements MethodCallHandler, Application.Activity
3636
private final Map<Long, GoogleMapController> googleMaps = new HashMap<>();
3737
private final Registrar registrar;
3838
private final MethodChannel channel;
39+
private final float density;
3940
private final AtomicInteger state = new AtomicInteger(0);
4041

4142
public static void registerWith(Registrar registrar) {
@@ -49,6 +50,7 @@ public static void registerWith(Registrar registrar) {
4950
private GoogleMapsPlugin(Registrar registrar, MethodChannel channel) {
5051
this.registrar = registrar;
5152
this.channel = channel;
53+
this.density = registrar.context().getResources().getDisplayMetrics().density;
5254
}
5355

5456
@Override
@@ -65,8 +67,8 @@ public void onMethodCall(MethodCall call, Result result) {
6567
}
6668
case "createMap":
6769
{
68-
final int width = Convert.toInt(call.argument("width"));
69-
final int height = Convert.toInt(call.argument("height"));
70+
final int width = Convert.toPixels(call.argument("width"), density);
71+
final int height = Convert.toPixels(call.argument("height"), density);
7072
final Map<?, ?> options = Convert.toMap(call.argument("options"));
7173
final GoogleMapBuilder builder = new GoogleMapBuilder();
7274
Convert.interpretGoogleMapOptions(options, builder);
@@ -76,10 +78,10 @@ public void onMethodCall(MethodCall call, Result result) {
7678
controller.setOnCameraMoveListener(
7779
new OnCameraMoveListener() {
7880
@Override
79-
public void onCameraMoveStarted(int reason) {
81+
public void onCameraMoveStarted(boolean isGesture) {
8082
final Map<String, Object> arguments = new HashMap<>(2);
8183
arguments.put("map", controller.id());
82-
arguments.put("reason", reason);
84+
arguments.put("isGesture", isGesture);
8385
channel.invokeMethod("map#onCameraMoveStarted", arguments);
8486
}
8587

@@ -107,10 +109,11 @@ public void onMarkerTapped(Marker marker) {
107109
channel.invokeMethod("marker#onTap", arguments);
108110
}
109111
});
110-
// result.success is called from controller when the GoogleMaps instance is ready
112+
// result.success is called from controller when the GoogleMaps instance
113+
// is ready
111114
break;
112115
}
113-
case "setMapOptions":
116+
case "updateMapOptions":
114117
{
115118
final GoogleMapController controller = mapsController(call);
116119
Convert.interpretGoogleMapOptions(call.argument("options"), controller);
@@ -120,15 +123,17 @@ public void onMarkerTapped(Marker marker) {
120123
case "moveCamera":
121124
{
122125
final GoogleMapController controller = mapsController(call);
123-
final CameraUpdate cameraUpdate = Convert.toCameraUpdate(call.argument("cameraUpdate"));
126+
final CameraUpdate cameraUpdate =
127+
Convert.toCameraUpdate(call.argument("cameraUpdate"), density);
124128
controller.moveCamera(cameraUpdate);
125129
result.success(null);
126130
break;
127131
}
128132
case "animateCamera":
129133
{
130134
final GoogleMapController controller = mapsController(call);
131-
final CameraUpdate cameraUpdate = Convert.toCameraUpdate(call.argument("cameraUpdate"));
135+
final CameraUpdate cameraUpdate =
136+
Convert.toCameraUpdate(call.argument("cameraUpdate"), density);
132137
controller.animateCamera(cameraUpdate);
133138
result.success(null);
134139
break;
@@ -162,8 +167,8 @@ public void onMarkerTapped(Marker marker) {
162167
case "showMapOverlay":
163168
{
164169
final GoogleMapController controller = mapsController(call);
165-
final int x = Convert.toInt(call.argument("x"));
166-
final int y = Convert.toInt(call.argument("y"));
170+
final int x = Convert.toPixels(call.argument("x"), density);
171+
final int y = Convert.toPixels(call.argument("y"), density);
167172
controller.showOverlay(x, y);
168173
result.success(null);
169174
break;

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

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ class MarkerBuilder implements MarkerOptionsSink {
1313
private final GoogleMapController mapController;
1414
private final MarkerOptions markerOptions;
1515
private boolean consumesTapEvents;
16-
private boolean infoWindowShown;
1716

1817
MarkerBuilder(GoogleMapController mapController) {
1918
this.mapController = mapController;
@@ -22,9 +21,6 @@ class MarkerBuilder implements MarkerOptionsSink {
2221

2322
String build() {
2423
final Marker marker = mapController.addMarker(markerOptions, consumesTapEvents);
25-
if (infoWindowShown) {
26-
marker.showInfoWindow();
27-
}
2824
return marker.getId();
2925
}
3026

@@ -39,7 +35,7 @@ public void setAnchor(float u, float v) {
3935
}
4036

4137
@Override
42-
public void setConsumesTapEvents(boolean consumesTapEvents) {
38+
public void setConsumeTapEvents(boolean consumesTapEvents) {
4339
this.consumesTapEvents = consumesTapEvents;
4440
}
4541

@@ -63,11 +59,6 @@ public void setInfoWindowAnchor(float u, float v) {
6359
markerOptions.infoWindowAnchor(u, v);
6460
}
6561

66-
@Override
67-
public void setInfoWindowShown(boolean infoWindowShown) {
68-
this.infoWindowShown = infoWindowShown;
69-
}
70-
7162
@Override
7263
public void setInfoWindowText(String title, String snippet) {
7364
markerOptions.title(title);

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

Lines changed: 6 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -12,20 +12,20 @@
1212
class MarkerController implements MarkerOptionsSink {
1313
private final Marker marker;
1414
private final OnMarkerTappedListener onTappedListener;
15-
private boolean consumesTapEvents;
15+
private boolean consumeTapEvents;
1616

1717
MarkerController(
18-
Marker marker, boolean consumesTapEvents, OnMarkerTappedListener onTappedListener) {
18+
Marker marker, boolean consumeTapEvents, OnMarkerTappedListener onTappedListener) {
1919
this.marker = marker;
20-
this.consumesTapEvents = consumesTapEvents;
20+
this.consumeTapEvents = consumeTapEvents;
2121
this.onTappedListener = onTappedListener;
2222
}
2323

2424
boolean onTap() {
2525
if (onTappedListener != null) {
2626
onTappedListener.onMarkerTapped(marker);
2727
}
28-
return consumesTapEvents;
28+
return consumeTapEvents;
2929
}
3030

3131
void remove() {
@@ -43,8 +43,8 @@ public void setAnchor(float u, float v) {
4343
}
4444

4545
@Override
46-
public void setConsumesTapEvents(boolean consumesTapEvents) {
47-
this.consumesTapEvents = consumesTapEvents;
46+
public void setConsumeTapEvents(boolean consumeTapEvents) {
47+
this.consumeTapEvents = consumeTapEvents;
4848
}
4949

5050
@Override
@@ -67,15 +67,6 @@ public void setInfoWindowAnchor(float u, float v) {
6767
marker.setInfoWindowAnchor(u, v);
6868
}
6969

70-
@Override
71-
public void setInfoWindowShown(boolean infoWindowShown) {
72-
if (infoWindowShown) {
73-
marker.showInfoWindow();
74-
} else {
75-
marker.hideInfoWindow();
76-
}
77-
}
78-
7970
@Override
8071
public void setInfoWindowText(String title, String snippet) {
8172
marker.setTitle(title);

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

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ interface MarkerOptionsSink {
1313

1414
void setAnchor(float u, float v);
1515

16-
void setConsumesTapEvents(boolean consumesTapEvents);
16+
void setConsumeTapEvents(boolean consumesTapEvents);
1717

1818
void setDraggable(boolean draggable);
1919

@@ -23,8 +23,6 @@ interface MarkerOptionsSink {
2323

2424
void setInfoWindowAnchor(float u, float v);
2525

26-
void setInfoWindowShown(boolean shown);
27-
2826
void setInfoWindowText(String title, String snippet);
2927

3028
void setPosition(LatLng position);

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
import com.google.android.gms.maps.model.CameraPosition;
88

99
interface OnCameraMoveListener {
10-
void onCameraMoveStarted(int reason);
10+
void onCameraMoveStarted(boolean isGesture);
1111

1212
void onCameraMove(CameraPosition newPosition);
1313

0 commit comments

Comments
 (0)