From f219dc6c38220730a27e897cde97c857d14e4609 Mon Sep 17 00:00:00 2001 From: Kaushik Iska Date: Wed, 27 Mar 2019 10:20:04 -0700 Subject: [PATCH 01/12] Add initial google_maps tests - Also add a controller for querying things - TODO: figureout a way to inject google maps api key --- .../googlemaps/GoogleMapController.java | 7 ++ .../googlemaps/GoogleMapStateSnapshot.java | 36 ++++++++ .../google_maps_flutter/example/pubspec.yaml | 6 +- .../example/test_driver/google_maps.dart | 84 +++++++++++++++++++ .../example/test_driver/google_maps_test.dart | 13 +++ .../google_maps_test_controller.dart | 36 ++++++++ .../lib/src/controller.dart | 5 ++ packages/google_maps_flutter/pubspec.yaml | 6 ++ 8 files changed, 190 insertions(+), 3 deletions(-) create mode 100644 packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapStateSnapshot.java create mode 100644 packages/google_maps_flutter/example/test_driver/google_maps.dart create mode 100644 packages/google_maps_flutter/example/test_driver/google_maps_test.dart create mode 100644 packages/google_maps_flutter/example/test_driver/google_maps_test_controller.dart 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 e7fba92887d2..27f396e28817 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 @@ -199,6 +199,13 @@ public void onMethodCall(MethodCall call, MethodChannel.Result result) { markersController.changeMarkers((List) markersToChange); Object markerIdsToRemove = call.argument("markerIdsToRemove"); markersController.removeMarkers((List) markerIdsToRemove); + result.success(null); + break; + } + case "map#stateSnapshot": + { + GoogleMapStateSnapshot mapStateSnapshot = GoogleMapStateSnapshot.from(googleMap); + result.success(mapStateSnapshot.asList()); break; } default: diff --git a/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapStateSnapshot.java b/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapStateSnapshot.java new file mode 100644 index 000000000000..d6750dba0604 --- /dev/null +++ b/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapStateSnapshot.java @@ -0,0 +1,36 @@ +package io.flutter.plugins.googlemaps; + +import com.google.android.gms.maps.GoogleMap; +import com.google.android.gms.maps.UiSettings; +import java.util.ArrayList; +import java.util.List; + +// This will be serialized across the platform boundary, +// needs to be kept in sync with the dart side. +class GoogleMapStateSnapshot { + + private final boolean compassEnabled; + private final Float minZoomPreference; + private final Float maxZoomPreference; + + static GoogleMapStateSnapshot from(GoogleMap googleMap) { + UiSettings uiSettings = googleMap.getUiSettings(); + return new GoogleMapStateSnapshot( + uiSettings.isCompassEnabled(), googleMap.getMinZoomLevel(), googleMap.getMaxZoomLevel()); + } + + private GoogleMapStateSnapshot( + boolean compassEnabled, Float minZoomPreference, Float maxZoomPreference) { + this.compassEnabled = compassEnabled; + this.minZoomPreference = minZoomPreference; + this.maxZoomPreference = maxZoomPreference; + } + + List asList() { + List container = new ArrayList<>(); + container.add(compassEnabled); + container.add(minZoomPreference); + container.add(maxZoomPreference); + return container; + } +} diff --git a/packages/google_maps_flutter/example/pubspec.yaml b/packages/google_maps_flutter/example/pubspec.yaml index f0f7e8b8e266..564702cab9e1 100644 --- a/packages/google_maps_flutter/example/pubspec.yaml +++ b/packages/google_maps_flutter/example/pubspec.yaml @@ -10,11 +10,11 @@ dependencies: cupertino_icons: ^0.1.0 dev_dependencies: - flutter_test: - sdk: flutter - google_maps_flutter: path: ../ + flutter_driver: + sdk: flutter + test: any # For information on the generic Dart part of this file, see the # following page: https://www.dartlang.org/tools/pub/pubspec diff --git a/packages/google_maps_flutter/example/test_driver/google_maps.dart b/packages/google_maps_flutter/example/test_driver/google_maps.dart new file mode 100644 index 000000000000..cda6dee14756 --- /dev/null +++ b/packages/google_maps_flutter/example/test_driver/google_maps.dart @@ -0,0 +1,84 @@ +// Copyright 2019, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +import 'dart:async'; + +import 'package:flutter/widgets.dart'; +import 'package:flutter_driver/driver_extension.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:google_maps_flutter/google_maps_flutter.dart'; + +import 'google_maps_test_controller.dart'; + +const CameraPosition _kInitialCameraPosition = + CameraPosition(target: LatLng(0, 0)); + +class GoogleMapTest extends StatefulWidget { + GoogleMapTest(this.mapState, this._controllerCompleter); + + final _GoogleMapTestState mapState; + final Completer _controllerCompleter; + + @override + _GoogleMapTestState createState() => mapState; +} + +class _GoogleMapTestState extends State { + bool _compassEnabled = false; + + @override + Widget build(BuildContext context) { + return Directionality( + textDirection: TextDirection.ltr, + child: GoogleMap( + initialCameraPosition: _kInitialCameraPosition, + compassEnabled: _compassEnabled, + onMapCreated: (GoogleMapController controller) { + widget._controllerCompleter.complete(controller); + }, + ), + ); + } + + void toggleCompass() { + setState(() { + _compassEnabled = !_compassEnabled; + }); + } +} + +void main() { + final Completer allTestsCompleter = Completer(); + enableFlutterDriverExtension(handler: (_) => allTestsCompleter.future); + + tearDownAll(() => allTestsCompleter.complete(null)); + + _GoogleMapTestState mapTestState; + GoogleMapController controller; + GoogleMapTestController testController; + + setUp(() async { + mapTestState = _GoogleMapTestState(); + final Completer controllerCompleter = + Completer(); + runApp(GoogleMapTest(mapTestState, controllerCompleter)); + controller = await controllerCompleter.future; + testController = GoogleMapTestController(controller.getMethodChannel()); + }); + + test('testCompassToggle', () async { + GoogleMapStateSnapshot mapStateSnapshot; + + mapStateSnapshot = await testController.mapStateSnapshot(); + expect(mapStateSnapshot.compassEnabled, false); + + mapTestState.toggleCompass(); + + // This delay exists for platform channel propagation. + await Future.delayed(Duration(seconds: 1), () {}); + + mapStateSnapshot = await testController.mapStateSnapshot(); + expect(mapStateSnapshot.compassEnabled, true); + }); +} diff --git a/packages/google_maps_flutter/example/test_driver/google_maps_test.dart b/packages/google_maps_flutter/example/test_driver/google_maps_test.dart new file mode 100644 index 000000000000..b0d3305cd652 --- /dev/null +++ b/packages/google_maps_flutter/example/test_driver/google_maps_test.dart @@ -0,0 +1,13 @@ +// Copyright 2019, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +import 'dart:async'; + +import 'package:flutter_driver/flutter_driver.dart'; + +Future main() async { + final FlutterDriver driver = await FlutterDriver.connect(); + await driver.requestData(null, timeout: const Duration(minutes: 1)); + driver.close(); +} diff --git a/packages/google_maps_flutter/example/test_driver/google_maps_test_controller.dart b/packages/google_maps_flutter/example/test_driver/google_maps_test_controller.dart new file mode 100644 index 000000000000..7f3beea8c160 --- /dev/null +++ b/packages/google_maps_flutter/example/test_driver/google_maps_test_controller.dart @@ -0,0 +1,36 @@ +// Copyright 2019, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +import 'package:flutter/services.dart'; + +class GoogleMapTestController { + GoogleMapTestController(this._channel); + + final MethodChannel _channel; + + Future mapStateSnapshot() async { + // TODO(amirh): remove this on when the invokeMethod update makes it to stable Flutter. + // https://github.com/flutter/flutter/issues/26431 + // ignore: strong_mode_implicit_dynamic_method + final List stateSnapshot = + await _channel.invokeMethod('map#stateSnapshot'); + return GoogleMapStateSnapshot( + compassEnabled: stateSnapshot[0], + minZoomPreference: stateSnapshot[1], + maxZoomPreference: stateSnapshot[2], + ); + } +} + +class GoogleMapStateSnapshot { + GoogleMapStateSnapshot({ + this.compassEnabled, + this.minZoomPreference, + this.maxZoomPreference, + }); + + final bool compassEnabled; + final double minZoomPreference; + final double maxZoomPreference; +} diff --git a/packages/google_maps_flutter/lib/src/controller.dart b/packages/google_maps_flutter/lib/src/controller.dart index 3d5640083698..40e0bdc18cc5 100644 --- a/packages/google_maps_flutter/lib/src/controller.dart +++ b/packages/google_maps_flutter/lib/src/controller.dart @@ -129,4 +129,9 @@ class GoogleMapController { 'cameraUpdate': cameraUpdate._toJson(), }); } + + // TODO(iskakaushik): dart doc. + MethodChannel getMethodChannel() { + return _channel; + } } diff --git a/packages/google_maps_flutter/pubspec.yaml b/packages/google_maps_flutter/pubspec.yaml index 81169e44ff68..4cdcc9353f7c 100644 --- a/packages/google_maps_flutter/pubspec.yaml +++ b/packages/google_maps_flutter/pubspec.yaml @@ -12,6 +12,12 @@ dev_dependencies: flutter_test: sdk: flutter + # TODO(iskakaushik): The following dependencies can be removed once + # https://github.com/dart-lang/pub/issues/2101 is resolved. + flutter_driver: + sdk: flutter + test: any + flutter: plugin: androidPackage: io.flutter.plugins.googlemaps From 7da145e1db32e9cca46afc0615b204424e2da3f4 Mon Sep 17 00:00:00 2001 From: Kaushik Iska Date: Wed, 27 Mar 2019 11:36:51 -0700 Subject: [PATCH 02/12] inject apikey via env var --- packages/google_maps_flutter/example/android/app/build.gradle | 4 ++++ .../example/android/app/src/main/AndroidManifest.xml | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/google_maps_flutter/example/android/app/build.gradle b/packages/google_maps_flutter/example/android/app/build.gradle index 0e30acb1d954..16e93d936838 100644 --- a/packages/google_maps_flutter/example/android/app/build.gradle +++ b/packages/google_maps_flutter/example/android/app/build.gradle @@ -40,6 +40,10 @@ android { testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } + defaultConfig { + manifestPlaceholders = [mapsApiKey: "$System.env.MAPS_API_KEY"] + } + buildTypes { release { // TODO: Add your own signing config for the release build. diff --git a/packages/google_maps_flutter/example/android/app/src/main/AndroidManifest.xml b/packages/google_maps_flutter/example/android/app/src/main/AndroidManifest.xml index 9e8b95998598..2b7e3c8fe328 100644 --- a/packages/google_maps_flutter/example/android/app/src/main/AndroidManifest.xml +++ b/packages/google_maps_flutter/example/android/app/src/main/AndroidManifest.xml @@ -13,7 +13,7 @@ android:value="@integer/google_play_services_version" /> + android:value="${mapsApiKey}" /> Date: Wed, 27 Mar 2019 12:40:52 -0700 Subject: [PATCH 03/12] Put a maps api token in cirrus, encrypted --- .cirrus.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.cirrus.yml b/.cirrus.yml index 668287bdf6ca..62314b1b6b71 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -27,6 +27,7 @@ task: matrix: PLUGIN_SHARDING: "--shardIndex 0 --shardCount 2" PLUGIN_SHARDING: "--shardIndex 1 --shardCount 2" + MAPS_API_KEY: ENCRYPTED[8b59d83bf4e55b0360b7183a2011241f4e22ba27e31cf06037f7e6e59fa7f9022d82ee604547f8a27d1ceba325cc2588] create_device_script: echo no | avdmanager -v create avd -n test -k "system-images;android-21;default;armeabi-v7a" start_emulator_background_script: From 5873d0b36adf47e44454e88a2003e38f316e9c17 Mon Sep 17 00:00:00 2001 From: Kaushik Iska Date: Thu, 28 Mar 2019 15:26:03 -0700 Subject: [PATCH 04/12] Factor out things to their own methods --- .../googlemaps/GoogleMapController.java | 5 ++- .../googlemaps/GoogleMapStateSnapshot.java | 36 ------------------- .../example/test_driver/google_maps.dart | 17 +++++---- .../google_maps_test_controller.dart | 25 ++----------- .../lib/src/controller.dart | 20 +++++------ 5 files changed, 24 insertions(+), 79 deletions(-) delete mode 100644 packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapStateSnapshot.java 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 27f396e28817..99aa11a5dd5f 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 @@ -202,10 +202,9 @@ public void onMethodCall(MethodCall call, MethodChannel.Result result) { result.success(null); break; } - case "map#stateSnapshot": + case "map#isCompassEnabled": { - GoogleMapStateSnapshot mapStateSnapshot = GoogleMapStateSnapshot.from(googleMap); - result.success(mapStateSnapshot.asList()); + result.success(googleMap.getUiSettings().isCompassEnabled()); break; } default: diff --git a/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapStateSnapshot.java b/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapStateSnapshot.java deleted file mode 100644 index d6750dba0604..000000000000 --- a/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapStateSnapshot.java +++ /dev/null @@ -1,36 +0,0 @@ -package io.flutter.plugins.googlemaps; - -import com.google.android.gms.maps.GoogleMap; -import com.google.android.gms.maps.UiSettings; -import java.util.ArrayList; -import java.util.List; - -// This will be serialized across the platform boundary, -// needs to be kept in sync with the dart side. -class GoogleMapStateSnapshot { - - private final boolean compassEnabled; - private final Float minZoomPreference; - private final Float maxZoomPreference; - - static GoogleMapStateSnapshot from(GoogleMap googleMap) { - UiSettings uiSettings = googleMap.getUiSettings(); - return new GoogleMapStateSnapshot( - uiSettings.isCompassEnabled(), googleMap.getMinZoomLevel(), googleMap.getMaxZoomLevel()); - } - - private GoogleMapStateSnapshot( - boolean compassEnabled, Float minZoomPreference, Float maxZoomPreference) { - this.compassEnabled = compassEnabled; - this.minZoomPreference = minZoomPreference; - this.maxZoomPreference = maxZoomPreference; - } - - List asList() { - List container = new ArrayList<>(); - container.add(compassEnabled); - container.add(minZoomPreference); - container.add(maxZoomPreference); - return container; - } -} 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 cda6dee14756..5f591261aacf 100644 --- a/packages/google_maps_flutter/example/test_driver/google_maps.dart +++ b/packages/google_maps_flutter/example/test_driver/google_maps.dart @@ -15,7 +15,10 @@ const CameraPosition _kInitialCameraPosition = CameraPosition(target: LatLng(0, 0)); class GoogleMapTest extends StatefulWidget { - GoogleMapTest(this.mapState, this._controllerCompleter); + GoogleMapTest( + this.mapState, + this._controllerCompleter, + ); final _GoogleMapTestState mapState; final Completer _controllerCompleter; @@ -68,17 +71,17 @@ void main() { }); test('testCompassToggle', () async { - GoogleMapStateSnapshot mapStateSnapshot; + bool compassEnabled; - mapStateSnapshot = await testController.mapStateSnapshot(); - expect(mapStateSnapshot.compassEnabled, false); + compassEnabled = await testController.isCompassEnabled(); + expect(compassEnabled, false); mapTestState.toggleCompass(); - // This delay exists for platform channel propagation. + // This delay exists as we are waiting for a new build to occur. await Future.delayed(Duration(seconds: 1), () {}); - mapStateSnapshot = await testController.mapStateSnapshot(); - expect(mapStateSnapshot.compassEnabled, true); + compassEnabled = await testController.isCompassEnabled(); + expect(compassEnabled, true); }); } diff --git a/packages/google_maps_flutter/example/test_driver/google_maps_test_controller.dart b/packages/google_maps_flutter/example/test_driver/google_maps_test_controller.dart index 7f3beea8c160..210db7edaf85 100644 --- a/packages/google_maps_flutter/example/test_driver/google_maps_test_controller.dart +++ b/packages/google_maps_flutter/example/test_driver/google_maps_test_controller.dart @@ -9,28 +9,7 @@ class GoogleMapTestController { final MethodChannel _channel; - Future mapStateSnapshot() async { - // TODO(amirh): remove this on when the invokeMethod update makes it to stable Flutter. - // https://github.com/flutter/flutter/issues/26431 - // ignore: strong_mode_implicit_dynamic_method - final List stateSnapshot = - await _channel.invokeMethod('map#stateSnapshot'); - return GoogleMapStateSnapshot( - compassEnabled: stateSnapshot[0], - minZoomPreference: stateSnapshot[1], - maxZoomPreference: stateSnapshot[2], - ); + Future isCompassEnabled() async { + return await _channel.invokeMethod('map#isCompassEnabled'); } } - -class GoogleMapStateSnapshot { - GoogleMapStateSnapshot({ - this.compassEnabled, - this.minZoomPreference, - this.maxZoomPreference, - }); - - final bool compassEnabled; - final double minZoomPreference; - final double maxZoomPreference; -} diff --git a/packages/google_maps_flutter/lib/src/controller.dart b/packages/google_maps_flutter/lib/src/controller.dart index 40e0bdc18cc5..11f43b3f613e 100644 --- a/packages/google_maps_flutter/lib/src/controller.dart +++ b/packages/google_maps_flutter/lib/src/controller.dart @@ -7,12 +7,11 @@ part of google_maps_flutter; /// Controller for a single GoogleMap instance running on the host platform. class GoogleMapController { GoogleMapController._( - MethodChannel channel, + this.channel, CameraPosition initialCameraPosition, this._googleMapState, - ) : assert(channel != null), - _channel = channel { - _channel.setMethodCallHandler(_handleMethodCall); + ) : assert(channel != null) { + channel.setMethodCallHandler(_handleMethodCall); } static Future init( @@ -34,7 +33,8 @@ class GoogleMapController { ); } - final MethodChannel _channel; + @visibleForTesting + final MethodChannel channel; final _GoogleMapState _googleMapState; @@ -79,7 +79,7 @@ class GoogleMapController { // TODO(amirh): remove this on when the invokeMethod update makes it to stable Flutter. // https://github.com/flutter/flutter/issues/26431 // ignore: strong_mode_implicit_dynamic_method - await _channel.invokeMethod( + await channel.invokeMethod( 'map#update', { 'options': optionsUpdate, @@ -98,7 +98,7 @@ class GoogleMapController { // TODO(amirh): remove this on when the invokeMethod update makes it to stable Flutter. // https://github.com/flutter/flutter/issues/26431 // ignore: strong_mode_implicit_dynamic_method - await _channel.invokeMethod( + await channel.invokeMethod( 'markers#update', markerUpdates._toMap(), ); @@ -112,7 +112,7 @@ class GoogleMapController { // TODO(amirh): remove this on when the invokeMethod update makes it to stable Flutter. // https://github.com/flutter/flutter/issues/26431 // ignore: strong_mode_implicit_dynamic_method - await _channel.invokeMethod('camera#animate', { + await channel.invokeMethod('camera#animate', { 'cameraUpdate': cameraUpdate._toJson(), }); } @@ -125,13 +125,13 @@ class GoogleMapController { // TODO(amirh): remove this on when the invokeMethod update makes it to stable Flutter. // https://github.com/flutter/flutter/issues/26431 // ignore: strong_mode_implicit_dynamic_method - await _channel.invokeMethod('camera#move', { + await channel.invokeMethod('camera#move', { 'cameraUpdate': cameraUpdate._toJson(), }); } // TODO(iskakaushik): dart doc. MethodChannel getMethodChannel() { - return _channel; + return channel; } } From b28925efa96828e9338892aec49cd43c798cfb0b Mon Sep 17 00:00:00 2001 From: Kaushik Iska Date: Thu, 28 Mar 2019 15:42:48 -0700 Subject: [PATCH 05/12] IOS impl --- .cirrus.yml | 1 + .../google_maps_flutter/example/ios/Runner/AppDelegate.m | 7 ++++--- .../example/test_driver/google_maps.dart | 3 ++- .../google_maps_flutter/ios/Classes/GoogleMapController.m | 3 +++ packages/google_maps_flutter/lib/src/controller.dart | 5 ----- 5 files changed, 10 insertions(+), 9 deletions(-) diff --git a/.cirrus.yml b/.cirrus.yml index 62314b1b6b71..0a212fb2e3fb 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -28,6 +28,7 @@ task: PLUGIN_SHARDING: "--shardIndex 0 --shardCount 2" PLUGIN_SHARDING: "--shardIndex 1 --shardCount 2" MAPS_API_KEY: ENCRYPTED[8b59d83bf4e55b0360b7183a2011241f4e22ba27e31cf06037f7e6e59fa7f9022d82ee604547f8a27d1ceba325cc2588] + SIMCTL_CHILD_MAPS_API_KEY: ENCRYPTED[8b59d83bf4e55b0360b7183a2011241f4e22ba27e31cf06037f7e6e59fa7f9022d82ee604547f8a27d1ceba325cc2588] create_device_script: echo no | avdmanager -v create avd -n test -k "system-images;android-21;default;armeabi-v7a" start_emulator_background_script: diff --git a/packages/google_maps_flutter/example/ios/Runner/AppDelegate.m b/packages/google_maps_flutter/example/ios/Runner/AppDelegate.m index 28b6216c2245..207be64e09ba 100644 --- a/packages/google_maps_flutter/example/ios/Runner/AppDelegate.m +++ b/packages/google_maps_flutter/example/ios/Runner/AppDelegate.m @@ -4,10 +4,11 @@ @implementation AppDelegate -- (BOOL)application:(UIApplication *)application - didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { +- (BOOL)application:(UIApplication*)application + didFinishLaunchingWithOptions:(NSDictionary*)launchOptions { // Provide the GoogleMaps API key. - [GMSServices provideAPIKey:@"YOUR KEY HERE"]; + NSString* mapsApiKey = [[NSProcessInfo processInfo] environment][@"MAPS_API_KEY"]; + [GMSServices provideAPIKey:mapsApiKey]; // Register Flutter plugins. [GeneratedPluginRegistrant registerWithRegistry:self]; 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 5f591261aacf..4fea57a864cf 100644 --- a/packages/google_maps_flutter/example/test_driver/google_maps.dart +++ b/packages/google_maps_flutter/example/test_driver/google_maps.dart @@ -67,7 +67,8 @@ void main() { Completer(); runApp(GoogleMapTest(mapTestState, controllerCompleter)); controller = await controllerCompleter.future; - testController = GoogleMapTestController(controller.getMethodChannel()); + // ignore: invalid_use_of_visible_for_testing_member + testController = GoogleMapTestController(controller.channel); }); test('testCompassToggle', () async { diff --git a/packages/google_maps_flutter/ios/Classes/GoogleMapController.m b/packages/google_maps_flutter/ios/Classes/GoogleMapController.m index 1783bded7f6d..da755393be70 100644 --- a/packages/google_maps_flutter/ios/Classes/GoogleMapController.m +++ b/packages/google_maps_flutter/ios/Classes/GoogleMapController.m @@ -125,6 +125,9 @@ - (void)onMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result { [_markersController removeMarkerIds:markerIdsToRemove]; } result(nil); + } else if ([call.method isEqualToString:@"map#isCompassEnabled"]) { + NSNumber* isCompassEnabled = @(_mapView.settings.compassButton); + result(isCompassEnabled); } else { result(FlutterMethodNotImplemented); } diff --git a/packages/google_maps_flutter/lib/src/controller.dart b/packages/google_maps_flutter/lib/src/controller.dart index 11f43b3f613e..bb8b4888eb54 100644 --- a/packages/google_maps_flutter/lib/src/controller.dart +++ b/packages/google_maps_flutter/lib/src/controller.dart @@ -129,9 +129,4 @@ class GoogleMapController { 'cameraUpdate': cameraUpdate._toJson(), }); } - - // TODO(iskakaushik): dart doc. - MethodChannel getMethodChannel() { - return channel; - } } From 4e320752d5c44a4d0c8f2d710bed011420c220ff Mon Sep 17 00:00:00 2001 From: Kaushik Iska Date: Thu, 28 Mar 2019 20:41:08 -0700 Subject: [PATCH 06/12] address comments --- .../android/app/src/main/AndroidManifest.xml | 1 + .../example/test_driver/google_maps.dart | 83 +++++++------------ .../example/test_driver/test_widgets.dart | 12 +++ 3 files changed, 41 insertions(+), 55 deletions(-) create mode 100644 packages/google_maps_flutter/example/test_driver/test_widgets.dart diff --git a/packages/google_maps_flutter/example/android/app/src/main/AndroidManifest.xml b/packages/google_maps_flutter/example/android/app/src/main/AndroidManifest.xml index 2b7e3c8fe328..1e20d08125a0 100644 --- a/packages/google_maps_flutter/example/android/app/src/main/AndroidManifest.xml +++ b/packages/google_maps_flutter/example/android/app/src/main/AndroidManifest.xml @@ -11,6 +11,7 @@ + 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 4fea57a864cf..a4863fc2249c 100644 --- a/packages/google_maps_flutter/example/test_driver/google_maps.dart +++ b/packages/google_maps_flutter/example/test_driver/google_maps.dart @@ -10,77 +10,50 @@ import 'package:flutter_test/flutter_test.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart'; import 'google_maps_test_controller.dart'; +import 'test_widgets.dart'; const CameraPosition _kInitialCameraPosition = CameraPosition(target: LatLng(0, 0)); -class GoogleMapTest extends StatefulWidget { - GoogleMapTest( - this.mapState, - this._controllerCompleter, - ); - - final _GoogleMapTestState mapState; - final Completer _controllerCompleter; +void main() { + final Completer allTestsCompleter = Completer(); + enableFlutterDriverExtension(handler: (_) => allTestsCompleter.future); - @override - _GoogleMapTestState createState() => mapState; -} + tearDownAll(() => allTestsCompleter.complete(null)); -class _GoogleMapTestState extends State { - bool _compassEnabled = false; + test('testCompassToggle', () async { + final Completer controllerCompleter = + Completer(); - @override - Widget build(BuildContext context) { - return Directionality( + await pumpWidget(Directionality( textDirection: TextDirection.ltr, child: GoogleMap( initialCameraPosition: _kInitialCameraPosition, - compassEnabled: _compassEnabled, + compassEnabled: false, onMapCreated: (GoogleMapController controller) { - widget._controllerCompleter.complete(controller); + final GoogleMapTestController testController = + // ignore: invalid_use_of_visible_for_testing_member + GoogleMapTestController(controller.channel); + controllerCompleter.complete(testController); }, ), - ); - } - - void toggleCompass() { - setState(() { - _compassEnabled = !_compassEnabled; - }); - } -} - -void main() { - final Completer allTestsCompleter = Completer(); - enableFlutterDriverExtension(handler: (_) => allTestsCompleter.future); - - tearDownAll(() => allTestsCompleter.complete(null)); - - _GoogleMapTestState mapTestState; - GoogleMapController controller; - GoogleMapTestController testController; - - setUp(() async { - mapTestState = _GoogleMapTestState(); - final Completer controllerCompleter = - Completer(); - runApp(GoogleMapTest(mapTestState, controllerCompleter)); - controller = await controllerCompleter.future; - // ignore: invalid_use_of_visible_for_testing_member - testController = GoogleMapTestController(controller.channel); - }); + )); - test('testCompassToggle', () async { - bool compassEnabled; - - compassEnabled = await testController.isCompassEnabled(); + final GoogleMapTestController testController = + await controllerCompleter.future; + bool compassEnabled = await testController.isCompassEnabled(); expect(compassEnabled, false); - mapTestState.toggleCompass(); - - // This delay exists as we are waiting for a new build to occur. - await Future.delayed(Duration(seconds: 1), () {}); + await pumpWidget(Directionality( + textDirection: TextDirection.ltr, + child: GoogleMap( + initialCameraPosition: _kInitialCameraPosition, + compassEnabled: true, + onMapCreated: (GoogleMapController controller) { + fail("OnMapCreated should get called only once."); + }, + ), + )); compassEnabled = await testController.isCompassEnabled(); expect(compassEnabled, true); diff --git a/packages/google_maps_flutter/example/test_driver/test_widgets.dart b/packages/google_maps_flutter/example/test_driver/test_widgets.dart new file mode 100644 index 000000000000..5656c9f5610c --- /dev/null +++ b/packages/google_maps_flutter/example/test_driver/test_widgets.dart @@ -0,0 +1,12 @@ +// Copyright 2019, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +import 'dart:async'; + +import 'package:flutter/widgets.dart'; + +Future pumpWidget(Widget widget) { + runApp(widget); + return WidgetsBinding.instance.endOfFrame; +} From 52e305e740323808ab3c357e335cf684e909283d Mon Sep 17 00:00:00 2001 From: Kaushik Iska Date: Fri, 29 Mar 2019 09:11:22 -0700 Subject: [PATCH 07/12] Add env vars to right places --- .cirrus.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.cirrus.yml b/.cirrus.yml index 0a212fb2e3fb..ad95b617acd6 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -65,6 +65,8 @@ task: PLUGIN_SHARDING: "--shardIndex 1 --shardCount 4" PLUGIN_SHARDING: "--shardIndex 2 --shardCount 4" PLUGIN_SHARDING: "--shardIndex 3 --shardCount 4" + MAPS_API_KEY: ENCRYPTED[8b59d83bf4e55b0360b7183a2011241f4e22ba27e31cf06037f7e6e59fa7f9022d82ee604547f8a27d1ceba325cc2588] + SIMCTL_CHILD_MAPS_API_KEY: ENCRYPTED[8b59d83bf4e55b0360b7183a2011241f4e22ba27e31cf06037f7e6e59fa7f9022d82ee604547f8a27d1ceba325cc2588] setup_script: - brew update - brew install libimobiledevice From 759299a3b10dae0b20fc16ba934b7dd3f07e2073 Mon Sep 17 00:00:00 2001 From: Kaushik Iska Date: Fri, 29 Mar 2019 09:19:11 -0700 Subject: [PATCH 08/12] update enc val --- .cirrus.yml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/.cirrus.yml b/.cirrus.yml index ad95b617acd6..fe80a0109b9e 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -27,8 +27,7 @@ task: matrix: PLUGIN_SHARDING: "--shardIndex 0 --shardCount 2" PLUGIN_SHARDING: "--shardIndex 1 --shardCount 2" - MAPS_API_KEY: ENCRYPTED[8b59d83bf4e55b0360b7183a2011241f4e22ba27e31cf06037f7e6e59fa7f9022d82ee604547f8a27d1ceba325cc2588] - SIMCTL_CHILD_MAPS_API_KEY: ENCRYPTED[8b59d83bf4e55b0360b7183a2011241f4e22ba27e31cf06037f7e6e59fa7f9022d82ee604547f8a27d1ceba325cc2588] + MAPS_API_KEY: ENCRYPTED[596a9f6bca436694625ac50851dc5da6b4d34cba8025f7db5bc9465142e8cd44e15f69e3507787753accebfc4910d550] create_device_script: echo no | avdmanager -v create avd -n test -k "system-images;android-21;default;armeabi-v7a" start_emulator_background_script: @@ -65,8 +64,7 @@ task: PLUGIN_SHARDING: "--shardIndex 1 --shardCount 4" PLUGIN_SHARDING: "--shardIndex 2 --shardCount 4" PLUGIN_SHARDING: "--shardIndex 3 --shardCount 4" - MAPS_API_KEY: ENCRYPTED[8b59d83bf4e55b0360b7183a2011241f4e22ba27e31cf06037f7e6e59fa7f9022d82ee604547f8a27d1ceba325cc2588] - SIMCTL_CHILD_MAPS_API_KEY: ENCRYPTED[8b59d83bf4e55b0360b7183a2011241f4e22ba27e31cf06037f7e6e59fa7f9022d82ee604547f8a27d1ceba325cc2588] + SIMCTL_CHILD_MAPS_API_KEY: ENCRYPTED[596a9f6bca436694625ac50851dc5da6b4d34cba8025f7db5bc9465142e8cd44e15f69e3507787753accebfc4910d550] setup_script: - brew update - brew install libimobiledevice From 6e07157e329f0b3a3ecf306fff5cc197fea917f5 Mon Sep 17 00:00:00 2001 From: Kaushik Iska Date: Fri, 29 Mar 2019 10:37:55 -0700 Subject: [PATCH 09/12] fix test version --- packages/google_maps_flutter/example/pubspec.yaml | 2 +- packages/google_maps_flutter/pubspec.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/google_maps_flutter/example/pubspec.yaml b/packages/google_maps_flutter/example/pubspec.yaml index 564702cab9e1..2f49ef6470d2 100644 --- a/packages/google_maps_flutter/example/pubspec.yaml +++ b/packages/google_maps_flutter/example/pubspec.yaml @@ -14,7 +14,7 @@ dev_dependencies: path: ../ flutter_driver: sdk: flutter - test: any + test: ^1.6.0 # For information on the generic Dart part of this file, see the # following page: https://www.dartlang.org/tools/pub/pubspec diff --git a/packages/google_maps_flutter/pubspec.yaml b/packages/google_maps_flutter/pubspec.yaml index 4cdcc9353f7c..2db4b2e3aa79 100644 --- a/packages/google_maps_flutter/pubspec.yaml +++ b/packages/google_maps_flutter/pubspec.yaml @@ -16,7 +16,7 @@ dev_dependencies: # https://github.com/dart-lang/pub/issues/2101 is resolved. flutter_driver: sdk: flutter - test: any + test: ^1.6.0 flutter: plugin: From e73d48f38f39ad78074ba6a604f60abf56e38621 Mon Sep 17 00:00:00 2001 From: Kaushik Iska Date: Fri, 29 Mar 2019 10:40:40 -0700 Subject: [PATCH 10/12] rename to GoogleMapInspector --- ...troller.dart => google_map_inspector.dart} | 4 ++-- .../example/test_driver/google_maps.dart | 19 +++++++++---------- 2 files changed, 11 insertions(+), 12 deletions(-) rename packages/google_maps_flutter/example/test_driver/{google_maps_test_controller.dart => google_map_inspector.dart} (84%) diff --git a/packages/google_maps_flutter/example/test_driver/google_maps_test_controller.dart b/packages/google_maps_flutter/example/test_driver/google_map_inspector.dart similarity index 84% rename from packages/google_maps_flutter/example/test_driver/google_maps_test_controller.dart rename to packages/google_maps_flutter/example/test_driver/google_map_inspector.dart index 210db7edaf85..932515ee2f26 100644 --- a/packages/google_maps_flutter/example/test_driver/google_maps_test_controller.dart +++ b/packages/google_maps_flutter/example/test_driver/google_map_inspector.dart @@ -4,8 +4,8 @@ import 'package:flutter/services.dart'; -class GoogleMapTestController { - GoogleMapTestController(this._channel); +class GoogleMapInspector { + GoogleMapInspector(this._channel); final MethodChannel _channel; 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 a4863fc2249c..864685ad2058 100644 --- a/packages/google_maps_flutter/example/test_driver/google_maps.dart +++ b/packages/google_maps_flutter/example/test_driver/google_maps.dart @@ -9,7 +9,7 @@ import 'package:flutter_driver/driver_extension.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart'; -import 'google_maps_test_controller.dart'; +import 'google_map_inspector.dart'; import 'test_widgets.dart'; const CameraPosition _kInitialCameraPosition = @@ -22,8 +22,8 @@ void main() { tearDownAll(() => allTestsCompleter.complete(null)); test('testCompassToggle', () async { - final Completer controllerCompleter = - Completer(); + final Completer inspectorCompleter = + Completer(); await pumpWidget(Directionality( textDirection: TextDirection.ltr, @@ -31,17 +31,16 @@ void main() { initialCameraPosition: _kInitialCameraPosition, compassEnabled: false, onMapCreated: (GoogleMapController controller) { - final GoogleMapTestController testController = + final GoogleMapInspector inspector = // ignore: invalid_use_of_visible_for_testing_member - GoogleMapTestController(controller.channel); - controllerCompleter.complete(testController); + GoogleMapInspector(controller.channel); + inspectorCompleter.complete(inspector); }, ), )); - final GoogleMapTestController testController = - await controllerCompleter.future; - bool compassEnabled = await testController.isCompassEnabled(); + final GoogleMapInspector inspector = await inspectorCompleter.future; + bool compassEnabled = await inspector.isCompassEnabled(); expect(compassEnabled, false); await pumpWidget(Directionality( @@ -55,7 +54,7 @@ void main() { ), )); - compassEnabled = await testController.isCompassEnabled(); + compassEnabled = await inspector.isCompassEnabled(); expect(compassEnabled, true); }); } From 097d2ac52df7cf6abfe745b4906a2faa0b2a7bf8 Mon Sep 17 00:00:00 2001 From: Kaushik Iska Date: Fri, 29 Mar 2019 10:43:54 -0700 Subject: [PATCH 11/12] check env var and add key --- packages/google_maps_flutter/example/ios/Runner/AppDelegate.m | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/google_maps_flutter/example/ios/Runner/AppDelegate.m b/packages/google_maps_flutter/example/ios/Runner/AppDelegate.m index 207be64e09ba..893deae584b0 100644 --- a/packages/google_maps_flutter/example/ios/Runner/AppDelegate.m +++ b/packages/google_maps_flutter/example/ios/Runner/AppDelegate.m @@ -8,6 +8,9 @@ - (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions { // Provide the GoogleMaps API key. NSString* mapsApiKey = [[NSProcessInfo processInfo] environment][@"MAPS_API_KEY"]; + if ([mapsApiKey length] == 0) { + mapsApiKey = @"YOUR KEY HERE"; + } [GMSServices provideAPIKey:mapsApiKey]; // Register Flutter plugins. From 60798e4cd5e181e58bf9558cac9ce93fa7bfa762 Mon Sep 17 00:00:00 2001 From: Kaushik Iska Date: Fri, 29 Mar 2019 10:55:57 -0700 Subject: [PATCH 12/12] Add doc --- .../example/test_driver/google_map_inspector.dart | 5 +++++ 1 file changed, 5 insertions(+) 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 932515ee2f26..299e0eebc563 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 @@ -4,6 +4,11 @@ import 'package:flutter/services.dart'; +/// Inspect Google Maps state using the platform SDK. +/// +/// This class is primarily used for testing. The methods on this +/// class should call "getters" on the GoogleMap object or equivalent +/// on the platform side. class GoogleMapInspector { GoogleMapInspector(this._channel);