diff --git a/packages/google_maps_flutter/google_maps_flutter/CHANGELOG.md b/packages/google_maps_flutter/google_maps_flutter/CHANGELOG.md index 1027affdf24a..e2cdf01ca491 100644 --- a/packages/google_maps_flutter/google_maps_flutter/CHANGELOG.md +++ b/packages/google_maps_flutter/google_maps_flutter/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.5.26 + +* Adds support for toggling zoom controls (Android only) + ## 0.5.25+3 * Rename 'Page' in the example app to avoid type conflict with the Flutter Framework. diff --git a/packages/google_maps_flutter/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/Convert.java b/packages/google_maps_flutter/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/Convert.java index c8429f78ba8b..b671d994b6f9 100644 --- a/packages/google_maps_flutter/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/Convert.java +++ b/packages/google_maps_flutter/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/Convert.java @@ -320,6 +320,10 @@ static void interpretGoogleMapOptions(Object o, GoogleMapOptionsSink sink) { if (myLocationEnabled != null) { sink.setMyLocationEnabled(toBoolean(myLocationEnabled)); } + final Object zoomControlsEnabled = data.get("zoomControlsEnabled"); + if (zoomControlsEnabled != null) { + sink.setZoomControlsEnabled(toBoolean(zoomControlsEnabled)); + } final Object myLocationButtonEnabled = data.get("myLocationButtonEnabled"); if (myLocationButtonEnabled != null) { sink.setMyLocationButtonEnabled(toBoolean(myLocationButtonEnabled)); diff --git a/packages/google_maps_flutter/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapBuilder.java b/packages/google_maps_flutter/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapBuilder.java index 535e2cea33e3..af42aa901379 100644 --- a/packages/google_maps_flutter/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapBuilder.java +++ b/packages/google_maps_flutter/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapBuilder.java @@ -148,6 +148,11 @@ public void setMyLocationEnabled(boolean myLocationEnabled) { this.myLocationEnabled = myLocationEnabled; } + @Override + public void setZoomControlsEnabled(boolean zoomControlsEnabled) { + options.zoomControlsEnabled(zoomControlsEnabled); + } + @Override public void setMyLocationButtonEnabled(boolean myLocationButtonEnabled) { this.myLocationButtonEnabled = myLocationButtonEnabled; diff --git a/packages/google_maps_flutter/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapController.java b/packages/google_maps_flutter/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapController.java index 9aea19696456..4232b39d65e2 100644 --- a/packages/google_maps_flutter/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapController.java +++ b/packages/google_maps_flutter/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapController.java @@ -84,6 +84,7 @@ final class GoogleMapController private boolean trackCameraPosition = false; private boolean myLocationEnabled = false; private boolean myLocationButtonEnabled = false; + private boolean zoomControlsEnabled = true; private boolean indoorEnabled = true; private boolean trafficEnabled = false; private boolean buildingsEnabled = true; @@ -400,6 +401,11 @@ public void onSnapshotReady(Bitmap bitmap) { result.success(googleMap.getUiSettings().isZoomGesturesEnabled()); break; } + case "map#isZoomControlsEnabled": + { + result.success(googleMap.getUiSettings().isZoomControlsEnabled()); + break; + } case "map#isScrollGesturesEnabled": { result.success(googleMap.getUiSettings().isScrollGesturesEnabled()); @@ -770,6 +776,17 @@ public void setMyLocationButtonEnabled(boolean myLocationButtonEnabled) { } } + @Override + public void setZoomControlsEnabled(boolean zoomControlsEnabled) { + if (this.zoomControlsEnabled == zoomControlsEnabled) { + return; + } + this.zoomControlsEnabled = zoomControlsEnabled; + if (googleMap != null) { + googleMap.getUiSettings().setZoomControlsEnabled(zoomControlsEnabled); + } + } + @Override public void setInitialMarkers(Object initialMarkers) { this.initialMarkers = (List) initialMarkers; diff --git a/packages/google_maps_flutter/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapOptionsSink.java b/packages/google_maps_flutter/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapOptionsSink.java index fb88b368c5b8..efae01510537 100644 --- a/packages/google_maps_flutter/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapOptionsSink.java +++ b/packages/google_maps_flutter/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapOptionsSink.java @@ -32,6 +32,8 @@ interface GoogleMapOptionsSink { void setMyLocationEnabled(boolean myLocationEnabled); + void setZoomControlsEnabled(boolean zoomControlsEnabled); + void setMyLocationButtonEnabled(boolean myLocationButtonEnabled); void setIndoorEnabled(boolean indoorEnabled); diff --git a/packages/google_maps_flutter/google_maps_flutter/example/lib/map_ui.dart b/packages/google_maps_flutter/google_maps_flutter/example/lib/map_ui.dart index b44bc68f9278..051d658ddff8 100644 --- a/packages/google_maps_flutter/google_maps_flutter/example/lib/map_ui.dart +++ b/packages/google_maps_flutter/google_maps_flutter/example/lib/map_ui.dart @@ -50,6 +50,7 @@ class MapUiBodyState extends State { bool _rotateGesturesEnabled = true; bool _scrollGesturesEnabled = true; bool _tiltGesturesEnabled = true; + bool _zoomControlsEnabled = false; bool _zoomGesturesEnabled = true; bool _indoorViewEnabled = true; bool _myLocationEnabled = true; @@ -179,6 +180,18 @@ class MapUiBodyState extends State { ); } + Widget _zoomControlsToggler() { + return FlatButton( + child: + Text('${_zoomControlsEnabled ? 'disable' : 'enable'} zoom controls'), + onPressed: () { + setState(() { + _zoomControlsEnabled = !_zoomControlsEnabled; + }); + }, + ); + } + Widget _indoorViewToggler() { return FlatButton( child: Text('${_indoorViewEnabled ? 'disable' : 'enable'} indoor'), @@ -269,6 +282,7 @@ class MapUiBodyState extends State { scrollGesturesEnabled: _scrollGesturesEnabled, tiltGesturesEnabled: _tiltGesturesEnabled, zoomGesturesEnabled: _zoomGesturesEnabled, + zoomControlsEnabled: _zoomControlsEnabled, indoorViewEnabled: _indoorViewEnabled, myLocationEnabled: _myLocationEnabled, myLocationButtonEnabled: _myLocationButtonEnabled, @@ -310,6 +324,7 @@ class MapUiBodyState extends State { _scrollToggler(), _tiltToggler(), _zoomToggler(), + _zoomControlsToggler(), _indoorViewToggler(), _myLocationToggler(), _myLocationButtonToggler(), diff --git a/packages/google_maps_flutter/google_maps_flutter/example/test_driver/google_map_inspector.dart b/packages/google_maps_flutter/google_maps_flutter/example/test_driver/google_map_inspector.dart index a21e75ca9717..3583d4fd5b71 100644 --- a/packages/google_maps_flutter/google_maps_flutter/example/test_driver/google_map_inspector.dart +++ b/packages/google_maps_flutter/google_maps_flutter/example/test_driver/google_map_inspector.dart @@ -41,6 +41,10 @@ class GoogleMapInspector { return await _channel.invokeMethod('map#isZoomGesturesEnabled'); } + Future isZoomControlsEnabled() async { + return await _channel.invokeMethod('map#isZoomControlsEnabled'); + } + Future isRotateGesturesEnabled() async { return await _channel.invokeMethod('map#isRotateGesturesEnabled'); } diff --git a/packages/google_maps_flutter/google_maps_flutter/example/test_driver/google_maps_e2e.dart b/packages/google_maps_flutter/google_maps_flutter/example/test_driver/google_maps_e2e.dart index 347dde9bedd9..3b78d2f975a7 100644 --- a/packages/google_maps_flutter/google_maps_flutter/example/test_driver/google_maps_e2e.dart +++ b/packages/google_maps_flutter/google_maps_flutter/example/test_driver/google_maps_e2e.dart @@ -221,6 +221,48 @@ void main() { expect(zoomGesturesEnabled, true); }); + testWidgets('testZoomControlsEnabled', (WidgetTester tester) async { + final Key key = GlobalKey(); + final Completer inspectorCompleter = + Completer(); + + await tester.pumpWidget(Directionality( + textDirection: TextDirection.ltr, + child: GoogleMap( + key: key, + initialCameraPosition: _kInitialCameraPosition, + 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; + bool zoomControlsEnabled = await inspector.isZoomControlsEnabled(); + expect(zoomControlsEnabled, Platform.isIOS ? false : true); + + /// Zoom Controls functionality is not available on iOS at the moment. + if (Platform.isAndroid) { + await tester.pumpWidget(Directionality( + textDirection: TextDirection.ltr, + child: GoogleMap( + key: key, + initialCameraPosition: _kInitialCameraPosition, + zoomControlsEnabled: false, + onMapCreated: (GoogleMapController controller) { + fail("OnMapCreated should get called only once."); + }, + ), + )); + + zoomControlsEnabled = await inspector.isZoomControlsEnabled(); + expect(zoomControlsEnabled, false); + } + }); + testWidgets('testRotateGesturesEnabled', (WidgetTester tester) async { final Key key = GlobalKey(); final Completer inspectorCompleter = diff --git a/packages/google_maps_flutter/google_maps_flutter/ios/Classes/GoogleMapController.h b/packages/google_maps_flutter/google_maps_flutter/ios/Classes/GoogleMapController.h index 1bc8536f97d9..23f87265796b 100644 --- a/packages/google_maps_flutter/google_maps_flutter/ios/Classes/GoogleMapController.h +++ b/packages/google_maps_flutter/google_maps_flutter/ios/Classes/GoogleMapController.h @@ -26,6 +26,7 @@ NS_ASSUME_NONNULL_BEGIN - (void)setTiltGesturesEnabled:(BOOL)enabled; - (void)setTrackCameraPosition:(BOOL)enabled; - (void)setZoomGesturesEnabled:(BOOL)enabled; +- (void)setZoomControlsEnabled:(BOOL)enabled; - (void)setMyLocationEnabled:(BOOL)enabled; - (void)setMyLocationButtonEnabled:(BOOL)enabled; - (nullable NSString *)setMapStyle:(NSString *)mapStyle; diff --git a/packages/google_maps_flutter/google_maps_flutter/ios/Classes/GoogleMapController.m b/packages/google_maps_flutter/google_maps_flutter/ios/Classes/GoogleMapController.m index 9b191979fe3d..76e8619f194f 100644 --- a/packages/google_maps_flutter/google_maps_flutter/ios/Classes/GoogleMapController.m +++ b/packages/google_maps_flutter/google_maps_flutter/ios/Classes/GoogleMapController.m @@ -284,6 +284,9 @@ - (void)onMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result { } else if ([call.method isEqualToString:@"map#isZoomGesturesEnabled"]) { NSNumber* isZoomGesturesEnabled = @(_mapView.settings.zoomGestures); result(isZoomGesturesEnabled); + } else if ([call.method isEqualToString:@"map#isZoomControlsEnabled"]) { + NSNumber* isZoomControlsEnabled = [NSNumber numberWithBool:NO]; + result(isZoomControlsEnabled); } else if ([call.method isEqualToString:@"map#isTiltGesturesEnabled"]) { NSNumber* isTiltGesturesEnabled = @(_mapView.settings.tiltGestures); result(isTiltGesturesEnabled); diff --git a/packages/google_maps_flutter/google_maps_flutter/lib/src/google_map.dart b/packages/google_maps_flutter/google_maps_flutter/lib/src/google_map.dart index f6a413a82ffb..f2edde3fc6aa 100644 --- a/packages/google_maps_flutter/google_maps_flutter/lib/src/google_map.dart +++ b/packages/google_maps_flutter/google_maps_flutter/lib/src/google_map.dart @@ -35,6 +35,7 @@ class GoogleMap extends StatefulWidget { this.minMaxZoomPreference = MinMaxZoomPreference.unbounded, this.rotateGesturesEnabled = true, this.scrollGesturesEnabled = true, + this.zoomControlsEnabled = true, this.zoomGesturesEnabled = true, this.tiltGesturesEnabled = true, this.myLocationEnabled = false, @@ -88,6 +89,12 @@ class GoogleMap extends StatefulWidget { /// True if the map view should respond to scroll gestures. final bool scrollGesturesEnabled; + /// True if the map view should show zoom controls. This includes two buttons + /// to zoom in and zoom out. The default value is to show zoom controls. + /// + /// This is only supported on Android. And this field is silently ignored on iOS. + final bool zoomControlsEnabled; + /// True if the map view should respond to zoom gestures. final bool zoomGesturesEnabled; @@ -392,6 +399,7 @@ class _GoogleMapOptions { this.scrollGesturesEnabled, this.tiltGesturesEnabled, this.trackCameraPosition, + this.zoomControlsEnabled, this.zoomGesturesEnabled, this.myLocationEnabled, this.myLocationButtonEnabled, @@ -412,6 +420,7 @@ class _GoogleMapOptions { scrollGesturesEnabled: map.scrollGesturesEnabled, tiltGesturesEnabled: map.tiltGesturesEnabled, trackCameraPosition: map.onCameraMove != null, + zoomControlsEnabled: map.zoomControlsEnabled, zoomGesturesEnabled: map.zoomGesturesEnabled, myLocationEnabled: map.myLocationEnabled, myLocationButtonEnabled: map.myLocationButtonEnabled, @@ -440,6 +449,8 @@ class _GoogleMapOptions { final bool trackCameraPosition; + final bool zoomControlsEnabled; + final bool zoomGesturesEnabled; final bool myLocationEnabled; @@ -471,6 +482,7 @@ class _GoogleMapOptions { addIfNonNull('rotateGesturesEnabled', rotateGesturesEnabled); addIfNonNull('scrollGesturesEnabled', scrollGesturesEnabled); addIfNonNull('tiltGesturesEnabled', tiltGesturesEnabled); + addIfNonNull('zoomControlsEnabled', zoomControlsEnabled); addIfNonNull('zoomGesturesEnabled', zoomGesturesEnabled); addIfNonNull('trackCameraPosition', trackCameraPosition); addIfNonNull('myLocationEnabled', myLocationEnabled); diff --git a/packages/google_maps_flutter/google_maps_flutter/pubspec.yaml b/packages/google_maps_flutter/google_maps_flutter/pubspec.yaml index 0f88a9a0ad18..92acb3e009fc 100644 --- a/packages/google_maps_flutter/google_maps_flutter/pubspec.yaml +++ b/packages/google_maps_flutter/google_maps_flutter/pubspec.yaml @@ -1,7 +1,7 @@ name: google_maps_flutter description: A Flutter plugin for integrating Google Maps in iOS and Android applications. homepage: https://github.com/flutter/plugins/tree/master/packages/google_maps_flutter/google_maps_flutter -version: 0.5.25+3 +version: 0.5.26 dependencies: flutter: diff --git a/packages/google_maps_flutter/google_maps_flutter/test/fake_maps_controllers.dart b/packages/google_maps_flutter/google_maps_flutter/test/fake_maps_controllers.dart index 57b70c4d1525..71741c57057b 100644 --- a/packages/google_maps_flutter/google_maps_flutter/test/fake_maps_controllers.dart +++ b/packages/google_maps_flutter/google_maps_flutter/test/fake_maps_controllers.dart @@ -43,6 +43,8 @@ class FakePlatformGoogleMap { bool zoomGesturesEnabled; + bool zoomControlsEnabled; + bool trackCameraPosition; bool myLocationEnabled; @@ -351,6 +353,9 @@ class FakePlatformGoogleMap { if (options.containsKey('zoomGesturesEnabled')) { zoomGesturesEnabled = options['zoomGesturesEnabled']; } + if (options.containsKey('zoomControlsEnabled')) { + zoomControlsEnabled = options['zoomControlsEnabled']; + } if (options.containsKey('myLocationEnabled')) { myLocationEnabled = options['myLocationEnabled']; } diff --git a/packages/google_maps_flutter/google_maps_flutter/test/google_map_test.dart b/packages/google_maps_flutter/google_maps_flutter/test/google_map_test.dart index 5d77ccfb2165..3c1eadb8d2a4 100644 --- a/packages/google_maps_flutter/google_maps_flutter/test/google_map_test.dart +++ b/packages/google_maps_flutter/google_maps_flutter/test/google_map_test.dart @@ -386,6 +386,35 @@ void main() { expect(platformGoogleMap.zoomGesturesEnabled, true); }); + testWidgets('Can update zoomControlsEnabled', (WidgetTester tester) async { + await tester.pumpWidget( + const Directionality( + textDirection: TextDirection.ltr, + child: GoogleMap( + initialCameraPosition: CameraPosition(target: LatLng(10.0, 15.0)), + zoomControlsEnabled: false, + ), + ), + ); + + final FakePlatformGoogleMap platformGoogleMap = + fakePlatformViewsController.lastCreatedView; + + expect(platformGoogleMap.zoomControlsEnabled, false); + + await tester.pumpWidget( + const Directionality( + textDirection: TextDirection.ltr, + child: GoogleMap( + initialCameraPosition: CameraPosition(target: LatLng(10.0, 15.0)), + zoomControlsEnabled: true, + ), + ), + ); + + expect(platformGoogleMap.zoomControlsEnabled, true); + }); + testWidgets('Can update myLocationEnabled', (WidgetTester tester) async { await tester.pumpWidget( const Directionality(