From 22dfa49768a1119dc331daf19572011d6e77f2cd Mon Sep 17 00:00:00 2001 From: Stuart Morgan Date: Mon, 10 Jun 2024 15:29:17 -0400 Subject: [PATCH 1/5] Duplicate ios14/ --- .../example/ios15/README.md | 13 + .../example/ios15/assets/2.0x/red_square.png | Bin 0 -> 304 bytes .../example/ios15/assets/3.0x/red_square.png | Bin 0 -> 312 bytes .../example/ios15/assets/night_mode.json | 162 +++ .../example/ios15/assets/red_square.png | Bin 0 -> 195 bytes .../integration_test/google_maps_test.dart | 1256 +++++++++++++++++ .../integration_test/resources/icon_image.png | Bin 0 -> 1257 bytes .../resources/icon_image_base64.dart | 49 + .../ios15/ios/Flutter/AppFrameworkInfo.plist | 30 + .../example/ios15/ios/Flutter/Debug.xcconfig | 2 + .../ios15/ios/Flutter/Release.xcconfig | 2 + .../example/ios15/ios/Podfile | 43 + .../ios/Runner.xcodeproj/project.pbxproj | 797 +++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/xcschemes/Runner.xcscheme | 107 ++ .../contents.xcworkspacedata | 10 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../example/ios15/ios/Runner/AppDelegate.h | 9 + .../example/ios15/ios/Runner/AppDelegate.m | 27 + .../AppIcon.appiconset/Contents.json | 122 ++ .../Icon-App-1024x1024@1x.png | Bin 0 -> 11112 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 0 -> 564 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 0 -> 1283 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 0 -> 1588 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 0 -> 1025 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 0 -> 1716 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 0 -> 1920 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 0 -> 1283 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 0 -> 1895 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 0 -> 2665 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 0 -> 2665 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 0 -> 3831 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 0 -> 1888 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 0 -> 3294 bytes .../Icon-App-83.5x83.5@2x.png | Bin 0 -> 3612 bytes .../LaunchImage.imageset/Contents.json | 23 + .../LaunchImage.imageset/LaunchImage.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@2x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@3x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/README.md | 5 + .../Runner/Base.lproj/LaunchScreen.storyboard | 37 + .../ios/Runner/Base.lproj/Main.storyboard | 26 + .../example/ios15/ios/Runner/Info.plist | 53 + .../example/ios15/ios/Runner/main.m | 13 + .../RunnerTests/ExtractIconFromDataTests.m | 371 +++++ ...TGoogleMapJSONConversionsConversionTests.m | 305 ++++ .../FLTTileProviderControllerTests.m | 32 + .../GoogleMapsPolylinesControllerTests.m | 81 ++ .../ios15/ios/RunnerTests/GoogleMapsTests.m | 88 ++ .../example/ios15/ios/RunnerTests/Info.plist | 22 + .../ios/RunnerTests/PartiallyMockedMapView.h | 17 + .../ios/RunnerTests/PartiallyMockedMapView.m | 34 + .../ios/RunnerTests/assets/widegamut.png | Bin 0 -> 3025 bytes .../ios/RunnerUITests/GoogleMapsUITests.m | 277 ++++ .../ios15/ios/RunnerUITests/Info.plist | 22 + .../example/ios15/lib/main.dart | 45 + .../example/ios15/pubspec.yaml | 34 + .../ios15/test_driver/integration_test.dart | 7 + 58 files changed, 4136 insertions(+) create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/README.md create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/assets/2.0x/red_square.png create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/assets/3.0x/red_square.png create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/assets/night_mode.json create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/assets/red_square.png create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/integration_test/google_maps_test.dart create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/integration_test/resources/icon_image.png create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/integration_test/resources/icon_image_base64.dart create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Flutter/AppFrameworkInfo.plist create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Flutter/Debug.xcconfig create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Flutter/Release.xcconfig create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Podfile create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner.xcodeproj/project.pbxproj create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner/AppDelegate.h create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner/AppDelegate.m create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner/Base.lproj/LaunchScreen.storyboard create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner/Base.lproj/Main.storyboard create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner/Info.plist create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner/main.m create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/RunnerTests/ExtractIconFromDataTests.m create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/RunnerTests/FLTGoogleMapJSONConversionsConversionTests.m create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/RunnerTests/FLTTileProviderControllerTests.m create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/RunnerTests/GoogleMapsPolylinesControllerTests.m create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/RunnerTests/GoogleMapsTests.m create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/RunnerTests/Info.plist create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/RunnerTests/PartiallyMockedMapView.h create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/RunnerTests/PartiallyMockedMapView.m create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/RunnerTests/assets/widegamut.png create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/RunnerUITests/GoogleMapsUITests.m create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/RunnerUITests/Info.plist create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/lib/main.dart create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/pubspec.yaml create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/test_driver/integration_test.dart diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/README.md b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/README.md new file mode 100644 index 00000000000..2d527ff468c --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/README.md @@ -0,0 +1,13 @@ +# Platform Implementation Test App + +This is a test app for manual testing and automated integration testing +of this platform implementation. It is not intended to demonstrate actual use of +this package, since the intent is that plugin clients use the app-facing +package. + +Unless you are making changes to this implementation package, this example is +very unlikely to be relevant. + +## Versions + +This example requires iOS 14, so will select a 8.x GoogleMaps SDK version. diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/assets/2.0x/red_square.png b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/assets/2.0x/red_square.png new file mode 100644 index 0000000000000000000000000000000000000000..0f82237796bf8fd2f178f9e758330b88cf715db2 GIT binary patch literal 304 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeK3?y%aJ*@^(Ea{HEjtmSN`?>!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8Uxs6XMFi@E-`O@66Nz ziZCX5ySp&{XVSd~vL>4nJh^c}wqi2xH2cRH(iKnkC`(qX^4o2nTuqlgyLPDM{ zjv*GOlM^IZ7bl4HG(F^GV0pm6cSViEBhjN@7W>RdP`(kYX@0FtpS)Fwr$M z2r)FZGBC0-FwiwH2a=`jO&~8KH00)|WTsW3YcRAjHic*~j#{}AsDZ)L)z4*}Q$iB} Dk-bi6 literal 0 HcmV?d00001 diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/assets/3.0x/red_square.png b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/assets/3.0x/red_square.png new file mode 100644 index 0000000000000000000000000000000000000000..7e2739974e7bb4101cc42f520ece096cb2f5ade7 GIT binary patch literal 312 zcmeAS@N?(olHy`uVBq!ia0vp^6F``e8A#skDEJMeSkfJR9T^xl_H+M9WCijSl0AZa z85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP=YPMC&ZPZf#LuE|04GK z{y-7NByV>Y#{W#Z_kbME0*}aI1_m)z5N7lYQuzQBWH0gbb!C6d!o|U8+TNu22`D7x z>EamTas2H;Lq;I)(1Nf2xxD-f7#JR0XW-hvz-VXkX+BU~wZt`|BqgyV)hf9t6-Y4{ z85mmX8kp!B8iW{{S{WExnHuXFm|GbbJl~bP0 Hl+XkKwG2>~ literal 0 HcmV?d00001 diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/assets/night_mode.json b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/assets/night_mode.json new file mode 100644 index 00000000000..1f16e003a92 --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/assets/night_mode.json @@ -0,0 +1,162 @@ +[ + { + "elementType": "geometry", + "stylers": [ + { + "color": "#242f3e" + } + ] + }, + { + "elementType": "labels.text.fill", + "stylers": [ + { + "color": "#746855" + } + ] + }, + { + "elementType": "labels.text.stroke", + "stylers": [ + { + "color": "#242f3e" + } + ] + }, + { + "featureType": "administrative.locality", + "elementType": "labels.text.fill", + "stylers": [ + { + "color": "#d59563" + } + ] + }, + { + "featureType": "poi", + "elementType": "labels.text.fill", + "stylers": [ + { + "color": "#d59563" + } + ] + }, + { + "featureType": "poi.park", + "elementType": "geometry", + "stylers": [ + { + "color": "#263c3f" + } + ] + }, + { + "featureType": "poi.park", + "elementType": "labels.text.fill", + "stylers": [ + { + "color": "#6b9a76" + } + ] + }, + { + "featureType": "road", + "elementType": "geometry", + "stylers": [ + { + "color": "#38414e" + } + ] + }, + { + "featureType": "road", + "elementType": "geometry.stroke", + "stylers": [ + { + "color": "#212a37" + } + ] + }, + { + "featureType": "road", + "elementType": "labels.text.fill", + "stylers": [ + { + "color": "#9ca5b3" + } + ] + }, + { + "featureType": "road.highway", + "elementType": "geometry", + "stylers": [ + { + "color": "#746855" + } + ] + }, + { + "featureType": "road.highway", + "elementType": "geometry.stroke", + "stylers": [ + { + "color": "#1f2835" + } + ] + }, + { + "featureType": "road.highway", + "elementType": "labels.text.fill", + "stylers": [ + { + "color": "#f3d19c" + } + ] + }, + { + "featureType": "transit", + "elementType": "geometry", + "stylers": [ + { + "color": "#2f3948" + } + ] + }, + { + "featureType": "transit.station", + "elementType": "labels.text.fill", + "stylers": [ + { + "color": "#d59563" + } + ] + }, + { + "featureType": "water", + "elementType": "geometry", + "stylers": [ + { + "color": "#17263c" + } + ] + }, + { + "featureType": "water", + "elementType": "labels.text.fill", + "stylers": [ + { + "color": "#515c6d" + } + ] + }, + { + "featureType": "water", + "elementType": "labels.text.stroke", + "stylers": [ + { + "color": "#17263c" + } + ] + } +] + diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/assets/red_square.png b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/assets/red_square.png new file mode 100644 index 0000000000000000000000000000000000000000..650a2dee711d0d404163de8d0e479d68e31d1662 GIT binary patch literal 195 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC#^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lvI6;>1s;*b3=CqbAk63)r1AkM7~$#S7?R=q_WVZP1_OZu2ihZzoWI>~S6qbP0l+XkKvphU~ literal 0 HcmV?d00001 diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/integration_test/google_maps_test.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/integration_test/google_maps_test.dart new file mode 100644 index 00000000000..db8b3956763 --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/integration_test/google_maps_test.dart @@ -0,0 +1,1256 @@ +// Copyright 2013 The Flutter Authors. 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 'dart:convert'; +import 'dart:typed_data'; +import 'dart:ui' as ui; + +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart'; +import 'package:integration_test/integration_test.dart'; +import 'package:maps_example_dart/example_google_map.dart'; + +import 'resources/icon_image_base64.dart'; + +const LatLng _kInitialMapCenter = LatLng(0, 0); +const double _kInitialZoomLevel = 5; +const CameraPosition _kInitialCameraPosition = + CameraPosition(target: _kInitialMapCenter, zoom: _kInitialZoomLevel); +const String _kCloudMapId = '000000000000000'; // Dummy map ID. + +void main() { + IntegrationTestWidgetsFlutterBinding.ensureInitialized(); + GoogleMapsFlutterPlatform.instance.enableDebugInspection(); + + testWidgets('testCompassToggle', (WidgetTester tester) async { + final Key key = GlobalKey(); + final Completer mapIdCompleter = Completer(); + await tester.pumpWidget(Directionality( + textDirection: TextDirection.ltr, + child: ExampleGoogleMap( + key: key, + initialCameraPosition: _kInitialCameraPosition, + compassEnabled: false, + onMapCreated: (ExampleGoogleMapController controller) { + mapIdCompleter.complete(controller.mapId); + }, + ), + )); + + final int mapId = await mapIdCompleter.future; + final GoogleMapsInspectorPlatform inspector = + GoogleMapsInspectorPlatform.instance!; + bool compassEnabled = await inspector.isCompassEnabled(mapId: mapId); + expect(compassEnabled, false); + + await tester.pumpWidget(Directionality( + textDirection: TextDirection.ltr, + child: ExampleGoogleMap( + key: key, + initialCameraPosition: _kInitialCameraPosition, + onMapCreated: (ExampleGoogleMapController controller) { + fail('OnMapCreated should get called only once.'); + }, + ), + )); + + compassEnabled = await inspector.isCompassEnabled(mapId: mapId); + expect(compassEnabled, true); + }); + + testWidgets('testMapToolbar returns false', (WidgetTester tester) async { + final Key key = GlobalKey(); + final Completer mapIdCompleter = Completer(); + + await tester.pumpWidget(Directionality( + textDirection: TextDirection.ltr, + child: ExampleGoogleMap( + key: key, + initialCameraPosition: _kInitialCameraPosition, + onMapCreated: (ExampleGoogleMapController controller) { + mapIdCompleter.complete(controller.mapId); + }, + ), + )); + + final int mapId = await mapIdCompleter.future; + final GoogleMapsInspectorPlatform inspector = + GoogleMapsInspectorPlatform.instance!; + final bool mapToolbarEnabled = + await inspector.isMapToolbarEnabled(mapId: mapId); + // This is only supported on Android, so should always return false. + expect(mapToolbarEnabled, false); + }); + + testWidgets('updateMinMaxZoomLevels', (WidgetTester tester) async { + final Key key = GlobalKey(); + final Completer controllerCompleter = + Completer(); + + const MinMaxZoomPreference initialZoomLevel = MinMaxZoomPreference(4, 8); + const MinMaxZoomPreference finalZoomLevel = MinMaxZoomPreference(6, 10); + + await tester.pumpWidget(Directionality( + textDirection: TextDirection.ltr, + child: ExampleGoogleMap( + key: key, + initialCameraPosition: _kInitialCameraPosition, + minMaxZoomPreference: initialZoomLevel, + onMapCreated: (ExampleGoogleMapController c) async { + controllerCompleter.complete(c); + }, + ), + )); + + final ExampleGoogleMapController controller = + await controllerCompleter.future; + final GoogleMapsInspectorPlatform inspector = + GoogleMapsInspectorPlatform.instance!; + + MinMaxZoomPreference zoomLevel = + await inspector.getMinMaxZoomLevels(mapId: controller.mapId); + expect(zoomLevel, equals(initialZoomLevel)); + + await tester.pumpWidget(Directionality( + textDirection: TextDirection.ltr, + child: ExampleGoogleMap( + key: key, + initialCameraPosition: _kInitialCameraPosition, + minMaxZoomPreference: finalZoomLevel, + onMapCreated: (ExampleGoogleMapController controller) { + fail('OnMapCreated should get called only once.'); + }, + ), + )); + + zoomLevel = await inspector.getMinMaxZoomLevels(mapId: controller.mapId); + expect(zoomLevel, equals(finalZoomLevel)); + }); + + testWidgets('testZoomGesturesEnabled', (WidgetTester tester) async { + final Key key = GlobalKey(); + final Completer mapIdCompleter = Completer(); + + await tester.pumpWidget(Directionality( + textDirection: TextDirection.ltr, + child: ExampleGoogleMap( + key: key, + initialCameraPosition: _kInitialCameraPosition, + zoomGesturesEnabled: false, + onMapCreated: (ExampleGoogleMapController controller) { + mapIdCompleter.complete(controller.mapId); + }, + ), + )); + + final int mapId = await mapIdCompleter.future; + final GoogleMapsInspectorPlatform inspector = + GoogleMapsInspectorPlatform.instance!; + bool zoomGesturesEnabled = + await inspector.areZoomGesturesEnabled(mapId: mapId); + expect(zoomGesturesEnabled, false); + + await tester.pumpWidget(Directionality( + textDirection: TextDirection.ltr, + child: ExampleGoogleMap( + key: key, + initialCameraPosition: _kInitialCameraPosition, + onMapCreated: (ExampleGoogleMapController controller) { + fail('OnMapCreated should get called only once.'); + }, + ), + )); + + zoomGesturesEnabled = await inspector.areZoomGesturesEnabled(mapId: mapId); + expect(zoomGesturesEnabled, true); + }); + + testWidgets('testZoomControlsEnabled', (WidgetTester tester) async { + final Key key = GlobalKey(); + final Completer mapIdCompleter = Completer(); + + await tester.pumpWidget(Directionality( + textDirection: TextDirection.ltr, + child: ExampleGoogleMap( + key: key, + initialCameraPosition: _kInitialCameraPosition, + onMapCreated: (ExampleGoogleMapController controller) { + mapIdCompleter.complete(controller.mapId); + }, + ), + )); + + final int mapId = await mapIdCompleter.future; + final GoogleMapsInspectorPlatform inspector = + GoogleMapsInspectorPlatform.instance!; + final bool zoomControlsEnabled = + await inspector.areZoomControlsEnabled(mapId: mapId); + + /// Zoom Controls functionality is not available on iOS at the moment. + expect(zoomControlsEnabled, false); + }); + + testWidgets('testRotateGesturesEnabled', (WidgetTester tester) async { + final Key key = GlobalKey(); + final Completer mapIdCompleter = Completer(); + + await tester.pumpWidget(Directionality( + textDirection: TextDirection.ltr, + child: ExampleGoogleMap( + key: key, + initialCameraPosition: _kInitialCameraPosition, + rotateGesturesEnabled: false, + onMapCreated: (ExampleGoogleMapController controller) { + mapIdCompleter.complete(controller.mapId); + }, + ), + )); + + final int mapId = await mapIdCompleter.future; + final GoogleMapsInspectorPlatform inspector = + GoogleMapsInspectorPlatform.instance!; + bool rotateGesturesEnabled = + await inspector.areRotateGesturesEnabled(mapId: mapId); + expect(rotateGesturesEnabled, false); + + await tester.pumpWidget(Directionality( + textDirection: TextDirection.ltr, + child: ExampleGoogleMap( + key: key, + initialCameraPosition: _kInitialCameraPosition, + onMapCreated: (ExampleGoogleMapController controller) { + fail('OnMapCreated should get called only once.'); + }, + ), + )); + + rotateGesturesEnabled = + await inspector.areRotateGesturesEnabled(mapId: mapId); + expect(rotateGesturesEnabled, true); + }); + + testWidgets('testTiltGesturesEnabled', (WidgetTester tester) async { + final Key key = GlobalKey(); + final Completer mapIdCompleter = Completer(); + + await tester.pumpWidget(Directionality( + textDirection: TextDirection.ltr, + child: ExampleGoogleMap( + key: key, + initialCameraPosition: _kInitialCameraPosition, + tiltGesturesEnabled: false, + onMapCreated: (ExampleGoogleMapController controller) { + mapIdCompleter.complete(controller.mapId); + }, + ), + )); + + final int mapId = await mapIdCompleter.future; + final GoogleMapsInspectorPlatform inspector = + GoogleMapsInspectorPlatform.instance!; + bool tiltGesturesEnabled = + await inspector.areTiltGesturesEnabled(mapId: mapId); + expect(tiltGesturesEnabled, false); + + await tester.pumpWidget(Directionality( + textDirection: TextDirection.ltr, + child: ExampleGoogleMap( + key: key, + initialCameraPosition: _kInitialCameraPosition, + onMapCreated: (ExampleGoogleMapController controller) { + fail('OnMapCreated should get called only once.'); + }, + ), + )); + + tiltGesturesEnabled = await inspector.areTiltGesturesEnabled(mapId: mapId); + expect(tiltGesturesEnabled, true); + }); + + testWidgets('testScrollGesturesEnabled', (WidgetTester tester) async { + final Key key = GlobalKey(); + final Completer mapIdCompleter = Completer(); + + await tester.pumpWidget(Directionality( + textDirection: TextDirection.ltr, + child: ExampleGoogleMap( + key: key, + initialCameraPosition: _kInitialCameraPosition, + scrollGesturesEnabled: false, + onMapCreated: (ExampleGoogleMapController controller) { + mapIdCompleter.complete(controller.mapId); + }, + ), + )); + + final int mapId = await mapIdCompleter.future; + final GoogleMapsInspectorPlatform inspector = + GoogleMapsInspectorPlatform.instance!; + bool scrollGesturesEnabled = + await inspector.areScrollGesturesEnabled(mapId: mapId); + expect(scrollGesturesEnabled, false); + + await tester.pumpWidget(Directionality( + textDirection: TextDirection.ltr, + child: ExampleGoogleMap( + key: key, + initialCameraPosition: _kInitialCameraPosition, + onMapCreated: (ExampleGoogleMapController controller) { + fail('OnMapCreated should get called only once.'); + }, + ), + )); + + scrollGesturesEnabled = + await inspector.areScrollGesturesEnabled(mapId: mapId); + expect(scrollGesturesEnabled, true); + }); + + testWidgets('testInitialCenterLocationAtCenter', (WidgetTester tester) async { + await tester.binding.setSurfaceSize(const Size(800, 600)); + + final Completer mapControllerCompleter = + Completer(); + final Key key = GlobalKey(); + await tester.pumpWidget( + Directionality( + textDirection: TextDirection.ltr, + child: ExampleGoogleMap( + key: key, + initialCameraPosition: _kInitialCameraPosition, + onMapCreated: (ExampleGoogleMapController controller) { + mapControllerCompleter.complete(controller); + }, + ), + ), + ); + final ExampleGoogleMapController mapController = + await mapControllerCompleter.future; + + await tester.pumpAndSettle(); + + // TODO(cyanglaz): Remove this after we added `mapRendered` callback, and `mapControllerCompleter.complete(controller)` above should happen + // in `mapRendered`. + // https://github.com/flutter/flutter/issues/54758 + await Future.delayed(const Duration(seconds: 1)); + + final ScreenCoordinate coordinate = + await mapController.getScreenCoordinate(_kInitialCameraPosition.target); + final Rect rect = tester.getRect(find.byKey(key)); + expect(coordinate.x, (rect.center.dx - rect.topLeft.dx).round()); + expect(coordinate.y, (rect.center.dy - rect.topLeft.dy).round()); + + await tester.binding.setSurfaceSize(null); + }, + // TODO(stuartmorgan): Re-enable; see https://github.com/flutter/flutter/issues/139825 + skip: true); + + testWidgets('testGetVisibleRegion', (WidgetTester tester) async { + final Key key = GlobalKey(); + final LatLngBounds zeroLatLngBounds = LatLngBounds( + southwest: const LatLng(0, 0), northeast: const LatLng(0, 0)); + + final Completer mapControllerCompleter = + Completer(); + + await tester.pumpWidget(Directionality( + textDirection: TextDirection.ltr, + child: ExampleGoogleMap( + key: key, + initialCameraPosition: _kInitialCameraPosition, + onMapCreated: (ExampleGoogleMapController controller) { + mapControllerCompleter.complete(controller); + }, + ), + )); + await tester.pumpAndSettle(); + + final ExampleGoogleMapController mapController = + await mapControllerCompleter.future; + + final LatLngBounds firstVisibleRegion = + await mapController.getVisibleRegion(); + + expect(firstVisibleRegion, isNotNull); + expect(firstVisibleRegion.southwest, isNotNull); + expect(firstVisibleRegion.northeast, isNotNull); + expect(firstVisibleRegion, isNot(zeroLatLngBounds)); + expect(firstVisibleRegion.contains(_kInitialMapCenter), isTrue); + + // Making a new `LatLngBounds` about (10, 10) distance south west to the `firstVisibleRegion`. + // The size of the `LatLngBounds` is 10 by 10. + final LatLng southWest = LatLng(firstVisibleRegion.southwest.latitude - 20, + firstVisibleRegion.southwest.longitude - 20); + final LatLng northEast = LatLng(firstVisibleRegion.southwest.latitude - 10, + firstVisibleRegion.southwest.longitude - 10); + final LatLng newCenter = LatLng( + (northEast.latitude + southWest.latitude) / 2, + (northEast.longitude + southWest.longitude) / 2, + ); + + expect(firstVisibleRegion.contains(northEast), isFalse); + expect(firstVisibleRegion.contains(southWest), isFalse); + + final LatLngBounds latLngBounds = + LatLngBounds(southwest: southWest, northeast: northEast); + + // TODO(iskakaushik): non-zero padding is needed for some device configurations + // https://github.com/flutter/flutter/issues/30575 + const double padding = 0; + await mapController + .moveCamera(CameraUpdate.newLatLngBounds(latLngBounds, padding)); + await tester.pumpAndSettle(const Duration(seconds: 3)); + + final LatLngBounds secondVisibleRegion = + await mapController.getVisibleRegion(); + + expect(secondVisibleRegion, isNotNull); + expect(secondVisibleRegion.southwest, isNotNull); + expect(secondVisibleRegion.northeast, isNotNull); + expect(secondVisibleRegion, isNot(zeroLatLngBounds)); + + expect(firstVisibleRegion, isNot(secondVisibleRegion)); + expect(secondVisibleRegion.contains(newCenter), isTrue); + }, + // TODO(stuartmorgan): Re-enable; see https://github.com/flutter/flutter/issues/139825 + skip: true); + + testWidgets('testTraffic', (WidgetTester tester) async { + final Key key = GlobalKey(); + final Completer mapIdCompleter = Completer(); + + await tester.pumpWidget(Directionality( + textDirection: TextDirection.ltr, + child: ExampleGoogleMap( + key: key, + initialCameraPosition: _kInitialCameraPosition, + trafficEnabled: true, + onMapCreated: (ExampleGoogleMapController controller) { + mapIdCompleter.complete(controller.mapId); + }, + ), + )); + + final int mapId = await mapIdCompleter.future; + final GoogleMapsInspectorPlatform inspector = + GoogleMapsInspectorPlatform.instance!; + bool isTrafficEnabled = await inspector.isTrafficEnabled(mapId: mapId); + expect(isTrafficEnabled, true); + + await tester.pumpWidget(Directionality( + textDirection: TextDirection.ltr, + child: ExampleGoogleMap( + key: key, + initialCameraPosition: _kInitialCameraPosition, + onMapCreated: (ExampleGoogleMapController controller) { + fail('OnMapCreated should get called only once.'); + }, + ), + )); + + isTrafficEnabled = await inspector.isTrafficEnabled(mapId: mapId); + expect(isTrafficEnabled, false); + }); + + testWidgets('testBuildings', (WidgetTester tester) async { + final Key key = GlobalKey(); + final Completer mapIdCompleter = Completer(); + + await tester.pumpWidget(Directionality( + textDirection: TextDirection.ltr, + child: ExampleGoogleMap( + key: key, + initialCameraPosition: _kInitialCameraPosition, + onMapCreated: (ExampleGoogleMapController controller) { + mapIdCompleter.complete(controller.mapId); + }, + ), + )); + + final int mapId = await mapIdCompleter.future; + final GoogleMapsInspectorPlatform inspector = + GoogleMapsInspectorPlatform.instance!; + final bool isBuildingsEnabled = + await inspector.areBuildingsEnabled(mapId: mapId); + expect(isBuildingsEnabled, true); + }); + + testWidgets('testMyLocationButtonToggle', (WidgetTester tester) async { + final Key key = GlobalKey(); + final Completer mapIdCompleter = Completer(); + + await tester.pumpWidget(Directionality( + textDirection: TextDirection.ltr, + child: ExampleGoogleMap( + key: key, + initialCameraPosition: _kInitialCameraPosition, + onMapCreated: (ExampleGoogleMapController controller) { + mapIdCompleter.complete(controller.mapId); + }, + ), + )); + + final int mapId = await mapIdCompleter.future; + final GoogleMapsInspectorPlatform inspector = + GoogleMapsInspectorPlatform.instance!; + bool myLocationButtonEnabled = + await inspector.isMyLocationButtonEnabled(mapId: mapId); + expect(myLocationButtonEnabled, true); + + await tester.pumpWidget(Directionality( + textDirection: TextDirection.ltr, + child: ExampleGoogleMap( + key: key, + initialCameraPosition: _kInitialCameraPosition, + myLocationButtonEnabled: false, + onMapCreated: (ExampleGoogleMapController controller) { + fail('OnMapCreated should get called only once.'); + }, + ), + )); + + myLocationButtonEnabled = + await inspector.isMyLocationButtonEnabled(mapId: mapId); + expect(myLocationButtonEnabled, false); + }); + + testWidgets('testMyLocationButton initial value false', + (WidgetTester tester) async { + final Key key = GlobalKey(); + final Completer mapIdCompleter = Completer(); + + await tester.pumpWidget(Directionality( + textDirection: TextDirection.ltr, + child: ExampleGoogleMap( + key: key, + initialCameraPosition: _kInitialCameraPosition, + myLocationButtonEnabled: false, + onMapCreated: (ExampleGoogleMapController controller) { + mapIdCompleter.complete(controller.mapId); + }, + ), + )); + + final int mapId = await mapIdCompleter.future; + final GoogleMapsInspectorPlatform inspector = + GoogleMapsInspectorPlatform.instance!; + final bool myLocationButtonEnabled = + await inspector.isMyLocationButtonEnabled(mapId: mapId); + expect(myLocationButtonEnabled, false); + }); + + testWidgets('testMyLocationButton initial value true', + (WidgetTester tester) async { + final Key key = GlobalKey(); + final Completer mapIdCompleter = Completer(); + + await tester.pumpWidget(Directionality( + textDirection: TextDirection.ltr, + child: ExampleGoogleMap( + key: key, + initialCameraPosition: _kInitialCameraPosition, + onMapCreated: (ExampleGoogleMapController controller) { + mapIdCompleter.complete(controller.mapId); + }, + ), + )); + + final int mapId = await mapIdCompleter.future; + final GoogleMapsInspectorPlatform inspector = + GoogleMapsInspectorPlatform.instance!; + final bool myLocationButtonEnabled = + await inspector.isMyLocationButtonEnabled(mapId: mapId); + expect(myLocationButtonEnabled, true); + }); + + testWidgets('testSetMapStyle valid Json String', (WidgetTester tester) async { + final Key key = GlobalKey(); + final Completer controllerCompleter = + Completer(); + + await tester.pumpWidget(Directionality( + textDirection: TextDirection.ltr, + child: ExampleGoogleMap( + key: key, + initialCameraPosition: _kInitialCameraPosition, + onMapCreated: (ExampleGoogleMapController controller) { + controllerCompleter.complete(controller); + }, + ), + )); + + final ExampleGoogleMapController controller = + await controllerCompleter.future; + const String mapStyle = + '[{"elementType":"geometry","stylers":[{"color":"#242f3e"}]}]'; + await GoogleMapsFlutterPlatform.instance + .setMapStyle(mapStyle, mapId: controller.mapId); + }); + + testWidgets('testSetMapStyle invalid Json String', + (WidgetTester tester) async { + final Key key = GlobalKey(); + final Completer controllerCompleter = + Completer(); + + await tester.pumpWidget(Directionality( + textDirection: TextDirection.ltr, + child: ExampleGoogleMap( + key: key, + initialCameraPosition: _kInitialCameraPosition, + onMapCreated: (ExampleGoogleMapController controller) { + controllerCompleter.complete(controller); + }, + ), + )); + + final ExampleGoogleMapController controller = + await controllerCompleter.future; + + try { + await GoogleMapsFlutterPlatform.instance + .setMapStyle('invalid_value', mapId: controller.mapId); + fail('expected MapStyleException'); + } on MapStyleException catch (e) { + expect(e.cause, isNotNull); + expect(await controller.getStyleError(), isNotNull); + } + }); + + testWidgets('testSetMapStyle null string', (WidgetTester tester) async { + final Key key = GlobalKey(); + final Completer controllerCompleter = + Completer(); + + await tester.pumpWidget(Directionality( + textDirection: TextDirection.ltr, + child: ExampleGoogleMap( + key: key, + initialCameraPosition: _kInitialCameraPosition, + onMapCreated: (ExampleGoogleMapController controller) { + controllerCompleter.complete(controller); + }, + ), + )); + + final ExampleGoogleMapController controller = + await controllerCompleter.future; + await GoogleMapsFlutterPlatform.instance + .setMapStyle(null, mapId: controller.mapId); + }); + + testWidgets('testGetLatLng', (WidgetTester tester) async { + final Key key = GlobalKey(); + final Completer controllerCompleter = + Completer(); + + await tester.pumpWidget(Directionality( + textDirection: TextDirection.ltr, + child: ExampleGoogleMap( + key: key, + initialCameraPosition: _kInitialCameraPosition, + onMapCreated: (ExampleGoogleMapController controller) { + controllerCompleter.complete(controller); + }, + ), + )); + + final ExampleGoogleMapController controller = + await controllerCompleter.future; + + await tester.pumpAndSettle(); + // TODO(cyanglaz): Remove this after we added `mapRendered` callback, and `mapControllerCompleter.complete(controller)` above should happen + // in `mapRendered`. + // https://github.com/flutter/flutter/issues/54758 + await Future.delayed(const Duration(seconds: 1)); + + final LatLngBounds visibleRegion = await controller.getVisibleRegion(); + final LatLng topLeft = + await controller.getLatLng(const ScreenCoordinate(x: 0, y: 0)); + final LatLng northWest = LatLng( + visibleRegion.northeast.latitude, + visibleRegion.southwest.longitude, + ); + + expect(topLeft, northWest); + }); + + testWidgets('testGetZoomLevel', (WidgetTester tester) async { + final Key key = GlobalKey(); + final Completer controllerCompleter = + Completer(); + + await tester.pumpWidget(Directionality( + textDirection: TextDirection.ltr, + child: ExampleGoogleMap( + key: key, + initialCameraPosition: _kInitialCameraPosition, + onMapCreated: (ExampleGoogleMapController controller) { + controllerCompleter.complete(controller); + }, + ), + )); + + final ExampleGoogleMapController controller = + await controllerCompleter.future; + + await tester.pumpAndSettle(); + // TODO(cyanglaz): Remove this after we added `mapRendered` callback, and `mapControllerCompleter.complete(controller)` above should happen + // in `mapRendered`. + // https://github.com/flutter/flutter/issues/54758 + await Future.delayed(const Duration(seconds: 1)); + + double zoom = await controller.getZoomLevel(); + expect(zoom, _kInitialZoomLevel); + + await controller.moveCamera(CameraUpdate.zoomTo(7)); + await tester.pumpAndSettle(); + zoom = await controller.getZoomLevel(); + expect(zoom, equals(7)); + }, + // TODO(stuartmorgan): Re-enable; see https://github.com/flutter/flutter/issues/139825 + skip: true); + + testWidgets('testScreenCoordinate', (WidgetTester tester) async { + final Key key = GlobalKey(); + final Completer controllerCompleter = + Completer(); + + await tester.pumpWidget(Directionality( + textDirection: TextDirection.ltr, + child: ExampleGoogleMap( + key: key, + initialCameraPosition: _kInitialCameraPosition, + onMapCreated: (ExampleGoogleMapController controller) { + controllerCompleter.complete(controller); + }, + ), + )); + final ExampleGoogleMapController controller = + await controllerCompleter.future; + + await tester.pumpAndSettle(); + // TODO(cyanglaz): Remove this after we added `mapRendered` callback, and `mapControllerCompleter.complete(controller)` above should happen + // in `mapRendered`. + // https://github.com/flutter/flutter/issues/54758 + await Future.delayed(const Duration(seconds: 1)); + + final LatLngBounds visibleRegion = await controller.getVisibleRegion(); + final LatLng northWest = LatLng( + visibleRegion.northeast.latitude, + visibleRegion.southwest.longitude, + ); + final ScreenCoordinate topLeft = + await controller.getScreenCoordinate(northWest); + expect(topLeft, const ScreenCoordinate(x: 0, y: 0)); + }, + // TODO(stuartmorgan): Re-enable; see https://github.com/flutter/flutter/issues/139825 + skip: true); + + testWidgets('testResizeWidget', (WidgetTester tester) async { + final Completer controllerCompleter = + Completer(); + final ExampleGoogleMap map = ExampleGoogleMap( + initialCameraPosition: _kInitialCameraPosition, + onMapCreated: (ExampleGoogleMapController controller) async { + controllerCompleter.complete(controller); + }, + ); + await tester.pumpWidget(Directionality( + textDirection: TextDirection.ltr, + child: MaterialApp( + home: Scaffold( + body: SizedBox(height: 100, width: 100, child: map))))); + final ExampleGoogleMapController controller = + await controllerCompleter.future; + + await tester.pumpWidget(Directionality( + textDirection: TextDirection.ltr, + child: MaterialApp( + home: Scaffold( + body: SizedBox(height: 400, width: 400, child: map))))); + + await tester.pumpAndSettle(); + // TODO(cyanglaz): Remove this after we added `mapRendered` callback, and `mapControllerCompleter.complete(controller)` above should happen + // in `mapRendered`. + // https://github.com/flutter/flutter/issues/54758 + await Future.delayed(const Duration(seconds: 1)); + + // Simple call to make sure that the app hasn't crashed. + final LatLngBounds bounds1 = await controller.getVisibleRegion(); + final LatLngBounds bounds2 = await controller.getVisibleRegion(); + expect(bounds1, bounds2); + }); + + testWidgets('testToggleInfoWindow', (WidgetTester tester) async { + const Marker marker = Marker( + markerId: MarkerId('marker'), + infoWindow: InfoWindow(title: 'InfoWindow')); + final Set markers = {marker}; + + final Completer controllerCompleter = + Completer(); + + await tester.pumpWidget(Directionality( + textDirection: TextDirection.ltr, + child: ExampleGoogleMap( + initialCameraPosition: const CameraPosition(target: LatLng(10.0, 15.0)), + markers: markers, + onMapCreated: (ExampleGoogleMapController googleMapController) { + controllerCompleter.complete(googleMapController); + }, + ), + )); + + final ExampleGoogleMapController controller = + await controllerCompleter.future; + + bool iwVisibleStatus = + await controller.isMarkerInfoWindowShown(marker.markerId); + expect(iwVisibleStatus, false); + + await controller.showMarkerInfoWindow(marker.markerId); + iwVisibleStatus = await controller.isMarkerInfoWindowShown(marker.markerId); + expect(iwVisibleStatus, true); + + await controller.hideMarkerInfoWindow(marker.markerId); + iwVisibleStatus = await controller.isMarkerInfoWindowShown(marker.markerId); + expect(iwVisibleStatus, false); + }); + + testWidgets('testTakeSnapshot', (WidgetTester tester) async { + final Completer controllerCompleter = + Completer(); + + await tester.pumpWidget( + Directionality( + textDirection: TextDirection.ltr, + child: ExampleGoogleMap( + initialCameraPosition: _kInitialCameraPosition, + onMapCreated: (ExampleGoogleMapController controller) { + controllerCompleter.complete(controller); + }, + ), + ), + ); + + await tester.pumpAndSettle(const Duration(seconds: 3)); + + final ExampleGoogleMapController controller = + await controllerCompleter.future; + final Uint8List? bytes = await controller.takeSnapshot(); + expect(bytes?.isNotEmpty, true); + }, + // TODO(stuartmorgan): Re-enable; see https://github.com/flutter/flutter/issues/139825 + skip: true); + + testWidgets( + 'set tileOverlay correctly', + (WidgetTester tester) async { + final Completer mapIdCompleter = Completer(); + final TileOverlay tileOverlay1 = TileOverlay( + tileOverlayId: const TileOverlayId('tile_overlay_1'), + tileProvider: _DebugTileProvider(), + zIndex: 2, + transparency: 0.2, + ); + + final TileOverlay tileOverlay2 = TileOverlay( + tileOverlayId: const TileOverlayId('tile_overlay_2'), + tileProvider: _DebugTileProvider(), + zIndex: 1, + visible: false, + transparency: 0.3, + fadeIn: false, + ); + await tester.pumpWidget( + Directionality( + textDirection: TextDirection.ltr, + child: ExampleGoogleMap( + initialCameraPosition: _kInitialCameraPosition, + tileOverlays: {tileOverlay1, tileOverlay2}, + onMapCreated: (ExampleGoogleMapController controller) { + mapIdCompleter.complete(controller.mapId); + }, + ), + ), + ); + await tester.pumpAndSettle(const Duration(seconds: 3)); + + final int mapId = await mapIdCompleter.future; + final GoogleMapsInspectorPlatform inspector = + GoogleMapsInspectorPlatform.instance!; + + final TileOverlay tileOverlayInfo1 = (await inspector + .getTileOverlayInfo(tileOverlay1.mapsId, mapId: mapId))!; + final TileOverlay tileOverlayInfo2 = (await inspector + .getTileOverlayInfo(tileOverlay2.mapsId, mapId: mapId))!; + + expect(tileOverlayInfo1.visible, isTrue); + expect(tileOverlayInfo1.fadeIn, isTrue); + expect( + tileOverlayInfo1.transparency, moreOrLessEquals(0.2, epsilon: 0.001)); + expect(tileOverlayInfo1.zIndex, 2); + + expect(tileOverlayInfo2.visible, isFalse); + expect(tileOverlayInfo2.fadeIn, isFalse); + expect( + tileOverlayInfo2.transparency, moreOrLessEquals(0.3, epsilon: 0.001)); + expect(tileOverlayInfo2.zIndex, 1); + }, + ); + + testWidgets( + 'update tileOverlays correctly', + (WidgetTester tester) async { + final Completer mapIdCompleter = Completer(); + final Key key = GlobalKey(); + final TileOverlay tileOverlay1 = TileOverlay( + tileOverlayId: const TileOverlayId('tile_overlay_1'), + tileProvider: _DebugTileProvider(), + zIndex: 2, + transparency: 0.2, + ); + + final TileOverlay tileOverlay2 = TileOverlay( + tileOverlayId: const TileOverlayId('tile_overlay_2'), + tileProvider: _DebugTileProvider(), + zIndex: 3, + transparency: 0.5, + ); + await tester.pumpWidget( + Directionality( + textDirection: TextDirection.ltr, + child: ExampleGoogleMap( + key: key, + initialCameraPosition: _kInitialCameraPosition, + tileOverlays: {tileOverlay1, tileOverlay2}, + onMapCreated: (ExampleGoogleMapController controller) { + mapIdCompleter.complete(controller.mapId); + }, + ), + ), + ); + + final int mapId = await mapIdCompleter.future; + final GoogleMapsInspectorPlatform inspector = + GoogleMapsInspectorPlatform.instance!; + + final TileOverlay tileOverlay1New = TileOverlay( + tileOverlayId: const TileOverlayId('tile_overlay_1'), + tileProvider: _DebugTileProvider(), + zIndex: 1, + visible: false, + transparency: 0.3, + fadeIn: false, + ); + + await tester.pumpWidget( + Directionality( + textDirection: TextDirection.ltr, + child: ExampleGoogleMap( + key: key, + initialCameraPosition: _kInitialCameraPosition, + tileOverlays: {tileOverlay1New}, + onMapCreated: (ExampleGoogleMapController controller) { + fail('update: OnMapCreated should get called only once.'); + }, + ), + ), + ); + + await tester.pumpAndSettle(const Duration(seconds: 3)); + + final TileOverlay tileOverlayInfo1 = (await inspector + .getTileOverlayInfo(tileOverlay1.mapsId, mapId: mapId))!; + final TileOverlay? tileOverlayInfo2 = + await inspector.getTileOverlayInfo(tileOverlay2.mapsId, mapId: mapId); + + expect(tileOverlayInfo1.visible, isFalse); + expect(tileOverlayInfo1.fadeIn, isFalse); + expect( + tileOverlayInfo1.transparency, moreOrLessEquals(0.3, epsilon: 0.001)); + expect(tileOverlayInfo1.zIndex, 1); + + expect(tileOverlayInfo2, isNull); + }, + ); + + testWidgets( + 'remove tileOverlays correctly', + (WidgetTester tester) async { + final Completer mapIdCompleter = Completer(); + final Key key = GlobalKey(); + final TileOverlay tileOverlay1 = TileOverlay( + tileOverlayId: const TileOverlayId('tile_overlay_1'), + tileProvider: _DebugTileProvider(), + zIndex: 2, + transparency: 0.2, + ); + + await tester.pumpWidget( + Directionality( + textDirection: TextDirection.ltr, + child: ExampleGoogleMap( + key: key, + initialCameraPosition: _kInitialCameraPosition, + tileOverlays: {tileOverlay1}, + onMapCreated: (ExampleGoogleMapController controller) { + mapIdCompleter.complete(controller.mapId); + }, + ), + ), + ); + + final int mapId = await mapIdCompleter.future; + final GoogleMapsInspectorPlatform inspector = + GoogleMapsInspectorPlatform.instance!; + + await tester.pumpWidget( + Directionality( + textDirection: TextDirection.ltr, + child: ExampleGoogleMap( + key: key, + initialCameraPosition: _kInitialCameraPosition, + onMapCreated: (ExampleGoogleMapController controller) { + fail('OnMapCreated should get called only once.'); + }, + ), + ), + ); + + await tester.pumpAndSettle(const Duration(seconds: 3)); + final TileOverlay? tileOverlayInfo1 = + await inspector.getTileOverlayInfo(tileOverlay1.mapsId, mapId: mapId); + + expect(tileOverlayInfo1, isNull); + }, + ); + + testWidgets('testSetStyleMapId', (WidgetTester tester) async { + final Key key = GlobalKey(); + + await tester.pumpWidget(Directionality( + textDirection: TextDirection.ltr, + child: ExampleGoogleMap( + key: key, + initialCameraPosition: _kInitialCameraPosition, + cloudMapId: _kCloudMapId, + ), + )); + }); + + testWidgets('getStyleError reports last error', (WidgetTester tester) async { + final Key key = GlobalKey(); + final Completer controllerCompleter = + Completer(); + + await tester.pumpWidget(Directionality( + textDirection: TextDirection.ltr, + child: ExampleGoogleMap( + key: key, + initialCameraPosition: _kInitialCameraPosition, + style: '[[[this is an invalid style', + onMapCreated: (ExampleGoogleMapController controller) { + controllerCompleter.complete(controller); + }, + ), + )); + + final ExampleGoogleMapController controller = + await controllerCompleter.future; + final String? error = await controller.getStyleError(); + expect(error, isNotNull); + }); + + testWidgets('getStyleError returns null for a valid style', + (WidgetTester tester) async { + final Key key = GlobalKey(); + final Completer controllerCompleter = + Completer(); + + await tester.pumpWidget(Directionality( + textDirection: TextDirection.ltr, + child: ExampleGoogleMap( + key: key, + initialCameraPosition: _kInitialCameraPosition, + // An empty array is the simplest valid style. + style: '[]', + onMapCreated: (ExampleGoogleMapController controller) { + controllerCompleter.complete(controller); + }, + ), + )); + + final ExampleGoogleMapController controller = + await controllerCompleter.future; + final String? error = await controller.getStyleError(); + expect(error, isNull); + }); + + testWidgets('markerWithAssetMapBitmap', (WidgetTester tester) async { + final Set markers = { + Marker( + markerId: const MarkerId('1'), + icon: AssetMapBitmap( + 'assets/red_square.png', + imagePixelRatio: 1.0, + )), + }; + await tester.pumpWidget(Directionality( + textDirection: TextDirection.ltr, + child: ExampleGoogleMap( + initialCameraPosition: const CameraPosition(target: LatLng(10.0, 15.0)), + markers: markers, + ), + )); + + await tester.pumpAndSettle(); + }); + + testWidgets('markerWithAssetMapBitmapCreate', (WidgetTester tester) async { + final ImageConfiguration imageConfiguration = ImageConfiguration( + devicePixelRatio: tester.view.devicePixelRatio, + ); + final Set markers = { + Marker( + markerId: const MarkerId('1'), + icon: await AssetMapBitmap.create( + imageConfiguration, + 'assets/red_square.png', + )), + }; + await tester.pumpWidget(Directionality( + textDirection: TextDirection.ltr, + child: ExampleGoogleMap( + initialCameraPosition: const CameraPosition(target: LatLng(10.0, 15.0)), + markers: markers, + ), + )); + + await tester.pumpAndSettle(); + }); + + testWidgets('markerWithBytesMapBitmap', (WidgetTester tester) async { + final Uint8List bytes = const Base64Decoder().convert(iconImageBase64); + final Set markers = { + Marker( + markerId: const MarkerId('1'), + icon: BytesMapBitmap( + bytes, + imagePixelRatio: tester.view.devicePixelRatio, + ), + ), + }; + + await tester.pumpWidget(Directionality( + textDirection: TextDirection.ltr, + child: ExampleGoogleMap( + initialCameraPosition: const CameraPosition(target: LatLng(10.0, 15.0)), + markers: markers, + ), + )); + + await tester.pumpAndSettle(); + }); + + testWidgets('markerWithLegacyAsset', (WidgetTester tester) async { + //tester.view.devicePixelRatio = 2.0; + const ImageConfiguration imageConfiguration = ImageConfiguration( + devicePixelRatio: 2.0, + size: Size(100, 100), + ); + final Set markers = { + Marker( + markerId: const MarkerId('1'), + icon: await BitmapDescriptor.fromAssetImage( + imageConfiguration, + 'assets/red_square.png', + )), + }; + final Completer controllerCompleter = + Completer(); + await tester.pumpWidget(Directionality( + textDirection: TextDirection.ltr, + child: ExampleGoogleMap( + initialCameraPosition: const CameraPosition(target: LatLng(10.0, 15.0)), + markers: markers, + onMapCreated: (ExampleGoogleMapController controller) => + controllerCompleter.complete(controller), + ), + )); + + await controllerCompleter.future; + }); + + testWidgets('markerWithLegacyBytes', (WidgetTester tester) async { + tester.view.devicePixelRatio = 2.0; + final Uint8List bytes = const Base64Decoder().convert(iconImageBase64); + final BitmapDescriptor icon = BitmapDescriptor.fromBytes( + bytes, + ); + + final Set markers = { + Marker(markerId: const MarkerId('1'), icon: icon), + }; + final Completer controllerCompleter = + Completer(); + await tester.pumpWidget(Directionality( + textDirection: TextDirection.ltr, + child: ExampleGoogleMap( + initialCameraPosition: const CameraPosition(target: LatLng(10.0, 15.0)), + markers: markers, + onMapCreated: (ExampleGoogleMapController controller) => + controllerCompleter.complete(controller), + ), + )); + await controllerCompleter.future; + }); +} + +class _DebugTileProvider implements TileProvider { + _DebugTileProvider() { + boxPaint.isAntiAlias = true; + boxPaint.color = Colors.blue; + boxPaint.strokeWidth = 2.0; + boxPaint.style = PaintingStyle.stroke; + } + + static const int width = 100; + static const int height = 100; + static final Paint boxPaint = Paint(); + static const TextStyle textStyle = TextStyle( + color: Colors.red, + fontSize: 20, + ); + + @override + Future getTile(int x, int y, int? zoom) async { + final ui.PictureRecorder recorder = ui.PictureRecorder(); + final Canvas canvas = Canvas(recorder); + final TextSpan textSpan = TextSpan( + text: '$x,$y', + style: textStyle, + ); + final TextPainter textPainter = TextPainter( + text: textSpan, + textDirection: TextDirection.ltr, + ); + textPainter.layout( + maxWidth: width.toDouble(), + ); + textPainter.paint(canvas, Offset.zero); + canvas.drawRect( + Rect.fromLTRB(0, 0, width.toDouble(), width.toDouble()), boxPaint); + final ui.Picture picture = recorder.endRecording(); + final Uint8List byteData = await picture + .toImage(width, height) + .then((ui.Image image) => + image.toByteData(format: ui.ImageByteFormat.png)) + .then((ByteData? byteData) => byteData!.buffer.asUint8List()); + return Tile(width, height, byteData); + } +} diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/integration_test/resources/icon_image.png b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/integration_test/resources/icon_image.png new file mode 100644 index 0000000000000000000000000000000000000000..920b93f74d7875578cfddd9fb3a86ffc91cc66aa GIT binary patch literal 1257 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|T2doC(|mmy zw18|523AHP24;{FAY@>aVqgWc85q16rQz%#Mh&PMCI*J~Oa>OHnkXO*0v4nJa0`PlBg3pY5xV%QuQiw3qZOUY$~jP%-qzHM1_jnoV;SI3R@+x3M(KRB&@Hb09I0xZL1XF8=&Bv zUzDm~s%N5Spk&9TprBw=l#*r@P?Wt5Z@Sn2DRmzV368|&p4rRy77T3YHG z80i}s=>k>g7FXt#Bv$C=6)QswftllyTAW;zSx}OhpQivaH!&%{w8U0P31kr*K-^i9 znTD__uNdkrpa=CqGWv#k2KsQbfm&@qqE`MznW;dVLFU^T+JIG}h(YbK(Fa+MGhS)(5hysGVj@1S=_(gPCCO{ zqhwks#Vc``|8 z#o#O*d;N2|BC{jvU{z}(n^^Vap!a1%`y(*n{sOkJ|#X3oe;O!Zo?Dnhr)@GQ`z`?mdD=yHSxr< zDy_rs-x{jCabub6U?S+*S@!Va>4+T*Hmzz(*!gva0^=QR?pv-qbGCN6d|Si4{*vsJ zlH0zk1sd5rv=;3+XYfL0!@WaC`Ahb=eYxm+=guaBQ~enqLO(hNXMfPrI^{pDhK z-4_e9Y*sb;Jj~0Qs$sV`^@y=`QNlJK=FPXKOL(O1`}w`Gn*UDUbd&Ixz5e<2va`xH z41-N}zw;G7BCl8SdS-H5ozdgaGryVtGld%!O3p1V7HRwR?9co=RqwyAbPax;#ec&s zvsY)SyxMWE30Fc-y!yt-7}jeScd5ucNzCQ_c1QOYYo)m6PP)2@Gs?hW+Rx4&FMFT6 zT8Ccju)dun6cb3O7sF#-G(!!nzha!-kf?C|8-&R&#t@} QJ5YZ2boFyt=akR{0O*p@82|tP literal 0 HcmV?d00001 diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/integration_test/resources/icon_image_base64.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/integration_test/resources/icon_image_base64.dart new file mode 100644 index 00000000000..1bfc791ca38 --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/integration_test/resources/icon_image_base64.dart @@ -0,0 +1,49 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/// This constant holds the base64-encoded data of a 16x16 PNG image of the +/// Flutter logo. +/// +/// See `icon_image.png` source in the same directory. +/// +/// To create or update this image, follow these steps: +/// 1. Create or update a 16x16 PNG image. +/// 2. Convert the image to a base64 string using a script below. +/// 3. Replace the existing base64 string below with the new one. +/// +/// Example of converting an image to base64 in Dart: +/// ```dart +/// import 'dart:convert'; +/// import 'dart:io'; +/// +/// void main() async { +/// final bytes = await File('icon_image.png').readAsBytes(); +/// final base64String = base64Encode(bytes); +/// print(base64String); +/// } +/// ``` +const String iconImageBase64 = + 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAIRlWElmTU' + '0AKgAAAAgABQESAAMAAAABAAEAAAEaAAUAAAABAAAASgEbAAUAAAABAAAAUgEoAAMAAAABAAIA' + 'AIdpAAQAAAABAAAAWgAAAAAAAABIAAAAAQAAAEgAAAABAAOgAQADAAAAAQABAACgAgAEAAAAAQ' + 'AAABCgAwAEAAAAAQAAABAAAAAAx28c8QAAAAlwSFlzAAALEwAACxMBAJqcGAAAAVlpVFh0WE1M' + 'OmNvbS5hZG9iZS54bXAAAAAAADx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIH' + 'g6eG1wdGs9IlhNUCBDb3JlIDUuNC4wIj4KICAgPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8v' + 'd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICAgICAgPHJkZjpEZXNjcm' + 'lwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFk' + 'b2JlLmNvbS90aWZmLzEuMC8iPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk' + '9yaWVudGF0aW9uPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6' + 'eG1wbWV0YT4KTMInWQAAAplJREFUOBF1k01ME1EQx2fe7tIPoGgTE6AJgQQSPaiH9oAtkFbsgX' + 'jygFcT0XjSkxcTDxtPJh6MR28ePMHBBA8cNLSIony0oBhEMVETP058tE132+7uG3cW24DAXN57' + '2fn9/zPz3iIcEdEl0nIxtNLr1IlVeoMadkubKmoL+u2SzAV8IjV5Ekt4GN+A8+VOUPwLarOI2G' + 'Vpqq0i4JQorwQxPtWHVZ1IKP8LNGDXGaSyqARFxDGo7MJBy4XVf3AyQ+qTHnTEXoF9cFUy3OkY' + '0oWxmWFtD5xNoc1sQ6AOn1+hCNTkkhKow8KFZV77tVs2O9dhFvBm0IA/U0RhZ7/ocEx23oUDlh' + 'h8HkNjZIN8Lb3gOU8gOp7AKJHCB2/aNZkTftHumNzzbtl2CBPZHqxw8mHhVZBeoz6w5DvhE2FZ' + 'lQYPjKdd2/qRyKZ6KsPv7TEk7EYEk0A0EUmJduHRy1i4oLKqgmC59ZggAdwrC9pFuWy1iUT2rA' + 'uv0h2UdNtNqxCBBkgqorjOMOgksN7CxQ90vEb00U3c3LIwyo9o8FXxQVNr8Coqyk+S5EPBXnjt' + 'xRmc4TegI7qWbvBkeeUbGMnTCd4nZnYeDOWIEtlC6cKK/JJepY3hZSvN33jovO6L0XFqPKqBTO' + 'FuapUoPr1lxDM7cmC2TAOz25cYSGa++feBew/cjpc0V+mNT29/HZp3KDFTNLvuTRPEHy5065lj' + 'Xn4y41XM+wP/AlcycRmdc3MUhvLm/J/ceu/3qUVT62oP2EZpjSylHybHSpDUVcjq9gEBVo0+Xt' + 'JyN2IWRO+3QUforRoKnZLVsglaMECW+YmMSj9M3SrC6Lg71CMiqWfUrJ6ywzefhnZ+G69BaKdB' + 'WhXQAn6wzDUpfUPw7MrmX/WhbfmKblw+AAAAAElFTkSuQmCC'; diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Flutter/AppFrameworkInfo.plist b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Flutter/AppFrameworkInfo.plist new file mode 100644 index 00000000000..b3aaa733dfb --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Flutter/AppFrameworkInfo.plist @@ -0,0 +1,30 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + App + CFBundleIdentifier + io.flutter.flutter.app + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + App + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + UIRequiredDeviceCapabilities + + arm64 + + MinimumOSVersion + 12.0 + + diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Flutter/Debug.xcconfig b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Flutter/Debug.xcconfig new file mode 100644 index 00000000000..e8efba11468 --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Flutter/Debug.xcconfig @@ -0,0 +1,2 @@ +#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" +#include "Generated.xcconfig" diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Flutter/Release.xcconfig b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Flutter/Release.xcconfig new file mode 100644 index 00000000000..399e9340e6f --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Flutter/Release.xcconfig @@ -0,0 +1,2 @@ +#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" +#include "Generated.xcconfig" diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Podfile b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Podfile new file mode 100644 index 00000000000..a5cfb3f7bfb --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Podfile @@ -0,0 +1,43 @@ +# Uncomment this line to define a global platform for your project +platform :ios, '14.0' + +# CocoaPods analytics sends network stats synchronously affecting flutter build latency. +ENV['COCOAPODS_DISABLE_STATS'] = 'true' + +project 'Runner', { + 'Debug' => :debug, + 'Profile' => :release, + 'Release' => :release, +} + +def flutter_root + generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) + unless File.exist?(generated_xcode_build_settings_path) + raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first" + end + + File.foreach(generated_xcode_build_settings_path) do |line| + matches = line.match(/FLUTTER_ROOT\=(.*)/) + return matches[1].strip if matches + end + raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get" +end + +require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) + +flutter_ios_podfile_setup + +target 'Runner' do + flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) + target 'RunnerTests' do + inherit! :search_paths + + pod 'OCMock', '~> 3.9.1' + end +end + +post_install do |installer| + installer.pods_project.targets.each do |target| + flutter_additional_ios_build_settings(target) + end +end diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner.xcodeproj/project.pbxproj b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner.xcodeproj/project.pbxproj new file mode 100644 index 00000000000..10545d750ed --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,797 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 54; + objects = { + +/* Begin PBXBuildFile section */ + 0DD7B6C32B744EEF00E857FD /* FLTTileProviderControllerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 0DD7B6C22B744EEF00E857FD /* FLTTileProviderControllerTests.m */; }; + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 4510D964F3B1259FEDD3ABA6 /* libPods-Runner.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 7755F8F4BABC3D6A0BD4048B /* libPods-Runner.a */; }; + 478116522BEF8F47002F593E /* GoogleMapsPolylinesControllerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 478116512BEF8F47002F593E /* GoogleMapsPolylinesControllerTests.m */; }; + 6851F3562835BC180032B7C8 /* FLTGoogleMapJSONConversionsConversionTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 6851F3552835BC180032B7C8 /* FLTGoogleMapJSONConversionsConversionTests.m */; }; + 521AB0032B876A76005F460D /* ExtractIconFromDataTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 521AB0022B876A76005F460D /* ExtractIconFromDataTests.m */; }; + 68E4726A2836FF0C00BDDDAC /* MapKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 68E472692836FF0C00BDDDAC /* MapKit.framework */; }; + 978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */; }; + 97C146F31CF9000F007C117D /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 97C146F21CF9000F007C117D /* main.m */; }; + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; + 982F2A6C27BADE17003C81F4 /* PartiallyMockedMapView.m in Sources */ = {isa = PBXBuildFile; fileRef = 982F2A6B27BADE17003C81F4 /* PartiallyMockedMapView.m */; }; + F269303B2BB389BF00BF17C4 /* assets in Resources */ = {isa = PBXBuildFile; fileRef = F269303A2BB389BF00BF17C4 /* assets */; }; + F7151F13265D7ED70028CB91 /* GoogleMapsTests.m in Sources */ = {isa = PBXBuildFile; fileRef = F7151F12265D7ED70028CB91 /* GoogleMapsTests.m */; }; + F7151F21265D7EE50028CB91 /* GoogleMapsUITests.m in Sources */ = {isa = PBXBuildFile; fileRef = F7151F20265D7EE50028CB91 /* GoogleMapsUITests.m */; }; + FC8F35FC8CD533B128950487 /* libPods-RunnerTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F267F68029D1A4E2E4C572A7 /* libPods-RunnerTests.a */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + F7151F15265D7ED70028CB91 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 97C146E61CF9000F007C117D /* Project object */; + proxyType = 1; + remoteGlobalIDString = 97C146ED1CF9000F007C117D; + remoteInfo = Runner; + }; + F7151F23265D7EE50028CB91 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 97C146E61CF9000F007C117D /* Project object */; + proxyType = 1; + remoteGlobalIDString = 97C146ED1CF9000F007C117D; + remoteInfo = Runner; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 9705A1C41CF9048500538489 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 0DD7B6C22B744EEF00E857FD /* FLTTileProviderControllerTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FLTTileProviderControllerTests.m; sourceTree = ""; }; + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 478116512BEF8F47002F593E /* GoogleMapsPolylinesControllerTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GoogleMapsPolylinesControllerTests.m; sourceTree = ""; }; + 6851F3552835BC180032B7C8 /* FLTGoogleMapJSONConversionsConversionTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLTGoogleMapJSONConversionsConversionTests.m; sourceTree = ""; }; + 521AB0022B876A76005F460D /* ExtractIconFromDataTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ExtractIconFromDataTests.m; sourceTree = ""; }; + 68E472692836FF0C00BDDDAC /* MapKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MapKit.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.0.sdk/System/iOSSupport/System/Library/Frameworks/MapKit.framework; sourceTree = DEVELOPER_DIR; }; + 733AFAB37683A9DA7512F09C /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Pods/Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + 7755F8F4BABC3D6A0BD4048B /* libPods-Runner.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Runner.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; + 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; + 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; + 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 97C146F21CF9000F007C117D /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 982F2A6A27BADE17003C81F4 /* PartiallyMockedMapView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PartiallyMockedMapView.h; sourceTree = ""; }; + 982F2A6B27BADE17003C81F4 /* PartiallyMockedMapView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PartiallyMockedMapView.m; sourceTree = ""; }; + B7AFC65E3DD5AC60D834D83D /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + E52C6A6210A56F027C582EF9 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + EA0E91726245EDC22B97E8B9 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + F267F68029D1A4E2E4C572A7 /* libPods-RunnerTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-RunnerTests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + F269303A2BB389BF00BF17C4 /* assets */ = {isa = PBXFileReference; lastKnownFileType = folder; path = assets; sourceTree = ""; }; + F7151F10265D7ED70028CB91 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + F7151F12265D7ED70028CB91 /* GoogleMapsTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GoogleMapsTests.m; sourceTree = ""; }; + F7151F14265D7ED70028CB91 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + F7151F1E265D7EE50028CB91 /* RunnerUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + F7151F20265D7EE50028CB91 /* GoogleMapsUITests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GoogleMapsUITests.m; sourceTree = ""; }; + F7151F22265D7EE50028CB91 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 97C146EB1CF9000F007C117D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 4510D964F3B1259FEDD3ABA6 /* libPods-Runner.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F7151F0D265D7ED70028CB91 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 68E4726A2836FF0C00BDDDAC /* MapKit.framework in Frameworks */, + FC8F35FC8CD533B128950487 /* libPods-RunnerTests.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F7151F1B265D7EE50028CB91 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 1E7CF0857EFC88FC263CF3B2 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 68E472692836FF0C00BDDDAC /* MapKit.framework */, + 7755F8F4BABC3D6A0BD4048B /* libPods-Runner.a */, + F267F68029D1A4E2E4C572A7 /* libPods-RunnerTests.a */, + ); + name = Frameworks; + sourceTree = ""; + }; + 9740EEB11CF90186004384FC /* Flutter */ = { + isa = PBXGroup; + children = ( + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 9740EEB31CF90195004384FC /* Generated.xcconfig */, + ); + name = Flutter; + sourceTree = ""; + }; + 97C146E51CF9000F007C117D = { + isa = PBXGroup; + children = ( + 9740EEB11CF90186004384FC /* Flutter */, + 97C146F01CF9000F007C117D /* Runner */, + F7151F11265D7ED70028CB91 /* RunnerTests */, + F7151F1F265D7EE50028CB91 /* RunnerUITests */, + 97C146EF1CF9000F007C117D /* Products */, + A189CFE5474BF8A07908B2E0 /* Pods */, + 1E7CF0857EFC88FC263CF3B2 /* Frameworks */, + ); + sourceTree = ""; + }; + 97C146EF1CF9000F007C117D /* Products */ = { + isa = PBXGroup; + children = ( + 97C146EE1CF9000F007C117D /* Runner.app */, + F7151F10265D7ED70028CB91 /* RunnerTests.xctest */, + F7151F1E265D7EE50028CB91 /* RunnerUITests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 97C146F01CF9000F007C117D /* Runner */ = { + isa = PBXGroup; + children = ( + 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */, + 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */, + 97C146FA1CF9000F007C117D /* Main.storyboard */, + 97C146FD1CF9000F007C117D /* Assets.xcassets */, + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, + 97C147021CF9000F007C117D /* Info.plist */, + 97C146F11CF9000F007C117D /* Supporting Files */, + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, + ); + path = Runner; + sourceTree = ""; + }; + 97C146F11CF9000F007C117D /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 97C146F21CF9000F007C117D /* main.m */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + A189CFE5474BF8A07908B2E0 /* Pods */ = { + isa = PBXGroup; + children = ( + B7AFC65E3DD5AC60D834D83D /* Pods-Runner.debug.xcconfig */, + EA0E91726245EDC22B97E8B9 /* Pods-Runner.release.xcconfig */, + E52C6A6210A56F027C582EF9 /* Pods-RunnerTests.debug.xcconfig */, + 733AFAB37683A9DA7512F09C /* Pods-RunnerTests.release.xcconfig */, + ); + name = Pods; + sourceTree = ""; + }; + F7151F11265D7ED70028CB91 /* RunnerTests */ = { + isa = PBXGroup; + children = ( + F269303A2BB389BF00BF17C4 /* assets */, + 6851F3552835BC180032B7C8 /* FLTGoogleMapJSONConversionsConversionTests.m */, + 521AB0022B876A76005F460D /* ExtractIconFromDataTests.m */, + F7151F12265D7ED70028CB91 /* GoogleMapsTests.m */, + 478116512BEF8F47002F593E /* GoogleMapsPolylinesControllerTests.m */, + 982F2A6A27BADE17003C81F4 /* PartiallyMockedMapView.h */, + 982F2A6B27BADE17003C81F4 /* PartiallyMockedMapView.m */, + F7151F14265D7ED70028CB91 /* Info.plist */, + 0DD7B6C22B744EEF00E857FD /* FLTTileProviderControllerTests.m */, + ); + path = RunnerTests; + sourceTree = ""; + }; + F7151F1F265D7EE50028CB91 /* RunnerUITests */ = { + isa = PBXGroup; + children = ( + F7151F20265D7EE50028CB91 /* GoogleMapsUITests.m */, + F7151F22265D7EE50028CB91 /* Info.plist */, + ); + path = RunnerUITests; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 97C146ED1CF9000F007C117D /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + 74BF216DF17B0C7F983459BD /* [CP] Check Pods Manifest.lock */, + 9740EEB61CF901F6004384FC /* Run Script */, + 97C146EA1CF9000F007C117D /* Sources */, + 97C146EB1CF9000F007C117D /* Frameworks */, + 97C146EC1CF9000F007C117D /* Resources */, + 9705A1C41CF9048500538489 /* Embed Frameworks */, + 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + BB6BD9A1101E970BEF85B6D2 /* [CP] Copy Pods Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Runner; + productName = Runner; + productReference = 97C146EE1CF9000F007C117D /* Runner.app */; + productType = "com.apple.product-type.application"; + }; + F7151F0F265D7ED70028CB91 /* RunnerTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = F7151F19265D7ED70028CB91 /* Build configuration list for PBXNativeTarget "RunnerTests" */; + buildPhases = ( + D067548A17DC238B80D2BD12 /* [CP] Check Pods Manifest.lock */, + F7151F0C265D7ED70028CB91 /* Sources */, + F7151F0D265D7ED70028CB91 /* Frameworks */, + F7151F0E265D7ED70028CB91 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + F7151F16265D7ED70028CB91 /* PBXTargetDependency */, + ); + name = RunnerTests; + productName = RunnerTests; + productReference = F7151F10265D7ED70028CB91 /* RunnerTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + F7151F1D265D7EE50028CB91 /* RunnerUITests */ = { + isa = PBXNativeTarget; + buildConfigurationList = F7151F25265D7EE50028CB91 /* Build configuration list for PBXNativeTarget "RunnerUITests" */; + buildPhases = ( + F7151F1A265D7EE50028CB91 /* Sources */, + F7151F1B265D7EE50028CB91 /* Frameworks */, + F7151F1C265D7EE50028CB91 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + F7151F24265D7EE50028CB91 /* PBXTargetDependency */, + ); + name = RunnerUITests; + productName = RunnerUITests; + productReference = F7151F1E265D7EE50028CB91 /* RunnerUITests.xctest */; + productType = "com.apple.product-type.bundle.ui-testing"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 97C146E61CF9000F007C117D /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 1510; + ORGANIZATIONNAME = "The Flutter Authors"; + TargetAttributes = { + 97C146ED1CF9000F007C117D = { + CreatedOnToolsVersion = 7.3.1; + }; + F7151F0F265D7ED70028CB91 = { + CreatedOnToolsVersion = 12.5; + ProvisioningStyle = Automatic; + TestTargetID = 97C146ED1CF9000F007C117D; + }; + F7151F1D265D7EE50028CB91 = { + CreatedOnToolsVersion = 12.5; + ProvisioningStyle = Automatic; + TestTargetID = 97C146ED1CF9000F007C117D; + }; + }; + }; + buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 97C146E51CF9000F007C117D; + productRefGroup = 97C146EF1CF9000F007C117D /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 97C146ED1CF9000F007C117D /* Runner */, + F7151F0F265D7ED70028CB91 /* RunnerTests */, + F7151F1D265D7EE50028CB91 /* RunnerUITests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 97C146EC1CF9000F007C117D /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F7151F0E265D7ED70028CB91 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + F269303B2BB389BF00BF17C4 /* assets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F7151F1C265D7EE50028CB91 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", + ); + name = "Thin Binary"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + }; + 74BF216DF17B0C7F983459BD /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + 9740EEB61CF901F6004384FC /* Run Script */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Run Script"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + }; + BB6BD9A1101E970BEF85B6D2 /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh", + "${PODS_CONFIGURATION_BUILD_DIR}/GoogleMaps/GoogleMapsResources.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/google_maps_flutter_ios/google_maps_flutter_ios_privacy.bundle", + ); + name = "[CP] Copy Pods Resources"; + outputPaths = ( + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GoogleMapsResources.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/google_maps_flutter_ios_privacy.bundle", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; + D067548A17DC238B80D2BD12 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 97C146EA1CF9000F007C117D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */, + 97C146F31CF9000F007C117D /* main.m in Sources */, + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F7151F0C265D7ED70028CB91 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + F7151F13265D7ED70028CB91 /* GoogleMapsTests.m in Sources */, + 6851F3562835BC180032B7C8 /* FLTGoogleMapJSONConversionsConversionTests.m in Sources */, + 982F2A6C27BADE17003C81F4 /* PartiallyMockedMapView.m in Sources */, + 478116522BEF8F47002F593E /* GoogleMapsPolylinesControllerTests.m in Sources */, + 0DD7B6C32B744EEF00E857FD /* FLTTileProviderControllerTests.m in Sources */, + 521AB0032B876A76005F460D /* ExtractIconFromDataTests.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F7151F1A265D7EE50028CB91 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + F7151F21265D7EE50028CB91 /* GoogleMapsUITests.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + F7151F16265D7ED70028CB91 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 97C146ED1CF9000F007C117D /* Runner */; + targetProxy = F7151F15265D7ED70028CB91 /* PBXContainerItemProxy */; + }; + F7151F24265D7EE50028CB91 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 97C146ED1CF9000F007C117D /* Runner */; + targetProxy = F7151F23265D7EE50028CB91 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 97C146FA1CF9000F007C117D /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C146FB1CF9000F007C117D /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C147001CF9000F007C117D /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 97C147031CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 97C147041CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 97C147061CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ENABLE_BITCODE = NO; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + PRODUCT_BUNDLE_IDENTIFIER = dev.flutter.plugins.googleMobileMapsExample; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 97C147071CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ENABLE_BITCODE = NO; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + PRODUCT_BUNDLE_IDENTIFIER = dev.flutter.plugins.googleMobileMapsExample; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; + F7151F17265D7ED70028CB91 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = E52C6A6210A56F027C582EF9 /* Pods-RunnerTests.debug.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = i386; + INFOPLIST_FILE = RunnerTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = dev.flutter.plugins.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/Runner"; + }; + name = Debug; + }; + F7151F18265D7ED70028CB91 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 733AFAB37683A9DA7512F09C /* Pods-RunnerTests.release.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = i386; + INFOPLIST_FILE = RunnerTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = dev.flutter.plugins.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/Runner"; + }; + name = Release; + }; + F7151F26265D7EE50028CB91 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + INFOPLIST_FILE = RunnerUITests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = dev.flutter.plugins.RunnerUITests; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_TARGET_NAME = Runner; + }; + name = Debug; + }; + F7151F27265D7EE50028CB91 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + INFOPLIST_FILE = RunnerUITests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = dev.flutter.plugins.RunnerUITests; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_TARGET_NAME = Runner; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147031CF9000F007C117D /* Debug */, + 97C147041CF9000F007C117D /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147061CF9000F007C117D /* Debug */, + 97C147071CF9000F007C117D /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + F7151F19265D7ED70028CB91 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + F7151F17265D7ED70028CB91 /* Debug */, + F7151F18265D7ED70028CB91 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + F7151F25265D7EE50028CB91 /* Build configuration list for PBXNativeTarget "RunnerUITests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + F7151F26265D7EE50028CB91 /* Debug */, + F7151F27265D7EE50028CB91 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 97C146E61CF9000F007C117D /* Project object */; +} diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000000..919434a6254 --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 00000000000..f8d70602adf --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,107 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner.xcworkspace/contents.xcworkspacedata b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000000..21a3cc14c74 --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000000..18d981003d6 --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner/AppDelegate.h b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner/AppDelegate.h new file mode 100644 index 00000000000..9bc6c56e34f --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner/AppDelegate.h @@ -0,0 +1,9 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import +#import + +@interface AppDelegate : FlutterAppDelegate +@end diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner/AppDelegate.m b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner/AppDelegate.m new file mode 100644 index 00000000000..55733442b4c --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner/AppDelegate.m @@ -0,0 +1,27 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "AppDelegate.h" +#import "GeneratedPluginRegistrant.h" + +@import GoogleMaps; + +@implementation AppDelegate + +- (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. + [GeneratedPluginRegistrant registerWithRegistry:self]; + + return [super application:application didFinishLaunchingWithOptions:launchOptions]; +} + +@end diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000000..d36b1fab2d9 --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,122 @@ +{ + "images" : [ + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@3x.png", + "scale" : "3x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@3x.png", + "scale" : "3x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@3x.png", + "scale" : "3x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@2x.png", + "scale" : "2x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@3x.png", + "scale" : "3x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@1x.png", + "scale" : "1x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@1x.png", + "scale" : "1x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@1x.png", + "scale" : "1x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@2x.png", + "scale" : "2x" + }, + { + "size" : "83.5x83.5", + "idiom" : "ipad", + "filename" : "Icon-App-83.5x83.5@2x.png", + "scale" : "2x" + }, + { + "size" : "1024x1024", + "idiom" : "ios-marketing", + "filename" : "Icon-App-1024x1024@1x.png", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..3d43d11e66f4de3da27ed045ca4fe38ad8b48094 GIT binary patch literal 11112 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 P-1+_A+?hGkL;m(J7kc&K literal 0 HcmV?d00001 diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..28c6bf03016f6c994b70f38d1b7346e5831b531f GIT binary patch literal 564 zcmV-40?Yl0P)Px$?ny*JR5%f>l)FnDQ543{x%ZCiu33$Wg!pQFfT_}?5Q|_VSlIbLC`dpoMXL}9 zHfd9&47Mo(7D231gb+kjFxZHS4-m~7WurTH&doVX2KI5sU4v(sJ1@T9eCIKPjsqSr z)C01LsCxk=72-vXmX}CQD#BD;Cthymh&~=f$Q8nn0J<}ZrusBy4PvRNE}+1ceuj8u z0mW5k8fmgeLnTbWHGwfKA3@PdZxhn|PypR&^p?weGftrtCbjF#+zk_5BJh7;0`#Wr zgDpM_;Ax{jO##IrT`Oz;MvfwGfV$zD#c2xckpcXC6oou4ML~ezCc2EtnsQTB4tWNg z?4bkf;hG7IMfhgNI(FV5Gs4|*GyMTIY0$B=_*mso9Ityq$m^S>15>-?0(zQ<8Qy<_TjHE33(?_M8oaM zyc;NxzRVK@DL6RJnX%U^xW0Gpg(lXp(!uK1v0YgHjs^ZXSQ|m#lV7ip7{`C_J2TxPmfw%h$|%acrYHt)Re^PB%O&&=~a zhS(%I#+V>J-vjIib^<+s%ludY7y^C(P8nmqn9fp!i+?vr`bziDE=bx`%2W#Xyrj|i z!XQ4v1%L`m{7KT7q+LZNB^h8Ha2e=`Wp65^0;J00)_^G=au=8Yo;1b`CV&@#=jIBo zjN^JNVfYSs)+kDdGe7`1&8!?MQYKS?DuHZf3iogk_%#9E|5S zWeHrmAo>P;ejX7mwq#*}W25m^ZI+{(Z8fI?4jM_fffY0nok=+88^|*_DwcW>mR#e+ zX$F_KMdb6sRz!~7KkyN0G(3XQ+;z3X%PZ4gh;n-%62U<*VUKNv(D&Q->Na@Xb&u5Q3`3DGf+a8O5x7c#7+R+EAYl@R5us)CIw z7sT@_y~Ao@uL#&^LIh&QceqiT^+lb0YbFZt_SHOtWA%mgPEKVNvVgCsXy{5+zl*X8 zCJe)Q@y>wH^>l4;h1l^Y*9%-23TSmE>q5nI@?mt%n;Sj4Qq`Z+ib)a*a^cJc%E9^J zB;4s+K@rARbcBLT5P=@r;IVnBMKvT*)ew*R;&8vu%?Z&S>s?8?)3*YawM0P4!q$Kv zMmKh3lgE~&w&v%wVzH3Oe=jeNT=n@Y6J6TdHWTjXfX~-=1A1Bw`EW8rn}MqeI34nh zexFeA?&C3B2(E?0{drE@DA2pu(A#ElY&6el60Rn|Qpn-FkfQ8M93AfWIr)drgDFEU zghdWK)^71EWCP(@(=c4kfH1Y(4iugD4fve6;nSUpLT%!)MUHs1!zJYy4y||C+SwQ! z)KM&$7_tyM`sljP2fz6&Z;jxRn{Wup8IOUx8D4uh&(=O zx-7$a;U><*5L^!%xRlw)vAbh;sdlR||& ze}8_8%)c2Fwy=F&H|LM+p{pZB5DKTx>Y?F1N%BlZkXf!}JeGuMZk~LPi7{cidvUGB zAJ4LVeNV%XO>LTrklB#^-;8nb;}6l;1oW&WS=Mz*Az!4cqqQzbOSFq`$Q%PfD7srM zpKgP-D_0XPTRX*hAqeq0TDkJ;5HB1%$3Np)99#16c{ zJImlNL(npL!W|Gr_kxl1GVmF5&^$^YherS7+~q$p zt}{a=*RiD2Ikv6o=IM1kgc7zqpaZ;OB)P!1zz*i3{U()Dq#jG)egvK}@uFLa`oyWZ zf~=MV)|yJn`M^$N%ul5);JuQvaU1r2wt(}J_Qgyy`qWQI`hEeRX0uC@c1(dQ2}=U$ tNIIaX+dr)NRWXcxoR{>fqI{SF_dm1Ylv~=3YHI)h002ovPDHLkV1g(pWS;;4 literal 0 HcmV?d00001 diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..f091b6b0bca859a3f474b03065bef75ba58a9e4c GIT binary patch literal 1588 zcmV-42Fv-0P)C1SqPt}wig>|5Crh^=oyX$BK<}M8eLU3e2hGT;=G|!_SP)7zNI6fqUMB=)y zRAZ>eDe#*r`yDAVgB_R*LB*MAc)8(b{g{9McCXW!lq7r(btRoB9!8B-#AI6JMb~YFBEvdsV)`mEQO^&#eRKx@b&x- z5lZm*!WfD8oCLzfHGz#u7sT0^VLMI1MqGxF^v+`4YYnVYgk*=kU?HsSz{v({E3lb9 z>+xILjBN)t6`=g~IBOelGQ(O990@BfXf(DRI5I$qN$0Gkz-FSc$3a+2fX$AedL4u{ z4V+5Ong(9LiGcIKW?_352sR;LtDPmPJXI{YtT=O8=76o9;*n%_m|xo!i>7$IrZ-{l z-x3`7M}qzHsPV@$v#>H-TpjDh2UE$9g6sysUREDy_R(a)>=eHw-WAyfIN z*qb!_hW>G)Tu8nSw9yn#3wFMiLcfc4pY0ek1}8(NqkBR@t4{~oC>ryc-h_ByH(Cg5 z>ao-}771+xE3um9lWAY1FeQFxowa1(!J(;Jg*wrg!=6FdRX+t_<%z&d&?|Bn){>zm zZQj(aA_HeBY&OC^jj*)N`8fa^ePOU72VpInJoI1?`ty#lvlNzs(&MZX+R%2xS~5Kh zX*|AU4QE#~SgPzOXe9>tRj>hjU@c1k5Y_mW*Jp3fI;)1&g3j|zDgC+}2Q_v%YfDax z!?umcN^n}KYQ|a$Lr+51Nf9dkkYFSjZZjkma$0KOj+;aQ&721~t7QUKx61J3(P4P1 zstI~7-wOACnWP4=8oGOwz%vNDqD8w&Q`qcNGGrbbf&0s9L0De{4{mRS?o0MU+nR_! zrvshUau0G^DeMhM_v{5BuLjb#Hh@r23lDAk8oF(C+P0rsBpv85EP>4CVMx#04MOfG z;P%vktHcXwTj~+IE(~px)3*MY77e}p#|c>TD?sMatC0Tu4iKKJ0(X8jxQY*gYtxsC z(zYC$g|@+I+kY;dg_dE>scBf&bP1Nc@Hz<3R)V`=AGkc;8CXqdi=B4l2k|g;2%#m& z*jfX^%b!A8#bI!j9-0Fi0bOXl(-c^AB9|nQaE`*)Hw+o&jS9@7&Gov#HbD~#d{twV zXd^Tr^mWLfFh$@Dr$e;PBEz4(-2q1FF0}c;~B5sA}+Q>TOoP+t>wf)V9Iy=5ruQa;z)y zI9C9*oUga6=hxw6QasLPnee@3^Rr*M{CdaL5=R41nLs(AHk_=Y+A9$2&H(B7!_pURs&8aNw7?`&Z&xY_Ye z)~D5Bog^td-^QbUtkTirdyK^mTHAOuptDflut!#^lnKqU md>ggs(5nOWAqO?umG&QVYK#ibz}*4>0000U6E9hRK9^#O7(mu>ETqrXGsduA8$)?`v2seloOCza43C{NQ$$gAOH**MCn0Q?+L7dl7qnbRdqZ8LSVp1ItDxhxD?t@5_yHg6A8yI zC*%Wgg22K|8E#!~cTNYR~@Y9KepMPrrB8cABapAFa=`H+UGhkXUZV1GnwR1*lPyZ;*K(i~2gp|@bzp8}og7e*#% zEnr|^CWdVV!-4*Y_7rFvlww2Ze+>j*!Z!pQ?2l->4q#nqRu9`ELo6RMS5=br47g_X zRw}P9a7RRYQ%2Vsd0Me{_(EggTnuN6j=-?uFS6j^u69elMypu?t>op*wBx<=Wx8?( ztpe^(fwM6jJX7M-l*k3kEpWOl_Vk3@(_w4oc}4YF4|Rt=2V^XU?#Yz`8(e?aZ@#li0n*=g^qOcVpd-Wbok=@b#Yw zqn8u9a)z>l(1kEaPYZ6hwubN6i<8QHgsu0oE) ziJ(p;Wxm>sf!K+cw>R-(^Y2_bahB+&KI9y^);#0qt}t-$C|Bo71lHi{_+lg#f%RFy z0um=e3$K3i6K{U_4K!EX?F&rExl^W|G8Z8;`5z-k}OGNZ0#WVb$WCpQu-_YsiqKP?BB# vzVHS-CTUF4Ozn5G+mq_~Qqto~ahA+K`|lyv3(-e}00000NkvXXu0mjfd`9t{ literal 0 HcmV?d00001 diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d0ef06e7edb86cdfe0d15b4b0d98334a86163658 GIT binary patch literal 1716 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 literal 0 HcmV?d00001 diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c8f9ed8f5cee1c98386d13b17e89f719e83555b2 GIT binary patch literal 1895 zcmV-t2blPYP)FQtfgmafE#=YDCq`qUBt#QpG%*H6QHY765~R=q zZ6iudfM}q!Pz#~9JgOi8QJ|DSu?1-*(kSi1K4#~5?#|rh?sS)(-JQqX*}ciXJ56_H zdw=^s_srbAdqxlvGyrgGet#6T7_|j;95sL%MtM;q86vOxKM$f#puR)Bjv9Zvz9-di zXOTSsZkM83)E9PYBXC<$6(|>lNLVBb&&6y{NByFCp%6+^ALR@NCTse_wqvNmSWI-m z!$%KlHFH2omF!>#%1l3LTZg(s7eof$7*xB)ZQ0h?ejh?Ta9fDv59+u#MokW+1t8Zb zgHv%K(u9G^Lv`lh#f3<6!JVTL3(dCpxHbnbA;kKqQyd1~^Xe0VIaYBSWm6nsr;dFj z4;G-RyL?cYgsN1{L4ZFFNa;8)Rv0fM0C(~Tkit94 zz#~A)59?QjD&pAPSEQ)p8gP|DS{ng)j=2ux)_EzzJ773GmQ_Cic%3JJhC0t2cx>|v zJcVusIB!%F90{+}8hG3QU4KNeKmK%T>mN57NnCZ^56=0?&3@!j>a>B43pi{!u z7JyDj7`6d)qVp^R=%j>UIY6f+3`+qzIc!Y_=+uN^3BYV|o+$vGo-j-Wm<10%A=(Yk^beI{t%ld@yhKjq0iNjqN4XMGgQtbKubPM$JWBz}YA65k%dm*awtC^+f;a-x4+ddbH^7iDWGg&N0n#MW{kA|=8iMUiFYvMoDY@sPC#t$55gn6ykUTPAr`a@!(;np824>2xJthS z*ZdmT`g5-`BuJs`0LVhz+D9NNa3<=6m;cQLaF?tCv8)zcRSh66*Z|vXhG@$I%U~2l z?`Q zykI#*+rQ=z6Jm=Bui-SfpDYLA=|vzGE(dYm=OC8XM&MDo7ux4UF1~0J1+i%aCUpRe zt3L_uNyQ*cE(38Uy03H%I*)*Bh=Lb^Xj3?I^Hnbeq72(EOK^Y93CNp*uAA{5Lc=ky zx=~RKa4{iTm{_>_vSCm?$Ej=i6@=m%@VvAITnigVg{&@!7CDgs908761meDK5azA} z4?=NOH|PdvabgJ&fW2{Mo$Q0CcD8Qc84%{JPYt5EiG{MdLIAeX%T=D7NIP4%Hw}p9 zg)==!2Lbp#j{u_}hMiao9=!VSyx0gHbeCS`;q&vzeq|fs`y&^X-lso(Ls@-706qmA z7u*T5PMo_w3{se1t2`zWeO^hOvTsohG_;>J0wVqVe+n)AbQCx)yh9;w+J6?NF5Lmo zecS@ieAKL8%bVd@+-KT{yI|S}O>pYckUFs;ry9Ow$CD@ztz5K-*D$^{i(_1llhSh^ zEkL$}tsQt5>QA^;QgjgIfBDmcOgi5YDyu?t6vSnbp=1+@6D& z5MJ}B8q;bRlVoxasyhcUF1+)o`&3r0colr}QJ3hcSdLu;9;td>kf@Tcn<@9sIx&=m z;AD;SCh95=&p;$r{Xz3iWCO^MX83AGJ(yH&eTXgv|0=34#-&WAmw{)U7OU9!Wz^!7 zZ%jZFi@JR;>Mhi7S>V7wQ176|FdW2m?&`qa(ScO^CFPR80HucLHOTy%5s*HR0^8)i h0WYBP*#0Ks^FNSabJA*5${_#%002ovPDHLkV1oKhTl@e3 literal 0 HcmV?d00001 diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..a6d6b8609df07bf62e5100a53a01510388bd2b22 GIT binary patch literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ literal 0 HcmV?d00001 diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..a6d6b8609df07bf62e5100a53a01510388bd2b22 GIT binary patch literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ literal 0 HcmV?d00001 diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..75b2d164a5a98e212cca15ea7bf2ab5de5108680 GIT binary patch literal 3831 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 literal 0 HcmV?d00001 diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..c4df70d39da7941ef3f6dcb7f06a192d8dcb308d GIT binary patch literal 1888 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 iW8Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md new file mode 100644 index 00000000000..89c2725b70f --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md @@ -0,0 +1,5 @@ +# Launch Screen Assets + +You can customize the launch screen with your own desired assets by replacing the image files in this directory. + +You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. \ No newline at end of file diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner/Base.lproj/LaunchScreen.storyboard b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 00000000000..f2e259c7c93 --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner/Base.lproj/Main.storyboard b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner/Base.lproj/Main.storyboard new file mode 100644 index 00000000000..f3c28516fb3 --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner/Base.lproj/Main.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner/Info.plist b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner/Info.plist new file mode 100644 index 00000000000..6783ca935f1 --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner/Info.plist @@ -0,0 +1,53 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + google_maps_flutter_example + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + LSRequiresIPhoneOS + + NSLocationWhenInUseUsageDescription + This app needs your location to test the location feature of the Google Maps plugin. + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + arm64 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + CADisableMinimumFrameDurationOnPhone + + UIApplicationSupportsIndirectInputEvents + + + diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner/main.m b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner/main.m new file mode 100644 index 00000000000..f143297b30d --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner/main.m @@ -0,0 +1,13 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import +#import +#import "AppDelegate.h" + +int main(int argc, char *argv[]) { + @autoreleasepool { + return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); + } +} diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/RunnerTests/ExtractIconFromDataTests.m b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/RunnerTests/ExtractIconFromDataTests.m new file mode 100644 index 00000000000..c3d6a363e0c --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/RunnerTests/ExtractIconFromDataTests.m @@ -0,0 +1,371 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +@import google_maps_flutter_ios; +@import google_maps_flutter_ios.Test; +@import XCTest; +#import +#import + +@interface ExtractIconFromDataTests : XCTestCase +- (UIImage *)createOnePixelImage; +@end + +@implementation ExtractIconFromDataTests + +- (void)testExtractIconFromDataAssetAuto { + FLTGoogleMapMarkerController *instance = [[FLTGoogleMapMarkerController alloc] init]; + NSObject *mockRegistrar = + OCMStrictProtocolMock(@protocol(FlutterPluginRegistrar)); + id mockImageClass = OCMClassMock([UIImage class]); + UIImage *testImage = [self createOnePixelImage]; + OCMStub([mockRegistrar lookupKeyForAsset:@"fakeImageNameKey"]).andReturn(@"fakeAssetKey"); + OCMStub(ClassMethod([mockImageClass imageNamed:@"fakeAssetKey"])).andReturn(testImage); + + NSDictionary *assetData = + @{@"assetName" : @"fakeImageNameKey", @"bitmapScaling" : @"auto", @"imagePixelRatio" : @1}; + + NSArray *iconData = @[ @"asset", assetData ]; + + CGFloat screenScale = 3.0; + + UIImage *resultImage = [instance extractIconFromData:iconData + registrar:mockRegistrar + screenScale:screenScale]; + XCTAssertNotNil(resultImage); + XCTAssertEqual(resultImage.scale, 1.0); + XCTAssertEqual(resultImage.size.width, 1.0); + XCTAssertEqual(resultImage.size.height, 1.0); +} + +- (void)testExtractIconFromDataAssetAutoWithScale { + FLTGoogleMapMarkerController *instance = [[FLTGoogleMapMarkerController alloc] init]; + NSObject *mockRegistrar = + OCMStrictProtocolMock(@protocol(FlutterPluginRegistrar)); + id mockImageClass = OCMClassMock([UIImage class]); + UIImage *testImage = [self createOnePixelImage]; + + OCMStub([mockRegistrar lookupKeyForAsset:@"fakeImageNameKey"]).andReturn(@"fakeAssetKey"); + OCMStub(ClassMethod([mockImageClass imageNamed:@"fakeAssetKey"])).andReturn(testImage); + + NSDictionary *assetData = + @{@"assetName" : @"fakeImageNameKey", @"bitmapScaling" : @"auto", @"imagePixelRatio" : @10}; + + NSArray *iconData = @[ @"asset", assetData ]; + + CGFloat screenScale = 3.0; + + UIImage *resultImage = [instance extractIconFromData:iconData + registrar:mockRegistrar + screenScale:screenScale]; + + XCTAssertNotNil(resultImage); + XCTAssertEqual(resultImage.scale, 10); + XCTAssertEqual(resultImage.size.width, 0.1); + XCTAssertEqual(resultImage.size.height, 0.1); +} + +- (void)testExtractIconFromDataAssetAutoAndSizeWithSameAspectRatio { + FLTGoogleMapMarkerController *instance = [[FLTGoogleMapMarkerController alloc] init]; + NSObject *mockRegistrar = + OCMStrictProtocolMock(@protocol(FlutterPluginRegistrar)); + id mockImageClass = OCMClassMock([UIImage class]); + UIImage *testImage = [self createOnePixelImage]; + XCTAssertEqual(testImage.scale, 1.0); + + OCMStub([mockRegistrar lookupKeyForAsset:@"fakeImageNameKey"]).andReturn(@"fakeAssetKey"); + OCMStub(ClassMethod([mockImageClass imageNamed:@"fakeAssetKey"])).andReturn(testImage); + + NSDictionary *assetData = @{ + @"assetName" : @"fakeImageNameKey", + @"bitmapScaling" : @"auto", + @"imagePixelRatio" : @1, + @"width" : @15.0 + }; // Target height + + NSArray *iconData = @[ @"asset", assetData ]; + CGFloat screenScale = 3.0; + + UIImage *resultImage = [instance extractIconFromData:iconData + registrar:mockRegistrar + screenScale:screenScale]; + XCTAssertNotNil(resultImage); + XCTAssertEqual(testImage.scale, 1.0); + + // As image has same aspect ratio as the original image, + // only image scale has been changed to match the target size. + CGFloat targetScale = testImage.scale * (testImage.size.width / 15.0); + const CGFloat accuracy = 0.001; + XCTAssertEqualWithAccuracy(resultImage.scale, targetScale, accuracy); + XCTAssertEqual(resultImage.size.width, 15.0); + XCTAssertEqual(resultImage.size.height, 15.0); +} + +- (void)testExtractIconFromDataAssetAutoAndSizeWithDifferentAspectRatio { + FLTGoogleMapMarkerController *instance = [[FLTGoogleMapMarkerController alloc] init]; + NSObject *mockRegistrar = + OCMStrictProtocolMock(@protocol(FlutterPluginRegistrar)); + id mockImageClass = OCMClassMock([UIImage class]); + UIImage *testImage = [self createOnePixelImage]; + + OCMStub([mockRegistrar lookupKeyForAsset:@"fakeImageNameKey"]).andReturn(@"fakeAssetKey"); + OCMStub(ClassMethod([mockImageClass imageNamed:@"fakeAssetKey"])).andReturn(testImage); + + NSDictionary *assetData = @{ + @"assetName" : @"fakeImageNameKey", + @"bitmapScaling" : @"auto", + @"imagePixelRatio" : @1, + @"width" : @15.0, + @"height" : @45.0 + }; + + NSArray *iconData = @[ @"asset", assetData ]; + + CGFloat screenScale = 3.0; + + UIImage *resultImage = [instance extractIconFromData:iconData + registrar:mockRegistrar + screenScale:screenScale]; + XCTAssertNotNil(resultImage); + XCTAssertEqual(resultImage.scale, screenScale); + XCTAssertEqual(resultImage.size.width, 15.0); + XCTAssertEqual(resultImage.size.height, 45.0); +} + +- (void)testExtractIconFromDataAssetNoScaling { + FLTGoogleMapMarkerController *instance = [[FLTGoogleMapMarkerController alloc] init]; + NSObject *mockRegistrar = + OCMStrictProtocolMock(@protocol(FlutterPluginRegistrar)); + id mockImageClass = OCMClassMock([UIImage class]); + UIImage *testImage = [self createOnePixelImage]; + + OCMStub([mockRegistrar lookupKeyForAsset:@"fakeImageNameKey"]).andReturn(@"fakeAssetKey"); + OCMStub(ClassMethod([mockImageClass imageNamed:@"fakeAssetKey"])).andReturn(testImage); + + NSDictionary *assetData = + @{@"assetName" : @"fakeImageNameKey", @"bitmapScaling" : @"none", @"imagePixelRatio" : @10}; + + NSArray *iconData = @[ @"asset", assetData ]; + + CGFloat screenScale = 3.0; + + UIImage *resultImage = [instance extractIconFromData:iconData + registrar:mockRegistrar + screenScale:screenScale]; + + XCTAssertNotNil(resultImage); + XCTAssertEqual(resultImage.scale, 1.0); + XCTAssertEqual(resultImage.size.width, 1.0); + XCTAssertEqual(resultImage.size.height, 1.0); +} + +- (void)testExtractIconFromDataBytesAuto { + FLTGoogleMapMarkerController *instance = [[FLTGoogleMapMarkerController alloc] init]; + NSObject *mockRegistrar = + OCMStrictProtocolMock(@protocol(FlutterPluginRegistrar)); + UIImage *testImage = [self createOnePixelImage]; + NSData *pngData = UIImagePNGRepresentation(testImage); + XCTAssertNotNil(pngData); + + FlutterStandardTypedData *typedData = [FlutterStandardTypedData typedDataWithBytes:pngData]; + + NSDictionary *bytesData = + @{@"byteData" : typedData, @"bitmapScaling" : @"auto", @"imagePixelRatio" : @1}; + + NSArray *iconData = @[ @"bytes", bytesData ]; + CGFloat screenScale = 3.0; + + UIImage *resultImage = [instance extractIconFromData:iconData + registrar:mockRegistrar + screenScale:screenScale]; + + XCTAssertNotNil(resultImage); + XCTAssertEqual(resultImage.scale, 1.0); + XCTAssertEqual(resultImage.size.width, 1.0); + XCTAssertEqual(resultImage.size.height, 1.0); +} + +- (void)testExtractIconFromDataBytesAutoWithScaling { + FLTGoogleMapMarkerController *instance = [[FLTGoogleMapMarkerController alloc] init]; + NSObject *mockRegistrar = + OCMStrictProtocolMock(@protocol(FlutterPluginRegistrar)); + UIImage *testImage = [self createOnePixelImage]; + NSData *pngData = UIImagePNGRepresentation(testImage); + XCTAssertNotNil(pngData); + + FlutterStandardTypedData *typedData = [FlutterStandardTypedData typedDataWithBytes:pngData]; + + NSDictionary *bytesData = + @{@"byteData" : typedData, @"bitmapScaling" : @"auto", @"imagePixelRatio" : @10}; + + NSArray *iconData = @[ @"bytes", bytesData ]; + + CGFloat screenScale = 3.0; + + UIImage *resultImage = [instance extractIconFromData:iconData + registrar:mockRegistrar + screenScale:screenScale]; + XCTAssertNotNil(resultImage); + XCTAssertEqual(resultImage.scale, 10); + XCTAssertEqual(resultImage.size.width, 0.1); + XCTAssertEqual(resultImage.size.height, 0.1); +} + +- (void)testExtractIconFromDataBytesAutoAndSizeWithSameAspectRatio { + FLTGoogleMapMarkerController *instance = [[FLTGoogleMapMarkerController alloc] init]; + NSObject *mockRegistrar = + OCMStrictProtocolMock(@protocol(FlutterPluginRegistrar)); + UIImage *testImage = [self createOnePixelImage]; + NSData *pngData = UIImagePNGRepresentation(testImage); + XCTAssertNotNil(pngData); + + FlutterStandardTypedData *typedData = [FlutterStandardTypedData typedDataWithBytes:pngData]; + + NSDictionary *bytesData = @{ + @"byteData" : typedData, + @"bitmapScaling" : @"auto", + @"imagePixelRatio" : @1, + @"width" : @15.0, + @"height" : @15.0 + }; + + NSArray *iconData = @[ @"bytes", bytesData ]; + + CGFloat screenScale = 3.0; + + UIImage *resultImage = [instance extractIconFromData:iconData + registrar:mockRegistrar + screenScale:screenScale]; + + XCTAssertNotNil(resultImage); + XCTAssertEqual(testImage.scale, 1.0); + + // As image has same aspect ratio as the original image, + // only image scale has been changed to match the target size. + CGFloat targetScale = testImage.scale * (testImage.size.width / 15.0); + const CGFloat accuracy = 0.001; + XCTAssertEqualWithAccuracy(resultImage.scale, targetScale, accuracy); + XCTAssertEqual(resultImage.size.width, 15.0); + XCTAssertEqual(resultImage.size.height, 15.0); +} + +- (void)testExtractIconFromDataBytesAutoAndSizeWithDifferentAspectRatio { + FLTGoogleMapMarkerController *instance = [[FLTGoogleMapMarkerController alloc] init]; + NSObject *mockRegistrar = + OCMStrictProtocolMock(@protocol(FlutterPluginRegistrar)); + UIImage *testImage = [self createOnePixelImage]; + NSData *pngData = UIImagePNGRepresentation(testImage); + XCTAssertNotNil(pngData); + + FlutterStandardTypedData *typedData = [FlutterStandardTypedData typedDataWithBytes:pngData]; + + NSDictionary *bytesData = @{ + @"byteData" : typedData, + @"bitmapScaling" : @"auto", + @"imagePixelRatio" : @1, + @"width" : @15.0, + @"height" : @45.0 + }; + + NSArray *iconData = @[ @"bytes", bytesData ]; + CGFloat screenScale = 3.0; + + UIImage *resultImage = [instance extractIconFromData:iconData + registrar:mockRegistrar + screenScale:screenScale]; + XCTAssertNotNil(resultImage); + XCTAssertEqual(resultImage.scale, screenScale); + XCTAssertEqual(resultImage.size.width, 15.0); + XCTAssertEqual(resultImage.size.height, 45.0); +} + +- (void)testExtractIconFromDataBytesNoScaling { + FLTGoogleMapMarkerController *instance = [[FLTGoogleMapMarkerController alloc] init]; + NSObject *mockRegistrar = + OCMStrictProtocolMock(@protocol(FlutterPluginRegistrar)); + UIImage *testImage = [self createOnePixelImage]; + NSData *pngData = UIImagePNGRepresentation(testImage); + XCTAssertNotNil(pngData); + + FlutterStandardTypedData *typedData = [FlutterStandardTypedData typedDataWithBytes:pngData]; + + NSDictionary *bytesData = + @{@"byteData" : typedData, @"bitmapScaling" : @"none", @"imagePixelRatio" : @1}; + + NSArray *iconData = @[ @"bytes", bytesData ]; + CGFloat screenScale = 3.0; + + UIImage *resultImage = [instance extractIconFromData:iconData + registrar:mockRegistrar + screenScale:screenScale]; + XCTAssertNotNil(resultImage); + XCTAssertEqual(resultImage.scale, 1.0); + XCTAssertEqual(resultImage.size.width, 1.0); + XCTAssertEqual(resultImage.size.height, 1.0); +} + +- (void)testIsScalableWithScaleFactorFromSize100x100to10x100 { + CGSize originalSize = CGSizeMake(100.0, 100.0); + CGSize targetSize = CGSizeMake(10.0, 100.0); + XCTAssertFalse([FLTGoogleMapMarkerController isScalableWithScaleFactorFromSize:originalSize + toSize:targetSize]); +} + +- (void)testIsScalableWithScaleFactorFromSize100x100to10x10 { + CGSize originalSize = CGSizeMake(100.0, 100.0); + CGSize targetSize = CGSizeMake(10.0, 10.0); + XCTAssertTrue([FLTGoogleMapMarkerController isScalableWithScaleFactorFromSize:originalSize + toSize:targetSize]); +} + +- (void)testIsScalableWithScaleFactorFromSize233x200to23x20 { + CGSize originalSize = CGSizeMake(233.0, 200.0); + CGSize targetSize = CGSizeMake(23.0, 20.0); + XCTAssertTrue([FLTGoogleMapMarkerController isScalableWithScaleFactorFromSize:originalSize + toSize:targetSize]); +} + +- (void)testIsScalableWithScaleFactorFromSize233x200to22x20 { + CGSize originalSize = CGSizeMake(233.0, 200.0); + CGSize targetSize = CGSizeMake(22.0, 20.0); + XCTAssertFalse([FLTGoogleMapMarkerController isScalableWithScaleFactorFromSize:originalSize + toSize:targetSize]); +} + +- (void)testIsScalableWithScaleFactorFromSize200x233to20x23 { + CGSize originalSize = CGSizeMake(200.0, 233.0); + CGSize targetSize = CGSizeMake(20.0, 23.0); + XCTAssertTrue([FLTGoogleMapMarkerController isScalableWithScaleFactorFromSize:originalSize + toSize:targetSize]); +} + +- (void)testIsScalableWithScaleFactorFromSize200x233to20x22 { + CGSize originalSize = CGSizeMake(200.0, 233.0); + CGSize targetSize = CGSizeMake(20.0, 22.0); + XCTAssertFalse([FLTGoogleMapMarkerController isScalableWithScaleFactorFromSize:originalSize + toSize:targetSize]); +} + +- (void)testIsScalableWithScaleFactorFromSize1024x768to500x250 { + CGSize originalSize = CGSizeMake(1024.0, 768.0); + CGSize targetSize = CGSizeMake(500.0, 250.0); + XCTAssertFalse([FLTGoogleMapMarkerController isScalableWithScaleFactorFromSize:originalSize + toSize:targetSize]); +} + +- (UIImage *)createOnePixelImage { + CGSize size = CGSizeMake(1, 1); + UIGraphicsImageRendererFormat *format = [UIGraphicsImageRendererFormat defaultFormat]; + format.scale = 1.0; + format.opaque = YES; + UIGraphicsImageRenderer *renderer = [[UIGraphicsImageRenderer alloc] initWithSize:size + format:format]; + UIImage *image = [renderer imageWithActions:^(UIGraphicsImageRendererContext *_Nonnull context) { + [[UIColor whiteColor] setFill]; + [context fillRect:CGRectMake(0, 0, size.width, size.height)]; + }]; + return image; +} + +@end diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/RunnerTests/FLTGoogleMapJSONConversionsConversionTests.m b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/RunnerTests/FLTGoogleMapJSONConversionsConversionTests.m new file mode 100644 index 00000000000..cc654606d8c --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/RunnerTests/FLTGoogleMapJSONConversionsConversionTests.m @@ -0,0 +1,305 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +@import google_maps_flutter_ios; +@import google_maps_flutter_ios.Test; +@import XCTest; +@import MapKit; +@import GoogleMaps; + +#import +#import "PartiallyMockedMapView.h" + +@interface FLTGoogleMapJSONConversionsTests : XCTestCase +@end + +@implementation FLTGoogleMapJSONConversionsTests + +- (void)testLocationFromLatLong { + NSArray *latlong = @[ @1, @2 ]; + CLLocationCoordinate2D location = [FLTGoogleMapJSONConversions locationFromLatLong:latlong]; + XCTAssertEqual(location.latitude, 1); + XCTAssertEqual(location.longitude, 2); +} + +- (void)testPointFromArray { + NSArray *array = @[ @1, @2 ]; + CGPoint point = [FLTGoogleMapJSONConversions pointFromArray:array]; + XCTAssertEqual(point.x, 1); + XCTAssertEqual(point.y, 2); +} + +- (void)testArrayFromLocation { + CLLocationCoordinate2D location = CLLocationCoordinate2DMake(1, 2); + NSArray *array = [FLTGoogleMapJSONConversions arrayFromLocation:location]; + XCTAssertEqual([array[0] integerValue], 1); + XCTAssertEqual([array[1] integerValue], 2); +} + +- (void)testColorFromRGBA { + NSNumber *rgba = @(0x01020304); + UIColor *color = [FLTGoogleMapJSONConversions colorFromRGBA:rgba]; + CGFloat red, green, blue, alpha; + BOOL success = [color getRed:&red green:&green blue:&blue alpha:&alpha]; + XCTAssertTrue(success); + const CGFloat accuracy = 0.0001; + XCTAssertEqualWithAccuracy(red, 2 / 255.0, accuracy); + XCTAssertEqualWithAccuracy(green, 3 / 255.0, accuracy); + XCTAssertEqualWithAccuracy(blue, 4 / 255.0, accuracy); + XCTAssertEqualWithAccuracy(alpha, 1 / 255.0, accuracy); +} + +- (void)testPointsFromLatLongs { + NSArray *latlongs = @[ @[ @1, @2 ], @[ @(3), @(4) ] ]; + NSArray *locations = [FLTGoogleMapJSONConversions pointsFromLatLongs:latlongs]; + XCTAssertEqual(locations.count, 2); + XCTAssertEqual(locations[0].coordinate.latitude, 1); + XCTAssertEqual(locations[0].coordinate.longitude, 2); + XCTAssertEqual(locations[1].coordinate.latitude, 3); + XCTAssertEqual(locations[1].coordinate.longitude, 4); +} + +- (void)testHolesFromPointsArray { + NSArray *pointsArray = + @[ @[ @[ @1, @2 ], @[ @(3), @(4) ] ], @[ @[ @(5), @(6) ], @[ @(7), @(8) ] ] ]; + NSArray *> *holes = + [FLTGoogleMapJSONConversions holesFromPointsArray:pointsArray]; + XCTAssertEqual(holes.count, 2); + XCTAssertEqual(holes[0][0].coordinate.latitude, 1); + XCTAssertEqual(holes[0][0].coordinate.longitude, 2); + XCTAssertEqual(holes[0][1].coordinate.latitude, 3); + XCTAssertEqual(holes[0][1].coordinate.longitude, 4); + XCTAssertEqual(holes[1][0].coordinate.latitude, 5); + XCTAssertEqual(holes[1][0].coordinate.longitude, 6); + XCTAssertEqual(holes[1][1].coordinate.latitude, 7); + XCTAssertEqual(holes[1][1].coordinate.longitude, 8); +} + +- (void)testDictionaryFromPosition { + id mockPosition = OCMClassMock([GMSCameraPosition class]); + NSValue *locationValue = [NSValue valueWithMKCoordinate:CLLocationCoordinate2DMake(1, 2)]; + [(GMSCameraPosition *)[[mockPosition stub] andReturnValue:locationValue] target]; + [[[mockPosition stub] andReturnValue:@(2.0)] zoom]; + [[[mockPosition stub] andReturnValue:@(3.0)] bearing]; + [[[mockPosition stub] andReturnValue:@(75.0)] viewingAngle]; + NSDictionary *dictionary = [FLTGoogleMapJSONConversions dictionaryFromPosition:mockPosition]; + NSArray *targetArray = @[ @1, @2 ]; + XCTAssertEqualObjects(dictionary[@"target"], targetArray); + XCTAssertEqualObjects(dictionary[@"zoom"], @2.0); + XCTAssertEqualObjects(dictionary[@"bearing"], @3.0); + XCTAssertEqualObjects(dictionary[@"tilt"], @75.0); +} + +- (void)testDictionaryFromPoint { + CGPoint point = CGPointMake(10, 20); + NSDictionary *dictionary = [FLTGoogleMapJSONConversions dictionaryFromPoint:point]; + const CGFloat accuracy = 0.0001; + XCTAssertEqualWithAccuracy([dictionary[@"x"] floatValue], point.x, accuracy); + XCTAssertEqualWithAccuracy([dictionary[@"y"] floatValue], point.y, accuracy); +} + +- (void)testDictionaryFromCoordinateBounds { + XCTAssertNil([FLTGoogleMapJSONConversions dictionaryFromCoordinateBounds:nil]); + + GMSCoordinateBounds *bounds = + [[GMSCoordinateBounds alloc] initWithCoordinate:CLLocationCoordinate2DMake(10, 20) + coordinate:CLLocationCoordinate2DMake(30, 40)]; + NSDictionary *dictionary = [FLTGoogleMapJSONConversions dictionaryFromCoordinateBounds:bounds]; + NSArray *southwest = @[ @10, @20 ]; + NSArray *northeast = @[ @30, @40 ]; + XCTAssertEqualObjects(dictionary[@"southwest"], southwest); + XCTAssertEqualObjects(dictionary[@"northeast"], northeast); +} + +- (void)testCameraPostionFromDictionary { + XCTAssertNil([FLTGoogleMapJSONConversions cameraPostionFromDictionary:nil]); + + NSDictionary *channelValue = + @{@"target" : @[ @1, @2 ], @"zoom" : @3, @"bearing" : @4, @"tilt" : @5}; + + GMSCameraPosition *cameraPosition = + [FLTGoogleMapJSONConversions cameraPostionFromDictionary:channelValue]; + + const CGFloat accuracy = 0.001; + XCTAssertEqualWithAccuracy(cameraPosition.target.latitude, 1, accuracy); + XCTAssertEqualWithAccuracy(cameraPosition.target.longitude, 2, accuracy); + XCTAssertEqualWithAccuracy(cameraPosition.zoom, 3, accuracy); + XCTAssertEqualWithAccuracy(cameraPosition.bearing, 4, accuracy); + XCTAssertEqualWithAccuracy(cameraPosition.viewingAngle, 5, accuracy); +} + +- (void)testPointFromDictionary { + XCTAssertNil([FLTGoogleMapJSONConversions cameraPostionFromDictionary:nil]); + + NSDictionary *dictionary = @{ + @"x" : @1, + @"y" : @2, + }; + + CGPoint point = [FLTGoogleMapJSONConversions pointFromDictionary:dictionary]; + + const CGFloat accuracy = 0.001; + XCTAssertEqualWithAccuracy(point.x, 1, accuracy); + XCTAssertEqualWithAccuracy(point.y, 2, accuracy); +} + +- (void)testCoordinateBoundsFromLatLongs { + NSArray *latlong1 = @[ @1, @2 ]; + NSArray *latlong2 = @[ @(3), @(4) ]; + + GMSCoordinateBounds *bounds = + [FLTGoogleMapJSONConversions coordinateBoundsFromLatLongs:@[ latlong1, latlong2 ]]; + + const CGFloat accuracy = 0.001; + XCTAssertEqualWithAccuracy(bounds.southWest.latitude, 1, accuracy); + XCTAssertEqualWithAccuracy(bounds.southWest.longitude, 2, accuracy); + XCTAssertEqualWithAccuracy(bounds.northEast.latitude, 3, accuracy); + XCTAssertEqualWithAccuracy(bounds.northEast.longitude, 4, accuracy); +} + +- (void)testMapViewTypeFromTypeValue { + XCTAssertEqual(kGMSTypeNormal, [FLTGoogleMapJSONConversions mapViewTypeFromTypeValue:@1]); + XCTAssertEqual(kGMSTypeSatellite, [FLTGoogleMapJSONConversions mapViewTypeFromTypeValue:@2]); + XCTAssertEqual(kGMSTypeTerrain, [FLTGoogleMapJSONConversions mapViewTypeFromTypeValue:@3]); + XCTAssertEqual(kGMSTypeHybrid, [FLTGoogleMapJSONConversions mapViewTypeFromTypeValue:@4]); + XCTAssertEqual(kGMSTypeNone, [FLTGoogleMapJSONConversions mapViewTypeFromTypeValue:@5]); +} + +- (void)testCameraUpdateFromChannelValueNewCameraPosition { + NSArray *channelValue = @[ + @"newCameraPosition", @{@"target" : @[ @1, @2 ], @"zoom" : @3, @"bearing" : @4, @"tilt" : @5} + ]; + id classMockCameraUpdate = OCMClassMock([GMSCameraUpdate class]); + [FLTGoogleMapJSONConversions cameraUpdateFromChannelValue:channelValue]; + [[classMockCameraUpdate expect] + setCamera:[FLTGoogleMapJSONConversions cameraPostionFromDictionary:channelValue[1]]]; + [classMockCameraUpdate stopMocking]; +} + +// TODO(cyanglaz): Fix the test for CameraUpdateFromChannelValue with the "NewLatlng" key. +// 2 approaches have been tried and neither worked for the tests. +// +// 1. Use OCMock to vefiry that [GMSCameraUpdate setTarget:] is triggered with the correct value. +// This class method conflicts with certain category method in OCMock, causing OCMock not able to +// disambigious them. +// +// 2. Directly verify the GMSCameraUpdate object returned by the method. +// The GMSCameraUpdate object returned from the method doesn't have any accessors to the "target" +// property. It can be used to update the "camera" property in GMSMapView. However, [GMSMapView +// moveCamera:] doesn't update the camera immediately. Thus the GMSCameraUpdate object cannot be +// verified. +// +// The code in below test uses the 2nd approach. +- (void)skip_testCameraUpdateFromChannelValueNewLatLong { + NSArray *channelValue = @[ @"newLatLng", @[ @1, @2 ] ]; + + GMSCameraUpdate *update = [FLTGoogleMapJSONConversions cameraUpdateFromChannelValue:channelValue]; + + GMSMapViewOptions *options = [[GMSMapViewOptions alloc] init]; + options.frame = CGRectZero; + options.camera = [GMSCameraPosition cameraWithTarget:CLLocationCoordinate2DMake(5, 6) zoom:1]; + GMSMapView *mapView = [[GMSMapView alloc] initWithOptions:options]; + [mapView moveCamera:update]; + const CGFloat accuracy = 0.001; + XCTAssertEqualWithAccuracy(mapView.camera.target.latitude, 1, + accuracy); // mapView.camera.target.latitude is still 5. + XCTAssertEqualWithAccuracy(mapView.camera.target.longitude, 2, + accuracy); // mapView.camera.target.longitude is still 6. +} + +- (void)testCameraUpdateFromChannelValueNewLatLngBounds { + NSArray *latlong1 = @[ @1, @2 ]; + NSArray *latlong2 = @[ @(3), @(4) ]; + GMSCoordinateBounds *bounds = + [FLTGoogleMapJSONConversions coordinateBoundsFromLatLongs:@[ latlong1, latlong2 ]]; + + NSArray *channelValue = @[ @"newLatLngBounds", @[ latlong1, latlong2 ], @20 ]; + id classMockCameraUpdate = OCMClassMock([GMSCameraUpdate class]); + [FLTGoogleMapJSONConversions cameraUpdateFromChannelValue:channelValue]; + + [[classMockCameraUpdate expect] fitBounds:bounds withPadding:20]; + [classMockCameraUpdate stopMocking]; +} + +- (void)testCameraUpdateFromChannelValueNewLatLngZoom { + NSArray *channelValue = @[ @"newLatLngZoom", @[ @1, @2 ], @3 ]; + + id classMockCameraUpdate = OCMClassMock([GMSCameraUpdate class]); + [FLTGoogleMapJSONConversions cameraUpdateFromChannelValue:channelValue]; + + [[classMockCameraUpdate expect] setTarget:CLLocationCoordinate2DMake(1, 2) zoom:3]; + [classMockCameraUpdate stopMocking]; +} + +- (void)testCameraUpdateFromChannelValueScrollBy { + NSArray *channelValue = @[ @"scrollBy", @1, @2 ]; + + id classMockCameraUpdate = OCMClassMock([GMSCameraUpdate class]); + [FLTGoogleMapJSONConversions cameraUpdateFromChannelValue:channelValue]; + + [[classMockCameraUpdate expect] scrollByX:1 Y:2]; + [classMockCameraUpdate stopMocking]; +} + +- (void)testCameraUpdateFromChannelValueZoomBy { + NSArray *channelValueNoPoint = @[ @"zoomBy", @1 ]; + + id classMockCameraUpdate = OCMClassMock([GMSCameraUpdate class]); + [FLTGoogleMapJSONConversions cameraUpdateFromChannelValue:channelValueNoPoint]; + + [[classMockCameraUpdate expect] zoomBy:1]; + + NSArray *channelValueWithPoint = @[ @"zoomBy", @1, @[ @2, @3 ] ]; + + [FLTGoogleMapJSONConversions cameraUpdateFromChannelValue:channelValueWithPoint]; + + [[classMockCameraUpdate expect] zoomBy:1 atPoint:CGPointMake(2, 3)]; + [classMockCameraUpdate stopMocking]; +} + +- (void)testCameraUpdateFromChannelValueZoomIn { + NSArray *channelValueNoPoint = @[ @"zoomIn" ]; + + id classMockCameraUpdate = OCMClassMock([GMSCameraUpdate class]); + [FLTGoogleMapJSONConversions cameraUpdateFromChannelValue:channelValueNoPoint]; + + [[classMockCameraUpdate expect] zoomIn]; + [classMockCameraUpdate stopMocking]; +} + +- (void)testCameraUpdateFromChannelValueZoomOut { + NSArray *channelValueNoPoint = @[ @"zoomOut" ]; + + id classMockCameraUpdate = OCMClassMock([GMSCameraUpdate class]); + [FLTGoogleMapJSONConversions cameraUpdateFromChannelValue:channelValueNoPoint]; + + [[classMockCameraUpdate expect] zoomOut]; + [classMockCameraUpdate stopMocking]; +} + +- (void)testCameraUpdateFromChannelValueZoomTo { + NSArray *channelValueNoPoint = @[ @"zoomTo", @1 ]; + + id classMockCameraUpdate = OCMClassMock([GMSCameraUpdate class]); + [FLTGoogleMapJSONConversions cameraUpdateFromChannelValue:channelValueNoPoint]; + + [[classMockCameraUpdate expect] zoomTo:1]; + [classMockCameraUpdate stopMocking]; +} + +- (void)testLengthsFromPatterns { + NSArray *> *patterns = @[ @[ @"gap", @10 ], @[ @"dash", @6.4 ] ]; + + NSArray *spanLengths = [FLTGoogleMapJSONConversions spanLengthsFromPatterns:patterns]; + + XCTAssertEqual([spanLengths count], 2); + + NSNumber *firstSpanLength = spanLengths[0]; + NSNumber *secondSpanLength = spanLengths[1]; + + XCTAssertEqual(firstSpanLength.doubleValue, 10); + XCTAssertEqual(secondSpanLength.doubleValue, 6.4); +} + +@end diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/RunnerTests/FLTTileProviderControllerTests.m b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/RunnerTests/FLTTileProviderControllerTests.m new file mode 100644 index 00000000000..d42174a906f --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/RunnerTests/FLTTileProviderControllerTests.m @@ -0,0 +1,32 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +@import XCTest; +@import GoogleMaps; +@import google_maps_flutter_ios; + +#import + +@interface FLTTileProviderControllerTests : XCTestCase +@end + +@implementation FLTTileProviderControllerTests + +- (void)testCallChannelOnPlatformThread { + id channel = OCMClassMock(FlutterMethodChannel.class); + FLTTileProviderController *controller = [[FLTTileProviderController alloc] init:channel + withTileOverlayIdentifier:@"foo"]; + XCTAssertNotNil(controller); + XCTestExpectation *expectation = [self expectationWithDescription:@"invokeMethod"]; + OCMStub([channel invokeMethod:[OCMArg any] arguments:[OCMArg any] result:[OCMArg any]]) + .andDo(^(NSInvocation *invocation) { + XCTAssertTrue([[NSThread currentThread] isMainThread]); + [expectation fulfill]; + }); + id receiver = OCMProtocolMock(@protocol(GMSTileReceiver)); + [controller requestTileForX:0 y:0 zoom:0 receiver:receiver]; + [self waitForExpectations:@[ expectation ] timeout:10.0]; +} + +@end diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/RunnerTests/GoogleMapsPolylinesControllerTests.m b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/RunnerTests/GoogleMapsPolylinesControllerTests.m new file mode 100644 index 00000000000..84714f17c7f --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/RunnerTests/GoogleMapsPolylinesControllerTests.m @@ -0,0 +1,81 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +@import google_maps_flutter_ios; +@import google_maps_flutter_ios.Test; +@import XCTest; +@import GoogleMaps; + +#import +#import +#import "PartiallyMockedMapView.h" + +@interface GoogleMapsPolylinesControllerTests : XCTestCase +@end + +@implementation GoogleMapsPolylinesControllerTests + +/// Returns GoogleMapPolylineController object instantiated with a mocked map instance +/// +/// @return An object of FLTGoogleMapPolylineController +- (FLTGoogleMapPolylineController *)polylineControllerWithMockedMap { + NSDictionary *polyline = @{ + @"points" : @[ + @[ @(52.4816), @(-3.1791) ], @[ @(54.043), @(-2.9925) ], @[ @(54.1396), @(-4.2739) ], + @[ @(53.4153), @(-4.0829) ] + ], + @"polylineId" : @"polyline_id_0", + }; + + CGRect frame = CGRectMake(0, 0, 100, 100); + GMSCameraPosition *camera = [[GMSCameraPosition alloc] initWithLatitude:0 longitude:0 zoom:0]; + + GMSMapViewOptions *mapViewOptions = [[GMSMapViewOptions alloc] init]; + mapViewOptions.frame = frame; + mapViewOptions.camera = camera; + + PartiallyMockedMapView *mapView = [[PartiallyMockedMapView alloc] initWithOptions:mapViewOptions]; + + GMSMutablePath *path = [FLTPolylinesController pathForPolyline:polyline]; + NSString *identifier = polyline[@"polylineId"]; + + FLTGoogleMapPolylineController *polylineControllerWithMockedMap = + [[FLTGoogleMapPolylineController alloc] initPolylineWithPath:path + identifier:identifier + mapView:mapView]; + + return polylineControllerWithMockedMap; +} + +- (void)testSetPatterns { + NSArray *styles = @[ + [GMSStrokeStyle solidColor:[UIColor clearColor]], [GMSStrokeStyle solidColor:[UIColor redColor]] + ]; + + NSArray *lengths = @[ @10, @10 ]; + + FLTGoogleMapPolylineController *polylineController = [self polylineControllerWithMockedMap]; + + XCTAssertNil(polylineController.polyline.spans); + + [polylineController setPattern:styles lengths:lengths]; + + // `GMSStyleSpan` doesn't implement `isEqual` so cannot be compared by value at present. + XCTAssertNotNil(polylineController.polyline.spans); +} + +- (void)testStrokeStylesFromPatterns { + NSArray *> *patterns = @[ @[ @"gap", @10 ], @[ @"dash", @10 ] ]; + UIColor *strokeColor = [UIColor redColor]; + + NSArray *patternStrokeStyle = + [FLTGoogleMapJSONConversions strokeStylesFromPatterns:patterns strokeColor:strokeColor]; + + XCTAssertEqual([patternStrokeStyle count], 2); + + // None of the parameters of `patternStrokeStyle` is observable, so we limit to testing + // the length of this output array. +} + +@end diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/RunnerTests/GoogleMapsTests.m b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/RunnerTests/GoogleMapsTests.m new file mode 100644 index 00000000000..b3ac89e2441 --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/RunnerTests/GoogleMapsTests.m @@ -0,0 +1,88 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +@import google_maps_flutter_ios; +@import google_maps_flutter_ios.Test; +@import XCTest; +@import GoogleMaps; + +#import +#import "PartiallyMockedMapView.h" + +@interface FLTGoogleMapFactory (Test) +@property(strong, nonatomic, readonly) id sharedMapServices; +@end + +@interface GoogleMapsTests : XCTestCase +@end + +@interface FLTTileProviderController (Testing) +- (UIImage *)handleResultTile:(nullable UIImage *)tileImage; +@end + +@implementation GoogleMapsTests + +- (void)testPlugin { + FLTGoogleMapsPlugin *plugin = [[FLTGoogleMapsPlugin alloc] init]; + XCTAssertNotNil(plugin); +} + +- (void)testFrameObserver { + id registrar = OCMProtocolMock(@protocol(FlutterPluginRegistrar)); + CGRect frame = CGRectMake(0, 0, 100, 100); +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + // TODO(stuartmorgan): Switch to initWithOptions: once we can guarantee we will be using SDK 8.3+. + // That API was only added in 8.3, and Cocoapod caches on some machines may not be up-to-date + // enough to resolve to that yet even when targeting iOS 14+. + PartiallyMockedMapView *mapView = [[PartiallyMockedMapView alloc] + initWithFrame:frame + camera:[[GMSCameraPosition alloc] initWithLatitude:0 longitude:0 zoom:0]]; +#pragma clang diagnostic pop + FLTGoogleMapController *controller = [[FLTGoogleMapController alloc] initWithMapView:mapView + viewIdentifier:0 + arguments:nil + registrar:registrar]; + + for (NSInteger i = 0; i < 10; ++i) { + [controller view]; + } + XCTAssertEqual(mapView.frameObserverCount, 1); + + mapView.frame = frame; + XCTAssertEqual(mapView.frameObserverCount, 0); +} + +- (void)testMapsServiceSync { + id registrar = OCMProtocolMock(@protocol(FlutterPluginRegistrar)); + FLTGoogleMapFactory *factory1 = [[FLTGoogleMapFactory alloc] initWithRegistrar:registrar]; + XCTAssertNotNil(factory1.sharedMapServices); + FLTGoogleMapFactory *factory2 = [[FLTGoogleMapFactory alloc] initWithRegistrar:registrar]; + // Test pointer equality, should be same retained singleton +[GMSServices sharedServices] object. + // Retaining the opaque object should be enough to avoid multiple internal initializations, + // but don't test the internals of the GoogleMaps API. Assume that it does what is documented. + // https://developers.google.com/maps/documentation/ios-sdk/reference/interface_g_m_s_services#a436e03c32b1c0be74e072310a7158831 + XCTAssertEqual(factory1.sharedMapServices, factory2.sharedMapServices); +} + +- (void)testHandleResultTileDownsamplesWideGamutImages { + FLTTileProviderController *controller = [[FLTTileProviderController alloc] init]; + + NSString *imagePath = [[NSBundle bundleForClass:[self class]] pathForResource:@"widegamut" + ofType:@"png" + inDirectory:@"assets"]; + UIImage *wideGamutImage = [UIImage imageWithContentsOfFile:imagePath]; + + XCTAssertNotNil(wideGamutImage, @"The image should be loaded."); + + UIImage *downsampledImage = [controller handleResultTile:wideGamutImage]; + + CGImageRef imageRef = downsampledImage.CGImage; + size_t bitsPerComponent = CGImageGetBitsPerComponent(imageRef); + + // non wide gamut images use 8 bit format + XCTAssert(bitsPerComponent == 8); +} + +@end diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/RunnerTests/Info.plist b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/RunnerTests/Info.plist new file mode 100644 index 00000000000..64d65ca4957 --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/RunnerTests/Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + $(PRODUCT_BUNDLE_PACKAGE_TYPE) + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + + diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/RunnerTests/PartiallyMockedMapView.h b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/RunnerTests/PartiallyMockedMapView.h new file mode 100644 index 00000000000..4288401cf90 --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/RunnerTests/PartiallyMockedMapView.h @@ -0,0 +1,17 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +@import GoogleMaps; + +/** + * Defines a map view used for testing key-value observing. + */ +@interface PartiallyMockedMapView : GMSMapView + +/** + * The number of times that the `frame` KVO has been added. + */ +@property(nonatomic, assign, readonly) NSInteger frameObserverCount; + +@end diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/RunnerTests/PartiallyMockedMapView.m b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/RunnerTests/PartiallyMockedMapView.m new file mode 100644 index 00000000000..202a18d128c --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/RunnerTests/PartiallyMockedMapView.m @@ -0,0 +1,34 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "PartiallyMockedMapView.h" + +@interface PartiallyMockedMapView () + +@property(nonatomic, assign) NSInteger frameObserverCount; + +@end + +@implementation PartiallyMockedMapView + +- (void)addObserver:(NSObject *)observer + forKeyPath:(NSString *)keyPath + options:(NSKeyValueObservingOptions)options + context:(void *)context { + [super addObserver:observer forKeyPath:keyPath options:options context:context]; + + if ([keyPath isEqualToString:@"frame"]) { + ++self.frameObserverCount; + } +} + +- (void)removeObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath { + [super removeObserver:observer forKeyPath:keyPath]; + + if ([keyPath isEqualToString:@"frame"]) { + --self.frameObserverCount; + } +} + +@end diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/RunnerTests/assets/widegamut.png b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/RunnerTests/assets/widegamut.png new file mode 100644 index 0000000000000000000000000000000000000000..32f032bae3de42c8c7ba9529d2d18ad41e81bede GIT binary patch literal 3025 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 b>|umk_w!q81@)IS|E7FBS2Ip|gs1%tSx05K literal 0 HcmV?d00001 diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/RunnerUITests/GoogleMapsUITests.m b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/RunnerUITests/GoogleMapsUITests.m new file mode 100644 index 00000000000..3a1191bdb39 --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/RunnerUITests/GoogleMapsUITests.m @@ -0,0 +1,277 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +@import CoreLocation; +@import XCTest; +@import os.log; + +static const NSTimeInterval kWaitTime = 60; + +@interface GoogleMapsUITests : XCTestCase +@property(nonatomic, strong) XCUIApplication *app; +@end + +@implementation GoogleMapsUITests + +- (void)setUp { + self.continueAfterFailure = NO; + + self.app = [[XCUIApplication alloc] init]; + [self.app launch]; + + [self + addUIInterruptionMonitorWithDescription:@"Permission popups" + handler:^BOOL(XCUIElement *_Nonnull interruptingElement) { + if (@available(iOS 14, *)) { + XCUIElement *locationPermission = + interruptingElement.buttons[@"Allow While Using App"]; + if (![locationPermission + waitForExistenceWithTimeout:kWaitTime]) { + XCTFail(@"Failed due to not able to find " + @"locationPermission button"); + } + [locationPermission tap]; + + } else { + XCUIElement *allow = + interruptingElement.buttons[@"Allow"]; + if (![allow waitForExistenceWithTimeout:kWaitTime]) { + XCTFail(@"Failed due to not able to find Allow button"); + } + [allow tap]; + } + return YES; + }]; +} + +- (void)testUserInterface { + XCUIApplication *app = self.app; + XCUIElement *userInteface = app.staticTexts[@"User interface"]; + if (![userInteface waitForExistenceWithTimeout:kWaitTime]) { + os_log_error(OS_LOG_DEFAULT, "%@", app.debugDescription); + XCTFail(@"Failed due to not able to find User interface"); + } + [userInteface tap]; + + XCUIElement *platformView = app.otherElements[@"platform_view[0]"]; + if (![platformView waitForExistenceWithTimeout:kWaitTime]) { + os_log_error(OS_LOG_DEFAULT, "%@", app.debugDescription); + XCTFail(@"Failed due to not able to find platform view"); + } + + // There is a known bug where the permission popups interruption won't get fired until a tap + // happened in the app. We expect a permission popup so we do a tap here. + // iOS 16 has a bug where if the app itself is directly tapped: [app tap], the first button + // (disable compass) in the app is also tapped, so instead we tap a arbitrary location in the app + // instead. + XCUICoordinate *coordinate = [app coordinateWithNormalizedOffset:CGVectorMake(0, 0)]; + [coordinate tap]; + XCUIElement *compass = app.buttons[@"disable compass"]; + if (![compass waitForExistenceWithTimeout:kWaitTime]) { + os_log_error(OS_LOG_DEFAULT, "%@", app.debugDescription); + XCTFail(@"Failed due to not able to find disable compass button"); + } + + [self forceTap:compass]; +} + +- (void)testMapCoordinatesPage { + XCUIApplication *app = self.app; + XCUIElement *mapCoordinates = app.staticTexts[@"Map coordinates"]; + if (![mapCoordinates waitForExistenceWithTimeout:kWaitTime]) { + os_log_error(OS_LOG_DEFAULT, "%@", app.debugDescription); + XCTFail(@"Failed due to not able to find 'Map coordinates''"); + } + [mapCoordinates tap]; + + XCUIElement *platformView = app.otherElements[@"platform_view[0]"]; + if (![platformView waitForExistenceWithTimeout:kWaitTime]) { + os_log_error(OS_LOG_DEFAULT, "%@", app.debugDescription); + XCTFail(@"Failed due to not able to find platform view"); + } + + XCUIElement *titleBar = app.otherElements[@"Map coordinates"]; + if (![titleBar waitForExistenceWithTimeout:kWaitTime]) { + os_log_error(OS_LOG_DEFAULT, "%@", app.debugDescription); + XCTFail(@"Failed due to not able to find title bar"); + } + + NSPredicate *visibleRegionPredicate = + [NSPredicate predicateWithFormat:@"label BEGINSWITH 'VisibleRegion'"]; + XCUIElement *visibleRegionText = + [app.staticTexts elementMatchingPredicate:visibleRegionPredicate]; + if (![visibleRegionText waitForExistenceWithTimeout:kWaitTime]) { + os_log_error(OS_LOG_DEFAULT, "%@", app.debugDescription); + XCTFail(@"Failed due to not able to find Visible Region label'"); + } + + // Validate visible region does not change when scrolled under safe areas. + // https://github.com/flutter/flutter/issues/107913 + + // Example -33.79495661816674, 151.313996873796 + CLLocationCoordinate2D originalNortheast; + // Example -33.90900557679571, 151.10800322145224 + CLLocationCoordinate2D originalSouthwest; + [self validateVisibleRegion:visibleRegionText.label + northeast:&originalNortheast + southwest:&originalSouthwest]; + XCTAssertGreaterThan(originalNortheast.latitude, originalSouthwest.latitude); + XCTAssertGreaterThan(originalNortheast.longitude, originalSouthwest.longitude); + + XCTAssertLessThan(originalNortheast.latitude, 0); + XCTAssertLessThan(originalSouthwest.latitude, 0); + XCTAssertGreaterThan(originalNortheast.longitude, 0); + XCTAssertGreaterThan(originalSouthwest.longitude, 0); + + // Drag the map upward to under the title bar. + [platformView pressForDuration:0 thenDragToElement:titleBar]; + + CLLocationCoordinate2D draggedNortheast; + CLLocationCoordinate2D draggedSouthwest; + [self validateVisibleRegion:visibleRegionText.label + northeast:&draggedNortheast + southwest:&draggedSouthwest]; + XCTAssertEqual(originalNortheast.latitude, draggedNortheast.latitude); + XCTAssertEqual(originalNortheast.longitude, draggedNortheast.longitude); + XCTAssertEqual(originalSouthwest.latitude, draggedSouthwest.latitude); + XCTAssertEqual(originalSouthwest.latitude, draggedSouthwest.latitude); +} + +- (void)validateVisibleRegion:(NSString *)label + northeast:(CLLocationCoordinate2D *)northeast + southwest:(CLLocationCoordinate2D *)southwest { + // String will be "VisibleRegion:\nnortheast: LatLng(-33.79495661816674, + // 151.313996873796),\nsouthwest: LatLng(-33.90900557679571, 151.10800322145224)" + NSScanner *scan = [NSScanner scannerWithString:label]; + + // northeast + [scan scanString:@"VisibleRegion:\nnortheast: LatLng(" intoString:NULL]; + double northeastLatitude; + [scan scanDouble:&northeastLatitude]; + [scan scanString:@", " intoString:NULL]; + XCTAssertNotEqual(northeastLatitude, 0); + double northeastLongitude; + [scan scanDouble:&northeastLongitude]; + XCTAssertNotEqual(northeastLongitude, 0); + + [scan scanString:@"),\nsouthwest: LatLng(" intoString:NULL]; + double southwestLatitude; + [scan scanDouble:&southwestLatitude]; + XCTAssertNotEqual(southwestLatitude, 0); + [scan scanString:@", " intoString:NULL]; + double southwestLongitude; + [scan scanDouble:&southwestLongitude]; + XCTAssertNotEqual(southwestLongitude, 0); + *northeast = CLLocationCoordinate2DMake(northeastLatitude, northeastLongitude); + *southwest = CLLocationCoordinate2DMake(southwestLatitude, southwestLongitude); +} + +- (void)testMapClickPage { + XCUIApplication *app = self.app; + XCUIElement *mapClick = app.staticTexts[@"Map click"]; + if (![mapClick waitForExistenceWithTimeout:kWaitTime]) { + os_log_error(OS_LOG_DEFAULT, "%@", app.debugDescription); + XCTFail(@"Failed due to not able to find 'Map click''"); + } + [mapClick tap]; + + XCUIElement *platformView = app.otherElements[@"platform_view[0]"]; + if (![platformView waitForExistenceWithTimeout:kWaitTime]) { + os_log_error(OS_LOG_DEFAULT, "%@", app.debugDescription); + XCTFail(@"Failed due to not able to find platform view"); + } + + [platformView tap]; + + XCUIElement *tapped = app.staticTexts[@"Tapped"]; + if (![tapped waitForExistenceWithTimeout:kWaitTime]) { + os_log_error(OS_LOG_DEFAULT, "%@", app.debugDescription); + XCTFail(@"Failed due to not able to find 'tapped''"); + } + + [platformView pressForDuration:5.0]; + + XCUIElement *longPressed = app.staticTexts[@"Long pressed"]; + if (![longPressed waitForExistenceWithTimeout:kWaitTime]) { + os_log_error(OS_LOG_DEFAULT, "%@", app.debugDescription); + XCTFail(@"Failed due to not able to find 'longPressed''"); + } +} + +- (void)forceTap:(XCUIElement *)button { + // iOS 16 introduced a bug where hittable is NO for buttons. We force hit the location of the + // button if that is the case. It is likely similar to + // https://github.com/flutter/flutter/issues/113377. + if (button.isHittable) { + [button tap]; + return; + } + XCUICoordinate *coordinate = [button coordinateWithNormalizedOffset:CGVectorMake(0, 0)]; + [coordinate tap]; +} + +- (void)testMarkerDraggingCallbacks { + XCUIApplication *application = [[XCUIApplication alloc] init]; + [application launch]; + XCUIElement *placeMarkerButton = application.staticTexts[@"Place marker"]; + if (![placeMarkerButton waitForExistenceWithTimeout:kWaitTime]) { + NSLog(@"application.debugDescription: %@", application.debugDescription); + XCTFail(@"Failed to find the Place marker button."); + } + [placeMarkerButton tap]; + + XCUIElement *Add = application.buttons[@"Add"]; + if (![Add waitForExistenceWithTimeout:kWaitTime]) { + NSLog(@"application.debugDescription: %@", application.debugDescription); + XCTFail(@"Failed to find the Add button."); + } + [Add tap]; + + XCUIElement *marker = application.buttons[@"marker_id_1"]; + if (![marker waitForExistenceWithTimeout:kWaitTime]) { + NSLog(@"application.debugDescription: %@", application.debugDescription); + XCTFail(@"Failed to find the marker."); + } + [marker tap]; + + XCUIElement *toggleDraggable = application.buttons[@"toggle draggable"]; + if (![toggleDraggable waitForExistenceWithTimeout:kWaitTime]) { + NSLog(@"application.debugDescription: %@", application.debugDescription); + XCTFail(@"Failed to find the toggle draggable."); + } + [toggleDraggable tap]; + + // Drag marker to center + [marker pressForDuration:5 thenDragToElement:application]; + + NSPredicate *predicateDragStart = + [NSPredicate predicateWithFormat:@"label CONTAINS[c] %@", @"_onMarkerDragStart"]; + NSPredicate *predicateDrag = + [NSPredicate predicateWithFormat:@"label CONTAINS[c] %@", @"_onMarkerDrag called"]; + NSPredicate *predicateDragEnd = + [NSPredicate predicateWithFormat:@"label CONTAINS[c] %@", @"_onMarkerDragEnd"]; + + XCUIElement *dragStart = [application.staticTexts matchingPredicate:predicateDragStart].element; + if (![dragStart waitForExistenceWithTimeout:kWaitTime]) { + NSLog(@"application.debugDescription: %@", application.debugDescription); + XCTFail(@"Failed to find the _onMarkerDragStart."); + } + XCTAssertTrue(dragStart.exists); + + XCUIElement *drag = [application.staticTexts matchingPredicate:predicateDrag].element; + if (![drag waitForExistenceWithTimeout:kWaitTime]) { + NSLog(@"application.debugDescription: %@", application.debugDescription); + XCTFail(@"Failed to find the _onMarkerDrag."); + } + XCTAssertTrue(drag.exists); + + XCUIElement *dragEnd = [application.staticTexts matchingPredicate:predicateDragEnd].element; + if (![dragEnd waitForExistenceWithTimeout:kWaitTime]) { + NSLog(@"application.debugDescription: %@", application.debugDescription); + XCTFail(@"Failed to find the _onMarkerDragEnd."); + } + XCTAssertTrue(dragEnd.exists); +} + +@end diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/RunnerUITests/Info.plist b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/RunnerUITests/Info.plist new file mode 100644 index 00000000000..64d65ca4957 --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/RunnerUITests/Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + $(PRODUCT_BUNDLE_PACKAGE_TYPE) + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + + diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/lib/main.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/lib/main.dart new file mode 100644 index 00000000000..09fa814fdcf --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/lib/main.dart @@ -0,0 +1,45 @@ +// Copyright 2013 The Flutter Authors. 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/material.dart'; +import 'package:maps_example_dart/animate_camera.dart'; +import 'package:maps_example_dart/lite_mode.dart'; +import 'package:maps_example_dart/map_click.dart'; +import 'package:maps_example_dart/map_coordinates.dart'; +import 'package:maps_example_dart/map_map_id.dart'; +import 'package:maps_example_dart/map_ui.dart'; +import 'package:maps_example_dart/maps_demo.dart'; +import 'package:maps_example_dart/marker_icons.dart'; +import 'package:maps_example_dart/move_camera.dart'; +import 'package:maps_example_dart/padding.dart'; +import 'package:maps_example_dart/page.dart'; +import 'package:maps_example_dart/place_circle.dart'; +import 'package:maps_example_dart/place_marker.dart'; +import 'package:maps_example_dart/place_polygon.dart'; +import 'package:maps_example_dart/place_polyline.dart'; +import 'package:maps_example_dart/scrolling_map.dart'; +import 'package:maps_example_dart/snapshot.dart'; +import 'package:maps_example_dart/tile_overlay.dart'; + +void main() { + runApp(const MaterialApp( + home: MapsDemo([ + MapUiPage(), + MapCoordinatesPage(), + MapClickPage(), + AnimateCameraPage(), + MoveCameraPage(), + PlaceMarkerPage(), + MarkerIconsPage(), + ScrollingMapPage(), + PlacePolylinePage(), + PlacePolygonPage(), + PlaceCirclePage(), + PaddingPage(), + SnapshotPage(), + LiteModePage(), + TileOverlayPage(), + MapIdPage(), + ]))); +} diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/pubspec.yaml b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/pubspec.yaml new file mode 100644 index 00000000000..0c50df87f12 --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/pubspec.yaml @@ -0,0 +1,34 @@ +name: google_maps_flutter_example +description: Demonstrates how to use the google_maps_flutter plugin. +publish_to: none + +environment: + sdk: ^3.2.3 + flutter: ">=3.16.6" + +dependencies: + cupertino_icons: ^1.0.5 + flutter: + sdk: flutter + flutter_plugin_android_lifecycle: ^2.0.1 + google_maps_flutter_ios: + # When depending on this package from a real application you should use: + # google_maps_flutter_ios: ^x.y.z + # See https://dart.dev/tools/pub/dependencies#version-constraints + # The example app is bundled with the plugin so we use a path dependency on + # the parent directory to use the current plugin's version. + path: ../../ + google_maps_flutter_platform_interface: ^2.7.0 + maps_example_dart: + path: ../shared/maps_example_dart/ + +dev_dependencies: + flutter_test: + sdk: flutter + integration_test: + sdk: flutter + +flutter: + uses-material-design: true + assets: + - assets/ diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/test_driver/integration_test.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/test_driver/integration_test.dart new file mode 100644 index 00000000000..4f10f2a522f --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/test_driver/integration_test.dart @@ -0,0 +1,7 @@ +// Copyright 2013 The Flutter Authors. 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:integration_test/integration_test_driver.dart'; + +Future main() => integrationDriver(); From 184316fb8ed6b8674c8b632381e300a409065689 Mon Sep 17 00:00:00 2001 From: Stuart Morgan Date: Mon, 10 Jun 2024 15:34:34 -0400 Subject: [PATCH 2/5] Remove most duplicate tests, update iOS versions --- .../example/ios15/README.md | 2 +- .../integration_test/google_maps_test.dart | 1256 ----------------- .../integration_test/resources/icon_image.png | Bin 1257 -> 0 bytes .../resources/icon_image_base64.dart | 49 - .../example/ios15/ios/Podfile | 2 +- .../ios/Runner.xcodeproj/project.pbxproj | 160 +-- .../xcshareddata/xcschemes/Runner.xcscheme | 18 + .../RunnerTests/ExtractIconFromDataTests.m | 371 ----- ...TGoogleMapJSONConversionsConversionTests.m | 305 ---- .../FLTTileProviderControllerTests.m | 32 - .../GoogleMapsPolylinesControllerTests.m | 81 -- .../ios/RunnerUITests/GoogleMapsUITests.m | 277 ---- .../ios15/ios/RunnerUITests/Info.plist | 22 - .../ios15/test_driver/integration_test.dart | 7 - 14 files changed, 45 insertions(+), 2537 deletions(-) delete mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/integration_test/google_maps_test.dart delete mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/integration_test/resources/icon_image.png delete mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/integration_test/resources/icon_image_base64.dart delete mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/RunnerTests/ExtractIconFromDataTests.m delete mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/RunnerTests/FLTGoogleMapJSONConversionsConversionTests.m delete mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/RunnerTests/FLTTileProviderControllerTests.m delete mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/RunnerTests/GoogleMapsPolylinesControllerTests.m delete mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/RunnerUITests/GoogleMapsUITests.m delete mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/RunnerUITests/Info.plist delete mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/test_driver/integration_test.dart diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/README.md b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/README.md index 2d527ff468c..4101b085648 100644 --- a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/README.md +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/README.md @@ -10,4 +10,4 @@ very unlikely to be relevant. ## Versions -This example requires iOS 14, so will select a 8.x GoogleMaps SDK version. +This example requires iOS 15, so will select a 9.x GoogleMaps SDK version. diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/integration_test/google_maps_test.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/integration_test/google_maps_test.dart deleted file mode 100644 index db8b3956763..00000000000 --- a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/integration_test/google_maps_test.dart +++ /dev/null @@ -1,1256 +0,0 @@ -// Copyright 2013 The Flutter Authors. 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 'dart:convert'; -import 'dart:typed_data'; -import 'dart:ui' as ui; - -import 'package:flutter/material.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart'; -import 'package:integration_test/integration_test.dart'; -import 'package:maps_example_dart/example_google_map.dart'; - -import 'resources/icon_image_base64.dart'; - -const LatLng _kInitialMapCenter = LatLng(0, 0); -const double _kInitialZoomLevel = 5; -const CameraPosition _kInitialCameraPosition = - CameraPosition(target: _kInitialMapCenter, zoom: _kInitialZoomLevel); -const String _kCloudMapId = '000000000000000'; // Dummy map ID. - -void main() { - IntegrationTestWidgetsFlutterBinding.ensureInitialized(); - GoogleMapsFlutterPlatform.instance.enableDebugInspection(); - - testWidgets('testCompassToggle', (WidgetTester tester) async { - final Key key = GlobalKey(); - final Completer mapIdCompleter = Completer(); - await tester.pumpWidget(Directionality( - textDirection: TextDirection.ltr, - child: ExampleGoogleMap( - key: key, - initialCameraPosition: _kInitialCameraPosition, - compassEnabled: false, - onMapCreated: (ExampleGoogleMapController controller) { - mapIdCompleter.complete(controller.mapId); - }, - ), - )); - - final int mapId = await mapIdCompleter.future; - final GoogleMapsInspectorPlatform inspector = - GoogleMapsInspectorPlatform.instance!; - bool compassEnabled = await inspector.isCompassEnabled(mapId: mapId); - expect(compassEnabled, false); - - await tester.pumpWidget(Directionality( - textDirection: TextDirection.ltr, - child: ExampleGoogleMap( - key: key, - initialCameraPosition: _kInitialCameraPosition, - onMapCreated: (ExampleGoogleMapController controller) { - fail('OnMapCreated should get called only once.'); - }, - ), - )); - - compassEnabled = await inspector.isCompassEnabled(mapId: mapId); - expect(compassEnabled, true); - }); - - testWidgets('testMapToolbar returns false', (WidgetTester tester) async { - final Key key = GlobalKey(); - final Completer mapIdCompleter = Completer(); - - await tester.pumpWidget(Directionality( - textDirection: TextDirection.ltr, - child: ExampleGoogleMap( - key: key, - initialCameraPosition: _kInitialCameraPosition, - onMapCreated: (ExampleGoogleMapController controller) { - mapIdCompleter.complete(controller.mapId); - }, - ), - )); - - final int mapId = await mapIdCompleter.future; - final GoogleMapsInspectorPlatform inspector = - GoogleMapsInspectorPlatform.instance!; - final bool mapToolbarEnabled = - await inspector.isMapToolbarEnabled(mapId: mapId); - // This is only supported on Android, so should always return false. - expect(mapToolbarEnabled, false); - }); - - testWidgets('updateMinMaxZoomLevels', (WidgetTester tester) async { - final Key key = GlobalKey(); - final Completer controllerCompleter = - Completer(); - - const MinMaxZoomPreference initialZoomLevel = MinMaxZoomPreference(4, 8); - const MinMaxZoomPreference finalZoomLevel = MinMaxZoomPreference(6, 10); - - await tester.pumpWidget(Directionality( - textDirection: TextDirection.ltr, - child: ExampleGoogleMap( - key: key, - initialCameraPosition: _kInitialCameraPosition, - minMaxZoomPreference: initialZoomLevel, - onMapCreated: (ExampleGoogleMapController c) async { - controllerCompleter.complete(c); - }, - ), - )); - - final ExampleGoogleMapController controller = - await controllerCompleter.future; - final GoogleMapsInspectorPlatform inspector = - GoogleMapsInspectorPlatform.instance!; - - MinMaxZoomPreference zoomLevel = - await inspector.getMinMaxZoomLevels(mapId: controller.mapId); - expect(zoomLevel, equals(initialZoomLevel)); - - await tester.pumpWidget(Directionality( - textDirection: TextDirection.ltr, - child: ExampleGoogleMap( - key: key, - initialCameraPosition: _kInitialCameraPosition, - minMaxZoomPreference: finalZoomLevel, - onMapCreated: (ExampleGoogleMapController controller) { - fail('OnMapCreated should get called only once.'); - }, - ), - )); - - zoomLevel = await inspector.getMinMaxZoomLevels(mapId: controller.mapId); - expect(zoomLevel, equals(finalZoomLevel)); - }); - - testWidgets('testZoomGesturesEnabled', (WidgetTester tester) async { - final Key key = GlobalKey(); - final Completer mapIdCompleter = Completer(); - - await tester.pumpWidget(Directionality( - textDirection: TextDirection.ltr, - child: ExampleGoogleMap( - key: key, - initialCameraPosition: _kInitialCameraPosition, - zoomGesturesEnabled: false, - onMapCreated: (ExampleGoogleMapController controller) { - mapIdCompleter.complete(controller.mapId); - }, - ), - )); - - final int mapId = await mapIdCompleter.future; - final GoogleMapsInspectorPlatform inspector = - GoogleMapsInspectorPlatform.instance!; - bool zoomGesturesEnabled = - await inspector.areZoomGesturesEnabled(mapId: mapId); - expect(zoomGesturesEnabled, false); - - await tester.pumpWidget(Directionality( - textDirection: TextDirection.ltr, - child: ExampleGoogleMap( - key: key, - initialCameraPosition: _kInitialCameraPosition, - onMapCreated: (ExampleGoogleMapController controller) { - fail('OnMapCreated should get called only once.'); - }, - ), - )); - - zoomGesturesEnabled = await inspector.areZoomGesturesEnabled(mapId: mapId); - expect(zoomGesturesEnabled, true); - }); - - testWidgets('testZoomControlsEnabled', (WidgetTester tester) async { - final Key key = GlobalKey(); - final Completer mapIdCompleter = Completer(); - - await tester.pumpWidget(Directionality( - textDirection: TextDirection.ltr, - child: ExampleGoogleMap( - key: key, - initialCameraPosition: _kInitialCameraPosition, - onMapCreated: (ExampleGoogleMapController controller) { - mapIdCompleter.complete(controller.mapId); - }, - ), - )); - - final int mapId = await mapIdCompleter.future; - final GoogleMapsInspectorPlatform inspector = - GoogleMapsInspectorPlatform.instance!; - final bool zoomControlsEnabled = - await inspector.areZoomControlsEnabled(mapId: mapId); - - /// Zoom Controls functionality is not available on iOS at the moment. - expect(zoomControlsEnabled, false); - }); - - testWidgets('testRotateGesturesEnabled', (WidgetTester tester) async { - final Key key = GlobalKey(); - final Completer mapIdCompleter = Completer(); - - await tester.pumpWidget(Directionality( - textDirection: TextDirection.ltr, - child: ExampleGoogleMap( - key: key, - initialCameraPosition: _kInitialCameraPosition, - rotateGesturesEnabled: false, - onMapCreated: (ExampleGoogleMapController controller) { - mapIdCompleter.complete(controller.mapId); - }, - ), - )); - - final int mapId = await mapIdCompleter.future; - final GoogleMapsInspectorPlatform inspector = - GoogleMapsInspectorPlatform.instance!; - bool rotateGesturesEnabled = - await inspector.areRotateGesturesEnabled(mapId: mapId); - expect(rotateGesturesEnabled, false); - - await tester.pumpWidget(Directionality( - textDirection: TextDirection.ltr, - child: ExampleGoogleMap( - key: key, - initialCameraPosition: _kInitialCameraPosition, - onMapCreated: (ExampleGoogleMapController controller) { - fail('OnMapCreated should get called only once.'); - }, - ), - )); - - rotateGesturesEnabled = - await inspector.areRotateGesturesEnabled(mapId: mapId); - expect(rotateGesturesEnabled, true); - }); - - testWidgets('testTiltGesturesEnabled', (WidgetTester tester) async { - final Key key = GlobalKey(); - final Completer mapIdCompleter = Completer(); - - await tester.pumpWidget(Directionality( - textDirection: TextDirection.ltr, - child: ExampleGoogleMap( - key: key, - initialCameraPosition: _kInitialCameraPosition, - tiltGesturesEnabled: false, - onMapCreated: (ExampleGoogleMapController controller) { - mapIdCompleter.complete(controller.mapId); - }, - ), - )); - - final int mapId = await mapIdCompleter.future; - final GoogleMapsInspectorPlatform inspector = - GoogleMapsInspectorPlatform.instance!; - bool tiltGesturesEnabled = - await inspector.areTiltGesturesEnabled(mapId: mapId); - expect(tiltGesturesEnabled, false); - - await tester.pumpWidget(Directionality( - textDirection: TextDirection.ltr, - child: ExampleGoogleMap( - key: key, - initialCameraPosition: _kInitialCameraPosition, - onMapCreated: (ExampleGoogleMapController controller) { - fail('OnMapCreated should get called only once.'); - }, - ), - )); - - tiltGesturesEnabled = await inspector.areTiltGesturesEnabled(mapId: mapId); - expect(tiltGesturesEnabled, true); - }); - - testWidgets('testScrollGesturesEnabled', (WidgetTester tester) async { - final Key key = GlobalKey(); - final Completer mapIdCompleter = Completer(); - - await tester.pumpWidget(Directionality( - textDirection: TextDirection.ltr, - child: ExampleGoogleMap( - key: key, - initialCameraPosition: _kInitialCameraPosition, - scrollGesturesEnabled: false, - onMapCreated: (ExampleGoogleMapController controller) { - mapIdCompleter.complete(controller.mapId); - }, - ), - )); - - final int mapId = await mapIdCompleter.future; - final GoogleMapsInspectorPlatform inspector = - GoogleMapsInspectorPlatform.instance!; - bool scrollGesturesEnabled = - await inspector.areScrollGesturesEnabled(mapId: mapId); - expect(scrollGesturesEnabled, false); - - await tester.pumpWidget(Directionality( - textDirection: TextDirection.ltr, - child: ExampleGoogleMap( - key: key, - initialCameraPosition: _kInitialCameraPosition, - onMapCreated: (ExampleGoogleMapController controller) { - fail('OnMapCreated should get called only once.'); - }, - ), - )); - - scrollGesturesEnabled = - await inspector.areScrollGesturesEnabled(mapId: mapId); - expect(scrollGesturesEnabled, true); - }); - - testWidgets('testInitialCenterLocationAtCenter', (WidgetTester tester) async { - await tester.binding.setSurfaceSize(const Size(800, 600)); - - final Completer mapControllerCompleter = - Completer(); - final Key key = GlobalKey(); - await tester.pumpWidget( - Directionality( - textDirection: TextDirection.ltr, - child: ExampleGoogleMap( - key: key, - initialCameraPosition: _kInitialCameraPosition, - onMapCreated: (ExampleGoogleMapController controller) { - mapControllerCompleter.complete(controller); - }, - ), - ), - ); - final ExampleGoogleMapController mapController = - await mapControllerCompleter.future; - - await tester.pumpAndSettle(); - - // TODO(cyanglaz): Remove this after we added `mapRendered` callback, and `mapControllerCompleter.complete(controller)` above should happen - // in `mapRendered`. - // https://github.com/flutter/flutter/issues/54758 - await Future.delayed(const Duration(seconds: 1)); - - final ScreenCoordinate coordinate = - await mapController.getScreenCoordinate(_kInitialCameraPosition.target); - final Rect rect = tester.getRect(find.byKey(key)); - expect(coordinate.x, (rect.center.dx - rect.topLeft.dx).round()); - expect(coordinate.y, (rect.center.dy - rect.topLeft.dy).round()); - - await tester.binding.setSurfaceSize(null); - }, - // TODO(stuartmorgan): Re-enable; see https://github.com/flutter/flutter/issues/139825 - skip: true); - - testWidgets('testGetVisibleRegion', (WidgetTester tester) async { - final Key key = GlobalKey(); - final LatLngBounds zeroLatLngBounds = LatLngBounds( - southwest: const LatLng(0, 0), northeast: const LatLng(0, 0)); - - final Completer mapControllerCompleter = - Completer(); - - await tester.pumpWidget(Directionality( - textDirection: TextDirection.ltr, - child: ExampleGoogleMap( - key: key, - initialCameraPosition: _kInitialCameraPosition, - onMapCreated: (ExampleGoogleMapController controller) { - mapControllerCompleter.complete(controller); - }, - ), - )); - await tester.pumpAndSettle(); - - final ExampleGoogleMapController mapController = - await mapControllerCompleter.future; - - final LatLngBounds firstVisibleRegion = - await mapController.getVisibleRegion(); - - expect(firstVisibleRegion, isNotNull); - expect(firstVisibleRegion.southwest, isNotNull); - expect(firstVisibleRegion.northeast, isNotNull); - expect(firstVisibleRegion, isNot(zeroLatLngBounds)); - expect(firstVisibleRegion.contains(_kInitialMapCenter), isTrue); - - // Making a new `LatLngBounds` about (10, 10) distance south west to the `firstVisibleRegion`. - // The size of the `LatLngBounds` is 10 by 10. - final LatLng southWest = LatLng(firstVisibleRegion.southwest.latitude - 20, - firstVisibleRegion.southwest.longitude - 20); - final LatLng northEast = LatLng(firstVisibleRegion.southwest.latitude - 10, - firstVisibleRegion.southwest.longitude - 10); - final LatLng newCenter = LatLng( - (northEast.latitude + southWest.latitude) / 2, - (northEast.longitude + southWest.longitude) / 2, - ); - - expect(firstVisibleRegion.contains(northEast), isFalse); - expect(firstVisibleRegion.contains(southWest), isFalse); - - final LatLngBounds latLngBounds = - LatLngBounds(southwest: southWest, northeast: northEast); - - // TODO(iskakaushik): non-zero padding is needed for some device configurations - // https://github.com/flutter/flutter/issues/30575 - const double padding = 0; - await mapController - .moveCamera(CameraUpdate.newLatLngBounds(latLngBounds, padding)); - await tester.pumpAndSettle(const Duration(seconds: 3)); - - final LatLngBounds secondVisibleRegion = - await mapController.getVisibleRegion(); - - expect(secondVisibleRegion, isNotNull); - expect(secondVisibleRegion.southwest, isNotNull); - expect(secondVisibleRegion.northeast, isNotNull); - expect(secondVisibleRegion, isNot(zeroLatLngBounds)); - - expect(firstVisibleRegion, isNot(secondVisibleRegion)); - expect(secondVisibleRegion.contains(newCenter), isTrue); - }, - // TODO(stuartmorgan): Re-enable; see https://github.com/flutter/flutter/issues/139825 - skip: true); - - testWidgets('testTraffic', (WidgetTester tester) async { - final Key key = GlobalKey(); - final Completer mapIdCompleter = Completer(); - - await tester.pumpWidget(Directionality( - textDirection: TextDirection.ltr, - child: ExampleGoogleMap( - key: key, - initialCameraPosition: _kInitialCameraPosition, - trafficEnabled: true, - onMapCreated: (ExampleGoogleMapController controller) { - mapIdCompleter.complete(controller.mapId); - }, - ), - )); - - final int mapId = await mapIdCompleter.future; - final GoogleMapsInspectorPlatform inspector = - GoogleMapsInspectorPlatform.instance!; - bool isTrafficEnabled = await inspector.isTrafficEnabled(mapId: mapId); - expect(isTrafficEnabled, true); - - await tester.pumpWidget(Directionality( - textDirection: TextDirection.ltr, - child: ExampleGoogleMap( - key: key, - initialCameraPosition: _kInitialCameraPosition, - onMapCreated: (ExampleGoogleMapController controller) { - fail('OnMapCreated should get called only once.'); - }, - ), - )); - - isTrafficEnabled = await inspector.isTrafficEnabled(mapId: mapId); - expect(isTrafficEnabled, false); - }); - - testWidgets('testBuildings', (WidgetTester tester) async { - final Key key = GlobalKey(); - final Completer mapIdCompleter = Completer(); - - await tester.pumpWidget(Directionality( - textDirection: TextDirection.ltr, - child: ExampleGoogleMap( - key: key, - initialCameraPosition: _kInitialCameraPosition, - onMapCreated: (ExampleGoogleMapController controller) { - mapIdCompleter.complete(controller.mapId); - }, - ), - )); - - final int mapId = await mapIdCompleter.future; - final GoogleMapsInspectorPlatform inspector = - GoogleMapsInspectorPlatform.instance!; - final bool isBuildingsEnabled = - await inspector.areBuildingsEnabled(mapId: mapId); - expect(isBuildingsEnabled, true); - }); - - testWidgets('testMyLocationButtonToggle', (WidgetTester tester) async { - final Key key = GlobalKey(); - final Completer mapIdCompleter = Completer(); - - await tester.pumpWidget(Directionality( - textDirection: TextDirection.ltr, - child: ExampleGoogleMap( - key: key, - initialCameraPosition: _kInitialCameraPosition, - onMapCreated: (ExampleGoogleMapController controller) { - mapIdCompleter.complete(controller.mapId); - }, - ), - )); - - final int mapId = await mapIdCompleter.future; - final GoogleMapsInspectorPlatform inspector = - GoogleMapsInspectorPlatform.instance!; - bool myLocationButtonEnabled = - await inspector.isMyLocationButtonEnabled(mapId: mapId); - expect(myLocationButtonEnabled, true); - - await tester.pumpWidget(Directionality( - textDirection: TextDirection.ltr, - child: ExampleGoogleMap( - key: key, - initialCameraPosition: _kInitialCameraPosition, - myLocationButtonEnabled: false, - onMapCreated: (ExampleGoogleMapController controller) { - fail('OnMapCreated should get called only once.'); - }, - ), - )); - - myLocationButtonEnabled = - await inspector.isMyLocationButtonEnabled(mapId: mapId); - expect(myLocationButtonEnabled, false); - }); - - testWidgets('testMyLocationButton initial value false', - (WidgetTester tester) async { - final Key key = GlobalKey(); - final Completer mapIdCompleter = Completer(); - - await tester.pumpWidget(Directionality( - textDirection: TextDirection.ltr, - child: ExampleGoogleMap( - key: key, - initialCameraPosition: _kInitialCameraPosition, - myLocationButtonEnabled: false, - onMapCreated: (ExampleGoogleMapController controller) { - mapIdCompleter.complete(controller.mapId); - }, - ), - )); - - final int mapId = await mapIdCompleter.future; - final GoogleMapsInspectorPlatform inspector = - GoogleMapsInspectorPlatform.instance!; - final bool myLocationButtonEnabled = - await inspector.isMyLocationButtonEnabled(mapId: mapId); - expect(myLocationButtonEnabled, false); - }); - - testWidgets('testMyLocationButton initial value true', - (WidgetTester tester) async { - final Key key = GlobalKey(); - final Completer mapIdCompleter = Completer(); - - await tester.pumpWidget(Directionality( - textDirection: TextDirection.ltr, - child: ExampleGoogleMap( - key: key, - initialCameraPosition: _kInitialCameraPosition, - onMapCreated: (ExampleGoogleMapController controller) { - mapIdCompleter.complete(controller.mapId); - }, - ), - )); - - final int mapId = await mapIdCompleter.future; - final GoogleMapsInspectorPlatform inspector = - GoogleMapsInspectorPlatform.instance!; - final bool myLocationButtonEnabled = - await inspector.isMyLocationButtonEnabled(mapId: mapId); - expect(myLocationButtonEnabled, true); - }); - - testWidgets('testSetMapStyle valid Json String', (WidgetTester tester) async { - final Key key = GlobalKey(); - final Completer controllerCompleter = - Completer(); - - await tester.pumpWidget(Directionality( - textDirection: TextDirection.ltr, - child: ExampleGoogleMap( - key: key, - initialCameraPosition: _kInitialCameraPosition, - onMapCreated: (ExampleGoogleMapController controller) { - controllerCompleter.complete(controller); - }, - ), - )); - - final ExampleGoogleMapController controller = - await controllerCompleter.future; - const String mapStyle = - '[{"elementType":"geometry","stylers":[{"color":"#242f3e"}]}]'; - await GoogleMapsFlutterPlatform.instance - .setMapStyle(mapStyle, mapId: controller.mapId); - }); - - testWidgets('testSetMapStyle invalid Json String', - (WidgetTester tester) async { - final Key key = GlobalKey(); - final Completer controllerCompleter = - Completer(); - - await tester.pumpWidget(Directionality( - textDirection: TextDirection.ltr, - child: ExampleGoogleMap( - key: key, - initialCameraPosition: _kInitialCameraPosition, - onMapCreated: (ExampleGoogleMapController controller) { - controllerCompleter.complete(controller); - }, - ), - )); - - final ExampleGoogleMapController controller = - await controllerCompleter.future; - - try { - await GoogleMapsFlutterPlatform.instance - .setMapStyle('invalid_value', mapId: controller.mapId); - fail('expected MapStyleException'); - } on MapStyleException catch (e) { - expect(e.cause, isNotNull); - expect(await controller.getStyleError(), isNotNull); - } - }); - - testWidgets('testSetMapStyle null string', (WidgetTester tester) async { - final Key key = GlobalKey(); - final Completer controllerCompleter = - Completer(); - - await tester.pumpWidget(Directionality( - textDirection: TextDirection.ltr, - child: ExampleGoogleMap( - key: key, - initialCameraPosition: _kInitialCameraPosition, - onMapCreated: (ExampleGoogleMapController controller) { - controllerCompleter.complete(controller); - }, - ), - )); - - final ExampleGoogleMapController controller = - await controllerCompleter.future; - await GoogleMapsFlutterPlatform.instance - .setMapStyle(null, mapId: controller.mapId); - }); - - testWidgets('testGetLatLng', (WidgetTester tester) async { - final Key key = GlobalKey(); - final Completer controllerCompleter = - Completer(); - - await tester.pumpWidget(Directionality( - textDirection: TextDirection.ltr, - child: ExampleGoogleMap( - key: key, - initialCameraPosition: _kInitialCameraPosition, - onMapCreated: (ExampleGoogleMapController controller) { - controllerCompleter.complete(controller); - }, - ), - )); - - final ExampleGoogleMapController controller = - await controllerCompleter.future; - - await tester.pumpAndSettle(); - // TODO(cyanglaz): Remove this after we added `mapRendered` callback, and `mapControllerCompleter.complete(controller)` above should happen - // in `mapRendered`. - // https://github.com/flutter/flutter/issues/54758 - await Future.delayed(const Duration(seconds: 1)); - - final LatLngBounds visibleRegion = await controller.getVisibleRegion(); - final LatLng topLeft = - await controller.getLatLng(const ScreenCoordinate(x: 0, y: 0)); - final LatLng northWest = LatLng( - visibleRegion.northeast.latitude, - visibleRegion.southwest.longitude, - ); - - expect(topLeft, northWest); - }); - - testWidgets('testGetZoomLevel', (WidgetTester tester) async { - final Key key = GlobalKey(); - final Completer controllerCompleter = - Completer(); - - await tester.pumpWidget(Directionality( - textDirection: TextDirection.ltr, - child: ExampleGoogleMap( - key: key, - initialCameraPosition: _kInitialCameraPosition, - onMapCreated: (ExampleGoogleMapController controller) { - controllerCompleter.complete(controller); - }, - ), - )); - - final ExampleGoogleMapController controller = - await controllerCompleter.future; - - await tester.pumpAndSettle(); - // TODO(cyanglaz): Remove this after we added `mapRendered` callback, and `mapControllerCompleter.complete(controller)` above should happen - // in `mapRendered`. - // https://github.com/flutter/flutter/issues/54758 - await Future.delayed(const Duration(seconds: 1)); - - double zoom = await controller.getZoomLevel(); - expect(zoom, _kInitialZoomLevel); - - await controller.moveCamera(CameraUpdate.zoomTo(7)); - await tester.pumpAndSettle(); - zoom = await controller.getZoomLevel(); - expect(zoom, equals(7)); - }, - // TODO(stuartmorgan): Re-enable; see https://github.com/flutter/flutter/issues/139825 - skip: true); - - testWidgets('testScreenCoordinate', (WidgetTester tester) async { - final Key key = GlobalKey(); - final Completer controllerCompleter = - Completer(); - - await tester.pumpWidget(Directionality( - textDirection: TextDirection.ltr, - child: ExampleGoogleMap( - key: key, - initialCameraPosition: _kInitialCameraPosition, - onMapCreated: (ExampleGoogleMapController controller) { - controllerCompleter.complete(controller); - }, - ), - )); - final ExampleGoogleMapController controller = - await controllerCompleter.future; - - await tester.pumpAndSettle(); - // TODO(cyanglaz): Remove this after we added `mapRendered` callback, and `mapControllerCompleter.complete(controller)` above should happen - // in `mapRendered`. - // https://github.com/flutter/flutter/issues/54758 - await Future.delayed(const Duration(seconds: 1)); - - final LatLngBounds visibleRegion = await controller.getVisibleRegion(); - final LatLng northWest = LatLng( - visibleRegion.northeast.latitude, - visibleRegion.southwest.longitude, - ); - final ScreenCoordinate topLeft = - await controller.getScreenCoordinate(northWest); - expect(topLeft, const ScreenCoordinate(x: 0, y: 0)); - }, - // TODO(stuartmorgan): Re-enable; see https://github.com/flutter/flutter/issues/139825 - skip: true); - - testWidgets('testResizeWidget', (WidgetTester tester) async { - final Completer controllerCompleter = - Completer(); - final ExampleGoogleMap map = ExampleGoogleMap( - initialCameraPosition: _kInitialCameraPosition, - onMapCreated: (ExampleGoogleMapController controller) async { - controllerCompleter.complete(controller); - }, - ); - await tester.pumpWidget(Directionality( - textDirection: TextDirection.ltr, - child: MaterialApp( - home: Scaffold( - body: SizedBox(height: 100, width: 100, child: map))))); - final ExampleGoogleMapController controller = - await controllerCompleter.future; - - await tester.pumpWidget(Directionality( - textDirection: TextDirection.ltr, - child: MaterialApp( - home: Scaffold( - body: SizedBox(height: 400, width: 400, child: map))))); - - await tester.pumpAndSettle(); - // TODO(cyanglaz): Remove this after we added `mapRendered` callback, and `mapControllerCompleter.complete(controller)` above should happen - // in `mapRendered`. - // https://github.com/flutter/flutter/issues/54758 - await Future.delayed(const Duration(seconds: 1)); - - // Simple call to make sure that the app hasn't crashed. - final LatLngBounds bounds1 = await controller.getVisibleRegion(); - final LatLngBounds bounds2 = await controller.getVisibleRegion(); - expect(bounds1, bounds2); - }); - - testWidgets('testToggleInfoWindow', (WidgetTester tester) async { - const Marker marker = Marker( - markerId: MarkerId('marker'), - infoWindow: InfoWindow(title: 'InfoWindow')); - final Set markers = {marker}; - - final Completer controllerCompleter = - Completer(); - - await tester.pumpWidget(Directionality( - textDirection: TextDirection.ltr, - child: ExampleGoogleMap( - initialCameraPosition: const CameraPosition(target: LatLng(10.0, 15.0)), - markers: markers, - onMapCreated: (ExampleGoogleMapController googleMapController) { - controllerCompleter.complete(googleMapController); - }, - ), - )); - - final ExampleGoogleMapController controller = - await controllerCompleter.future; - - bool iwVisibleStatus = - await controller.isMarkerInfoWindowShown(marker.markerId); - expect(iwVisibleStatus, false); - - await controller.showMarkerInfoWindow(marker.markerId); - iwVisibleStatus = await controller.isMarkerInfoWindowShown(marker.markerId); - expect(iwVisibleStatus, true); - - await controller.hideMarkerInfoWindow(marker.markerId); - iwVisibleStatus = await controller.isMarkerInfoWindowShown(marker.markerId); - expect(iwVisibleStatus, false); - }); - - testWidgets('testTakeSnapshot', (WidgetTester tester) async { - final Completer controllerCompleter = - Completer(); - - await tester.pumpWidget( - Directionality( - textDirection: TextDirection.ltr, - child: ExampleGoogleMap( - initialCameraPosition: _kInitialCameraPosition, - onMapCreated: (ExampleGoogleMapController controller) { - controllerCompleter.complete(controller); - }, - ), - ), - ); - - await tester.pumpAndSettle(const Duration(seconds: 3)); - - final ExampleGoogleMapController controller = - await controllerCompleter.future; - final Uint8List? bytes = await controller.takeSnapshot(); - expect(bytes?.isNotEmpty, true); - }, - // TODO(stuartmorgan): Re-enable; see https://github.com/flutter/flutter/issues/139825 - skip: true); - - testWidgets( - 'set tileOverlay correctly', - (WidgetTester tester) async { - final Completer mapIdCompleter = Completer(); - final TileOverlay tileOverlay1 = TileOverlay( - tileOverlayId: const TileOverlayId('tile_overlay_1'), - tileProvider: _DebugTileProvider(), - zIndex: 2, - transparency: 0.2, - ); - - final TileOverlay tileOverlay2 = TileOverlay( - tileOverlayId: const TileOverlayId('tile_overlay_2'), - tileProvider: _DebugTileProvider(), - zIndex: 1, - visible: false, - transparency: 0.3, - fadeIn: false, - ); - await tester.pumpWidget( - Directionality( - textDirection: TextDirection.ltr, - child: ExampleGoogleMap( - initialCameraPosition: _kInitialCameraPosition, - tileOverlays: {tileOverlay1, tileOverlay2}, - onMapCreated: (ExampleGoogleMapController controller) { - mapIdCompleter.complete(controller.mapId); - }, - ), - ), - ); - await tester.pumpAndSettle(const Duration(seconds: 3)); - - final int mapId = await mapIdCompleter.future; - final GoogleMapsInspectorPlatform inspector = - GoogleMapsInspectorPlatform.instance!; - - final TileOverlay tileOverlayInfo1 = (await inspector - .getTileOverlayInfo(tileOverlay1.mapsId, mapId: mapId))!; - final TileOverlay tileOverlayInfo2 = (await inspector - .getTileOverlayInfo(tileOverlay2.mapsId, mapId: mapId))!; - - expect(tileOverlayInfo1.visible, isTrue); - expect(tileOverlayInfo1.fadeIn, isTrue); - expect( - tileOverlayInfo1.transparency, moreOrLessEquals(0.2, epsilon: 0.001)); - expect(tileOverlayInfo1.zIndex, 2); - - expect(tileOverlayInfo2.visible, isFalse); - expect(tileOverlayInfo2.fadeIn, isFalse); - expect( - tileOverlayInfo2.transparency, moreOrLessEquals(0.3, epsilon: 0.001)); - expect(tileOverlayInfo2.zIndex, 1); - }, - ); - - testWidgets( - 'update tileOverlays correctly', - (WidgetTester tester) async { - final Completer mapIdCompleter = Completer(); - final Key key = GlobalKey(); - final TileOverlay tileOverlay1 = TileOverlay( - tileOverlayId: const TileOverlayId('tile_overlay_1'), - tileProvider: _DebugTileProvider(), - zIndex: 2, - transparency: 0.2, - ); - - final TileOverlay tileOverlay2 = TileOverlay( - tileOverlayId: const TileOverlayId('tile_overlay_2'), - tileProvider: _DebugTileProvider(), - zIndex: 3, - transparency: 0.5, - ); - await tester.pumpWidget( - Directionality( - textDirection: TextDirection.ltr, - child: ExampleGoogleMap( - key: key, - initialCameraPosition: _kInitialCameraPosition, - tileOverlays: {tileOverlay1, tileOverlay2}, - onMapCreated: (ExampleGoogleMapController controller) { - mapIdCompleter.complete(controller.mapId); - }, - ), - ), - ); - - final int mapId = await mapIdCompleter.future; - final GoogleMapsInspectorPlatform inspector = - GoogleMapsInspectorPlatform.instance!; - - final TileOverlay tileOverlay1New = TileOverlay( - tileOverlayId: const TileOverlayId('tile_overlay_1'), - tileProvider: _DebugTileProvider(), - zIndex: 1, - visible: false, - transparency: 0.3, - fadeIn: false, - ); - - await tester.pumpWidget( - Directionality( - textDirection: TextDirection.ltr, - child: ExampleGoogleMap( - key: key, - initialCameraPosition: _kInitialCameraPosition, - tileOverlays: {tileOverlay1New}, - onMapCreated: (ExampleGoogleMapController controller) { - fail('update: OnMapCreated should get called only once.'); - }, - ), - ), - ); - - await tester.pumpAndSettle(const Duration(seconds: 3)); - - final TileOverlay tileOverlayInfo1 = (await inspector - .getTileOverlayInfo(tileOverlay1.mapsId, mapId: mapId))!; - final TileOverlay? tileOverlayInfo2 = - await inspector.getTileOverlayInfo(tileOverlay2.mapsId, mapId: mapId); - - expect(tileOverlayInfo1.visible, isFalse); - expect(tileOverlayInfo1.fadeIn, isFalse); - expect( - tileOverlayInfo1.transparency, moreOrLessEquals(0.3, epsilon: 0.001)); - expect(tileOverlayInfo1.zIndex, 1); - - expect(tileOverlayInfo2, isNull); - }, - ); - - testWidgets( - 'remove tileOverlays correctly', - (WidgetTester tester) async { - final Completer mapIdCompleter = Completer(); - final Key key = GlobalKey(); - final TileOverlay tileOverlay1 = TileOverlay( - tileOverlayId: const TileOverlayId('tile_overlay_1'), - tileProvider: _DebugTileProvider(), - zIndex: 2, - transparency: 0.2, - ); - - await tester.pumpWidget( - Directionality( - textDirection: TextDirection.ltr, - child: ExampleGoogleMap( - key: key, - initialCameraPosition: _kInitialCameraPosition, - tileOverlays: {tileOverlay1}, - onMapCreated: (ExampleGoogleMapController controller) { - mapIdCompleter.complete(controller.mapId); - }, - ), - ), - ); - - final int mapId = await mapIdCompleter.future; - final GoogleMapsInspectorPlatform inspector = - GoogleMapsInspectorPlatform.instance!; - - await tester.pumpWidget( - Directionality( - textDirection: TextDirection.ltr, - child: ExampleGoogleMap( - key: key, - initialCameraPosition: _kInitialCameraPosition, - onMapCreated: (ExampleGoogleMapController controller) { - fail('OnMapCreated should get called only once.'); - }, - ), - ), - ); - - await tester.pumpAndSettle(const Duration(seconds: 3)); - final TileOverlay? tileOverlayInfo1 = - await inspector.getTileOverlayInfo(tileOverlay1.mapsId, mapId: mapId); - - expect(tileOverlayInfo1, isNull); - }, - ); - - testWidgets('testSetStyleMapId', (WidgetTester tester) async { - final Key key = GlobalKey(); - - await tester.pumpWidget(Directionality( - textDirection: TextDirection.ltr, - child: ExampleGoogleMap( - key: key, - initialCameraPosition: _kInitialCameraPosition, - cloudMapId: _kCloudMapId, - ), - )); - }); - - testWidgets('getStyleError reports last error', (WidgetTester tester) async { - final Key key = GlobalKey(); - final Completer controllerCompleter = - Completer(); - - await tester.pumpWidget(Directionality( - textDirection: TextDirection.ltr, - child: ExampleGoogleMap( - key: key, - initialCameraPosition: _kInitialCameraPosition, - style: '[[[this is an invalid style', - onMapCreated: (ExampleGoogleMapController controller) { - controllerCompleter.complete(controller); - }, - ), - )); - - final ExampleGoogleMapController controller = - await controllerCompleter.future; - final String? error = await controller.getStyleError(); - expect(error, isNotNull); - }); - - testWidgets('getStyleError returns null for a valid style', - (WidgetTester tester) async { - final Key key = GlobalKey(); - final Completer controllerCompleter = - Completer(); - - await tester.pumpWidget(Directionality( - textDirection: TextDirection.ltr, - child: ExampleGoogleMap( - key: key, - initialCameraPosition: _kInitialCameraPosition, - // An empty array is the simplest valid style. - style: '[]', - onMapCreated: (ExampleGoogleMapController controller) { - controllerCompleter.complete(controller); - }, - ), - )); - - final ExampleGoogleMapController controller = - await controllerCompleter.future; - final String? error = await controller.getStyleError(); - expect(error, isNull); - }); - - testWidgets('markerWithAssetMapBitmap', (WidgetTester tester) async { - final Set markers = { - Marker( - markerId: const MarkerId('1'), - icon: AssetMapBitmap( - 'assets/red_square.png', - imagePixelRatio: 1.0, - )), - }; - await tester.pumpWidget(Directionality( - textDirection: TextDirection.ltr, - child: ExampleGoogleMap( - initialCameraPosition: const CameraPosition(target: LatLng(10.0, 15.0)), - markers: markers, - ), - )); - - await tester.pumpAndSettle(); - }); - - testWidgets('markerWithAssetMapBitmapCreate', (WidgetTester tester) async { - final ImageConfiguration imageConfiguration = ImageConfiguration( - devicePixelRatio: tester.view.devicePixelRatio, - ); - final Set markers = { - Marker( - markerId: const MarkerId('1'), - icon: await AssetMapBitmap.create( - imageConfiguration, - 'assets/red_square.png', - )), - }; - await tester.pumpWidget(Directionality( - textDirection: TextDirection.ltr, - child: ExampleGoogleMap( - initialCameraPosition: const CameraPosition(target: LatLng(10.0, 15.0)), - markers: markers, - ), - )); - - await tester.pumpAndSettle(); - }); - - testWidgets('markerWithBytesMapBitmap', (WidgetTester tester) async { - final Uint8List bytes = const Base64Decoder().convert(iconImageBase64); - final Set markers = { - Marker( - markerId: const MarkerId('1'), - icon: BytesMapBitmap( - bytes, - imagePixelRatio: tester.view.devicePixelRatio, - ), - ), - }; - - await tester.pumpWidget(Directionality( - textDirection: TextDirection.ltr, - child: ExampleGoogleMap( - initialCameraPosition: const CameraPosition(target: LatLng(10.0, 15.0)), - markers: markers, - ), - )); - - await tester.pumpAndSettle(); - }); - - testWidgets('markerWithLegacyAsset', (WidgetTester tester) async { - //tester.view.devicePixelRatio = 2.0; - const ImageConfiguration imageConfiguration = ImageConfiguration( - devicePixelRatio: 2.0, - size: Size(100, 100), - ); - final Set markers = { - Marker( - markerId: const MarkerId('1'), - icon: await BitmapDescriptor.fromAssetImage( - imageConfiguration, - 'assets/red_square.png', - )), - }; - final Completer controllerCompleter = - Completer(); - await tester.pumpWidget(Directionality( - textDirection: TextDirection.ltr, - child: ExampleGoogleMap( - initialCameraPosition: const CameraPosition(target: LatLng(10.0, 15.0)), - markers: markers, - onMapCreated: (ExampleGoogleMapController controller) => - controllerCompleter.complete(controller), - ), - )); - - await controllerCompleter.future; - }); - - testWidgets('markerWithLegacyBytes', (WidgetTester tester) async { - tester.view.devicePixelRatio = 2.0; - final Uint8List bytes = const Base64Decoder().convert(iconImageBase64); - final BitmapDescriptor icon = BitmapDescriptor.fromBytes( - bytes, - ); - - final Set markers = { - Marker(markerId: const MarkerId('1'), icon: icon), - }; - final Completer controllerCompleter = - Completer(); - await tester.pumpWidget(Directionality( - textDirection: TextDirection.ltr, - child: ExampleGoogleMap( - initialCameraPosition: const CameraPosition(target: LatLng(10.0, 15.0)), - markers: markers, - onMapCreated: (ExampleGoogleMapController controller) => - controllerCompleter.complete(controller), - ), - )); - await controllerCompleter.future; - }); -} - -class _DebugTileProvider implements TileProvider { - _DebugTileProvider() { - boxPaint.isAntiAlias = true; - boxPaint.color = Colors.blue; - boxPaint.strokeWidth = 2.0; - boxPaint.style = PaintingStyle.stroke; - } - - static const int width = 100; - static const int height = 100; - static final Paint boxPaint = Paint(); - static const TextStyle textStyle = TextStyle( - color: Colors.red, - fontSize: 20, - ); - - @override - Future getTile(int x, int y, int? zoom) async { - final ui.PictureRecorder recorder = ui.PictureRecorder(); - final Canvas canvas = Canvas(recorder); - final TextSpan textSpan = TextSpan( - text: '$x,$y', - style: textStyle, - ); - final TextPainter textPainter = TextPainter( - text: textSpan, - textDirection: TextDirection.ltr, - ); - textPainter.layout( - maxWidth: width.toDouble(), - ); - textPainter.paint(canvas, Offset.zero); - canvas.drawRect( - Rect.fromLTRB(0, 0, width.toDouble(), width.toDouble()), boxPaint); - final ui.Picture picture = recorder.endRecording(); - final Uint8List byteData = await picture - .toImage(width, height) - .then((ui.Image image) => - image.toByteData(format: ui.ImageByteFormat.png)) - .then((ByteData? byteData) => byteData!.buffer.asUint8List()); - return Tile(width, height, byteData); - } -} diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/integration_test/resources/icon_image.png b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/integration_test/resources/icon_image.png deleted file mode 100644 index 920b93f74d7875578cfddd9fb3a86ffc91cc66aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1257 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|T2doC(|mmy zw18|523AHP24;{FAY@>aVqgWc85q16rQz%#Mh&PMCI*J~Oa>OHnkXO*0v4nJa0`PlBg3pY5xV%QuQiw3qZOUY$~jP%-qzHM1_jnoV;SI3R@+x3M(KRB&@Hb09I0xZL1XF8=&Bv zUzDm~s%N5Spk&9TprBw=l#*r@P?Wt5Z@Sn2DRmzV368|&p4rRy77T3YHG z80i}s=>k>g7FXt#Bv$C=6)QswftllyTAW;zSx}OhpQivaH!&%{w8U0P31kr*K-^i9 znTD__uNdkrpa=CqGWv#k2KsQbfm&@qqE`MznW;dVLFU^T+JIG}h(YbK(Fa+MGhS)(5hysGVj@1S=_(gPCCO{ zqhwks#Vc``|8 z#o#O*d;N2|BC{jvU{z}(n^^Vap!a1%`y(*n{sOkJ|#X3oe;O!Zo?Dnhr)@GQ`z`?mdD=yHSxr< zDy_rs-x{jCabub6U?S+*S@!Va>4+T*Hmzz(*!gva0^=QR?pv-qbGCN6d|Si4{*vsJ zlH0zk1sd5rv=;3+XYfL0!@WaC`Ahb=eYxm+=guaBQ~enqLO(hNXMfPrI^{pDhK z-4_e9Y*sb;Jj~0Qs$sV`^@y=`QNlJK=FPXKOL(O1`}w`Gn*UDUbd&Ixz5e<2va`xH z41-N}zw;G7BCl8SdS-H5ozdgaGryVtGld%!O3p1V7HRwR?9co=RqwyAbPax;#ec&s zvsY)SyxMWE30Fc-y!yt-7}jeScd5ucNzCQ_c1QOYYo)m6PP)2@Gs?hW+Rx4&FMFT6 zT8Ccju)dun6cb3O7sF#-G(!!nzha!-kf?C|8-&R&#t@} QJ5YZ2boFyt=akR{0O*p@82|tP diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/integration_test/resources/icon_image_base64.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/integration_test/resources/icon_image_base64.dart deleted file mode 100644 index 1bfc791ca38..00000000000 --- a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/integration_test/resources/icon_image_base64.dart +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright 2013 The Flutter Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -/// This constant holds the base64-encoded data of a 16x16 PNG image of the -/// Flutter logo. -/// -/// See `icon_image.png` source in the same directory. -/// -/// To create or update this image, follow these steps: -/// 1. Create or update a 16x16 PNG image. -/// 2. Convert the image to a base64 string using a script below. -/// 3. Replace the existing base64 string below with the new one. -/// -/// Example of converting an image to base64 in Dart: -/// ```dart -/// import 'dart:convert'; -/// import 'dart:io'; -/// -/// void main() async { -/// final bytes = await File('icon_image.png').readAsBytes(); -/// final base64String = base64Encode(bytes); -/// print(base64String); -/// } -/// ``` -const String iconImageBase64 = - 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAIRlWElmTU' - '0AKgAAAAgABQESAAMAAAABAAEAAAEaAAUAAAABAAAASgEbAAUAAAABAAAAUgEoAAMAAAABAAIA' - 'AIdpAAQAAAABAAAAWgAAAAAAAABIAAAAAQAAAEgAAAABAAOgAQADAAAAAQABAACgAgAEAAAAAQ' - 'AAABCgAwAEAAAAAQAAABAAAAAAx28c8QAAAAlwSFlzAAALEwAACxMBAJqcGAAAAVlpVFh0WE1M' - 'OmNvbS5hZG9iZS54bXAAAAAAADx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIH' - 'g6eG1wdGs9IlhNUCBDb3JlIDUuNC4wIj4KICAgPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8v' - 'd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICAgICAgPHJkZjpEZXNjcm' - 'lwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFk' - 'b2JlLmNvbS90aWZmLzEuMC8iPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk' - '9yaWVudGF0aW9uPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6' - 'eG1wbWV0YT4KTMInWQAAAplJREFUOBF1k01ME1EQx2fe7tIPoGgTE6AJgQQSPaiH9oAtkFbsgX' - 'jygFcT0XjSkxcTDxtPJh6MR28ePMHBBA8cNLSIony0oBhEMVETP058tE132+7uG3cW24DAXN57' - '2fn9/zPz3iIcEdEl0nIxtNLr1IlVeoMadkubKmoL+u2SzAV8IjV5Ekt4GN+A8+VOUPwLarOI2G' - 'Vpqq0i4JQorwQxPtWHVZ1IKP8LNGDXGaSyqARFxDGo7MJBy4XVf3AyQ+qTHnTEXoF9cFUy3OkY' - '0oWxmWFtD5xNoc1sQ6AOn1+hCNTkkhKow8KFZV77tVs2O9dhFvBm0IA/U0RhZ7/ocEx23oUDlh' - 'h8HkNjZIN8Lb3gOU8gOp7AKJHCB2/aNZkTftHumNzzbtl2CBPZHqxw8mHhVZBeoz6w5DvhE2FZ' - 'lQYPjKdd2/qRyKZ6KsPv7TEk7EYEk0A0EUmJduHRy1i4oLKqgmC59ZggAdwrC9pFuWy1iUT2rA' - 'uv0h2UdNtNqxCBBkgqorjOMOgksN7CxQ90vEb00U3c3LIwyo9o8FXxQVNr8Coqyk+S5EPBXnjt' - 'xRmc4TegI7qWbvBkeeUbGMnTCd4nZnYeDOWIEtlC6cKK/JJepY3hZSvN33jovO6L0XFqPKqBTO' - 'FuapUoPr1lxDM7cmC2TAOz25cYSGa++feBew/cjpc0V+mNT29/HZp3KDFTNLvuTRPEHy5065lj' - 'Xn4y41XM+wP/AlcycRmdc3MUhvLm/J/ceu/3qUVT62oP2EZpjSylHybHSpDUVcjq9gEBVo0+Xt' - 'JyN2IWRO+3QUforRoKnZLVsglaMECW+YmMSj9M3SrC6Lg71CMiqWfUrJ6ywzefhnZ+G69BaKdB' - 'WhXQAn6wzDUpfUPw7MrmX/WhbfmKblw+AAAAAElFTkSuQmCC'; diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Podfile b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Podfile index a5cfb3f7bfb..833aacf78d3 100644 --- a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Podfile +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Podfile @@ -1,5 +1,5 @@ # Uncomment this line to define a global platform for your project -platform :ios, '14.0' +platform :ios, '15.0' # CocoaPods analytics sends network stats synchronously affecting flutter build latency. ENV['COCOAPODS_DISABLE_STATS'] = 'true' diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner.xcodeproj/project.pbxproj b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner.xcodeproj/project.pbxproj index 10545d750ed..f6938231ad4 100644 --- a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner.xcodeproj/project.pbxproj +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner.xcodeproj/project.pbxproj @@ -3,18 +3,15 @@ archiveVersion = 1; classes = { }; - objectVersion = 54; + objectVersion = 60; objects = { /* Begin PBXBuildFile section */ - 0DD7B6C32B744EEF00E857FD /* FLTTileProviderControllerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 0DD7B6C22B744EEF00E857FD /* FLTTileProviderControllerTests.m */; }; 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; 4510D964F3B1259FEDD3ABA6 /* libPods-Runner.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 7755F8F4BABC3D6A0BD4048B /* libPods-Runner.a */; }; - 478116522BEF8F47002F593E /* GoogleMapsPolylinesControllerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 478116512BEF8F47002F593E /* GoogleMapsPolylinesControllerTests.m */; }; - 6851F3562835BC180032B7C8 /* FLTGoogleMapJSONConversionsConversionTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 6851F3552835BC180032B7C8 /* FLTGoogleMapJSONConversionsConversionTests.m */; }; - 521AB0032B876A76005F460D /* ExtractIconFromDataTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 521AB0022B876A76005F460D /* ExtractIconFromDataTests.m */; }; 68E4726A2836FF0C00BDDDAC /* MapKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 68E472692836FF0C00BDDDAC /* MapKit.framework */; }; + 78A318202AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage in Frameworks */ = {isa = PBXBuildFile; productRef = 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */; }; 978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */; }; 97C146F31CF9000F007C117D /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 97C146F21CF9000F007C117D /* main.m */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; @@ -23,7 +20,6 @@ 982F2A6C27BADE17003C81F4 /* PartiallyMockedMapView.m in Sources */ = {isa = PBXBuildFile; fileRef = 982F2A6B27BADE17003C81F4 /* PartiallyMockedMapView.m */; }; F269303B2BB389BF00BF17C4 /* assets in Resources */ = {isa = PBXBuildFile; fileRef = F269303A2BB389BF00BF17C4 /* assets */; }; F7151F13265D7ED70028CB91 /* GoogleMapsTests.m in Sources */ = {isa = PBXBuildFile; fileRef = F7151F12265D7ED70028CB91 /* GoogleMapsTests.m */; }; - F7151F21265D7EE50028CB91 /* GoogleMapsUITests.m in Sources */ = {isa = PBXBuildFile; fileRef = F7151F20265D7EE50028CB91 /* GoogleMapsUITests.m */; }; FC8F35FC8CD533B128950487 /* libPods-RunnerTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F267F68029D1A4E2E4C572A7 /* libPods-RunnerTests.a */; }; /* End PBXBuildFile section */ @@ -35,13 +31,6 @@ remoteGlobalIDString = 97C146ED1CF9000F007C117D; remoteInfo = Runner; }; - F7151F23265D7EE50028CB91 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 97C146E61CF9000F007C117D /* Project object */; - proxyType = 1; - remoteGlobalIDString = 97C146ED1CF9000F007C117D; - remoteInfo = Runner; - }; /* End PBXContainerItemProxy section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -58,13 +47,9 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 0DD7B6C22B744EEF00E857FD /* FLTTileProviderControllerTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FLTTileProviderControllerTests.m; sourceTree = ""; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 478116512BEF8F47002F593E /* GoogleMapsPolylinesControllerTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GoogleMapsPolylinesControllerTests.m; sourceTree = ""; }; - 6851F3552835BC180032B7C8 /* FLTGoogleMapJSONConversionsConversionTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLTGoogleMapJSONConversionsConversionTests.m; sourceTree = ""; }; - 521AB0022B876A76005F460D /* ExtractIconFromDataTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ExtractIconFromDataTests.m; sourceTree = ""; }; 68E472692836FF0C00BDDDAC /* MapKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MapKit.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.0.sdk/System/iOSSupport/System/Library/Frameworks/MapKit.framework; sourceTree = DEVELOPER_DIR; }; 733AFAB37683A9DA7512F09C /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Pods/Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 7755F8F4BABC3D6A0BD4048B /* libPods-Runner.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Runner.a"; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -89,9 +74,6 @@ F7151F10265D7ED70028CB91 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; F7151F12265D7ED70028CB91 /* GoogleMapsTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GoogleMapsTests.m; sourceTree = ""; }; F7151F14265D7ED70028CB91 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - F7151F1E265D7EE50028CB91 /* RunnerUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - F7151F20265D7EE50028CB91 /* GoogleMapsUITests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GoogleMapsUITests.m; sourceTree = ""; }; - F7151F22265D7EE50028CB91 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -99,6 +81,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 78A318202AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage in Frameworks */, 4510D964F3B1259FEDD3ABA6 /* libPods-Runner.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -112,13 +95,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - F7151F1B265D7EE50028CB91 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ @@ -149,7 +125,6 @@ 9740EEB11CF90186004384FC /* Flutter */, 97C146F01CF9000F007C117D /* Runner */, F7151F11265D7ED70028CB91 /* RunnerTests */, - F7151F1F265D7EE50028CB91 /* RunnerUITests */, 97C146EF1CF9000F007C117D /* Products */, A189CFE5474BF8A07908B2E0 /* Pods */, 1E7CF0857EFC88FC263CF3B2 /* Frameworks */, @@ -161,7 +136,6 @@ children = ( 97C146EE1CF9000F007C117D /* Runner.app */, F7151F10265D7ED70028CB91 /* RunnerTests.xctest */, - F7151F1E265D7EE50028CB91 /* RunnerUITests.xctest */, ); name = Products; sourceTree = ""; @@ -205,27 +179,14 @@ isa = PBXGroup; children = ( F269303A2BB389BF00BF17C4 /* assets */, - 6851F3552835BC180032B7C8 /* FLTGoogleMapJSONConversionsConversionTests.m */, - 521AB0022B876A76005F460D /* ExtractIconFromDataTests.m */, F7151F12265D7ED70028CB91 /* GoogleMapsTests.m */, - 478116512BEF8F47002F593E /* GoogleMapsPolylinesControllerTests.m */, 982F2A6A27BADE17003C81F4 /* PartiallyMockedMapView.h */, 982F2A6B27BADE17003C81F4 /* PartiallyMockedMapView.m */, F7151F14265D7ED70028CB91 /* Info.plist */, - 0DD7B6C22B744EEF00E857FD /* FLTTileProviderControllerTests.m */, ); path = RunnerTests; sourceTree = ""; }; - F7151F1F265D7EE50028CB91 /* RunnerUITests */ = { - isa = PBXGroup; - children = ( - F7151F20265D7EE50028CB91 /* GoogleMapsUITests.m */, - F7151F22265D7EE50028CB91 /* Info.plist */, - ); - path = RunnerUITests; - sourceTree = ""; - }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -247,6 +208,9 @@ dependencies = ( ); name = Runner; + packageProductDependencies = ( + 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */, + ); productName = Runner; productReference = 97C146EE1CF9000F007C117D /* Runner.app */; productType = "com.apple.product-type.application"; @@ -270,24 +234,6 @@ productReference = F7151F10265D7ED70028CB91 /* RunnerTests.xctest */; productType = "com.apple.product-type.bundle.unit-test"; }; - F7151F1D265D7EE50028CB91 /* RunnerUITests */ = { - isa = PBXNativeTarget; - buildConfigurationList = F7151F25265D7EE50028CB91 /* Build configuration list for PBXNativeTarget "RunnerUITests" */; - buildPhases = ( - F7151F1A265D7EE50028CB91 /* Sources */, - F7151F1B265D7EE50028CB91 /* Frameworks */, - F7151F1C265D7EE50028CB91 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - F7151F24265D7EE50028CB91 /* PBXTargetDependency */, - ); - name = RunnerUITests; - productName = RunnerUITests; - productReference = F7151F1E265D7EE50028CB91 /* RunnerUITests.xctest */; - productType = "com.apple.product-type.bundle.ui-testing"; - }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ @@ -305,11 +251,6 @@ ProvisioningStyle = Automatic; TestTargetID = 97C146ED1CF9000F007C117D; }; - F7151F1D265D7EE50028CB91 = { - CreatedOnToolsVersion = 12.5; - ProvisioningStyle = Automatic; - TestTargetID = 97C146ED1CF9000F007C117D; - }; }; }; buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; @@ -321,13 +262,15 @@ Base, ); mainGroup = 97C146E51CF9000F007C117D; + packageReferences = ( + 781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage" */, + ); productRefGroup = 97C146EF1CF9000F007C117D /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( 97C146ED1CF9000F007C117D /* Runner */, F7151F0F265D7ED70028CB91 /* RunnerTests */, - F7151F1D265D7EE50028CB91 /* RunnerUITests */, ); }; /* End PBXProject section */ @@ -352,13 +295,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - F7151F1C265D7EE50028CB91 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ @@ -471,19 +407,7 @@ buildActionMask = 2147483647; files = ( F7151F13265D7ED70028CB91 /* GoogleMapsTests.m in Sources */, - 6851F3562835BC180032B7C8 /* FLTGoogleMapJSONConversionsConversionTests.m in Sources */, 982F2A6C27BADE17003C81F4 /* PartiallyMockedMapView.m in Sources */, - 478116522BEF8F47002F593E /* GoogleMapsPolylinesControllerTests.m in Sources */, - 0DD7B6C32B744EEF00E857FD /* FLTTileProviderControllerTests.m in Sources */, - 521AB0032B876A76005F460D /* ExtractIconFromDataTests.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - F7151F1A265D7EE50028CB91 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - F7151F21265D7EE50028CB91 /* GoogleMapsUITests.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -495,11 +419,6 @@ target = 97C146ED1CF9000F007C117D /* Runner */; targetProxy = F7151F15265D7ED70028CB91 /* PBXContainerItemProxy */; }; - F7151F24265D7EE50028CB91 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 97C146ED1CF9000F007C117D /* Runner */; - targetProxy = F7151F23265D7EE50028CB91 /* PBXContainerItemProxy */; - }; /* End PBXTargetDependency section */ /* Begin PBXVariantGroup section */ @@ -571,7 +490,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 14.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -622,7 +541,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 14.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; @@ -718,40 +637,6 @@ }; name = Release; }; - F7151F26265D7EE50028CB91 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_STYLE = Automatic; - INFOPLIST_FILE = RunnerUITests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MTL_FAST_MATH = YES; - PRODUCT_BUNDLE_IDENTIFIER = dev.flutter.plugins.RunnerUITests; - PRODUCT_NAME = "$(TARGET_NAME)"; - TEST_TARGET_NAME = Runner; - }; - name = Debug; - }; - F7151F27265D7EE50028CB91 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_STYLE = Automatic; - INFOPLIST_FILE = RunnerUITests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MTL_FAST_MATH = YES; - PRODUCT_BUNDLE_IDENTIFIER = dev.flutter.plugins.RunnerUITests; - PRODUCT_NAME = "$(TARGET_NAME)"; - TEST_TARGET_NAME = Runner; - }; - name = Release; - }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ @@ -782,16 +667,21 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - F7151F25265D7EE50028CB91 /* Build configuration list for PBXNativeTarget "RunnerUITests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - F7151F26265D7EE50028CB91 /* Debug */, - F7151F27265D7EE50028CB91 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; /* End XCConfigurationList section */ + +/* Begin XCLocalSwiftPackageReference section */ + 781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage" */ = { + isa = XCLocalSwiftPackageReference; + relativePath = Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage; + }; +/* End XCLocalSwiftPackageReference section */ + +/* Begin XCSwiftPackageProductDependency section */ + 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */ = { + isa = XCSwiftPackageProductDependency; + productName = FlutterGeneratedPluginSwiftPackage; + }; +/* End XCSwiftPackageProductDependency section */ }; rootObject = 97C146E61CF9000F007C117D /* Project object */; } diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index f8d70602adf..b9b0e81d05f 100644 --- a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -5,6 +5,24 @@ + + + + + + + + + + -#import - -@interface ExtractIconFromDataTests : XCTestCase -- (UIImage *)createOnePixelImage; -@end - -@implementation ExtractIconFromDataTests - -- (void)testExtractIconFromDataAssetAuto { - FLTGoogleMapMarkerController *instance = [[FLTGoogleMapMarkerController alloc] init]; - NSObject *mockRegistrar = - OCMStrictProtocolMock(@protocol(FlutterPluginRegistrar)); - id mockImageClass = OCMClassMock([UIImage class]); - UIImage *testImage = [self createOnePixelImage]; - OCMStub([mockRegistrar lookupKeyForAsset:@"fakeImageNameKey"]).andReturn(@"fakeAssetKey"); - OCMStub(ClassMethod([mockImageClass imageNamed:@"fakeAssetKey"])).andReturn(testImage); - - NSDictionary *assetData = - @{@"assetName" : @"fakeImageNameKey", @"bitmapScaling" : @"auto", @"imagePixelRatio" : @1}; - - NSArray *iconData = @[ @"asset", assetData ]; - - CGFloat screenScale = 3.0; - - UIImage *resultImage = [instance extractIconFromData:iconData - registrar:mockRegistrar - screenScale:screenScale]; - XCTAssertNotNil(resultImage); - XCTAssertEqual(resultImage.scale, 1.0); - XCTAssertEqual(resultImage.size.width, 1.0); - XCTAssertEqual(resultImage.size.height, 1.0); -} - -- (void)testExtractIconFromDataAssetAutoWithScale { - FLTGoogleMapMarkerController *instance = [[FLTGoogleMapMarkerController alloc] init]; - NSObject *mockRegistrar = - OCMStrictProtocolMock(@protocol(FlutterPluginRegistrar)); - id mockImageClass = OCMClassMock([UIImage class]); - UIImage *testImage = [self createOnePixelImage]; - - OCMStub([mockRegistrar lookupKeyForAsset:@"fakeImageNameKey"]).andReturn(@"fakeAssetKey"); - OCMStub(ClassMethod([mockImageClass imageNamed:@"fakeAssetKey"])).andReturn(testImage); - - NSDictionary *assetData = - @{@"assetName" : @"fakeImageNameKey", @"bitmapScaling" : @"auto", @"imagePixelRatio" : @10}; - - NSArray *iconData = @[ @"asset", assetData ]; - - CGFloat screenScale = 3.0; - - UIImage *resultImage = [instance extractIconFromData:iconData - registrar:mockRegistrar - screenScale:screenScale]; - - XCTAssertNotNil(resultImage); - XCTAssertEqual(resultImage.scale, 10); - XCTAssertEqual(resultImage.size.width, 0.1); - XCTAssertEqual(resultImage.size.height, 0.1); -} - -- (void)testExtractIconFromDataAssetAutoAndSizeWithSameAspectRatio { - FLTGoogleMapMarkerController *instance = [[FLTGoogleMapMarkerController alloc] init]; - NSObject *mockRegistrar = - OCMStrictProtocolMock(@protocol(FlutterPluginRegistrar)); - id mockImageClass = OCMClassMock([UIImage class]); - UIImage *testImage = [self createOnePixelImage]; - XCTAssertEqual(testImage.scale, 1.0); - - OCMStub([mockRegistrar lookupKeyForAsset:@"fakeImageNameKey"]).andReturn(@"fakeAssetKey"); - OCMStub(ClassMethod([mockImageClass imageNamed:@"fakeAssetKey"])).andReturn(testImage); - - NSDictionary *assetData = @{ - @"assetName" : @"fakeImageNameKey", - @"bitmapScaling" : @"auto", - @"imagePixelRatio" : @1, - @"width" : @15.0 - }; // Target height - - NSArray *iconData = @[ @"asset", assetData ]; - CGFloat screenScale = 3.0; - - UIImage *resultImage = [instance extractIconFromData:iconData - registrar:mockRegistrar - screenScale:screenScale]; - XCTAssertNotNil(resultImage); - XCTAssertEqual(testImage.scale, 1.0); - - // As image has same aspect ratio as the original image, - // only image scale has been changed to match the target size. - CGFloat targetScale = testImage.scale * (testImage.size.width / 15.0); - const CGFloat accuracy = 0.001; - XCTAssertEqualWithAccuracy(resultImage.scale, targetScale, accuracy); - XCTAssertEqual(resultImage.size.width, 15.0); - XCTAssertEqual(resultImage.size.height, 15.0); -} - -- (void)testExtractIconFromDataAssetAutoAndSizeWithDifferentAspectRatio { - FLTGoogleMapMarkerController *instance = [[FLTGoogleMapMarkerController alloc] init]; - NSObject *mockRegistrar = - OCMStrictProtocolMock(@protocol(FlutterPluginRegistrar)); - id mockImageClass = OCMClassMock([UIImage class]); - UIImage *testImage = [self createOnePixelImage]; - - OCMStub([mockRegistrar lookupKeyForAsset:@"fakeImageNameKey"]).andReturn(@"fakeAssetKey"); - OCMStub(ClassMethod([mockImageClass imageNamed:@"fakeAssetKey"])).andReturn(testImage); - - NSDictionary *assetData = @{ - @"assetName" : @"fakeImageNameKey", - @"bitmapScaling" : @"auto", - @"imagePixelRatio" : @1, - @"width" : @15.0, - @"height" : @45.0 - }; - - NSArray *iconData = @[ @"asset", assetData ]; - - CGFloat screenScale = 3.0; - - UIImage *resultImage = [instance extractIconFromData:iconData - registrar:mockRegistrar - screenScale:screenScale]; - XCTAssertNotNil(resultImage); - XCTAssertEqual(resultImage.scale, screenScale); - XCTAssertEqual(resultImage.size.width, 15.0); - XCTAssertEqual(resultImage.size.height, 45.0); -} - -- (void)testExtractIconFromDataAssetNoScaling { - FLTGoogleMapMarkerController *instance = [[FLTGoogleMapMarkerController alloc] init]; - NSObject *mockRegistrar = - OCMStrictProtocolMock(@protocol(FlutterPluginRegistrar)); - id mockImageClass = OCMClassMock([UIImage class]); - UIImage *testImage = [self createOnePixelImage]; - - OCMStub([mockRegistrar lookupKeyForAsset:@"fakeImageNameKey"]).andReturn(@"fakeAssetKey"); - OCMStub(ClassMethod([mockImageClass imageNamed:@"fakeAssetKey"])).andReturn(testImage); - - NSDictionary *assetData = - @{@"assetName" : @"fakeImageNameKey", @"bitmapScaling" : @"none", @"imagePixelRatio" : @10}; - - NSArray *iconData = @[ @"asset", assetData ]; - - CGFloat screenScale = 3.0; - - UIImage *resultImage = [instance extractIconFromData:iconData - registrar:mockRegistrar - screenScale:screenScale]; - - XCTAssertNotNil(resultImage); - XCTAssertEqual(resultImage.scale, 1.0); - XCTAssertEqual(resultImage.size.width, 1.0); - XCTAssertEqual(resultImage.size.height, 1.0); -} - -- (void)testExtractIconFromDataBytesAuto { - FLTGoogleMapMarkerController *instance = [[FLTGoogleMapMarkerController alloc] init]; - NSObject *mockRegistrar = - OCMStrictProtocolMock(@protocol(FlutterPluginRegistrar)); - UIImage *testImage = [self createOnePixelImage]; - NSData *pngData = UIImagePNGRepresentation(testImage); - XCTAssertNotNil(pngData); - - FlutterStandardTypedData *typedData = [FlutterStandardTypedData typedDataWithBytes:pngData]; - - NSDictionary *bytesData = - @{@"byteData" : typedData, @"bitmapScaling" : @"auto", @"imagePixelRatio" : @1}; - - NSArray *iconData = @[ @"bytes", bytesData ]; - CGFloat screenScale = 3.0; - - UIImage *resultImage = [instance extractIconFromData:iconData - registrar:mockRegistrar - screenScale:screenScale]; - - XCTAssertNotNil(resultImage); - XCTAssertEqual(resultImage.scale, 1.0); - XCTAssertEqual(resultImage.size.width, 1.0); - XCTAssertEqual(resultImage.size.height, 1.0); -} - -- (void)testExtractIconFromDataBytesAutoWithScaling { - FLTGoogleMapMarkerController *instance = [[FLTGoogleMapMarkerController alloc] init]; - NSObject *mockRegistrar = - OCMStrictProtocolMock(@protocol(FlutterPluginRegistrar)); - UIImage *testImage = [self createOnePixelImage]; - NSData *pngData = UIImagePNGRepresentation(testImage); - XCTAssertNotNil(pngData); - - FlutterStandardTypedData *typedData = [FlutterStandardTypedData typedDataWithBytes:pngData]; - - NSDictionary *bytesData = - @{@"byteData" : typedData, @"bitmapScaling" : @"auto", @"imagePixelRatio" : @10}; - - NSArray *iconData = @[ @"bytes", bytesData ]; - - CGFloat screenScale = 3.0; - - UIImage *resultImage = [instance extractIconFromData:iconData - registrar:mockRegistrar - screenScale:screenScale]; - XCTAssertNotNil(resultImage); - XCTAssertEqual(resultImage.scale, 10); - XCTAssertEqual(resultImage.size.width, 0.1); - XCTAssertEqual(resultImage.size.height, 0.1); -} - -- (void)testExtractIconFromDataBytesAutoAndSizeWithSameAspectRatio { - FLTGoogleMapMarkerController *instance = [[FLTGoogleMapMarkerController alloc] init]; - NSObject *mockRegistrar = - OCMStrictProtocolMock(@protocol(FlutterPluginRegistrar)); - UIImage *testImage = [self createOnePixelImage]; - NSData *pngData = UIImagePNGRepresentation(testImage); - XCTAssertNotNil(pngData); - - FlutterStandardTypedData *typedData = [FlutterStandardTypedData typedDataWithBytes:pngData]; - - NSDictionary *bytesData = @{ - @"byteData" : typedData, - @"bitmapScaling" : @"auto", - @"imagePixelRatio" : @1, - @"width" : @15.0, - @"height" : @15.0 - }; - - NSArray *iconData = @[ @"bytes", bytesData ]; - - CGFloat screenScale = 3.0; - - UIImage *resultImage = [instance extractIconFromData:iconData - registrar:mockRegistrar - screenScale:screenScale]; - - XCTAssertNotNil(resultImage); - XCTAssertEqual(testImage.scale, 1.0); - - // As image has same aspect ratio as the original image, - // only image scale has been changed to match the target size. - CGFloat targetScale = testImage.scale * (testImage.size.width / 15.0); - const CGFloat accuracy = 0.001; - XCTAssertEqualWithAccuracy(resultImage.scale, targetScale, accuracy); - XCTAssertEqual(resultImage.size.width, 15.0); - XCTAssertEqual(resultImage.size.height, 15.0); -} - -- (void)testExtractIconFromDataBytesAutoAndSizeWithDifferentAspectRatio { - FLTGoogleMapMarkerController *instance = [[FLTGoogleMapMarkerController alloc] init]; - NSObject *mockRegistrar = - OCMStrictProtocolMock(@protocol(FlutterPluginRegistrar)); - UIImage *testImage = [self createOnePixelImage]; - NSData *pngData = UIImagePNGRepresentation(testImage); - XCTAssertNotNil(pngData); - - FlutterStandardTypedData *typedData = [FlutterStandardTypedData typedDataWithBytes:pngData]; - - NSDictionary *bytesData = @{ - @"byteData" : typedData, - @"bitmapScaling" : @"auto", - @"imagePixelRatio" : @1, - @"width" : @15.0, - @"height" : @45.0 - }; - - NSArray *iconData = @[ @"bytes", bytesData ]; - CGFloat screenScale = 3.0; - - UIImage *resultImage = [instance extractIconFromData:iconData - registrar:mockRegistrar - screenScale:screenScale]; - XCTAssertNotNil(resultImage); - XCTAssertEqual(resultImage.scale, screenScale); - XCTAssertEqual(resultImage.size.width, 15.0); - XCTAssertEqual(resultImage.size.height, 45.0); -} - -- (void)testExtractIconFromDataBytesNoScaling { - FLTGoogleMapMarkerController *instance = [[FLTGoogleMapMarkerController alloc] init]; - NSObject *mockRegistrar = - OCMStrictProtocolMock(@protocol(FlutterPluginRegistrar)); - UIImage *testImage = [self createOnePixelImage]; - NSData *pngData = UIImagePNGRepresentation(testImage); - XCTAssertNotNil(pngData); - - FlutterStandardTypedData *typedData = [FlutterStandardTypedData typedDataWithBytes:pngData]; - - NSDictionary *bytesData = - @{@"byteData" : typedData, @"bitmapScaling" : @"none", @"imagePixelRatio" : @1}; - - NSArray *iconData = @[ @"bytes", bytesData ]; - CGFloat screenScale = 3.0; - - UIImage *resultImage = [instance extractIconFromData:iconData - registrar:mockRegistrar - screenScale:screenScale]; - XCTAssertNotNil(resultImage); - XCTAssertEqual(resultImage.scale, 1.0); - XCTAssertEqual(resultImage.size.width, 1.0); - XCTAssertEqual(resultImage.size.height, 1.0); -} - -- (void)testIsScalableWithScaleFactorFromSize100x100to10x100 { - CGSize originalSize = CGSizeMake(100.0, 100.0); - CGSize targetSize = CGSizeMake(10.0, 100.0); - XCTAssertFalse([FLTGoogleMapMarkerController isScalableWithScaleFactorFromSize:originalSize - toSize:targetSize]); -} - -- (void)testIsScalableWithScaleFactorFromSize100x100to10x10 { - CGSize originalSize = CGSizeMake(100.0, 100.0); - CGSize targetSize = CGSizeMake(10.0, 10.0); - XCTAssertTrue([FLTGoogleMapMarkerController isScalableWithScaleFactorFromSize:originalSize - toSize:targetSize]); -} - -- (void)testIsScalableWithScaleFactorFromSize233x200to23x20 { - CGSize originalSize = CGSizeMake(233.0, 200.0); - CGSize targetSize = CGSizeMake(23.0, 20.0); - XCTAssertTrue([FLTGoogleMapMarkerController isScalableWithScaleFactorFromSize:originalSize - toSize:targetSize]); -} - -- (void)testIsScalableWithScaleFactorFromSize233x200to22x20 { - CGSize originalSize = CGSizeMake(233.0, 200.0); - CGSize targetSize = CGSizeMake(22.0, 20.0); - XCTAssertFalse([FLTGoogleMapMarkerController isScalableWithScaleFactorFromSize:originalSize - toSize:targetSize]); -} - -- (void)testIsScalableWithScaleFactorFromSize200x233to20x23 { - CGSize originalSize = CGSizeMake(200.0, 233.0); - CGSize targetSize = CGSizeMake(20.0, 23.0); - XCTAssertTrue([FLTGoogleMapMarkerController isScalableWithScaleFactorFromSize:originalSize - toSize:targetSize]); -} - -- (void)testIsScalableWithScaleFactorFromSize200x233to20x22 { - CGSize originalSize = CGSizeMake(200.0, 233.0); - CGSize targetSize = CGSizeMake(20.0, 22.0); - XCTAssertFalse([FLTGoogleMapMarkerController isScalableWithScaleFactorFromSize:originalSize - toSize:targetSize]); -} - -- (void)testIsScalableWithScaleFactorFromSize1024x768to500x250 { - CGSize originalSize = CGSizeMake(1024.0, 768.0); - CGSize targetSize = CGSizeMake(500.0, 250.0); - XCTAssertFalse([FLTGoogleMapMarkerController isScalableWithScaleFactorFromSize:originalSize - toSize:targetSize]); -} - -- (UIImage *)createOnePixelImage { - CGSize size = CGSizeMake(1, 1); - UIGraphicsImageRendererFormat *format = [UIGraphicsImageRendererFormat defaultFormat]; - format.scale = 1.0; - format.opaque = YES; - UIGraphicsImageRenderer *renderer = [[UIGraphicsImageRenderer alloc] initWithSize:size - format:format]; - UIImage *image = [renderer imageWithActions:^(UIGraphicsImageRendererContext *_Nonnull context) { - [[UIColor whiteColor] setFill]; - [context fillRect:CGRectMake(0, 0, size.width, size.height)]; - }]; - return image; -} - -@end diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/RunnerTests/FLTGoogleMapJSONConversionsConversionTests.m b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/RunnerTests/FLTGoogleMapJSONConversionsConversionTests.m deleted file mode 100644 index cc654606d8c..00000000000 --- a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/RunnerTests/FLTGoogleMapJSONConversionsConversionTests.m +++ /dev/null @@ -1,305 +0,0 @@ -// Copyright 2013 The Flutter Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -@import google_maps_flutter_ios; -@import google_maps_flutter_ios.Test; -@import XCTest; -@import MapKit; -@import GoogleMaps; - -#import -#import "PartiallyMockedMapView.h" - -@interface FLTGoogleMapJSONConversionsTests : XCTestCase -@end - -@implementation FLTGoogleMapJSONConversionsTests - -- (void)testLocationFromLatLong { - NSArray *latlong = @[ @1, @2 ]; - CLLocationCoordinate2D location = [FLTGoogleMapJSONConversions locationFromLatLong:latlong]; - XCTAssertEqual(location.latitude, 1); - XCTAssertEqual(location.longitude, 2); -} - -- (void)testPointFromArray { - NSArray *array = @[ @1, @2 ]; - CGPoint point = [FLTGoogleMapJSONConversions pointFromArray:array]; - XCTAssertEqual(point.x, 1); - XCTAssertEqual(point.y, 2); -} - -- (void)testArrayFromLocation { - CLLocationCoordinate2D location = CLLocationCoordinate2DMake(1, 2); - NSArray *array = [FLTGoogleMapJSONConversions arrayFromLocation:location]; - XCTAssertEqual([array[0] integerValue], 1); - XCTAssertEqual([array[1] integerValue], 2); -} - -- (void)testColorFromRGBA { - NSNumber *rgba = @(0x01020304); - UIColor *color = [FLTGoogleMapJSONConversions colorFromRGBA:rgba]; - CGFloat red, green, blue, alpha; - BOOL success = [color getRed:&red green:&green blue:&blue alpha:&alpha]; - XCTAssertTrue(success); - const CGFloat accuracy = 0.0001; - XCTAssertEqualWithAccuracy(red, 2 / 255.0, accuracy); - XCTAssertEqualWithAccuracy(green, 3 / 255.0, accuracy); - XCTAssertEqualWithAccuracy(blue, 4 / 255.0, accuracy); - XCTAssertEqualWithAccuracy(alpha, 1 / 255.0, accuracy); -} - -- (void)testPointsFromLatLongs { - NSArray *latlongs = @[ @[ @1, @2 ], @[ @(3), @(4) ] ]; - NSArray *locations = [FLTGoogleMapJSONConversions pointsFromLatLongs:latlongs]; - XCTAssertEqual(locations.count, 2); - XCTAssertEqual(locations[0].coordinate.latitude, 1); - XCTAssertEqual(locations[0].coordinate.longitude, 2); - XCTAssertEqual(locations[1].coordinate.latitude, 3); - XCTAssertEqual(locations[1].coordinate.longitude, 4); -} - -- (void)testHolesFromPointsArray { - NSArray *pointsArray = - @[ @[ @[ @1, @2 ], @[ @(3), @(4) ] ], @[ @[ @(5), @(6) ], @[ @(7), @(8) ] ] ]; - NSArray *> *holes = - [FLTGoogleMapJSONConversions holesFromPointsArray:pointsArray]; - XCTAssertEqual(holes.count, 2); - XCTAssertEqual(holes[0][0].coordinate.latitude, 1); - XCTAssertEqual(holes[0][0].coordinate.longitude, 2); - XCTAssertEqual(holes[0][1].coordinate.latitude, 3); - XCTAssertEqual(holes[0][1].coordinate.longitude, 4); - XCTAssertEqual(holes[1][0].coordinate.latitude, 5); - XCTAssertEqual(holes[1][0].coordinate.longitude, 6); - XCTAssertEqual(holes[1][1].coordinate.latitude, 7); - XCTAssertEqual(holes[1][1].coordinate.longitude, 8); -} - -- (void)testDictionaryFromPosition { - id mockPosition = OCMClassMock([GMSCameraPosition class]); - NSValue *locationValue = [NSValue valueWithMKCoordinate:CLLocationCoordinate2DMake(1, 2)]; - [(GMSCameraPosition *)[[mockPosition stub] andReturnValue:locationValue] target]; - [[[mockPosition stub] andReturnValue:@(2.0)] zoom]; - [[[mockPosition stub] andReturnValue:@(3.0)] bearing]; - [[[mockPosition stub] andReturnValue:@(75.0)] viewingAngle]; - NSDictionary *dictionary = [FLTGoogleMapJSONConversions dictionaryFromPosition:mockPosition]; - NSArray *targetArray = @[ @1, @2 ]; - XCTAssertEqualObjects(dictionary[@"target"], targetArray); - XCTAssertEqualObjects(dictionary[@"zoom"], @2.0); - XCTAssertEqualObjects(dictionary[@"bearing"], @3.0); - XCTAssertEqualObjects(dictionary[@"tilt"], @75.0); -} - -- (void)testDictionaryFromPoint { - CGPoint point = CGPointMake(10, 20); - NSDictionary *dictionary = [FLTGoogleMapJSONConversions dictionaryFromPoint:point]; - const CGFloat accuracy = 0.0001; - XCTAssertEqualWithAccuracy([dictionary[@"x"] floatValue], point.x, accuracy); - XCTAssertEqualWithAccuracy([dictionary[@"y"] floatValue], point.y, accuracy); -} - -- (void)testDictionaryFromCoordinateBounds { - XCTAssertNil([FLTGoogleMapJSONConversions dictionaryFromCoordinateBounds:nil]); - - GMSCoordinateBounds *bounds = - [[GMSCoordinateBounds alloc] initWithCoordinate:CLLocationCoordinate2DMake(10, 20) - coordinate:CLLocationCoordinate2DMake(30, 40)]; - NSDictionary *dictionary = [FLTGoogleMapJSONConversions dictionaryFromCoordinateBounds:bounds]; - NSArray *southwest = @[ @10, @20 ]; - NSArray *northeast = @[ @30, @40 ]; - XCTAssertEqualObjects(dictionary[@"southwest"], southwest); - XCTAssertEqualObjects(dictionary[@"northeast"], northeast); -} - -- (void)testCameraPostionFromDictionary { - XCTAssertNil([FLTGoogleMapJSONConversions cameraPostionFromDictionary:nil]); - - NSDictionary *channelValue = - @{@"target" : @[ @1, @2 ], @"zoom" : @3, @"bearing" : @4, @"tilt" : @5}; - - GMSCameraPosition *cameraPosition = - [FLTGoogleMapJSONConversions cameraPostionFromDictionary:channelValue]; - - const CGFloat accuracy = 0.001; - XCTAssertEqualWithAccuracy(cameraPosition.target.latitude, 1, accuracy); - XCTAssertEqualWithAccuracy(cameraPosition.target.longitude, 2, accuracy); - XCTAssertEqualWithAccuracy(cameraPosition.zoom, 3, accuracy); - XCTAssertEqualWithAccuracy(cameraPosition.bearing, 4, accuracy); - XCTAssertEqualWithAccuracy(cameraPosition.viewingAngle, 5, accuracy); -} - -- (void)testPointFromDictionary { - XCTAssertNil([FLTGoogleMapJSONConversions cameraPostionFromDictionary:nil]); - - NSDictionary *dictionary = @{ - @"x" : @1, - @"y" : @2, - }; - - CGPoint point = [FLTGoogleMapJSONConversions pointFromDictionary:dictionary]; - - const CGFloat accuracy = 0.001; - XCTAssertEqualWithAccuracy(point.x, 1, accuracy); - XCTAssertEqualWithAccuracy(point.y, 2, accuracy); -} - -- (void)testCoordinateBoundsFromLatLongs { - NSArray *latlong1 = @[ @1, @2 ]; - NSArray *latlong2 = @[ @(3), @(4) ]; - - GMSCoordinateBounds *bounds = - [FLTGoogleMapJSONConversions coordinateBoundsFromLatLongs:@[ latlong1, latlong2 ]]; - - const CGFloat accuracy = 0.001; - XCTAssertEqualWithAccuracy(bounds.southWest.latitude, 1, accuracy); - XCTAssertEqualWithAccuracy(bounds.southWest.longitude, 2, accuracy); - XCTAssertEqualWithAccuracy(bounds.northEast.latitude, 3, accuracy); - XCTAssertEqualWithAccuracy(bounds.northEast.longitude, 4, accuracy); -} - -- (void)testMapViewTypeFromTypeValue { - XCTAssertEqual(kGMSTypeNormal, [FLTGoogleMapJSONConversions mapViewTypeFromTypeValue:@1]); - XCTAssertEqual(kGMSTypeSatellite, [FLTGoogleMapJSONConversions mapViewTypeFromTypeValue:@2]); - XCTAssertEqual(kGMSTypeTerrain, [FLTGoogleMapJSONConversions mapViewTypeFromTypeValue:@3]); - XCTAssertEqual(kGMSTypeHybrid, [FLTGoogleMapJSONConversions mapViewTypeFromTypeValue:@4]); - XCTAssertEqual(kGMSTypeNone, [FLTGoogleMapJSONConversions mapViewTypeFromTypeValue:@5]); -} - -- (void)testCameraUpdateFromChannelValueNewCameraPosition { - NSArray *channelValue = @[ - @"newCameraPosition", @{@"target" : @[ @1, @2 ], @"zoom" : @3, @"bearing" : @4, @"tilt" : @5} - ]; - id classMockCameraUpdate = OCMClassMock([GMSCameraUpdate class]); - [FLTGoogleMapJSONConversions cameraUpdateFromChannelValue:channelValue]; - [[classMockCameraUpdate expect] - setCamera:[FLTGoogleMapJSONConversions cameraPostionFromDictionary:channelValue[1]]]; - [classMockCameraUpdate stopMocking]; -} - -// TODO(cyanglaz): Fix the test for CameraUpdateFromChannelValue with the "NewLatlng" key. -// 2 approaches have been tried and neither worked for the tests. -// -// 1. Use OCMock to vefiry that [GMSCameraUpdate setTarget:] is triggered with the correct value. -// This class method conflicts with certain category method in OCMock, causing OCMock not able to -// disambigious them. -// -// 2. Directly verify the GMSCameraUpdate object returned by the method. -// The GMSCameraUpdate object returned from the method doesn't have any accessors to the "target" -// property. It can be used to update the "camera" property in GMSMapView. However, [GMSMapView -// moveCamera:] doesn't update the camera immediately. Thus the GMSCameraUpdate object cannot be -// verified. -// -// The code in below test uses the 2nd approach. -- (void)skip_testCameraUpdateFromChannelValueNewLatLong { - NSArray *channelValue = @[ @"newLatLng", @[ @1, @2 ] ]; - - GMSCameraUpdate *update = [FLTGoogleMapJSONConversions cameraUpdateFromChannelValue:channelValue]; - - GMSMapViewOptions *options = [[GMSMapViewOptions alloc] init]; - options.frame = CGRectZero; - options.camera = [GMSCameraPosition cameraWithTarget:CLLocationCoordinate2DMake(5, 6) zoom:1]; - GMSMapView *mapView = [[GMSMapView alloc] initWithOptions:options]; - [mapView moveCamera:update]; - const CGFloat accuracy = 0.001; - XCTAssertEqualWithAccuracy(mapView.camera.target.latitude, 1, - accuracy); // mapView.camera.target.latitude is still 5. - XCTAssertEqualWithAccuracy(mapView.camera.target.longitude, 2, - accuracy); // mapView.camera.target.longitude is still 6. -} - -- (void)testCameraUpdateFromChannelValueNewLatLngBounds { - NSArray *latlong1 = @[ @1, @2 ]; - NSArray *latlong2 = @[ @(3), @(4) ]; - GMSCoordinateBounds *bounds = - [FLTGoogleMapJSONConversions coordinateBoundsFromLatLongs:@[ latlong1, latlong2 ]]; - - NSArray *channelValue = @[ @"newLatLngBounds", @[ latlong1, latlong2 ], @20 ]; - id classMockCameraUpdate = OCMClassMock([GMSCameraUpdate class]); - [FLTGoogleMapJSONConversions cameraUpdateFromChannelValue:channelValue]; - - [[classMockCameraUpdate expect] fitBounds:bounds withPadding:20]; - [classMockCameraUpdate stopMocking]; -} - -- (void)testCameraUpdateFromChannelValueNewLatLngZoom { - NSArray *channelValue = @[ @"newLatLngZoom", @[ @1, @2 ], @3 ]; - - id classMockCameraUpdate = OCMClassMock([GMSCameraUpdate class]); - [FLTGoogleMapJSONConversions cameraUpdateFromChannelValue:channelValue]; - - [[classMockCameraUpdate expect] setTarget:CLLocationCoordinate2DMake(1, 2) zoom:3]; - [classMockCameraUpdate stopMocking]; -} - -- (void)testCameraUpdateFromChannelValueScrollBy { - NSArray *channelValue = @[ @"scrollBy", @1, @2 ]; - - id classMockCameraUpdate = OCMClassMock([GMSCameraUpdate class]); - [FLTGoogleMapJSONConversions cameraUpdateFromChannelValue:channelValue]; - - [[classMockCameraUpdate expect] scrollByX:1 Y:2]; - [classMockCameraUpdate stopMocking]; -} - -- (void)testCameraUpdateFromChannelValueZoomBy { - NSArray *channelValueNoPoint = @[ @"zoomBy", @1 ]; - - id classMockCameraUpdate = OCMClassMock([GMSCameraUpdate class]); - [FLTGoogleMapJSONConversions cameraUpdateFromChannelValue:channelValueNoPoint]; - - [[classMockCameraUpdate expect] zoomBy:1]; - - NSArray *channelValueWithPoint = @[ @"zoomBy", @1, @[ @2, @3 ] ]; - - [FLTGoogleMapJSONConversions cameraUpdateFromChannelValue:channelValueWithPoint]; - - [[classMockCameraUpdate expect] zoomBy:1 atPoint:CGPointMake(2, 3)]; - [classMockCameraUpdate stopMocking]; -} - -- (void)testCameraUpdateFromChannelValueZoomIn { - NSArray *channelValueNoPoint = @[ @"zoomIn" ]; - - id classMockCameraUpdate = OCMClassMock([GMSCameraUpdate class]); - [FLTGoogleMapJSONConversions cameraUpdateFromChannelValue:channelValueNoPoint]; - - [[classMockCameraUpdate expect] zoomIn]; - [classMockCameraUpdate stopMocking]; -} - -- (void)testCameraUpdateFromChannelValueZoomOut { - NSArray *channelValueNoPoint = @[ @"zoomOut" ]; - - id classMockCameraUpdate = OCMClassMock([GMSCameraUpdate class]); - [FLTGoogleMapJSONConversions cameraUpdateFromChannelValue:channelValueNoPoint]; - - [[classMockCameraUpdate expect] zoomOut]; - [classMockCameraUpdate stopMocking]; -} - -- (void)testCameraUpdateFromChannelValueZoomTo { - NSArray *channelValueNoPoint = @[ @"zoomTo", @1 ]; - - id classMockCameraUpdate = OCMClassMock([GMSCameraUpdate class]); - [FLTGoogleMapJSONConversions cameraUpdateFromChannelValue:channelValueNoPoint]; - - [[classMockCameraUpdate expect] zoomTo:1]; - [classMockCameraUpdate stopMocking]; -} - -- (void)testLengthsFromPatterns { - NSArray *> *patterns = @[ @[ @"gap", @10 ], @[ @"dash", @6.4 ] ]; - - NSArray *spanLengths = [FLTGoogleMapJSONConversions spanLengthsFromPatterns:patterns]; - - XCTAssertEqual([spanLengths count], 2); - - NSNumber *firstSpanLength = spanLengths[0]; - NSNumber *secondSpanLength = spanLengths[1]; - - XCTAssertEqual(firstSpanLength.doubleValue, 10); - XCTAssertEqual(secondSpanLength.doubleValue, 6.4); -} - -@end diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/RunnerTests/FLTTileProviderControllerTests.m b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/RunnerTests/FLTTileProviderControllerTests.m deleted file mode 100644 index d42174a906f..00000000000 --- a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/RunnerTests/FLTTileProviderControllerTests.m +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright 2013 The Flutter Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -@import XCTest; -@import GoogleMaps; -@import google_maps_flutter_ios; - -#import - -@interface FLTTileProviderControllerTests : XCTestCase -@end - -@implementation FLTTileProviderControllerTests - -- (void)testCallChannelOnPlatformThread { - id channel = OCMClassMock(FlutterMethodChannel.class); - FLTTileProviderController *controller = [[FLTTileProviderController alloc] init:channel - withTileOverlayIdentifier:@"foo"]; - XCTAssertNotNil(controller); - XCTestExpectation *expectation = [self expectationWithDescription:@"invokeMethod"]; - OCMStub([channel invokeMethod:[OCMArg any] arguments:[OCMArg any] result:[OCMArg any]]) - .andDo(^(NSInvocation *invocation) { - XCTAssertTrue([[NSThread currentThread] isMainThread]); - [expectation fulfill]; - }); - id receiver = OCMProtocolMock(@protocol(GMSTileReceiver)); - [controller requestTileForX:0 y:0 zoom:0 receiver:receiver]; - [self waitForExpectations:@[ expectation ] timeout:10.0]; -} - -@end diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/RunnerTests/GoogleMapsPolylinesControllerTests.m b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/RunnerTests/GoogleMapsPolylinesControllerTests.m deleted file mode 100644 index 84714f17c7f..00000000000 --- a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/RunnerTests/GoogleMapsPolylinesControllerTests.m +++ /dev/null @@ -1,81 +0,0 @@ -// Copyright 2013 The Flutter Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -@import google_maps_flutter_ios; -@import google_maps_flutter_ios.Test; -@import XCTest; -@import GoogleMaps; - -#import -#import -#import "PartiallyMockedMapView.h" - -@interface GoogleMapsPolylinesControllerTests : XCTestCase -@end - -@implementation GoogleMapsPolylinesControllerTests - -/// Returns GoogleMapPolylineController object instantiated with a mocked map instance -/// -/// @return An object of FLTGoogleMapPolylineController -- (FLTGoogleMapPolylineController *)polylineControllerWithMockedMap { - NSDictionary *polyline = @{ - @"points" : @[ - @[ @(52.4816), @(-3.1791) ], @[ @(54.043), @(-2.9925) ], @[ @(54.1396), @(-4.2739) ], - @[ @(53.4153), @(-4.0829) ] - ], - @"polylineId" : @"polyline_id_0", - }; - - CGRect frame = CGRectMake(0, 0, 100, 100); - GMSCameraPosition *camera = [[GMSCameraPosition alloc] initWithLatitude:0 longitude:0 zoom:0]; - - GMSMapViewOptions *mapViewOptions = [[GMSMapViewOptions alloc] init]; - mapViewOptions.frame = frame; - mapViewOptions.camera = camera; - - PartiallyMockedMapView *mapView = [[PartiallyMockedMapView alloc] initWithOptions:mapViewOptions]; - - GMSMutablePath *path = [FLTPolylinesController pathForPolyline:polyline]; - NSString *identifier = polyline[@"polylineId"]; - - FLTGoogleMapPolylineController *polylineControllerWithMockedMap = - [[FLTGoogleMapPolylineController alloc] initPolylineWithPath:path - identifier:identifier - mapView:mapView]; - - return polylineControllerWithMockedMap; -} - -- (void)testSetPatterns { - NSArray *styles = @[ - [GMSStrokeStyle solidColor:[UIColor clearColor]], [GMSStrokeStyle solidColor:[UIColor redColor]] - ]; - - NSArray *lengths = @[ @10, @10 ]; - - FLTGoogleMapPolylineController *polylineController = [self polylineControllerWithMockedMap]; - - XCTAssertNil(polylineController.polyline.spans); - - [polylineController setPattern:styles lengths:lengths]; - - // `GMSStyleSpan` doesn't implement `isEqual` so cannot be compared by value at present. - XCTAssertNotNil(polylineController.polyline.spans); -} - -- (void)testStrokeStylesFromPatterns { - NSArray *> *patterns = @[ @[ @"gap", @10 ], @[ @"dash", @10 ] ]; - UIColor *strokeColor = [UIColor redColor]; - - NSArray *patternStrokeStyle = - [FLTGoogleMapJSONConversions strokeStylesFromPatterns:patterns strokeColor:strokeColor]; - - XCTAssertEqual([patternStrokeStyle count], 2); - - // None of the parameters of `patternStrokeStyle` is observable, so we limit to testing - // the length of this output array. -} - -@end diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/RunnerUITests/GoogleMapsUITests.m b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/RunnerUITests/GoogleMapsUITests.m deleted file mode 100644 index 3a1191bdb39..00000000000 --- a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/RunnerUITests/GoogleMapsUITests.m +++ /dev/null @@ -1,277 +0,0 @@ -// Copyright 2013 The Flutter Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -@import CoreLocation; -@import XCTest; -@import os.log; - -static const NSTimeInterval kWaitTime = 60; - -@interface GoogleMapsUITests : XCTestCase -@property(nonatomic, strong) XCUIApplication *app; -@end - -@implementation GoogleMapsUITests - -- (void)setUp { - self.continueAfterFailure = NO; - - self.app = [[XCUIApplication alloc] init]; - [self.app launch]; - - [self - addUIInterruptionMonitorWithDescription:@"Permission popups" - handler:^BOOL(XCUIElement *_Nonnull interruptingElement) { - if (@available(iOS 14, *)) { - XCUIElement *locationPermission = - interruptingElement.buttons[@"Allow While Using App"]; - if (![locationPermission - waitForExistenceWithTimeout:kWaitTime]) { - XCTFail(@"Failed due to not able to find " - @"locationPermission button"); - } - [locationPermission tap]; - - } else { - XCUIElement *allow = - interruptingElement.buttons[@"Allow"]; - if (![allow waitForExistenceWithTimeout:kWaitTime]) { - XCTFail(@"Failed due to not able to find Allow button"); - } - [allow tap]; - } - return YES; - }]; -} - -- (void)testUserInterface { - XCUIApplication *app = self.app; - XCUIElement *userInteface = app.staticTexts[@"User interface"]; - if (![userInteface waitForExistenceWithTimeout:kWaitTime]) { - os_log_error(OS_LOG_DEFAULT, "%@", app.debugDescription); - XCTFail(@"Failed due to not able to find User interface"); - } - [userInteface tap]; - - XCUIElement *platformView = app.otherElements[@"platform_view[0]"]; - if (![platformView waitForExistenceWithTimeout:kWaitTime]) { - os_log_error(OS_LOG_DEFAULT, "%@", app.debugDescription); - XCTFail(@"Failed due to not able to find platform view"); - } - - // There is a known bug where the permission popups interruption won't get fired until a tap - // happened in the app. We expect a permission popup so we do a tap here. - // iOS 16 has a bug where if the app itself is directly tapped: [app tap], the first button - // (disable compass) in the app is also tapped, so instead we tap a arbitrary location in the app - // instead. - XCUICoordinate *coordinate = [app coordinateWithNormalizedOffset:CGVectorMake(0, 0)]; - [coordinate tap]; - XCUIElement *compass = app.buttons[@"disable compass"]; - if (![compass waitForExistenceWithTimeout:kWaitTime]) { - os_log_error(OS_LOG_DEFAULT, "%@", app.debugDescription); - XCTFail(@"Failed due to not able to find disable compass button"); - } - - [self forceTap:compass]; -} - -- (void)testMapCoordinatesPage { - XCUIApplication *app = self.app; - XCUIElement *mapCoordinates = app.staticTexts[@"Map coordinates"]; - if (![mapCoordinates waitForExistenceWithTimeout:kWaitTime]) { - os_log_error(OS_LOG_DEFAULT, "%@", app.debugDescription); - XCTFail(@"Failed due to not able to find 'Map coordinates''"); - } - [mapCoordinates tap]; - - XCUIElement *platformView = app.otherElements[@"platform_view[0]"]; - if (![platformView waitForExistenceWithTimeout:kWaitTime]) { - os_log_error(OS_LOG_DEFAULT, "%@", app.debugDescription); - XCTFail(@"Failed due to not able to find platform view"); - } - - XCUIElement *titleBar = app.otherElements[@"Map coordinates"]; - if (![titleBar waitForExistenceWithTimeout:kWaitTime]) { - os_log_error(OS_LOG_DEFAULT, "%@", app.debugDescription); - XCTFail(@"Failed due to not able to find title bar"); - } - - NSPredicate *visibleRegionPredicate = - [NSPredicate predicateWithFormat:@"label BEGINSWITH 'VisibleRegion'"]; - XCUIElement *visibleRegionText = - [app.staticTexts elementMatchingPredicate:visibleRegionPredicate]; - if (![visibleRegionText waitForExistenceWithTimeout:kWaitTime]) { - os_log_error(OS_LOG_DEFAULT, "%@", app.debugDescription); - XCTFail(@"Failed due to not able to find Visible Region label'"); - } - - // Validate visible region does not change when scrolled under safe areas. - // https://github.com/flutter/flutter/issues/107913 - - // Example -33.79495661816674, 151.313996873796 - CLLocationCoordinate2D originalNortheast; - // Example -33.90900557679571, 151.10800322145224 - CLLocationCoordinate2D originalSouthwest; - [self validateVisibleRegion:visibleRegionText.label - northeast:&originalNortheast - southwest:&originalSouthwest]; - XCTAssertGreaterThan(originalNortheast.latitude, originalSouthwest.latitude); - XCTAssertGreaterThan(originalNortheast.longitude, originalSouthwest.longitude); - - XCTAssertLessThan(originalNortheast.latitude, 0); - XCTAssertLessThan(originalSouthwest.latitude, 0); - XCTAssertGreaterThan(originalNortheast.longitude, 0); - XCTAssertGreaterThan(originalSouthwest.longitude, 0); - - // Drag the map upward to under the title bar. - [platformView pressForDuration:0 thenDragToElement:titleBar]; - - CLLocationCoordinate2D draggedNortheast; - CLLocationCoordinate2D draggedSouthwest; - [self validateVisibleRegion:visibleRegionText.label - northeast:&draggedNortheast - southwest:&draggedSouthwest]; - XCTAssertEqual(originalNortheast.latitude, draggedNortheast.latitude); - XCTAssertEqual(originalNortheast.longitude, draggedNortheast.longitude); - XCTAssertEqual(originalSouthwest.latitude, draggedSouthwest.latitude); - XCTAssertEqual(originalSouthwest.latitude, draggedSouthwest.latitude); -} - -- (void)validateVisibleRegion:(NSString *)label - northeast:(CLLocationCoordinate2D *)northeast - southwest:(CLLocationCoordinate2D *)southwest { - // String will be "VisibleRegion:\nnortheast: LatLng(-33.79495661816674, - // 151.313996873796),\nsouthwest: LatLng(-33.90900557679571, 151.10800322145224)" - NSScanner *scan = [NSScanner scannerWithString:label]; - - // northeast - [scan scanString:@"VisibleRegion:\nnortheast: LatLng(" intoString:NULL]; - double northeastLatitude; - [scan scanDouble:&northeastLatitude]; - [scan scanString:@", " intoString:NULL]; - XCTAssertNotEqual(northeastLatitude, 0); - double northeastLongitude; - [scan scanDouble:&northeastLongitude]; - XCTAssertNotEqual(northeastLongitude, 0); - - [scan scanString:@"),\nsouthwest: LatLng(" intoString:NULL]; - double southwestLatitude; - [scan scanDouble:&southwestLatitude]; - XCTAssertNotEqual(southwestLatitude, 0); - [scan scanString:@", " intoString:NULL]; - double southwestLongitude; - [scan scanDouble:&southwestLongitude]; - XCTAssertNotEqual(southwestLongitude, 0); - *northeast = CLLocationCoordinate2DMake(northeastLatitude, northeastLongitude); - *southwest = CLLocationCoordinate2DMake(southwestLatitude, southwestLongitude); -} - -- (void)testMapClickPage { - XCUIApplication *app = self.app; - XCUIElement *mapClick = app.staticTexts[@"Map click"]; - if (![mapClick waitForExistenceWithTimeout:kWaitTime]) { - os_log_error(OS_LOG_DEFAULT, "%@", app.debugDescription); - XCTFail(@"Failed due to not able to find 'Map click''"); - } - [mapClick tap]; - - XCUIElement *platformView = app.otherElements[@"platform_view[0]"]; - if (![platformView waitForExistenceWithTimeout:kWaitTime]) { - os_log_error(OS_LOG_DEFAULT, "%@", app.debugDescription); - XCTFail(@"Failed due to not able to find platform view"); - } - - [platformView tap]; - - XCUIElement *tapped = app.staticTexts[@"Tapped"]; - if (![tapped waitForExistenceWithTimeout:kWaitTime]) { - os_log_error(OS_LOG_DEFAULT, "%@", app.debugDescription); - XCTFail(@"Failed due to not able to find 'tapped''"); - } - - [platformView pressForDuration:5.0]; - - XCUIElement *longPressed = app.staticTexts[@"Long pressed"]; - if (![longPressed waitForExistenceWithTimeout:kWaitTime]) { - os_log_error(OS_LOG_DEFAULT, "%@", app.debugDescription); - XCTFail(@"Failed due to not able to find 'longPressed''"); - } -} - -- (void)forceTap:(XCUIElement *)button { - // iOS 16 introduced a bug where hittable is NO for buttons. We force hit the location of the - // button if that is the case. It is likely similar to - // https://github.com/flutter/flutter/issues/113377. - if (button.isHittable) { - [button tap]; - return; - } - XCUICoordinate *coordinate = [button coordinateWithNormalizedOffset:CGVectorMake(0, 0)]; - [coordinate tap]; -} - -- (void)testMarkerDraggingCallbacks { - XCUIApplication *application = [[XCUIApplication alloc] init]; - [application launch]; - XCUIElement *placeMarkerButton = application.staticTexts[@"Place marker"]; - if (![placeMarkerButton waitForExistenceWithTimeout:kWaitTime]) { - NSLog(@"application.debugDescription: %@", application.debugDescription); - XCTFail(@"Failed to find the Place marker button."); - } - [placeMarkerButton tap]; - - XCUIElement *Add = application.buttons[@"Add"]; - if (![Add waitForExistenceWithTimeout:kWaitTime]) { - NSLog(@"application.debugDescription: %@", application.debugDescription); - XCTFail(@"Failed to find the Add button."); - } - [Add tap]; - - XCUIElement *marker = application.buttons[@"marker_id_1"]; - if (![marker waitForExistenceWithTimeout:kWaitTime]) { - NSLog(@"application.debugDescription: %@", application.debugDescription); - XCTFail(@"Failed to find the marker."); - } - [marker tap]; - - XCUIElement *toggleDraggable = application.buttons[@"toggle draggable"]; - if (![toggleDraggable waitForExistenceWithTimeout:kWaitTime]) { - NSLog(@"application.debugDescription: %@", application.debugDescription); - XCTFail(@"Failed to find the toggle draggable."); - } - [toggleDraggable tap]; - - // Drag marker to center - [marker pressForDuration:5 thenDragToElement:application]; - - NSPredicate *predicateDragStart = - [NSPredicate predicateWithFormat:@"label CONTAINS[c] %@", @"_onMarkerDragStart"]; - NSPredicate *predicateDrag = - [NSPredicate predicateWithFormat:@"label CONTAINS[c] %@", @"_onMarkerDrag called"]; - NSPredicate *predicateDragEnd = - [NSPredicate predicateWithFormat:@"label CONTAINS[c] %@", @"_onMarkerDragEnd"]; - - XCUIElement *dragStart = [application.staticTexts matchingPredicate:predicateDragStart].element; - if (![dragStart waitForExistenceWithTimeout:kWaitTime]) { - NSLog(@"application.debugDescription: %@", application.debugDescription); - XCTFail(@"Failed to find the _onMarkerDragStart."); - } - XCTAssertTrue(dragStart.exists); - - XCUIElement *drag = [application.staticTexts matchingPredicate:predicateDrag].element; - if (![drag waitForExistenceWithTimeout:kWaitTime]) { - NSLog(@"application.debugDescription: %@", application.debugDescription); - XCTFail(@"Failed to find the _onMarkerDrag."); - } - XCTAssertTrue(drag.exists); - - XCUIElement *dragEnd = [application.staticTexts matchingPredicate:predicateDragEnd].element; - if (![dragEnd waitForExistenceWithTimeout:kWaitTime]) { - NSLog(@"application.debugDescription: %@", application.debugDescription); - XCTFail(@"Failed to find the _onMarkerDragEnd."); - } - XCTAssertTrue(dragEnd.exists); -} - -@end diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/RunnerUITests/Info.plist b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/RunnerUITests/Info.plist deleted file mode 100644 index 64d65ca4957..00000000000 --- a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/RunnerUITests/Info.plist +++ /dev/null @@ -1,22 +0,0 @@ - - - - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - $(PRODUCT_BUNDLE_PACKAGE_TYPE) - CFBundleShortVersionString - 1.0 - CFBundleVersion - 1 - - diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/test_driver/integration_test.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/test_driver/integration_test.dart deleted file mode 100644 index 4f10f2a522f..00000000000 --- a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/test_driver/integration_test.dart +++ /dev/null @@ -1,7 +0,0 @@ -// Copyright 2013 The Flutter Authors. 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:integration_test/integration_test_driver.dart'; - -Future main() => integrationDriver(); From 7648a324a6ab60b32794da0831d64639f4e7fdcd Mon Sep 17 00:00:00 2001 From: Stuart Morgan Date: Mon, 10 Jun 2024 15:36:37 -0400 Subject: [PATCH 3/5] Expand support to 9.x --- .../google_maps_flutter_ios/ios/google_maps_flutter_ios.podspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/ios/google_maps_flutter_ios.podspec b/packages/google_maps_flutter/google_maps_flutter_ios/ios/google_maps_flutter_ios.podspec index adf0f706089..ce652f3b41b 100644 --- a/packages/google_maps_flutter/google_maps_flutter_ios/ios/google_maps_flutter_ios.podspec +++ b/packages/google_maps_flutter/google_maps_flutter_ios/ios/google_maps_flutter_ios.podspec @@ -24,7 +24,7 @@ Downloaded by pub (not CocoaPods). # broad as possible. # Versions earlier than 8.4 can't be supported because that's the first version # that supports privacy manifests. - s.dependency 'GoogleMaps', '>= 8.4', '< 9.0' + s.dependency 'GoogleMaps', '>= 8.4', '< 10.0' s.static_framework = true s.platform = :ios, '14.0' s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES' } From bf267d52a98f6b00ad19adb62331bffa228d7c53 Mon Sep 17 00:00:00 2001 From: Stuart Morgan Date: Mon, 10 Jun 2024 15:46:32 -0400 Subject: [PATCH 4/5] Undo SPM changes --- .../ios/Runner.xcodeproj/project.pbxproj | 24 +------------------ 1 file changed, 1 insertion(+), 23 deletions(-) diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner.xcodeproj/project.pbxproj b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner.xcodeproj/project.pbxproj index f6938231ad4..dc2ad2532b9 100644 --- a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner.xcodeproj/project.pbxproj +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios15/ios/Runner.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 60; + objectVersion = 54; objects = { /* Begin PBXBuildFile section */ @@ -11,7 +11,6 @@ 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; 4510D964F3B1259FEDD3ABA6 /* libPods-Runner.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 7755F8F4BABC3D6A0BD4048B /* libPods-Runner.a */; }; 68E4726A2836FF0C00BDDDAC /* MapKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 68E472692836FF0C00BDDDAC /* MapKit.framework */; }; - 78A318202AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage in Frameworks */ = {isa = PBXBuildFile; productRef = 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */; }; 978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */; }; 97C146F31CF9000F007C117D /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 97C146F21CF9000F007C117D /* main.m */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; @@ -81,7 +80,6 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 78A318202AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage in Frameworks */, 4510D964F3B1259FEDD3ABA6 /* libPods-Runner.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -208,9 +206,6 @@ dependencies = ( ); name = Runner; - packageProductDependencies = ( - 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */, - ); productName = Runner; productReference = 97C146EE1CF9000F007C117D /* Runner.app */; productType = "com.apple.product-type.application"; @@ -262,9 +257,6 @@ Base, ); mainGroup = 97C146E51CF9000F007C117D; - packageReferences = ( - 781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage" */, - ); productRefGroup = 97C146EF1CF9000F007C117D /* Products */; projectDirPath = ""; projectRoot = ""; @@ -668,20 +660,6 @@ defaultConfigurationName = Release; }; /* End XCConfigurationList section */ - -/* Begin XCLocalSwiftPackageReference section */ - 781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage" */ = { - isa = XCLocalSwiftPackageReference; - relativePath = Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage; - }; -/* End XCLocalSwiftPackageReference section */ - -/* Begin XCSwiftPackageProductDependency section */ - 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */ = { - isa = XCSwiftPackageProductDependency; - productName = FlutterGeneratedPluginSwiftPackage; - }; -/* End XCSwiftPackageProductDependency section */ }; rootObject = 97C146E61CF9000F007C117D /* Project object */; } From 185efcf38cf809905ac801cc54246220f61b02e3 Mon Sep 17 00:00:00 2001 From: Stuart Morgan Date: Mon, 10 Jun 2024 15:54:57 -0400 Subject: [PATCH 5/5] Version bump --- .../google_maps_flutter/google_maps_flutter_ios/CHANGELOG.md | 4 ++++ .../google_maps_flutter/google_maps_flutter_ios/pubspec.yaml | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/CHANGELOG.md b/packages/google_maps_flutter/google_maps_flutter_ios/CHANGELOG.md index a43cf9c5d5f..6fc61e8eefc 100644 --- a/packages/google_maps_flutter/google_maps_flutter_ios/CHANGELOG.md +++ b/packages/google_maps_flutter/google_maps_flutter_ios/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.8.0 + +* Adds compatibility with SDK version 9.x for apps targetting iOS 15+. + ## 2.7.0 * Adds support for BitmapDescriptor classes `AssetMapBitmap` and `BytesMapBitmap`. diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/pubspec.yaml b/packages/google_maps_flutter/google_maps_flutter_ios/pubspec.yaml index e8411514629..e2dc69dd1bb 100644 --- a/packages/google_maps_flutter/google_maps_flutter_ios/pubspec.yaml +++ b/packages/google_maps_flutter/google_maps_flutter_ios/pubspec.yaml @@ -2,7 +2,7 @@ name: google_maps_flutter_ios description: iOS implementation of the google_maps_flutter plugin. repository: https://github.com/flutter/packages/tree/main/packages/google_maps_flutter/google_maps_flutter_ios issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+maps%22 -version: 2.7.0 +version: 2.8.0 environment: sdk: ^3.2.3