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

Commit 37d658e

Browse files
author
Chris Yang
authored
[google_maps_flutter] add tile overlays (#3434)
1 parent 47a5ea7 commit 37d658e

24 files changed

+1505
-3
lines changed

packages/google_maps_flutter/google_maps_flutter/android/build.gradle

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,11 @@ android {
3939
androidTestImplementation 'androidx.test:rules:1.2.0'
4040
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
4141
}
42+
43+
compileOptions {
44+
sourceCompatibility JavaVersion.VERSION_1_8
45+
targetCompatibility JavaVersion.VERSION_1_8
46+
}
4247
}
4348

4449
dependencies {

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

Lines changed: 52 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import com.google.android.gms.maps.model.PatternItem;
2424
import com.google.android.gms.maps.model.RoundCap;
2525
import com.google.android.gms.maps.model.SquareCap;
26+
import com.google.android.gms.maps.model.Tile;
2627
import io.flutter.view.FlutterMain;
2728
import java.util.ArrayList;
2829
import java.util.Arrays;
@@ -78,7 +79,8 @@ private static BitmapDescriptor getBitmapFromBytes(List<?> data) {
7879
}
7980
} else {
8081
throw new IllegalArgumentException(
81-
"fromBytes should have exactly one argument, the bytes. Got: " + data.size());
82+
"fromBytes should have exactly one argument, interpretTileOverlayOptions the bytes. Got: "
83+
+ data.size());
8284
}
8385
}
8486

@@ -200,6 +202,20 @@ static Object circleIdToJson(String circleId) {
200202
return data;
201203
}
202204

205+
static Map<String, Object> tileOverlayArgumentsToJson(
206+
String tileOverlayId, int x, int y, int zoom) {
207+
208+
if (tileOverlayId == null) {
209+
return null;
210+
}
211+
final Map<String, Object> data = new HashMap<>(4);
212+
data.put("tileOverlayId", tileOverlayId);
213+
data.put("x", x);
214+
data.put("y", y);
215+
data.put("zoom", zoom);
216+
return data;
217+
}
218+
203219
static Object latLngToJson(LatLng latLng) {
204220
return Arrays.asList(latLng.latitude, latLng.longitude);
205221
}
@@ -645,4 +661,39 @@ private static Cap toCap(Object o) {
645661
throw new IllegalArgumentException("Cannot interpret " + o + " as Cap");
646662
}
647663
}
664+
665+
static String interpretTileOverlayOptions(Map<String, ?> data, TileOverlaySink sink) {
666+
final Object fadeIn = data.get("fadeIn");
667+
if (fadeIn != null) {
668+
sink.setFadeIn(toBoolean(fadeIn));
669+
}
670+
final Object transparency = data.get("transparency");
671+
if (transparency != null) {
672+
sink.setTransparency(toFloat(transparency));
673+
}
674+
final Object zIndex = data.get("zIndex");
675+
if (zIndex != null) {
676+
sink.setZIndex(toFloat(zIndex));
677+
}
678+
final Object visible = data.get("visible");
679+
if (visible != null) {
680+
sink.setVisible(toBoolean(visible));
681+
}
682+
final String tileOverlayId = (String) data.get("tileOverlayId");
683+
if (tileOverlayId == null) {
684+
throw new IllegalArgumentException("tileOverlayId was null");
685+
} else {
686+
return tileOverlayId;
687+
}
688+
}
689+
690+
static Tile interpretTile(Map<String, ?> data) {
691+
int width = toInt(data.get("width"));
692+
int height = toInt(data.get("height"));
693+
byte[] dataArray = null;
694+
if (data.get("data") != null) {
695+
dataArray = (byte[]) data.get("data");
696+
}
697+
return new Tile(width, height, dataArray);
698+
}
648699
}

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
import com.google.android.gms.maps.model.CameraPosition;
1111
import com.google.android.gms.maps.model.LatLngBounds;
1212
import io.flutter.plugin.common.BinaryMessenger;
13+
import java.util.List;
14+
import java.util.Map;
1315

1416
class GoogleMapBuilder implements GoogleMapOptionsSink {
1517
private final GoogleMapOptions options = new GoogleMapOptions();
@@ -23,6 +25,7 @@ class GoogleMapBuilder implements GoogleMapOptionsSink {
2325
private Object initialPolygons;
2426
private Object initialPolylines;
2527
private Object initialCircles;
28+
private List<Map<String, ?>> initialTileOverlays;
2629
private Rect padding = new Rect(0, 0, 0, 0);
2730

2831
GoogleMapController build(
@@ -44,6 +47,7 @@ GoogleMapController build(
4447
controller.setInitialPolylines(initialPolylines);
4548
controller.setInitialCircles(initialCircles);
4649
controller.setPadding(padding.top, padding.left, padding.bottom, padding.right);
50+
controller.setInitialTileOverlays(initialTileOverlays);
4751
return controller;
4852
}
4953

@@ -165,4 +169,9 @@ public void setInitialPolylines(Object initialPolylines) {
165169
public void setInitialCircles(Object initialCircles) {
166170
this.initialCircles = initialCircles;
167171
}
172+
173+
@Override
174+
public void setInitialTileOverlays(List<Map<String, ?>> initialTileOverlays) {
175+
this.initialTileOverlays = initialTileOverlays;
176+
}
168177
}

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

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,10 +76,12 @@ final class GoogleMapController
7676
private final PolygonsController polygonsController;
7777
private final PolylinesController polylinesController;
7878
private final CirclesController circlesController;
79+
private final TileOverlaysController tileOverlaysController;
7980
private List<Object> initialMarkers;
8081
private List<Object> initialPolygons;
8182
private List<Object> initialPolylines;
8283
private List<Object> initialCircles;
84+
private List<Map<String, ?>> initialTileOverlays;
8385

8486
GoogleMapController(
8587
int id,
@@ -99,6 +101,7 @@ final class GoogleMapController
99101
this.polygonsController = new PolygonsController(methodChannel, density);
100102
this.polylinesController = new PolylinesController(methodChannel, density);
101103
this.circlesController = new CirclesController(methodChannel, density);
104+
this.tileOverlaysController = new TileOverlaysController(methodChannel);
102105
}
103106

104107
@Override
@@ -140,10 +143,12 @@ public void onMapReady(GoogleMap googleMap) {
140143
polygonsController.setGoogleMap(googleMap);
141144
polylinesController.setGoogleMap(googleMap);
142145
circlesController.setGoogleMap(googleMap);
146+
tileOverlaysController.setGoogleMap(googleMap);
143147
updateInitialMarkers();
144148
updateInitialPolygons();
145149
updateInitialPolylines();
146150
updateInitialCircles();
151+
updateInitialTileOverlays();
147152
}
148153

149154
@Override
@@ -385,6 +390,30 @@ public void onSnapshotReady(Bitmap bitmap) {
385390
result.success(mapStyleResult);
386391
break;
387392
}
393+
case "tileOverlays#update":
394+
{
395+
List<Map<String, ?>> tileOverlaysToAdd = call.argument("tileOverlaysToAdd");
396+
tileOverlaysController.addTileOverlays(tileOverlaysToAdd);
397+
List<Map<String, ?>> tileOverlaysToChange = call.argument("tileOverlaysToChange");
398+
tileOverlaysController.changeTileOverlays(tileOverlaysToChange);
399+
List<String> tileOverlaysToRemove = call.argument("tileOverlayIdsToRemove");
400+
tileOverlaysController.removeTileOverlays(tileOverlaysToRemove);
401+
result.success(null);
402+
break;
403+
}
404+
case "tileOverlays#clearTileCache":
405+
{
406+
String tileOverlayId = call.argument("tileOverlayId");
407+
tileOverlaysController.clearTileCache(tileOverlayId);
408+
result.success(null);
409+
break;
410+
}
411+
case "map#getTileOverlayInfo":
412+
{
413+
String tileOverlayId = call.argument("tileOverlayId");
414+
result.success(tileOverlaysController.getTileOverlayInfo(tileOverlayId));
415+
break;
416+
}
388417
default:
389418
result.notImplemented();
390419
}
@@ -732,6 +761,18 @@ private void updateInitialCircles() {
732761
circlesController.addCircles(initialCircles);
733762
}
734763

764+
@Override
765+
public void setInitialTileOverlays(List<Map<String, ?>> initialTileOverlays) {
766+
this.initialTileOverlays = initialTileOverlays;
767+
if (googleMap != null) {
768+
updateInitialTileOverlays();
769+
}
770+
}
771+
772+
private void updateInitialTileOverlays() {
773+
tileOverlaysController.addTileOverlays(initialTileOverlays);
774+
}
775+
735776
@SuppressLint("MissingPermission")
736777
private void updateMyLocationSettings() {
737778
if (hasLocationPermission()) {

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import io.flutter.plugin.common.StandardMessageCodec;
1111
import io.flutter.plugin.platform.PlatformView;
1212
import io.flutter.plugin.platform.PlatformViewFactory;
13+
import java.util.List;
1314
import java.util.Map;
1415

1516
public class GoogleMapFactory extends PlatformViewFactory {
@@ -46,6 +47,9 @@ public PlatformView create(Context context, int id, Object args) {
4647
if (params.containsKey("circlesToAdd")) {
4748
builder.setInitialCircles(params.get("circlesToAdd"));
4849
}
50+
if (params.containsKey("tileOverlaysToAdd")) {
51+
builder.setInitialTileOverlays((List<Map<String, ?>>) params.get("tileOverlaysToAdd"));
52+
}
4953
return builder.build(id, context, binaryMessenger, lifecycleProvider);
5054
}
5155
}

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
package io.flutter.plugins.googlemaps;
66

77
import com.google.android.gms.maps.model.LatLngBounds;
8+
import java.util.List;
9+
import java.util.Map;
810

911
/** Receiver of GoogleMap configuration options. */
1012
interface GoogleMapOptionsSink {
@@ -51,4 +53,6 @@ interface GoogleMapOptionsSink {
5153
void setInitialPolylines(Object initialPolylines);
5254

5355
void setInitialCircles(Object initialCircles);
56+
57+
void setInitialTileOverlays(List<Map<String, ?>> initialTileOverlays);
5458
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
// Copyright 2018 The Chromium Authors. All rights reserved.
2+
// Use of this source code is governed by a BSD-style license that can be
3+
// found in the LICENSE file.
4+
5+
package io.flutter.plugins.googlemaps;
6+
7+
import com.google.android.gms.maps.model.TileOverlayOptions;
8+
import com.google.android.gms.maps.model.TileProvider;
9+
10+
class TileOverlayBuilder implements TileOverlaySink {
11+
12+
private final TileOverlayOptions tileOverlayOptions;
13+
14+
TileOverlayBuilder() {
15+
this.tileOverlayOptions = new TileOverlayOptions();
16+
}
17+
18+
TileOverlayOptions build() {
19+
return tileOverlayOptions;
20+
}
21+
22+
@Override
23+
public void setFadeIn(boolean fadeIn) {
24+
tileOverlayOptions.fadeIn(fadeIn);
25+
}
26+
27+
@Override
28+
public void setTransparency(float transparency) {
29+
tileOverlayOptions.transparency(transparency);
30+
}
31+
32+
@Override
33+
public void setZIndex(float zIndex) {
34+
tileOverlayOptions.zIndex(zIndex);
35+
}
36+
37+
@Override
38+
public void setVisible(boolean visible) {
39+
tileOverlayOptions.visible(visible);
40+
}
41+
42+
@Override
43+
public void setTileProvider(TileProvider tileProvider) {
44+
tileOverlayOptions.tileProvider(tileProvider);
45+
}
46+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
// Copyright 2018 The Chromium Authors. All rights reserved.
2+
// Use of this source code is governed by a BSD-style license that can be
3+
// found in the LICENSE file.
4+
5+
package io.flutter.plugins.googlemaps;
6+
7+
import com.google.android.gms.maps.model.TileOverlay;
8+
import com.google.android.gms.maps.model.TileProvider;
9+
import java.util.HashMap;
10+
import java.util.Map;
11+
12+
class TileOverlayController implements TileOverlaySink {
13+
14+
private final TileOverlay tileOverlay;
15+
16+
TileOverlayController(TileOverlay tileOverlay) {
17+
this.tileOverlay = tileOverlay;
18+
}
19+
20+
void remove() {
21+
tileOverlay.remove();
22+
}
23+
24+
void clearTileCache() {
25+
tileOverlay.clearTileCache();
26+
}
27+
28+
Map<String, Object> getTileOverlayInfo() {
29+
Map<String, Object> tileOverlayInfo = new HashMap<>();
30+
tileOverlayInfo.put("fadeIn", tileOverlay.getFadeIn());
31+
tileOverlayInfo.put("transparency", tileOverlay.getTransparency());
32+
tileOverlayInfo.put("id", tileOverlay.getId());
33+
tileOverlayInfo.put("zIndex", tileOverlay.getZIndex());
34+
tileOverlayInfo.put("visible", tileOverlay.isVisible());
35+
return tileOverlayInfo;
36+
}
37+
38+
@Override
39+
public void setFadeIn(boolean fadeIn) {
40+
tileOverlay.setFadeIn(fadeIn);
41+
}
42+
43+
@Override
44+
public void setTransparency(float transparency) {
45+
tileOverlay.setTransparency(transparency);
46+
}
47+
48+
@Override
49+
public void setZIndex(float zIndex) {
50+
tileOverlay.setZIndex(zIndex);
51+
}
52+
53+
@Override
54+
public void setVisible(boolean visible) {
55+
tileOverlay.setVisible(visible);
56+
}
57+
58+
@Override
59+
public void setTileProvider(TileProvider tileProvider) {
60+
// You can not change tile provider after creation
61+
}
62+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
// Copyright 2018 The Chromium Authors. All rights reserved.
2+
// Use of this source code is governed by a BSD-style license that can be
3+
// found in the LICENSE file.
4+
5+
package io.flutter.plugins.googlemaps;
6+
7+
import com.google.android.gms.maps.model.TileProvider;
8+
9+
/** Receiver of TileOverlayOptions configuration. */
10+
interface TileOverlaySink {
11+
void setFadeIn(boolean fadeIn);
12+
13+
void setTransparency(float transparency);
14+
15+
void setZIndex(float zIndex);
16+
17+
void setVisible(boolean visible);
18+
19+
void setTileProvider(TileProvider tileProvider);
20+
}

0 commit comments

Comments
 (0)