diff --git a/packages/google_maps_flutter/CHANGELOG.md b/packages/google_maps_flutter/CHANGELOG.md index 1efbd869633a..2f5983e0cbcf 100644 --- a/packages/google_maps_flutter/CHANGELOG.md +++ b/packages/google_maps_flutter/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.5.20+6 + +* Adds support for toggling the traffic layer + ## 0.5.20+5 * Allow (de-)serialization of CameraPosition diff --git a/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/Convert.java b/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/Convert.java index da737bdc15ac..76e14faaf01e 100644 --- a/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/Convert.java +++ b/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/Convert.java @@ -316,6 +316,10 @@ static void interpretGoogleMapOptions(Object o, GoogleMapOptionsSink sink) { if (indoorEnabled != null) { sink.setIndoorEnabled(toBoolean(indoorEnabled)); } + final Object trafficEnabled = data.get("trafficEnabled"); + if (trafficEnabled != null) { + sink.setTrafficEnabled(toBoolean(trafficEnabled)); + } } /** Returns the dartMarkerId of the interpreted marker. */ diff --git a/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapBuilder.java b/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapBuilder.java index 99d3c87a0ebc..651dd3e17198 100644 --- a/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapBuilder.java +++ b/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapBuilder.java @@ -18,6 +18,7 @@ class GoogleMapBuilder implements GoogleMapOptionsSink { private boolean myLocationEnabled = false; private boolean myLocationButtonEnabled = false; private boolean indoorEnabled = true; + private boolean trafficEnabled = false; private Object initialMarkers; private Object initialPolygons; private Object initialPolylines; @@ -32,6 +33,7 @@ GoogleMapController build( controller.setMyLocationEnabled(myLocationEnabled); controller.setMyLocationButtonEnabled(myLocationButtonEnabled); controller.setIndoorEnabled(indoorEnabled); + controller.setTrafficEnabled(trafficEnabled); controller.setTrackCameraPosition(trackCameraPosition); controller.setInitialMarkers(initialMarkers); controller.setInitialPolygons(initialPolygons); @@ -110,6 +112,11 @@ public void setIndoorEnabled(boolean indoorEnabled) { this.indoorEnabled = indoorEnabled; } + @Override + public void setTrafficEnabled(boolean trafficEnabled) { + this.trafficEnabled = trafficEnabled; + } + @Override public void setMyLocationEnabled(boolean myLocationEnabled) { this.myLocationEnabled = myLocationEnabled; diff --git a/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapController.java b/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapController.java index 0ce82b29491f..de6a1158023d 100644 --- a/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapController.java +++ b/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapController.java @@ -74,6 +74,7 @@ final class GoogleMapController private boolean myLocationEnabled = false; private boolean myLocationButtonEnabled = false; private boolean indoorEnabled = true; + private boolean trafficEnabled = false; private boolean disposed = false; private final float density; private MethodChannel.Result mapReadyResult; @@ -169,6 +170,7 @@ private CameraPosition getCameraPosition() { public void onMapReady(GoogleMap googleMap) { this.googleMap = googleMap; this.googleMap.setIndoorEnabled(this.indoorEnabled); + this.googleMap.setTrafficEnabled(this.trafficEnabled); googleMap.setOnInfoWindowClickListener(this); if (mapReadyResult != null) { mapReadyResult.success(null); @@ -327,6 +329,11 @@ public void onMethodCall(MethodCall call, MethodChannel.Result result) { result.success(googleMap.getUiSettings().isMyLocationButtonEnabled()); break; } + case "map#isTrafficEnabled": + { + result.success(googleMap.isTrafficEnabled()); + break; + } case "map#setStyle": { String mapStyle = (String) call.arguments; @@ -664,4 +671,8 @@ private int checkSelfPermission(String permission) { public void setIndoorEnabled(boolean indoorEnabled) { this.indoorEnabled = indoorEnabled; } + + public void setTrafficEnabled(boolean trafficEnabled) { + this.trafficEnabled = trafficEnabled; + } } diff --git a/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapOptionsSink.java b/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapOptionsSink.java index 11db124e2997..1f01298a3ce1 100644 --- a/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapOptionsSink.java +++ b/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapOptionsSink.java @@ -36,6 +36,8 @@ interface GoogleMapOptionsSink { void setIndoorEnabled(boolean indoorEnabled); + void setTrafficEnabled(boolean trafficEnabled); + void setInitialMarkers(Object initialMarkers); void setInitialPolygons(Object initialPolygons); diff --git a/packages/google_maps_flutter/example/test_driver/google_map_inspector.dart b/packages/google_maps_flutter/example/test_driver/google_map_inspector.dart index b8758dcf8c22..157076bdcdc0 100644 --- a/packages/google_maps_flutter/example/test_driver/google_map_inspector.dart +++ b/packages/google_maps_flutter/example/test_driver/google_map_inspector.dart @@ -49,4 +49,8 @@ class GoogleMapInspector { Future isMyLocationButtonEnabled() async { return await _channel.invokeMethod('map#isMyLocationButtonEnabled'); } + + Future isTrafficEnabled() async { + return await _channel.invokeMethod('map#isTrafficEnabled'); + } } diff --git a/packages/google_maps_flutter/example/test_driver/google_maps.dart b/packages/google_maps_flutter/example/test_driver/google_maps.dart index 2e037603d7ca..6f2eacd49c00 100644 --- a/packages/google_maps_flutter/example/test_driver/google_maps.dart +++ b/packages/google_maps_flutter/example/test_driver/google_maps.dart @@ -375,6 +375,31 @@ void main() { expect(secondVisibleRegion.contains(newCenter), isTrue); }); + test('testTraffic', () async { + final Key key = GlobalKey(); + final Completer inspectorCompleter = + Completer(); + + await pumpWidget(Directionality( + textDirection: TextDirection.ltr, + child: GoogleMap( + key: key, + initialCameraPosition: _kInitialCameraPosition, + trafficEnabled: true, + onMapCreated: (GoogleMapController controller) { + final GoogleMapInspector inspector = + // ignore: invalid_use_of_visible_for_testing_member + GoogleMapInspector(controller.channel); + inspectorCompleter.complete(inspector); + }, + ), + )); + + final GoogleMapInspector inspector = await inspectorCompleter.future; + final bool isTrafficEnabled = await inspector.isTrafficEnabled(); + expect(isTrafficEnabled, true); + }); + test('testMyLocationButtonToggle', () async { final Key key = GlobalKey(); final Completer inspectorCompleter = diff --git a/packages/google_maps_flutter/ios/Classes/GoogleMapController.h b/packages/google_maps_flutter/ios/Classes/GoogleMapController.h index 96025150c3ce..02f444504a6a 100644 --- a/packages/google_maps_flutter/ios/Classes/GoogleMapController.h +++ b/packages/google_maps_flutter/ios/Classes/GoogleMapController.h @@ -14,6 +14,7 @@ - (void)setCameraTargetBounds:(GMSCoordinateBounds *)bounds; - (void)setCompassEnabled:(BOOL)enabled; - (void)setIndoorEnabled:(BOOL)enabled; +- (void)setTrafficEnabled:(BOOL)enabled; - (void)setMapType:(GMSMapViewType)type; - (void)setMinZoom:(float)minZoom maxZoom:(float)maxZoom; - (void)setPaddingTop:(float)top left:(float)left bottom:(float)bottom right:(float)right; diff --git a/packages/google_maps_flutter/ios/Classes/GoogleMapController.m b/packages/google_maps_flutter/ios/Classes/GoogleMapController.m index 38a95ca8d882..600820e0cc0c 100644 --- a/packages/google_maps_flutter/ios/Classes/GoogleMapController.m +++ b/packages/google_maps_flutter/ios/Classes/GoogleMapController.m @@ -229,6 +229,9 @@ - (void)onMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result { } else if ([call.method isEqualToString:@"map#isMyLocationButtonEnabled"]) { NSNumber* isMyLocationButtonEnabled = @(_mapView.settings.myLocationButton); result(isMyLocationButtonEnabled); + } else if ([call.method isEqualToString:@"map#isTrafficEnabled"]) { + NSNumber* isTrafficEnabled = @(_mapView.trafficEnabled); + result(isTrafficEnabled); } else if ([call.method isEqualToString:@"map#setStyle"]) { NSString* mapStyle = [call arguments]; NSString* error = [self setMapStyle:mapStyle]; @@ -286,6 +289,10 @@ - (void)setIndoorEnabled:(BOOL)enabled { _mapView.indoorEnabled = enabled; } +- (void)setTrafficEnabled:(BOOL)enabled { + _mapView.trafficEnabled = enabled; +} + - (void)setMapType:(GMSMapViewType)mapType { _mapView.mapType = mapType; } @@ -509,6 +516,10 @@ static void InterpretMapOptions(NSDictionary* data, id if (indoorEnabled) { [sink setIndoorEnabled:ToBool(indoorEnabled)]; } + id trafficEnabled = data[@"trafficEnabled"]; + if (trafficEnabled) { + [sink setTrafficEnabled:ToBool(trafficEnabled)]; + } id mapType = data[@"mapType"]; if (mapType) { [sink setMapType:ToMapViewType(mapType)]; diff --git a/packages/google_maps_flutter/lib/src/google_map.dart b/packages/google_maps_flutter/lib/src/google_map.dart index 5c802a2f052f..fa5c3fdac490 100644 --- a/packages/google_maps_flutter/lib/src/google_map.dart +++ b/packages/google_maps_flutter/lib/src/google_map.dart @@ -35,6 +35,7 @@ class GoogleMap extends StatefulWidget { /// If no padding is specified default padding will be 0. this.padding = const EdgeInsets.all(0), this.indoorViewEnabled = false, + this.trafficEnabled = false, this.markers, this.polygons, this.polylines, @@ -164,6 +165,9 @@ class GoogleMap extends StatefulWidget { /// Enables or disables the indoor view from the map final bool indoorViewEnabled; + /// Enables or disables the traffic layer of the map + final bool trafficEnabled; + /// Which gestures should be consumed by the map. /// /// It is possible for other gesture recognizers to be competing with the map on pointer @@ -372,6 +376,7 @@ class _GoogleMapOptions { this.myLocationButtonEnabled, this.padding, this.indoorViewEnabled, + this.trafficEnabled, }); static _GoogleMapOptions fromWidget(GoogleMap map) { @@ -390,6 +395,7 @@ class _GoogleMapOptions { myLocationButtonEnabled: map.myLocationButtonEnabled, padding: map.padding, indoorViewEnabled: map.indoorViewEnabled, + trafficEnabled: map.trafficEnabled, ); } @@ -421,6 +427,8 @@ class _GoogleMapOptions { final bool indoorViewEnabled; + final bool trafficEnabled; + Map toMap() { final Map optionsMap = {}; @@ -449,6 +457,7 @@ class _GoogleMapOptions { padding?.right, ]); addIfNonNull('indoorEnabled', indoorViewEnabled); + addIfNonNull('trafficEnabled', trafficEnabled); return optionsMap; } diff --git a/packages/google_maps_flutter/pubspec.yaml b/packages/google_maps_flutter/pubspec.yaml index b99203fafbd6..7504c1dd41a6 100644 --- a/packages/google_maps_flutter/pubspec.yaml +++ b/packages/google_maps_flutter/pubspec.yaml @@ -2,7 +2,7 @@ name: google_maps_flutter description: A Flutter plugin for integrating Google Maps in iOS and Android applications. author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/google_maps_flutter -version: 0.5.20+5 +version: 0.5.20+6 dependencies: flutter: diff --git a/packages/google_maps_flutter/test/fake_maps_controllers.dart b/packages/google_maps_flutter/test/fake_maps_controllers.dart index 76dbc9d88bb0..d892ea1a7794 100644 --- a/packages/google_maps_flutter/test/fake_maps_controllers.dart +++ b/packages/google_maps_flutter/test/fake_maps_controllers.dart @@ -47,6 +47,8 @@ class FakePlatformGoogleMap { bool myLocationEnabled; + bool trafficEnabled; + bool myLocationButtonEnabled; List padding; @@ -341,6 +343,9 @@ class FakePlatformGoogleMap { if (options.containsKey('myLocationButtonEnabled')) { myLocationButtonEnabled = options['myLocationButtonEnabled']; } + if (options.containsKey('trafficEnabled')) { + trafficEnabled = options['trafficEnabled']; + } if (options.containsKey('padding')) { padding = options['padding']; } diff --git a/packages/google_maps_flutter/test/google_map_test.dart b/packages/google_maps_flutter/test/google_map_test.dart index e745c15ad181..41e1fe114488 100644 --- a/packages/google_maps_flutter/test/google_map_test.dart +++ b/packages/google_maps_flutter/test/google_map_test.dart @@ -498,4 +498,33 @@ void main() { expect(platformGoogleMap.padding, [60, 50, 80, 70]); }); + + testWidgets('Can update traffic', (WidgetTester tester) async { + await tester.pumpWidget( + const Directionality( + textDirection: TextDirection.ltr, + child: GoogleMap( + initialCameraPosition: CameraPosition(target: LatLng(10.0, 15.0)), + trafficEnabled: false, + ), + ), + ); + + final FakePlatformGoogleMap platformGoogleMap = + fakePlatformViewsController.lastCreatedView; + + expect(platformGoogleMap.trafficEnabled, false); + + await tester.pumpWidget( + const Directionality( + textDirection: TextDirection.ltr, + child: GoogleMap( + initialCameraPosition: CameraPosition(target: LatLng(10.0, 15.0)), + trafficEnabled: true, + ), + ), + ); + + expect(platformGoogleMap.trafficEnabled, true); + }); }