From 344047ab9da09d15a74b0f2e7e3fd01a92b5b83c Mon Sep 17 00:00:00 2001 From: Stuart Morgan Date: Tue, 18 Apr 2023 13:03:24 -0400 Subject: [PATCH 01/16] Move existing example to subdirectory --- .../example/{ => ios11}/README.md | 0 .../example/{ => ios11}/assets/2.0x/red_square.png | Bin .../example/{ => ios11}/assets/3.0x/red_square.png | Bin .../example/{ => ios11}/assets/night_mode.json | 0 .../example/{ => ios11}/assets/red_square.png | Bin .../integration_test/google_maps_test.dart | 0 .../{ => ios11}/ios/Flutter/AppFrameworkInfo.plist | 0 .../example/{ => ios11}/ios/Flutter/Debug.xcconfig | 0 .../{ => ios11}/ios/Flutter/Release.xcconfig | 0 .../example/{ => ios11}/ios/Podfile | 0 .../ios/Runner.xcodeproj/project.pbxproj | 0 .../project.xcworkspace/contents.xcworkspacedata | 0 .../xcshareddata/xcschemes/Runner.xcscheme | 0 .../ios/Runner.xcworkspace/contents.xcworkspacedata | 0 .../xcshareddata/IDEWorkspaceChecks.plist | 0 .../example/{ => ios11}/ios/Runner/AppDelegate.h | 0 .../example/{ => ios11}/ios/Runner/AppDelegate.m | 0 .../AppIcon.appiconset/Contents.json | 0 .../AppIcon.appiconset/Icon-App-1024x1024@1x.png | Bin .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin .../AppIcon.appiconset/Icon-App-83.5x83.5@2x.png | Bin .../LaunchImage.imageset/Contents.json | 0 .../LaunchImage.imageset/LaunchImage.png | Bin .../LaunchImage.imageset/LaunchImage@2x.png | Bin .../LaunchImage.imageset/LaunchImage@3x.png | Bin .../Assets.xcassets/LaunchImage.imageset/README.md | 0 .../ios/Runner/Base.lproj/LaunchScreen.storyboard | 0 .../ios/Runner/Base.lproj/Main.storyboard | 0 .../example/{ => ios11}/ios/Runner/Info.plist | 0 .../example/{ => ios11}/ios/Runner/main.m | 0 .../FLTGoogleMapJSONConversionsConversionTests.m | 0 .../{ => ios11}/ios/RunnerTests/GoogleMapsTests.m | 0 .../example/{ => ios11}/ios/RunnerTests/Info.plist | 0 .../ios/RunnerTests/PartiallyMockedMapView.h | 0 .../ios/RunnerTests/PartiallyMockedMapView.m | 0 .../ios/RunnerUITests/GoogleMapsUITests.m | 0 .../{ => ios11}/ios/RunnerUITests/Info.plist | 0 .../example/{ => ios11}/lib/animate_camera.dart | 0 .../example/{ => ios11}/lib/example_google_map.dart | 0 .../example/{ => ios11}/lib/lite_mode.dart | 0 .../example/{ => ios11}/lib/main.dart | 0 .../example/{ => ios11}/lib/map_click.dart | 0 .../example/{ => ios11}/lib/map_coordinates.dart | 0 .../example/{ => ios11}/lib/map_ui.dart | 0 .../example/{ => ios11}/lib/marker_icons.dart | 0 .../example/{ => ios11}/lib/move_camera.dart | 0 .../example/{ => ios11}/lib/padding.dart | 0 .../example/{ => ios11}/lib/page.dart | 0 .../example/{ => ios11}/lib/place_circle.dart | 0 .../example/{ => ios11}/lib/place_marker.dart | 0 .../example/{ => ios11}/lib/place_polygon.dart | 0 .../example/{ => ios11}/lib/place_polyline.dart | 0 .../example/{ => ios11}/lib/scrolling_map.dart | 0 .../example/{ => ios11}/lib/snapshot.dart | 0 .../example/{ => ios11}/lib/tile_overlay.dart | 0 .../example/{ => ios11}/pubspec.yaml | 0 .../{ => ios11}/test_driver/integration_test.dart | 0 69 files changed, 0 insertions(+), 0 deletions(-) rename packages/google_maps_flutter/google_maps_flutter_ios/example/{ => ios11}/README.md (100%) rename packages/google_maps_flutter/google_maps_flutter_ios/example/{ => ios11}/assets/2.0x/red_square.png (100%) rename packages/google_maps_flutter/google_maps_flutter_ios/example/{ => ios11}/assets/3.0x/red_square.png (100%) rename packages/google_maps_flutter/google_maps_flutter_ios/example/{ => ios11}/assets/night_mode.json (100%) rename packages/google_maps_flutter/google_maps_flutter_ios/example/{ => ios11}/assets/red_square.png (100%) rename packages/google_maps_flutter/google_maps_flutter_ios/example/{ => ios11}/integration_test/google_maps_test.dart (100%) rename packages/google_maps_flutter/google_maps_flutter_ios/example/{ => ios11}/ios/Flutter/AppFrameworkInfo.plist (100%) rename packages/google_maps_flutter/google_maps_flutter_ios/example/{ => ios11}/ios/Flutter/Debug.xcconfig (100%) rename packages/google_maps_flutter/google_maps_flutter_ios/example/{ => ios11}/ios/Flutter/Release.xcconfig (100%) rename packages/google_maps_flutter/google_maps_flutter_ios/example/{ => ios11}/ios/Podfile (100%) rename packages/google_maps_flutter/google_maps_flutter_ios/example/{ => ios11}/ios/Runner.xcodeproj/project.pbxproj (100%) rename packages/google_maps_flutter/google_maps_flutter_ios/example/{ => ios11}/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata (100%) rename packages/google_maps_flutter/google_maps_flutter_ios/example/{ => ios11}/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme (100%) rename packages/google_maps_flutter/google_maps_flutter_ios/example/{ => ios11}/ios/Runner.xcworkspace/contents.xcworkspacedata (100%) rename packages/google_maps_flutter/google_maps_flutter_ios/example/{ => ios11}/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist (100%) rename packages/google_maps_flutter/google_maps_flutter_ios/example/{ => ios11}/ios/Runner/AppDelegate.h (100%) rename packages/google_maps_flutter/google_maps_flutter_ios/example/{ => ios11}/ios/Runner/AppDelegate.m (100%) rename packages/google_maps_flutter/google_maps_flutter_ios/example/{ => ios11}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json (100%) rename packages/google_maps_flutter/google_maps_flutter_ios/example/{ => ios11}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png (100%) rename packages/google_maps_flutter/google_maps_flutter_ios/example/{ => ios11}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png (100%) rename packages/google_maps_flutter/google_maps_flutter_ios/example/{ => ios11}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png (100%) rename packages/google_maps_flutter/google_maps_flutter_ios/example/{ => ios11}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png (100%) rename packages/google_maps_flutter/google_maps_flutter_ios/example/{ => ios11}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png (100%) rename packages/google_maps_flutter/google_maps_flutter_ios/example/{ => ios11}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png (100%) rename packages/google_maps_flutter/google_maps_flutter_ios/example/{ => ios11}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png (100%) rename packages/google_maps_flutter/google_maps_flutter_ios/example/{ => ios11}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png (100%) rename packages/google_maps_flutter/google_maps_flutter_ios/example/{ => ios11}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png (100%) rename packages/google_maps_flutter/google_maps_flutter_ios/example/{ => ios11}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png (100%) rename packages/google_maps_flutter/google_maps_flutter_ios/example/{ => ios11}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png (100%) rename packages/google_maps_flutter/google_maps_flutter_ios/example/{ => ios11}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png (100%) rename packages/google_maps_flutter/google_maps_flutter_ios/example/{ => ios11}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png (100%) rename packages/google_maps_flutter/google_maps_flutter_ios/example/{ => ios11}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png (100%) rename packages/google_maps_flutter/google_maps_flutter_ios/example/{ => ios11}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png (100%) rename packages/google_maps_flutter/google_maps_flutter_ios/example/{ => ios11}/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json (100%) rename packages/google_maps_flutter/google_maps_flutter_ios/example/{ => ios11}/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png (100%) rename packages/google_maps_flutter/google_maps_flutter_ios/example/{ => ios11}/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png (100%) rename packages/google_maps_flutter/google_maps_flutter_ios/example/{ => ios11}/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png (100%) rename packages/google_maps_flutter/google_maps_flutter_ios/example/{ => ios11}/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md (100%) rename packages/google_maps_flutter/google_maps_flutter_ios/example/{ => ios11}/ios/Runner/Base.lproj/LaunchScreen.storyboard (100%) rename packages/google_maps_flutter/google_maps_flutter_ios/example/{ => ios11}/ios/Runner/Base.lproj/Main.storyboard (100%) rename packages/google_maps_flutter/google_maps_flutter_ios/example/{ => ios11}/ios/Runner/Info.plist (100%) rename packages/google_maps_flutter/google_maps_flutter_ios/example/{ => ios11}/ios/Runner/main.m (100%) rename packages/google_maps_flutter/google_maps_flutter_ios/example/{ => ios11}/ios/RunnerTests/FLTGoogleMapJSONConversionsConversionTests.m (100%) rename packages/google_maps_flutter/google_maps_flutter_ios/example/{ => ios11}/ios/RunnerTests/GoogleMapsTests.m (100%) rename packages/google_maps_flutter/google_maps_flutter_ios/example/{ => ios11}/ios/RunnerTests/Info.plist (100%) rename packages/google_maps_flutter/google_maps_flutter_ios/example/{ => ios11}/ios/RunnerTests/PartiallyMockedMapView.h (100%) rename packages/google_maps_flutter/google_maps_flutter_ios/example/{ => ios11}/ios/RunnerTests/PartiallyMockedMapView.m (100%) rename packages/google_maps_flutter/google_maps_flutter_ios/example/{ => ios11}/ios/RunnerUITests/GoogleMapsUITests.m (100%) rename packages/google_maps_flutter/google_maps_flutter_ios/example/{ => ios11}/ios/RunnerUITests/Info.plist (100%) rename packages/google_maps_flutter/google_maps_flutter_ios/example/{ => ios11}/lib/animate_camera.dart (100%) rename packages/google_maps_flutter/google_maps_flutter_ios/example/{ => ios11}/lib/example_google_map.dart (100%) rename packages/google_maps_flutter/google_maps_flutter_ios/example/{ => ios11}/lib/lite_mode.dart (100%) rename packages/google_maps_flutter/google_maps_flutter_ios/example/{ => ios11}/lib/main.dart (100%) rename packages/google_maps_flutter/google_maps_flutter_ios/example/{ => ios11}/lib/map_click.dart (100%) rename packages/google_maps_flutter/google_maps_flutter_ios/example/{ => ios11}/lib/map_coordinates.dart (100%) rename packages/google_maps_flutter/google_maps_flutter_ios/example/{ => ios11}/lib/map_ui.dart (100%) rename packages/google_maps_flutter/google_maps_flutter_ios/example/{ => ios11}/lib/marker_icons.dart (100%) rename packages/google_maps_flutter/google_maps_flutter_ios/example/{ => ios11}/lib/move_camera.dart (100%) rename packages/google_maps_flutter/google_maps_flutter_ios/example/{ => ios11}/lib/padding.dart (100%) rename packages/google_maps_flutter/google_maps_flutter_ios/example/{ => ios11}/lib/page.dart (100%) rename packages/google_maps_flutter/google_maps_flutter_ios/example/{ => ios11}/lib/place_circle.dart (100%) rename packages/google_maps_flutter/google_maps_flutter_ios/example/{ => ios11}/lib/place_marker.dart (100%) rename packages/google_maps_flutter/google_maps_flutter_ios/example/{ => ios11}/lib/place_polygon.dart (100%) rename packages/google_maps_flutter/google_maps_flutter_ios/example/{ => ios11}/lib/place_polyline.dart (100%) rename packages/google_maps_flutter/google_maps_flutter_ios/example/{ => ios11}/lib/scrolling_map.dart (100%) rename packages/google_maps_flutter/google_maps_flutter_ios/example/{ => ios11}/lib/snapshot.dart (100%) rename packages/google_maps_flutter/google_maps_flutter_ios/example/{ => ios11}/lib/tile_overlay.dart (100%) rename packages/google_maps_flutter/google_maps_flutter_ios/example/{ => ios11}/pubspec.yaml (100%) rename packages/google_maps_flutter/google_maps_flutter_ios/example/{ => ios11}/test_driver/integration_test.dart (100%) diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/README.md b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/README.md similarity index 100% rename from packages/google_maps_flutter/google_maps_flutter_ios/example/README.md rename to packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/README.md diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/assets/2.0x/red_square.png b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/assets/2.0x/red_square.png similarity index 100% rename from packages/google_maps_flutter/google_maps_flutter_ios/example/assets/2.0x/red_square.png rename to packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/assets/2.0x/red_square.png diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/assets/3.0x/red_square.png b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/assets/3.0x/red_square.png similarity index 100% rename from packages/google_maps_flutter/google_maps_flutter_ios/example/assets/3.0x/red_square.png rename to packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/assets/3.0x/red_square.png diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/assets/night_mode.json b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/assets/night_mode.json similarity index 100% rename from packages/google_maps_flutter/google_maps_flutter_ios/example/assets/night_mode.json rename to packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/assets/night_mode.json diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/assets/red_square.png b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/assets/red_square.png similarity index 100% rename from packages/google_maps_flutter/google_maps_flutter_ios/example/assets/red_square.png rename to packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/assets/red_square.png diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/integration_test/google_maps_test.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/integration_test/google_maps_test.dart similarity index 100% rename from packages/google_maps_flutter/google_maps_flutter_ios/example/integration_test/google_maps_test.dart rename to packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/integration_test/google_maps_test.dart diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios/Flutter/AppFrameworkInfo.plist b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/ios/Flutter/AppFrameworkInfo.plist similarity index 100% rename from packages/google_maps_flutter/google_maps_flutter_ios/example/ios/Flutter/AppFrameworkInfo.plist rename to packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/ios/Flutter/AppFrameworkInfo.plist diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios/Flutter/Debug.xcconfig b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/ios/Flutter/Debug.xcconfig similarity index 100% rename from packages/google_maps_flutter/google_maps_flutter_ios/example/ios/Flutter/Debug.xcconfig rename to packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/ios/Flutter/Debug.xcconfig diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios/Flutter/Release.xcconfig b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/ios/Flutter/Release.xcconfig similarity index 100% rename from packages/google_maps_flutter/google_maps_flutter_ios/example/ios/Flutter/Release.xcconfig rename to packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/ios/Flutter/Release.xcconfig diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios/Podfile b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/ios/Podfile similarity index 100% rename from packages/google_maps_flutter/google_maps_flutter_ios/example/ios/Podfile rename to packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/ios/Podfile diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios/Runner.xcodeproj/project.pbxproj b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/ios/Runner.xcodeproj/project.pbxproj similarity index 100% rename from packages/google_maps_flutter/google_maps_flutter_ios/example/ios/Runner.xcodeproj/project.pbxproj rename to packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/ios/Runner.xcodeproj/project.pbxproj diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata similarity index 100% rename from packages/google_maps_flutter/google_maps_flutter_ios/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata rename to packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme similarity index 100% rename from packages/google_maps_flutter/google_maps_flutter_ios/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme rename to packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios/Runner.xcworkspace/contents.xcworkspacedata b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/ios/Runner.xcworkspace/contents.xcworkspacedata similarity index 100% rename from packages/google_maps_flutter/google_maps_flutter_ios/example/ios/Runner.xcworkspace/contents.xcworkspacedata rename to packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/ios/Runner.xcworkspace/contents.xcworkspacedata diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist similarity index 100% rename from packages/google_maps_flutter/google_maps_flutter_ios/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename to packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios/Runner/AppDelegate.h b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/ios/Runner/AppDelegate.h similarity index 100% rename from packages/google_maps_flutter/google_maps_flutter_ios/example/ios/Runner/AppDelegate.h rename to packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/ios/Runner/AppDelegate.h diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios/Runner/AppDelegate.m b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/ios/Runner/AppDelegate.m similarity index 100% rename from packages/google_maps_flutter/google_maps_flutter_ios/example/ios/Runner/AppDelegate.m rename to packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/ios/Runner/AppDelegate.m diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from packages/google_maps_flutter/google_maps_flutter_ios/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json rename to packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png similarity index 100% rename from packages/google_maps_flutter/google_maps_flutter_ios/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png rename to packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png similarity index 100% rename from packages/google_maps_flutter/google_maps_flutter_ios/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png rename to packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png similarity index 100% rename from packages/google_maps_flutter/google_maps_flutter_ios/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png rename to packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png similarity index 100% rename from packages/google_maps_flutter/google_maps_flutter_ios/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png rename to packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png similarity index 100% rename from packages/google_maps_flutter/google_maps_flutter_ios/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png rename to packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png similarity index 100% rename from packages/google_maps_flutter/google_maps_flutter_ios/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png rename to packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png similarity index 100% rename from packages/google_maps_flutter/google_maps_flutter_ios/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png rename to packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png similarity index 100% rename from packages/google_maps_flutter/google_maps_flutter_ios/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png rename to packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png similarity index 100% rename from packages/google_maps_flutter/google_maps_flutter_ios/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png rename to packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png similarity index 100% rename from packages/google_maps_flutter/google_maps_flutter_ios/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png rename to packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png similarity index 100% rename from packages/google_maps_flutter/google_maps_flutter_ios/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png rename to packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png similarity index 100% rename from packages/google_maps_flutter/google_maps_flutter_ios/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png rename to packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png similarity index 100% rename from packages/google_maps_flutter/google_maps_flutter_ios/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png rename to packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png similarity index 100% rename from packages/google_maps_flutter/google_maps_flutter_ios/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png rename to packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png similarity index 100% rename from packages/google_maps_flutter/google_maps_flutter_ios/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png rename to packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json similarity index 100% rename from packages/google_maps_flutter/google_maps_flutter_ios/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json rename to packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png similarity index 100% rename from packages/google_maps_flutter/google_maps_flutter_ios/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png rename to packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png similarity index 100% rename from packages/google_maps_flutter/google_maps_flutter_ios/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png rename to packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png similarity index 100% rename from packages/google_maps_flutter/google_maps_flutter_ios/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png rename to packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md similarity index 100% rename from packages/google_maps_flutter/google_maps_flutter_ios/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md rename to packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios/Runner/Base.lproj/LaunchScreen.storyboard b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/ios/Runner/Base.lproj/LaunchScreen.storyboard similarity index 100% rename from packages/google_maps_flutter/google_maps_flutter_ios/example/ios/Runner/Base.lproj/LaunchScreen.storyboard rename to packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/ios/Runner/Base.lproj/LaunchScreen.storyboard diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios/Runner/Base.lproj/Main.storyboard b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/ios/Runner/Base.lproj/Main.storyboard similarity index 100% rename from packages/google_maps_flutter/google_maps_flutter_ios/example/ios/Runner/Base.lproj/Main.storyboard rename to packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/ios/Runner/Base.lproj/Main.storyboard diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios/Runner/Info.plist b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/ios/Runner/Info.plist similarity index 100% rename from packages/google_maps_flutter/google_maps_flutter_ios/example/ios/Runner/Info.plist rename to packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/ios/Runner/Info.plist diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios/Runner/main.m b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/ios/Runner/main.m similarity index 100% rename from packages/google_maps_flutter/google_maps_flutter_ios/example/ios/Runner/main.m rename to packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/ios/Runner/main.m diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios/RunnerTests/FLTGoogleMapJSONConversionsConversionTests.m b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/ios/RunnerTests/FLTGoogleMapJSONConversionsConversionTests.m similarity index 100% rename from packages/google_maps_flutter/google_maps_flutter_ios/example/ios/RunnerTests/FLTGoogleMapJSONConversionsConversionTests.m rename to packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/ios/RunnerTests/FLTGoogleMapJSONConversionsConversionTests.m diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios/RunnerTests/GoogleMapsTests.m b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/ios/RunnerTests/GoogleMapsTests.m similarity index 100% rename from packages/google_maps_flutter/google_maps_flutter_ios/example/ios/RunnerTests/GoogleMapsTests.m rename to packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/ios/RunnerTests/GoogleMapsTests.m diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios/RunnerTests/Info.plist b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/ios/RunnerTests/Info.plist similarity index 100% rename from packages/google_maps_flutter/google_maps_flutter_ios/example/ios/RunnerTests/Info.plist rename to packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/ios/RunnerTests/Info.plist diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios/RunnerTests/PartiallyMockedMapView.h b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/ios/RunnerTests/PartiallyMockedMapView.h similarity index 100% rename from packages/google_maps_flutter/google_maps_flutter_ios/example/ios/RunnerTests/PartiallyMockedMapView.h rename to packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/ios/RunnerTests/PartiallyMockedMapView.h diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios/RunnerTests/PartiallyMockedMapView.m b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/ios/RunnerTests/PartiallyMockedMapView.m similarity index 100% rename from packages/google_maps_flutter/google_maps_flutter_ios/example/ios/RunnerTests/PartiallyMockedMapView.m rename to packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/ios/RunnerTests/PartiallyMockedMapView.m diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios/RunnerUITests/GoogleMapsUITests.m b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/ios/RunnerUITests/GoogleMapsUITests.m similarity index 100% rename from packages/google_maps_flutter/google_maps_flutter_ios/example/ios/RunnerUITests/GoogleMapsUITests.m rename to packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/ios/RunnerUITests/GoogleMapsUITests.m diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios/RunnerUITests/Info.plist b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/ios/RunnerUITests/Info.plist similarity index 100% rename from packages/google_maps_flutter/google_maps_flutter_ios/example/ios/RunnerUITests/Info.plist rename to packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/ios/RunnerUITests/Info.plist diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/lib/animate_camera.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/lib/animate_camera.dart similarity index 100% rename from packages/google_maps_flutter/google_maps_flutter_ios/example/lib/animate_camera.dart rename to packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/lib/animate_camera.dart diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/lib/example_google_map.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/lib/example_google_map.dart similarity index 100% rename from packages/google_maps_flutter/google_maps_flutter_ios/example/lib/example_google_map.dart rename to packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/lib/example_google_map.dart diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/lib/lite_mode.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/lib/lite_mode.dart similarity index 100% rename from packages/google_maps_flutter/google_maps_flutter_ios/example/lib/lite_mode.dart rename to packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/lib/lite_mode.dart diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/lib/main.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/lib/main.dart similarity index 100% rename from packages/google_maps_flutter/google_maps_flutter_ios/example/lib/main.dart rename to packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/lib/main.dart diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/lib/map_click.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/lib/map_click.dart similarity index 100% rename from packages/google_maps_flutter/google_maps_flutter_ios/example/lib/map_click.dart rename to packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/lib/map_click.dart diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/lib/map_coordinates.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/lib/map_coordinates.dart similarity index 100% rename from packages/google_maps_flutter/google_maps_flutter_ios/example/lib/map_coordinates.dart rename to packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/lib/map_coordinates.dart diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/lib/map_ui.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/lib/map_ui.dart similarity index 100% rename from packages/google_maps_flutter/google_maps_flutter_ios/example/lib/map_ui.dart rename to packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/lib/map_ui.dart diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/lib/marker_icons.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/lib/marker_icons.dart similarity index 100% rename from packages/google_maps_flutter/google_maps_flutter_ios/example/lib/marker_icons.dart rename to packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/lib/marker_icons.dart diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/lib/move_camera.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/lib/move_camera.dart similarity index 100% rename from packages/google_maps_flutter/google_maps_flutter_ios/example/lib/move_camera.dart rename to packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/lib/move_camera.dart diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/lib/padding.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/lib/padding.dart similarity index 100% rename from packages/google_maps_flutter/google_maps_flutter_ios/example/lib/padding.dart rename to packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/lib/padding.dart diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/lib/page.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/lib/page.dart similarity index 100% rename from packages/google_maps_flutter/google_maps_flutter_ios/example/lib/page.dart rename to packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/lib/page.dart diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/lib/place_circle.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/lib/place_circle.dart similarity index 100% rename from packages/google_maps_flutter/google_maps_flutter_ios/example/lib/place_circle.dart rename to packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/lib/place_circle.dart diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/lib/place_marker.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/lib/place_marker.dart similarity index 100% rename from packages/google_maps_flutter/google_maps_flutter_ios/example/lib/place_marker.dart rename to packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/lib/place_marker.dart diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/lib/place_polygon.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/lib/place_polygon.dart similarity index 100% rename from packages/google_maps_flutter/google_maps_flutter_ios/example/lib/place_polygon.dart rename to packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/lib/place_polygon.dart diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/lib/place_polyline.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/lib/place_polyline.dart similarity index 100% rename from packages/google_maps_flutter/google_maps_flutter_ios/example/lib/place_polyline.dart rename to packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/lib/place_polyline.dart diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/lib/scrolling_map.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/lib/scrolling_map.dart similarity index 100% rename from packages/google_maps_flutter/google_maps_flutter_ios/example/lib/scrolling_map.dart rename to packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/lib/scrolling_map.dart diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/lib/snapshot.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/lib/snapshot.dart similarity index 100% rename from packages/google_maps_flutter/google_maps_flutter_ios/example/lib/snapshot.dart rename to packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/lib/snapshot.dart diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/lib/tile_overlay.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/lib/tile_overlay.dart similarity index 100% rename from packages/google_maps_flutter/google_maps_flutter_ios/example/lib/tile_overlay.dart rename to packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/lib/tile_overlay.dart diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/pubspec.yaml b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/pubspec.yaml similarity index 100% rename from packages/google_maps_flutter/google_maps_flutter_ios/example/pubspec.yaml rename to packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/pubspec.yaml diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/test_driver/integration_test.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/test_driver/integration_test.dart similarity index 100% rename from packages/google_maps_flutter/google_maps_flutter_ios/example/test_driver/integration_test.dart rename to packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/test_driver/integration_test.dart From 7288b15c2074f2d71414607a8f1e8e94d7690125 Mon Sep 17 00:00:00 2001 From: Stuart Morgan Date: Tue, 18 Apr 2023 13:20:21 -0400 Subject: [PATCH 02/16] Add new top-level README --- .../google_maps_flutter_ios/example/README.md | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/README.md diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/README.md b/packages/google_maps_flutter/google_maps_flutter_ios/example/README.md new file mode 100644 index 00000000000..a72f740aad8 --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/README.md @@ -0,0 +1,40 @@ +# Platform Implementation Test Apps + +These are test app for manual testing and automated integration testing +of this platform implementation. They are 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, these examples +are very unlikely to be relevant. + +## Structure + +This package contains multiple exmaples, which are used to test different +versions of the Google Maps iOS SDK. Because the plugin's dependency +is unpinned, CocoaPods will pick the newest version that supports the +minimum targetted OS version of the application using the plugin. In +order to ensure that the plugin continues to compile against all +SDK versions that could resolve, there are multiple largely identical +examples, each with a different minimum target iOS version. + +In order to avoid wasting CI resources, the majority of the testing +is done with the lowest supported version. The assumption (based on +experience so far) is that the changes in the SDK are unlikely to +break functionality at runtime, and that it's primarily a +compile-time issue. However, we can add testing to newer versions +(e.g., to test functionality that only exists in newer versions +of the SDK) as needed. + +## Updating Examples + +* When a new major of the SDK comes out that raises the minimum + iOS deployment version, a new example with that minimum target + should be added to ensure that the plugin compiles with that + version of the SDK. +* When the minimum supported version of Flutter (on `stable`) + reaches the point where the oldest example is for an SDK + that can no longer be resolved to, that example should be + removed, and all of its testing (Dart integration tests, + native unit tests, native UI tests) should be folded into + the next-oldest version. From ec6ec67553bce660cb63597875b2d8b10ff8b458 Mon Sep 17 00:00:00 2001 From: Stuart Morgan Date: Tue, 18 Apr 2023 13:29:31 -0400 Subject: [PATCH 03/16] Add version to README --- .../google_maps_flutter_ios/example/ios11/README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/README.md b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/README.md index 96b8bb17dbf..0cea26c941f 100644 --- a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/README.md +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/README.md @@ -7,3 +7,7 @@ package. Unless you are making changes to this implementation package, this example is very unlikely to be relevant. + +## Versions + +This example requires iOS 11, so will select a 5.x SDK version. From c0b30e0545adfb752769e6992949cd3af98909af Mon Sep 17 00:00:00 2001 From: Stuart Morgan Date: Tue, 18 Apr 2023 13:34:46 -0400 Subject: [PATCH 04/16] Add an iOS 12 copy without integration or XCUI tests --- .../example/ios12/README.md | 13 + .../example/ios12/assets/2.0x/red_square.png | Bin 0 -> 304 bytes .../example/ios12/assets/3.0x/red_square.png | Bin 0 -> 312 bytes .../example/ios12/assets/night_mode.json | 162 +++++ .../example/ios12/assets/red_square.png | Bin 0 -> 195 bytes .../ios12/ios/Flutter/AppFrameworkInfo.plist | 30 + .../example/ios12/ios/Flutter/Debug.xcconfig | 2 + .../ios12/ios/Flutter/Release.xcconfig | 2 + .../example/ios12/ios/Podfile | 46 ++ .../ios/Runner.xcodeproj/project.pbxproj | 665 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/xcschemes/Runner.xcscheme | 107 +++ .../contents.xcworkspacedata | 10 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../example/ios12/ios/Runner/AppDelegate.h | 9 + .../example/ios12/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/ios12/ios/Runner/Info.plist | 55 ++ .../example/ios12/ios/Runner/main.m | 13 + ...TGoogleMapJSONConversionsConversionTests.m | 290 ++++++++ .../ios12/ios/RunnerTests/GoogleMapsTests.m | 59 ++ .../example/ios12/ios/RunnerTests/Info.plist | 22 + .../ios/RunnerTests/PartiallyMockedMapView.h | 17 + .../ios/RunnerTests/PartiallyMockedMapView.m | 34 + .../example/ios12/lib/animate_camera.dart | 171 +++++ .../example/ios12/lib/example_google_map.dart | 538 ++++++++++++++ .../example/ios12/lib/lite_mode.dart | 47 ++ .../example/ios12/lib/main.dart | 73 ++ .../example/ios12/lib/map_click.dart | 105 +++ .../example/ios12/lib/map_coordinates.dart | 104 +++ .../example/ios12/lib/map_ui.dart | 357 ++++++++++ .../example/ios12/lib/marker_icons.dart | 98 +++ .../example/ios12/lib/move_camera.dart | 171 +++++ .../example/ios12/lib/padding.dart | 180 +++++ .../example/ios12/lib/page.dart | 14 + .../example/ios12/lib/place_circle.dart | 232 ++++++ .../example/ios12/lib/place_marker.dart | 421 +++++++++++ .../example/ios12/lib/place_polygon.dart | 306 ++++++++ .../example/ios12/lib/place_polyline.dart | 325 +++++++++ .../example/ios12/lib/scrolling_map.dart | 114 +++ .../example/ios12/lib/snapshot.dart | 76 ++ .../example/ios12/lib/tile_overlay.dart | 154 ++++ .../example/ios12/pubspec.yaml | 34 + 65 files changed, 5311 insertions(+) create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/README.md create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/assets/2.0x/red_square.png create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/assets/3.0x/red_square.png create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/assets/night_mode.json create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/assets/red_square.png create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/Flutter/AppFrameworkInfo.plist create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/Flutter/Debug.xcconfig create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/Flutter/Release.xcconfig create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/Podfile create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/Runner.xcodeproj/project.pbxproj create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/Runner/AppDelegate.h create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/Runner/AppDelegate.m create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/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/ios12/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/Runner/Base.lproj/LaunchScreen.storyboard create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/Runner/Base.lproj/Main.storyboard create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/Runner/Info.plist create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/Runner/main.m create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/RunnerTests/FLTGoogleMapJSONConversionsConversionTests.m create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/RunnerTests/GoogleMapsTests.m create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/RunnerTests/Info.plist create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/RunnerTests/PartiallyMockedMapView.h create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/RunnerTests/PartiallyMockedMapView.m create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/animate_camera.dart create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/example_google_map.dart create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/lite_mode.dart create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/main.dart create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/map_click.dart create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/map_coordinates.dart create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/map_ui.dart create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/marker_icons.dart create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/move_camera.dart create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/padding.dart create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/page.dart create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/place_circle.dart create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/place_marker.dart create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/place_polygon.dart create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/place_polyline.dart create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/scrolling_map.dart create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/snapshot.dart create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/tile_overlay.dart create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/pubspec.yaml diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/README.md b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/README.md new file mode 100644 index 00000000000..3ac96bff12b --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/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 12, so will select a 6.x SDK version. diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/assets/2.0x/red_square.png b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/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/ios12/assets/3.0x/red_square.png b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/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/ios12/assets/night_mode.json b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/assets/night_mode.json new file mode 100644 index 00000000000..1f16e003a92 --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/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/ios12/assets/red_square.png b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/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/ios12/ios/Flutter/AppFrameworkInfo.plist b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/Flutter/AppFrameworkInfo.plist new file mode 100644 index 00000000000..b3aaa733dfb --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/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/ios12/ios/Flutter/Debug.xcconfig b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/Flutter/Debug.xcconfig new file mode 100644 index 00000000000..e8efba11468 --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/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/ios12/ios/Flutter/Release.xcconfig b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/Flutter/Release.xcconfig new file mode 100644 index 00000000000..399e9340e6f --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/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/ios12/ios/Podfile b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/Podfile new file mode 100644 index 00000000000..cccf50aa93d --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/Podfile @@ -0,0 +1,46 @@ +# Uncomment this line to define a global platform for your project +platform :ios, '12.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) + target.build_configurations.each do |build_configuration| + build_configuration.build_settings['EXCLUDED_ARCHS[sdk=iphonesimulator*]'] = 'arm64 i386' + end + end +end diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/Runner.xcodeproj/project.pbxproj b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/Runner.xcodeproj/project.pbxproj new file mode 100644 index 00000000000..72b5ce216de --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,665 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 54; + objects = { + +/* Begin PBXBuildFile section */ + 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 */; }; + 6851F3562835BC180032B7C8 /* FLTGoogleMapJSONConversionsConversionTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 6851F3552835BC180032B7C8 /* FLTGoogleMapJSONConversionsConversionTests.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 */; }; + F7151F13265D7ED70028CB91 /* GoogleMapsTests.m in Sources */ = {isa = PBXBuildFile; fileRef = F7151F12265D7ED70028CB91 /* GoogleMapsTests.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; + }; +/* 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 */ + 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 = ""; }; + 6851F3552835BC180032B7C8 /* FLTGoogleMapJSONConversionsConversionTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLTGoogleMapJSONConversionsConversionTests.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; }; + 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 = ""; }; +/* 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; + }; +/* 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 */, + 97C146EF1CF9000F007C117D /* Products */, + A189CFE5474BF8A07908B2E0 /* Pods */, + 1E7CF0857EFC88FC263CF3B2 /* Frameworks */, + ); + sourceTree = ""; + }; + 97C146EF1CF9000F007C117D /* Products */ = { + isa = PBXGroup; + children = ( + 97C146EE1CF9000F007C117D /* Runner.app */, + F7151F10265D7ED70028CB91 /* RunnerTests.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 = ( + 6851F3552835BC180032B7C8 /* FLTGoogleMapJSONConversionsConversionTests.m */, + F7151F12265D7ED70028CB91 /* GoogleMapsTests.m */, + 982F2A6A27BADE17003C81F4 /* PartiallyMockedMapView.h */, + 982F2A6B27BADE17003C81F4 /* PartiallyMockedMapView.m */, + F7151F14265D7ED70028CB91 /* Info.plist */, + ); + path = RunnerTests; + 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"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 97C146E61CF9000F007C117D /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 1300; + ORGANIZATIONNAME = "The Flutter Authors"; + TargetAttributes = { + 97C146ED1CF9000F007C117D = { + CreatedOnToolsVersion = 7.3.1; + }; + F7151F0F265D7ED70028CB91 = { + 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 */, + ); + }; +/* 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 = ( + ); + 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_ROOT}/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle", + ); + name = "[CP] Copy Pods Resources"; + outputPaths = ( + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GoogleMaps.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 */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + F7151F16265D7ED70028CB91 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 97C146ED1CF9000F007C117D /* Runner */; + targetProxy = F7151F15265D7ED70028CB91 /* 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 = 12.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 = 12.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; + "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = "i386 arm64"; + 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; + "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = "i386 arm64"; + 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 arm64"; + 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 arm64"; + 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; + }; +/* 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; + }; +/* End XCConfigurationList section */ + }; + rootObject = 97C146E61CF9000F007C117D /* Project object */; +} diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/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/ios12/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 00000000000..a60a46be23c --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,107 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/Runner.xcworkspace/contents.xcworkspacedata b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000000..21a3cc14c74 --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/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/ios12/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/Runner/AppDelegate.h b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/Runner/AppDelegate.h new file mode 100644 index 00000000000..9bc6c56e34f --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/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/ios12/ios/Runner/AppDelegate.m b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/Runner/AppDelegate.m new file mode 100644 index 00000000000..55733442b4c --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/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/ios12/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/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/ios12/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/ios12/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/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/ios12/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/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/ios12/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/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/ios12/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/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/ios12/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/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/ios12/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/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/ios12/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/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/ios12/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/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/ios12/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/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/ios12/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/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/ios12/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/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/ios12/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/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/ios12/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/ios12/ios/Runner/Base.lproj/LaunchScreen.storyboard b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/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/ios12/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/Runner/Base.lproj/Main.storyboard b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/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/ios12/ios/Runner/Base.lproj/Main.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/Runner/Info.plist b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/Runner/Info.plist new file mode 100644 index 00000000000..d6b389f1672 --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/Runner/Info.plist @@ -0,0 +1,55 @@ + + + + + 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 + + UIViewControllerBasedStatusBarAppearance + + CADisableMinimumFrameDurationOnPhone + + UIApplicationSupportsIndirectInputEvents + + + diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/Runner/main.m b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/Runner/main.m new file mode 100644 index 00000000000..f143297b30d --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/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/ios12/ios/RunnerTests/FLTGoogleMapJSONConversionsConversionTests.m b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/RunnerTests/FLTGoogleMapJSONConversionsConversionTests.m new file mode 100644 index 00000000000..bb9020d983c --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/RunnerTests/FLTGoogleMapJSONConversionsConversionTests.m @@ -0,0 +1,290 @@ +// 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]; + + GMSMapView *mapView = [[GMSMapView alloc] + initWithFrame:CGRectZero + camera:[GMSCameraPosition cameraWithTarget:CLLocationCoordinate2DMake(5, 6) zoom:1]]; + [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]; +} + +@end diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/RunnerTests/GoogleMapsTests.m b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/RunnerTests/GoogleMapsTests.m new file mode 100644 index 00000000000..71f1162890b --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/RunnerTests/GoogleMapsTests.m @@ -0,0 +1,59 @@ +// 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 + +@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); + PartiallyMockedMapView *mapView = [[PartiallyMockedMapView alloc] + initWithFrame:frame + camera:[[GMSCameraPosition alloc] initWithLatitude:0 longitude:0 zoom:0]]; + 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); +} + +@end diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/RunnerTests/Info.plist b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/RunnerTests/Info.plist new file mode 100644 index 00000000000..64d65ca4957 --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/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/ios12/ios/RunnerTests/PartiallyMockedMapView.h b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/RunnerTests/PartiallyMockedMapView.h new file mode 100644 index 00000000000..4288401cf90 --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/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/ios12/ios/RunnerTests/PartiallyMockedMapView.m b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/RunnerTests/PartiallyMockedMapView.m new file mode 100644 index 00000000000..202a18d128c --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/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/ios12/lib/animate_camera.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/animate_camera.dart new file mode 100644 index 00000000000..c77f9ededac --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/animate_camera.dart @@ -0,0 +1,171 @@ +// 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. + +// ignore_for_file: public_member_api_docs + +import 'package:flutter/material.dart'; +import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart'; + +import 'example_google_map.dart'; +import 'page.dart'; + +class AnimateCameraPage extends GoogleMapExampleAppPage { + const AnimateCameraPage({Key? key}) + : super(const Icon(Icons.map), 'Camera control, animated', key: key); + + @override + Widget build(BuildContext context) { + return const AnimateCamera(); + } +} + +class AnimateCamera extends StatefulWidget { + const AnimateCamera({super.key}); + @override + State createState() => AnimateCameraState(); +} + +class AnimateCameraState extends State { + ExampleGoogleMapController? mapController; + + // ignore: use_setters_to_change_properties + void _onMapCreated(ExampleGoogleMapController controller) { + mapController = controller; + } + + @override + Widget build(BuildContext context) { + return Column( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Center( + child: SizedBox( + width: 300.0, + height: 200.0, + child: ExampleGoogleMap( + onMapCreated: _onMapCreated, + initialCameraPosition: + const CameraPosition(target: LatLng(0.0, 0.0)), + ), + ), + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + Column( + children: [ + TextButton( + onPressed: () { + mapController?.animateCamera( + CameraUpdate.newCameraPosition( + const CameraPosition( + bearing: 270.0, + target: LatLng(51.5160895, -0.1294527), + tilt: 30.0, + zoom: 17.0, + ), + ), + ); + }, + child: const Text('newCameraPosition'), + ), + TextButton( + onPressed: () { + mapController?.animateCamera( + CameraUpdate.newLatLng( + const LatLng(56.1725505, 10.1850512), + ), + ); + }, + child: const Text('newLatLng'), + ), + TextButton( + onPressed: () { + mapController?.animateCamera( + CameraUpdate.newLatLngBounds( + LatLngBounds( + southwest: const LatLng(-38.483935, 113.248673), + northeast: const LatLng(-8.982446, 153.823821), + ), + 10.0, + ), + ); + }, + child: const Text('newLatLngBounds'), + ), + TextButton( + onPressed: () { + mapController?.animateCamera( + CameraUpdate.newLatLngZoom( + const LatLng(37.4231613, -122.087159), + 11.0, + ), + ); + }, + child: const Text('newLatLngZoom'), + ), + TextButton( + onPressed: () { + mapController?.animateCamera( + CameraUpdate.scrollBy(150.0, -225.0), + ); + }, + child: const Text('scrollBy'), + ), + ], + ), + Column( + children: [ + TextButton( + onPressed: () { + mapController?.animateCamera( + CameraUpdate.zoomBy( + -0.5, + const Offset(30.0, 20.0), + ), + ); + }, + child: const Text('zoomBy with focus'), + ), + TextButton( + onPressed: () { + mapController?.animateCamera( + CameraUpdate.zoomBy(-0.5), + ); + }, + child: const Text('zoomBy'), + ), + TextButton( + onPressed: () { + mapController?.animateCamera( + CameraUpdate.zoomIn(), + ); + }, + child: const Text('zoomIn'), + ), + TextButton( + onPressed: () { + mapController?.animateCamera( + CameraUpdate.zoomOut(), + ); + }, + child: const Text('zoomOut'), + ), + TextButton( + onPressed: () { + mapController?.animateCamera( + CameraUpdate.zoomTo(16.0), + ); + }, + child: const Text('zoomTo'), + ), + ], + ), + ], + ) + ], + ); + } +} diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/example_google_map.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/example_google_map.dart new file mode 100644 index 00000000000..e0817a55f28 --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/example_google_map.dart @@ -0,0 +1,538 @@ +// 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'; +// TODO(a14n): remove this import once Flutter 3.1 or later reaches stable (including flutter/flutter#104231) +// ignore: unnecessary_import +import 'dart:typed_data'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/gestures.dart'; +import 'package:flutter/material.dart'; +import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart'; + +// This is a pared down version of the Dart code from the app-facing package, +// to allow running the same examples for package-local testing. +// TODO(stuartmorgan): Consider extracting this to a shared package. See also +// https://github.com/flutter/flutter/issues/46716. + +/// Controller for a single ExampleGoogleMap instance running on the host platform. +class ExampleGoogleMapController { + ExampleGoogleMapController._( + this._googleMapState, { + required this.mapId, + }) { + _connectStreams(mapId); + } + + /// The mapId for this controller + final int mapId; + + /// Initialize control of a [ExampleGoogleMap] with [id]. + /// + /// Mainly for internal use when instantiating a [ExampleGoogleMapController] passed + /// in [ExampleGoogleMap.onMapCreated] callback. + static Future _init( + int id, + CameraPosition initialCameraPosition, + _ExampleGoogleMapState googleMapState, + ) async { + await GoogleMapsFlutterPlatform.instance.init(id); + return ExampleGoogleMapController._( + googleMapState, + mapId: id, + ); + } + + final _ExampleGoogleMapState _googleMapState; + + void _connectStreams(int mapId) { + if (_googleMapState.widget.onCameraMoveStarted != null) { + GoogleMapsFlutterPlatform.instance + .onCameraMoveStarted(mapId: mapId) + .listen((_) => _googleMapState.widget.onCameraMoveStarted!()); + } + if (_googleMapState.widget.onCameraMove != null) { + GoogleMapsFlutterPlatform.instance.onCameraMove(mapId: mapId).listen( + (CameraMoveEvent e) => _googleMapState.widget.onCameraMove!(e.value)); + } + if (_googleMapState.widget.onCameraIdle != null) { + GoogleMapsFlutterPlatform.instance + .onCameraIdle(mapId: mapId) + .listen((_) => _googleMapState.widget.onCameraIdle!()); + } + GoogleMapsFlutterPlatform.instance + .onMarkerTap(mapId: mapId) + .listen((MarkerTapEvent e) => _googleMapState.onMarkerTap(e.value)); + GoogleMapsFlutterPlatform.instance.onMarkerDragStart(mapId: mapId).listen( + (MarkerDragStartEvent e) => + _googleMapState.onMarkerDragStart(e.value, e.position)); + GoogleMapsFlutterPlatform.instance.onMarkerDrag(mapId: mapId).listen( + (MarkerDragEvent e) => + _googleMapState.onMarkerDrag(e.value, e.position)); + GoogleMapsFlutterPlatform.instance.onMarkerDragEnd(mapId: mapId).listen( + (MarkerDragEndEvent e) => + _googleMapState.onMarkerDragEnd(e.value, e.position)); + GoogleMapsFlutterPlatform.instance.onInfoWindowTap(mapId: mapId).listen( + (InfoWindowTapEvent e) => _googleMapState.onInfoWindowTap(e.value)); + GoogleMapsFlutterPlatform.instance + .onPolylineTap(mapId: mapId) + .listen((PolylineTapEvent e) => _googleMapState.onPolylineTap(e.value)); + GoogleMapsFlutterPlatform.instance + .onPolygonTap(mapId: mapId) + .listen((PolygonTapEvent e) => _googleMapState.onPolygonTap(e.value)); + GoogleMapsFlutterPlatform.instance + .onCircleTap(mapId: mapId) + .listen((CircleTapEvent e) => _googleMapState.onCircleTap(e.value)); + GoogleMapsFlutterPlatform.instance + .onTap(mapId: mapId) + .listen((MapTapEvent e) => _googleMapState.onTap(e.position)); + GoogleMapsFlutterPlatform.instance.onLongPress(mapId: mapId).listen( + (MapLongPressEvent e) => _googleMapState.onLongPress(e.position)); + } + + /// Updates configuration options of the map user interface. + Future _updateMapConfiguration(MapConfiguration update) { + return GoogleMapsFlutterPlatform.instance + .updateMapConfiguration(update, mapId: mapId); + } + + /// Updates marker configuration. + Future _updateMarkers(MarkerUpdates markerUpdates) { + return GoogleMapsFlutterPlatform.instance + .updateMarkers(markerUpdates, mapId: mapId); + } + + /// Updates polygon configuration. + Future _updatePolygons(PolygonUpdates polygonUpdates) { + return GoogleMapsFlutterPlatform.instance + .updatePolygons(polygonUpdates, mapId: mapId); + } + + /// Updates polyline configuration. + Future _updatePolylines(PolylineUpdates polylineUpdates) { + return GoogleMapsFlutterPlatform.instance + .updatePolylines(polylineUpdates, mapId: mapId); + } + + /// Updates circle configuration. + Future _updateCircles(CircleUpdates circleUpdates) { + return GoogleMapsFlutterPlatform.instance + .updateCircles(circleUpdates, mapId: mapId); + } + + /// Updates tile overlays configuration. + Future _updateTileOverlays(Set newTileOverlays) { + return GoogleMapsFlutterPlatform.instance + .updateTileOverlays(newTileOverlays: newTileOverlays, mapId: mapId); + } + + /// Clears the tile cache so that all tiles will be requested again from the + /// [TileProvider]. + Future clearTileCache(TileOverlayId tileOverlayId) async { + return GoogleMapsFlutterPlatform.instance + .clearTileCache(tileOverlayId, mapId: mapId); + } + + /// Starts an animated change of the map camera position. + Future animateCamera(CameraUpdate cameraUpdate) { + return GoogleMapsFlutterPlatform.instance + .animateCamera(cameraUpdate, mapId: mapId); + } + + /// Changes the map camera position. + Future moveCamera(CameraUpdate cameraUpdate) { + return GoogleMapsFlutterPlatform.instance + .moveCamera(cameraUpdate, mapId: mapId); + } + + /// Sets the styling of the base map. + Future setMapStyle(String? mapStyle) { + return GoogleMapsFlutterPlatform.instance + .setMapStyle(mapStyle, mapId: mapId); + } + + /// Return [LatLngBounds] defining the region that is visible in a map. + Future getVisibleRegion() { + return GoogleMapsFlutterPlatform.instance.getVisibleRegion(mapId: mapId); + } + + /// Return [ScreenCoordinate] of the [LatLng] in the current map view. + Future getScreenCoordinate(LatLng latLng) { + return GoogleMapsFlutterPlatform.instance + .getScreenCoordinate(latLng, mapId: mapId); + } + + /// Returns [LatLng] corresponding to the [ScreenCoordinate] in the current map view. + Future getLatLng(ScreenCoordinate screenCoordinate) { + return GoogleMapsFlutterPlatform.instance + .getLatLng(screenCoordinate, mapId: mapId); + } + + /// Programmatically show the Info Window for a [Marker]. + Future showMarkerInfoWindow(MarkerId markerId) { + return GoogleMapsFlutterPlatform.instance + .showMarkerInfoWindow(markerId, mapId: mapId); + } + + /// Programmatically hide the Info Window for a [Marker]. + Future hideMarkerInfoWindow(MarkerId markerId) { + return GoogleMapsFlutterPlatform.instance + .hideMarkerInfoWindow(markerId, mapId: mapId); + } + + /// Returns `true` when the [InfoWindow] is showing, `false` otherwise. + Future isMarkerInfoWindowShown(MarkerId markerId) { + return GoogleMapsFlutterPlatform.instance + .isMarkerInfoWindowShown(markerId, mapId: mapId); + } + + /// Returns the current zoom level of the map + Future getZoomLevel() { + return GoogleMapsFlutterPlatform.instance.getZoomLevel(mapId: mapId); + } + + /// Returns the image bytes of the map + Future takeSnapshot() { + return GoogleMapsFlutterPlatform.instance.takeSnapshot(mapId: mapId); + } + + /// Disposes of the platform resources + void dispose() { + GoogleMapsFlutterPlatform.instance.dispose(mapId: mapId); + } +} + +// The next map ID to create. +int _nextMapCreationId = 0; + +/// A widget which displays a map with data obtained from the Google Maps service. +class ExampleGoogleMap extends StatefulWidget { + /// Creates a widget displaying data from Google Maps services. + /// + /// [AssertionError] will be thrown if [initialCameraPosition] is null; + const ExampleGoogleMap({ + super.key, + required this.initialCameraPosition, + this.onMapCreated, + this.gestureRecognizers = const >{}, + this.compassEnabled = true, + this.mapToolbarEnabled = true, + this.cameraTargetBounds = CameraTargetBounds.unbounded, + this.mapType = MapType.normal, + this.minMaxZoomPreference = MinMaxZoomPreference.unbounded, + this.rotateGesturesEnabled = true, + this.scrollGesturesEnabled = true, + this.zoomControlsEnabled = true, + this.zoomGesturesEnabled = true, + this.liteModeEnabled = false, + this.tiltGesturesEnabled = true, + this.myLocationEnabled = false, + this.myLocationButtonEnabled = true, + this.layoutDirection, + + /// If no padding is specified default padding will be 0. + this.padding = EdgeInsets.zero, + this.indoorViewEnabled = false, + this.trafficEnabled = false, + this.buildingsEnabled = true, + this.markers = const {}, + this.polygons = const {}, + this.polylines = const {}, + this.circles = const {}, + this.onCameraMoveStarted, + this.tileOverlays = const {}, + this.onCameraMove, + this.onCameraIdle, + this.onTap, + this.onLongPress, + }); + + /// Callback method for when the map is ready to be used. + /// + /// Used to receive a [ExampleGoogleMapController] for this [ExampleGoogleMap]. + final void Function(ExampleGoogleMapController controller)? onMapCreated; + + /// The initial position of the map's camera. + final CameraPosition initialCameraPosition; + + /// True if the map should show a compass when rotated. + final bool compassEnabled; + + /// True if the map should show a toolbar when you interact with the map. Android only. + final bool mapToolbarEnabled; + + /// Geographical bounding box for the camera target. + final CameraTargetBounds cameraTargetBounds; + + /// Type of map tiles to be rendered. + final MapType mapType; + + /// The layout direction to use for the embedded view. + final TextDirection? layoutDirection; + + /// Preferred bounds for the camera zoom level. + /// + /// Actual bounds depend on map data and device. + final MinMaxZoomPreference minMaxZoomPreference; + + /// True if the map view should respond to rotate gestures. + final bool rotateGesturesEnabled; + + /// True if the map view should respond to scroll gestures. + final bool scrollGesturesEnabled; + + /// True if the map view should show zoom controls. This includes two buttons + /// to zoom in and zoom out. The default value is to show zoom controls. + final bool zoomControlsEnabled; + + /// True if the map view should respond to zoom gestures. + final bool zoomGesturesEnabled; + + /// True if the map view should be in lite mode. Android only. + final bool liteModeEnabled; + + /// True if the map view should respond to tilt gestures. + final bool tiltGesturesEnabled; + + /// Padding to be set on map. + final EdgeInsets padding; + + /// Markers to be placed on the map. + final Set markers; + + /// Polygons to be placed on the map. + final Set polygons; + + /// Polylines to be placed on the map. + final Set polylines; + + /// Circles to be placed on the map. + final Set circles; + + /// Tile overlays to be placed on the map. + final Set tileOverlays; + + /// Called when the camera starts moving. + final VoidCallback? onCameraMoveStarted; + + /// Called repeatedly as the camera continues to move after an + /// onCameraMoveStarted call. + final CameraPositionCallback? onCameraMove; + + /// Called when camera movement has ended, there are no pending + /// animations and the user has stopped interacting with the map. + final VoidCallback? onCameraIdle; + + /// Called every time a [ExampleGoogleMap] is tapped. + final ArgumentCallback? onTap; + + /// Called every time a [ExampleGoogleMap] is long pressed. + final ArgumentCallback? onLongPress; + + /// True if a "My Location" layer should be shown on the map. + final bool myLocationEnabled; + + /// Enables or disables the my-location button. + final bool myLocationButtonEnabled; + + /// Enables or disables the indoor view from the map + final bool indoorViewEnabled; + + /// Enables or disables the traffic layer of the map + final bool trafficEnabled; + + /// Enables or disables showing 3D buildings where available + final bool buildingsEnabled; + + /// Which gestures should be consumed by the map. + final Set> gestureRecognizers; + + /// Creates a [State] for this [ExampleGoogleMap]. + @override + State createState() => _ExampleGoogleMapState(); +} + +class _ExampleGoogleMapState extends State { + final int _mapId = _nextMapCreationId++; + + final Completer _controller = + Completer(); + + Map _markers = {}; + Map _polygons = {}; + Map _polylines = {}; + Map _circles = {}; + late MapConfiguration _mapConfiguration; + + @override + Widget build(BuildContext context) { + return GoogleMapsFlutterPlatform.instance.buildViewWithConfiguration( + _mapId, + onPlatformViewCreated, + widgetConfiguration: MapWidgetConfiguration( + textDirection: widget.layoutDirection ?? + Directionality.maybeOf(context) ?? + TextDirection.ltr, + initialCameraPosition: widget.initialCameraPosition, + gestureRecognizers: widget.gestureRecognizers, + ), + mapObjects: MapObjects( + markers: widget.markers, + polygons: widget.polygons, + polylines: widget.polylines, + circles: widget.circles, + ), + mapConfiguration: _mapConfiguration, + ); + } + + @override + void initState() { + super.initState(); + _mapConfiguration = _configurationFromMapWidget(widget); + _markers = keyByMarkerId(widget.markers); + _polygons = keyByPolygonId(widget.polygons); + _polylines = keyByPolylineId(widget.polylines); + _circles = keyByCircleId(widget.circles); + } + + @override + void dispose() { + _controller.future + .then((ExampleGoogleMapController controller) => controller.dispose()); + super.dispose(); + } + + @override + void didUpdateWidget(ExampleGoogleMap oldWidget) { + super.didUpdateWidget(oldWidget); + _updateOptions(); + _updateMarkers(); + _updatePolygons(); + _updatePolylines(); + _updateCircles(); + _updateTileOverlays(); + } + + Future _updateOptions() async { + final MapConfiguration newConfig = _configurationFromMapWidget(widget); + final MapConfiguration updates = newConfig.diffFrom(_mapConfiguration); + if (updates.isEmpty) { + return; + } + final ExampleGoogleMapController controller = await _controller.future; + controller._updateMapConfiguration(updates); + _mapConfiguration = newConfig; + } + + Future _updateMarkers() async { + final ExampleGoogleMapController controller = await _controller.future; + controller._updateMarkers( + MarkerUpdates.from(_markers.values.toSet(), widget.markers)); + _markers = keyByMarkerId(widget.markers); + } + + Future _updatePolygons() async { + final ExampleGoogleMapController controller = await _controller.future; + controller._updatePolygons( + PolygonUpdates.from(_polygons.values.toSet(), widget.polygons)); + _polygons = keyByPolygonId(widget.polygons); + } + + Future _updatePolylines() async { + final ExampleGoogleMapController controller = await _controller.future; + controller._updatePolylines( + PolylineUpdates.from(_polylines.values.toSet(), widget.polylines)); + _polylines = keyByPolylineId(widget.polylines); + } + + Future _updateCircles() async { + final ExampleGoogleMapController controller = await _controller.future; + controller._updateCircles( + CircleUpdates.from(_circles.values.toSet(), widget.circles)); + _circles = keyByCircleId(widget.circles); + } + + Future _updateTileOverlays() async { + final ExampleGoogleMapController controller = await _controller.future; + controller._updateTileOverlays(widget.tileOverlays); + } + + Future onPlatformViewCreated(int id) async { + final ExampleGoogleMapController controller = + await ExampleGoogleMapController._init( + id, + widget.initialCameraPosition, + this, + ); + _controller.complete(controller); + _updateTileOverlays(); + widget.onMapCreated?.call(controller); + } + + void onMarkerTap(MarkerId markerId) { + _markers[markerId]!.onTap?.call(); + } + + void onMarkerDragStart(MarkerId markerId, LatLng position) { + _markers[markerId]!.onDragStart?.call(position); + } + + void onMarkerDrag(MarkerId markerId, LatLng position) { + _markers[markerId]!.onDrag?.call(position); + } + + void onMarkerDragEnd(MarkerId markerId, LatLng position) { + _markers[markerId]!.onDragEnd?.call(position); + } + + void onPolygonTap(PolygonId polygonId) { + _polygons[polygonId]!.onTap?.call(); + } + + void onPolylineTap(PolylineId polylineId) { + _polylines[polylineId]!.onTap?.call(); + } + + void onCircleTap(CircleId circleId) { + _circles[circleId]!.onTap?.call(); + } + + void onInfoWindowTap(MarkerId markerId) { + _markers[markerId]!.infoWindow.onTap?.call(); + } + + void onTap(LatLng position) { + widget.onTap?.call(position); + } + + void onLongPress(LatLng position) { + widget.onLongPress?.call(position); + } +} + +/// Builds a [MapConfiguration] from the given [map]. +MapConfiguration _configurationFromMapWidget(ExampleGoogleMap map) { + return MapConfiguration( + compassEnabled: map.compassEnabled, + mapToolbarEnabled: map.mapToolbarEnabled, + cameraTargetBounds: map.cameraTargetBounds, + mapType: map.mapType, + minMaxZoomPreference: map.minMaxZoomPreference, + rotateGesturesEnabled: map.rotateGesturesEnabled, + scrollGesturesEnabled: map.scrollGesturesEnabled, + tiltGesturesEnabled: map.tiltGesturesEnabled, + trackCameraPosition: map.onCameraMove != null, + zoomControlsEnabled: map.zoomControlsEnabled, + zoomGesturesEnabled: map.zoomGesturesEnabled, + liteModeEnabled: map.liteModeEnabled, + myLocationEnabled: map.myLocationEnabled, + myLocationButtonEnabled: map.myLocationButtonEnabled, + padding: map.padding, + indoorViewEnabled: map.indoorViewEnabled, + trafficEnabled: map.trafficEnabled, + buildingsEnabled: map.buildingsEnabled, + ); +} diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/lite_mode.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/lite_mode.dart new file mode 100644 index 00000000000..f7bead951f5 --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/lite_mode.dart @@ -0,0 +1,47 @@ +// 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. + +// ignore_for_file: public_member_api_docs + +import 'package:flutter/material.dart'; +import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart'; + +import 'example_google_map.dart'; +import 'page.dart'; + +const CameraPosition _kInitialPosition = + CameraPosition(target: LatLng(-33.852, 151.211), zoom: 11.0); + +class LiteModePage extends GoogleMapExampleAppPage { + const LiteModePage({Key? key}) + : super(const Icon(Icons.map), 'Lite mode', key: key); + + @override + Widget build(BuildContext context) { + return const _LiteModeBody(); + } +} + +class _LiteModeBody extends StatelessWidget { + const _LiteModeBody(); + + @override + Widget build(BuildContext context) { + return const Card( + child: Padding( + padding: EdgeInsets.symmetric(vertical: 30.0), + child: Center( + child: SizedBox( + width: 300.0, + height: 300.0, + child: ExampleGoogleMap( + initialCameraPosition: _kInitialPosition, + liteModeEnabled: true, + ), + ), + ), + ), + ); + } +} diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/main.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/main.dart new file mode 100644 index 00000000000..3b1e6361b96 --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/main.dart @@ -0,0 +1,73 @@ +// 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 'animate_camera.dart'; +import 'lite_mode.dart'; +import 'map_click.dart'; +import 'map_coordinates.dart'; +import 'map_ui.dart'; +import 'marker_icons.dart'; +import 'move_camera.dart'; +import 'padding.dart'; +import 'page.dart'; +import 'place_circle.dart'; +import 'place_marker.dart'; +import 'place_polygon.dart'; +import 'place_polyline.dart'; +import 'scrolling_map.dart'; +import 'snapshot.dart'; +import 'tile_overlay.dart'; + +final List _allPages = [ + const MapUiPage(), + const MapCoordinatesPage(), + const MapClickPage(), + const AnimateCameraPage(), + const MoveCameraPage(), + const PlaceMarkerPage(), + const MarkerIconsPage(), + const ScrollingMapPage(), + const PlacePolylinePage(), + const PlacePolygonPage(), + const PlaceCirclePage(), + const PaddingPage(), + const SnapshotPage(), + const LiteModePage(), + const TileOverlayPage(), +]; + +/// MapsDemo is the Main Application. +class MapsDemo extends StatelessWidget { + /// Default Constructor + const MapsDemo({super.key}); + + void _pushPage(BuildContext context, GoogleMapExampleAppPage page) { + Navigator.of(context).push(MaterialPageRoute( + builder: (_) => Scaffold( + appBar: AppBar(title: Text(page.title)), + body: page, + ))); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar(title: const Text('GoogleMaps examples')), + body: ListView.builder( + itemCount: _allPages.length, + itemBuilder: (_, int index) => ListTile( + leading: _allPages[index].leading, + title: Text(_allPages[index].title), + onTap: () => _pushPage(context, _allPages[index]), + ), + ), + ); + } +} + +void main() { + runApp(const MaterialApp(home: MapsDemo())); +} diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/map_click.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/map_click.dart new file mode 100644 index 00000000000..4017a9fccce --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/map_click.dart @@ -0,0 +1,105 @@ +// 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. + +// ignore_for_file: public_member_api_docs + +import 'package:flutter/material.dart'; +import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart'; + +import 'example_google_map.dart'; +import 'page.dart'; + +const CameraPosition _kInitialPosition = + CameraPosition(target: LatLng(-33.852, 151.211), zoom: 11.0); + +class MapClickPage extends GoogleMapExampleAppPage { + const MapClickPage({Key? key}) + : super(const Icon(Icons.mouse), 'Map click', key: key); + + @override + Widget build(BuildContext context) { + return const _MapClickBody(); + } +} + +class _MapClickBody extends StatefulWidget { + const _MapClickBody(); + + @override + State createState() => _MapClickBodyState(); +} + +class _MapClickBodyState extends State<_MapClickBody> { + _MapClickBodyState(); + + ExampleGoogleMapController? mapController; + LatLng? _lastTap; + LatLng? _lastLongPress; + + @override + Widget build(BuildContext context) { + final ExampleGoogleMap googleMap = ExampleGoogleMap( + onMapCreated: onMapCreated, + initialCameraPosition: _kInitialPosition, + onTap: (LatLng pos) { + setState(() { + _lastTap = pos; + }); + }, + onLongPress: (LatLng pos) { + setState(() { + _lastLongPress = pos; + }); + }, + ); + + final List columnChildren = [ + Padding( + padding: const EdgeInsets.all(10.0), + child: Center( + child: SizedBox( + width: 300.0, + height: 200.0, + child: googleMap, + ), + ), + ), + ]; + + if (mapController != null) { + final String lastTap = 'Tap:\n${_lastTap ?? ""}\n'; + final String lastLongPress = 'Long press:\n${_lastLongPress ?? ""}'; + columnChildren.add(Center( + child: Text( + lastTap, + textAlign: TextAlign.center, + ))); + columnChildren.add(Center( + child: Text( + _lastTap != null ? 'Tapped' : '', + textAlign: TextAlign.center, + ))); + columnChildren.add(Center( + child: Text( + lastLongPress, + textAlign: TextAlign.center, + ))); + columnChildren.add(Center( + child: Text( + _lastLongPress != null ? 'Long pressed' : '', + textAlign: TextAlign.center, + ))); + } + return Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: columnChildren, + ); + } + + Future onMapCreated(ExampleGoogleMapController controller) async { + setState(() { + mapController = controller; + }); + } +} diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/map_coordinates.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/map_coordinates.dart new file mode 100644 index 00000000000..25247bc7c7b --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/map_coordinates.dart @@ -0,0 +1,104 @@ +// 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. + +// ignore_for_file: public_member_api_docs + +import 'package:flutter/material.dart'; +import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart'; + +import 'example_google_map.dart'; +import 'page.dart'; + +const CameraPosition _kInitialPosition = + CameraPosition(target: LatLng(-33.852, 151.211), zoom: 11.0); + +class MapCoordinatesPage extends GoogleMapExampleAppPage { + const MapCoordinatesPage({Key? key}) + : super(const Icon(Icons.map), 'Map coordinates', key: key); + + @override + Widget build(BuildContext context) { + return const _MapCoordinatesBody(); + } +} + +class _MapCoordinatesBody extends StatefulWidget { + const _MapCoordinatesBody(); + + @override + State createState() => _MapCoordinatesBodyState(); +} + +class _MapCoordinatesBodyState extends State<_MapCoordinatesBody> { + _MapCoordinatesBodyState(); + + ExampleGoogleMapController? mapController; + LatLngBounds _visibleRegion = LatLngBounds( + southwest: const LatLng(0, 0), + northeast: const LatLng(0, 0), + ); + + @override + Widget build(BuildContext context) { + final ExampleGoogleMap googleMap = ExampleGoogleMap( + onMapCreated: onMapCreated, + initialCameraPosition: _kInitialPosition, + onCameraIdle: + _updateVisibleRegion, // https://github.com/flutter/flutter/issues/54758 + ); + + return NotificationListener( + onNotification: (ScrollNotification scrollState) { + _updateVisibleRegion(); + return true; + }, + child: Stack( + children: [ + ListView( + children: [ + Padding( + padding: const EdgeInsets.all(10.0), + child: Center( + child: SizedBox( + width: 300.0, + height: 200.0, + child: googleMap, + ), + ), + ), + // Add a block at the bottom of this list to allow validation that the visible region of the map + // does not change when scrolled under the safe view on iOS. + // https://github.com/flutter/flutter/issues/107913 + const SizedBox( + width: 300, + height: 1000, + ), + ], + ), + if (mapController != null) + Center( + child: Text('VisibleRegion:' + '\nnortheast: ${_visibleRegion.northeast},' + '\nsouthwest: ${_visibleRegion.southwest}'), + ), + ], + ), + ); + } + + Future onMapCreated(ExampleGoogleMapController controller) async { + final LatLngBounds visibleRegion = await controller.getVisibleRegion(); + setState(() { + mapController = controller; + _visibleRegion = visibleRegion; + }); + } + + Future _updateVisibleRegion() async { + final LatLngBounds visibleRegion = await mapController!.getVisibleRegion(); + setState(() { + _visibleRegion = visibleRegion; + }); + } +} diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/map_ui.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/map_ui.dart new file mode 100644 index 00000000000..311e2267aa0 --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/map_ui.dart @@ -0,0 +1,357 @@ +// 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. + +// ignore_for_file: public_member_api_docs + +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart' show rootBundle; +import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart'; + +import 'example_google_map.dart'; +import 'page.dart'; + +final LatLngBounds sydneyBounds = LatLngBounds( + southwest: const LatLng(-34.022631, 150.620685), + northeast: const LatLng(-33.571835, 151.325952), +); + +class MapUiPage extends GoogleMapExampleAppPage { + const MapUiPage({Key? key}) + : super(const Icon(Icons.map), 'User interface', key: key); + + @override + Widget build(BuildContext context) { + return const MapUiBody(); + } +} + +class MapUiBody extends StatefulWidget { + const MapUiBody({super.key}); + + @override + State createState() => MapUiBodyState(); +} + +class MapUiBodyState extends State { + MapUiBodyState(); + + static const CameraPosition _kInitialPosition = CameraPosition( + target: LatLng(-33.852, 151.211), + zoom: 11.0, + ); + + CameraPosition _position = _kInitialPosition; + bool _isMapCreated = false; + final bool _isMoving = false; + bool _compassEnabled = true; + bool _mapToolbarEnabled = true; + CameraTargetBounds _cameraTargetBounds = CameraTargetBounds.unbounded; + MinMaxZoomPreference _minMaxZoomPreference = MinMaxZoomPreference.unbounded; + MapType _mapType = MapType.normal; + bool _rotateGesturesEnabled = true; + bool _scrollGesturesEnabled = true; + bool _tiltGesturesEnabled = true; + bool _zoomControlsEnabled = false; + bool _zoomGesturesEnabled = true; + bool _indoorViewEnabled = true; + bool _myLocationEnabled = true; + bool _myTrafficEnabled = false; + bool _myLocationButtonEnabled = true; + late ExampleGoogleMapController _controller; + bool _nightMode = false; + + @override + void initState() { + super.initState(); + } + + @override + void dispose() { + super.dispose(); + } + + Widget _compassToggler() { + return TextButton( + child: Text('${_compassEnabled ? 'disable' : 'enable'} compass'), + onPressed: () { + setState(() { + _compassEnabled = !_compassEnabled; + }); + }, + ); + } + + Widget _mapToolbarToggler() { + return TextButton( + child: Text('${_mapToolbarEnabled ? 'disable' : 'enable'} map toolbar'), + onPressed: () { + setState(() { + _mapToolbarEnabled = !_mapToolbarEnabled; + }); + }, + ); + } + + Widget _latLngBoundsToggler() { + return TextButton( + child: Text( + _cameraTargetBounds.bounds == null + ? 'bound camera target' + : 'release camera target', + ), + onPressed: () { + setState(() { + _cameraTargetBounds = _cameraTargetBounds.bounds == null + ? CameraTargetBounds(sydneyBounds) + : CameraTargetBounds.unbounded; + }); + }, + ); + } + + Widget _zoomBoundsToggler() { + return TextButton( + child: Text(_minMaxZoomPreference.minZoom == null + ? 'bound zoom' + : 'release zoom'), + onPressed: () { + setState(() { + _minMaxZoomPreference = _minMaxZoomPreference.minZoom == null + ? const MinMaxZoomPreference(12.0, 16.0) + : MinMaxZoomPreference.unbounded; + }); + }, + ); + } + + Widget _mapTypeCycler() { + final MapType nextType = + MapType.values[(_mapType.index + 1) % MapType.values.length]; + return TextButton( + child: Text('change map type to $nextType'), + onPressed: () { + setState(() { + _mapType = nextType; + }); + }, + ); + } + + Widget _rotateToggler() { + return TextButton( + child: Text('${_rotateGesturesEnabled ? 'disable' : 'enable'} rotate'), + onPressed: () { + setState(() { + _rotateGesturesEnabled = !_rotateGesturesEnabled; + }); + }, + ); + } + + Widget _scrollToggler() { + return TextButton( + child: Text('${_scrollGesturesEnabled ? 'disable' : 'enable'} scroll'), + onPressed: () { + setState(() { + _scrollGesturesEnabled = !_scrollGesturesEnabled; + }); + }, + ); + } + + Widget _tiltToggler() { + return TextButton( + child: Text('${_tiltGesturesEnabled ? 'disable' : 'enable'} tilt'), + onPressed: () { + setState(() { + _tiltGesturesEnabled = !_tiltGesturesEnabled; + }); + }, + ); + } + + Widget _zoomToggler() { + return TextButton( + child: Text('${_zoomGesturesEnabled ? 'disable' : 'enable'} zoom'), + onPressed: () { + setState(() { + _zoomGesturesEnabled = !_zoomGesturesEnabled; + }); + }, + ); + } + + Widget _zoomControlsToggler() { + return TextButton( + child: + Text('${_zoomControlsEnabled ? 'disable' : 'enable'} zoom controls'), + onPressed: () { + setState(() { + _zoomControlsEnabled = !_zoomControlsEnabled; + }); + }, + ); + } + + Widget _indoorViewToggler() { + return TextButton( + child: Text('${_indoorViewEnabled ? 'disable' : 'enable'} indoor'), + onPressed: () { + setState(() { + _indoorViewEnabled = !_indoorViewEnabled; + }); + }, + ); + } + + Widget _myLocationToggler() { + return TextButton( + child: Text( + '${_myLocationEnabled ? 'disable' : 'enable'} my location marker'), + onPressed: () { + setState(() { + _myLocationEnabled = !_myLocationEnabled; + }); + }, + ); + } + + Widget _myLocationButtonToggler() { + return TextButton( + child: Text( + '${_myLocationButtonEnabled ? 'disable' : 'enable'} my location button'), + onPressed: () { + setState(() { + _myLocationButtonEnabled = !_myLocationButtonEnabled; + }); + }, + ); + } + + Widget _myTrafficToggler() { + return TextButton( + child: Text('${_myTrafficEnabled ? 'disable' : 'enable'} my traffic'), + onPressed: () { + setState(() { + _myTrafficEnabled = !_myTrafficEnabled; + }); + }, + ); + } + + Future _getFileData(String path) async { + return rootBundle.loadString(path); + } + + void _setMapStyle(String mapStyle) { + setState(() { + _nightMode = true; + _controller.setMapStyle(mapStyle); + }); + } + + // Should only be called if _isMapCreated is true. + Widget _nightModeToggler() { + assert(_isMapCreated); + return TextButton( + child: Text('${_nightMode ? 'disable' : 'enable'} night mode'), + onPressed: () { + if (_nightMode) { + setState(() { + _nightMode = false; + _controller.setMapStyle(null); + }); + } else { + _getFileData('assets/night_mode.json').then(_setMapStyle); + } + }, + ); + } + + @override + Widget build(BuildContext context) { + final ExampleGoogleMap googleMap = ExampleGoogleMap( + onMapCreated: onMapCreated, + initialCameraPosition: _kInitialPosition, + compassEnabled: _compassEnabled, + mapToolbarEnabled: _mapToolbarEnabled, + cameraTargetBounds: _cameraTargetBounds, + minMaxZoomPreference: _minMaxZoomPreference, + mapType: _mapType, + rotateGesturesEnabled: _rotateGesturesEnabled, + scrollGesturesEnabled: _scrollGesturesEnabled, + tiltGesturesEnabled: _tiltGesturesEnabled, + zoomGesturesEnabled: _zoomGesturesEnabled, + zoomControlsEnabled: _zoomControlsEnabled, + indoorViewEnabled: _indoorViewEnabled, + myLocationEnabled: _myLocationEnabled, + myLocationButtonEnabled: _myLocationButtonEnabled, + trafficEnabled: _myTrafficEnabled, + onCameraMove: _updateCameraPosition, + ); + + final List columnChildren = [ + Padding( + padding: const EdgeInsets.all(10.0), + child: Center( + child: SizedBox( + width: 300.0, + height: 200.0, + child: googleMap, + ), + ), + ), + ]; + + if (_isMapCreated) { + columnChildren.add( + Expanded( + child: ListView( + children: [ + Text('camera bearing: ${_position.bearing}'), + Text( + 'camera target: ${_position.target.latitude.toStringAsFixed(4)},' + '${_position.target.longitude.toStringAsFixed(4)}'), + Text('camera zoom: ${_position.zoom}'), + Text('camera tilt: ${_position.tilt}'), + Text(_isMoving ? '(Camera moving)' : '(Camera idle)'), + _compassToggler(), + _mapToolbarToggler(), + _latLngBoundsToggler(), + _mapTypeCycler(), + _zoomBoundsToggler(), + _rotateToggler(), + _scrollToggler(), + _tiltToggler(), + _zoomToggler(), + _zoomControlsToggler(), + _indoorViewToggler(), + _myLocationToggler(), + _myLocationButtonToggler(), + _myTrafficToggler(), + _nightModeToggler(), + ], + ), + ), + ); + } + return Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: columnChildren, + ); + } + + void _updateCameraPosition(CameraPosition position) { + setState(() { + _position = position; + }); + } + + void onMapCreated(ExampleGoogleMapController controller) { + setState(() { + _controller = controller; + _isMapCreated = true; + }); + } +} diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/marker_icons.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/marker_icons.dart new file mode 100644 index 00000000000..174055613a9 --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/marker_icons.dart @@ -0,0 +1,98 @@ +// 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. + +// ignore_for_file: public_member_api_docs +// ignore_for_file: unawaited_futures + +import 'package:flutter/material.dart'; +import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart'; + +import 'example_google_map.dart'; +import 'page.dart'; + +class MarkerIconsPage extends GoogleMapExampleAppPage { + const MarkerIconsPage({Key? key}) + : super(const Icon(Icons.image), 'Marker icons', key: key); + + @override + Widget build(BuildContext context) { + return const MarkerIconsBody(); + } +} + +class MarkerIconsBody extends StatefulWidget { + const MarkerIconsBody({super.key}); + + @override + State createState() => MarkerIconsBodyState(); +} + +const LatLng _kMapCenter = LatLng(52.4478, -3.5402); + +class MarkerIconsBodyState extends State { + ExampleGoogleMapController? controller; + BitmapDescriptor? _markerIcon; + + @override + Widget build(BuildContext context) { + _createMarkerImageFromAsset(context); + return Column( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Center( + child: SizedBox( + width: 350.0, + height: 300.0, + child: ExampleGoogleMap( + initialCameraPosition: const CameraPosition( + target: _kMapCenter, + zoom: 7.0, + ), + markers: {_createMarker()}, + onMapCreated: _onMapCreated, + ), + ), + ) + ], + ); + } + + Marker _createMarker() { + if (_markerIcon != null) { + return Marker( + markerId: const MarkerId('marker_1'), + position: _kMapCenter, + icon: _markerIcon!, + ); + } else { + return const Marker( + markerId: MarkerId('marker_1'), + position: _kMapCenter, + ); + } + } + + Future _createMarkerImageFromAsset(BuildContext context) async { + if (_markerIcon == null) { + final ImageConfiguration imageConfiguration = + createLocalImageConfiguration(context, size: const Size.square(48)); + BitmapDescriptor.fromAssetImage( + imageConfiguration, 'assets/red_square.png') + .then(_updateBitmap); + } + } + + void _updateBitmap(BitmapDescriptor bitmap) { + setState(() { + _markerIcon = bitmap; + }); + } + + void _onMapCreated(ExampleGoogleMapController controllerParam) { + setState(() { + controller = controllerParam; + }); + } +} diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/move_camera.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/move_camera.dart new file mode 100644 index 00000000000..b1fb55cad54 --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/move_camera.dart @@ -0,0 +1,171 @@ +// 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. + +// ignore_for_file: public_member_api_docs + +import 'package:flutter/material.dart'; +import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart'; + +import 'example_google_map.dart'; +import 'page.dart'; + +class MoveCameraPage extends GoogleMapExampleAppPage { + const MoveCameraPage({Key? key}) + : super(const Icon(Icons.map), 'Camera control', key: key); + + @override + Widget build(BuildContext context) { + return const MoveCamera(); + } +} + +class MoveCamera extends StatefulWidget { + const MoveCamera({super.key}); + @override + State createState() => MoveCameraState(); +} + +class MoveCameraState extends State { + ExampleGoogleMapController? mapController; + + // ignore: use_setters_to_change_properties + void _onMapCreated(ExampleGoogleMapController controller) { + mapController = controller; + } + + @override + Widget build(BuildContext context) { + return Column( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Center( + child: SizedBox( + width: 300.0, + height: 200.0, + child: ExampleGoogleMap( + onMapCreated: _onMapCreated, + initialCameraPosition: + const CameraPosition(target: LatLng(0.0, 0.0)), + ), + ), + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + Column( + children: [ + TextButton( + onPressed: () { + mapController?.moveCamera( + CameraUpdate.newCameraPosition( + const CameraPosition( + bearing: 270.0, + target: LatLng(51.5160895, -0.1294527), + tilt: 30.0, + zoom: 17.0, + ), + ), + ); + }, + child: const Text('newCameraPosition'), + ), + TextButton( + onPressed: () { + mapController?.moveCamera( + CameraUpdate.newLatLng( + const LatLng(56.1725505, 10.1850512), + ), + ); + }, + child: const Text('newLatLng'), + ), + TextButton( + onPressed: () { + mapController?.moveCamera( + CameraUpdate.newLatLngBounds( + LatLngBounds( + southwest: const LatLng(-38.483935, 113.248673), + northeast: const LatLng(-8.982446, 153.823821), + ), + 10.0, + ), + ); + }, + child: const Text('newLatLngBounds'), + ), + TextButton( + onPressed: () { + mapController?.moveCamera( + CameraUpdate.newLatLngZoom( + const LatLng(37.4231613, -122.087159), + 11.0, + ), + ); + }, + child: const Text('newLatLngZoom'), + ), + TextButton( + onPressed: () { + mapController?.moveCamera( + CameraUpdate.scrollBy(150.0, -225.0), + ); + }, + child: const Text('scrollBy'), + ), + ], + ), + Column( + children: [ + TextButton( + onPressed: () { + mapController?.moveCamera( + CameraUpdate.zoomBy( + -0.5, + const Offset(30.0, 20.0), + ), + ); + }, + child: const Text('zoomBy with focus'), + ), + TextButton( + onPressed: () { + mapController?.moveCamera( + CameraUpdate.zoomBy(-0.5), + ); + }, + child: const Text('zoomBy'), + ), + TextButton( + onPressed: () { + mapController?.moveCamera( + CameraUpdate.zoomIn(), + ); + }, + child: const Text('zoomIn'), + ), + TextButton( + onPressed: () { + mapController?.moveCamera( + CameraUpdate.zoomOut(), + ); + }, + child: const Text('zoomOut'), + ), + TextButton( + onPressed: () { + mapController?.moveCamera( + CameraUpdate.zoomTo(16.0), + ); + }, + child: const Text('zoomTo'), + ), + ], + ), + ], + ) + ], + ); + } +} diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/padding.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/padding.dart new file mode 100644 index 00000000000..bfddb167d43 --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/padding.dart @@ -0,0 +1,180 @@ +// 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. + +// ignore_for_file: public_member_api_docs + +import 'package:flutter/material.dart'; +import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart'; + +import 'example_google_map.dart'; +import 'page.dart'; + +class PaddingPage extends GoogleMapExampleAppPage { + const PaddingPage({Key? key}) + : super(const Icon(Icons.map), 'Add padding to the map', key: key); + + @override + Widget build(BuildContext context) { + return const MarkerIconsBody(); + } +} + +class MarkerIconsBody extends StatefulWidget { + const MarkerIconsBody({super.key}); + + @override + State createState() => MarkerIconsBodyState(); +} + +const LatLng _kMapCenter = LatLng(52.4478, -3.5402); + +class MarkerIconsBodyState extends State { + ExampleGoogleMapController? controller; + + EdgeInsets _padding = EdgeInsets.zero; + + @override + Widget build(BuildContext context) { + final ExampleGoogleMap googleMap = ExampleGoogleMap( + onMapCreated: _onMapCreated, + initialCameraPosition: const CameraPosition( + target: _kMapCenter, + zoom: 7.0, + ), + padding: _padding, + ); + + final List columnChildren = [ + Padding( + padding: const EdgeInsets.all(10.0), + child: Center( + child: SizedBox( + width: 300.0, + height: 200.0, + child: googleMap, + ), + ), + ), + const Padding( + padding: EdgeInsets.only(top: 20), + child: Center( + child: Text( + 'Enter Padding Below', + style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold), + ), + ), + ), + ]; + + columnChildren.addAll([_paddingInput(), _buttons()]); + + return Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: columnChildren, + ); + } + + void _onMapCreated(ExampleGoogleMapController controllerParam) { + setState(() { + controller = controllerParam; + }); + } + + final TextEditingController _topController = TextEditingController(); + final TextEditingController _bottomController = TextEditingController(); + final TextEditingController _leftController = TextEditingController(); + final TextEditingController _rightController = TextEditingController(); + + Widget _paddingInput() { + return Padding( + padding: const EdgeInsets.all(16.0), + child: Row( + children: [ + Flexible( + flex: 2, + child: TextField( + controller: _topController, + keyboardType: TextInputType.number, + textAlign: TextAlign.center, + decoration: const InputDecoration( + hintText: 'Top', + ), + ), + ), + const Spacer(), + Flexible( + flex: 2, + child: TextField( + controller: _bottomController, + keyboardType: TextInputType.number, + textAlign: TextAlign.center, + decoration: const InputDecoration( + hintText: 'Bottom', + ), + ), + ), + const Spacer(), + Flexible( + flex: 2, + child: TextField( + controller: _leftController, + keyboardType: TextInputType.number, + textAlign: TextAlign.center, + decoration: const InputDecoration( + hintText: 'Left', + ), + ), + ), + const Spacer(), + Flexible( + flex: 2, + child: TextField( + controller: _rightController, + keyboardType: TextInputType.number, + textAlign: TextAlign.center, + decoration: const InputDecoration( + hintText: 'Right', + ), + ), + ), + ], + ), + ); + } + + Widget _buttons() { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + TextButton( + child: const Text('Set Padding'), + onPressed: () { + setState(() { + _padding = EdgeInsets.fromLTRB( + double.tryParse(_leftController.value.text) ?? 0, + double.tryParse(_topController.value.text) ?? 0, + double.tryParse(_rightController.value.text) ?? 0, + double.tryParse(_bottomController.value.text) ?? 0); + }); + }, + ), + TextButton( + child: const Text('Reset Padding'), + onPressed: () { + setState(() { + _topController.clear(); + _bottomController.clear(); + _leftController.clear(); + _rightController.clear(); + _padding = EdgeInsets.zero; + }); + }, + ) + ], + ), + ); + } +} diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/page.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/page.dart new file mode 100644 index 00000000000..cb8ef54d374 --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/page.dart @@ -0,0 +1,14 @@ +// 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. + +// ignore_for_file: public_member_api_docs + +import 'package:flutter/material.dart'; + +abstract class GoogleMapExampleAppPage extends StatelessWidget { + const GoogleMapExampleAppPage(this.leading, this.title, {super.key}); + + final Widget leading; + final String title; +} diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/place_circle.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/place_circle.dart new file mode 100644 index 00000000000..29be7442965 --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/place_circle.dart @@ -0,0 +1,232 @@ +// 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. + +// ignore_for_file: public_member_api_docs + +import 'package:flutter/material.dart'; +import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart'; + +import 'example_google_map.dart'; +import 'page.dart'; + +class PlaceCirclePage extends GoogleMapExampleAppPage { + const PlaceCirclePage({Key? key}) + : super(const Icon(Icons.linear_scale), 'Place circle', key: key); + + @override + Widget build(BuildContext context) { + return const PlaceCircleBody(); + } +} + +class PlaceCircleBody extends StatefulWidget { + const PlaceCircleBody({super.key}); + + @override + State createState() => PlaceCircleBodyState(); +} + +class PlaceCircleBodyState extends State { + PlaceCircleBodyState(); + + ExampleGoogleMapController? controller; + Map circles = {}; + int _circleIdCounter = 1; + CircleId? selectedCircle; + + // Values when toggling circle color + int fillColorsIndex = 0; + int strokeColorsIndex = 0; + List colors = [ + Colors.purple, + Colors.red, + Colors.green, + Colors.pink, + ]; + + // Values when toggling circle stroke width + int widthsIndex = 0; + List widths = [10, 20, 5]; + + // ignore: use_setters_to_change_properties + void _onMapCreated(ExampleGoogleMapController controller) { + this.controller = controller; + } + + @override + void dispose() { + super.dispose(); + } + + void _onCircleTapped(CircleId circleId) { + setState(() { + selectedCircle = circleId; + }); + } + + void _remove(CircleId circleId) { + setState(() { + if (circles.containsKey(circleId)) { + circles.remove(circleId); + } + if (circleId == selectedCircle) { + selectedCircle = null; + } + }); + } + + void _add() { + final int circleCount = circles.length; + + if (circleCount == 12) { + return; + } + + final String circleIdVal = 'circle_id_$_circleIdCounter'; + _circleIdCounter++; + final CircleId circleId = CircleId(circleIdVal); + + final Circle circle = Circle( + circleId: circleId, + consumeTapEvents: true, + strokeColor: Colors.orange, + fillColor: Colors.green, + strokeWidth: 5, + center: _createCenter(), + radius: 50000, + onTap: () { + _onCircleTapped(circleId); + }, + ); + + setState(() { + circles[circleId] = circle; + }); + } + + void _toggleVisible(CircleId circleId) { + final Circle circle = circles[circleId]!; + setState(() { + circles[circleId] = circle.copyWith( + visibleParam: !circle.visible, + ); + }); + } + + void _changeFillColor(CircleId circleId) { + final Circle circle = circles[circleId]!; + setState(() { + circles[circleId] = circle.copyWith( + fillColorParam: colors[++fillColorsIndex % colors.length], + ); + }); + } + + void _changeStrokeColor(CircleId circleId) { + final Circle circle = circles[circleId]!; + setState(() { + circles[circleId] = circle.copyWith( + strokeColorParam: colors[++strokeColorsIndex % colors.length], + ); + }); + } + + void _changeStrokeWidth(CircleId circleId) { + final Circle circle = circles[circleId]!; + setState(() { + circles[circleId] = circle.copyWith( + strokeWidthParam: widths[++widthsIndex % widths.length], + ); + }); + } + + @override + Widget build(BuildContext context) { + final CircleId? selectedId = selectedCircle; + return Column( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Center( + child: SizedBox( + width: 350.0, + height: 300.0, + child: ExampleGoogleMap( + initialCameraPosition: const CameraPosition( + target: LatLng(52.4478, -3.5402), + zoom: 7.0, + ), + circles: Set.of(circles.values), + onMapCreated: _onMapCreated, + ), + ), + ), + Expanded( + child: SingleChildScrollView( + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + Row( + children: [ + Column( + children: [ + TextButton( + onPressed: _add, + child: const Text('add'), + ), + TextButton( + onPressed: (selectedId == null) + ? null + : () => _remove(selectedId), + child: const Text('remove'), + ), + TextButton( + onPressed: (selectedId == null) + ? null + : () => _toggleVisible(selectedId), + child: const Text('toggle visible'), + ), + ], + ), + Column( + children: [ + TextButton( + onPressed: (selectedId == null) + ? null + : () => _changeStrokeWidth(selectedId), + child: const Text('change stroke width'), + ), + TextButton( + onPressed: (selectedId == null) + ? null + : () => _changeStrokeColor(selectedId), + child: const Text('change stroke color'), + ), + TextButton( + onPressed: (selectedId == null) + ? null + : () => _changeFillColor(selectedId), + child: const Text('change fill color'), + ), + ], + ) + ], + ) + ], + ), + ), + ), + ], + ); + } + + LatLng _createCenter() { + final double offset = _circleIdCounter.ceilToDouble(); + return _createLatLng(51.4816 + offset * 0.2, -3.1791); + } + + LatLng _createLatLng(double lat, double lng) { + return LatLng(lat, lng); + } +} diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/place_marker.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/place_marker.dart new file mode 100644 index 00000000000..9cba4975d40 --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/place_marker.dart @@ -0,0 +1,421 @@ +// 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. + +// ignore_for_file: public_member_api_docs + +import 'dart:async'; +import 'dart:math'; +import 'dart:typed_data'; +import 'dart:ui'; + +import 'package:flutter/material.dart'; +import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart'; + +import 'example_google_map.dart'; +import 'page.dart'; + +class PlaceMarkerPage extends GoogleMapExampleAppPage { + const PlaceMarkerPage({Key? key}) + : super(const Icon(Icons.place), 'Place marker', key: key); + + @override + Widget build(BuildContext context) { + return const PlaceMarkerBody(); + } +} + +class PlaceMarkerBody extends StatefulWidget { + const PlaceMarkerBody({super.key}); + + @override + State createState() => PlaceMarkerBodyState(); +} + +typedef MarkerUpdateAction = Marker Function(Marker marker); + +class PlaceMarkerBodyState extends State { + PlaceMarkerBodyState(); + static const LatLng center = LatLng(-33.86711, 151.1947171); + + ExampleGoogleMapController? controller; + Map markers = {}; + MarkerId? selectedMarker; + int _markerIdCounter = 1; + LatLng? markerPosition; + + // ignore: use_setters_to_change_properties + void _onMapCreated(ExampleGoogleMapController controller) { + this.controller = controller; + } + + @override + void dispose() { + super.dispose(); + } + + void _onMarkerTapped(MarkerId markerId) { + final Marker? tappedMarker = markers[markerId]; + if (tappedMarker != null) { + setState(() { + final MarkerId? previousMarkerId = selectedMarker; + if (previousMarkerId != null && markers.containsKey(previousMarkerId)) { + final Marker resetOld = markers[previousMarkerId]! + .copyWith(iconParam: BitmapDescriptor.defaultMarker); + markers[previousMarkerId] = resetOld; + } + selectedMarker = markerId; + final Marker newMarker = tappedMarker.copyWith( + iconParam: BitmapDescriptor.defaultMarkerWithHue( + BitmapDescriptor.hueGreen, + ), + ); + markers[markerId] = newMarker; + + markerPosition = null; + }); + } + } + + Future _onMarkerDrag(MarkerId markerId, LatLng newPosition) async { + setState(() { + markerPosition = newPosition; + }); + } + + Future _onMarkerDragEnd(MarkerId markerId, LatLng newPosition) async { + final Marker? tappedMarker = markers[markerId]; + if (tappedMarker != null) { + setState(() { + markerPosition = null; + }); + await showDialog( + context: context, + builder: (BuildContext context) { + return AlertDialog( + actions: [ + TextButton( + child: const Text('OK'), + onPressed: () => Navigator.of(context).pop(), + ) + ], + content: Padding( + padding: const EdgeInsets.symmetric(vertical: 66), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text('Old position: ${tappedMarker.position}'), + Text('New position: $newPosition'), + ], + ))); + }); + } + } + + void _add() { + final int markerCount = markers.length; + + if (markerCount == 12) { + return; + } + + final String markerIdVal = 'marker_id_$_markerIdCounter'; + _markerIdCounter++; + final MarkerId markerId = MarkerId(markerIdVal); + + final Marker marker = Marker( + markerId: markerId, + position: LatLng( + center.latitude + sin(_markerIdCounter * pi / 6.0) / 20.0, + center.longitude + cos(_markerIdCounter * pi / 6.0) / 20.0, + ), + infoWindow: InfoWindow(title: markerIdVal, snippet: '*'), + onTap: () => _onMarkerTapped(markerId), + onDragEnd: (LatLng position) => _onMarkerDragEnd(markerId, position), + onDrag: (LatLng position) => _onMarkerDrag(markerId, position), + ); + + setState(() { + markers[markerId] = marker; + }); + } + + void _remove(MarkerId markerId) { + setState(() { + if (markers.containsKey(markerId)) { + markers.remove(markerId); + } + }); + } + + void _changePosition(MarkerId markerId) { + final Marker marker = markers[markerId]!; + final LatLng current = marker.position; + final Offset offset = Offset( + center.latitude - current.latitude, + center.longitude - current.longitude, + ); + setState(() { + markers[markerId] = marker.copyWith( + positionParam: LatLng( + center.latitude + offset.dy, + center.longitude + offset.dx, + ), + ); + }); + } + + void _changeAnchor(MarkerId markerId) { + final Marker marker = markers[markerId]!; + final Offset currentAnchor = marker.anchor; + final Offset newAnchor = Offset(1.0 - currentAnchor.dy, currentAnchor.dx); + setState(() { + markers[markerId] = marker.copyWith( + anchorParam: newAnchor, + ); + }); + } + + Future _changeInfoAnchor(MarkerId markerId) async { + final Marker marker = markers[markerId]!; + final Offset currentAnchor = marker.infoWindow.anchor; + final Offset newAnchor = Offset(1.0 - currentAnchor.dy, currentAnchor.dx); + setState(() { + markers[markerId] = marker.copyWith( + infoWindowParam: marker.infoWindow.copyWith( + anchorParam: newAnchor, + ), + ); + }); + } + + Future _toggleDraggable(MarkerId markerId) async { + final Marker marker = markers[markerId]!; + setState(() { + markers[markerId] = marker.copyWith( + draggableParam: !marker.draggable, + ); + }); + } + + Future _toggleFlat(MarkerId markerId) async { + final Marker marker = markers[markerId]!; + setState(() { + markers[markerId] = marker.copyWith( + flatParam: !marker.flat, + ); + }); + } + + Future _changeInfo(MarkerId markerId) async { + final Marker marker = markers[markerId]!; + final String newSnippet = '${marker.infoWindow.snippet!}*'; + setState(() { + markers[markerId] = marker.copyWith( + infoWindowParam: marker.infoWindow.copyWith( + snippetParam: newSnippet, + ), + ); + }); + } + + Future _changeAlpha(MarkerId markerId) async { + final Marker marker = markers[markerId]!; + final double current = marker.alpha; + setState(() { + markers[markerId] = marker.copyWith( + alphaParam: current < 0.1 ? 1.0 : current * 0.75, + ); + }); + } + + Future _changeRotation(MarkerId markerId) async { + final Marker marker = markers[markerId]!; + final double current = marker.rotation; + setState(() { + markers[markerId] = marker.copyWith( + rotationParam: current == 330.0 ? 0.0 : current + 30.0, + ); + }); + } + + Future _toggleVisible(MarkerId markerId) async { + final Marker marker = markers[markerId]!; + setState(() { + markers[markerId] = marker.copyWith( + visibleParam: !marker.visible, + ); + }); + } + + Future _changeZIndex(MarkerId markerId) async { + final Marker marker = markers[markerId]!; + final double current = marker.zIndex; + setState(() { + markers[markerId] = marker.copyWith( + zIndexParam: current == 12.0 ? 0.0 : current + 1.0, + ); + }); + } + + void _setMarkerIcon(MarkerId markerId, BitmapDescriptor assetIcon) { + final Marker marker = markers[markerId]!; + setState(() { + markers[markerId] = marker.copyWith( + iconParam: assetIcon, + ); + }); + } + + Future _getAssetIcon(BuildContext context) async { + final Completer bitmapIcon = + Completer(); + final ImageConfiguration config = createLocalImageConfiguration(context); + + const AssetImage('assets/red_square.png') + .resolve(config) + .addListener(ImageStreamListener((ImageInfo image, bool sync) async { + final ByteData? bytes = + await image.image.toByteData(format: ImageByteFormat.png); + if (bytes == null) { + bitmapIcon.completeError(Exception('Unable to encode icon')); + return; + } + final BitmapDescriptor bitmap = + BitmapDescriptor.fromBytes(bytes.buffer.asUint8List()); + bitmapIcon.complete(bitmap); + })); + + return bitmapIcon.future; + } + + @override + Widget build(BuildContext context) { + final MarkerId? selectedId = selectedMarker; + return Stack(children: [ + Column( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Expanded( + child: ExampleGoogleMap( + onMapCreated: _onMapCreated, + initialCameraPosition: const CameraPosition( + target: LatLng(-33.852, 151.211), + zoom: 11.0, + ), + markers: Set.of(markers.values), + ), + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + TextButton( + onPressed: _add, + child: const Text('Add'), + ), + TextButton( + onPressed: + selectedId == null ? null : () => _remove(selectedId), + child: const Text('Remove'), + ), + ], + ), + Wrap( + alignment: WrapAlignment.spaceEvenly, + children: [ + TextButton( + onPressed: + selectedId == null ? null : () => _changeInfo(selectedId), + child: const Text('change info'), + ), + TextButton( + onPressed: selectedId == null + ? null + : () => _changeInfoAnchor(selectedId), + child: const Text('change info anchor'), + ), + TextButton( + onPressed: + selectedId == null ? null : () => _changeAlpha(selectedId), + child: const Text('change alpha'), + ), + TextButton( + onPressed: + selectedId == null ? null : () => _changeAnchor(selectedId), + child: const Text('change anchor'), + ), + TextButton( + onPressed: selectedId == null + ? null + : () => _toggleDraggable(selectedId), + child: const Text('toggle draggable'), + ), + TextButton( + onPressed: + selectedId == null ? null : () => _toggleFlat(selectedId), + child: const Text('toggle flat'), + ), + TextButton( + onPressed: selectedId == null + ? null + : () => _changePosition(selectedId), + child: const Text('change position'), + ), + TextButton( + onPressed: selectedId == null + ? null + : () => _changeRotation(selectedId), + child: const Text('change rotation'), + ), + TextButton( + onPressed: selectedId == null + ? null + : () => _toggleVisible(selectedId), + child: const Text('toggle visible'), + ), + TextButton( + onPressed: + selectedId == null ? null : () => _changeZIndex(selectedId), + child: const Text('change zIndex'), + ), + TextButton( + onPressed: selectedId == null + ? null + : () { + _getAssetIcon(context).then( + (BitmapDescriptor icon) { + _setMarkerIcon(selectedId, icon); + }, + ); + }, + child: const Text('set marker icon'), + ), + ], + ), + ], + ), + Visibility( + visible: markerPosition != null, + child: Container( + color: Colors.white70, + height: 30, + padding: const EdgeInsets.only(left: 12, right: 12), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + if (markerPosition == null) + Container() + else + Expanded(child: Text('lat: ${markerPosition!.latitude}')), + if (markerPosition == null) + Container() + else + Expanded(child: Text('lng: ${markerPosition!.longitude}')), + ], + ), + ), + ), + ]); + } +} diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/place_polygon.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/place_polygon.dart new file mode 100644 index 00000000000..889c38d6376 --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/place_polygon.dart @@ -0,0 +1,306 @@ +// 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. + +// ignore_for_file: public_member_api_docs + +import 'package:flutter/material.dart'; +import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart'; + +import 'example_google_map.dart'; +import 'page.dart'; + +class PlacePolygonPage extends GoogleMapExampleAppPage { + const PlacePolygonPage({Key? key}) + : super(const Icon(Icons.linear_scale), 'Place polygon', key: key); + + @override + Widget build(BuildContext context) { + return const PlacePolygonBody(); + } +} + +class PlacePolygonBody extends StatefulWidget { + const PlacePolygonBody({super.key}); + + @override + State createState() => PlacePolygonBodyState(); +} + +class PlacePolygonBodyState extends State { + PlacePolygonBodyState(); + + ExampleGoogleMapController? controller; + Map polygons = {}; + Map polygonOffsets = {}; + int _polygonIdCounter = 0; + PolygonId? selectedPolygon; + + // Values when toggling polygon color + int strokeColorsIndex = 0; + int fillColorsIndex = 0; + List colors = [ + Colors.purple, + Colors.red, + Colors.green, + Colors.pink, + ]; + + // Values when toggling polygon width + int widthsIndex = 0; + List widths = [10, 20, 5]; + + // ignore: use_setters_to_change_properties + void _onMapCreated(ExampleGoogleMapController controller) { + this.controller = controller; + } + + @override + void dispose() { + super.dispose(); + } + + void _onPolygonTapped(PolygonId polygonId) { + setState(() { + selectedPolygon = polygonId; + }); + } + + void _remove(PolygonId polygonId) { + setState(() { + if (polygons.containsKey(polygonId)) { + polygons.remove(polygonId); + } + selectedPolygon = null; + }); + } + + void _add() { + final int polygonCount = polygons.length; + + if (polygonCount == 12) { + return; + } + + final String polygonIdVal = 'polygon_id_$_polygonIdCounter'; + final PolygonId polygonId = PolygonId(polygonIdVal); + + final Polygon polygon = Polygon( + polygonId: polygonId, + consumeTapEvents: true, + strokeColor: Colors.orange, + strokeWidth: 5, + fillColor: Colors.green, + points: _createPoints(), + onTap: () { + _onPolygonTapped(polygonId); + }, + ); + + setState(() { + polygons[polygonId] = polygon; + polygonOffsets[polygonId] = _polygonIdCounter.ceilToDouble(); + // increment _polygonIdCounter to have unique polygon id each time + _polygonIdCounter++; + }); + } + + void _toggleGeodesic(PolygonId polygonId) { + final Polygon polygon = polygons[polygonId]!; + setState(() { + polygons[polygonId] = polygon.copyWith( + geodesicParam: !polygon.geodesic, + ); + }); + } + + void _toggleVisible(PolygonId polygonId) { + final Polygon polygon = polygons[polygonId]!; + setState(() { + polygons[polygonId] = polygon.copyWith( + visibleParam: !polygon.visible, + ); + }); + } + + void _changeStrokeColor(PolygonId polygonId) { + final Polygon polygon = polygons[polygonId]!; + setState(() { + polygons[polygonId] = polygon.copyWith( + strokeColorParam: colors[++strokeColorsIndex % colors.length], + ); + }); + } + + void _changeFillColor(PolygonId polygonId) { + final Polygon polygon = polygons[polygonId]!; + setState(() { + polygons[polygonId] = polygon.copyWith( + fillColorParam: colors[++fillColorsIndex % colors.length], + ); + }); + } + + void _changeWidth(PolygonId polygonId) { + final Polygon polygon = polygons[polygonId]!; + setState(() { + polygons[polygonId] = polygon.copyWith( + strokeWidthParam: widths[++widthsIndex % widths.length], + ); + }); + } + + void _addHoles(PolygonId polygonId) { + final Polygon polygon = polygons[polygonId]!; + setState(() { + polygons[polygonId] = + polygon.copyWith(holesParam: _createHoles(polygonId)); + }); + } + + void _removeHoles(PolygonId polygonId) { + final Polygon polygon = polygons[polygonId]!; + setState(() { + polygons[polygonId] = polygon.copyWith( + holesParam: >[], + ); + }); + } + + @override + Widget build(BuildContext context) { + final PolygonId? selectedId = selectedPolygon; + return Column( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Center( + child: SizedBox( + width: 350.0, + height: 300.0, + child: ExampleGoogleMap( + initialCameraPosition: const CameraPosition( + target: LatLng(52.4478, -3.5402), + zoom: 7.0, + ), + polygons: Set.of(polygons.values), + onMapCreated: _onMapCreated, + ), + ), + ), + Expanded( + child: SingleChildScrollView( + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + Row( + children: [ + Column( + children: [ + TextButton( + onPressed: _add, + child: const Text('add'), + ), + TextButton( + onPressed: (selectedId == null) + ? null + : () => _remove(selectedId), + child: const Text('remove'), + ), + TextButton( + onPressed: (selectedId == null) + ? null + : () => _toggleVisible(selectedId), + child: const Text('toggle visible'), + ), + TextButton( + onPressed: (selectedId == null) + ? null + : () => _toggleGeodesic(selectedId), + child: const Text('toggle geodesic'), + ), + ], + ), + Column( + children: [ + TextButton( + onPressed: (selectedId == null) + ? null + : ((polygons[selectedId]!.holes.isNotEmpty) + ? null + : () => _addHoles(selectedId)), + child: const Text('add holes'), + ), + TextButton( + onPressed: (selectedId == null) + ? null + : ((polygons[selectedId]!.holes.isEmpty) + ? null + : () => _removeHoles(selectedId)), + child: const Text('remove holes'), + ), + TextButton( + onPressed: (selectedId == null) + ? null + : () => _changeWidth(selectedId), + child: const Text('change stroke width'), + ), + TextButton( + onPressed: (selectedId == null) + ? null + : () => _changeStrokeColor(selectedId), + child: const Text('change stroke color'), + ), + TextButton( + onPressed: (selectedId == null) + ? null + : () => _changeFillColor(selectedId), + child: const Text('change fill color'), + ), + ], + ) + ], + ) + ], + ), + ), + ), + ], + ); + } + + List _createPoints() { + final List points = []; + final double offset = _polygonIdCounter.ceilToDouble(); + points.add(_createLatLng(51.2395 + offset, -3.4314)); + points.add(_createLatLng(53.5234 + offset, -3.5314)); + points.add(_createLatLng(52.4351 + offset, -4.5235)); + points.add(_createLatLng(52.1231 + offset, -5.0829)); + return points; + } + + List> _createHoles(PolygonId polygonId) { + final List> holes = >[]; + final double offset = polygonOffsets[polygonId]!; + + final List hole1 = []; + hole1.add(_createLatLng(51.8395 + offset, -3.8814)); + hole1.add(_createLatLng(52.0234 + offset, -3.9914)); + hole1.add(_createLatLng(52.1351 + offset, -4.4435)); + hole1.add(_createLatLng(52.0231 + offset, -4.5829)); + holes.add(hole1); + + final List hole2 = []; + hole2.add(_createLatLng(52.2395 + offset, -3.6814)); + hole2.add(_createLatLng(52.4234 + offset, -3.7914)); + hole2.add(_createLatLng(52.5351 + offset, -4.2435)); + hole2.add(_createLatLng(52.4231 + offset, -4.3829)); + holes.add(hole2); + + return holes; + } + + LatLng _createLatLng(double lat, double lng) { + return LatLng(lat, lng); + } +} diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/place_polyline.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/place_polyline.dart new file mode 100644 index 00000000000..659ef87e87f --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/place_polyline.dart @@ -0,0 +1,325 @@ +// 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. + +// ignore_for_file: public_member_api_docs + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart'; + +import 'example_google_map.dart'; +import 'page.dart'; + +class PlacePolylinePage extends GoogleMapExampleAppPage { + const PlacePolylinePage({Key? key}) + : super(const Icon(Icons.linear_scale), 'Place polyline', key: key); + + @override + Widget build(BuildContext context) { + return const PlacePolylineBody(); + } +} + +class PlacePolylineBody extends StatefulWidget { + const PlacePolylineBody({super.key}); + + @override + State createState() => PlacePolylineBodyState(); +} + +class PlacePolylineBodyState extends State { + PlacePolylineBodyState(); + + ExampleGoogleMapController? controller; + Map polylines = {}; + int _polylineIdCounter = 0; + PolylineId? selectedPolyline; + + // Values when toggling polyline color + int colorsIndex = 0; + List colors = [ + Colors.purple, + Colors.red, + Colors.green, + Colors.pink, + ]; + + // Values when toggling polyline width + int widthsIndex = 0; + List widths = [10, 20, 5]; + + int jointTypesIndex = 0; + List jointTypes = [ + JointType.mitered, + JointType.bevel, + JointType.round + ]; + + // Values when toggling polyline end cap type + int endCapsIndex = 0; + List endCaps = [Cap.buttCap, Cap.squareCap, Cap.roundCap]; + + // Values when toggling polyline start cap type + int startCapsIndex = 0; + List startCaps = [Cap.buttCap, Cap.squareCap, Cap.roundCap]; + + // Values when toggling polyline pattern + int patternsIndex = 0; + List> patterns = >[ + [], + [ + PatternItem.dash(30.0), + PatternItem.gap(20.0), + PatternItem.dot, + PatternItem.gap(20.0) + ], + [PatternItem.dash(30.0), PatternItem.gap(20.0)], + [PatternItem.dot, PatternItem.gap(10.0)], + ]; + + // ignore: use_setters_to_change_properties + void _onMapCreated(ExampleGoogleMapController controller) { + this.controller = controller; + } + + @override + void dispose() { + super.dispose(); + } + + void _onPolylineTapped(PolylineId polylineId) { + setState(() { + selectedPolyline = polylineId; + }); + } + + void _remove(PolylineId polylineId) { + setState(() { + if (polylines.containsKey(polylineId)) { + polylines.remove(polylineId); + } + selectedPolyline = null; + }); + } + + void _add() { + final int polylineCount = polylines.length; + + if (polylineCount == 12) { + return; + } + + final String polylineIdVal = 'polyline_id_$_polylineIdCounter'; + _polylineIdCounter++; + final PolylineId polylineId = PolylineId(polylineIdVal); + + final Polyline polyline = Polyline( + polylineId: polylineId, + consumeTapEvents: true, + color: Colors.orange, + width: 5, + points: _createPoints(), + onTap: () { + _onPolylineTapped(polylineId); + }, + ); + + setState(() { + polylines[polylineId] = polyline; + }); + } + + void _toggleGeodesic(PolylineId polylineId) { + final Polyline polyline = polylines[polylineId]!; + setState(() { + polylines[polylineId] = polyline.copyWith( + geodesicParam: !polyline.geodesic, + ); + }); + } + + void _toggleVisible(PolylineId polylineId) { + final Polyline polyline = polylines[polylineId]!; + setState(() { + polylines[polylineId] = polyline.copyWith( + visibleParam: !polyline.visible, + ); + }); + } + + void _changeColor(PolylineId polylineId) { + final Polyline polyline = polylines[polylineId]!; + setState(() { + polylines[polylineId] = polyline.copyWith( + colorParam: colors[++colorsIndex % colors.length], + ); + }); + } + + void _changeWidth(PolylineId polylineId) { + final Polyline polyline = polylines[polylineId]!; + setState(() { + polylines[polylineId] = polyline.copyWith( + widthParam: widths[++widthsIndex % widths.length], + ); + }); + } + + void _changeJointType(PolylineId polylineId) { + final Polyline polyline = polylines[polylineId]!; + setState(() { + polylines[polylineId] = polyline.copyWith( + jointTypeParam: jointTypes[++jointTypesIndex % jointTypes.length], + ); + }); + } + + void _changeEndCap(PolylineId polylineId) { + final Polyline polyline = polylines[polylineId]!; + setState(() { + polylines[polylineId] = polyline.copyWith( + endCapParam: endCaps[++endCapsIndex % endCaps.length], + ); + }); + } + + void _changeStartCap(PolylineId polylineId) { + final Polyline polyline = polylines[polylineId]!; + setState(() { + polylines[polylineId] = polyline.copyWith( + startCapParam: startCaps[++startCapsIndex % startCaps.length], + ); + }); + } + + void _changePattern(PolylineId polylineId) { + final Polyline polyline = polylines[polylineId]!; + setState(() { + polylines[polylineId] = polyline.copyWith( + patternsParam: patterns[++patternsIndex % patterns.length], + ); + }); + } + + @override + Widget build(BuildContext context) { + final bool isIOS = !kIsWeb && defaultTargetPlatform == TargetPlatform.iOS; + + final PolylineId? selectedId = selectedPolyline; + + return Column( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Center( + child: SizedBox( + width: 350.0, + height: 300.0, + child: ExampleGoogleMap( + initialCameraPosition: const CameraPosition( + target: LatLng(53.1721, -3.5402), + zoom: 7.0, + ), + polylines: Set.of(polylines.values), + onMapCreated: _onMapCreated, + ), + ), + ), + Expanded( + child: SingleChildScrollView( + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + Row( + children: [ + Column( + children: [ + TextButton( + onPressed: _add, + child: const Text('add'), + ), + TextButton( + onPressed: (selectedId == null) + ? null + : () => _remove(selectedId), + child: const Text('remove'), + ), + TextButton( + onPressed: (selectedId == null) + ? null + : () => _toggleVisible(selectedId), + child: const Text('toggle visible'), + ), + TextButton( + onPressed: (selectedId == null) + ? null + : () => _toggleGeodesic(selectedId), + child: const Text('toggle geodesic'), + ), + ], + ), + Column( + children: [ + TextButton( + onPressed: (selectedId == null) + ? null + : () => _changeWidth(selectedId), + child: const Text('change width'), + ), + TextButton( + onPressed: (selectedId == null) + ? null + : () => _changeColor(selectedId), + child: const Text('change color'), + ), + TextButton( + onPressed: isIOS || (selectedId == null) + ? null + : () => _changeStartCap(selectedId), + child: const Text('change start cap [Android only]'), + ), + TextButton( + onPressed: isIOS || (selectedId == null) + ? null + : () => _changeEndCap(selectedId), + child: const Text('change end cap [Android only]'), + ), + TextButton( + onPressed: isIOS || (selectedId == null) + ? null + : () => _changeJointType(selectedId), + child: const Text('change joint type [Android only]'), + ), + TextButton( + onPressed: isIOS || (selectedId == null) + ? null + : () => _changePattern(selectedId), + child: const Text('change pattern [Android only]'), + ), + ], + ) + ], + ) + ], + ), + ), + ), + ], + ); + } + + List _createPoints() { + final List points = []; + final double offset = _polylineIdCounter.ceilToDouble(); + points.add(_createLatLng(51.4816 + offset, -3.1791)); + points.add(_createLatLng(53.0430 + offset, -2.9925)); + points.add(_createLatLng(53.1396 + offset, -4.2739)); + points.add(_createLatLng(52.4153 + offset, -4.0829)); + return points; + } + + LatLng _createLatLng(double lat, double lng) { + return LatLng(lat, lng); + } +} diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/scrolling_map.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/scrolling_map.dart new file mode 100644 index 00000000000..a4901f2ce5f --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/scrolling_map.dart @@ -0,0 +1,114 @@ +// 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. + +// ignore_for_file: public_member_api_docs + +import 'package:flutter/foundation.dart'; +import 'package:flutter/gestures.dart'; +import 'package:flutter/material.dart'; +import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart'; + +import 'example_google_map.dart'; +import 'page.dart'; + +const LatLng _center = LatLng(32.080664, 34.9563837); + +class ScrollingMapPage extends GoogleMapExampleAppPage { + const ScrollingMapPage({Key? key}) + : super(const Icon(Icons.map), 'Scrolling map', key: key); + + @override + Widget build(BuildContext context) { + return const ScrollingMapBody(); + } +} + +class ScrollingMapBody extends StatelessWidget { + const ScrollingMapBody({super.key}); + + @override + Widget build(BuildContext context) { + return ListView( + children: [ + Card( + child: Padding( + padding: const EdgeInsets.symmetric(vertical: 30.0), + child: Column( + children: [ + const Padding( + padding: EdgeInsets.only(bottom: 12.0), + child: Text('This map consumes all touch events.'), + ), + Center( + child: SizedBox( + width: 300.0, + height: 300.0, + child: ExampleGoogleMap( + initialCameraPosition: const CameraPosition( + target: _center, + zoom: 11.0, + ), + gestureRecognizers: // + >{ + Factory( + () => EagerGestureRecognizer(), + ), + }, + ), + ), + ), + ], + ), + ), + ), + Card( + child: Padding( + padding: const EdgeInsets.symmetric(vertical: 30.0), + child: Column( + children: [ + const Text("This map doesn't consume the vertical drags."), + const Padding( + padding: EdgeInsets.only(bottom: 12.0), + child: + Text('It still gets other gestures (e.g scale or tap).'), + ), + Center( + child: SizedBox( + width: 300.0, + height: 300.0, + child: ExampleGoogleMap( + initialCameraPosition: const CameraPosition( + target: _center, + zoom: 11.0, + ), + markers: { + Marker( + markerId: const MarkerId('test_marker_id'), + position: LatLng( + _center.latitude, + _center.longitude, + ), + infoWindow: const InfoWindow( + title: 'An interesting location', + snippet: '*', + ), + ), + }, + gestureRecognizers: >{ + Factory( + () => ScaleGestureRecognizer(), + ), + }, + ), + ), + ), + ], + ), + ), + ), + ], + ); + } +} diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/snapshot.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/snapshot.dart new file mode 100644 index 00000000000..56a90a8e49f --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/snapshot.dart @@ -0,0 +1,76 @@ +// 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. + +// ignore_for_file: public_member_api_docs + +import 'dart:typed_data'; + +import 'package:flutter/material.dart'; +import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart'; + +import 'example_google_map.dart'; +import 'page.dart'; + +const CameraPosition _kInitialPosition = + CameraPosition(target: LatLng(-33.852, 151.211), zoom: 11.0); + +class SnapshotPage extends GoogleMapExampleAppPage { + const SnapshotPage({Key? key}) + : super(const Icon(Icons.camera_alt), 'Take a snapshot of the map', + key: key); + + @override + Widget build(BuildContext context) { + return _SnapshotBody(); + } +} + +class _SnapshotBody extends StatefulWidget { + @override + _SnapshotBodyState createState() => _SnapshotBodyState(); +} + +class _SnapshotBodyState extends State<_SnapshotBody> { + ExampleGoogleMapController? _mapController; + Uint8List? _imageBytes; + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.all(16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + SizedBox( + height: 180, + child: ExampleGoogleMap( + onMapCreated: onMapCreated, + initialCameraPosition: _kInitialPosition, + ), + ), + TextButton( + child: const Text('Take a snapshot'), + onPressed: () async { + final Uint8List? imageBytes = + await _mapController?.takeSnapshot(); + setState(() { + _imageBytes = imageBytes; + }); + }, + ), + Container( + decoration: BoxDecoration(color: Colors.blueGrey[50]), + height: 180, + child: _imageBytes != null ? Image.memory(_imageBytes!) : null, + ), + ], + ), + ); + } + + // ignore: use_setters_to_change_properties + void onMapCreated(ExampleGoogleMapController controller) { + _mapController = controller; + } +} diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/tile_overlay.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/tile_overlay.dart new file mode 100644 index 00000000000..9122fda76ce --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/tile_overlay.dart @@ -0,0 +1,154 @@ +// 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. + +// ignore_for_file: public_member_api_docs + +import 'dart:typed_data'; +import 'dart:ui' as ui; + +import 'package:flutter/material.dart'; +import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart'; + +import 'example_google_map.dart'; +import 'page.dart'; + +class TileOverlayPage extends GoogleMapExampleAppPage { + const TileOverlayPage({Key? key}) + : super(const Icon(Icons.map), 'Tile overlay', key: key); + + @override + Widget build(BuildContext context) { + return const TileOverlayBody(); + } +} + +class TileOverlayBody extends StatefulWidget { + const TileOverlayBody({super.key}); + + @override + State createState() => TileOverlayBodyState(); +} + +class TileOverlayBodyState extends State { + TileOverlayBodyState(); + + ExampleGoogleMapController? controller; + TileOverlay? _tileOverlay; + + // ignore: use_setters_to_change_properties + void _onMapCreated(ExampleGoogleMapController controller) { + this.controller = controller; + } + + @override + void dispose() { + super.dispose(); + } + + void _removeTileOverlay() { + setState(() { + _tileOverlay = null; + }); + } + + void _addTileOverlay() { + final TileOverlay tileOverlay = TileOverlay( + tileOverlayId: const TileOverlayId('tile_overlay_1'), + tileProvider: _DebugTileProvider(), + ); + setState(() { + _tileOverlay = tileOverlay; + }); + } + + void _clearTileCache() { + if (_tileOverlay != null && controller != null) { + controller!.clearTileCache(_tileOverlay!.tileOverlayId); + } + } + + @override + Widget build(BuildContext context) { + final Set overlays = { + if (_tileOverlay != null) _tileOverlay!, + }; + return Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Center( + child: SizedBox( + width: 350.0, + height: 300.0, + child: ExampleGoogleMap( + initialCameraPosition: const CameraPosition( + target: LatLng(59.935460, 30.325177), + zoom: 7.0, + ), + tileOverlays: overlays, + onMapCreated: _onMapCreated, + ), + ), + ), + TextButton( + onPressed: _addTileOverlay, + child: const Text('Add tile overlay'), + ), + TextButton( + onPressed: _removeTileOverlay, + child: const Text('Remove tile overlay'), + ), + TextButton( + onPressed: _clearTileCache, + child: const Text('Clear tile cache'), + ), + ], + ); + } +} + +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/ios12/pubspec.yaml b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/pubspec.yaml new file mode 100644 index 00000000000..2e32b5d64bb --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/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: ">=2.17.0 <4.0.0" + flutter: ">=3.0.0" + +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.2.1 + +dev_dependencies: + flutter_driver: + sdk: flutter + flutter_test: + sdk: flutter + integration_test: + sdk: flutter + +flutter: + uses-material-design: true + assets: + - assets/ From b3713373276894c1abf99a6f65cba73370d28521 Mon Sep 17 00:00:00 2001 From: Stuart Morgan Date: Tue, 18 Apr 2023 13:36:03 -0400 Subject: [PATCH 05/16] Add an iOS 13 copy --- .../example/ios13/README.md | 13 + .../example/ios13/assets/2.0x/red_square.png | Bin 0 -> 304 bytes .../example/ios13/assets/3.0x/red_square.png | Bin 0 -> 312 bytes .../example/ios13/assets/night_mode.json | 162 +++++ .../example/ios13/assets/red_square.png | Bin 0 -> 195 bytes .../ios13/ios/Flutter/AppFrameworkInfo.plist | 30 + .../example/ios13/ios/Flutter/Debug.xcconfig | 2 + .../ios13/ios/Flutter/Release.xcconfig | 2 + .../example/ios13/ios/Podfile | 46 ++ .../ios/Runner.xcodeproj/project.pbxproj | 665 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/xcschemes/Runner.xcscheme | 107 +++ .../contents.xcworkspacedata | 10 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../example/ios13/ios/Runner/AppDelegate.h | 9 + .../example/ios13/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/ios13/ios/Runner/Info.plist | 55 ++ .../example/ios13/ios/Runner/main.m | 13 + ...TGoogleMapJSONConversionsConversionTests.m | 290 ++++++++ .../ios13/ios/RunnerTests/GoogleMapsTests.m | 59 ++ .../example/ios13/ios/RunnerTests/Info.plist | 22 + .../ios/RunnerTests/PartiallyMockedMapView.h | 17 + .../ios/RunnerTests/PartiallyMockedMapView.m | 34 + .../example/ios13/lib/animate_camera.dart | 171 +++++ .../example/ios13/lib/example_google_map.dart | 538 ++++++++++++++ .../example/ios13/lib/lite_mode.dart | 47 ++ .../example/ios13/lib/main.dart | 73 ++ .../example/ios13/lib/map_click.dart | 105 +++ .../example/ios13/lib/map_coordinates.dart | 104 +++ .../example/ios13/lib/map_ui.dart | 357 ++++++++++ .../example/ios13/lib/marker_icons.dart | 98 +++ .../example/ios13/lib/move_camera.dart | 171 +++++ .../example/ios13/lib/padding.dart | 180 +++++ .../example/ios13/lib/page.dart | 14 + .../example/ios13/lib/place_circle.dart | 232 ++++++ .../example/ios13/lib/place_marker.dart | 421 +++++++++++ .../example/ios13/lib/place_polygon.dart | 306 ++++++++ .../example/ios13/lib/place_polyline.dart | 325 +++++++++ .../example/ios13/lib/scrolling_map.dart | 114 +++ .../example/ios13/lib/snapshot.dart | 76 ++ .../example/ios13/lib/tile_overlay.dart | 154 ++++ .../example/ios13/pubspec.yaml | 34 + 65 files changed, 5311 insertions(+) create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/README.md create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/assets/2.0x/red_square.png create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/assets/3.0x/red_square.png create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/assets/night_mode.json create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/assets/red_square.png create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/ios/Flutter/AppFrameworkInfo.plist create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/ios/Flutter/Debug.xcconfig create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/ios/Flutter/Release.xcconfig create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/ios/Podfile create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/ios/Runner.xcodeproj/project.pbxproj create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/ios/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/ios/Runner/AppDelegate.h create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/ios/Runner/AppDelegate.m create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/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/ios13/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/ios/Runner/Base.lproj/LaunchScreen.storyboard create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/ios/Runner/Base.lproj/Main.storyboard create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/ios/Runner/Info.plist create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/ios/Runner/main.m create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/ios/RunnerTests/FLTGoogleMapJSONConversionsConversionTests.m create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/ios/RunnerTests/GoogleMapsTests.m create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/ios/RunnerTests/Info.plist create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/ios/RunnerTests/PartiallyMockedMapView.h create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/ios/RunnerTests/PartiallyMockedMapView.m create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/animate_camera.dart create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/example_google_map.dart create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/lite_mode.dart create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/main.dart create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/map_click.dart create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/map_coordinates.dart create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/map_ui.dart create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/marker_icons.dart create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/move_camera.dart create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/padding.dart create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/page.dart create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/place_circle.dart create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/place_marker.dart create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/place_polygon.dart create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/place_polyline.dart create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/scrolling_map.dart create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/snapshot.dart create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/tile_overlay.dart create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/pubspec.yaml diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/README.md b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/README.md new file mode 100644 index 00000000000..64712428ce0 --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/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 13, so will select a 7.x SDK version. diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/assets/2.0x/red_square.png b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/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/ios13/assets/3.0x/red_square.png b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/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/ios13/assets/night_mode.json b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/assets/night_mode.json new file mode 100644 index 00000000000..1f16e003a92 --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/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/ios13/assets/red_square.png b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/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/ios13/ios/Flutter/AppFrameworkInfo.plist b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/ios/Flutter/AppFrameworkInfo.plist new file mode 100644 index 00000000000..1f6b98f117b --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/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 + 13.0 + + diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/ios/Flutter/Debug.xcconfig b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/ios/Flutter/Debug.xcconfig new file mode 100644 index 00000000000..e8efba11468 --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/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/ios13/ios/Flutter/Release.xcconfig b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/ios/Flutter/Release.xcconfig new file mode 100644 index 00000000000..399e9340e6f --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/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/ios13/ios/Podfile b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/ios/Podfile new file mode 100644 index 00000000000..628f6ffd37e --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/ios/Podfile @@ -0,0 +1,46 @@ +# Uncomment this line to define a global platform for your project +platform :ios, '13.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) + target.build_configurations.each do |build_configuration| + build_configuration.build_settings['EXCLUDED_ARCHS[sdk=iphonesimulator*]'] = 'arm64 i386' + end + end +end diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/ios/Runner.xcodeproj/project.pbxproj b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/ios/Runner.xcodeproj/project.pbxproj new file mode 100644 index 00000000000..cbc58c6612f --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/ios/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,665 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 54; + objects = { + +/* Begin PBXBuildFile section */ + 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 */; }; + 6851F3562835BC180032B7C8 /* FLTGoogleMapJSONConversionsConversionTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 6851F3552835BC180032B7C8 /* FLTGoogleMapJSONConversionsConversionTests.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 */; }; + F7151F13265D7ED70028CB91 /* GoogleMapsTests.m in Sources */ = {isa = PBXBuildFile; fileRef = F7151F12265D7ED70028CB91 /* GoogleMapsTests.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; + }; +/* 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 */ + 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 = ""; }; + 6851F3552835BC180032B7C8 /* FLTGoogleMapJSONConversionsConversionTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLTGoogleMapJSONConversionsConversionTests.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; }; + 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 = ""; }; +/* 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; + }; +/* 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 */, + 97C146EF1CF9000F007C117D /* Products */, + A189CFE5474BF8A07908B2E0 /* Pods */, + 1E7CF0857EFC88FC263CF3B2 /* Frameworks */, + ); + sourceTree = ""; + }; + 97C146EF1CF9000F007C117D /* Products */ = { + isa = PBXGroup; + children = ( + 97C146EE1CF9000F007C117D /* Runner.app */, + F7151F10265D7ED70028CB91 /* RunnerTests.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 = ( + 6851F3552835BC180032B7C8 /* FLTGoogleMapJSONConversionsConversionTests.m */, + F7151F12265D7ED70028CB91 /* GoogleMapsTests.m */, + 982F2A6A27BADE17003C81F4 /* PartiallyMockedMapView.h */, + 982F2A6B27BADE17003C81F4 /* PartiallyMockedMapView.m */, + F7151F14265D7ED70028CB91 /* Info.plist */, + ); + path = RunnerTests; + 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"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 97C146E61CF9000F007C117D /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 1300; + ORGANIZATIONNAME = "The Flutter Authors"; + TargetAttributes = { + 97C146ED1CF9000F007C117D = { + CreatedOnToolsVersion = 7.3.1; + }; + F7151F0F265D7ED70028CB91 = { + 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 */, + ); + }; +/* 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 = ( + ); + 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_ROOT}/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle", + ); + name = "[CP] Copy Pods Resources"; + outputPaths = ( + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GoogleMaps.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 */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + F7151F16265D7ED70028CB91 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 97C146ED1CF9000F007C117D /* Runner */; + targetProxy = F7151F15265D7ED70028CB91 /* 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 = 13.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 = 13.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; + "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = "i386 arm64"; + 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; + "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = "i386 arm64"; + 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 arm64"; + 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 arm64"; + 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; + }; +/* 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; + }; +/* End XCConfigurationList section */ + }; + rootObject = 97C146E61CF9000F007C117D /* Project object */; +} diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/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/ios13/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 00000000000..a60a46be23c --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,107 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/ios/Runner.xcworkspace/contents.xcworkspacedata b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/ios/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000000..21a3cc14c74 --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/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/ios13/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/ios/Runner/AppDelegate.h b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/ios/Runner/AppDelegate.h new file mode 100644 index 00000000000..9bc6c56e34f --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/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/ios13/ios/Runner/AppDelegate.m b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/ios/Runner/AppDelegate.m new file mode 100644 index 00000000000..55733442b4c --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/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/ios13/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/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/ios13/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/ios13/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/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/ios13/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/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/ios13/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/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/ios13/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/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/ios13/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/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/ios13/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/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/ios13/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/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/ios13/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/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/ios13/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/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/ios13/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/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/ios13/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/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/ios13/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/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/ios13/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/ios13/ios/Runner/Base.lproj/LaunchScreen.storyboard b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/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/ios13/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/ios/Runner/Base.lproj/Main.storyboard b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/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/ios13/ios/Runner/Base.lproj/Main.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/ios/Runner/Info.plist b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/ios/Runner/Info.plist new file mode 100644 index 00000000000..d6b389f1672 --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/ios/Runner/Info.plist @@ -0,0 +1,55 @@ + + + + + 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 + + UIViewControllerBasedStatusBarAppearance + + CADisableMinimumFrameDurationOnPhone + + UIApplicationSupportsIndirectInputEvents + + + diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/ios/Runner/main.m b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/ios/Runner/main.m new file mode 100644 index 00000000000..f143297b30d --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/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/ios13/ios/RunnerTests/FLTGoogleMapJSONConversionsConversionTests.m b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/ios/RunnerTests/FLTGoogleMapJSONConversionsConversionTests.m new file mode 100644 index 00000000000..bb9020d983c --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/ios/RunnerTests/FLTGoogleMapJSONConversionsConversionTests.m @@ -0,0 +1,290 @@ +// 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]; + + GMSMapView *mapView = [[GMSMapView alloc] + initWithFrame:CGRectZero + camera:[GMSCameraPosition cameraWithTarget:CLLocationCoordinate2DMake(5, 6) zoom:1]]; + [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]; +} + +@end diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/ios/RunnerTests/GoogleMapsTests.m b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/ios/RunnerTests/GoogleMapsTests.m new file mode 100644 index 00000000000..71f1162890b --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/ios/RunnerTests/GoogleMapsTests.m @@ -0,0 +1,59 @@ +// 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 + +@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); + PartiallyMockedMapView *mapView = [[PartiallyMockedMapView alloc] + initWithFrame:frame + camera:[[GMSCameraPosition alloc] initWithLatitude:0 longitude:0 zoom:0]]; + 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); +} + +@end diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/ios/RunnerTests/Info.plist b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/ios/RunnerTests/Info.plist new file mode 100644 index 00000000000..64d65ca4957 --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/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/ios13/ios/RunnerTests/PartiallyMockedMapView.h b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/ios/RunnerTests/PartiallyMockedMapView.h new file mode 100644 index 00000000000..4288401cf90 --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/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/ios13/ios/RunnerTests/PartiallyMockedMapView.m b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/ios/RunnerTests/PartiallyMockedMapView.m new file mode 100644 index 00000000000..202a18d128c --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/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/ios13/lib/animate_camera.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/animate_camera.dart new file mode 100644 index 00000000000..c77f9ededac --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/animate_camera.dart @@ -0,0 +1,171 @@ +// 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. + +// ignore_for_file: public_member_api_docs + +import 'package:flutter/material.dart'; +import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart'; + +import 'example_google_map.dart'; +import 'page.dart'; + +class AnimateCameraPage extends GoogleMapExampleAppPage { + const AnimateCameraPage({Key? key}) + : super(const Icon(Icons.map), 'Camera control, animated', key: key); + + @override + Widget build(BuildContext context) { + return const AnimateCamera(); + } +} + +class AnimateCamera extends StatefulWidget { + const AnimateCamera({super.key}); + @override + State createState() => AnimateCameraState(); +} + +class AnimateCameraState extends State { + ExampleGoogleMapController? mapController; + + // ignore: use_setters_to_change_properties + void _onMapCreated(ExampleGoogleMapController controller) { + mapController = controller; + } + + @override + Widget build(BuildContext context) { + return Column( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Center( + child: SizedBox( + width: 300.0, + height: 200.0, + child: ExampleGoogleMap( + onMapCreated: _onMapCreated, + initialCameraPosition: + const CameraPosition(target: LatLng(0.0, 0.0)), + ), + ), + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + Column( + children: [ + TextButton( + onPressed: () { + mapController?.animateCamera( + CameraUpdate.newCameraPosition( + const CameraPosition( + bearing: 270.0, + target: LatLng(51.5160895, -0.1294527), + tilt: 30.0, + zoom: 17.0, + ), + ), + ); + }, + child: const Text('newCameraPosition'), + ), + TextButton( + onPressed: () { + mapController?.animateCamera( + CameraUpdate.newLatLng( + const LatLng(56.1725505, 10.1850512), + ), + ); + }, + child: const Text('newLatLng'), + ), + TextButton( + onPressed: () { + mapController?.animateCamera( + CameraUpdate.newLatLngBounds( + LatLngBounds( + southwest: const LatLng(-38.483935, 113.248673), + northeast: const LatLng(-8.982446, 153.823821), + ), + 10.0, + ), + ); + }, + child: const Text('newLatLngBounds'), + ), + TextButton( + onPressed: () { + mapController?.animateCamera( + CameraUpdate.newLatLngZoom( + const LatLng(37.4231613, -122.087159), + 11.0, + ), + ); + }, + child: const Text('newLatLngZoom'), + ), + TextButton( + onPressed: () { + mapController?.animateCamera( + CameraUpdate.scrollBy(150.0, -225.0), + ); + }, + child: const Text('scrollBy'), + ), + ], + ), + Column( + children: [ + TextButton( + onPressed: () { + mapController?.animateCamera( + CameraUpdate.zoomBy( + -0.5, + const Offset(30.0, 20.0), + ), + ); + }, + child: const Text('zoomBy with focus'), + ), + TextButton( + onPressed: () { + mapController?.animateCamera( + CameraUpdate.zoomBy(-0.5), + ); + }, + child: const Text('zoomBy'), + ), + TextButton( + onPressed: () { + mapController?.animateCamera( + CameraUpdate.zoomIn(), + ); + }, + child: const Text('zoomIn'), + ), + TextButton( + onPressed: () { + mapController?.animateCamera( + CameraUpdate.zoomOut(), + ); + }, + child: const Text('zoomOut'), + ), + TextButton( + onPressed: () { + mapController?.animateCamera( + CameraUpdate.zoomTo(16.0), + ); + }, + child: const Text('zoomTo'), + ), + ], + ), + ], + ) + ], + ); + } +} diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/example_google_map.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/example_google_map.dart new file mode 100644 index 00000000000..e0817a55f28 --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/example_google_map.dart @@ -0,0 +1,538 @@ +// 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'; +// TODO(a14n): remove this import once Flutter 3.1 or later reaches stable (including flutter/flutter#104231) +// ignore: unnecessary_import +import 'dart:typed_data'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/gestures.dart'; +import 'package:flutter/material.dart'; +import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart'; + +// This is a pared down version of the Dart code from the app-facing package, +// to allow running the same examples for package-local testing. +// TODO(stuartmorgan): Consider extracting this to a shared package. See also +// https://github.com/flutter/flutter/issues/46716. + +/// Controller for a single ExampleGoogleMap instance running on the host platform. +class ExampleGoogleMapController { + ExampleGoogleMapController._( + this._googleMapState, { + required this.mapId, + }) { + _connectStreams(mapId); + } + + /// The mapId for this controller + final int mapId; + + /// Initialize control of a [ExampleGoogleMap] with [id]. + /// + /// Mainly for internal use when instantiating a [ExampleGoogleMapController] passed + /// in [ExampleGoogleMap.onMapCreated] callback. + static Future _init( + int id, + CameraPosition initialCameraPosition, + _ExampleGoogleMapState googleMapState, + ) async { + await GoogleMapsFlutterPlatform.instance.init(id); + return ExampleGoogleMapController._( + googleMapState, + mapId: id, + ); + } + + final _ExampleGoogleMapState _googleMapState; + + void _connectStreams(int mapId) { + if (_googleMapState.widget.onCameraMoveStarted != null) { + GoogleMapsFlutterPlatform.instance + .onCameraMoveStarted(mapId: mapId) + .listen((_) => _googleMapState.widget.onCameraMoveStarted!()); + } + if (_googleMapState.widget.onCameraMove != null) { + GoogleMapsFlutterPlatform.instance.onCameraMove(mapId: mapId).listen( + (CameraMoveEvent e) => _googleMapState.widget.onCameraMove!(e.value)); + } + if (_googleMapState.widget.onCameraIdle != null) { + GoogleMapsFlutterPlatform.instance + .onCameraIdle(mapId: mapId) + .listen((_) => _googleMapState.widget.onCameraIdle!()); + } + GoogleMapsFlutterPlatform.instance + .onMarkerTap(mapId: mapId) + .listen((MarkerTapEvent e) => _googleMapState.onMarkerTap(e.value)); + GoogleMapsFlutterPlatform.instance.onMarkerDragStart(mapId: mapId).listen( + (MarkerDragStartEvent e) => + _googleMapState.onMarkerDragStart(e.value, e.position)); + GoogleMapsFlutterPlatform.instance.onMarkerDrag(mapId: mapId).listen( + (MarkerDragEvent e) => + _googleMapState.onMarkerDrag(e.value, e.position)); + GoogleMapsFlutterPlatform.instance.onMarkerDragEnd(mapId: mapId).listen( + (MarkerDragEndEvent e) => + _googleMapState.onMarkerDragEnd(e.value, e.position)); + GoogleMapsFlutterPlatform.instance.onInfoWindowTap(mapId: mapId).listen( + (InfoWindowTapEvent e) => _googleMapState.onInfoWindowTap(e.value)); + GoogleMapsFlutterPlatform.instance + .onPolylineTap(mapId: mapId) + .listen((PolylineTapEvent e) => _googleMapState.onPolylineTap(e.value)); + GoogleMapsFlutterPlatform.instance + .onPolygonTap(mapId: mapId) + .listen((PolygonTapEvent e) => _googleMapState.onPolygonTap(e.value)); + GoogleMapsFlutterPlatform.instance + .onCircleTap(mapId: mapId) + .listen((CircleTapEvent e) => _googleMapState.onCircleTap(e.value)); + GoogleMapsFlutterPlatform.instance + .onTap(mapId: mapId) + .listen((MapTapEvent e) => _googleMapState.onTap(e.position)); + GoogleMapsFlutterPlatform.instance.onLongPress(mapId: mapId).listen( + (MapLongPressEvent e) => _googleMapState.onLongPress(e.position)); + } + + /// Updates configuration options of the map user interface. + Future _updateMapConfiguration(MapConfiguration update) { + return GoogleMapsFlutterPlatform.instance + .updateMapConfiguration(update, mapId: mapId); + } + + /// Updates marker configuration. + Future _updateMarkers(MarkerUpdates markerUpdates) { + return GoogleMapsFlutterPlatform.instance + .updateMarkers(markerUpdates, mapId: mapId); + } + + /// Updates polygon configuration. + Future _updatePolygons(PolygonUpdates polygonUpdates) { + return GoogleMapsFlutterPlatform.instance + .updatePolygons(polygonUpdates, mapId: mapId); + } + + /// Updates polyline configuration. + Future _updatePolylines(PolylineUpdates polylineUpdates) { + return GoogleMapsFlutterPlatform.instance + .updatePolylines(polylineUpdates, mapId: mapId); + } + + /// Updates circle configuration. + Future _updateCircles(CircleUpdates circleUpdates) { + return GoogleMapsFlutterPlatform.instance + .updateCircles(circleUpdates, mapId: mapId); + } + + /// Updates tile overlays configuration. + Future _updateTileOverlays(Set newTileOverlays) { + return GoogleMapsFlutterPlatform.instance + .updateTileOverlays(newTileOverlays: newTileOverlays, mapId: mapId); + } + + /// Clears the tile cache so that all tiles will be requested again from the + /// [TileProvider]. + Future clearTileCache(TileOverlayId tileOverlayId) async { + return GoogleMapsFlutterPlatform.instance + .clearTileCache(tileOverlayId, mapId: mapId); + } + + /// Starts an animated change of the map camera position. + Future animateCamera(CameraUpdate cameraUpdate) { + return GoogleMapsFlutterPlatform.instance + .animateCamera(cameraUpdate, mapId: mapId); + } + + /// Changes the map camera position. + Future moveCamera(CameraUpdate cameraUpdate) { + return GoogleMapsFlutterPlatform.instance + .moveCamera(cameraUpdate, mapId: mapId); + } + + /// Sets the styling of the base map. + Future setMapStyle(String? mapStyle) { + return GoogleMapsFlutterPlatform.instance + .setMapStyle(mapStyle, mapId: mapId); + } + + /// Return [LatLngBounds] defining the region that is visible in a map. + Future getVisibleRegion() { + return GoogleMapsFlutterPlatform.instance.getVisibleRegion(mapId: mapId); + } + + /// Return [ScreenCoordinate] of the [LatLng] in the current map view. + Future getScreenCoordinate(LatLng latLng) { + return GoogleMapsFlutterPlatform.instance + .getScreenCoordinate(latLng, mapId: mapId); + } + + /// Returns [LatLng] corresponding to the [ScreenCoordinate] in the current map view. + Future getLatLng(ScreenCoordinate screenCoordinate) { + return GoogleMapsFlutterPlatform.instance + .getLatLng(screenCoordinate, mapId: mapId); + } + + /// Programmatically show the Info Window for a [Marker]. + Future showMarkerInfoWindow(MarkerId markerId) { + return GoogleMapsFlutterPlatform.instance + .showMarkerInfoWindow(markerId, mapId: mapId); + } + + /// Programmatically hide the Info Window for a [Marker]. + Future hideMarkerInfoWindow(MarkerId markerId) { + return GoogleMapsFlutterPlatform.instance + .hideMarkerInfoWindow(markerId, mapId: mapId); + } + + /// Returns `true` when the [InfoWindow] is showing, `false` otherwise. + Future isMarkerInfoWindowShown(MarkerId markerId) { + return GoogleMapsFlutterPlatform.instance + .isMarkerInfoWindowShown(markerId, mapId: mapId); + } + + /// Returns the current zoom level of the map + Future getZoomLevel() { + return GoogleMapsFlutterPlatform.instance.getZoomLevel(mapId: mapId); + } + + /// Returns the image bytes of the map + Future takeSnapshot() { + return GoogleMapsFlutterPlatform.instance.takeSnapshot(mapId: mapId); + } + + /// Disposes of the platform resources + void dispose() { + GoogleMapsFlutterPlatform.instance.dispose(mapId: mapId); + } +} + +// The next map ID to create. +int _nextMapCreationId = 0; + +/// A widget which displays a map with data obtained from the Google Maps service. +class ExampleGoogleMap extends StatefulWidget { + /// Creates a widget displaying data from Google Maps services. + /// + /// [AssertionError] will be thrown if [initialCameraPosition] is null; + const ExampleGoogleMap({ + super.key, + required this.initialCameraPosition, + this.onMapCreated, + this.gestureRecognizers = const >{}, + this.compassEnabled = true, + this.mapToolbarEnabled = true, + this.cameraTargetBounds = CameraTargetBounds.unbounded, + this.mapType = MapType.normal, + this.minMaxZoomPreference = MinMaxZoomPreference.unbounded, + this.rotateGesturesEnabled = true, + this.scrollGesturesEnabled = true, + this.zoomControlsEnabled = true, + this.zoomGesturesEnabled = true, + this.liteModeEnabled = false, + this.tiltGesturesEnabled = true, + this.myLocationEnabled = false, + this.myLocationButtonEnabled = true, + this.layoutDirection, + + /// If no padding is specified default padding will be 0. + this.padding = EdgeInsets.zero, + this.indoorViewEnabled = false, + this.trafficEnabled = false, + this.buildingsEnabled = true, + this.markers = const {}, + this.polygons = const {}, + this.polylines = const {}, + this.circles = const {}, + this.onCameraMoveStarted, + this.tileOverlays = const {}, + this.onCameraMove, + this.onCameraIdle, + this.onTap, + this.onLongPress, + }); + + /// Callback method for when the map is ready to be used. + /// + /// Used to receive a [ExampleGoogleMapController] for this [ExampleGoogleMap]. + final void Function(ExampleGoogleMapController controller)? onMapCreated; + + /// The initial position of the map's camera. + final CameraPosition initialCameraPosition; + + /// True if the map should show a compass when rotated. + final bool compassEnabled; + + /// True if the map should show a toolbar when you interact with the map. Android only. + final bool mapToolbarEnabled; + + /// Geographical bounding box for the camera target. + final CameraTargetBounds cameraTargetBounds; + + /// Type of map tiles to be rendered. + final MapType mapType; + + /// The layout direction to use for the embedded view. + final TextDirection? layoutDirection; + + /// Preferred bounds for the camera zoom level. + /// + /// Actual bounds depend on map data and device. + final MinMaxZoomPreference minMaxZoomPreference; + + /// True if the map view should respond to rotate gestures. + final bool rotateGesturesEnabled; + + /// True if the map view should respond to scroll gestures. + final bool scrollGesturesEnabled; + + /// True if the map view should show zoom controls. This includes two buttons + /// to zoom in and zoom out. The default value is to show zoom controls. + final bool zoomControlsEnabled; + + /// True if the map view should respond to zoom gestures. + final bool zoomGesturesEnabled; + + /// True if the map view should be in lite mode. Android only. + final bool liteModeEnabled; + + /// True if the map view should respond to tilt gestures. + final bool tiltGesturesEnabled; + + /// Padding to be set on map. + final EdgeInsets padding; + + /// Markers to be placed on the map. + final Set markers; + + /// Polygons to be placed on the map. + final Set polygons; + + /// Polylines to be placed on the map. + final Set polylines; + + /// Circles to be placed on the map. + final Set circles; + + /// Tile overlays to be placed on the map. + final Set tileOverlays; + + /// Called when the camera starts moving. + final VoidCallback? onCameraMoveStarted; + + /// Called repeatedly as the camera continues to move after an + /// onCameraMoveStarted call. + final CameraPositionCallback? onCameraMove; + + /// Called when camera movement has ended, there are no pending + /// animations and the user has stopped interacting with the map. + final VoidCallback? onCameraIdle; + + /// Called every time a [ExampleGoogleMap] is tapped. + final ArgumentCallback? onTap; + + /// Called every time a [ExampleGoogleMap] is long pressed. + final ArgumentCallback? onLongPress; + + /// True if a "My Location" layer should be shown on the map. + final bool myLocationEnabled; + + /// Enables or disables the my-location button. + final bool myLocationButtonEnabled; + + /// Enables or disables the indoor view from the map + final bool indoorViewEnabled; + + /// Enables or disables the traffic layer of the map + final bool trafficEnabled; + + /// Enables or disables showing 3D buildings where available + final bool buildingsEnabled; + + /// Which gestures should be consumed by the map. + final Set> gestureRecognizers; + + /// Creates a [State] for this [ExampleGoogleMap]. + @override + State createState() => _ExampleGoogleMapState(); +} + +class _ExampleGoogleMapState extends State { + final int _mapId = _nextMapCreationId++; + + final Completer _controller = + Completer(); + + Map _markers = {}; + Map _polygons = {}; + Map _polylines = {}; + Map _circles = {}; + late MapConfiguration _mapConfiguration; + + @override + Widget build(BuildContext context) { + return GoogleMapsFlutterPlatform.instance.buildViewWithConfiguration( + _mapId, + onPlatformViewCreated, + widgetConfiguration: MapWidgetConfiguration( + textDirection: widget.layoutDirection ?? + Directionality.maybeOf(context) ?? + TextDirection.ltr, + initialCameraPosition: widget.initialCameraPosition, + gestureRecognizers: widget.gestureRecognizers, + ), + mapObjects: MapObjects( + markers: widget.markers, + polygons: widget.polygons, + polylines: widget.polylines, + circles: widget.circles, + ), + mapConfiguration: _mapConfiguration, + ); + } + + @override + void initState() { + super.initState(); + _mapConfiguration = _configurationFromMapWidget(widget); + _markers = keyByMarkerId(widget.markers); + _polygons = keyByPolygonId(widget.polygons); + _polylines = keyByPolylineId(widget.polylines); + _circles = keyByCircleId(widget.circles); + } + + @override + void dispose() { + _controller.future + .then((ExampleGoogleMapController controller) => controller.dispose()); + super.dispose(); + } + + @override + void didUpdateWidget(ExampleGoogleMap oldWidget) { + super.didUpdateWidget(oldWidget); + _updateOptions(); + _updateMarkers(); + _updatePolygons(); + _updatePolylines(); + _updateCircles(); + _updateTileOverlays(); + } + + Future _updateOptions() async { + final MapConfiguration newConfig = _configurationFromMapWidget(widget); + final MapConfiguration updates = newConfig.diffFrom(_mapConfiguration); + if (updates.isEmpty) { + return; + } + final ExampleGoogleMapController controller = await _controller.future; + controller._updateMapConfiguration(updates); + _mapConfiguration = newConfig; + } + + Future _updateMarkers() async { + final ExampleGoogleMapController controller = await _controller.future; + controller._updateMarkers( + MarkerUpdates.from(_markers.values.toSet(), widget.markers)); + _markers = keyByMarkerId(widget.markers); + } + + Future _updatePolygons() async { + final ExampleGoogleMapController controller = await _controller.future; + controller._updatePolygons( + PolygonUpdates.from(_polygons.values.toSet(), widget.polygons)); + _polygons = keyByPolygonId(widget.polygons); + } + + Future _updatePolylines() async { + final ExampleGoogleMapController controller = await _controller.future; + controller._updatePolylines( + PolylineUpdates.from(_polylines.values.toSet(), widget.polylines)); + _polylines = keyByPolylineId(widget.polylines); + } + + Future _updateCircles() async { + final ExampleGoogleMapController controller = await _controller.future; + controller._updateCircles( + CircleUpdates.from(_circles.values.toSet(), widget.circles)); + _circles = keyByCircleId(widget.circles); + } + + Future _updateTileOverlays() async { + final ExampleGoogleMapController controller = await _controller.future; + controller._updateTileOverlays(widget.tileOverlays); + } + + Future onPlatformViewCreated(int id) async { + final ExampleGoogleMapController controller = + await ExampleGoogleMapController._init( + id, + widget.initialCameraPosition, + this, + ); + _controller.complete(controller); + _updateTileOverlays(); + widget.onMapCreated?.call(controller); + } + + void onMarkerTap(MarkerId markerId) { + _markers[markerId]!.onTap?.call(); + } + + void onMarkerDragStart(MarkerId markerId, LatLng position) { + _markers[markerId]!.onDragStart?.call(position); + } + + void onMarkerDrag(MarkerId markerId, LatLng position) { + _markers[markerId]!.onDrag?.call(position); + } + + void onMarkerDragEnd(MarkerId markerId, LatLng position) { + _markers[markerId]!.onDragEnd?.call(position); + } + + void onPolygonTap(PolygonId polygonId) { + _polygons[polygonId]!.onTap?.call(); + } + + void onPolylineTap(PolylineId polylineId) { + _polylines[polylineId]!.onTap?.call(); + } + + void onCircleTap(CircleId circleId) { + _circles[circleId]!.onTap?.call(); + } + + void onInfoWindowTap(MarkerId markerId) { + _markers[markerId]!.infoWindow.onTap?.call(); + } + + void onTap(LatLng position) { + widget.onTap?.call(position); + } + + void onLongPress(LatLng position) { + widget.onLongPress?.call(position); + } +} + +/// Builds a [MapConfiguration] from the given [map]. +MapConfiguration _configurationFromMapWidget(ExampleGoogleMap map) { + return MapConfiguration( + compassEnabled: map.compassEnabled, + mapToolbarEnabled: map.mapToolbarEnabled, + cameraTargetBounds: map.cameraTargetBounds, + mapType: map.mapType, + minMaxZoomPreference: map.minMaxZoomPreference, + rotateGesturesEnabled: map.rotateGesturesEnabled, + scrollGesturesEnabled: map.scrollGesturesEnabled, + tiltGesturesEnabled: map.tiltGesturesEnabled, + trackCameraPosition: map.onCameraMove != null, + zoomControlsEnabled: map.zoomControlsEnabled, + zoomGesturesEnabled: map.zoomGesturesEnabled, + liteModeEnabled: map.liteModeEnabled, + myLocationEnabled: map.myLocationEnabled, + myLocationButtonEnabled: map.myLocationButtonEnabled, + padding: map.padding, + indoorViewEnabled: map.indoorViewEnabled, + trafficEnabled: map.trafficEnabled, + buildingsEnabled: map.buildingsEnabled, + ); +} diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/lite_mode.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/lite_mode.dart new file mode 100644 index 00000000000..f7bead951f5 --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/lite_mode.dart @@ -0,0 +1,47 @@ +// 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. + +// ignore_for_file: public_member_api_docs + +import 'package:flutter/material.dart'; +import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart'; + +import 'example_google_map.dart'; +import 'page.dart'; + +const CameraPosition _kInitialPosition = + CameraPosition(target: LatLng(-33.852, 151.211), zoom: 11.0); + +class LiteModePage extends GoogleMapExampleAppPage { + const LiteModePage({Key? key}) + : super(const Icon(Icons.map), 'Lite mode', key: key); + + @override + Widget build(BuildContext context) { + return const _LiteModeBody(); + } +} + +class _LiteModeBody extends StatelessWidget { + const _LiteModeBody(); + + @override + Widget build(BuildContext context) { + return const Card( + child: Padding( + padding: EdgeInsets.symmetric(vertical: 30.0), + child: Center( + child: SizedBox( + width: 300.0, + height: 300.0, + child: ExampleGoogleMap( + initialCameraPosition: _kInitialPosition, + liteModeEnabled: true, + ), + ), + ), + ), + ); + } +} diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/main.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/main.dart new file mode 100644 index 00000000000..3b1e6361b96 --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/main.dart @@ -0,0 +1,73 @@ +// 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 'animate_camera.dart'; +import 'lite_mode.dart'; +import 'map_click.dart'; +import 'map_coordinates.dart'; +import 'map_ui.dart'; +import 'marker_icons.dart'; +import 'move_camera.dart'; +import 'padding.dart'; +import 'page.dart'; +import 'place_circle.dart'; +import 'place_marker.dart'; +import 'place_polygon.dart'; +import 'place_polyline.dart'; +import 'scrolling_map.dart'; +import 'snapshot.dart'; +import 'tile_overlay.dart'; + +final List _allPages = [ + const MapUiPage(), + const MapCoordinatesPage(), + const MapClickPage(), + const AnimateCameraPage(), + const MoveCameraPage(), + const PlaceMarkerPage(), + const MarkerIconsPage(), + const ScrollingMapPage(), + const PlacePolylinePage(), + const PlacePolygonPage(), + const PlaceCirclePage(), + const PaddingPage(), + const SnapshotPage(), + const LiteModePage(), + const TileOverlayPage(), +]; + +/// MapsDemo is the Main Application. +class MapsDemo extends StatelessWidget { + /// Default Constructor + const MapsDemo({super.key}); + + void _pushPage(BuildContext context, GoogleMapExampleAppPage page) { + Navigator.of(context).push(MaterialPageRoute( + builder: (_) => Scaffold( + appBar: AppBar(title: Text(page.title)), + body: page, + ))); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar(title: const Text('GoogleMaps examples')), + body: ListView.builder( + itemCount: _allPages.length, + itemBuilder: (_, int index) => ListTile( + leading: _allPages[index].leading, + title: Text(_allPages[index].title), + onTap: () => _pushPage(context, _allPages[index]), + ), + ), + ); + } +} + +void main() { + runApp(const MaterialApp(home: MapsDemo())); +} diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/map_click.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/map_click.dart new file mode 100644 index 00000000000..4017a9fccce --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/map_click.dart @@ -0,0 +1,105 @@ +// 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. + +// ignore_for_file: public_member_api_docs + +import 'package:flutter/material.dart'; +import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart'; + +import 'example_google_map.dart'; +import 'page.dart'; + +const CameraPosition _kInitialPosition = + CameraPosition(target: LatLng(-33.852, 151.211), zoom: 11.0); + +class MapClickPage extends GoogleMapExampleAppPage { + const MapClickPage({Key? key}) + : super(const Icon(Icons.mouse), 'Map click', key: key); + + @override + Widget build(BuildContext context) { + return const _MapClickBody(); + } +} + +class _MapClickBody extends StatefulWidget { + const _MapClickBody(); + + @override + State createState() => _MapClickBodyState(); +} + +class _MapClickBodyState extends State<_MapClickBody> { + _MapClickBodyState(); + + ExampleGoogleMapController? mapController; + LatLng? _lastTap; + LatLng? _lastLongPress; + + @override + Widget build(BuildContext context) { + final ExampleGoogleMap googleMap = ExampleGoogleMap( + onMapCreated: onMapCreated, + initialCameraPosition: _kInitialPosition, + onTap: (LatLng pos) { + setState(() { + _lastTap = pos; + }); + }, + onLongPress: (LatLng pos) { + setState(() { + _lastLongPress = pos; + }); + }, + ); + + final List columnChildren = [ + Padding( + padding: const EdgeInsets.all(10.0), + child: Center( + child: SizedBox( + width: 300.0, + height: 200.0, + child: googleMap, + ), + ), + ), + ]; + + if (mapController != null) { + final String lastTap = 'Tap:\n${_lastTap ?? ""}\n'; + final String lastLongPress = 'Long press:\n${_lastLongPress ?? ""}'; + columnChildren.add(Center( + child: Text( + lastTap, + textAlign: TextAlign.center, + ))); + columnChildren.add(Center( + child: Text( + _lastTap != null ? 'Tapped' : '', + textAlign: TextAlign.center, + ))); + columnChildren.add(Center( + child: Text( + lastLongPress, + textAlign: TextAlign.center, + ))); + columnChildren.add(Center( + child: Text( + _lastLongPress != null ? 'Long pressed' : '', + textAlign: TextAlign.center, + ))); + } + return Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: columnChildren, + ); + } + + Future onMapCreated(ExampleGoogleMapController controller) async { + setState(() { + mapController = controller; + }); + } +} diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/map_coordinates.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/map_coordinates.dart new file mode 100644 index 00000000000..25247bc7c7b --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/map_coordinates.dart @@ -0,0 +1,104 @@ +// 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. + +// ignore_for_file: public_member_api_docs + +import 'package:flutter/material.dart'; +import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart'; + +import 'example_google_map.dart'; +import 'page.dart'; + +const CameraPosition _kInitialPosition = + CameraPosition(target: LatLng(-33.852, 151.211), zoom: 11.0); + +class MapCoordinatesPage extends GoogleMapExampleAppPage { + const MapCoordinatesPage({Key? key}) + : super(const Icon(Icons.map), 'Map coordinates', key: key); + + @override + Widget build(BuildContext context) { + return const _MapCoordinatesBody(); + } +} + +class _MapCoordinatesBody extends StatefulWidget { + const _MapCoordinatesBody(); + + @override + State createState() => _MapCoordinatesBodyState(); +} + +class _MapCoordinatesBodyState extends State<_MapCoordinatesBody> { + _MapCoordinatesBodyState(); + + ExampleGoogleMapController? mapController; + LatLngBounds _visibleRegion = LatLngBounds( + southwest: const LatLng(0, 0), + northeast: const LatLng(0, 0), + ); + + @override + Widget build(BuildContext context) { + final ExampleGoogleMap googleMap = ExampleGoogleMap( + onMapCreated: onMapCreated, + initialCameraPosition: _kInitialPosition, + onCameraIdle: + _updateVisibleRegion, // https://github.com/flutter/flutter/issues/54758 + ); + + return NotificationListener( + onNotification: (ScrollNotification scrollState) { + _updateVisibleRegion(); + return true; + }, + child: Stack( + children: [ + ListView( + children: [ + Padding( + padding: const EdgeInsets.all(10.0), + child: Center( + child: SizedBox( + width: 300.0, + height: 200.0, + child: googleMap, + ), + ), + ), + // Add a block at the bottom of this list to allow validation that the visible region of the map + // does not change when scrolled under the safe view on iOS. + // https://github.com/flutter/flutter/issues/107913 + const SizedBox( + width: 300, + height: 1000, + ), + ], + ), + if (mapController != null) + Center( + child: Text('VisibleRegion:' + '\nnortheast: ${_visibleRegion.northeast},' + '\nsouthwest: ${_visibleRegion.southwest}'), + ), + ], + ), + ); + } + + Future onMapCreated(ExampleGoogleMapController controller) async { + final LatLngBounds visibleRegion = await controller.getVisibleRegion(); + setState(() { + mapController = controller; + _visibleRegion = visibleRegion; + }); + } + + Future _updateVisibleRegion() async { + final LatLngBounds visibleRegion = await mapController!.getVisibleRegion(); + setState(() { + _visibleRegion = visibleRegion; + }); + } +} diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/map_ui.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/map_ui.dart new file mode 100644 index 00000000000..311e2267aa0 --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/map_ui.dart @@ -0,0 +1,357 @@ +// 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. + +// ignore_for_file: public_member_api_docs + +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart' show rootBundle; +import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart'; + +import 'example_google_map.dart'; +import 'page.dart'; + +final LatLngBounds sydneyBounds = LatLngBounds( + southwest: const LatLng(-34.022631, 150.620685), + northeast: const LatLng(-33.571835, 151.325952), +); + +class MapUiPage extends GoogleMapExampleAppPage { + const MapUiPage({Key? key}) + : super(const Icon(Icons.map), 'User interface', key: key); + + @override + Widget build(BuildContext context) { + return const MapUiBody(); + } +} + +class MapUiBody extends StatefulWidget { + const MapUiBody({super.key}); + + @override + State createState() => MapUiBodyState(); +} + +class MapUiBodyState extends State { + MapUiBodyState(); + + static const CameraPosition _kInitialPosition = CameraPosition( + target: LatLng(-33.852, 151.211), + zoom: 11.0, + ); + + CameraPosition _position = _kInitialPosition; + bool _isMapCreated = false; + final bool _isMoving = false; + bool _compassEnabled = true; + bool _mapToolbarEnabled = true; + CameraTargetBounds _cameraTargetBounds = CameraTargetBounds.unbounded; + MinMaxZoomPreference _minMaxZoomPreference = MinMaxZoomPreference.unbounded; + MapType _mapType = MapType.normal; + bool _rotateGesturesEnabled = true; + bool _scrollGesturesEnabled = true; + bool _tiltGesturesEnabled = true; + bool _zoomControlsEnabled = false; + bool _zoomGesturesEnabled = true; + bool _indoorViewEnabled = true; + bool _myLocationEnabled = true; + bool _myTrafficEnabled = false; + bool _myLocationButtonEnabled = true; + late ExampleGoogleMapController _controller; + bool _nightMode = false; + + @override + void initState() { + super.initState(); + } + + @override + void dispose() { + super.dispose(); + } + + Widget _compassToggler() { + return TextButton( + child: Text('${_compassEnabled ? 'disable' : 'enable'} compass'), + onPressed: () { + setState(() { + _compassEnabled = !_compassEnabled; + }); + }, + ); + } + + Widget _mapToolbarToggler() { + return TextButton( + child: Text('${_mapToolbarEnabled ? 'disable' : 'enable'} map toolbar'), + onPressed: () { + setState(() { + _mapToolbarEnabled = !_mapToolbarEnabled; + }); + }, + ); + } + + Widget _latLngBoundsToggler() { + return TextButton( + child: Text( + _cameraTargetBounds.bounds == null + ? 'bound camera target' + : 'release camera target', + ), + onPressed: () { + setState(() { + _cameraTargetBounds = _cameraTargetBounds.bounds == null + ? CameraTargetBounds(sydneyBounds) + : CameraTargetBounds.unbounded; + }); + }, + ); + } + + Widget _zoomBoundsToggler() { + return TextButton( + child: Text(_minMaxZoomPreference.minZoom == null + ? 'bound zoom' + : 'release zoom'), + onPressed: () { + setState(() { + _minMaxZoomPreference = _minMaxZoomPreference.minZoom == null + ? const MinMaxZoomPreference(12.0, 16.0) + : MinMaxZoomPreference.unbounded; + }); + }, + ); + } + + Widget _mapTypeCycler() { + final MapType nextType = + MapType.values[(_mapType.index + 1) % MapType.values.length]; + return TextButton( + child: Text('change map type to $nextType'), + onPressed: () { + setState(() { + _mapType = nextType; + }); + }, + ); + } + + Widget _rotateToggler() { + return TextButton( + child: Text('${_rotateGesturesEnabled ? 'disable' : 'enable'} rotate'), + onPressed: () { + setState(() { + _rotateGesturesEnabled = !_rotateGesturesEnabled; + }); + }, + ); + } + + Widget _scrollToggler() { + return TextButton( + child: Text('${_scrollGesturesEnabled ? 'disable' : 'enable'} scroll'), + onPressed: () { + setState(() { + _scrollGesturesEnabled = !_scrollGesturesEnabled; + }); + }, + ); + } + + Widget _tiltToggler() { + return TextButton( + child: Text('${_tiltGesturesEnabled ? 'disable' : 'enable'} tilt'), + onPressed: () { + setState(() { + _tiltGesturesEnabled = !_tiltGesturesEnabled; + }); + }, + ); + } + + Widget _zoomToggler() { + return TextButton( + child: Text('${_zoomGesturesEnabled ? 'disable' : 'enable'} zoom'), + onPressed: () { + setState(() { + _zoomGesturesEnabled = !_zoomGesturesEnabled; + }); + }, + ); + } + + Widget _zoomControlsToggler() { + return TextButton( + child: + Text('${_zoomControlsEnabled ? 'disable' : 'enable'} zoom controls'), + onPressed: () { + setState(() { + _zoomControlsEnabled = !_zoomControlsEnabled; + }); + }, + ); + } + + Widget _indoorViewToggler() { + return TextButton( + child: Text('${_indoorViewEnabled ? 'disable' : 'enable'} indoor'), + onPressed: () { + setState(() { + _indoorViewEnabled = !_indoorViewEnabled; + }); + }, + ); + } + + Widget _myLocationToggler() { + return TextButton( + child: Text( + '${_myLocationEnabled ? 'disable' : 'enable'} my location marker'), + onPressed: () { + setState(() { + _myLocationEnabled = !_myLocationEnabled; + }); + }, + ); + } + + Widget _myLocationButtonToggler() { + return TextButton( + child: Text( + '${_myLocationButtonEnabled ? 'disable' : 'enable'} my location button'), + onPressed: () { + setState(() { + _myLocationButtonEnabled = !_myLocationButtonEnabled; + }); + }, + ); + } + + Widget _myTrafficToggler() { + return TextButton( + child: Text('${_myTrafficEnabled ? 'disable' : 'enable'} my traffic'), + onPressed: () { + setState(() { + _myTrafficEnabled = !_myTrafficEnabled; + }); + }, + ); + } + + Future _getFileData(String path) async { + return rootBundle.loadString(path); + } + + void _setMapStyle(String mapStyle) { + setState(() { + _nightMode = true; + _controller.setMapStyle(mapStyle); + }); + } + + // Should only be called if _isMapCreated is true. + Widget _nightModeToggler() { + assert(_isMapCreated); + return TextButton( + child: Text('${_nightMode ? 'disable' : 'enable'} night mode'), + onPressed: () { + if (_nightMode) { + setState(() { + _nightMode = false; + _controller.setMapStyle(null); + }); + } else { + _getFileData('assets/night_mode.json').then(_setMapStyle); + } + }, + ); + } + + @override + Widget build(BuildContext context) { + final ExampleGoogleMap googleMap = ExampleGoogleMap( + onMapCreated: onMapCreated, + initialCameraPosition: _kInitialPosition, + compassEnabled: _compassEnabled, + mapToolbarEnabled: _mapToolbarEnabled, + cameraTargetBounds: _cameraTargetBounds, + minMaxZoomPreference: _minMaxZoomPreference, + mapType: _mapType, + rotateGesturesEnabled: _rotateGesturesEnabled, + scrollGesturesEnabled: _scrollGesturesEnabled, + tiltGesturesEnabled: _tiltGesturesEnabled, + zoomGesturesEnabled: _zoomGesturesEnabled, + zoomControlsEnabled: _zoomControlsEnabled, + indoorViewEnabled: _indoorViewEnabled, + myLocationEnabled: _myLocationEnabled, + myLocationButtonEnabled: _myLocationButtonEnabled, + trafficEnabled: _myTrafficEnabled, + onCameraMove: _updateCameraPosition, + ); + + final List columnChildren = [ + Padding( + padding: const EdgeInsets.all(10.0), + child: Center( + child: SizedBox( + width: 300.0, + height: 200.0, + child: googleMap, + ), + ), + ), + ]; + + if (_isMapCreated) { + columnChildren.add( + Expanded( + child: ListView( + children: [ + Text('camera bearing: ${_position.bearing}'), + Text( + 'camera target: ${_position.target.latitude.toStringAsFixed(4)},' + '${_position.target.longitude.toStringAsFixed(4)}'), + Text('camera zoom: ${_position.zoom}'), + Text('camera tilt: ${_position.tilt}'), + Text(_isMoving ? '(Camera moving)' : '(Camera idle)'), + _compassToggler(), + _mapToolbarToggler(), + _latLngBoundsToggler(), + _mapTypeCycler(), + _zoomBoundsToggler(), + _rotateToggler(), + _scrollToggler(), + _tiltToggler(), + _zoomToggler(), + _zoomControlsToggler(), + _indoorViewToggler(), + _myLocationToggler(), + _myLocationButtonToggler(), + _myTrafficToggler(), + _nightModeToggler(), + ], + ), + ), + ); + } + return Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: columnChildren, + ); + } + + void _updateCameraPosition(CameraPosition position) { + setState(() { + _position = position; + }); + } + + void onMapCreated(ExampleGoogleMapController controller) { + setState(() { + _controller = controller; + _isMapCreated = true; + }); + } +} diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/marker_icons.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/marker_icons.dart new file mode 100644 index 00000000000..174055613a9 --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/marker_icons.dart @@ -0,0 +1,98 @@ +// 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. + +// ignore_for_file: public_member_api_docs +// ignore_for_file: unawaited_futures + +import 'package:flutter/material.dart'; +import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart'; + +import 'example_google_map.dart'; +import 'page.dart'; + +class MarkerIconsPage extends GoogleMapExampleAppPage { + const MarkerIconsPage({Key? key}) + : super(const Icon(Icons.image), 'Marker icons', key: key); + + @override + Widget build(BuildContext context) { + return const MarkerIconsBody(); + } +} + +class MarkerIconsBody extends StatefulWidget { + const MarkerIconsBody({super.key}); + + @override + State createState() => MarkerIconsBodyState(); +} + +const LatLng _kMapCenter = LatLng(52.4478, -3.5402); + +class MarkerIconsBodyState extends State { + ExampleGoogleMapController? controller; + BitmapDescriptor? _markerIcon; + + @override + Widget build(BuildContext context) { + _createMarkerImageFromAsset(context); + return Column( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Center( + child: SizedBox( + width: 350.0, + height: 300.0, + child: ExampleGoogleMap( + initialCameraPosition: const CameraPosition( + target: _kMapCenter, + zoom: 7.0, + ), + markers: {_createMarker()}, + onMapCreated: _onMapCreated, + ), + ), + ) + ], + ); + } + + Marker _createMarker() { + if (_markerIcon != null) { + return Marker( + markerId: const MarkerId('marker_1'), + position: _kMapCenter, + icon: _markerIcon!, + ); + } else { + return const Marker( + markerId: MarkerId('marker_1'), + position: _kMapCenter, + ); + } + } + + Future _createMarkerImageFromAsset(BuildContext context) async { + if (_markerIcon == null) { + final ImageConfiguration imageConfiguration = + createLocalImageConfiguration(context, size: const Size.square(48)); + BitmapDescriptor.fromAssetImage( + imageConfiguration, 'assets/red_square.png') + .then(_updateBitmap); + } + } + + void _updateBitmap(BitmapDescriptor bitmap) { + setState(() { + _markerIcon = bitmap; + }); + } + + void _onMapCreated(ExampleGoogleMapController controllerParam) { + setState(() { + controller = controllerParam; + }); + } +} diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/move_camera.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/move_camera.dart new file mode 100644 index 00000000000..b1fb55cad54 --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/move_camera.dart @@ -0,0 +1,171 @@ +// 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. + +// ignore_for_file: public_member_api_docs + +import 'package:flutter/material.dart'; +import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart'; + +import 'example_google_map.dart'; +import 'page.dart'; + +class MoveCameraPage extends GoogleMapExampleAppPage { + const MoveCameraPage({Key? key}) + : super(const Icon(Icons.map), 'Camera control', key: key); + + @override + Widget build(BuildContext context) { + return const MoveCamera(); + } +} + +class MoveCamera extends StatefulWidget { + const MoveCamera({super.key}); + @override + State createState() => MoveCameraState(); +} + +class MoveCameraState extends State { + ExampleGoogleMapController? mapController; + + // ignore: use_setters_to_change_properties + void _onMapCreated(ExampleGoogleMapController controller) { + mapController = controller; + } + + @override + Widget build(BuildContext context) { + return Column( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Center( + child: SizedBox( + width: 300.0, + height: 200.0, + child: ExampleGoogleMap( + onMapCreated: _onMapCreated, + initialCameraPosition: + const CameraPosition(target: LatLng(0.0, 0.0)), + ), + ), + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + Column( + children: [ + TextButton( + onPressed: () { + mapController?.moveCamera( + CameraUpdate.newCameraPosition( + const CameraPosition( + bearing: 270.0, + target: LatLng(51.5160895, -0.1294527), + tilt: 30.0, + zoom: 17.0, + ), + ), + ); + }, + child: const Text('newCameraPosition'), + ), + TextButton( + onPressed: () { + mapController?.moveCamera( + CameraUpdate.newLatLng( + const LatLng(56.1725505, 10.1850512), + ), + ); + }, + child: const Text('newLatLng'), + ), + TextButton( + onPressed: () { + mapController?.moveCamera( + CameraUpdate.newLatLngBounds( + LatLngBounds( + southwest: const LatLng(-38.483935, 113.248673), + northeast: const LatLng(-8.982446, 153.823821), + ), + 10.0, + ), + ); + }, + child: const Text('newLatLngBounds'), + ), + TextButton( + onPressed: () { + mapController?.moveCamera( + CameraUpdate.newLatLngZoom( + const LatLng(37.4231613, -122.087159), + 11.0, + ), + ); + }, + child: const Text('newLatLngZoom'), + ), + TextButton( + onPressed: () { + mapController?.moveCamera( + CameraUpdate.scrollBy(150.0, -225.0), + ); + }, + child: const Text('scrollBy'), + ), + ], + ), + Column( + children: [ + TextButton( + onPressed: () { + mapController?.moveCamera( + CameraUpdate.zoomBy( + -0.5, + const Offset(30.0, 20.0), + ), + ); + }, + child: const Text('zoomBy with focus'), + ), + TextButton( + onPressed: () { + mapController?.moveCamera( + CameraUpdate.zoomBy(-0.5), + ); + }, + child: const Text('zoomBy'), + ), + TextButton( + onPressed: () { + mapController?.moveCamera( + CameraUpdate.zoomIn(), + ); + }, + child: const Text('zoomIn'), + ), + TextButton( + onPressed: () { + mapController?.moveCamera( + CameraUpdate.zoomOut(), + ); + }, + child: const Text('zoomOut'), + ), + TextButton( + onPressed: () { + mapController?.moveCamera( + CameraUpdate.zoomTo(16.0), + ); + }, + child: const Text('zoomTo'), + ), + ], + ), + ], + ) + ], + ); + } +} diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/padding.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/padding.dart new file mode 100644 index 00000000000..bfddb167d43 --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/padding.dart @@ -0,0 +1,180 @@ +// 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. + +// ignore_for_file: public_member_api_docs + +import 'package:flutter/material.dart'; +import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart'; + +import 'example_google_map.dart'; +import 'page.dart'; + +class PaddingPage extends GoogleMapExampleAppPage { + const PaddingPage({Key? key}) + : super(const Icon(Icons.map), 'Add padding to the map', key: key); + + @override + Widget build(BuildContext context) { + return const MarkerIconsBody(); + } +} + +class MarkerIconsBody extends StatefulWidget { + const MarkerIconsBody({super.key}); + + @override + State createState() => MarkerIconsBodyState(); +} + +const LatLng _kMapCenter = LatLng(52.4478, -3.5402); + +class MarkerIconsBodyState extends State { + ExampleGoogleMapController? controller; + + EdgeInsets _padding = EdgeInsets.zero; + + @override + Widget build(BuildContext context) { + final ExampleGoogleMap googleMap = ExampleGoogleMap( + onMapCreated: _onMapCreated, + initialCameraPosition: const CameraPosition( + target: _kMapCenter, + zoom: 7.0, + ), + padding: _padding, + ); + + final List columnChildren = [ + Padding( + padding: const EdgeInsets.all(10.0), + child: Center( + child: SizedBox( + width: 300.0, + height: 200.0, + child: googleMap, + ), + ), + ), + const Padding( + padding: EdgeInsets.only(top: 20), + child: Center( + child: Text( + 'Enter Padding Below', + style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold), + ), + ), + ), + ]; + + columnChildren.addAll([_paddingInput(), _buttons()]); + + return Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: columnChildren, + ); + } + + void _onMapCreated(ExampleGoogleMapController controllerParam) { + setState(() { + controller = controllerParam; + }); + } + + final TextEditingController _topController = TextEditingController(); + final TextEditingController _bottomController = TextEditingController(); + final TextEditingController _leftController = TextEditingController(); + final TextEditingController _rightController = TextEditingController(); + + Widget _paddingInput() { + return Padding( + padding: const EdgeInsets.all(16.0), + child: Row( + children: [ + Flexible( + flex: 2, + child: TextField( + controller: _topController, + keyboardType: TextInputType.number, + textAlign: TextAlign.center, + decoration: const InputDecoration( + hintText: 'Top', + ), + ), + ), + const Spacer(), + Flexible( + flex: 2, + child: TextField( + controller: _bottomController, + keyboardType: TextInputType.number, + textAlign: TextAlign.center, + decoration: const InputDecoration( + hintText: 'Bottom', + ), + ), + ), + const Spacer(), + Flexible( + flex: 2, + child: TextField( + controller: _leftController, + keyboardType: TextInputType.number, + textAlign: TextAlign.center, + decoration: const InputDecoration( + hintText: 'Left', + ), + ), + ), + const Spacer(), + Flexible( + flex: 2, + child: TextField( + controller: _rightController, + keyboardType: TextInputType.number, + textAlign: TextAlign.center, + decoration: const InputDecoration( + hintText: 'Right', + ), + ), + ), + ], + ), + ); + } + + Widget _buttons() { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + TextButton( + child: const Text('Set Padding'), + onPressed: () { + setState(() { + _padding = EdgeInsets.fromLTRB( + double.tryParse(_leftController.value.text) ?? 0, + double.tryParse(_topController.value.text) ?? 0, + double.tryParse(_rightController.value.text) ?? 0, + double.tryParse(_bottomController.value.text) ?? 0); + }); + }, + ), + TextButton( + child: const Text('Reset Padding'), + onPressed: () { + setState(() { + _topController.clear(); + _bottomController.clear(); + _leftController.clear(); + _rightController.clear(); + _padding = EdgeInsets.zero; + }); + }, + ) + ], + ), + ); + } +} diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/page.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/page.dart new file mode 100644 index 00000000000..cb8ef54d374 --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/page.dart @@ -0,0 +1,14 @@ +// 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. + +// ignore_for_file: public_member_api_docs + +import 'package:flutter/material.dart'; + +abstract class GoogleMapExampleAppPage extends StatelessWidget { + const GoogleMapExampleAppPage(this.leading, this.title, {super.key}); + + final Widget leading; + final String title; +} diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/place_circle.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/place_circle.dart new file mode 100644 index 00000000000..29be7442965 --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/place_circle.dart @@ -0,0 +1,232 @@ +// 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. + +// ignore_for_file: public_member_api_docs + +import 'package:flutter/material.dart'; +import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart'; + +import 'example_google_map.dart'; +import 'page.dart'; + +class PlaceCirclePage extends GoogleMapExampleAppPage { + const PlaceCirclePage({Key? key}) + : super(const Icon(Icons.linear_scale), 'Place circle', key: key); + + @override + Widget build(BuildContext context) { + return const PlaceCircleBody(); + } +} + +class PlaceCircleBody extends StatefulWidget { + const PlaceCircleBody({super.key}); + + @override + State createState() => PlaceCircleBodyState(); +} + +class PlaceCircleBodyState extends State { + PlaceCircleBodyState(); + + ExampleGoogleMapController? controller; + Map circles = {}; + int _circleIdCounter = 1; + CircleId? selectedCircle; + + // Values when toggling circle color + int fillColorsIndex = 0; + int strokeColorsIndex = 0; + List colors = [ + Colors.purple, + Colors.red, + Colors.green, + Colors.pink, + ]; + + // Values when toggling circle stroke width + int widthsIndex = 0; + List widths = [10, 20, 5]; + + // ignore: use_setters_to_change_properties + void _onMapCreated(ExampleGoogleMapController controller) { + this.controller = controller; + } + + @override + void dispose() { + super.dispose(); + } + + void _onCircleTapped(CircleId circleId) { + setState(() { + selectedCircle = circleId; + }); + } + + void _remove(CircleId circleId) { + setState(() { + if (circles.containsKey(circleId)) { + circles.remove(circleId); + } + if (circleId == selectedCircle) { + selectedCircle = null; + } + }); + } + + void _add() { + final int circleCount = circles.length; + + if (circleCount == 12) { + return; + } + + final String circleIdVal = 'circle_id_$_circleIdCounter'; + _circleIdCounter++; + final CircleId circleId = CircleId(circleIdVal); + + final Circle circle = Circle( + circleId: circleId, + consumeTapEvents: true, + strokeColor: Colors.orange, + fillColor: Colors.green, + strokeWidth: 5, + center: _createCenter(), + radius: 50000, + onTap: () { + _onCircleTapped(circleId); + }, + ); + + setState(() { + circles[circleId] = circle; + }); + } + + void _toggleVisible(CircleId circleId) { + final Circle circle = circles[circleId]!; + setState(() { + circles[circleId] = circle.copyWith( + visibleParam: !circle.visible, + ); + }); + } + + void _changeFillColor(CircleId circleId) { + final Circle circle = circles[circleId]!; + setState(() { + circles[circleId] = circle.copyWith( + fillColorParam: colors[++fillColorsIndex % colors.length], + ); + }); + } + + void _changeStrokeColor(CircleId circleId) { + final Circle circle = circles[circleId]!; + setState(() { + circles[circleId] = circle.copyWith( + strokeColorParam: colors[++strokeColorsIndex % colors.length], + ); + }); + } + + void _changeStrokeWidth(CircleId circleId) { + final Circle circle = circles[circleId]!; + setState(() { + circles[circleId] = circle.copyWith( + strokeWidthParam: widths[++widthsIndex % widths.length], + ); + }); + } + + @override + Widget build(BuildContext context) { + final CircleId? selectedId = selectedCircle; + return Column( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Center( + child: SizedBox( + width: 350.0, + height: 300.0, + child: ExampleGoogleMap( + initialCameraPosition: const CameraPosition( + target: LatLng(52.4478, -3.5402), + zoom: 7.0, + ), + circles: Set.of(circles.values), + onMapCreated: _onMapCreated, + ), + ), + ), + Expanded( + child: SingleChildScrollView( + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + Row( + children: [ + Column( + children: [ + TextButton( + onPressed: _add, + child: const Text('add'), + ), + TextButton( + onPressed: (selectedId == null) + ? null + : () => _remove(selectedId), + child: const Text('remove'), + ), + TextButton( + onPressed: (selectedId == null) + ? null + : () => _toggleVisible(selectedId), + child: const Text('toggle visible'), + ), + ], + ), + Column( + children: [ + TextButton( + onPressed: (selectedId == null) + ? null + : () => _changeStrokeWidth(selectedId), + child: const Text('change stroke width'), + ), + TextButton( + onPressed: (selectedId == null) + ? null + : () => _changeStrokeColor(selectedId), + child: const Text('change stroke color'), + ), + TextButton( + onPressed: (selectedId == null) + ? null + : () => _changeFillColor(selectedId), + child: const Text('change fill color'), + ), + ], + ) + ], + ) + ], + ), + ), + ), + ], + ); + } + + LatLng _createCenter() { + final double offset = _circleIdCounter.ceilToDouble(); + return _createLatLng(51.4816 + offset * 0.2, -3.1791); + } + + LatLng _createLatLng(double lat, double lng) { + return LatLng(lat, lng); + } +} diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/place_marker.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/place_marker.dart new file mode 100644 index 00000000000..9cba4975d40 --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/place_marker.dart @@ -0,0 +1,421 @@ +// 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. + +// ignore_for_file: public_member_api_docs + +import 'dart:async'; +import 'dart:math'; +import 'dart:typed_data'; +import 'dart:ui'; + +import 'package:flutter/material.dart'; +import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart'; + +import 'example_google_map.dart'; +import 'page.dart'; + +class PlaceMarkerPage extends GoogleMapExampleAppPage { + const PlaceMarkerPage({Key? key}) + : super(const Icon(Icons.place), 'Place marker', key: key); + + @override + Widget build(BuildContext context) { + return const PlaceMarkerBody(); + } +} + +class PlaceMarkerBody extends StatefulWidget { + const PlaceMarkerBody({super.key}); + + @override + State createState() => PlaceMarkerBodyState(); +} + +typedef MarkerUpdateAction = Marker Function(Marker marker); + +class PlaceMarkerBodyState extends State { + PlaceMarkerBodyState(); + static const LatLng center = LatLng(-33.86711, 151.1947171); + + ExampleGoogleMapController? controller; + Map markers = {}; + MarkerId? selectedMarker; + int _markerIdCounter = 1; + LatLng? markerPosition; + + // ignore: use_setters_to_change_properties + void _onMapCreated(ExampleGoogleMapController controller) { + this.controller = controller; + } + + @override + void dispose() { + super.dispose(); + } + + void _onMarkerTapped(MarkerId markerId) { + final Marker? tappedMarker = markers[markerId]; + if (tappedMarker != null) { + setState(() { + final MarkerId? previousMarkerId = selectedMarker; + if (previousMarkerId != null && markers.containsKey(previousMarkerId)) { + final Marker resetOld = markers[previousMarkerId]! + .copyWith(iconParam: BitmapDescriptor.defaultMarker); + markers[previousMarkerId] = resetOld; + } + selectedMarker = markerId; + final Marker newMarker = tappedMarker.copyWith( + iconParam: BitmapDescriptor.defaultMarkerWithHue( + BitmapDescriptor.hueGreen, + ), + ); + markers[markerId] = newMarker; + + markerPosition = null; + }); + } + } + + Future _onMarkerDrag(MarkerId markerId, LatLng newPosition) async { + setState(() { + markerPosition = newPosition; + }); + } + + Future _onMarkerDragEnd(MarkerId markerId, LatLng newPosition) async { + final Marker? tappedMarker = markers[markerId]; + if (tappedMarker != null) { + setState(() { + markerPosition = null; + }); + await showDialog( + context: context, + builder: (BuildContext context) { + return AlertDialog( + actions: [ + TextButton( + child: const Text('OK'), + onPressed: () => Navigator.of(context).pop(), + ) + ], + content: Padding( + padding: const EdgeInsets.symmetric(vertical: 66), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text('Old position: ${tappedMarker.position}'), + Text('New position: $newPosition'), + ], + ))); + }); + } + } + + void _add() { + final int markerCount = markers.length; + + if (markerCount == 12) { + return; + } + + final String markerIdVal = 'marker_id_$_markerIdCounter'; + _markerIdCounter++; + final MarkerId markerId = MarkerId(markerIdVal); + + final Marker marker = Marker( + markerId: markerId, + position: LatLng( + center.latitude + sin(_markerIdCounter * pi / 6.0) / 20.0, + center.longitude + cos(_markerIdCounter * pi / 6.0) / 20.0, + ), + infoWindow: InfoWindow(title: markerIdVal, snippet: '*'), + onTap: () => _onMarkerTapped(markerId), + onDragEnd: (LatLng position) => _onMarkerDragEnd(markerId, position), + onDrag: (LatLng position) => _onMarkerDrag(markerId, position), + ); + + setState(() { + markers[markerId] = marker; + }); + } + + void _remove(MarkerId markerId) { + setState(() { + if (markers.containsKey(markerId)) { + markers.remove(markerId); + } + }); + } + + void _changePosition(MarkerId markerId) { + final Marker marker = markers[markerId]!; + final LatLng current = marker.position; + final Offset offset = Offset( + center.latitude - current.latitude, + center.longitude - current.longitude, + ); + setState(() { + markers[markerId] = marker.copyWith( + positionParam: LatLng( + center.latitude + offset.dy, + center.longitude + offset.dx, + ), + ); + }); + } + + void _changeAnchor(MarkerId markerId) { + final Marker marker = markers[markerId]!; + final Offset currentAnchor = marker.anchor; + final Offset newAnchor = Offset(1.0 - currentAnchor.dy, currentAnchor.dx); + setState(() { + markers[markerId] = marker.copyWith( + anchorParam: newAnchor, + ); + }); + } + + Future _changeInfoAnchor(MarkerId markerId) async { + final Marker marker = markers[markerId]!; + final Offset currentAnchor = marker.infoWindow.anchor; + final Offset newAnchor = Offset(1.0 - currentAnchor.dy, currentAnchor.dx); + setState(() { + markers[markerId] = marker.copyWith( + infoWindowParam: marker.infoWindow.copyWith( + anchorParam: newAnchor, + ), + ); + }); + } + + Future _toggleDraggable(MarkerId markerId) async { + final Marker marker = markers[markerId]!; + setState(() { + markers[markerId] = marker.copyWith( + draggableParam: !marker.draggable, + ); + }); + } + + Future _toggleFlat(MarkerId markerId) async { + final Marker marker = markers[markerId]!; + setState(() { + markers[markerId] = marker.copyWith( + flatParam: !marker.flat, + ); + }); + } + + Future _changeInfo(MarkerId markerId) async { + final Marker marker = markers[markerId]!; + final String newSnippet = '${marker.infoWindow.snippet!}*'; + setState(() { + markers[markerId] = marker.copyWith( + infoWindowParam: marker.infoWindow.copyWith( + snippetParam: newSnippet, + ), + ); + }); + } + + Future _changeAlpha(MarkerId markerId) async { + final Marker marker = markers[markerId]!; + final double current = marker.alpha; + setState(() { + markers[markerId] = marker.copyWith( + alphaParam: current < 0.1 ? 1.0 : current * 0.75, + ); + }); + } + + Future _changeRotation(MarkerId markerId) async { + final Marker marker = markers[markerId]!; + final double current = marker.rotation; + setState(() { + markers[markerId] = marker.copyWith( + rotationParam: current == 330.0 ? 0.0 : current + 30.0, + ); + }); + } + + Future _toggleVisible(MarkerId markerId) async { + final Marker marker = markers[markerId]!; + setState(() { + markers[markerId] = marker.copyWith( + visibleParam: !marker.visible, + ); + }); + } + + Future _changeZIndex(MarkerId markerId) async { + final Marker marker = markers[markerId]!; + final double current = marker.zIndex; + setState(() { + markers[markerId] = marker.copyWith( + zIndexParam: current == 12.0 ? 0.0 : current + 1.0, + ); + }); + } + + void _setMarkerIcon(MarkerId markerId, BitmapDescriptor assetIcon) { + final Marker marker = markers[markerId]!; + setState(() { + markers[markerId] = marker.copyWith( + iconParam: assetIcon, + ); + }); + } + + Future _getAssetIcon(BuildContext context) async { + final Completer bitmapIcon = + Completer(); + final ImageConfiguration config = createLocalImageConfiguration(context); + + const AssetImage('assets/red_square.png') + .resolve(config) + .addListener(ImageStreamListener((ImageInfo image, bool sync) async { + final ByteData? bytes = + await image.image.toByteData(format: ImageByteFormat.png); + if (bytes == null) { + bitmapIcon.completeError(Exception('Unable to encode icon')); + return; + } + final BitmapDescriptor bitmap = + BitmapDescriptor.fromBytes(bytes.buffer.asUint8List()); + bitmapIcon.complete(bitmap); + })); + + return bitmapIcon.future; + } + + @override + Widget build(BuildContext context) { + final MarkerId? selectedId = selectedMarker; + return Stack(children: [ + Column( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Expanded( + child: ExampleGoogleMap( + onMapCreated: _onMapCreated, + initialCameraPosition: const CameraPosition( + target: LatLng(-33.852, 151.211), + zoom: 11.0, + ), + markers: Set.of(markers.values), + ), + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + TextButton( + onPressed: _add, + child: const Text('Add'), + ), + TextButton( + onPressed: + selectedId == null ? null : () => _remove(selectedId), + child: const Text('Remove'), + ), + ], + ), + Wrap( + alignment: WrapAlignment.spaceEvenly, + children: [ + TextButton( + onPressed: + selectedId == null ? null : () => _changeInfo(selectedId), + child: const Text('change info'), + ), + TextButton( + onPressed: selectedId == null + ? null + : () => _changeInfoAnchor(selectedId), + child: const Text('change info anchor'), + ), + TextButton( + onPressed: + selectedId == null ? null : () => _changeAlpha(selectedId), + child: const Text('change alpha'), + ), + TextButton( + onPressed: + selectedId == null ? null : () => _changeAnchor(selectedId), + child: const Text('change anchor'), + ), + TextButton( + onPressed: selectedId == null + ? null + : () => _toggleDraggable(selectedId), + child: const Text('toggle draggable'), + ), + TextButton( + onPressed: + selectedId == null ? null : () => _toggleFlat(selectedId), + child: const Text('toggle flat'), + ), + TextButton( + onPressed: selectedId == null + ? null + : () => _changePosition(selectedId), + child: const Text('change position'), + ), + TextButton( + onPressed: selectedId == null + ? null + : () => _changeRotation(selectedId), + child: const Text('change rotation'), + ), + TextButton( + onPressed: selectedId == null + ? null + : () => _toggleVisible(selectedId), + child: const Text('toggle visible'), + ), + TextButton( + onPressed: + selectedId == null ? null : () => _changeZIndex(selectedId), + child: const Text('change zIndex'), + ), + TextButton( + onPressed: selectedId == null + ? null + : () { + _getAssetIcon(context).then( + (BitmapDescriptor icon) { + _setMarkerIcon(selectedId, icon); + }, + ); + }, + child: const Text('set marker icon'), + ), + ], + ), + ], + ), + Visibility( + visible: markerPosition != null, + child: Container( + color: Colors.white70, + height: 30, + padding: const EdgeInsets.only(left: 12, right: 12), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + if (markerPosition == null) + Container() + else + Expanded(child: Text('lat: ${markerPosition!.latitude}')), + if (markerPosition == null) + Container() + else + Expanded(child: Text('lng: ${markerPosition!.longitude}')), + ], + ), + ), + ), + ]); + } +} diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/place_polygon.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/place_polygon.dart new file mode 100644 index 00000000000..889c38d6376 --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/place_polygon.dart @@ -0,0 +1,306 @@ +// 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. + +// ignore_for_file: public_member_api_docs + +import 'package:flutter/material.dart'; +import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart'; + +import 'example_google_map.dart'; +import 'page.dart'; + +class PlacePolygonPage extends GoogleMapExampleAppPage { + const PlacePolygonPage({Key? key}) + : super(const Icon(Icons.linear_scale), 'Place polygon', key: key); + + @override + Widget build(BuildContext context) { + return const PlacePolygonBody(); + } +} + +class PlacePolygonBody extends StatefulWidget { + const PlacePolygonBody({super.key}); + + @override + State createState() => PlacePolygonBodyState(); +} + +class PlacePolygonBodyState extends State { + PlacePolygonBodyState(); + + ExampleGoogleMapController? controller; + Map polygons = {}; + Map polygonOffsets = {}; + int _polygonIdCounter = 0; + PolygonId? selectedPolygon; + + // Values when toggling polygon color + int strokeColorsIndex = 0; + int fillColorsIndex = 0; + List colors = [ + Colors.purple, + Colors.red, + Colors.green, + Colors.pink, + ]; + + // Values when toggling polygon width + int widthsIndex = 0; + List widths = [10, 20, 5]; + + // ignore: use_setters_to_change_properties + void _onMapCreated(ExampleGoogleMapController controller) { + this.controller = controller; + } + + @override + void dispose() { + super.dispose(); + } + + void _onPolygonTapped(PolygonId polygonId) { + setState(() { + selectedPolygon = polygonId; + }); + } + + void _remove(PolygonId polygonId) { + setState(() { + if (polygons.containsKey(polygonId)) { + polygons.remove(polygonId); + } + selectedPolygon = null; + }); + } + + void _add() { + final int polygonCount = polygons.length; + + if (polygonCount == 12) { + return; + } + + final String polygonIdVal = 'polygon_id_$_polygonIdCounter'; + final PolygonId polygonId = PolygonId(polygonIdVal); + + final Polygon polygon = Polygon( + polygonId: polygonId, + consumeTapEvents: true, + strokeColor: Colors.orange, + strokeWidth: 5, + fillColor: Colors.green, + points: _createPoints(), + onTap: () { + _onPolygonTapped(polygonId); + }, + ); + + setState(() { + polygons[polygonId] = polygon; + polygonOffsets[polygonId] = _polygonIdCounter.ceilToDouble(); + // increment _polygonIdCounter to have unique polygon id each time + _polygonIdCounter++; + }); + } + + void _toggleGeodesic(PolygonId polygonId) { + final Polygon polygon = polygons[polygonId]!; + setState(() { + polygons[polygonId] = polygon.copyWith( + geodesicParam: !polygon.geodesic, + ); + }); + } + + void _toggleVisible(PolygonId polygonId) { + final Polygon polygon = polygons[polygonId]!; + setState(() { + polygons[polygonId] = polygon.copyWith( + visibleParam: !polygon.visible, + ); + }); + } + + void _changeStrokeColor(PolygonId polygonId) { + final Polygon polygon = polygons[polygonId]!; + setState(() { + polygons[polygonId] = polygon.copyWith( + strokeColorParam: colors[++strokeColorsIndex % colors.length], + ); + }); + } + + void _changeFillColor(PolygonId polygonId) { + final Polygon polygon = polygons[polygonId]!; + setState(() { + polygons[polygonId] = polygon.copyWith( + fillColorParam: colors[++fillColorsIndex % colors.length], + ); + }); + } + + void _changeWidth(PolygonId polygonId) { + final Polygon polygon = polygons[polygonId]!; + setState(() { + polygons[polygonId] = polygon.copyWith( + strokeWidthParam: widths[++widthsIndex % widths.length], + ); + }); + } + + void _addHoles(PolygonId polygonId) { + final Polygon polygon = polygons[polygonId]!; + setState(() { + polygons[polygonId] = + polygon.copyWith(holesParam: _createHoles(polygonId)); + }); + } + + void _removeHoles(PolygonId polygonId) { + final Polygon polygon = polygons[polygonId]!; + setState(() { + polygons[polygonId] = polygon.copyWith( + holesParam: >[], + ); + }); + } + + @override + Widget build(BuildContext context) { + final PolygonId? selectedId = selectedPolygon; + return Column( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Center( + child: SizedBox( + width: 350.0, + height: 300.0, + child: ExampleGoogleMap( + initialCameraPosition: const CameraPosition( + target: LatLng(52.4478, -3.5402), + zoom: 7.0, + ), + polygons: Set.of(polygons.values), + onMapCreated: _onMapCreated, + ), + ), + ), + Expanded( + child: SingleChildScrollView( + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + Row( + children: [ + Column( + children: [ + TextButton( + onPressed: _add, + child: const Text('add'), + ), + TextButton( + onPressed: (selectedId == null) + ? null + : () => _remove(selectedId), + child: const Text('remove'), + ), + TextButton( + onPressed: (selectedId == null) + ? null + : () => _toggleVisible(selectedId), + child: const Text('toggle visible'), + ), + TextButton( + onPressed: (selectedId == null) + ? null + : () => _toggleGeodesic(selectedId), + child: const Text('toggle geodesic'), + ), + ], + ), + Column( + children: [ + TextButton( + onPressed: (selectedId == null) + ? null + : ((polygons[selectedId]!.holes.isNotEmpty) + ? null + : () => _addHoles(selectedId)), + child: const Text('add holes'), + ), + TextButton( + onPressed: (selectedId == null) + ? null + : ((polygons[selectedId]!.holes.isEmpty) + ? null + : () => _removeHoles(selectedId)), + child: const Text('remove holes'), + ), + TextButton( + onPressed: (selectedId == null) + ? null + : () => _changeWidth(selectedId), + child: const Text('change stroke width'), + ), + TextButton( + onPressed: (selectedId == null) + ? null + : () => _changeStrokeColor(selectedId), + child: const Text('change stroke color'), + ), + TextButton( + onPressed: (selectedId == null) + ? null + : () => _changeFillColor(selectedId), + child: const Text('change fill color'), + ), + ], + ) + ], + ) + ], + ), + ), + ), + ], + ); + } + + List _createPoints() { + final List points = []; + final double offset = _polygonIdCounter.ceilToDouble(); + points.add(_createLatLng(51.2395 + offset, -3.4314)); + points.add(_createLatLng(53.5234 + offset, -3.5314)); + points.add(_createLatLng(52.4351 + offset, -4.5235)); + points.add(_createLatLng(52.1231 + offset, -5.0829)); + return points; + } + + List> _createHoles(PolygonId polygonId) { + final List> holes = >[]; + final double offset = polygonOffsets[polygonId]!; + + final List hole1 = []; + hole1.add(_createLatLng(51.8395 + offset, -3.8814)); + hole1.add(_createLatLng(52.0234 + offset, -3.9914)); + hole1.add(_createLatLng(52.1351 + offset, -4.4435)); + hole1.add(_createLatLng(52.0231 + offset, -4.5829)); + holes.add(hole1); + + final List hole2 = []; + hole2.add(_createLatLng(52.2395 + offset, -3.6814)); + hole2.add(_createLatLng(52.4234 + offset, -3.7914)); + hole2.add(_createLatLng(52.5351 + offset, -4.2435)); + hole2.add(_createLatLng(52.4231 + offset, -4.3829)); + holes.add(hole2); + + return holes; + } + + LatLng _createLatLng(double lat, double lng) { + return LatLng(lat, lng); + } +} diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/place_polyline.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/place_polyline.dart new file mode 100644 index 00000000000..659ef87e87f --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/place_polyline.dart @@ -0,0 +1,325 @@ +// 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. + +// ignore_for_file: public_member_api_docs + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart'; + +import 'example_google_map.dart'; +import 'page.dart'; + +class PlacePolylinePage extends GoogleMapExampleAppPage { + const PlacePolylinePage({Key? key}) + : super(const Icon(Icons.linear_scale), 'Place polyline', key: key); + + @override + Widget build(BuildContext context) { + return const PlacePolylineBody(); + } +} + +class PlacePolylineBody extends StatefulWidget { + const PlacePolylineBody({super.key}); + + @override + State createState() => PlacePolylineBodyState(); +} + +class PlacePolylineBodyState extends State { + PlacePolylineBodyState(); + + ExampleGoogleMapController? controller; + Map polylines = {}; + int _polylineIdCounter = 0; + PolylineId? selectedPolyline; + + // Values when toggling polyline color + int colorsIndex = 0; + List colors = [ + Colors.purple, + Colors.red, + Colors.green, + Colors.pink, + ]; + + // Values when toggling polyline width + int widthsIndex = 0; + List widths = [10, 20, 5]; + + int jointTypesIndex = 0; + List jointTypes = [ + JointType.mitered, + JointType.bevel, + JointType.round + ]; + + // Values when toggling polyline end cap type + int endCapsIndex = 0; + List endCaps = [Cap.buttCap, Cap.squareCap, Cap.roundCap]; + + // Values when toggling polyline start cap type + int startCapsIndex = 0; + List startCaps = [Cap.buttCap, Cap.squareCap, Cap.roundCap]; + + // Values when toggling polyline pattern + int patternsIndex = 0; + List> patterns = >[ + [], + [ + PatternItem.dash(30.0), + PatternItem.gap(20.0), + PatternItem.dot, + PatternItem.gap(20.0) + ], + [PatternItem.dash(30.0), PatternItem.gap(20.0)], + [PatternItem.dot, PatternItem.gap(10.0)], + ]; + + // ignore: use_setters_to_change_properties + void _onMapCreated(ExampleGoogleMapController controller) { + this.controller = controller; + } + + @override + void dispose() { + super.dispose(); + } + + void _onPolylineTapped(PolylineId polylineId) { + setState(() { + selectedPolyline = polylineId; + }); + } + + void _remove(PolylineId polylineId) { + setState(() { + if (polylines.containsKey(polylineId)) { + polylines.remove(polylineId); + } + selectedPolyline = null; + }); + } + + void _add() { + final int polylineCount = polylines.length; + + if (polylineCount == 12) { + return; + } + + final String polylineIdVal = 'polyline_id_$_polylineIdCounter'; + _polylineIdCounter++; + final PolylineId polylineId = PolylineId(polylineIdVal); + + final Polyline polyline = Polyline( + polylineId: polylineId, + consumeTapEvents: true, + color: Colors.orange, + width: 5, + points: _createPoints(), + onTap: () { + _onPolylineTapped(polylineId); + }, + ); + + setState(() { + polylines[polylineId] = polyline; + }); + } + + void _toggleGeodesic(PolylineId polylineId) { + final Polyline polyline = polylines[polylineId]!; + setState(() { + polylines[polylineId] = polyline.copyWith( + geodesicParam: !polyline.geodesic, + ); + }); + } + + void _toggleVisible(PolylineId polylineId) { + final Polyline polyline = polylines[polylineId]!; + setState(() { + polylines[polylineId] = polyline.copyWith( + visibleParam: !polyline.visible, + ); + }); + } + + void _changeColor(PolylineId polylineId) { + final Polyline polyline = polylines[polylineId]!; + setState(() { + polylines[polylineId] = polyline.copyWith( + colorParam: colors[++colorsIndex % colors.length], + ); + }); + } + + void _changeWidth(PolylineId polylineId) { + final Polyline polyline = polylines[polylineId]!; + setState(() { + polylines[polylineId] = polyline.copyWith( + widthParam: widths[++widthsIndex % widths.length], + ); + }); + } + + void _changeJointType(PolylineId polylineId) { + final Polyline polyline = polylines[polylineId]!; + setState(() { + polylines[polylineId] = polyline.copyWith( + jointTypeParam: jointTypes[++jointTypesIndex % jointTypes.length], + ); + }); + } + + void _changeEndCap(PolylineId polylineId) { + final Polyline polyline = polylines[polylineId]!; + setState(() { + polylines[polylineId] = polyline.copyWith( + endCapParam: endCaps[++endCapsIndex % endCaps.length], + ); + }); + } + + void _changeStartCap(PolylineId polylineId) { + final Polyline polyline = polylines[polylineId]!; + setState(() { + polylines[polylineId] = polyline.copyWith( + startCapParam: startCaps[++startCapsIndex % startCaps.length], + ); + }); + } + + void _changePattern(PolylineId polylineId) { + final Polyline polyline = polylines[polylineId]!; + setState(() { + polylines[polylineId] = polyline.copyWith( + patternsParam: patterns[++patternsIndex % patterns.length], + ); + }); + } + + @override + Widget build(BuildContext context) { + final bool isIOS = !kIsWeb && defaultTargetPlatform == TargetPlatform.iOS; + + final PolylineId? selectedId = selectedPolyline; + + return Column( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Center( + child: SizedBox( + width: 350.0, + height: 300.0, + child: ExampleGoogleMap( + initialCameraPosition: const CameraPosition( + target: LatLng(53.1721, -3.5402), + zoom: 7.0, + ), + polylines: Set.of(polylines.values), + onMapCreated: _onMapCreated, + ), + ), + ), + Expanded( + child: SingleChildScrollView( + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + Row( + children: [ + Column( + children: [ + TextButton( + onPressed: _add, + child: const Text('add'), + ), + TextButton( + onPressed: (selectedId == null) + ? null + : () => _remove(selectedId), + child: const Text('remove'), + ), + TextButton( + onPressed: (selectedId == null) + ? null + : () => _toggleVisible(selectedId), + child: const Text('toggle visible'), + ), + TextButton( + onPressed: (selectedId == null) + ? null + : () => _toggleGeodesic(selectedId), + child: const Text('toggle geodesic'), + ), + ], + ), + Column( + children: [ + TextButton( + onPressed: (selectedId == null) + ? null + : () => _changeWidth(selectedId), + child: const Text('change width'), + ), + TextButton( + onPressed: (selectedId == null) + ? null + : () => _changeColor(selectedId), + child: const Text('change color'), + ), + TextButton( + onPressed: isIOS || (selectedId == null) + ? null + : () => _changeStartCap(selectedId), + child: const Text('change start cap [Android only]'), + ), + TextButton( + onPressed: isIOS || (selectedId == null) + ? null + : () => _changeEndCap(selectedId), + child: const Text('change end cap [Android only]'), + ), + TextButton( + onPressed: isIOS || (selectedId == null) + ? null + : () => _changeJointType(selectedId), + child: const Text('change joint type [Android only]'), + ), + TextButton( + onPressed: isIOS || (selectedId == null) + ? null + : () => _changePattern(selectedId), + child: const Text('change pattern [Android only]'), + ), + ], + ) + ], + ) + ], + ), + ), + ), + ], + ); + } + + List _createPoints() { + final List points = []; + final double offset = _polylineIdCounter.ceilToDouble(); + points.add(_createLatLng(51.4816 + offset, -3.1791)); + points.add(_createLatLng(53.0430 + offset, -2.9925)); + points.add(_createLatLng(53.1396 + offset, -4.2739)); + points.add(_createLatLng(52.4153 + offset, -4.0829)); + return points; + } + + LatLng _createLatLng(double lat, double lng) { + return LatLng(lat, lng); + } +} diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/scrolling_map.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/scrolling_map.dart new file mode 100644 index 00000000000..a4901f2ce5f --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/scrolling_map.dart @@ -0,0 +1,114 @@ +// 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. + +// ignore_for_file: public_member_api_docs + +import 'package:flutter/foundation.dart'; +import 'package:flutter/gestures.dart'; +import 'package:flutter/material.dart'; +import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart'; + +import 'example_google_map.dart'; +import 'page.dart'; + +const LatLng _center = LatLng(32.080664, 34.9563837); + +class ScrollingMapPage extends GoogleMapExampleAppPage { + const ScrollingMapPage({Key? key}) + : super(const Icon(Icons.map), 'Scrolling map', key: key); + + @override + Widget build(BuildContext context) { + return const ScrollingMapBody(); + } +} + +class ScrollingMapBody extends StatelessWidget { + const ScrollingMapBody({super.key}); + + @override + Widget build(BuildContext context) { + return ListView( + children: [ + Card( + child: Padding( + padding: const EdgeInsets.symmetric(vertical: 30.0), + child: Column( + children: [ + const Padding( + padding: EdgeInsets.only(bottom: 12.0), + child: Text('This map consumes all touch events.'), + ), + Center( + child: SizedBox( + width: 300.0, + height: 300.0, + child: ExampleGoogleMap( + initialCameraPosition: const CameraPosition( + target: _center, + zoom: 11.0, + ), + gestureRecognizers: // + >{ + Factory( + () => EagerGestureRecognizer(), + ), + }, + ), + ), + ), + ], + ), + ), + ), + Card( + child: Padding( + padding: const EdgeInsets.symmetric(vertical: 30.0), + child: Column( + children: [ + const Text("This map doesn't consume the vertical drags."), + const Padding( + padding: EdgeInsets.only(bottom: 12.0), + child: + Text('It still gets other gestures (e.g scale or tap).'), + ), + Center( + child: SizedBox( + width: 300.0, + height: 300.0, + child: ExampleGoogleMap( + initialCameraPosition: const CameraPosition( + target: _center, + zoom: 11.0, + ), + markers: { + Marker( + markerId: const MarkerId('test_marker_id'), + position: LatLng( + _center.latitude, + _center.longitude, + ), + infoWindow: const InfoWindow( + title: 'An interesting location', + snippet: '*', + ), + ), + }, + gestureRecognizers: >{ + Factory( + () => ScaleGestureRecognizer(), + ), + }, + ), + ), + ), + ], + ), + ), + ), + ], + ); + } +} diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/snapshot.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/snapshot.dart new file mode 100644 index 00000000000..56a90a8e49f --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/snapshot.dart @@ -0,0 +1,76 @@ +// 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. + +// ignore_for_file: public_member_api_docs + +import 'dart:typed_data'; + +import 'package:flutter/material.dart'; +import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart'; + +import 'example_google_map.dart'; +import 'page.dart'; + +const CameraPosition _kInitialPosition = + CameraPosition(target: LatLng(-33.852, 151.211), zoom: 11.0); + +class SnapshotPage extends GoogleMapExampleAppPage { + const SnapshotPage({Key? key}) + : super(const Icon(Icons.camera_alt), 'Take a snapshot of the map', + key: key); + + @override + Widget build(BuildContext context) { + return _SnapshotBody(); + } +} + +class _SnapshotBody extends StatefulWidget { + @override + _SnapshotBodyState createState() => _SnapshotBodyState(); +} + +class _SnapshotBodyState extends State<_SnapshotBody> { + ExampleGoogleMapController? _mapController; + Uint8List? _imageBytes; + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.all(16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + SizedBox( + height: 180, + child: ExampleGoogleMap( + onMapCreated: onMapCreated, + initialCameraPosition: _kInitialPosition, + ), + ), + TextButton( + child: const Text('Take a snapshot'), + onPressed: () async { + final Uint8List? imageBytes = + await _mapController?.takeSnapshot(); + setState(() { + _imageBytes = imageBytes; + }); + }, + ), + Container( + decoration: BoxDecoration(color: Colors.blueGrey[50]), + height: 180, + child: _imageBytes != null ? Image.memory(_imageBytes!) : null, + ), + ], + ), + ); + } + + // ignore: use_setters_to_change_properties + void onMapCreated(ExampleGoogleMapController controller) { + _mapController = controller; + } +} diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/tile_overlay.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/tile_overlay.dart new file mode 100644 index 00000000000..9122fda76ce --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/tile_overlay.dart @@ -0,0 +1,154 @@ +// 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. + +// ignore_for_file: public_member_api_docs + +import 'dart:typed_data'; +import 'dart:ui' as ui; + +import 'package:flutter/material.dart'; +import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart'; + +import 'example_google_map.dart'; +import 'page.dart'; + +class TileOverlayPage extends GoogleMapExampleAppPage { + const TileOverlayPage({Key? key}) + : super(const Icon(Icons.map), 'Tile overlay', key: key); + + @override + Widget build(BuildContext context) { + return const TileOverlayBody(); + } +} + +class TileOverlayBody extends StatefulWidget { + const TileOverlayBody({super.key}); + + @override + State createState() => TileOverlayBodyState(); +} + +class TileOverlayBodyState extends State { + TileOverlayBodyState(); + + ExampleGoogleMapController? controller; + TileOverlay? _tileOverlay; + + // ignore: use_setters_to_change_properties + void _onMapCreated(ExampleGoogleMapController controller) { + this.controller = controller; + } + + @override + void dispose() { + super.dispose(); + } + + void _removeTileOverlay() { + setState(() { + _tileOverlay = null; + }); + } + + void _addTileOverlay() { + final TileOverlay tileOverlay = TileOverlay( + tileOverlayId: const TileOverlayId('tile_overlay_1'), + tileProvider: _DebugTileProvider(), + ); + setState(() { + _tileOverlay = tileOverlay; + }); + } + + void _clearTileCache() { + if (_tileOverlay != null && controller != null) { + controller!.clearTileCache(_tileOverlay!.tileOverlayId); + } + } + + @override + Widget build(BuildContext context) { + final Set overlays = { + if (_tileOverlay != null) _tileOverlay!, + }; + return Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Center( + child: SizedBox( + width: 350.0, + height: 300.0, + child: ExampleGoogleMap( + initialCameraPosition: const CameraPosition( + target: LatLng(59.935460, 30.325177), + zoom: 7.0, + ), + tileOverlays: overlays, + onMapCreated: _onMapCreated, + ), + ), + ), + TextButton( + onPressed: _addTileOverlay, + child: const Text('Add tile overlay'), + ), + TextButton( + onPressed: _removeTileOverlay, + child: const Text('Remove tile overlay'), + ), + TextButton( + onPressed: _clearTileCache, + child: const Text('Clear tile cache'), + ), + ], + ); + } +} + +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/ios13/pubspec.yaml b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/pubspec.yaml new file mode 100644 index 00000000000..2e32b5d64bb --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/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: ">=2.17.0 <4.0.0" + flutter: ">=3.0.0" + +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.2.1 + +dev_dependencies: + flutter_driver: + sdk: flutter + flutter_test: + sdk: flutter + integration_test: + sdk: flutter + +flutter: + uses-material-design: true + assets: + - assets/ From 81aa57c8764538f1c0b8a8f1404b1f8e280d4276 Mon Sep 17 00:00:00 2001 From: Stuart Morgan Date: Tue, 18 Apr 2023 13:54:20 -0400 Subject: [PATCH 06/16] Fix paths --- .../google_maps_flutter_ios/example/ios11/pubspec.yaml | 2 +- .../google_maps_flutter_ios/example/ios12/pubspec.yaml | 2 +- .../google_maps_flutter_ios/example/ios13/pubspec.yaml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/pubspec.yaml b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/pubspec.yaml index 2e32b5d64bb..e8a456358e7 100644 --- a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/pubspec.yaml +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/pubspec.yaml @@ -17,7 +17,7 @@ dependencies: # 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: ../ + path: ../../ google_maps_flutter_platform_interface: ^2.2.1 dev_dependencies: diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/pubspec.yaml b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/pubspec.yaml index 2e32b5d64bb..e8a456358e7 100644 --- a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/pubspec.yaml +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/pubspec.yaml @@ -17,7 +17,7 @@ dependencies: # 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: ../ + path: ../../ google_maps_flutter_platform_interface: ^2.2.1 dev_dependencies: diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/pubspec.yaml b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/pubspec.yaml index 2e32b5d64bb..e8a456358e7 100644 --- a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/pubspec.yaml +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/pubspec.yaml @@ -17,7 +17,7 @@ dependencies: # 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: ../ + path: ../../ google_maps_flutter_platform_interface: ^2.2.1 dev_dependencies: From bbdbb204c0c9de42a1e4d73515dcd81d286982d6 Mon Sep 17 00:00:00 2001 From: Stuart Morgan Date: Tue, 18 Apr 2023 14:05:45 -0400 Subject: [PATCH 07/16] Trim tests, update docs --- .../google_maps_flutter_ios/example/README.md | 19 +- .../ios/Runner.xcodeproj/project.pbxproj | 165 ---------- ...TGoogleMapJSONConversionsConversionTests.m | 290 ------------------ .../ios12/ios/RunnerTests/GoogleMapsTests.m | 59 ---- .../example/ios12/ios/RunnerTests/Info.plist | 22 -- .../ios/RunnerTests/PartiallyMockedMapView.h | 17 - .../ios/RunnerTests/PartiallyMockedMapView.m | 34 -- .../ios/Runner.xcodeproj/project.pbxproj | 4 - ...TGoogleMapJSONConversionsConversionTests.m | 290 ------------------ 9 files changed, 12 insertions(+), 888 deletions(-) delete mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/RunnerTests/FLTGoogleMapJSONConversionsConversionTests.m delete mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/RunnerTests/GoogleMapsTests.m delete mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/RunnerTests/Info.plist delete mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/RunnerTests/PartiallyMockedMapView.h delete mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/RunnerTests/PartiallyMockedMapView.m delete mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/ios/RunnerTests/FLTGoogleMapJSONConversionsConversionTests.m diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/README.md b/packages/google_maps_flutter/google_maps_flutter_ios/example/README.md index a72f740aad8..7a0686a3bc7 100644 --- a/packages/google_maps_flutter/google_maps_flutter_ios/example/README.md +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/README.md @@ -18,13 +18,18 @@ order to ensure that the plugin continues to compile against all SDK versions that could resolve, there are multiple largely identical examples, each with a different minimum target iOS version. -In order to avoid wasting CI resources, the majority of the testing -is done with the lowest supported version. The assumption (based on -experience so far) is that the changes in the SDK are unlikely to -break functionality at runtime, and that it's primarily a -compile-time issue. However, we can add testing to newer versions -(e.g., to test functionality that only exists in newer versions -of the SDK) as needed. +In order to avoid wasting CI resources, tests are mostly not duplicated. +The test structure is: +* The oldest version has all of the usual tests (Dart integration, + XCTest, XCUITest). +* The newest version has only XCTests (the cheapest tests), which + can be used to unit tests any code paths that are specific to + new SDKs (e.g., behind target OS `#if` checks). + +This setup is based on the assumption (based on experience so far) that +the changes in the SDK are unlikely to break functionality at runtime, +but that we will want to have unit test coverage of new-SDK-only code. +New test types can be added to any example if needs change. ## Updating Examples diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/Runner.xcodeproj/project.pbxproj b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/Runner.xcodeproj/project.pbxproj index 72b5ce216de..691ea1a9202 100644 --- a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/Runner.xcodeproj/project.pbxproj +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/Runner.xcodeproj/project.pbxproj @@ -10,28 +10,13 @@ 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 */; }; - 6851F3562835BC180032B7C8 /* FLTGoogleMapJSONConversionsConversionTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 6851F3552835BC180032B7C8 /* FLTGoogleMapJSONConversionsConversionTests.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 */; }; - F7151F13265D7ED70028CB91 /* GoogleMapsTests.m in Sources */ = {isa = PBXBuildFile; fileRef = F7151F12265D7ED70028CB91 /* GoogleMapsTests.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; - }; -/* End PBXContainerItemProxy section */ - /* Begin PBXCopyFilesBuildPhase section */ 9705A1C41CF9048500538489 /* Embed Frameworks */ = { isa = PBXCopyFilesBuildPhase; @@ -49,7 +34,6 @@ 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 = ""; }; - 6851F3552835BC180032B7C8 /* FLTGoogleMapJSONConversionsConversionTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLTGoogleMapJSONConversionsConversionTests.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; }; @@ -64,15 +48,10 @@ 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; }; - 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 = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -84,15 +63,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - F7151F0D265D7ED70028CB91 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 68E4726A2836FF0C00BDDDAC /* MapKit.framework in Frameworks */, - FC8F35FC8CD533B128950487 /* libPods-RunnerTests.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ @@ -122,7 +92,6 @@ children = ( 9740EEB11CF90186004384FC /* Flutter */, 97C146F01CF9000F007C117D /* Runner */, - F7151F11265D7ED70028CB91 /* RunnerTests */, 97C146EF1CF9000F007C117D /* Products */, A189CFE5474BF8A07908B2E0 /* Pods */, 1E7CF0857EFC88FC263CF3B2 /* Frameworks */, @@ -133,7 +102,6 @@ isa = PBXGroup; children = ( 97C146EE1CF9000F007C117D /* Runner.app */, - F7151F10265D7ED70028CB91 /* RunnerTests.xctest */, ); name = Products; sourceTree = ""; @@ -173,18 +141,6 @@ name = Pods; sourceTree = ""; }; - F7151F11265D7ED70028CB91 /* RunnerTests */ = { - isa = PBXGroup; - children = ( - 6851F3552835BC180032B7C8 /* FLTGoogleMapJSONConversionsConversionTests.m */, - F7151F12265D7ED70028CB91 /* GoogleMapsTests.m */, - 982F2A6A27BADE17003C81F4 /* PartiallyMockedMapView.h */, - 982F2A6B27BADE17003C81F4 /* PartiallyMockedMapView.m */, - F7151F14265D7ED70028CB91 /* Info.plist */, - ); - path = RunnerTests; - sourceTree = ""; - }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -210,25 +166,6 @@ 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"; - }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ @@ -241,11 +178,6 @@ 97C146ED1CF9000F007C117D = { CreatedOnToolsVersion = 7.3.1; }; - F7151F0F265D7ED70028CB91 = { - CreatedOnToolsVersion = 12.5; - ProvisioningStyle = Automatic; - TestTargetID = 97C146ED1CF9000F007C117D; - }; }; }; buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; @@ -262,7 +194,6 @@ projectRoot = ""; targets = ( 97C146ED1CF9000F007C117D /* Runner */, - F7151F0F265D7ED70028CB91 /* RunnerTests */, ); }; /* End PBXProject section */ @@ -279,13 +210,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - F7151F0E265D7ED70028CB91 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ @@ -356,28 +280,6 @@ 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 */ @@ -391,26 +293,8 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - F7151F0C265D7ED70028CB91 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - F7151F13265D7ED70028CB91 /* GoogleMapsTests.m in Sources */, - 6851F3562835BC180032B7C8 /* FLTGoogleMapJSONConversionsConversionTests.m in Sources */, - 982F2A6C27BADE17003C81F4 /* PartiallyMockedMapView.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXSourcesBuildPhase section */ -/* Begin PBXTargetDependency section */ - F7151F16265D7ED70028CB91 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 97C146ED1CF9000F007C117D /* Runner */; - targetProxy = F7151F15265D7ED70028CB91 /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - /* Begin PBXVariantGroup section */ 97C146FA1CF9000F007C117D /* Main.storyboard */ = { isa = PBXVariantGroup; @@ -589,46 +473,6 @@ }; 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 arm64"; - 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 arm64"; - 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; - }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ @@ -650,15 +494,6 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - F7151F19265D7ED70028CB91 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - F7151F17265D7ED70028CB91 /* Debug */, - F7151F18265D7ED70028CB91 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; /* End XCConfigurationList section */ }; rootObject = 97C146E61CF9000F007C117D /* Project object */; diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/RunnerTests/FLTGoogleMapJSONConversionsConversionTests.m b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/RunnerTests/FLTGoogleMapJSONConversionsConversionTests.m deleted file mode 100644 index bb9020d983c..00000000000 --- a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/RunnerTests/FLTGoogleMapJSONConversionsConversionTests.m +++ /dev/null @@ -1,290 +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]; - - GMSMapView *mapView = [[GMSMapView alloc] - initWithFrame:CGRectZero - camera:[GMSCameraPosition cameraWithTarget:CLLocationCoordinate2DMake(5, 6) zoom:1]]; - [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]; -} - -@end diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/RunnerTests/GoogleMapsTests.m b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/RunnerTests/GoogleMapsTests.m deleted file mode 100644 index 71f1162890b..00000000000 --- a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/RunnerTests/GoogleMapsTests.m +++ /dev/null @@ -1,59 +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 "PartiallyMockedMapView.h" - -@interface FLTGoogleMapFactory (Test) -@property(strong, nonatomic, readonly) id sharedMapServices; -@end - -@interface GoogleMapsTests : XCTestCase -@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); - PartiallyMockedMapView *mapView = [[PartiallyMockedMapView alloc] - initWithFrame:frame - camera:[[GMSCameraPosition alloc] initWithLatitude:0 longitude:0 zoom:0]]; - 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); -} - -@end diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/RunnerTests/Info.plist b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/RunnerTests/Info.plist deleted file mode 100644 index 64d65ca4957..00000000000 --- a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/RunnerTests/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/ios12/ios/RunnerTests/PartiallyMockedMapView.h b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/RunnerTests/PartiallyMockedMapView.h deleted file mode 100644 index 4288401cf90..00000000000 --- a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/RunnerTests/PartiallyMockedMapView.h +++ /dev/null @@ -1,17 +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 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/ios12/ios/RunnerTests/PartiallyMockedMapView.m b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/RunnerTests/PartiallyMockedMapView.m deleted file mode 100644 index 202a18d128c..00000000000 --- a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/RunnerTests/PartiallyMockedMapView.m +++ /dev/null @@ -1,34 +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 "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/ios13/ios/Runner.xcodeproj/project.pbxproj b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/ios/Runner.xcodeproj/project.pbxproj index cbc58c6612f..561cbbdf34b 100644 --- a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/ios/Runner.xcodeproj/project.pbxproj +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/ios/Runner.xcodeproj/project.pbxproj @@ -10,7 +10,6 @@ 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 */; }; - 6851F3562835BC180032B7C8 /* FLTGoogleMapJSONConversionsConversionTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 6851F3552835BC180032B7C8 /* FLTGoogleMapJSONConversionsConversionTests.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 */; }; @@ -49,7 +48,6 @@ 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 = ""; }; - 6851F3552835BC180032B7C8 /* FLTGoogleMapJSONConversionsConversionTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLTGoogleMapJSONConversionsConversionTests.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; }; @@ -176,7 +174,6 @@ F7151F11265D7ED70028CB91 /* RunnerTests */ = { isa = PBXGroup; children = ( - 6851F3552835BC180032B7C8 /* FLTGoogleMapJSONConversionsConversionTests.m */, F7151F12265D7ED70028CB91 /* GoogleMapsTests.m */, 982F2A6A27BADE17003C81F4 /* PartiallyMockedMapView.h */, 982F2A6B27BADE17003C81F4 /* PartiallyMockedMapView.m */, @@ -396,7 +393,6 @@ buildActionMask = 2147483647; files = ( F7151F13265D7ED70028CB91 /* GoogleMapsTests.m in Sources */, - 6851F3562835BC180032B7C8 /* FLTGoogleMapJSONConversionsConversionTests.m in Sources */, 982F2A6C27BADE17003C81F4 /* PartiallyMockedMapView.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/ios/RunnerTests/FLTGoogleMapJSONConversionsConversionTests.m b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/ios/RunnerTests/FLTGoogleMapJSONConversionsConversionTests.m deleted file mode 100644 index bb9020d983c..00000000000 --- a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/ios/RunnerTests/FLTGoogleMapJSONConversionsConversionTests.m +++ /dev/null @@ -1,290 +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]; - - GMSMapView *mapView = [[GMSMapView alloc] - initWithFrame:CGRectZero - camera:[GMSCameraPosition cameraWithTarget:CLLocationCoordinate2DMake(5, 6) zoom:1]]; - [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]; -} - -@end From 752be0c0c09655fe1010cf20559bc136e3354590 Mon Sep 17 00:00:00 2001 From: Stuart Morgan Date: Tue, 18 Apr 2023 14:10:54 -0400 Subject: [PATCH 08/16] Re-run ios13 build with right version --- .../example/ios13/ios/Runner.xcodeproj/project.pbxproj | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/ios/Runner.xcodeproj/project.pbxproj b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/ios/Runner.xcodeproj/project.pbxproj index 561cbbdf34b..afca0c57171 100644 --- a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/ios/Runner.xcodeproj/project.pbxproj +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/ios/Runner.xcodeproj/project.pbxproj @@ -342,7 +342,8 @@ ); inputPaths = ( "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh", - "${PODS_ROOT}/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle", + "${PODS_ROOT}/GoogleMaps/Maps/Frameworks/GoogleMaps.xcframework/ios-arm64/GoogleMaps.framework/Resources/GoogleMaps.bundle", + "${PODS_ROOT}/GoogleMaps/Maps/Frameworks/GoogleMaps.xcframework/ios-arm64_x86_64-simulator/GoogleMaps.framework/Resources/GoogleMaps.bundle", ); name = "[CP] Copy Pods Resources"; outputPaths = ( From 18dde5176f125a733478530d86bcff57ac722ef6 Mon Sep 17 00:00:00 2001 From: Stuart Morgan Date: Tue, 18 Apr 2023 14:21:04 -0400 Subject: [PATCH 09/16] Add a partial version pin --- .../google_maps_flutter_ios/example/README.md | 2 +- .../ios/google_maps_flutter_ios.podspec | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/README.md b/packages/google_maps_flutter/google_maps_flutter_ios/example/README.md index 7a0686a3bc7..f2309fa5704 100644 --- a/packages/google_maps_flutter/google_maps_flutter_ios/example/README.md +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/README.md @@ -12,7 +12,7 @@ are very unlikely to be relevant. This package contains multiple exmaples, which are used to test different versions of the Google Maps iOS SDK. Because the plugin's dependency -is unpinned, CocoaPods will pick the newest version that supports the +is loosely pinned, CocoaPods will pick the newest version that supports the minimum targetted OS version of the application using the plugin. In order to ensure that the plugin continues to compile against all SDK versions that could resolve, there are multiple largely identical 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 8c7ba4cca8b..e8d7485ce19 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 @@ -18,7 +18,10 @@ Downloaded by pub (not CocoaPods). s.public_header_files = 'Classes/**/*.h' s.module_map = 'Classes/google_maps_flutter_ios.modulemap' s.dependency 'Flutter' - s.dependency 'GoogleMaps' + # Allow any version up to the next breaking change after the latest version that + # has been confirmed to be compatible via an example in examples/. See discussion + # in https://github.com/flutter/flutter/issues/86820 for why this is so broad. + s.dependency 'GoogleMaps', '< 8.0' s.static_framework = true s.platform = :ios, '11.0' # GoogleMaps does not support arm64 simulators. From 5ee49d00b9f0f692c8a9d469eebbac0cac24cd99 Mon Sep 17 00:00:00 2001 From: Stuart Morgan Date: Tue, 18 Apr 2023 14:43:33 -0400 Subject: [PATCH 10/16] More docs --- .../google_maps_flutter_ios/example/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/README.md b/packages/google_maps_flutter/google_maps_flutter_ios/example/README.md index f2309fa5704..c87370f255a 100644 --- a/packages/google_maps_flutter/google_maps_flutter_ios/example/README.md +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/README.md @@ -36,7 +36,8 @@ New test types can be added to any example if needs change. * When a new major of the SDK comes out that raises the minimum iOS deployment version, a new example with that minimum target should be added to ensure that the plugin compiles with that - version of the SDK. + version of the SDK, and the range in the plugin's `podspec` file + should be bumped to the next major version. * When the minimum supported version of Flutter (on `stable`) reaches the point where the oldest example is for an SDK that can no longer be resolved to, that example should be From 896d7cb5895f354ad591fe0cda4f87b6b0bd209e Mon Sep 17 00:00:00 2001 From: Stuart Morgan Date: Tue, 18 Apr 2023 14:44:50 -0400 Subject: [PATCH 11/16] Version bump --- .../google_maps_flutter/google_maps_flutter_ios/CHANGELOG.md | 5 +++++ .../google_maps_flutter/google_maps_flutter_ios/pubspec.yaml | 2 +- 2 files changed, 6 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 3587655fffc..1eaed5f0700 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,8 @@ +## 2.2.2 + +* Sets an upper bound on the `GoogleMaps` SDK version that will be used to + avoid future breakage. + ## 2.2.1 * Clarifies explanation of endorsement in README. 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 f8fe07c9dd2..f24935c9105 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.2.1 +version: 2.2.2 environment: sdk: ">=2.18.0 <4.0.0" From 7f432c8785d297bde2cf2fafb6eca0866c399f16 Mon Sep 17 00:00:00 2001 From: Stuart Morgan Date: Tue, 18 Apr 2023 14:53:54 -0400 Subject: [PATCH 12/16] Relax readme check slightly --- .../google_maps_flutter_ios/example/README.md | 2 +- script/tool/lib/src/readme_check_command.dart | 9 ++++++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/README.md b/packages/google_maps_flutter/google_maps_flutter_ios/example/README.md index c87370f255a..71e2bfbebe6 100644 --- a/packages/google_maps_flutter/google_maps_flutter_ios/example/README.md +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/README.md @@ -1,6 +1,6 @@ # Platform Implementation Test Apps -These are test app for manual testing and automated integration testing +These are test apps for manual testing and automated integration testing of this platform implementation. They are not intended to demonstrate actual use of this package, since the intent is that plugin clients use the app-facing package. diff --git a/script/tool/lib/src/readme_check_command.dart b/script/tool/lib/src/readme_check_command.dart index cbbb8b835a1..3c119f04289 100644 --- a/script/tool/lib/src/readme_check_command.dart +++ b/script/tool/lib/src/readme_check_command.dart @@ -337,8 +337,11 @@ ${indentation * 2}Please use standard capitalizations: ${sortedListString(expect /// Returns true if the README contains the repository-standard explanation of /// the purpose of a federated plugin implementation's example. bool _containsImplementationExampleExplanation(List readmeLines) { - return readmeLines.contains('# Platform Implementation Test App') && - readmeLines - .any((String line) => line.contains('This is a test app for')); + return (readmeLines.contains('# Platform Implementation Test App') && + readmeLines.any( + (String line) => line.contains('This is a test app for'))) || + (readmeLines.contains('# Platform Implementation Test Apps') && + readmeLines.any( + (String line) => line.contains('These are test apps for'))); } } From 006b8cf910f7775ca2cabc18702232ccb88e4415 Mon Sep 17 00:00:00 2001 From: Stuart Morgan Date: Tue, 18 Apr 2023 16:23:00 -0400 Subject: [PATCH 13/16] Remove cruft from iOS 12 version's Podfile --- .../google_maps_flutter_ios/example/ios12/ios/Podfile | 5 ----- 1 file changed, 5 deletions(-) diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/Podfile b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/Podfile index cccf50aa93d..1d8800db5ce 100644 --- a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/Podfile +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/ios/Podfile @@ -29,11 +29,6 @@ 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| From ac8ee273c1447047ecf9a10a7dbdab658edc6412 Mon Sep 17 00:00:00 2001 From: Stuart Morgan Date: Wed, 19 Apr 2023 13:50:04 -0400 Subject: [PATCH 14/16] Wording improvement --- .../google_maps_flutter/google_maps_flutter_ios/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 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 1eaed5f0700..47ef1848046 100644 --- a/packages/google_maps_flutter/google_maps_flutter_ios/CHANGELOG.md +++ b/packages/google_maps_flutter/google_maps_flutter_ios/CHANGELOG.md @@ -1,6 +1,6 @@ ## 2.2.2 -* Sets an upper bound on the `GoogleMaps` SDK version that will be used to +* Sets an upper bound on the `GoogleMaps` SDK version that can be used, to avoid future breakage. ## 2.2.1 From 59a8caa8f70abe019bba4fc8029c0e2c1a9d63f8 Mon Sep 17 00:00:00 2001 From: Stuart Morgan Date: Wed, 19 Apr 2023 16:23:09 -0400 Subject: [PATCH 15/16] Share Dart code --- .../integration_test/google_maps_test.dart | 2 +- .../example/ios11/lib/main.dart | 100 ++-- .../example/ios11/pubspec.yaml | 2 + .../example/ios12/lib/animate_camera.dart | 171 ------ .../example/ios12/lib/example_google_map.dart | 538 ------------------ .../example/ios12/lib/lite_mode.dart | 47 -- .../example/ios12/lib/main.dart | 100 ++-- .../example/ios12/lib/map_click.dart | 105 ---- .../example/ios12/lib/map_coordinates.dart | 104 ---- .../example/ios12/lib/map_ui.dart | 357 ------------ .../example/ios12/lib/marker_icons.dart | 98 ---- .../example/ios12/lib/move_camera.dart | 171 ------ .../example/ios12/lib/padding.dart | 180 ------ .../example/ios12/lib/page.dart | 14 - .../example/ios12/lib/place_circle.dart | 232 -------- .../example/ios12/lib/place_marker.dart | 421 -------------- .../example/ios12/lib/place_polygon.dart | 306 ---------- .../example/ios12/lib/place_polyline.dart | 325 ----------- .../example/ios12/lib/scrolling_map.dart | 114 ---- .../example/ios12/lib/snapshot.dart | 76 --- .../example/ios12/lib/tile_overlay.dart | 154 ----- .../example/ios12/pubspec.yaml | 2 + .../example/ios13/lib/animate_camera.dart | 171 ------ .../example/ios13/lib/example_google_map.dart | 538 ------------------ .../example/ios13/lib/lite_mode.dart | 47 -- .../example/ios13/lib/main.dart | 100 ++-- .../example/ios13/lib/map_click.dart | 105 ---- .../example/ios13/lib/map_coordinates.dart | 104 ---- .../example/ios13/lib/map_ui.dart | 357 ------------ .../example/ios13/lib/marker_icons.dart | 98 ---- .../example/ios13/lib/move_camera.dart | 171 ------ .../example/ios13/lib/padding.dart | 180 ------ .../example/ios13/lib/page.dart | 14 - .../example/ios13/lib/place_circle.dart | 232 -------- .../example/ios13/lib/place_marker.dart | 421 -------------- .../example/ios13/lib/place_polygon.dart | 306 ---------- .../example/ios13/lib/place_polyline.dart | 325 ----------- .../example/ios13/lib/scrolling_map.dart | 114 ---- .../example/ios13/lib/snapshot.dart | 76 --- .../example/ios13/lib/tile_overlay.dart | 154 ----- .../example/ios13/pubspec.yaml | 2 + .../example/shared/README.md | 1 + .../lib/animate_camera.dart | 0 .../lib/example_google_map.dart | 0 .../maps_example_dart}/lib/lite_mode.dart | 0 .../maps_example_dart}/lib/map_click.dart | 0 .../lib/map_coordinates.dart | 0 .../maps_example_dart}/lib/map_ui.dart | 0 .../maps_example_dart/lib/maps_demo.dart | 39 ++ .../maps_example_dart}/lib/marker_icons.dart | 0 .../maps_example_dart}/lib/move_camera.dart | 0 .../maps_example_dart}/lib/padding.dart | 0 .../maps_example_dart}/lib/page.dart | 0 .../maps_example_dart}/lib/place_circle.dart | 0 .../maps_example_dart}/lib/place_marker.dart | 0 .../maps_example_dart}/lib/place_polygon.dart | 0 .../lib/place_polyline.dart | 0 .../maps_example_dart}/lib/scrolling_map.dart | 0 .../maps_example_dart}/lib/snapshot.dart | 0 .../maps_example_dart}/lib/tile_overlay.dart | 0 .../shared/maps_example_dart/pubspec.yaml | 24 + 61 files changed, 176 insertions(+), 7022 deletions(-) delete mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/animate_camera.dart delete mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/example_google_map.dart delete mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/lite_mode.dart delete mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/map_click.dart delete mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/map_coordinates.dart delete mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/map_ui.dart delete mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/marker_icons.dart delete mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/move_camera.dart delete mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/padding.dart delete mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/page.dart delete mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/place_circle.dart delete mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/place_marker.dart delete mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/place_polygon.dart delete mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/place_polyline.dart delete mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/scrolling_map.dart delete mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/snapshot.dart delete mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/tile_overlay.dart delete mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/animate_camera.dart delete mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/example_google_map.dart delete mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/lite_mode.dart delete mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/map_click.dart delete mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/map_coordinates.dart delete mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/map_ui.dart delete mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/marker_icons.dart delete mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/move_camera.dart delete mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/padding.dart delete mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/page.dart delete mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/place_circle.dart delete mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/place_marker.dart delete mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/place_polygon.dart delete mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/place_polyline.dart delete mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/scrolling_map.dart delete mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/snapshot.dart delete mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/tile_overlay.dart create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/shared/README.md rename packages/google_maps_flutter/google_maps_flutter_ios/example/{ios11 => shared/maps_example_dart}/lib/animate_camera.dart (100%) rename packages/google_maps_flutter/google_maps_flutter_ios/example/{ios11 => shared/maps_example_dart}/lib/example_google_map.dart (100%) rename packages/google_maps_flutter/google_maps_flutter_ios/example/{ios11 => shared/maps_example_dart}/lib/lite_mode.dart (100%) rename packages/google_maps_flutter/google_maps_flutter_ios/example/{ios11 => shared/maps_example_dart}/lib/map_click.dart (100%) rename packages/google_maps_flutter/google_maps_flutter_ios/example/{ios11 => shared/maps_example_dart}/lib/map_coordinates.dart (100%) rename packages/google_maps_flutter/google_maps_flutter_ios/example/{ios11 => shared/maps_example_dart}/lib/map_ui.dart (100%) create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/shared/maps_example_dart/lib/maps_demo.dart rename packages/google_maps_flutter/google_maps_flutter_ios/example/{ios11 => shared/maps_example_dart}/lib/marker_icons.dart (100%) rename packages/google_maps_flutter/google_maps_flutter_ios/example/{ios11 => shared/maps_example_dart}/lib/move_camera.dart (100%) rename packages/google_maps_flutter/google_maps_flutter_ios/example/{ios11 => shared/maps_example_dart}/lib/padding.dart (100%) rename packages/google_maps_flutter/google_maps_flutter_ios/example/{ios11 => shared/maps_example_dart}/lib/page.dart (100%) rename packages/google_maps_flutter/google_maps_flutter_ios/example/{ios11 => shared/maps_example_dart}/lib/place_circle.dart (100%) rename packages/google_maps_flutter/google_maps_flutter_ios/example/{ios11 => shared/maps_example_dart}/lib/place_marker.dart (100%) rename packages/google_maps_flutter/google_maps_flutter_ios/example/{ios11 => shared/maps_example_dart}/lib/place_polygon.dart (100%) rename packages/google_maps_flutter/google_maps_flutter_ios/example/{ios11 => shared/maps_example_dart}/lib/place_polyline.dart (100%) rename packages/google_maps_flutter/google_maps_flutter_ios/example/{ios11 => shared/maps_example_dart}/lib/scrolling_map.dart (100%) rename packages/google_maps_flutter/google_maps_flutter_ios/example/{ios11 => shared/maps_example_dart}/lib/snapshot.dart (100%) rename packages/google_maps_flutter/google_maps_flutter_ios/example/{ios11 => shared/maps_example_dart}/lib/tile_overlay.dart (100%) create mode 100644 packages/google_maps_flutter/google_maps_flutter_ios/example/shared/maps_example_dart/pubspec.yaml diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/integration_test/google_maps_test.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/integration_test/google_maps_test.dart index eb00ccb673f..bb6b97e25c5 100644 --- a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/integration_test/google_maps_test.dart +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/integration_test/google_maps_test.dart @@ -8,9 +8,9 @@ import 'dart:ui' as ui; import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; -import 'package:google_maps_flutter_example/example_google_map.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'; const LatLng _kInitialMapCenter = LatLng(0, 0); const double _kInitialZoomLevel = 5; diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/lib/main.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/lib/main.dart index 3b1e6361b96..0e4efc0f788 100644 --- a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/lib/main.dart +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/lib/main.dart @@ -3,71 +3,41 @@ // found in the LICENSE file. import 'package:flutter/material.dart'; - -import 'animate_camera.dart'; -import 'lite_mode.dart'; -import 'map_click.dart'; -import 'map_coordinates.dart'; -import 'map_ui.dart'; -import 'marker_icons.dart'; -import 'move_camera.dart'; -import 'padding.dart'; -import 'page.dart'; -import 'place_circle.dart'; -import 'place_marker.dart'; -import 'place_polygon.dart'; -import 'place_polyline.dart'; -import 'scrolling_map.dart'; -import 'snapshot.dart'; -import 'tile_overlay.dart'; - -final List _allPages = [ - const MapUiPage(), - const MapCoordinatesPage(), - const MapClickPage(), - const AnimateCameraPage(), - const MoveCameraPage(), - const PlaceMarkerPage(), - const MarkerIconsPage(), - const ScrollingMapPage(), - const PlacePolylinePage(), - const PlacePolygonPage(), - const PlaceCirclePage(), - const PaddingPage(), - const SnapshotPage(), - const LiteModePage(), - const TileOverlayPage(), -]; - -/// MapsDemo is the Main Application. -class MapsDemo extends StatelessWidget { - /// Default Constructor - const MapsDemo({super.key}); - - void _pushPage(BuildContext context, GoogleMapExampleAppPage page) { - Navigator.of(context).push(MaterialPageRoute( - builder: (_) => Scaffold( - appBar: AppBar(title: Text(page.title)), - body: page, - ))); - } - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar(title: const Text('GoogleMaps examples')), - body: ListView.builder( - itemCount: _allPages.length, - itemBuilder: (_, int index) => ListTile( - leading: _allPages[index].leading, - title: Text(_allPages[index].title), - onTap: () => _pushPage(context, _allPages[index]), - ), - ), - ); - } -} +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_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())); + runApp(const MaterialApp( + home: MapsDemo([ + MapUiPage(), + MapCoordinatesPage(), + MapClickPage(), + AnimateCameraPage(), + MoveCameraPage(), + PlaceMarkerPage(), + MarkerIconsPage(), + ScrollingMapPage(), + PlacePolylinePage(), + PlacePolygonPage(), + PlaceCirclePage(), + PaddingPage(), + SnapshotPage(), + LiteModePage(), + TileOverlayPage(), + ]))); } diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/pubspec.yaml b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/pubspec.yaml index e8a456358e7..f34109a26fd 100644 --- a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/pubspec.yaml +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/pubspec.yaml @@ -19,6 +19,8 @@ dependencies: # the parent directory to use the current plugin's version. path: ../../ google_maps_flutter_platform_interface: ^2.2.1 + maps_example_dart: + path: ../shared/maps_example_dart/ dev_dependencies: flutter_driver: diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/animate_camera.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/animate_camera.dart deleted file mode 100644 index c77f9ededac..00000000000 --- a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/animate_camera.dart +++ /dev/null @@ -1,171 +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. - -// ignore_for_file: public_member_api_docs - -import 'package:flutter/material.dart'; -import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart'; - -import 'example_google_map.dart'; -import 'page.dart'; - -class AnimateCameraPage extends GoogleMapExampleAppPage { - const AnimateCameraPage({Key? key}) - : super(const Icon(Icons.map), 'Camera control, animated', key: key); - - @override - Widget build(BuildContext context) { - return const AnimateCamera(); - } -} - -class AnimateCamera extends StatefulWidget { - const AnimateCamera({super.key}); - @override - State createState() => AnimateCameraState(); -} - -class AnimateCameraState extends State { - ExampleGoogleMapController? mapController; - - // ignore: use_setters_to_change_properties - void _onMapCreated(ExampleGoogleMapController controller) { - mapController = controller; - } - - @override - Widget build(BuildContext context) { - return Column( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - Center( - child: SizedBox( - width: 300.0, - height: 200.0, - child: ExampleGoogleMap( - onMapCreated: _onMapCreated, - initialCameraPosition: - const CameraPosition(target: LatLng(0.0, 0.0)), - ), - ), - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - Column( - children: [ - TextButton( - onPressed: () { - mapController?.animateCamera( - CameraUpdate.newCameraPosition( - const CameraPosition( - bearing: 270.0, - target: LatLng(51.5160895, -0.1294527), - tilt: 30.0, - zoom: 17.0, - ), - ), - ); - }, - child: const Text('newCameraPosition'), - ), - TextButton( - onPressed: () { - mapController?.animateCamera( - CameraUpdate.newLatLng( - const LatLng(56.1725505, 10.1850512), - ), - ); - }, - child: const Text('newLatLng'), - ), - TextButton( - onPressed: () { - mapController?.animateCamera( - CameraUpdate.newLatLngBounds( - LatLngBounds( - southwest: const LatLng(-38.483935, 113.248673), - northeast: const LatLng(-8.982446, 153.823821), - ), - 10.0, - ), - ); - }, - child: const Text('newLatLngBounds'), - ), - TextButton( - onPressed: () { - mapController?.animateCamera( - CameraUpdate.newLatLngZoom( - const LatLng(37.4231613, -122.087159), - 11.0, - ), - ); - }, - child: const Text('newLatLngZoom'), - ), - TextButton( - onPressed: () { - mapController?.animateCamera( - CameraUpdate.scrollBy(150.0, -225.0), - ); - }, - child: const Text('scrollBy'), - ), - ], - ), - Column( - children: [ - TextButton( - onPressed: () { - mapController?.animateCamera( - CameraUpdate.zoomBy( - -0.5, - const Offset(30.0, 20.0), - ), - ); - }, - child: const Text('zoomBy with focus'), - ), - TextButton( - onPressed: () { - mapController?.animateCamera( - CameraUpdate.zoomBy(-0.5), - ); - }, - child: const Text('zoomBy'), - ), - TextButton( - onPressed: () { - mapController?.animateCamera( - CameraUpdate.zoomIn(), - ); - }, - child: const Text('zoomIn'), - ), - TextButton( - onPressed: () { - mapController?.animateCamera( - CameraUpdate.zoomOut(), - ); - }, - child: const Text('zoomOut'), - ), - TextButton( - onPressed: () { - mapController?.animateCamera( - CameraUpdate.zoomTo(16.0), - ); - }, - child: const Text('zoomTo'), - ), - ], - ), - ], - ) - ], - ); - } -} diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/example_google_map.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/example_google_map.dart deleted file mode 100644 index e0817a55f28..00000000000 --- a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/example_google_map.dart +++ /dev/null @@ -1,538 +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'; -// TODO(a14n): remove this import once Flutter 3.1 or later reaches stable (including flutter/flutter#104231) -// ignore: unnecessary_import -import 'dart:typed_data'; - -import 'package:flutter/foundation.dart'; -import 'package:flutter/gestures.dart'; -import 'package:flutter/material.dart'; -import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart'; - -// This is a pared down version of the Dart code from the app-facing package, -// to allow running the same examples for package-local testing. -// TODO(stuartmorgan): Consider extracting this to a shared package. See also -// https://github.com/flutter/flutter/issues/46716. - -/// Controller for a single ExampleGoogleMap instance running on the host platform. -class ExampleGoogleMapController { - ExampleGoogleMapController._( - this._googleMapState, { - required this.mapId, - }) { - _connectStreams(mapId); - } - - /// The mapId for this controller - final int mapId; - - /// Initialize control of a [ExampleGoogleMap] with [id]. - /// - /// Mainly for internal use when instantiating a [ExampleGoogleMapController] passed - /// in [ExampleGoogleMap.onMapCreated] callback. - static Future _init( - int id, - CameraPosition initialCameraPosition, - _ExampleGoogleMapState googleMapState, - ) async { - await GoogleMapsFlutterPlatform.instance.init(id); - return ExampleGoogleMapController._( - googleMapState, - mapId: id, - ); - } - - final _ExampleGoogleMapState _googleMapState; - - void _connectStreams(int mapId) { - if (_googleMapState.widget.onCameraMoveStarted != null) { - GoogleMapsFlutterPlatform.instance - .onCameraMoveStarted(mapId: mapId) - .listen((_) => _googleMapState.widget.onCameraMoveStarted!()); - } - if (_googleMapState.widget.onCameraMove != null) { - GoogleMapsFlutterPlatform.instance.onCameraMove(mapId: mapId).listen( - (CameraMoveEvent e) => _googleMapState.widget.onCameraMove!(e.value)); - } - if (_googleMapState.widget.onCameraIdle != null) { - GoogleMapsFlutterPlatform.instance - .onCameraIdle(mapId: mapId) - .listen((_) => _googleMapState.widget.onCameraIdle!()); - } - GoogleMapsFlutterPlatform.instance - .onMarkerTap(mapId: mapId) - .listen((MarkerTapEvent e) => _googleMapState.onMarkerTap(e.value)); - GoogleMapsFlutterPlatform.instance.onMarkerDragStart(mapId: mapId).listen( - (MarkerDragStartEvent e) => - _googleMapState.onMarkerDragStart(e.value, e.position)); - GoogleMapsFlutterPlatform.instance.onMarkerDrag(mapId: mapId).listen( - (MarkerDragEvent e) => - _googleMapState.onMarkerDrag(e.value, e.position)); - GoogleMapsFlutterPlatform.instance.onMarkerDragEnd(mapId: mapId).listen( - (MarkerDragEndEvent e) => - _googleMapState.onMarkerDragEnd(e.value, e.position)); - GoogleMapsFlutterPlatform.instance.onInfoWindowTap(mapId: mapId).listen( - (InfoWindowTapEvent e) => _googleMapState.onInfoWindowTap(e.value)); - GoogleMapsFlutterPlatform.instance - .onPolylineTap(mapId: mapId) - .listen((PolylineTapEvent e) => _googleMapState.onPolylineTap(e.value)); - GoogleMapsFlutterPlatform.instance - .onPolygonTap(mapId: mapId) - .listen((PolygonTapEvent e) => _googleMapState.onPolygonTap(e.value)); - GoogleMapsFlutterPlatform.instance - .onCircleTap(mapId: mapId) - .listen((CircleTapEvent e) => _googleMapState.onCircleTap(e.value)); - GoogleMapsFlutterPlatform.instance - .onTap(mapId: mapId) - .listen((MapTapEvent e) => _googleMapState.onTap(e.position)); - GoogleMapsFlutterPlatform.instance.onLongPress(mapId: mapId).listen( - (MapLongPressEvent e) => _googleMapState.onLongPress(e.position)); - } - - /// Updates configuration options of the map user interface. - Future _updateMapConfiguration(MapConfiguration update) { - return GoogleMapsFlutterPlatform.instance - .updateMapConfiguration(update, mapId: mapId); - } - - /// Updates marker configuration. - Future _updateMarkers(MarkerUpdates markerUpdates) { - return GoogleMapsFlutterPlatform.instance - .updateMarkers(markerUpdates, mapId: mapId); - } - - /// Updates polygon configuration. - Future _updatePolygons(PolygonUpdates polygonUpdates) { - return GoogleMapsFlutterPlatform.instance - .updatePolygons(polygonUpdates, mapId: mapId); - } - - /// Updates polyline configuration. - Future _updatePolylines(PolylineUpdates polylineUpdates) { - return GoogleMapsFlutterPlatform.instance - .updatePolylines(polylineUpdates, mapId: mapId); - } - - /// Updates circle configuration. - Future _updateCircles(CircleUpdates circleUpdates) { - return GoogleMapsFlutterPlatform.instance - .updateCircles(circleUpdates, mapId: mapId); - } - - /// Updates tile overlays configuration. - Future _updateTileOverlays(Set newTileOverlays) { - return GoogleMapsFlutterPlatform.instance - .updateTileOverlays(newTileOverlays: newTileOverlays, mapId: mapId); - } - - /// Clears the tile cache so that all tiles will be requested again from the - /// [TileProvider]. - Future clearTileCache(TileOverlayId tileOverlayId) async { - return GoogleMapsFlutterPlatform.instance - .clearTileCache(tileOverlayId, mapId: mapId); - } - - /// Starts an animated change of the map camera position. - Future animateCamera(CameraUpdate cameraUpdate) { - return GoogleMapsFlutterPlatform.instance - .animateCamera(cameraUpdate, mapId: mapId); - } - - /// Changes the map camera position. - Future moveCamera(CameraUpdate cameraUpdate) { - return GoogleMapsFlutterPlatform.instance - .moveCamera(cameraUpdate, mapId: mapId); - } - - /// Sets the styling of the base map. - Future setMapStyle(String? mapStyle) { - return GoogleMapsFlutterPlatform.instance - .setMapStyle(mapStyle, mapId: mapId); - } - - /// Return [LatLngBounds] defining the region that is visible in a map. - Future getVisibleRegion() { - return GoogleMapsFlutterPlatform.instance.getVisibleRegion(mapId: mapId); - } - - /// Return [ScreenCoordinate] of the [LatLng] in the current map view. - Future getScreenCoordinate(LatLng latLng) { - return GoogleMapsFlutterPlatform.instance - .getScreenCoordinate(latLng, mapId: mapId); - } - - /// Returns [LatLng] corresponding to the [ScreenCoordinate] in the current map view. - Future getLatLng(ScreenCoordinate screenCoordinate) { - return GoogleMapsFlutterPlatform.instance - .getLatLng(screenCoordinate, mapId: mapId); - } - - /// Programmatically show the Info Window for a [Marker]. - Future showMarkerInfoWindow(MarkerId markerId) { - return GoogleMapsFlutterPlatform.instance - .showMarkerInfoWindow(markerId, mapId: mapId); - } - - /// Programmatically hide the Info Window for a [Marker]. - Future hideMarkerInfoWindow(MarkerId markerId) { - return GoogleMapsFlutterPlatform.instance - .hideMarkerInfoWindow(markerId, mapId: mapId); - } - - /// Returns `true` when the [InfoWindow] is showing, `false` otherwise. - Future isMarkerInfoWindowShown(MarkerId markerId) { - return GoogleMapsFlutterPlatform.instance - .isMarkerInfoWindowShown(markerId, mapId: mapId); - } - - /// Returns the current zoom level of the map - Future getZoomLevel() { - return GoogleMapsFlutterPlatform.instance.getZoomLevel(mapId: mapId); - } - - /// Returns the image bytes of the map - Future takeSnapshot() { - return GoogleMapsFlutterPlatform.instance.takeSnapshot(mapId: mapId); - } - - /// Disposes of the platform resources - void dispose() { - GoogleMapsFlutterPlatform.instance.dispose(mapId: mapId); - } -} - -// The next map ID to create. -int _nextMapCreationId = 0; - -/// A widget which displays a map with data obtained from the Google Maps service. -class ExampleGoogleMap extends StatefulWidget { - /// Creates a widget displaying data from Google Maps services. - /// - /// [AssertionError] will be thrown if [initialCameraPosition] is null; - const ExampleGoogleMap({ - super.key, - required this.initialCameraPosition, - this.onMapCreated, - this.gestureRecognizers = const >{}, - this.compassEnabled = true, - this.mapToolbarEnabled = true, - this.cameraTargetBounds = CameraTargetBounds.unbounded, - this.mapType = MapType.normal, - this.minMaxZoomPreference = MinMaxZoomPreference.unbounded, - this.rotateGesturesEnabled = true, - this.scrollGesturesEnabled = true, - this.zoomControlsEnabled = true, - this.zoomGesturesEnabled = true, - this.liteModeEnabled = false, - this.tiltGesturesEnabled = true, - this.myLocationEnabled = false, - this.myLocationButtonEnabled = true, - this.layoutDirection, - - /// If no padding is specified default padding will be 0. - this.padding = EdgeInsets.zero, - this.indoorViewEnabled = false, - this.trafficEnabled = false, - this.buildingsEnabled = true, - this.markers = const {}, - this.polygons = const {}, - this.polylines = const {}, - this.circles = const {}, - this.onCameraMoveStarted, - this.tileOverlays = const {}, - this.onCameraMove, - this.onCameraIdle, - this.onTap, - this.onLongPress, - }); - - /// Callback method for when the map is ready to be used. - /// - /// Used to receive a [ExampleGoogleMapController] for this [ExampleGoogleMap]. - final void Function(ExampleGoogleMapController controller)? onMapCreated; - - /// The initial position of the map's camera. - final CameraPosition initialCameraPosition; - - /// True if the map should show a compass when rotated. - final bool compassEnabled; - - /// True if the map should show a toolbar when you interact with the map. Android only. - final bool mapToolbarEnabled; - - /// Geographical bounding box for the camera target. - final CameraTargetBounds cameraTargetBounds; - - /// Type of map tiles to be rendered. - final MapType mapType; - - /// The layout direction to use for the embedded view. - final TextDirection? layoutDirection; - - /// Preferred bounds for the camera zoom level. - /// - /// Actual bounds depend on map data and device. - final MinMaxZoomPreference minMaxZoomPreference; - - /// True if the map view should respond to rotate gestures. - final bool rotateGesturesEnabled; - - /// True if the map view should respond to scroll gestures. - final bool scrollGesturesEnabled; - - /// True if the map view should show zoom controls. This includes two buttons - /// to zoom in and zoom out. The default value is to show zoom controls. - final bool zoomControlsEnabled; - - /// True if the map view should respond to zoom gestures. - final bool zoomGesturesEnabled; - - /// True if the map view should be in lite mode. Android only. - final bool liteModeEnabled; - - /// True if the map view should respond to tilt gestures. - final bool tiltGesturesEnabled; - - /// Padding to be set on map. - final EdgeInsets padding; - - /// Markers to be placed on the map. - final Set markers; - - /// Polygons to be placed on the map. - final Set polygons; - - /// Polylines to be placed on the map. - final Set polylines; - - /// Circles to be placed on the map. - final Set circles; - - /// Tile overlays to be placed on the map. - final Set tileOverlays; - - /// Called when the camera starts moving. - final VoidCallback? onCameraMoveStarted; - - /// Called repeatedly as the camera continues to move after an - /// onCameraMoveStarted call. - final CameraPositionCallback? onCameraMove; - - /// Called when camera movement has ended, there are no pending - /// animations and the user has stopped interacting with the map. - final VoidCallback? onCameraIdle; - - /// Called every time a [ExampleGoogleMap] is tapped. - final ArgumentCallback? onTap; - - /// Called every time a [ExampleGoogleMap] is long pressed. - final ArgumentCallback? onLongPress; - - /// True if a "My Location" layer should be shown on the map. - final bool myLocationEnabled; - - /// Enables or disables the my-location button. - final bool myLocationButtonEnabled; - - /// Enables or disables the indoor view from the map - final bool indoorViewEnabled; - - /// Enables or disables the traffic layer of the map - final bool trafficEnabled; - - /// Enables or disables showing 3D buildings where available - final bool buildingsEnabled; - - /// Which gestures should be consumed by the map. - final Set> gestureRecognizers; - - /// Creates a [State] for this [ExampleGoogleMap]. - @override - State createState() => _ExampleGoogleMapState(); -} - -class _ExampleGoogleMapState extends State { - final int _mapId = _nextMapCreationId++; - - final Completer _controller = - Completer(); - - Map _markers = {}; - Map _polygons = {}; - Map _polylines = {}; - Map _circles = {}; - late MapConfiguration _mapConfiguration; - - @override - Widget build(BuildContext context) { - return GoogleMapsFlutterPlatform.instance.buildViewWithConfiguration( - _mapId, - onPlatformViewCreated, - widgetConfiguration: MapWidgetConfiguration( - textDirection: widget.layoutDirection ?? - Directionality.maybeOf(context) ?? - TextDirection.ltr, - initialCameraPosition: widget.initialCameraPosition, - gestureRecognizers: widget.gestureRecognizers, - ), - mapObjects: MapObjects( - markers: widget.markers, - polygons: widget.polygons, - polylines: widget.polylines, - circles: widget.circles, - ), - mapConfiguration: _mapConfiguration, - ); - } - - @override - void initState() { - super.initState(); - _mapConfiguration = _configurationFromMapWidget(widget); - _markers = keyByMarkerId(widget.markers); - _polygons = keyByPolygonId(widget.polygons); - _polylines = keyByPolylineId(widget.polylines); - _circles = keyByCircleId(widget.circles); - } - - @override - void dispose() { - _controller.future - .then((ExampleGoogleMapController controller) => controller.dispose()); - super.dispose(); - } - - @override - void didUpdateWidget(ExampleGoogleMap oldWidget) { - super.didUpdateWidget(oldWidget); - _updateOptions(); - _updateMarkers(); - _updatePolygons(); - _updatePolylines(); - _updateCircles(); - _updateTileOverlays(); - } - - Future _updateOptions() async { - final MapConfiguration newConfig = _configurationFromMapWidget(widget); - final MapConfiguration updates = newConfig.diffFrom(_mapConfiguration); - if (updates.isEmpty) { - return; - } - final ExampleGoogleMapController controller = await _controller.future; - controller._updateMapConfiguration(updates); - _mapConfiguration = newConfig; - } - - Future _updateMarkers() async { - final ExampleGoogleMapController controller = await _controller.future; - controller._updateMarkers( - MarkerUpdates.from(_markers.values.toSet(), widget.markers)); - _markers = keyByMarkerId(widget.markers); - } - - Future _updatePolygons() async { - final ExampleGoogleMapController controller = await _controller.future; - controller._updatePolygons( - PolygonUpdates.from(_polygons.values.toSet(), widget.polygons)); - _polygons = keyByPolygonId(widget.polygons); - } - - Future _updatePolylines() async { - final ExampleGoogleMapController controller = await _controller.future; - controller._updatePolylines( - PolylineUpdates.from(_polylines.values.toSet(), widget.polylines)); - _polylines = keyByPolylineId(widget.polylines); - } - - Future _updateCircles() async { - final ExampleGoogleMapController controller = await _controller.future; - controller._updateCircles( - CircleUpdates.from(_circles.values.toSet(), widget.circles)); - _circles = keyByCircleId(widget.circles); - } - - Future _updateTileOverlays() async { - final ExampleGoogleMapController controller = await _controller.future; - controller._updateTileOverlays(widget.tileOverlays); - } - - Future onPlatformViewCreated(int id) async { - final ExampleGoogleMapController controller = - await ExampleGoogleMapController._init( - id, - widget.initialCameraPosition, - this, - ); - _controller.complete(controller); - _updateTileOverlays(); - widget.onMapCreated?.call(controller); - } - - void onMarkerTap(MarkerId markerId) { - _markers[markerId]!.onTap?.call(); - } - - void onMarkerDragStart(MarkerId markerId, LatLng position) { - _markers[markerId]!.onDragStart?.call(position); - } - - void onMarkerDrag(MarkerId markerId, LatLng position) { - _markers[markerId]!.onDrag?.call(position); - } - - void onMarkerDragEnd(MarkerId markerId, LatLng position) { - _markers[markerId]!.onDragEnd?.call(position); - } - - void onPolygonTap(PolygonId polygonId) { - _polygons[polygonId]!.onTap?.call(); - } - - void onPolylineTap(PolylineId polylineId) { - _polylines[polylineId]!.onTap?.call(); - } - - void onCircleTap(CircleId circleId) { - _circles[circleId]!.onTap?.call(); - } - - void onInfoWindowTap(MarkerId markerId) { - _markers[markerId]!.infoWindow.onTap?.call(); - } - - void onTap(LatLng position) { - widget.onTap?.call(position); - } - - void onLongPress(LatLng position) { - widget.onLongPress?.call(position); - } -} - -/// Builds a [MapConfiguration] from the given [map]. -MapConfiguration _configurationFromMapWidget(ExampleGoogleMap map) { - return MapConfiguration( - compassEnabled: map.compassEnabled, - mapToolbarEnabled: map.mapToolbarEnabled, - cameraTargetBounds: map.cameraTargetBounds, - mapType: map.mapType, - minMaxZoomPreference: map.minMaxZoomPreference, - rotateGesturesEnabled: map.rotateGesturesEnabled, - scrollGesturesEnabled: map.scrollGesturesEnabled, - tiltGesturesEnabled: map.tiltGesturesEnabled, - trackCameraPosition: map.onCameraMove != null, - zoomControlsEnabled: map.zoomControlsEnabled, - zoomGesturesEnabled: map.zoomGesturesEnabled, - liteModeEnabled: map.liteModeEnabled, - myLocationEnabled: map.myLocationEnabled, - myLocationButtonEnabled: map.myLocationButtonEnabled, - padding: map.padding, - indoorViewEnabled: map.indoorViewEnabled, - trafficEnabled: map.trafficEnabled, - buildingsEnabled: map.buildingsEnabled, - ); -} diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/lite_mode.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/lite_mode.dart deleted file mode 100644 index f7bead951f5..00000000000 --- a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/lite_mode.dart +++ /dev/null @@ -1,47 +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. - -// ignore_for_file: public_member_api_docs - -import 'package:flutter/material.dart'; -import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart'; - -import 'example_google_map.dart'; -import 'page.dart'; - -const CameraPosition _kInitialPosition = - CameraPosition(target: LatLng(-33.852, 151.211), zoom: 11.0); - -class LiteModePage extends GoogleMapExampleAppPage { - const LiteModePage({Key? key}) - : super(const Icon(Icons.map), 'Lite mode', key: key); - - @override - Widget build(BuildContext context) { - return const _LiteModeBody(); - } -} - -class _LiteModeBody extends StatelessWidget { - const _LiteModeBody(); - - @override - Widget build(BuildContext context) { - return const Card( - child: Padding( - padding: EdgeInsets.symmetric(vertical: 30.0), - child: Center( - child: SizedBox( - width: 300.0, - height: 300.0, - child: ExampleGoogleMap( - initialCameraPosition: _kInitialPosition, - liteModeEnabled: true, - ), - ), - ), - ), - ); - } -} diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/main.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/main.dart index 3b1e6361b96..0e4efc0f788 100644 --- a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/main.dart +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/main.dart @@ -3,71 +3,41 @@ // found in the LICENSE file. import 'package:flutter/material.dart'; - -import 'animate_camera.dart'; -import 'lite_mode.dart'; -import 'map_click.dart'; -import 'map_coordinates.dart'; -import 'map_ui.dart'; -import 'marker_icons.dart'; -import 'move_camera.dart'; -import 'padding.dart'; -import 'page.dart'; -import 'place_circle.dart'; -import 'place_marker.dart'; -import 'place_polygon.dart'; -import 'place_polyline.dart'; -import 'scrolling_map.dart'; -import 'snapshot.dart'; -import 'tile_overlay.dart'; - -final List _allPages = [ - const MapUiPage(), - const MapCoordinatesPage(), - const MapClickPage(), - const AnimateCameraPage(), - const MoveCameraPage(), - const PlaceMarkerPage(), - const MarkerIconsPage(), - const ScrollingMapPage(), - const PlacePolylinePage(), - const PlacePolygonPage(), - const PlaceCirclePage(), - const PaddingPage(), - const SnapshotPage(), - const LiteModePage(), - const TileOverlayPage(), -]; - -/// MapsDemo is the Main Application. -class MapsDemo extends StatelessWidget { - /// Default Constructor - const MapsDemo({super.key}); - - void _pushPage(BuildContext context, GoogleMapExampleAppPage page) { - Navigator.of(context).push(MaterialPageRoute( - builder: (_) => Scaffold( - appBar: AppBar(title: Text(page.title)), - body: page, - ))); - } - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar(title: const Text('GoogleMaps examples')), - body: ListView.builder( - itemCount: _allPages.length, - itemBuilder: (_, int index) => ListTile( - leading: _allPages[index].leading, - title: Text(_allPages[index].title), - onTap: () => _pushPage(context, _allPages[index]), - ), - ), - ); - } -} +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_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())); + runApp(const MaterialApp( + home: MapsDemo([ + MapUiPage(), + MapCoordinatesPage(), + MapClickPage(), + AnimateCameraPage(), + MoveCameraPage(), + PlaceMarkerPage(), + MarkerIconsPage(), + ScrollingMapPage(), + PlacePolylinePage(), + PlacePolygonPage(), + PlaceCirclePage(), + PaddingPage(), + SnapshotPage(), + LiteModePage(), + TileOverlayPage(), + ]))); } diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/map_click.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/map_click.dart deleted file mode 100644 index 4017a9fccce..00000000000 --- a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/map_click.dart +++ /dev/null @@ -1,105 +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. - -// ignore_for_file: public_member_api_docs - -import 'package:flutter/material.dart'; -import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart'; - -import 'example_google_map.dart'; -import 'page.dart'; - -const CameraPosition _kInitialPosition = - CameraPosition(target: LatLng(-33.852, 151.211), zoom: 11.0); - -class MapClickPage extends GoogleMapExampleAppPage { - const MapClickPage({Key? key}) - : super(const Icon(Icons.mouse), 'Map click', key: key); - - @override - Widget build(BuildContext context) { - return const _MapClickBody(); - } -} - -class _MapClickBody extends StatefulWidget { - const _MapClickBody(); - - @override - State createState() => _MapClickBodyState(); -} - -class _MapClickBodyState extends State<_MapClickBody> { - _MapClickBodyState(); - - ExampleGoogleMapController? mapController; - LatLng? _lastTap; - LatLng? _lastLongPress; - - @override - Widget build(BuildContext context) { - final ExampleGoogleMap googleMap = ExampleGoogleMap( - onMapCreated: onMapCreated, - initialCameraPosition: _kInitialPosition, - onTap: (LatLng pos) { - setState(() { - _lastTap = pos; - }); - }, - onLongPress: (LatLng pos) { - setState(() { - _lastLongPress = pos; - }); - }, - ); - - final List columnChildren = [ - Padding( - padding: const EdgeInsets.all(10.0), - child: Center( - child: SizedBox( - width: 300.0, - height: 200.0, - child: googleMap, - ), - ), - ), - ]; - - if (mapController != null) { - final String lastTap = 'Tap:\n${_lastTap ?? ""}\n'; - final String lastLongPress = 'Long press:\n${_lastLongPress ?? ""}'; - columnChildren.add(Center( - child: Text( - lastTap, - textAlign: TextAlign.center, - ))); - columnChildren.add(Center( - child: Text( - _lastTap != null ? 'Tapped' : '', - textAlign: TextAlign.center, - ))); - columnChildren.add(Center( - child: Text( - lastLongPress, - textAlign: TextAlign.center, - ))); - columnChildren.add(Center( - child: Text( - _lastLongPress != null ? 'Long pressed' : '', - textAlign: TextAlign.center, - ))); - } - return Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: columnChildren, - ); - } - - Future onMapCreated(ExampleGoogleMapController controller) async { - setState(() { - mapController = controller; - }); - } -} diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/map_coordinates.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/map_coordinates.dart deleted file mode 100644 index 25247bc7c7b..00000000000 --- a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/map_coordinates.dart +++ /dev/null @@ -1,104 +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. - -// ignore_for_file: public_member_api_docs - -import 'package:flutter/material.dart'; -import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart'; - -import 'example_google_map.dart'; -import 'page.dart'; - -const CameraPosition _kInitialPosition = - CameraPosition(target: LatLng(-33.852, 151.211), zoom: 11.0); - -class MapCoordinatesPage extends GoogleMapExampleAppPage { - const MapCoordinatesPage({Key? key}) - : super(const Icon(Icons.map), 'Map coordinates', key: key); - - @override - Widget build(BuildContext context) { - return const _MapCoordinatesBody(); - } -} - -class _MapCoordinatesBody extends StatefulWidget { - const _MapCoordinatesBody(); - - @override - State createState() => _MapCoordinatesBodyState(); -} - -class _MapCoordinatesBodyState extends State<_MapCoordinatesBody> { - _MapCoordinatesBodyState(); - - ExampleGoogleMapController? mapController; - LatLngBounds _visibleRegion = LatLngBounds( - southwest: const LatLng(0, 0), - northeast: const LatLng(0, 0), - ); - - @override - Widget build(BuildContext context) { - final ExampleGoogleMap googleMap = ExampleGoogleMap( - onMapCreated: onMapCreated, - initialCameraPosition: _kInitialPosition, - onCameraIdle: - _updateVisibleRegion, // https://github.com/flutter/flutter/issues/54758 - ); - - return NotificationListener( - onNotification: (ScrollNotification scrollState) { - _updateVisibleRegion(); - return true; - }, - child: Stack( - children: [ - ListView( - children: [ - Padding( - padding: const EdgeInsets.all(10.0), - child: Center( - child: SizedBox( - width: 300.0, - height: 200.0, - child: googleMap, - ), - ), - ), - // Add a block at the bottom of this list to allow validation that the visible region of the map - // does not change when scrolled under the safe view on iOS. - // https://github.com/flutter/flutter/issues/107913 - const SizedBox( - width: 300, - height: 1000, - ), - ], - ), - if (mapController != null) - Center( - child: Text('VisibleRegion:' - '\nnortheast: ${_visibleRegion.northeast},' - '\nsouthwest: ${_visibleRegion.southwest}'), - ), - ], - ), - ); - } - - Future onMapCreated(ExampleGoogleMapController controller) async { - final LatLngBounds visibleRegion = await controller.getVisibleRegion(); - setState(() { - mapController = controller; - _visibleRegion = visibleRegion; - }); - } - - Future _updateVisibleRegion() async { - final LatLngBounds visibleRegion = await mapController!.getVisibleRegion(); - setState(() { - _visibleRegion = visibleRegion; - }); - } -} diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/map_ui.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/map_ui.dart deleted file mode 100644 index 311e2267aa0..00000000000 --- a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/map_ui.dart +++ /dev/null @@ -1,357 +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. - -// ignore_for_file: public_member_api_docs - -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart' show rootBundle; -import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart'; - -import 'example_google_map.dart'; -import 'page.dart'; - -final LatLngBounds sydneyBounds = LatLngBounds( - southwest: const LatLng(-34.022631, 150.620685), - northeast: const LatLng(-33.571835, 151.325952), -); - -class MapUiPage extends GoogleMapExampleAppPage { - const MapUiPage({Key? key}) - : super(const Icon(Icons.map), 'User interface', key: key); - - @override - Widget build(BuildContext context) { - return const MapUiBody(); - } -} - -class MapUiBody extends StatefulWidget { - const MapUiBody({super.key}); - - @override - State createState() => MapUiBodyState(); -} - -class MapUiBodyState extends State { - MapUiBodyState(); - - static const CameraPosition _kInitialPosition = CameraPosition( - target: LatLng(-33.852, 151.211), - zoom: 11.0, - ); - - CameraPosition _position = _kInitialPosition; - bool _isMapCreated = false; - final bool _isMoving = false; - bool _compassEnabled = true; - bool _mapToolbarEnabled = true; - CameraTargetBounds _cameraTargetBounds = CameraTargetBounds.unbounded; - MinMaxZoomPreference _minMaxZoomPreference = MinMaxZoomPreference.unbounded; - MapType _mapType = MapType.normal; - bool _rotateGesturesEnabled = true; - bool _scrollGesturesEnabled = true; - bool _tiltGesturesEnabled = true; - bool _zoomControlsEnabled = false; - bool _zoomGesturesEnabled = true; - bool _indoorViewEnabled = true; - bool _myLocationEnabled = true; - bool _myTrafficEnabled = false; - bool _myLocationButtonEnabled = true; - late ExampleGoogleMapController _controller; - bool _nightMode = false; - - @override - void initState() { - super.initState(); - } - - @override - void dispose() { - super.dispose(); - } - - Widget _compassToggler() { - return TextButton( - child: Text('${_compassEnabled ? 'disable' : 'enable'} compass'), - onPressed: () { - setState(() { - _compassEnabled = !_compassEnabled; - }); - }, - ); - } - - Widget _mapToolbarToggler() { - return TextButton( - child: Text('${_mapToolbarEnabled ? 'disable' : 'enable'} map toolbar'), - onPressed: () { - setState(() { - _mapToolbarEnabled = !_mapToolbarEnabled; - }); - }, - ); - } - - Widget _latLngBoundsToggler() { - return TextButton( - child: Text( - _cameraTargetBounds.bounds == null - ? 'bound camera target' - : 'release camera target', - ), - onPressed: () { - setState(() { - _cameraTargetBounds = _cameraTargetBounds.bounds == null - ? CameraTargetBounds(sydneyBounds) - : CameraTargetBounds.unbounded; - }); - }, - ); - } - - Widget _zoomBoundsToggler() { - return TextButton( - child: Text(_minMaxZoomPreference.minZoom == null - ? 'bound zoom' - : 'release zoom'), - onPressed: () { - setState(() { - _minMaxZoomPreference = _minMaxZoomPreference.minZoom == null - ? const MinMaxZoomPreference(12.0, 16.0) - : MinMaxZoomPreference.unbounded; - }); - }, - ); - } - - Widget _mapTypeCycler() { - final MapType nextType = - MapType.values[(_mapType.index + 1) % MapType.values.length]; - return TextButton( - child: Text('change map type to $nextType'), - onPressed: () { - setState(() { - _mapType = nextType; - }); - }, - ); - } - - Widget _rotateToggler() { - return TextButton( - child: Text('${_rotateGesturesEnabled ? 'disable' : 'enable'} rotate'), - onPressed: () { - setState(() { - _rotateGesturesEnabled = !_rotateGesturesEnabled; - }); - }, - ); - } - - Widget _scrollToggler() { - return TextButton( - child: Text('${_scrollGesturesEnabled ? 'disable' : 'enable'} scroll'), - onPressed: () { - setState(() { - _scrollGesturesEnabled = !_scrollGesturesEnabled; - }); - }, - ); - } - - Widget _tiltToggler() { - return TextButton( - child: Text('${_tiltGesturesEnabled ? 'disable' : 'enable'} tilt'), - onPressed: () { - setState(() { - _tiltGesturesEnabled = !_tiltGesturesEnabled; - }); - }, - ); - } - - Widget _zoomToggler() { - return TextButton( - child: Text('${_zoomGesturesEnabled ? 'disable' : 'enable'} zoom'), - onPressed: () { - setState(() { - _zoomGesturesEnabled = !_zoomGesturesEnabled; - }); - }, - ); - } - - Widget _zoomControlsToggler() { - return TextButton( - child: - Text('${_zoomControlsEnabled ? 'disable' : 'enable'} zoom controls'), - onPressed: () { - setState(() { - _zoomControlsEnabled = !_zoomControlsEnabled; - }); - }, - ); - } - - Widget _indoorViewToggler() { - return TextButton( - child: Text('${_indoorViewEnabled ? 'disable' : 'enable'} indoor'), - onPressed: () { - setState(() { - _indoorViewEnabled = !_indoorViewEnabled; - }); - }, - ); - } - - Widget _myLocationToggler() { - return TextButton( - child: Text( - '${_myLocationEnabled ? 'disable' : 'enable'} my location marker'), - onPressed: () { - setState(() { - _myLocationEnabled = !_myLocationEnabled; - }); - }, - ); - } - - Widget _myLocationButtonToggler() { - return TextButton( - child: Text( - '${_myLocationButtonEnabled ? 'disable' : 'enable'} my location button'), - onPressed: () { - setState(() { - _myLocationButtonEnabled = !_myLocationButtonEnabled; - }); - }, - ); - } - - Widget _myTrafficToggler() { - return TextButton( - child: Text('${_myTrafficEnabled ? 'disable' : 'enable'} my traffic'), - onPressed: () { - setState(() { - _myTrafficEnabled = !_myTrafficEnabled; - }); - }, - ); - } - - Future _getFileData(String path) async { - return rootBundle.loadString(path); - } - - void _setMapStyle(String mapStyle) { - setState(() { - _nightMode = true; - _controller.setMapStyle(mapStyle); - }); - } - - // Should only be called if _isMapCreated is true. - Widget _nightModeToggler() { - assert(_isMapCreated); - return TextButton( - child: Text('${_nightMode ? 'disable' : 'enable'} night mode'), - onPressed: () { - if (_nightMode) { - setState(() { - _nightMode = false; - _controller.setMapStyle(null); - }); - } else { - _getFileData('assets/night_mode.json').then(_setMapStyle); - } - }, - ); - } - - @override - Widget build(BuildContext context) { - final ExampleGoogleMap googleMap = ExampleGoogleMap( - onMapCreated: onMapCreated, - initialCameraPosition: _kInitialPosition, - compassEnabled: _compassEnabled, - mapToolbarEnabled: _mapToolbarEnabled, - cameraTargetBounds: _cameraTargetBounds, - minMaxZoomPreference: _minMaxZoomPreference, - mapType: _mapType, - rotateGesturesEnabled: _rotateGesturesEnabled, - scrollGesturesEnabled: _scrollGesturesEnabled, - tiltGesturesEnabled: _tiltGesturesEnabled, - zoomGesturesEnabled: _zoomGesturesEnabled, - zoomControlsEnabled: _zoomControlsEnabled, - indoorViewEnabled: _indoorViewEnabled, - myLocationEnabled: _myLocationEnabled, - myLocationButtonEnabled: _myLocationButtonEnabled, - trafficEnabled: _myTrafficEnabled, - onCameraMove: _updateCameraPosition, - ); - - final List columnChildren = [ - Padding( - padding: const EdgeInsets.all(10.0), - child: Center( - child: SizedBox( - width: 300.0, - height: 200.0, - child: googleMap, - ), - ), - ), - ]; - - if (_isMapCreated) { - columnChildren.add( - Expanded( - child: ListView( - children: [ - Text('camera bearing: ${_position.bearing}'), - Text( - 'camera target: ${_position.target.latitude.toStringAsFixed(4)},' - '${_position.target.longitude.toStringAsFixed(4)}'), - Text('camera zoom: ${_position.zoom}'), - Text('camera tilt: ${_position.tilt}'), - Text(_isMoving ? '(Camera moving)' : '(Camera idle)'), - _compassToggler(), - _mapToolbarToggler(), - _latLngBoundsToggler(), - _mapTypeCycler(), - _zoomBoundsToggler(), - _rotateToggler(), - _scrollToggler(), - _tiltToggler(), - _zoomToggler(), - _zoomControlsToggler(), - _indoorViewToggler(), - _myLocationToggler(), - _myLocationButtonToggler(), - _myTrafficToggler(), - _nightModeToggler(), - ], - ), - ), - ); - } - return Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: columnChildren, - ); - } - - void _updateCameraPosition(CameraPosition position) { - setState(() { - _position = position; - }); - } - - void onMapCreated(ExampleGoogleMapController controller) { - setState(() { - _controller = controller; - _isMapCreated = true; - }); - } -} diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/marker_icons.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/marker_icons.dart deleted file mode 100644 index 174055613a9..00000000000 --- a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/marker_icons.dart +++ /dev/null @@ -1,98 +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. - -// ignore_for_file: public_member_api_docs -// ignore_for_file: unawaited_futures - -import 'package:flutter/material.dart'; -import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart'; - -import 'example_google_map.dart'; -import 'page.dart'; - -class MarkerIconsPage extends GoogleMapExampleAppPage { - const MarkerIconsPage({Key? key}) - : super(const Icon(Icons.image), 'Marker icons', key: key); - - @override - Widget build(BuildContext context) { - return const MarkerIconsBody(); - } -} - -class MarkerIconsBody extends StatefulWidget { - const MarkerIconsBody({super.key}); - - @override - State createState() => MarkerIconsBodyState(); -} - -const LatLng _kMapCenter = LatLng(52.4478, -3.5402); - -class MarkerIconsBodyState extends State { - ExampleGoogleMapController? controller; - BitmapDescriptor? _markerIcon; - - @override - Widget build(BuildContext context) { - _createMarkerImageFromAsset(context); - return Column( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - Center( - child: SizedBox( - width: 350.0, - height: 300.0, - child: ExampleGoogleMap( - initialCameraPosition: const CameraPosition( - target: _kMapCenter, - zoom: 7.0, - ), - markers: {_createMarker()}, - onMapCreated: _onMapCreated, - ), - ), - ) - ], - ); - } - - Marker _createMarker() { - if (_markerIcon != null) { - return Marker( - markerId: const MarkerId('marker_1'), - position: _kMapCenter, - icon: _markerIcon!, - ); - } else { - return const Marker( - markerId: MarkerId('marker_1'), - position: _kMapCenter, - ); - } - } - - Future _createMarkerImageFromAsset(BuildContext context) async { - if (_markerIcon == null) { - final ImageConfiguration imageConfiguration = - createLocalImageConfiguration(context, size: const Size.square(48)); - BitmapDescriptor.fromAssetImage( - imageConfiguration, 'assets/red_square.png') - .then(_updateBitmap); - } - } - - void _updateBitmap(BitmapDescriptor bitmap) { - setState(() { - _markerIcon = bitmap; - }); - } - - void _onMapCreated(ExampleGoogleMapController controllerParam) { - setState(() { - controller = controllerParam; - }); - } -} diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/move_camera.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/move_camera.dart deleted file mode 100644 index b1fb55cad54..00000000000 --- a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/move_camera.dart +++ /dev/null @@ -1,171 +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. - -// ignore_for_file: public_member_api_docs - -import 'package:flutter/material.dart'; -import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart'; - -import 'example_google_map.dart'; -import 'page.dart'; - -class MoveCameraPage extends GoogleMapExampleAppPage { - const MoveCameraPage({Key? key}) - : super(const Icon(Icons.map), 'Camera control', key: key); - - @override - Widget build(BuildContext context) { - return const MoveCamera(); - } -} - -class MoveCamera extends StatefulWidget { - const MoveCamera({super.key}); - @override - State createState() => MoveCameraState(); -} - -class MoveCameraState extends State { - ExampleGoogleMapController? mapController; - - // ignore: use_setters_to_change_properties - void _onMapCreated(ExampleGoogleMapController controller) { - mapController = controller; - } - - @override - Widget build(BuildContext context) { - return Column( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - Center( - child: SizedBox( - width: 300.0, - height: 200.0, - child: ExampleGoogleMap( - onMapCreated: _onMapCreated, - initialCameraPosition: - const CameraPosition(target: LatLng(0.0, 0.0)), - ), - ), - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - Column( - children: [ - TextButton( - onPressed: () { - mapController?.moveCamera( - CameraUpdate.newCameraPosition( - const CameraPosition( - bearing: 270.0, - target: LatLng(51.5160895, -0.1294527), - tilt: 30.0, - zoom: 17.0, - ), - ), - ); - }, - child: const Text('newCameraPosition'), - ), - TextButton( - onPressed: () { - mapController?.moveCamera( - CameraUpdate.newLatLng( - const LatLng(56.1725505, 10.1850512), - ), - ); - }, - child: const Text('newLatLng'), - ), - TextButton( - onPressed: () { - mapController?.moveCamera( - CameraUpdate.newLatLngBounds( - LatLngBounds( - southwest: const LatLng(-38.483935, 113.248673), - northeast: const LatLng(-8.982446, 153.823821), - ), - 10.0, - ), - ); - }, - child: const Text('newLatLngBounds'), - ), - TextButton( - onPressed: () { - mapController?.moveCamera( - CameraUpdate.newLatLngZoom( - const LatLng(37.4231613, -122.087159), - 11.0, - ), - ); - }, - child: const Text('newLatLngZoom'), - ), - TextButton( - onPressed: () { - mapController?.moveCamera( - CameraUpdate.scrollBy(150.0, -225.0), - ); - }, - child: const Text('scrollBy'), - ), - ], - ), - Column( - children: [ - TextButton( - onPressed: () { - mapController?.moveCamera( - CameraUpdate.zoomBy( - -0.5, - const Offset(30.0, 20.0), - ), - ); - }, - child: const Text('zoomBy with focus'), - ), - TextButton( - onPressed: () { - mapController?.moveCamera( - CameraUpdate.zoomBy(-0.5), - ); - }, - child: const Text('zoomBy'), - ), - TextButton( - onPressed: () { - mapController?.moveCamera( - CameraUpdate.zoomIn(), - ); - }, - child: const Text('zoomIn'), - ), - TextButton( - onPressed: () { - mapController?.moveCamera( - CameraUpdate.zoomOut(), - ); - }, - child: const Text('zoomOut'), - ), - TextButton( - onPressed: () { - mapController?.moveCamera( - CameraUpdate.zoomTo(16.0), - ); - }, - child: const Text('zoomTo'), - ), - ], - ), - ], - ) - ], - ); - } -} diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/padding.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/padding.dart deleted file mode 100644 index bfddb167d43..00000000000 --- a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/padding.dart +++ /dev/null @@ -1,180 +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. - -// ignore_for_file: public_member_api_docs - -import 'package:flutter/material.dart'; -import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart'; - -import 'example_google_map.dart'; -import 'page.dart'; - -class PaddingPage extends GoogleMapExampleAppPage { - const PaddingPage({Key? key}) - : super(const Icon(Icons.map), 'Add padding to the map', key: key); - - @override - Widget build(BuildContext context) { - return const MarkerIconsBody(); - } -} - -class MarkerIconsBody extends StatefulWidget { - const MarkerIconsBody({super.key}); - - @override - State createState() => MarkerIconsBodyState(); -} - -const LatLng _kMapCenter = LatLng(52.4478, -3.5402); - -class MarkerIconsBodyState extends State { - ExampleGoogleMapController? controller; - - EdgeInsets _padding = EdgeInsets.zero; - - @override - Widget build(BuildContext context) { - final ExampleGoogleMap googleMap = ExampleGoogleMap( - onMapCreated: _onMapCreated, - initialCameraPosition: const CameraPosition( - target: _kMapCenter, - zoom: 7.0, - ), - padding: _padding, - ); - - final List columnChildren = [ - Padding( - padding: const EdgeInsets.all(10.0), - child: Center( - child: SizedBox( - width: 300.0, - height: 200.0, - child: googleMap, - ), - ), - ), - const Padding( - padding: EdgeInsets.only(top: 20), - child: Center( - child: Text( - 'Enter Padding Below', - style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold), - ), - ), - ), - ]; - - columnChildren.addAll([_paddingInput(), _buttons()]); - - return Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: columnChildren, - ); - } - - void _onMapCreated(ExampleGoogleMapController controllerParam) { - setState(() { - controller = controllerParam; - }); - } - - final TextEditingController _topController = TextEditingController(); - final TextEditingController _bottomController = TextEditingController(); - final TextEditingController _leftController = TextEditingController(); - final TextEditingController _rightController = TextEditingController(); - - Widget _paddingInput() { - return Padding( - padding: const EdgeInsets.all(16.0), - child: Row( - children: [ - Flexible( - flex: 2, - child: TextField( - controller: _topController, - keyboardType: TextInputType.number, - textAlign: TextAlign.center, - decoration: const InputDecoration( - hintText: 'Top', - ), - ), - ), - const Spacer(), - Flexible( - flex: 2, - child: TextField( - controller: _bottomController, - keyboardType: TextInputType.number, - textAlign: TextAlign.center, - decoration: const InputDecoration( - hintText: 'Bottom', - ), - ), - ), - const Spacer(), - Flexible( - flex: 2, - child: TextField( - controller: _leftController, - keyboardType: TextInputType.number, - textAlign: TextAlign.center, - decoration: const InputDecoration( - hintText: 'Left', - ), - ), - ), - const Spacer(), - Flexible( - flex: 2, - child: TextField( - controller: _rightController, - keyboardType: TextInputType.number, - textAlign: TextAlign.center, - decoration: const InputDecoration( - hintText: 'Right', - ), - ), - ), - ], - ), - ); - } - - Widget _buttons() { - return Padding( - padding: const EdgeInsets.symmetric(horizontal: 16), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - TextButton( - child: const Text('Set Padding'), - onPressed: () { - setState(() { - _padding = EdgeInsets.fromLTRB( - double.tryParse(_leftController.value.text) ?? 0, - double.tryParse(_topController.value.text) ?? 0, - double.tryParse(_rightController.value.text) ?? 0, - double.tryParse(_bottomController.value.text) ?? 0); - }); - }, - ), - TextButton( - child: const Text('Reset Padding'), - onPressed: () { - setState(() { - _topController.clear(); - _bottomController.clear(); - _leftController.clear(); - _rightController.clear(); - _padding = EdgeInsets.zero; - }); - }, - ) - ], - ), - ); - } -} diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/page.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/page.dart deleted file mode 100644 index cb8ef54d374..00000000000 --- a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/page.dart +++ /dev/null @@ -1,14 +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. - -// ignore_for_file: public_member_api_docs - -import 'package:flutter/material.dart'; - -abstract class GoogleMapExampleAppPage extends StatelessWidget { - const GoogleMapExampleAppPage(this.leading, this.title, {super.key}); - - final Widget leading; - final String title; -} diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/place_circle.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/place_circle.dart deleted file mode 100644 index 29be7442965..00000000000 --- a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/place_circle.dart +++ /dev/null @@ -1,232 +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. - -// ignore_for_file: public_member_api_docs - -import 'package:flutter/material.dart'; -import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart'; - -import 'example_google_map.dart'; -import 'page.dart'; - -class PlaceCirclePage extends GoogleMapExampleAppPage { - const PlaceCirclePage({Key? key}) - : super(const Icon(Icons.linear_scale), 'Place circle', key: key); - - @override - Widget build(BuildContext context) { - return const PlaceCircleBody(); - } -} - -class PlaceCircleBody extends StatefulWidget { - const PlaceCircleBody({super.key}); - - @override - State createState() => PlaceCircleBodyState(); -} - -class PlaceCircleBodyState extends State { - PlaceCircleBodyState(); - - ExampleGoogleMapController? controller; - Map circles = {}; - int _circleIdCounter = 1; - CircleId? selectedCircle; - - // Values when toggling circle color - int fillColorsIndex = 0; - int strokeColorsIndex = 0; - List colors = [ - Colors.purple, - Colors.red, - Colors.green, - Colors.pink, - ]; - - // Values when toggling circle stroke width - int widthsIndex = 0; - List widths = [10, 20, 5]; - - // ignore: use_setters_to_change_properties - void _onMapCreated(ExampleGoogleMapController controller) { - this.controller = controller; - } - - @override - void dispose() { - super.dispose(); - } - - void _onCircleTapped(CircleId circleId) { - setState(() { - selectedCircle = circleId; - }); - } - - void _remove(CircleId circleId) { - setState(() { - if (circles.containsKey(circleId)) { - circles.remove(circleId); - } - if (circleId == selectedCircle) { - selectedCircle = null; - } - }); - } - - void _add() { - final int circleCount = circles.length; - - if (circleCount == 12) { - return; - } - - final String circleIdVal = 'circle_id_$_circleIdCounter'; - _circleIdCounter++; - final CircleId circleId = CircleId(circleIdVal); - - final Circle circle = Circle( - circleId: circleId, - consumeTapEvents: true, - strokeColor: Colors.orange, - fillColor: Colors.green, - strokeWidth: 5, - center: _createCenter(), - radius: 50000, - onTap: () { - _onCircleTapped(circleId); - }, - ); - - setState(() { - circles[circleId] = circle; - }); - } - - void _toggleVisible(CircleId circleId) { - final Circle circle = circles[circleId]!; - setState(() { - circles[circleId] = circle.copyWith( - visibleParam: !circle.visible, - ); - }); - } - - void _changeFillColor(CircleId circleId) { - final Circle circle = circles[circleId]!; - setState(() { - circles[circleId] = circle.copyWith( - fillColorParam: colors[++fillColorsIndex % colors.length], - ); - }); - } - - void _changeStrokeColor(CircleId circleId) { - final Circle circle = circles[circleId]!; - setState(() { - circles[circleId] = circle.copyWith( - strokeColorParam: colors[++strokeColorsIndex % colors.length], - ); - }); - } - - void _changeStrokeWidth(CircleId circleId) { - final Circle circle = circles[circleId]!; - setState(() { - circles[circleId] = circle.copyWith( - strokeWidthParam: widths[++widthsIndex % widths.length], - ); - }); - } - - @override - Widget build(BuildContext context) { - final CircleId? selectedId = selectedCircle; - return Column( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - Center( - child: SizedBox( - width: 350.0, - height: 300.0, - child: ExampleGoogleMap( - initialCameraPosition: const CameraPosition( - target: LatLng(52.4478, -3.5402), - zoom: 7.0, - ), - circles: Set.of(circles.values), - onMapCreated: _onMapCreated, - ), - ), - ), - Expanded( - child: SingleChildScrollView( - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - Row( - children: [ - Column( - children: [ - TextButton( - onPressed: _add, - child: const Text('add'), - ), - TextButton( - onPressed: (selectedId == null) - ? null - : () => _remove(selectedId), - child: const Text('remove'), - ), - TextButton( - onPressed: (selectedId == null) - ? null - : () => _toggleVisible(selectedId), - child: const Text('toggle visible'), - ), - ], - ), - Column( - children: [ - TextButton( - onPressed: (selectedId == null) - ? null - : () => _changeStrokeWidth(selectedId), - child: const Text('change stroke width'), - ), - TextButton( - onPressed: (selectedId == null) - ? null - : () => _changeStrokeColor(selectedId), - child: const Text('change stroke color'), - ), - TextButton( - onPressed: (selectedId == null) - ? null - : () => _changeFillColor(selectedId), - child: const Text('change fill color'), - ), - ], - ) - ], - ) - ], - ), - ), - ), - ], - ); - } - - LatLng _createCenter() { - final double offset = _circleIdCounter.ceilToDouble(); - return _createLatLng(51.4816 + offset * 0.2, -3.1791); - } - - LatLng _createLatLng(double lat, double lng) { - return LatLng(lat, lng); - } -} diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/place_marker.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/place_marker.dart deleted file mode 100644 index 9cba4975d40..00000000000 --- a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/place_marker.dart +++ /dev/null @@ -1,421 +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. - -// ignore_for_file: public_member_api_docs - -import 'dart:async'; -import 'dart:math'; -import 'dart:typed_data'; -import 'dart:ui'; - -import 'package:flutter/material.dart'; -import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart'; - -import 'example_google_map.dart'; -import 'page.dart'; - -class PlaceMarkerPage extends GoogleMapExampleAppPage { - const PlaceMarkerPage({Key? key}) - : super(const Icon(Icons.place), 'Place marker', key: key); - - @override - Widget build(BuildContext context) { - return const PlaceMarkerBody(); - } -} - -class PlaceMarkerBody extends StatefulWidget { - const PlaceMarkerBody({super.key}); - - @override - State createState() => PlaceMarkerBodyState(); -} - -typedef MarkerUpdateAction = Marker Function(Marker marker); - -class PlaceMarkerBodyState extends State { - PlaceMarkerBodyState(); - static const LatLng center = LatLng(-33.86711, 151.1947171); - - ExampleGoogleMapController? controller; - Map markers = {}; - MarkerId? selectedMarker; - int _markerIdCounter = 1; - LatLng? markerPosition; - - // ignore: use_setters_to_change_properties - void _onMapCreated(ExampleGoogleMapController controller) { - this.controller = controller; - } - - @override - void dispose() { - super.dispose(); - } - - void _onMarkerTapped(MarkerId markerId) { - final Marker? tappedMarker = markers[markerId]; - if (tappedMarker != null) { - setState(() { - final MarkerId? previousMarkerId = selectedMarker; - if (previousMarkerId != null && markers.containsKey(previousMarkerId)) { - final Marker resetOld = markers[previousMarkerId]! - .copyWith(iconParam: BitmapDescriptor.defaultMarker); - markers[previousMarkerId] = resetOld; - } - selectedMarker = markerId; - final Marker newMarker = tappedMarker.copyWith( - iconParam: BitmapDescriptor.defaultMarkerWithHue( - BitmapDescriptor.hueGreen, - ), - ); - markers[markerId] = newMarker; - - markerPosition = null; - }); - } - } - - Future _onMarkerDrag(MarkerId markerId, LatLng newPosition) async { - setState(() { - markerPosition = newPosition; - }); - } - - Future _onMarkerDragEnd(MarkerId markerId, LatLng newPosition) async { - final Marker? tappedMarker = markers[markerId]; - if (tappedMarker != null) { - setState(() { - markerPosition = null; - }); - await showDialog( - context: context, - builder: (BuildContext context) { - return AlertDialog( - actions: [ - TextButton( - child: const Text('OK'), - onPressed: () => Navigator.of(context).pop(), - ) - ], - content: Padding( - padding: const EdgeInsets.symmetric(vertical: 66), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Text('Old position: ${tappedMarker.position}'), - Text('New position: $newPosition'), - ], - ))); - }); - } - } - - void _add() { - final int markerCount = markers.length; - - if (markerCount == 12) { - return; - } - - final String markerIdVal = 'marker_id_$_markerIdCounter'; - _markerIdCounter++; - final MarkerId markerId = MarkerId(markerIdVal); - - final Marker marker = Marker( - markerId: markerId, - position: LatLng( - center.latitude + sin(_markerIdCounter * pi / 6.0) / 20.0, - center.longitude + cos(_markerIdCounter * pi / 6.0) / 20.0, - ), - infoWindow: InfoWindow(title: markerIdVal, snippet: '*'), - onTap: () => _onMarkerTapped(markerId), - onDragEnd: (LatLng position) => _onMarkerDragEnd(markerId, position), - onDrag: (LatLng position) => _onMarkerDrag(markerId, position), - ); - - setState(() { - markers[markerId] = marker; - }); - } - - void _remove(MarkerId markerId) { - setState(() { - if (markers.containsKey(markerId)) { - markers.remove(markerId); - } - }); - } - - void _changePosition(MarkerId markerId) { - final Marker marker = markers[markerId]!; - final LatLng current = marker.position; - final Offset offset = Offset( - center.latitude - current.latitude, - center.longitude - current.longitude, - ); - setState(() { - markers[markerId] = marker.copyWith( - positionParam: LatLng( - center.latitude + offset.dy, - center.longitude + offset.dx, - ), - ); - }); - } - - void _changeAnchor(MarkerId markerId) { - final Marker marker = markers[markerId]!; - final Offset currentAnchor = marker.anchor; - final Offset newAnchor = Offset(1.0 - currentAnchor.dy, currentAnchor.dx); - setState(() { - markers[markerId] = marker.copyWith( - anchorParam: newAnchor, - ); - }); - } - - Future _changeInfoAnchor(MarkerId markerId) async { - final Marker marker = markers[markerId]!; - final Offset currentAnchor = marker.infoWindow.anchor; - final Offset newAnchor = Offset(1.0 - currentAnchor.dy, currentAnchor.dx); - setState(() { - markers[markerId] = marker.copyWith( - infoWindowParam: marker.infoWindow.copyWith( - anchorParam: newAnchor, - ), - ); - }); - } - - Future _toggleDraggable(MarkerId markerId) async { - final Marker marker = markers[markerId]!; - setState(() { - markers[markerId] = marker.copyWith( - draggableParam: !marker.draggable, - ); - }); - } - - Future _toggleFlat(MarkerId markerId) async { - final Marker marker = markers[markerId]!; - setState(() { - markers[markerId] = marker.copyWith( - flatParam: !marker.flat, - ); - }); - } - - Future _changeInfo(MarkerId markerId) async { - final Marker marker = markers[markerId]!; - final String newSnippet = '${marker.infoWindow.snippet!}*'; - setState(() { - markers[markerId] = marker.copyWith( - infoWindowParam: marker.infoWindow.copyWith( - snippetParam: newSnippet, - ), - ); - }); - } - - Future _changeAlpha(MarkerId markerId) async { - final Marker marker = markers[markerId]!; - final double current = marker.alpha; - setState(() { - markers[markerId] = marker.copyWith( - alphaParam: current < 0.1 ? 1.0 : current * 0.75, - ); - }); - } - - Future _changeRotation(MarkerId markerId) async { - final Marker marker = markers[markerId]!; - final double current = marker.rotation; - setState(() { - markers[markerId] = marker.copyWith( - rotationParam: current == 330.0 ? 0.0 : current + 30.0, - ); - }); - } - - Future _toggleVisible(MarkerId markerId) async { - final Marker marker = markers[markerId]!; - setState(() { - markers[markerId] = marker.copyWith( - visibleParam: !marker.visible, - ); - }); - } - - Future _changeZIndex(MarkerId markerId) async { - final Marker marker = markers[markerId]!; - final double current = marker.zIndex; - setState(() { - markers[markerId] = marker.copyWith( - zIndexParam: current == 12.0 ? 0.0 : current + 1.0, - ); - }); - } - - void _setMarkerIcon(MarkerId markerId, BitmapDescriptor assetIcon) { - final Marker marker = markers[markerId]!; - setState(() { - markers[markerId] = marker.copyWith( - iconParam: assetIcon, - ); - }); - } - - Future _getAssetIcon(BuildContext context) async { - final Completer bitmapIcon = - Completer(); - final ImageConfiguration config = createLocalImageConfiguration(context); - - const AssetImage('assets/red_square.png') - .resolve(config) - .addListener(ImageStreamListener((ImageInfo image, bool sync) async { - final ByteData? bytes = - await image.image.toByteData(format: ImageByteFormat.png); - if (bytes == null) { - bitmapIcon.completeError(Exception('Unable to encode icon')); - return; - } - final BitmapDescriptor bitmap = - BitmapDescriptor.fromBytes(bytes.buffer.asUint8List()); - bitmapIcon.complete(bitmap); - })); - - return bitmapIcon.future; - } - - @override - Widget build(BuildContext context) { - final MarkerId? selectedId = selectedMarker; - return Stack(children: [ - Column( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - Expanded( - child: ExampleGoogleMap( - onMapCreated: _onMapCreated, - initialCameraPosition: const CameraPosition( - target: LatLng(-33.852, 151.211), - zoom: 11.0, - ), - markers: Set.of(markers.values), - ), - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - TextButton( - onPressed: _add, - child: const Text('Add'), - ), - TextButton( - onPressed: - selectedId == null ? null : () => _remove(selectedId), - child: const Text('Remove'), - ), - ], - ), - Wrap( - alignment: WrapAlignment.spaceEvenly, - children: [ - TextButton( - onPressed: - selectedId == null ? null : () => _changeInfo(selectedId), - child: const Text('change info'), - ), - TextButton( - onPressed: selectedId == null - ? null - : () => _changeInfoAnchor(selectedId), - child: const Text('change info anchor'), - ), - TextButton( - onPressed: - selectedId == null ? null : () => _changeAlpha(selectedId), - child: const Text('change alpha'), - ), - TextButton( - onPressed: - selectedId == null ? null : () => _changeAnchor(selectedId), - child: const Text('change anchor'), - ), - TextButton( - onPressed: selectedId == null - ? null - : () => _toggleDraggable(selectedId), - child: const Text('toggle draggable'), - ), - TextButton( - onPressed: - selectedId == null ? null : () => _toggleFlat(selectedId), - child: const Text('toggle flat'), - ), - TextButton( - onPressed: selectedId == null - ? null - : () => _changePosition(selectedId), - child: const Text('change position'), - ), - TextButton( - onPressed: selectedId == null - ? null - : () => _changeRotation(selectedId), - child: const Text('change rotation'), - ), - TextButton( - onPressed: selectedId == null - ? null - : () => _toggleVisible(selectedId), - child: const Text('toggle visible'), - ), - TextButton( - onPressed: - selectedId == null ? null : () => _changeZIndex(selectedId), - child: const Text('change zIndex'), - ), - TextButton( - onPressed: selectedId == null - ? null - : () { - _getAssetIcon(context).then( - (BitmapDescriptor icon) { - _setMarkerIcon(selectedId, icon); - }, - ); - }, - child: const Text('set marker icon'), - ), - ], - ), - ], - ), - Visibility( - visible: markerPosition != null, - child: Container( - color: Colors.white70, - height: 30, - padding: const EdgeInsets.only(left: 12, right: 12), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - if (markerPosition == null) - Container() - else - Expanded(child: Text('lat: ${markerPosition!.latitude}')), - if (markerPosition == null) - Container() - else - Expanded(child: Text('lng: ${markerPosition!.longitude}')), - ], - ), - ), - ), - ]); - } -} diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/place_polygon.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/place_polygon.dart deleted file mode 100644 index 889c38d6376..00000000000 --- a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/place_polygon.dart +++ /dev/null @@ -1,306 +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. - -// ignore_for_file: public_member_api_docs - -import 'package:flutter/material.dart'; -import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart'; - -import 'example_google_map.dart'; -import 'page.dart'; - -class PlacePolygonPage extends GoogleMapExampleAppPage { - const PlacePolygonPage({Key? key}) - : super(const Icon(Icons.linear_scale), 'Place polygon', key: key); - - @override - Widget build(BuildContext context) { - return const PlacePolygonBody(); - } -} - -class PlacePolygonBody extends StatefulWidget { - const PlacePolygonBody({super.key}); - - @override - State createState() => PlacePolygonBodyState(); -} - -class PlacePolygonBodyState extends State { - PlacePolygonBodyState(); - - ExampleGoogleMapController? controller; - Map polygons = {}; - Map polygonOffsets = {}; - int _polygonIdCounter = 0; - PolygonId? selectedPolygon; - - // Values when toggling polygon color - int strokeColorsIndex = 0; - int fillColorsIndex = 0; - List colors = [ - Colors.purple, - Colors.red, - Colors.green, - Colors.pink, - ]; - - // Values when toggling polygon width - int widthsIndex = 0; - List widths = [10, 20, 5]; - - // ignore: use_setters_to_change_properties - void _onMapCreated(ExampleGoogleMapController controller) { - this.controller = controller; - } - - @override - void dispose() { - super.dispose(); - } - - void _onPolygonTapped(PolygonId polygonId) { - setState(() { - selectedPolygon = polygonId; - }); - } - - void _remove(PolygonId polygonId) { - setState(() { - if (polygons.containsKey(polygonId)) { - polygons.remove(polygonId); - } - selectedPolygon = null; - }); - } - - void _add() { - final int polygonCount = polygons.length; - - if (polygonCount == 12) { - return; - } - - final String polygonIdVal = 'polygon_id_$_polygonIdCounter'; - final PolygonId polygonId = PolygonId(polygonIdVal); - - final Polygon polygon = Polygon( - polygonId: polygonId, - consumeTapEvents: true, - strokeColor: Colors.orange, - strokeWidth: 5, - fillColor: Colors.green, - points: _createPoints(), - onTap: () { - _onPolygonTapped(polygonId); - }, - ); - - setState(() { - polygons[polygonId] = polygon; - polygonOffsets[polygonId] = _polygonIdCounter.ceilToDouble(); - // increment _polygonIdCounter to have unique polygon id each time - _polygonIdCounter++; - }); - } - - void _toggleGeodesic(PolygonId polygonId) { - final Polygon polygon = polygons[polygonId]!; - setState(() { - polygons[polygonId] = polygon.copyWith( - geodesicParam: !polygon.geodesic, - ); - }); - } - - void _toggleVisible(PolygonId polygonId) { - final Polygon polygon = polygons[polygonId]!; - setState(() { - polygons[polygonId] = polygon.copyWith( - visibleParam: !polygon.visible, - ); - }); - } - - void _changeStrokeColor(PolygonId polygonId) { - final Polygon polygon = polygons[polygonId]!; - setState(() { - polygons[polygonId] = polygon.copyWith( - strokeColorParam: colors[++strokeColorsIndex % colors.length], - ); - }); - } - - void _changeFillColor(PolygonId polygonId) { - final Polygon polygon = polygons[polygonId]!; - setState(() { - polygons[polygonId] = polygon.copyWith( - fillColorParam: colors[++fillColorsIndex % colors.length], - ); - }); - } - - void _changeWidth(PolygonId polygonId) { - final Polygon polygon = polygons[polygonId]!; - setState(() { - polygons[polygonId] = polygon.copyWith( - strokeWidthParam: widths[++widthsIndex % widths.length], - ); - }); - } - - void _addHoles(PolygonId polygonId) { - final Polygon polygon = polygons[polygonId]!; - setState(() { - polygons[polygonId] = - polygon.copyWith(holesParam: _createHoles(polygonId)); - }); - } - - void _removeHoles(PolygonId polygonId) { - final Polygon polygon = polygons[polygonId]!; - setState(() { - polygons[polygonId] = polygon.copyWith( - holesParam: >[], - ); - }); - } - - @override - Widget build(BuildContext context) { - final PolygonId? selectedId = selectedPolygon; - return Column( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - Center( - child: SizedBox( - width: 350.0, - height: 300.0, - child: ExampleGoogleMap( - initialCameraPosition: const CameraPosition( - target: LatLng(52.4478, -3.5402), - zoom: 7.0, - ), - polygons: Set.of(polygons.values), - onMapCreated: _onMapCreated, - ), - ), - ), - Expanded( - child: SingleChildScrollView( - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - Row( - children: [ - Column( - children: [ - TextButton( - onPressed: _add, - child: const Text('add'), - ), - TextButton( - onPressed: (selectedId == null) - ? null - : () => _remove(selectedId), - child: const Text('remove'), - ), - TextButton( - onPressed: (selectedId == null) - ? null - : () => _toggleVisible(selectedId), - child: const Text('toggle visible'), - ), - TextButton( - onPressed: (selectedId == null) - ? null - : () => _toggleGeodesic(selectedId), - child: const Text('toggle geodesic'), - ), - ], - ), - Column( - children: [ - TextButton( - onPressed: (selectedId == null) - ? null - : ((polygons[selectedId]!.holes.isNotEmpty) - ? null - : () => _addHoles(selectedId)), - child: const Text('add holes'), - ), - TextButton( - onPressed: (selectedId == null) - ? null - : ((polygons[selectedId]!.holes.isEmpty) - ? null - : () => _removeHoles(selectedId)), - child: const Text('remove holes'), - ), - TextButton( - onPressed: (selectedId == null) - ? null - : () => _changeWidth(selectedId), - child: const Text('change stroke width'), - ), - TextButton( - onPressed: (selectedId == null) - ? null - : () => _changeStrokeColor(selectedId), - child: const Text('change stroke color'), - ), - TextButton( - onPressed: (selectedId == null) - ? null - : () => _changeFillColor(selectedId), - child: const Text('change fill color'), - ), - ], - ) - ], - ) - ], - ), - ), - ), - ], - ); - } - - List _createPoints() { - final List points = []; - final double offset = _polygonIdCounter.ceilToDouble(); - points.add(_createLatLng(51.2395 + offset, -3.4314)); - points.add(_createLatLng(53.5234 + offset, -3.5314)); - points.add(_createLatLng(52.4351 + offset, -4.5235)); - points.add(_createLatLng(52.1231 + offset, -5.0829)); - return points; - } - - List> _createHoles(PolygonId polygonId) { - final List> holes = >[]; - final double offset = polygonOffsets[polygonId]!; - - final List hole1 = []; - hole1.add(_createLatLng(51.8395 + offset, -3.8814)); - hole1.add(_createLatLng(52.0234 + offset, -3.9914)); - hole1.add(_createLatLng(52.1351 + offset, -4.4435)); - hole1.add(_createLatLng(52.0231 + offset, -4.5829)); - holes.add(hole1); - - final List hole2 = []; - hole2.add(_createLatLng(52.2395 + offset, -3.6814)); - hole2.add(_createLatLng(52.4234 + offset, -3.7914)); - hole2.add(_createLatLng(52.5351 + offset, -4.2435)); - hole2.add(_createLatLng(52.4231 + offset, -4.3829)); - holes.add(hole2); - - return holes; - } - - LatLng _createLatLng(double lat, double lng) { - return LatLng(lat, lng); - } -} diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/place_polyline.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/place_polyline.dart deleted file mode 100644 index 659ef87e87f..00000000000 --- a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/place_polyline.dart +++ /dev/null @@ -1,325 +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. - -// ignore_for_file: public_member_api_docs - -import 'package:flutter/foundation.dart'; -import 'package:flutter/material.dart'; -import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart'; - -import 'example_google_map.dart'; -import 'page.dart'; - -class PlacePolylinePage extends GoogleMapExampleAppPage { - const PlacePolylinePage({Key? key}) - : super(const Icon(Icons.linear_scale), 'Place polyline', key: key); - - @override - Widget build(BuildContext context) { - return const PlacePolylineBody(); - } -} - -class PlacePolylineBody extends StatefulWidget { - const PlacePolylineBody({super.key}); - - @override - State createState() => PlacePolylineBodyState(); -} - -class PlacePolylineBodyState extends State { - PlacePolylineBodyState(); - - ExampleGoogleMapController? controller; - Map polylines = {}; - int _polylineIdCounter = 0; - PolylineId? selectedPolyline; - - // Values when toggling polyline color - int colorsIndex = 0; - List colors = [ - Colors.purple, - Colors.red, - Colors.green, - Colors.pink, - ]; - - // Values when toggling polyline width - int widthsIndex = 0; - List widths = [10, 20, 5]; - - int jointTypesIndex = 0; - List jointTypes = [ - JointType.mitered, - JointType.bevel, - JointType.round - ]; - - // Values when toggling polyline end cap type - int endCapsIndex = 0; - List endCaps = [Cap.buttCap, Cap.squareCap, Cap.roundCap]; - - // Values when toggling polyline start cap type - int startCapsIndex = 0; - List startCaps = [Cap.buttCap, Cap.squareCap, Cap.roundCap]; - - // Values when toggling polyline pattern - int patternsIndex = 0; - List> patterns = >[ - [], - [ - PatternItem.dash(30.0), - PatternItem.gap(20.0), - PatternItem.dot, - PatternItem.gap(20.0) - ], - [PatternItem.dash(30.0), PatternItem.gap(20.0)], - [PatternItem.dot, PatternItem.gap(10.0)], - ]; - - // ignore: use_setters_to_change_properties - void _onMapCreated(ExampleGoogleMapController controller) { - this.controller = controller; - } - - @override - void dispose() { - super.dispose(); - } - - void _onPolylineTapped(PolylineId polylineId) { - setState(() { - selectedPolyline = polylineId; - }); - } - - void _remove(PolylineId polylineId) { - setState(() { - if (polylines.containsKey(polylineId)) { - polylines.remove(polylineId); - } - selectedPolyline = null; - }); - } - - void _add() { - final int polylineCount = polylines.length; - - if (polylineCount == 12) { - return; - } - - final String polylineIdVal = 'polyline_id_$_polylineIdCounter'; - _polylineIdCounter++; - final PolylineId polylineId = PolylineId(polylineIdVal); - - final Polyline polyline = Polyline( - polylineId: polylineId, - consumeTapEvents: true, - color: Colors.orange, - width: 5, - points: _createPoints(), - onTap: () { - _onPolylineTapped(polylineId); - }, - ); - - setState(() { - polylines[polylineId] = polyline; - }); - } - - void _toggleGeodesic(PolylineId polylineId) { - final Polyline polyline = polylines[polylineId]!; - setState(() { - polylines[polylineId] = polyline.copyWith( - geodesicParam: !polyline.geodesic, - ); - }); - } - - void _toggleVisible(PolylineId polylineId) { - final Polyline polyline = polylines[polylineId]!; - setState(() { - polylines[polylineId] = polyline.copyWith( - visibleParam: !polyline.visible, - ); - }); - } - - void _changeColor(PolylineId polylineId) { - final Polyline polyline = polylines[polylineId]!; - setState(() { - polylines[polylineId] = polyline.copyWith( - colorParam: colors[++colorsIndex % colors.length], - ); - }); - } - - void _changeWidth(PolylineId polylineId) { - final Polyline polyline = polylines[polylineId]!; - setState(() { - polylines[polylineId] = polyline.copyWith( - widthParam: widths[++widthsIndex % widths.length], - ); - }); - } - - void _changeJointType(PolylineId polylineId) { - final Polyline polyline = polylines[polylineId]!; - setState(() { - polylines[polylineId] = polyline.copyWith( - jointTypeParam: jointTypes[++jointTypesIndex % jointTypes.length], - ); - }); - } - - void _changeEndCap(PolylineId polylineId) { - final Polyline polyline = polylines[polylineId]!; - setState(() { - polylines[polylineId] = polyline.copyWith( - endCapParam: endCaps[++endCapsIndex % endCaps.length], - ); - }); - } - - void _changeStartCap(PolylineId polylineId) { - final Polyline polyline = polylines[polylineId]!; - setState(() { - polylines[polylineId] = polyline.copyWith( - startCapParam: startCaps[++startCapsIndex % startCaps.length], - ); - }); - } - - void _changePattern(PolylineId polylineId) { - final Polyline polyline = polylines[polylineId]!; - setState(() { - polylines[polylineId] = polyline.copyWith( - patternsParam: patterns[++patternsIndex % patterns.length], - ); - }); - } - - @override - Widget build(BuildContext context) { - final bool isIOS = !kIsWeb && defaultTargetPlatform == TargetPlatform.iOS; - - final PolylineId? selectedId = selectedPolyline; - - return Column( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - Center( - child: SizedBox( - width: 350.0, - height: 300.0, - child: ExampleGoogleMap( - initialCameraPosition: const CameraPosition( - target: LatLng(53.1721, -3.5402), - zoom: 7.0, - ), - polylines: Set.of(polylines.values), - onMapCreated: _onMapCreated, - ), - ), - ), - Expanded( - child: SingleChildScrollView( - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - Row( - children: [ - Column( - children: [ - TextButton( - onPressed: _add, - child: const Text('add'), - ), - TextButton( - onPressed: (selectedId == null) - ? null - : () => _remove(selectedId), - child: const Text('remove'), - ), - TextButton( - onPressed: (selectedId == null) - ? null - : () => _toggleVisible(selectedId), - child: const Text('toggle visible'), - ), - TextButton( - onPressed: (selectedId == null) - ? null - : () => _toggleGeodesic(selectedId), - child: const Text('toggle geodesic'), - ), - ], - ), - Column( - children: [ - TextButton( - onPressed: (selectedId == null) - ? null - : () => _changeWidth(selectedId), - child: const Text('change width'), - ), - TextButton( - onPressed: (selectedId == null) - ? null - : () => _changeColor(selectedId), - child: const Text('change color'), - ), - TextButton( - onPressed: isIOS || (selectedId == null) - ? null - : () => _changeStartCap(selectedId), - child: const Text('change start cap [Android only]'), - ), - TextButton( - onPressed: isIOS || (selectedId == null) - ? null - : () => _changeEndCap(selectedId), - child: const Text('change end cap [Android only]'), - ), - TextButton( - onPressed: isIOS || (selectedId == null) - ? null - : () => _changeJointType(selectedId), - child: const Text('change joint type [Android only]'), - ), - TextButton( - onPressed: isIOS || (selectedId == null) - ? null - : () => _changePattern(selectedId), - child: const Text('change pattern [Android only]'), - ), - ], - ) - ], - ) - ], - ), - ), - ), - ], - ); - } - - List _createPoints() { - final List points = []; - final double offset = _polylineIdCounter.ceilToDouble(); - points.add(_createLatLng(51.4816 + offset, -3.1791)); - points.add(_createLatLng(53.0430 + offset, -2.9925)); - points.add(_createLatLng(53.1396 + offset, -4.2739)); - points.add(_createLatLng(52.4153 + offset, -4.0829)); - return points; - } - - LatLng _createLatLng(double lat, double lng) { - return LatLng(lat, lng); - } -} diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/scrolling_map.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/scrolling_map.dart deleted file mode 100644 index a4901f2ce5f..00000000000 --- a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/scrolling_map.dart +++ /dev/null @@ -1,114 +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. - -// ignore_for_file: public_member_api_docs - -import 'package:flutter/foundation.dart'; -import 'package:flutter/gestures.dart'; -import 'package:flutter/material.dart'; -import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart'; - -import 'example_google_map.dart'; -import 'page.dart'; - -const LatLng _center = LatLng(32.080664, 34.9563837); - -class ScrollingMapPage extends GoogleMapExampleAppPage { - const ScrollingMapPage({Key? key}) - : super(const Icon(Icons.map), 'Scrolling map', key: key); - - @override - Widget build(BuildContext context) { - return const ScrollingMapBody(); - } -} - -class ScrollingMapBody extends StatelessWidget { - const ScrollingMapBody({super.key}); - - @override - Widget build(BuildContext context) { - return ListView( - children: [ - Card( - child: Padding( - padding: const EdgeInsets.symmetric(vertical: 30.0), - child: Column( - children: [ - const Padding( - padding: EdgeInsets.only(bottom: 12.0), - child: Text('This map consumes all touch events.'), - ), - Center( - child: SizedBox( - width: 300.0, - height: 300.0, - child: ExampleGoogleMap( - initialCameraPosition: const CameraPosition( - target: _center, - zoom: 11.0, - ), - gestureRecognizers: // - >{ - Factory( - () => EagerGestureRecognizer(), - ), - }, - ), - ), - ), - ], - ), - ), - ), - Card( - child: Padding( - padding: const EdgeInsets.symmetric(vertical: 30.0), - child: Column( - children: [ - const Text("This map doesn't consume the vertical drags."), - const Padding( - padding: EdgeInsets.only(bottom: 12.0), - child: - Text('It still gets other gestures (e.g scale or tap).'), - ), - Center( - child: SizedBox( - width: 300.0, - height: 300.0, - child: ExampleGoogleMap( - initialCameraPosition: const CameraPosition( - target: _center, - zoom: 11.0, - ), - markers: { - Marker( - markerId: const MarkerId('test_marker_id'), - position: LatLng( - _center.latitude, - _center.longitude, - ), - infoWindow: const InfoWindow( - title: 'An interesting location', - snippet: '*', - ), - ), - }, - gestureRecognizers: >{ - Factory( - () => ScaleGestureRecognizer(), - ), - }, - ), - ), - ), - ], - ), - ), - ), - ], - ); - } -} diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/snapshot.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/snapshot.dart deleted file mode 100644 index 56a90a8e49f..00000000000 --- a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/snapshot.dart +++ /dev/null @@ -1,76 +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. - -// ignore_for_file: public_member_api_docs - -import 'dart:typed_data'; - -import 'package:flutter/material.dart'; -import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart'; - -import 'example_google_map.dart'; -import 'page.dart'; - -const CameraPosition _kInitialPosition = - CameraPosition(target: LatLng(-33.852, 151.211), zoom: 11.0); - -class SnapshotPage extends GoogleMapExampleAppPage { - const SnapshotPage({Key? key}) - : super(const Icon(Icons.camera_alt), 'Take a snapshot of the map', - key: key); - - @override - Widget build(BuildContext context) { - return _SnapshotBody(); - } -} - -class _SnapshotBody extends StatefulWidget { - @override - _SnapshotBodyState createState() => _SnapshotBodyState(); -} - -class _SnapshotBodyState extends State<_SnapshotBody> { - ExampleGoogleMapController? _mapController; - Uint8List? _imageBytes; - - @override - Widget build(BuildContext context) { - return Padding( - padding: const EdgeInsets.all(16), - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - SizedBox( - height: 180, - child: ExampleGoogleMap( - onMapCreated: onMapCreated, - initialCameraPosition: _kInitialPosition, - ), - ), - TextButton( - child: const Text('Take a snapshot'), - onPressed: () async { - final Uint8List? imageBytes = - await _mapController?.takeSnapshot(); - setState(() { - _imageBytes = imageBytes; - }); - }, - ), - Container( - decoration: BoxDecoration(color: Colors.blueGrey[50]), - height: 180, - child: _imageBytes != null ? Image.memory(_imageBytes!) : null, - ), - ], - ), - ); - } - - // ignore: use_setters_to_change_properties - void onMapCreated(ExampleGoogleMapController controller) { - _mapController = controller; - } -} diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/tile_overlay.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/tile_overlay.dart deleted file mode 100644 index 9122fda76ce..00000000000 --- a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/lib/tile_overlay.dart +++ /dev/null @@ -1,154 +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. - -// ignore_for_file: public_member_api_docs - -import 'dart:typed_data'; -import 'dart:ui' as ui; - -import 'package:flutter/material.dart'; -import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart'; - -import 'example_google_map.dart'; -import 'page.dart'; - -class TileOverlayPage extends GoogleMapExampleAppPage { - const TileOverlayPage({Key? key}) - : super(const Icon(Icons.map), 'Tile overlay', key: key); - - @override - Widget build(BuildContext context) { - return const TileOverlayBody(); - } -} - -class TileOverlayBody extends StatefulWidget { - const TileOverlayBody({super.key}); - - @override - State createState() => TileOverlayBodyState(); -} - -class TileOverlayBodyState extends State { - TileOverlayBodyState(); - - ExampleGoogleMapController? controller; - TileOverlay? _tileOverlay; - - // ignore: use_setters_to_change_properties - void _onMapCreated(ExampleGoogleMapController controller) { - this.controller = controller; - } - - @override - void dispose() { - super.dispose(); - } - - void _removeTileOverlay() { - setState(() { - _tileOverlay = null; - }); - } - - void _addTileOverlay() { - final TileOverlay tileOverlay = TileOverlay( - tileOverlayId: const TileOverlayId('tile_overlay_1'), - tileProvider: _DebugTileProvider(), - ); - setState(() { - _tileOverlay = tileOverlay; - }); - } - - void _clearTileCache() { - if (_tileOverlay != null && controller != null) { - controller!.clearTileCache(_tileOverlay!.tileOverlayId); - } - } - - @override - Widget build(BuildContext context) { - final Set overlays = { - if (_tileOverlay != null) _tileOverlay!, - }; - return Column( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - Center( - child: SizedBox( - width: 350.0, - height: 300.0, - child: ExampleGoogleMap( - initialCameraPosition: const CameraPosition( - target: LatLng(59.935460, 30.325177), - zoom: 7.0, - ), - tileOverlays: overlays, - onMapCreated: _onMapCreated, - ), - ), - ), - TextButton( - onPressed: _addTileOverlay, - child: const Text('Add tile overlay'), - ), - TextButton( - onPressed: _removeTileOverlay, - child: const Text('Remove tile overlay'), - ), - TextButton( - onPressed: _clearTileCache, - child: const Text('Clear tile cache'), - ), - ], - ); - } -} - -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/ios12/pubspec.yaml b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/pubspec.yaml index e8a456358e7..f34109a26fd 100644 --- a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/pubspec.yaml +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/pubspec.yaml @@ -19,6 +19,8 @@ dependencies: # the parent directory to use the current plugin's version. path: ../../ google_maps_flutter_platform_interface: ^2.2.1 + maps_example_dart: + path: ../shared/maps_example_dart/ dev_dependencies: flutter_driver: diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/animate_camera.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/animate_camera.dart deleted file mode 100644 index c77f9ededac..00000000000 --- a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/animate_camera.dart +++ /dev/null @@ -1,171 +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. - -// ignore_for_file: public_member_api_docs - -import 'package:flutter/material.dart'; -import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart'; - -import 'example_google_map.dart'; -import 'page.dart'; - -class AnimateCameraPage extends GoogleMapExampleAppPage { - const AnimateCameraPage({Key? key}) - : super(const Icon(Icons.map), 'Camera control, animated', key: key); - - @override - Widget build(BuildContext context) { - return const AnimateCamera(); - } -} - -class AnimateCamera extends StatefulWidget { - const AnimateCamera({super.key}); - @override - State createState() => AnimateCameraState(); -} - -class AnimateCameraState extends State { - ExampleGoogleMapController? mapController; - - // ignore: use_setters_to_change_properties - void _onMapCreated(ExampleGoogleMapController controller) { - mapController = controller; - } - - @override - Widget build(BuildContext context) { - return Column( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - Center( - child: SizedBox( - width: 300.0, - height: 200.0, - child: ExampleGoogleMap( - onMapCreated: _onMapCreated, - initialCameraPosition: - const CameraPosition(target: LatLng(0.0, 0.0)), - ), - ), - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - Column( - children: [ - TextButton( - onPressed: () { - mapController?.animateCamera( - CameraUpdate.newCameraPosition( - const CameraPosition( - bearing: 270.0, - target: LatLng(51.5160895, -0.1294527), - tilt: 30.0, - zoom: 17.0, - ), - ), - ); - }, - child: const Text('newCameraPosition'), - ), - TextButton( - onPressed: () { - mapController?.animateCamera( - CameraUpdate.newLatLng( - const LatLng(56.1725505, 10.1850512), - ), - ); - }, - child: const Text('newLatLng'), - ), - TextButton( - onPressed: () { - mapController?.animateCamera( - CameraUpdate.newLatLngBounds( - LatLngBounds( - southwest: const LatLng(-38.483935, 113.248673), - northeast: const LatLng(-8.982446, 153.823821), - ), - 10.0, - ), - ); - }, - child: const Text('newLatLngBounds'), - ), - TextButton( - onPressed: () { - mapController?.animateCamera( - CameraUpdate.newLatLngZoom( - const LatLng(37.4231613, -122.087159), - 11.0, - ), - ); - }, - child: const Text('newLatLngZoom'), - ), - TextButton( - onPressed: () { - mapController?.animateCamera( - CameraUpdate.scrollBy(150.0, -225.0), - ); - }, - child: const Text('scrollBy'), - ), - ], - ), - Column( - children: [ - TextButton( - onPressed: () { - mapController?.animateCamera( - CameraUpdate.zoomBy( - -0.5, - const Offset(30.0, 20.0), - ), - ); - }, - child: const Text('zoomBy with focus'), - ), - TextButton( - onPressed: () { - mapController?.animateCamera( - CameraUpdate.zoomBy(-0.5), - ); - }, - child: const Text('zoomBy'), - ), - TextButton( - onPressed: () { - mapController?.animateCamera( - CameraUpdate.zoomIn(), - ); - }, - child: const Text('zoomIn'), - ), - TextButton( - onPressed: () { - mapController?.animateCamera( - CameraUpdate.zoomOut(), - ); - }, - child: const Text('zoomOut'), - ), - TextButton( - onPressed: () { - mapController?.animateCamera( - CameraUpdate.zoomTo(16.0), - ); - }, - child: const Text('zoomTo'), - ), - ], - ), - ], - ) - ], - ); - } -} diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/example_google_map.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/example_google_map.dart deleted file mode 100644 index e0817a55f28..00000000000 --- a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/example_google_map.dart +++ /dev/null @@ -1,538 +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'; -// TODO(a14n): remove this import once Flutter 3.1 or later reaches stable (including flutter/flutter#104231) -// ignore: unnecessary_import -import 'dart:typed_data'; - -import 'package:flutter/foundation.dart'; -import 'package:flutter/gestures.dart'; -import 'package:flutter/material.dart'; -import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart'; - -// This is a pared down version of the Dart code from the app-facing package, -// to allow running the same examples for package-local testing. -// TODO(stuartmorgan): Consider extracting this to a shared package. See also -// https://github.com/flutter/flutter/issues/46716. - -/// Controller for a single ExampleGoogleMap instance running on the host platform. -class ExampleGoogleMapController { - ExampleGoogleMapController._( - this._googleMapState, { - required this.mapId, - }) { - _connectStreams(mapId); - } - - /// The mapId for this controller - final int mapId; - - /// Initialize control of a [ExampleGoogleMap] with [id]. - /// - /// Mainly for internal use when instantiating a [ExampleGoogleMapController] passed - /// in [ExampleGoogleMap.onMapCreated] callback. - static Future _init( - int id, - CameraPosition initialCameraPosition, - _ExampleGoogleMapState googleMapState, - ) async { - await GoogleMapsFlutterPlatform.instance.init(id); - return ExampleGoogleMapController._( - googleMapState, - mapId: id, - ); - } - - final _ExampleGoogleMapState _googleMapState; - - void _connectStreams(int mapId) { - if (_googleMapState.widget.onCameraMoveStarted != null) { - GoogleMapsFlutterPlatform.instance - .onCameraMoveStarted(mapId: mapId) - .listen((_) => _googleMapState.widget.onCameraMoveStarted!()); - } - if (_googleMapState.widget.onCameraMove != null) { - GoogleMapsFlutterPlatform.instance.onCameraMove(mapId: mapId).listen( - (CameraMoveEvent e) => _googleMapState.widget.onCameraMove!(e.value)); - } - if (_googleMapState.widget.onCameraIdle != null) { - GoogleMapsFlutterPlatform.instance - .onCameraIdle(mapId: mapId) - .listen((_) => _googleMapState.widget.onCameraIdle!()); - } - GoogleMapsFlutterPlatform.instance - .onMarkerTap(mapId: mapId) - .listen((MarkerTapEvent e) => _googleMapState.onMarkerTap(e.value)); - GoogleMapsFlutterPlatform.instance.onMarkerDragStart(mapId: mapId).listen( - (MarkerDragStartEvent e) => - _googleMapState.onMarkerDragStart(e.value, e.position)); - GoogleMapsFlutterPlatform.instance.onMarkerDrag(mapId: mapId).listen( - (MarkerDragEvent e) => - _googleMapState.onMarkerDrag(e.value, e.position)); - GoogleMapsFlutterPlatform.instance.onMarkerDragEnd(mapId: mapId).listen( - (MarkerDragEndEvent e) => - _googleMapState.onMarkerDragEnd(e.value, e.position)); - GoogleMapsFlutterPlatform.instance.onInfoWindowTap(mapId: mapId).listen( - (InfoWindowTapEvent e) => _googleMapState.onInfoWindowTap(e.value)); - GoogleMapsFlutterPlatform.instance - .onPolylineTap(mapId: mapId) - .listen((PolylineTapEvent e) => _googleMapState.onPolylineTap(e.value)); - GoogleMapsFlutterPlatform.instance - .onPolygonTap(mapId: mapId) - .listen((PolygonTapEvent e) => _googleMapState.onPolygonTap(e.value)); - GoogleMapsFlutterPlatform.instance - .onCircleTap(mapId: mapId) - .listen((CircleTapEvent e) => _googleMapState.onCircleTap(e.value)); - GoogleMapsFlutterPlatform.instance - .onTap(mapId: mapId) - .listen((MapTapEvent e) => _googleMapState.onTap(e.position)); - GoogleMapsFlutterPlatform.instance.onLongPress(mapId: mapId).listen( - (MapLongPressEvent e) => _googleMapState.onLongPress(e.position)); - } - - /// Updates configuration options of the map user interface. - Future _updateMapConfiguration(MapConfiguration update) { - return GoogleMapsFlutterPlatform.instance - .updateMapConfiguration(update, mapId: mapId); - } - - /// Updates marker configuration. - Future _updateMarkers(MarkerUpdates markerUpdates) { - return GoogleMapsFlutterPlatform.instance - .updateMarkers(markerUpdates, mapId: mapId); - } - - /// Updates polygon configuration. - Future _updatePolygons(PolygonUpdates polygonUpdates) { - return GoogleMapsFlutterPlatform.instance - .updatePolygons(polygonUpdates, mapId: mapId); - } - - /// Updates polyline configuration. - Future _updatePolylines(PolylineUpdates polylineUpdates) { - return GoogleMapsFlutterPlatform.instance - .updatePolylines(polylineUpdates, mapId: mapId); - } - - /// Updates circle configuration. - Future _updateCircles(CircleUpdates circleUpdates) { - return GoogleMapsFlutterPlatform.instance - .updateCircles(circleUpdates, mapId: mapId); - } - - /// Updates tile overlays configuration. - Future _updateTileOverlays(Set newTileOverlays) { - return GoogleMapsFlutterPlatform.instance - .updateTileOverlays(newTileOverlays: newTileOverlays, mapId: mapId); - } - - /// Clears the tile cache so that all tiles will be requested again from the - /// [TileProvider]. - Future clearTileCache(TileOverlayId tileOverlayId) async { - return GoogleMapsFlutterPlatform.instance - .clearTileCache(tileOverlayId, mapId: mapId); - } - - /// Starts an animated change of the map camera position. - Future animateCamera(CameraUpdate cameraUpdate) { - return GoogleMapsFlutterPlatform.instance - .animateCamera(cameraUpdate, mapId: mapId); - } - - /// Changes the map camera position. - Future moveCamera(CameraUpdate cameraUpdate) { - return GoogleMapsFlutterPlatform.instance - .moveCamera(cameraUpdate, mapId: mapId); - } - - /// Sets the styling of the base map. - Future setMapStyle(String? mapStyle) { - return GoogleMapsFlutterPlatform.instance - .setMapStyle(mapStyle, mapId: mapId); - } - - /// Return [LatLngBounds] defining the region that is visible in a map. - Future getVisibleRegion() { - return GoogleMapsFlutterPlatform.instance.getVisibleRegion(mapId: mapId); - } - - /// Return [ScreenCoordinate] of the [LatLng] in the current map view. - Future getScreenCoordinate(LatLng latLng) { - return GoogleMapsFlutterPlatform.instance - .getScreenCoordinate(latLng, mapId: mapId); - } - - /// Returns [LatLng] corresponding to the [ScreenCoordinate] in the current map view. - Future getLatLng(ScreenCoordinate screenCoordinate) { - return GoogleMapsFlutterPlatform.instance - .getLatLng(screenCoordinate, mapId: mapId); - } - - /// Programmatically show the Info Window for a [Marker]. - Future showMarkerInfoWindow(MarkerId markerId) { - return GoogleMapsFlutterPlatform.instance - .showMarkerInfoWindow(markerId, mapId: mapId); - } - - /// Programmatically hide the Info Window for a [Marker]. - Future hideMarkerInfoWindow(MarkerId markerId) { - return GoogleMapsFlutterPlatform.instance - .hideMarkerInfoWindow(markerId, mapId: mapId); - } - - /// Returns `true` when the [InfoWindow] is showing, `false` otherwise. - Future isMarkerInfoWindowShown(MarkerId markerId) { - return GoogleMapsFlutterPlatform.instance - .isMarkerInfoWindowShown(markerId, mapId: mapId); - } - - /// Returns the current zoom level of the map - Future getZoomLevel() { - return GoogleMapsFlutterPlatform.instance.getZoomLevel(mapId: mapId); - } - - /// Returns the image bytes of the map - Future takeSnapshot() { - return GoogleMapsFlutterPlatform.instance.takeSnapshot(mapId: mapId); - } - - /// Disposes of the platform resources - void dispose() { - GoogleMapsFlutterPlatform.instance.dispose(mapId: mapId); - } -} - -// The next map ID to create. -int _nextMapCreationId = 0; - -/// A widget which displays a map with data obtained from the Google Maps service. -class ExampleGoogleMap extends StatefulWidget { - /// Creates a widget displaying data from Google Maps services. - /// - /// [AssertionError] will be thrown if [initialCameraPosition] is null; - const ExampleGoogleMap({ - super.key, - required this.initialCameraPosition, - this.onMapCreated, - this.gestureRecognizers = const >{}, - this.compassEnabled = true, - this.mapToolbarEnabled = true, - this.cameraTargetBounds = CameraTargetBounds.unbounded, - this.mapType = MapType.normal, - this.minMaxZoomPreference = MinMaxZoomPreference.unbounded, - this.rotateGesturesEnabled = true, - this.scrollGesturesEnabled = true, - this.zoomControlsEnabled = true, - this.zoomGesturesEnabled = true, - this.liteModeEnabled = false, - this.tiltGesturesEnabled = true, - this.myLocationEnabled = false, - this.myLocationButtonEnabled = true, - this.layoutDirection, - - /// If no padding is specified default padding will be 0. - this.padding = EdgeInsets.zero, - this.indoorViewEnabled = false, - this.trafficEnabled = false, - this.buildingsEnabled = true, - this.markers = const {}, - this.polygons = const {}, - this.polylines = const {}, - this.circles = const {}, - this.onCameraMoveStarted, - this.tileOverlays = const {}, - this.onCameraMove, - this.onCameraIdle, - this.onTap, - this.onLongPress, - }); - - /// Callback method for when the map is ready to be used. - /// - /// Used to receive a [ExampleGoogleMapController] for this [ExampleGoogleMap]. - final void Function(ExampleGoogleMapController controller)? onMapCreated; - - /// The initial position of the map's camera. - final CameraPosition initialCameraPosition; - - /// True if the map should show a compass when rotated. - final bool compassEnabled; - - /// True if the map should show a toolbar when you interact with the map. Android only. - final bool mapToolbarEnabled; - - /// Geographical bounding box for the camera target. - final CameraTargetBounds cameraTargetBounds; - - /// Type of map tiles to be rendered. - final MapType mapType; - - /// The layout direction to use for the embedded view. - final TextDirection? layoutDirection; - - /// Preferred bounds for the camera zoom level. - /// - /// Actual bounds depend on map data and device. - final MinMaxZoomPreference minMaxZoomPreference; - - /// True if the map view should respond to rotate gestures. - final bool rotateGesturesEnabled; - - /// True if the map view should respond to scroll gestures. - final bool scrollGesturesEnabled; - - /// True if the map view should show zoom controls. This includes two buttons - /// to zoom in and zoom out. The default value is to show zoom controls. - final bool zoomControlsEnabled; - - /// True if the map view should respond to zoom gestures. - final bool zoomGesturesEnabled; - - /// True if the map view should be in lite mode. Android only. - final bool liteModeEnabled; - - /// True if the map view should respond to tilt gestures. - final bool tiltGesturesEnabled; - - /// Padding to be set on map. - final EdgeInsets padding; - - /// Markers to be placed on the map. - final Set markers; - - /// Polygons to be placed on the map. - final Set polygons; - - /// Polylines to be placed on the map. - final Set polylines; - - /// Circles to be placed on the map. - final Set circles; - - /// Tile overlays to be placed on the map. - final Set tileOverlays; - - /// Called when the camera starts moving. - final VoidCallback? onCameraMoveStarted; - - /// Called repeatedly as the camera continues to move after an - /// onCameraMoveStarted call. - final CameraPositionCallback? onCameraMove; - - /// Called when camera movement has ended, there are no pending - /// animations and the user has stopped interacting with the map. - final VoidCallback? onCameraIdle; - - /// Called every time a [ExampleGoogleMap] is tapped. - final ArgumentCallback? onTap; - - /// Called every time a [ExampleGoogleMap] is long pressed. - final ArgumentCallback? onLongPress; - - /// True if a "My Location" layer should be shown on the map. - final bool myLocationEnabled; - - /// Enables or disables the my-location button. - final bool myLocationButtonEnabled; - - /// Enables or disables the indoor view from the map - final bool indoorViewEnabled; - - /// Enables or disables the traffic layer of the map - final bool trafficEnabled; - - /// Enables or disables showing 3D buildings where available - final bool buildingsEnabled; - - /// Which gestures should be consumed by the map. - final Set> gestureRecognizers; - - /// Creates a [State] for this [ExampleGoogleMap]. - @override - State createState() => _ExampleGoogleMapState(); -} - -class _ExampleGoogleMapState extends State { - final int _mapId = _nextMapCreationId++; - - final Completer _controller = - Completer(); - - Map _markers = {}; - Map _polygons = {}; - Map _polylines = {}; - Map _circles = {}; - late MapConfiguration _mapConfiguration; - - @override - Widget build(BuildContext context) { - return GoogleMapsFlutterPlatform.instance.buildViewWithConfiguration( - _mapId, - onPlatformViewCreated, - widgetConfiguration: MapWidgetConfiguration( - textDirection: widget.layoutDirection ?? - Directionality.maybeOf(context) ?? - TextDirection.ltr, - initialCameraPosition: widget.initialCameraPosition, - gestureRecognizers: widget.gestureRecognizers, - ), - mapObjects: MapObjects( - markers: widget.markers, - polygons: widget.polygons, - polylines: widget.polylines, - circles: widget.circles, - ), - mapConfiguration: _mapConfiguration, - ); - } - - @override - void initState() { - super.initState(); - _mapConfiguration = _configurationFromMapWidget(widget); - _markers = keyByMarkerId(widget.markers); - _polygons = keyByPolygonId(widget.polygons); - _polylines = keyByPolylineId(widget.polylines); - _circles = keyByCircleId(widget.circles); - } - - @override - void dispose() { - _controller.future - .then((ExampleGoogleMapController controller) => controller.dispose()); - super.dispose(); - } - - @override - void didUpdateWidget(ExampleGoogleMap oldWidget) { - super.didUpdateWidget(oldWidget); - _updateOptions(); - _updateMarkers(); - _updatePolygons(); - _updatePolylines(); - _updateCircles(); - _updateTileOverlays(); - } - - Future _updateOptions() async { - final MapConfiguration newConfig = _configurationFromMapWidget(widget); - final MapConfiguration updates = newConfig.diffFrom(_mapConfiguration); - if (updates.isEmpty) { - return; - } - final ExampleGoogleMapController controller = await _controller.future; - controller._updateMapConfiguration(updates); - _mapConfiguration = newConfig; - } - - Future _updateMarkers() async { - final ExampleGoogleMapController controller = await _controller.future; - controller._updateMarkers( - MarkerUpdates.from(_markers.values.toSet(), widget.markers)); - _markers = keyByMarkerId(widget.markers); - } - - Future _updatePolygons() async { - final ExampleGoogleMapController controller = await _controller.future; - controller._updatePolygons( - PolygonUpdates.from(_polygons.values.toSet(), widget.polygons)); - _polygons = keyByPolygonId(widget.polygons); - } - - Future _updatePolylines() async { - final ExampleGoogleMapController controller = await _controller.future; - controller._updatePolylines( - PolylineUpdates.from(_polylines.values.toSet(), widget.polylines)); - _polylines = keyByPolylineId(widget.polylines); - } - - Future _updateCircles() async { - final ExampleGoogleMapController controller = await _controller.future; - controller._updateCircles( - CircleUpdates.from(_circles.values.toSet(), widget.circles)); - _circles = keyByCircleId(widget.circles); - } - - Future _updateTileOverlays() async { - final ExampleGoogleMapController controller = await _controller.future; - controller._updateTileOverlays(widget.tileOverlays); - } - - Future onPlatformViewCreated(int id) async { - final ExampleGoogleMapController controller = - await ExampleGoogleMapController._init( - id, - widget.initialCameraPosition, - this, - ); - _controller.complete(controller); - _updateTileOverlays(); - widget.onMapCreated?.call(controller); - } - - void onMarkerTap(MarkerId markerId) { - _markers[markerId]!.onTap?.call(); - } - - void onMarkerDragStart(MarkerId markerId, LatLng position) { - _markers[markerId]!.onDragStart?.call(position); - } - - void onMarkerDrag(MarkerId markerId, LatLng position) { - _markers[markerId]!.onDrag?.call(position); - } - - void onMarkerDragEnd(MarkerId markerId, LatLng position) { - _markers[markerId]!.onDragEnd?.call(position); - } - - void onPolygonTap(PolygonId polygonId) { - _polygons[polygonId]!.onTap?.call(); - } - - void onPolylineTap(PolylineId polylineId) { - _polylines[polylineId]!.onTap?.call(); - } - - void onCircleTap(CircleId circleId) { - _circles[circleId]!.onTap?.call(); - } - - void onInfoWindowTap(MarkerId markerId) { - _markers[markerId]!.infoWindow.onTap?.call(); - } - - void onTap(LatLng position) { - widget.onTap?.call(position); - } - - void onLongPress(LatLng position) { - widget.onLongPress?.call(position); - } -} - -/// Builds a [MapConfiguration] from the given [map]. -MapConfiguration _configurationFromMapWidget(ExampleGoogleMap map) { - return MapConfiguration( - compassEnabled: map.compassEnabled, - mapToolbarEnabled: map.mapToolbarEnabled, - cameraTargetBounds: map.cameraTargetBounds, - mapType: map.mapType, - minMaxZoomPreference: map.minMaxZoomPreference, - rotateGesturesEnabled: map.rotateGesturesEnabled, - scrollGesturesEnabled: map.scrollGesturesEnabled, - tiltGesturesEnabled: map.tiltGesturesEnabled, - trackCameraPosition: map.onCameraMove != null, - zoomControlsEnabled: map.zoomControlsEnabled, - zoomGesturesEnabled: map.zoomGesturesEnabled, - liteModeEnabled: map.liteModeEnabled, - myLocationEnabled: map.myLocationEnabled, - myLocationButtonEnabled: map.myLocationButtonEnabled, - padding: map.padding, - indoorViewEnabled: map.indoorViewEnabled, - trafficEnabled: map.trafficEnabled, - buildingsEnabled: map.buildingsEnabled, - ); -} diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/lite_mode.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/lite_mode.dart deleted file mode 100644 index f7bead951f5..00000000000 --- a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/lite_mode.dart +++ /dev/null @@ -1,47 +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. - -// ignore_for_file: public_member_api_docs - -import 'package:flutter/material.dart'; -import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart'; - -import 'example_google_map.dart'; -import 'page.dart'; - -const CameraPosition _kInitialPosition = - CameraPosition(target: LatLng(-33.852, 151.211), zoom: 11.0); - -class LiteModePage extends GoogleMapExampleAppPage { - const LiteModePage({Key? key}) - : super(const Icon(Icons.map), 'Lite mode', key: key); - - @override - Widget build(BuildContext context) { - return const _LiteModeBody(); - } -} - -class _LiteModeBody extends StatelessWidget { - const _LiteModeBody(); - - @override - Widget build(BuildContext context) { - return const Card( - child: Padding( - padding: EdgeInsets.symmetric(vertical: 30.0), - child: Center( - child: SizedBox( - width: 300.0, - height: 300.0, - child: ExampleGoogleMap( - initialCameraPosition: _kInitialPosition, - liteModeEnabled: true, - ), - ), - ), - ), - ); - } -} diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/main.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/main.dart index 3b1e6361b96..0e4efc0f788 100644 --- a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/main.dart +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/main.dart @@ -3,71 +3,41 @@ // found in the LICENSE file. import 'package:flutter/material.dart'; - -import 'animate_camera.dart'; -import 'lite_mode.dart'; -import 'map_click.dart'; -import 'map_coordinates.dart'; -import 'map_ui.dart'; -import 'marker_icons.dart'; -import 'move_camera.dart'; -import 'padding.dart'; -import 'page.dart'; -import 'place_circle.dart'; -import 'place_marker.dart'; -import 'place_polygon.dart'; -import 'place_polyline.dart'; -import 'scrolling_map.dart'; -import 'snapshot.dart'; -import 'tile_overlay.dart'; - -final List _allPages = [ - const MapUiPage(), - const MapCoordinatesPage(), - const MapClickPage(), - const AnimateCameraPage(), - const MoveCameraPage(), - const PlaceMarkerPage(), - const MarkerIconsPage(), - const ScrollingMapPage(), - const PlacePolylinePage(), - const PlacePolygonPage(), - const PlaceCirclePage(), - const PaddingPage(), - const SnapshotPage(), - const LiteModePage(), - const TileOverlayPage(), -]; - -/// MapsDemo is the Main Application. -class MapsDemo extends StatelessWidget { - /// Default Constructor - const MapsDemo({super.key}); - - void _pushPage(BuildContext context, GoogleMapExampleAppPage page) { - Navigator.of(context).push(MaterialPageRoute( - builder: (_) => Scaffold( - appBar: AppBar(title: Text(page.title)), - body: page, - ))); - } - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar(title: const Text('GoogleMaps examples')), - body: ListView.builder( - itemCount: _allPages.length, - itemBuilder: (_, int index) => ListTile( - leading: _allPages[index].leading, - title: Text(_allPages[index].title), - onTap: () => _pushPage(context, _allPages[index]), - ), - ), - ); - } -} +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_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())); + runApp(const MaterialApp( + home: MapsDemo([ + MapUiPage(), + MapCoordinatesPage(), + MapClickPage(), + AnimateCameraPage(), + MoveCameraPage(), + PlaceMarkerPage(), + MarkerIconsPage(), + ScrollingMapPage(), + PlacePolylinePage(), + PlacePolygonPage(), + PlaceCirclePage(), + PaddingPage(), + SnapshotPage(), + LiteModePage(), + TileOverlayPage(), + ]))); } diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/map_click.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/map_click.dart deleted file mode 100644 index 4017a9fccce..00000000000 --- a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/map_click.dart +++ /dev/null @@ -1,105 +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. - -// ignore_for_file: public_member_api_docs - -import 'package:flutter/material.dart'; -import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart'; - -import 'example_google_map.dart'; -import 'page.dart'; - -const CameraPosition _kInitialPosition = - CameraPosition(target: LatLng(-33.852, 151.211), zoom: 11.0); - -class MapClickPage extends GoogleMapExampleAppPage { - const MapClickPage({Key? key}) - : super(const Icon(Icons.mouse), 'Map click', key: key); - - @override - Widget build(BuildContext context) { - return const _MapClickBody(); - } -} - -class _MapClickBody extends StatefulWidget { - const _MapClickBody(); - - @override - State createState() => _MapClickBodyState(); -} - -class _MapClickBodyState extends State<_MapClickBody> { - _MapClickBodyState(); - - ExampleGoogleMapController? mapController; - LatLng? _lastTap; - LatLng? _lastLongPress; - - @override - Widget build(BuildContext context) { - final ExampleGoogleMap googleMap = ExampleGoogleMap( - onMapCreated: onMapCreated, - initialCameraPosition: _kInitialPosition, - onTap: (LatLng pos) { - setState(() { - _lastTap = pos; - }); - }, - onLongPress: (LatLng pos) { - setState(() { - _lastLongPress = pos; - }); - }, - ); - - final List columnChildren = [ - Padding( - padding: const EdgeInsets.all(10.0), - child: Center( - child: SizedBox( - width: 300.0, - height: 200.0, - child: googleMap, - ), - ), - ), - ]; - - if (mapController != null) { - final String lastTap = 'Tap:\n${_lastTap ?? ""}\n'; - final String lastLongPress = 'Long press:\n${_lastLongPress ?? ""}'; - columnChildren.add(Center( - child: Text( - lastTap, - textAlign: TextAlign.center, - ))); - columnChildren.add(Center( - child: Text( - _lastTap != null ? 'Tapped' : '', - textAlign: TextAlign.center, - ))); - columnChildren.add(Center( - child: Text( - lastLongPress, - textAlign: TextAlign.center, - ))); - columnChildren.add(Center( - child: Text( - _lastLongPress != null ? 'Long pressed' : '', - textAlign: TextAlign.center, - ))); - } - return Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: columnChildren, - ); - } - - Future onMapCreated(ExampleGoogleMapController controller) async { - setState(() { - mapController = controller; - }); - } -} diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/map_coordinates.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/map_coordinates.dart deleted file mode 100644 index 25247bc7c7b..00000000000 --- a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/map_coordinates.dart +++ /dev/null @@ -1,104 +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. - -// ignore_for_file: public_member_api_docs - -import 'package:flutter/material.dart'; -import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart'; - -import 'example_google_map.dart'; -import 'page.dart'; - -const CameraPosition _kInitialPosition = - CameraPosition(target: LatLng(-33.852, 151.211), zoom: 11.0); - -class MapCoordinatesPage extends GoogleMapExampleAppPage { - const MapCoordinatesPage({Key? key}) - : super(const Icon(Icons.map), 'Map coordinates', key: key); - - @override - Widget build(BuildContext context) { - return const _MapCoordinatesBody(); - } -} - -class _MapCoordinatesBody extends StatefulWidget { - const _MapCoordinatesBody(); - - @override - State createState() => _MapCoordinatesBodyState(); -} - -class _MapCoordinatesBodyState extends State<_MapCoordinatesBody> { - _MapCoordinatesBodyState(); - - ExampleGoogleMapController? mapController; - LatLngBounds _visibleRegion = LatLngBounds( - southwest: const LatLng(0, 0), - northeast: const LatLng(0, 0), - ); - - @override - Widget build(BuildContext context) { - final ExampleGoogleMap googleMap = ExampleGoogleMap( - onMapCreated: onMapCreated, - initialCameraPosition: _kInitialPosition, - onCameraIdle: - _updateVisibleRegion, // https://github.com/flutter/flutter/issues/54758 - ); - - return NotificationListener( - onNotification: (ScrollNotification scrollState) { - _updateVisibleRegion(); - return true; - }, - child: Stack( - children: [ - ListView( - children: [ - Padding( - padding: const EdgeInsets.all(10.0), - child: Center( - child: SizedBox( - width: 300.0, - height: 200.0, - child: googleMap, - ), - ), - ), - // Add a block at the bottom of this list to allow validation that the visible region of the map - // does not change when scrolled under the safe view on iOS. - // https://github.com/flutter/flutter/issues/107913 - const SizedBox( - width: 300, - height: 1000, - ), - ], - ), - if (mapController != null) - Center( - child: Text('VisibleRegion:' - '\nnortheast: ${_visibleRegion.northeast},' - '\nsouthwest: ${_visibleRegion.southwest}'), - ), - ], - ), - ); - } - - Future onMapCreated(ExampleGoogleMapController controller) async { - final LatLngBounds visibleRegion = await controller.getVisibleRegion(); - setState(() { - mapController = controller; - _visibleRegion = visibleRegion; - }); - } - - Future _updateVisibleRegion() async { - final LatLngBounds visibleRegion = await mapController!.getVisibleRegion(); - setState(() { - _visibleRegion = visibleRegion; - }); - } -} diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/map_ui.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/map_ui.dart deleted file mode 100644 index 311e2267aa0..00000000000 --- a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/map_ui.dart +++ /dev/null @@ -1,357 +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. - -// ignore_for_file: public_member_api_docs - -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart' show rootBundle; -import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart'; - -import 'example_google_map.dart'; -import 'page.dart'; - -final LatLngBounds sydneyBounds = LatLngBounds( - southwest: const LatLng(-34.022631, 150.620685), - northeast: const LatLng(-33.571835, 151.325952), -); - -class MapUiPage extends GoogleMapExampleAppPage { - const MapUiPage({Key? key}) - : super(const Icon(Icons.map), 'User interface', key: key); - - @override - Widget build(BuildContext context) { - return const MapUiBody(); - } -} - -class MapUiBody extends StatefulWidget { - const MapUiBody({super.key}); - - @override - State createState() => MapUiBodyState(); -} - -class MapUiBodyState extends State { - MapUiBodyState(); - - static const CameraPosition _kInitialPosition = CameraPosition( - target: LatLng(-33.852, 151.211), - zoom: 11.0, - ); - - CameraPosition _position = _kInitialPosition; - bool _isMapCreated = false; - final bool _isMoving = false; - bool _compassEnabled = true; - bool _mapToolbarEnabled = true; - CameraTargetBounds _cameraTargetBounds = CameraTargetBounds.unbounded; - MinMaxZoomPreference _minMaxZoomPreference = MinMaxZoomPreference.unbounded; - MapType _mapType = MapType.normal; - bool _rotateGesturesEnabled = true; - bool _scrollGesturesEnabled = true; - bool _tiltGesturesEnabled = true; - bool _zoomControlsEnabled = false; - bool _zoomGesturesEnabled = true; - bool _indoorViewEnabled = true; - bool _myLocationEnabled = true; - bool _myTrafficEnabled = false; - bool _myLocationButtonEnabled = true; - late ExampleGoogleMapController _controller; - bool _nightMode = false; - - @override - void initState() { - super.initState(); - } - - @override - void dispose() { - super.dispose(); - } - - Widget _compassToggler() { - return TextButton( - child: Text('${_compassEnabled ? 'disable' : 'enable'} compass'), - onPressed: () { - setState(() { - _compassEnabled = !_compassEnabled; - }); - }, - ); - } - - Widget _mapToolbarToggler() { - return TextButton( - child: Text('${_mapToolbarEnabled ? 'disable' : 'enable'} map toolbar'), - onPressed: () { - setState(() { - _mapToolbarEnabled = !_mapToolbarEnabled; - }); - }, - ); - } - - Widget _latLngBoundsToggler() { - return TextButton( - child: Text( - _cameraTargetBounds.bounds == null - ? 'bound camera target' - : 'release camera target', - ), - onPressed: () { - setState(() { - _cameraTargetBounds = _cameraTargetBounds.bounds == null - ? CameraTargetBounds(sydneyBounds) - : CameraTargetBounds.unbounded; - }); - }, - ); - } - - Widget _zoomBoundsToggler() { - return TextButton( - child: Text(_minMaxZoomPreference.minZoom == null - ? 'bound zoom' - : 'release zoom'), - onPressed: () { - setState(() { - _minMaxZoomPreference = _minMaxZoomPreference.minZoom == null - ? const MinMaxZoomPreference(12.0, 16.0) - : MinMaxZoomPreference.unbounded; - }); - }, - ); - } - - Widget _mapTypeCycler() { - final MapType nextType = - MapType.values[(_mapType.index + 1) % MapType.values.length]; - return TextButton( - child: Text('change map type to $nextType'), - onPressed: () { - setState(() { - _mapType = nextType; - }); - }, - ); - } - - Widget _rotateToggler() { - return TextButton( - child: Text('${_rotateGesturesEnabled ? 'disable' : 'enable'} rotate'), - onPressed: () { - setState(() { - _rotateGesturesEnabled = !_rotateGesturesEnabled; - }); - }, - ); - } - - Widget _scrollToggler() { - return TextButton( - child: Text('${_scrollGesturesEnabled ? 'disable' : 'enable'} scroll'), - onPressed: () { - setState(() { - _scrollGesturesEnabled = !_scrollGesturesEnabled; - }); - }, - ); - } - - Widget _tiltToggler() { - return TextButton( - child: Text('${_tiltGesturesEnabled ? 'disable' : 'enable'} tilt'), - onPressed: () { - setState(() { - _tiltGesturesEnabled = !_tiltGesturesEnabled; - }); - }, - ); - } - - Widget _zoomToggler() { - return TextButton( - child: Text('${_zoomGesturesEnabled ? 'disable' : 'enable'} zoom'), - onPressed: () { - setState(() { - _zoomGesturesEnabled = !_zoomGesturesEnabled; - }); - }, - ); - } - - Widget _zoomControlsToggler() { - return TextButton( - child: - Text('${_zoomControlsEnabled ? 'disable' : 'enable'} zoom controls'), - onPressed: () { - setState(() { - _zoomControlsEnabled = !_zoomControlsEnabled; - }); - }, - ); - } - - Widget _indoorViewToggler() { - return TextButton( - child: Text('${_indoorViewEnabled ? 'disable' : 'enable'} indoor'), - onPressed: () { - setState(() { - _indoorViewEnabled = !_indoorViewEnabled; - }); - }, - ); - } - - Widget _myLocationToggler() { - return TextButton( - child: Text( - '${_myLocationEnabled ? 'disable' : 'enable'} my location marker'), - onPressed: () { - setState(() { - _myLocationEnabled = !_myLocationEnabled; - }); - }, - ); - } - - Widget _myLocationButtonToggler() { - return TextButton( - child: Text( - '${_myLocationButtonEnabled ? 'disable' : 'enable'} my location button'), - onPressed: () { - setState(() { - _myLocationButtonEnabled = !_myLocationButtonEnabled; - }); - }, - ); - } - - Widget _myTrafficToggler() { - return TextButton( - child: Text('${_myTrafficEnabled ? 'disable' : 'enable'} my traffic'), - onPressed: () { - setState(() { - _myTrafficEnabled = !_myTrafficEnabled; - }); - }, - ); - } - - Future _getFileData(String path) async { - return rootBundle.loadString(path); - } - - void _setMapStyle(String mapStyle) { - setState(() { - _nightMode = true; - _controller.setMapStyle(mapStyle); - }); - } - - // Should only be called if _isMapCreated is true. - Widget _nightModeToggler() { - assert(_isMapCreated); - return TextButton( - child: Text('${_nightMode ? 'disable' : 'enable'} night mode'), - onPressed: () { - if (_nightMode) { - setState(() { - _nightMode = false; - _controller.setMapStyle(null); - }); - } else { - _getFileData('assets/night_mode.json').then(_setMapStyle); - } - }, - ); - } - - @override - Widget build(BuildContext context) { - final ExampleGoogleMap googleMap = ExampleGoogleMap( - onMapCreated: onMapCreated, - initialCameraPosition: _kInitialPosition, - compassEnabled: _compassEnabled, - mapToolbarEnabled: _mapToolbarEnabled, - cameraTargetBounds: _cameraTargetBounds, - minMaxZoomPreference: _minMaxZoomPreference, - mapType: _mapType, - rotateGesturesEnabled: _rotateGesturesEnabled, - scrollGesturesEnabled: _scrollGesturesEnabled, - tiltGesturesEnabled: _tiltGesturesEnabled, - zoomGesturesEnabled: _zoomGesturesEnabled, - zoomControlsEnabled: _zoomControlsEnabled, - indoorViewEnabled: _indoorViewEnabled, - myLocationEnabled: _myLocationEnabled, - myLocationButtonEnabled: _myLocationButtonEnabled, - trafficEnabled: _myTrafficEnabled, - onCameraMove: _updateCameraPosition, - ); - - final List columnChildren = [ - Padding( - padding: const EdgeInsets.all(10.0), - child: Center( - child: SizedBox( - width: 300.0, - height: 200.0, - child: googleMap, - ), - ), - ), - ]; - - if (_isMapCreated) { - columnChildren.add( - Expanded( - child: ListView( - children: [ - Text('camera bearing: ${_position.bearing}'), - Text( - 'camera target: ${_position.target.latitude.toStringAsFixed(4)},' - '${_position.target.longitude.toStringAsFixed(4)}'), - Text('camera zoom: ${_position.zoom}'), - Text('camera tilt: ${_position.tilt}'), - Text(_isMoving ? '(Camera moving)' : '(Camera idle)'), - _compassToggler(), - _mapToolbarToggler(), - _latLngBoundsToggler(), - _mapTypeCycler(), - _zoomBoundsToggler(), - _rotateToggler(), - _scrollToggler(), - _tiltToggler(), - _zoomToggler(), - _zoomControlsToggler(), - _indoorViewToggler(), - _myLocationToggler(), - _myLocationButtonToggler(), - _myTrafficToggler(), - _nightModeToggler(), - ], - ), - ), - ); - } - return Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: columnChildren, - ); - } - - void _updateCameraPosition(CameraPosition position) { - setState(() { - _position = position; - }); - } - - void onMapCreated(ExampleGoogleMapController controller) { - setState(() { - _controller = controller; - _isMapCreated = true; - }); - } -} diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/marker_icons.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/marker_icons.dart deleted file mode 100644 index 174055613a9..00000000000 --- a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/marker_icons.dart +++ /dev/null @@ -1,98 +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. - -// ignore_for_file: public_member_api_docs -// ignore_for_file: unawaited_futures - -import 'package:flutter/material.dart'; -import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart'; - -import 'example_google_map.dart'; -import 'page.dart'; - -class MarkerIconsPage extends GoogleMapExampleAppPage { - const MarkerIconsPage({Key? key}) - : super(const Icon(Icons.image), 'Marker icons', key: key); - - @override - Widget build(BuildContext context) { - return const MarkerIconsBody(); - } -} - -class MarkerIconsBody extends StatefulWidget { - const MarkerIconsBody({super.key}); - - @override - State createState() => MarkerIconsBodyState(); -} - -const LatLng _kMapCenter = LatLng(52.4478, -3.5402); - -class MarkerIconsBodyState extends State { - ExampleGoogleMapController? controller; - BitmapDescriptor? _markerIcon; - - @override - Widget build(BuildContext context) { - _createMarkerImageFromAsset(context); - return Column( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - Center( - child: SizedBox( - width: 350.0, - height: 300.0, - child: ExampleGoogleMap( - initialCameraPosition: const CameraPosition( - target: _kMapCenter, - zoom: 7.0, - ), - markers: {_createMarker()}, - onMapCreated: _onMapCreated, - ), - ), - ) - ], - ); - } - - Marker _createMarker() { - if (_markerIcon != null) { - return Marker( - markerId: const MarkerId('marker_1'), - position: _kMapCenter, - icon: _markerIcon!, - ); - } else { - return const Marker( - markerId: MarkerId('marker_1'), - position: _kMapCenter, - ); - } - } - - Future _createMarkerImageFromAsset(BuildContext context) async { - if (_markerIcon == null) { - final ImageConfiguration imageConfiguration = - createLocalImageConfiguration(context, size: const Size.square(48)); - BitmapDescriptor.fromAssetImage( - imageConfiguration, 'assets/red_square.png') - .then(_updateBitmap); - } - } - - void _updateBitmap(BitmapDescriptor bitmap) { - setState(() { - _markerIcon = bitmap; - }); - } - - void _onMapCreated(ExampleGoogleMapController controllerParam) { - setState(() { - controller = controllerParam; - }); - } -} diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/move_camera.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/move_camera.dart deleted file mode 100644 index b1fb55cad54..00000000000 --- a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/move_camera.dart +++ /dev/null @@ -1,171 +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. - -// ignore_for_file: public_member_api_docs - -import 'package:flutter/material.dart'; -import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart'; - -import 'example_google_map.dart'; -import 'page.dart'; - -class MoveCameraPage extends GoogleMapExampleAppPage { - const MoveCameraPage({Key? key}) - : super(const Icon(Icons.map), 'Camera control', key: key); - - @override - Widget build(BuildContext context) { - return const MoveCamera(); - } -} - -class MoveCamera extends StatefulWidget { - const MoveCamera({super.key}); - @override - State createState() => MoveCameraState(); -} - -class MoveCameraState extends State { - ExampleGoogleMapController? mapController; - - // ignore: use_setters_to_change_properties - void _onMapCreated(ExampleGoogleMapController controller) { - mapController = controller; - } - - @override - Widget build(BuildContext context) { - return Column( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - Center( - child: SizedBox( - width: 300.0, - height: 200.0, - child: ExampleGoogleMap( - onMapCreated: _onMapCreated, - initialCameraPosition: - const CameraPosition(target: LatLng(0.0, 0.0)), - ), - ), - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - Column( - children: [ - TextButton( - onPressed: () { - mapController?.moveCamera( - CameraUpdate.newCameraPosition( - const CameraPosition( - bearing: 270.0, - target: LatLng(51.5160895, -0.1294527), - tilt: 30.0, - zoom: 17.0, - ), - ), - ); - }, - child: const Text('newCameraPosition'), - ), - TextButton( - onPressed: () { - mapController?.moveCamera( - CameraUpdate.newLatLng( - const LatLng(56.1725505, 10.1850512), - ), - ); - }, - child: const Text('newLatLng'), - ), - TextButton( - onPressed: () { - mapController?.moveCamera( - CameraUpdate.newLatLngBounds( - LatLngBounds( - southwest: const LatLng(-38.483935, 113.248673), - northeast: const LatLng(-8.982446, 153.823821), - ), - 10.0, - ), - ); - }, - child: const Text('newLatLngBounds'), - ), - TextButton( - onPressed: () { - mapController?.moveCamera( - CameraUpdate.newLatLngZoom( - const LatLng(37.4231613, -122.087159), - 11.0, - ), - ); - }, - child: const Text('newLatLngZoom'), - ), - TextButton( - onPressed: () { - mapController?.moveCamera( - CameraUpdate.scrollBy(150.0, -225.0), - ); - }, - child: const Text('scrollBy'), - ), - ], - ), - Column( - children: [ - TextButton( - onPressed: () { - mapController?.moveCamera( - CameraUpdate.zoomBy( - -0.5, - const Offset(30.0, 20.0), - ), - ); - }, - child: const Text('zoomBy with focus'), - ), - TextButton( - onPressed: () { - mapController?.moveCamera( - CameraUpdate.zoomBy(-0.5), - ); - }, - child: const Text('zoomBy'), - ), - TextButton( - onPressed: () { - mapController?.moveCamera( - CameraUpdate.zoomIn(), - ); - }, - child: const Text('zoomIn'), - ), - TextButton( - onPressed: () { - mapController?.moveCamera( - CameraUpdate.zoomOut(), - ); - }, - child: const Text('zoomOut'), - ), - TextButton( - onPressed: () { - mapController?.moveCamera( - CameraUpdate.zoomTo(16.0), - ); - }, - child: const Text('zoomTo'), - ), - ], - ), - ], - ) - ], - ); - } -} diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/padding.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/padding.dart deleted file mode 100644 index bfddb167d43..00000000000 --- a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/padding.dart +++ /dev/null @@ -1,180 +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. - -// ignore_for_file: public_member_api_docs - -import 'package:flutter/material.dart'; -import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart'; - -import 'example_google_map.dart'; -import 'page.dart'; - -class PaddingPage extends GoogleMapExampleAppPage { - const PaddingPage({Key? key}) - : super(const Icon(Icons.map), 'Add padding to the map', key: key); - - @override - Widget build(BuildContext context) { - return const MarkerIconsBody(); - } -} - -class MarkerIconsBody extends StatefulWidget { - const MarkerIconsBody({super.key}); - - @override - State createState() => MarkerIconsBodyState(); -} - -const LatLng _kMapCenter = LatLng(52.4478, -3.5402); - -class MarkerIconsBodyState extends State { - ExampleGoogleMapController? controller; - - EdgeInsets _padding = EdgeInsets.zero; - - @override - Widget build(BuildContext context) { - final ExampleGoogleMap googleMap = ExampleGoogleMap( - onMapCreated: _onMapCreated, - initialCameraPosition: const CameraPosition( - target: _kMapCenter, - zoom: 7.0, - ), - padding: _padding, - ); - - final List columnChildren = [ - Padding( - padding: const EdgeInsets.all(10.0), - child: Center( - child: SizedBox( - width: 300.0, - height: 200.0, - child: googleMap, - ), - ), - ), - const Padding( - padding: EdgeInsets.only(top: 20), - child: Center( - child: Text( - 'Enter Padding Below', - style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold), - ), - ), - ), - ]; - - columnChildren.addAll([_paddingInput(), _buttons()]); - - return Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: columnChildren, - ); - } - - void _onMapCreated(ExampleGoogleMapController controllerParam) { - setState(() { - controller = controllerParam; - }); - } - - final TextEditingController _topController = TextEditingController(); - final TextEditingController _bottomController = TextEditingController(); - final TextEditingController _leftController = TextEditingController(); - final TextEditingController _rightController = TextEditingController(); - - Widget _paddingInput() { - return Padding( - padding: const EdgeInsets.all(16.0), - child: Row( - children: [ - Flexible( - flex: 2, - child: TextField( - controller: _topController, - keyboardType: TextInputType.number, - textAlign: TextAlign.center, - decoration: const InputDecoration( - hintText: 'Top', - ), - ), - ), - const Spacer(), - Flexible( - flex: 2, - child: TextField( - controller: _bottomController, - keyboardType: TextInputType.number, - textAlign: TextAlign.center, - decoration: const InputDecoration( - hintText: 'Bottom', - ), - ), - ), - const Spacer(), - Flexible( - flex: 2, - child: TextField( - controller: _leftController, - keyboardType: TextInputType.number, - textAlign: TextAlign.center, - decoration: const InputDecoration( - hintText: 'Left', - ), - ), - ), - const Spacer(), - Flexible( - flex: 2, - child: TextField( - controller: _rightController, - keyboardType: TextInputType.number, - textAlign: TextAlign.center, - decoration: const InputDecoration( - hintText: 'Right', - ), - ), - ), - ], - ), - ); - } - - Widget _buttons() { - return Padding( - padding: const EdgeInsets.symmetric(horizontal: 16), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - TextButton( - child: const Text('Set Padding'), - onPressed: () { - setState(() { - _padding = EdgeInsets.fromLTRB( - double.tryParse(_leftController.value.text) ?? 0, - double.tryParse(_topController.value.text) ?? 0, - double.tryParse(_rightController.value.text) ?? 0, - double.tryParse(_bottomController.value.text) ?? 0); - }); - }, - ), - TextButton( - child: const Text('Reset Padding'), - onPressed: () { - setState(() { - _topController.clear(); - _bottomController.clear(); - _leftController.clear(); - _rightController.clear(); - _padding = EdgeInsets.zero; - }); - }, - ) - ], - ), - ); - } -} diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/page.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/page.dart deleted file mode 100644 index cb8ef54d374..00000000000 --- a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/page.dart +++ /dev/null @@ -1,14 +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. - -// ignore_for_file: public_member_api_docs - -import 'package:flutter/material.dart'; - -abstract class GoogleMapExampleAppPage extends StatelessWidget { - const GoogleMapExampleAppPage(this.leading, this.title, {super.key}); - - final Widget leading; - final String title; -} diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/place_circle.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/place_circle.dart deleted file mode 100644 index 29be7442965..00000000000 --- a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/place_circle.dart +++ /dev/null @@ -1,232 +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. - -// ignore_for_file: public_member_api_docs - -import 'package:flutter/material.dart'; -import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart'; - -import 'example_google_map.dart'; -import 'page.dart'; - -class PlaceCirclePage extends GoogleMapExampleAppPage { - const PlaceCirclePage({Key? key}) - : super(const Icon(Icons.linear_scale), 'Place circle', key: key); - - @override - Widget build(BuildContext context) { - return const PlaceCircleBody(); - } -} - -class PlaceCircleBody extends StatefulWidget { - const PlaceCircleBody({super.key}); - - @override - State createState() => PlaceCircleBodyState(); -} - -class PlaceCircleBodyState extends State { - PlaceCircleBodyState(); - - ExampleGoogleMapController? controller; - Map circles = {}; - int _circleIdCounter = 1; - CircleId? selectedCircle; - - // Values when toggling circle color - int fillColorsIndex = 0; - int strokeColorsIndex = 0; - List colors = [ - Colors.purple, - Colors.red, - Colors.green, - Colors.pink, - ]; - - // Values when toggling circle stroke width - int widthsIndex = 0; - List widths = [10, 20, 5]; - - // ignore: use_setters_to_change_properties - void _onMapCreated(ExampleGoogleMapController controller) { - this.controller = controller; - } - - @override - void dispose() { - super.dispose(); - } - - void _onCircleTapped(CircleId circleId) { - setState(() { - selectedCircle = circleId; - }); - } - - void _remove(CircleId circleId) { - setState(() { - if (circles.containsKey(circleId)) { - circles.remove(circleId); - } - if (circleId == selectedCircle) { - selectedCircle = null; - } - }); - } - - void _add() { - final int circleCount = circles.length; - - if (circleCount == 12) { - return; - } - - final String circleIdVal = 'circle_id_$_circleIdCounter'; - _circleIdCounter++; - final CircleId circleId = CircleId(circleIdVal); - - final Circle circle = Circle( - circleId: circleId, - consumeTapEvents: true, - strokeColor: Colors.orange, - fillColor: Colors.green, - strokeWidth: 5, - center: _createCenter(), - radius: 50000, - onTap: () { - _onCircleTapped(circleId); - }, - ); - - setState(() { - circles[circleId] = circle; - }); - } - - void _toggleVisible(CircleId circleId) { - final Circle circle = circles[circleId]!; - setState(() { - circles[circleId] = circle.copyWith( - visibleParam: !circle.visible, - ); - }); - } - - void _changeFillColor(CircleId circleId) { - final Circle circle = circles[circleId]!; - setState(() { - circles[circleId] = circle.copyWith( - fillColorParam: colors[++fillColorsIndex % colors.length], - ); - }); - } - - void _changeStrokeColor(CircleId circleId) { - final Circle circle = circles[circleId]!; - setState(() { - circles[circleId] = circle.copyWith( - strokeColorParam: colors[++strokeColorsIndex % colors.length], - ); - }); - } - - void _changeStrokeWidth(CircleId circleId) { - final Circle circle = circles[circleId]!; - setState(() { - circles[circleId] = circle.copyWith( - strokeWidthParam: widths[++widthsIndex % widths.length], - ); - }); - } - - @override - Widget build(BuildContext context) { - final CircleId? selectedId = selectedCircle; - return Column( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - Center( - child: SizedBox( - width: 350.0, - height: 300.0, - child: ExampleGoogleMap( - initialCameraPosition: const CameraPosition( - target: LatLng(52.4478, -3.5402), - zoom: 7.0, - ), - circles: Set.of(circles.values), - onMapCreated: _onMapCreated, - ), - ), - ), - Expanded( - child: SingleChildScrollView( - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - Row( - children: [ - Column( - children: [ - TextButton( - onPressed: _add, - child: const Text('add'), - ), - TextButton( - onPressed: (selectedId == null) - ? null - : () => _remove(selectedId), - child: const Text('remove'), - ), - TextButton( - onPressed: (selectedId == null) - ? null - : () => _toggleVisible(selectedId), - child: const Text('toggle visible'), - ), - ], - ), - Column( - children: [ - TextButton( - onPressed: (selectedId == null) - ? null - : () => _changeStrokeWidth(selectedId), - child: const Text('change stroke width'), - ), - TextButton( - onPressed: (selectedId == null) - ? null - : () => _changeStrokeColor(selectedId), - child: const Text('change stroke color'), - ), - TextButton( - onPressed: (selectedId == null) - ? null - : () => _changeFillColor(selectedId), - child: const Text('change fill color'), - ), - ], - ) - ], - ) - ], - ), - ), - ), - ], - ); - } - - LatLng _createCenter() { - final double offset = _circleIdCounter.ceilToDouble(); - return _createLatLng(51.4816 + offset * 0.2, -3.1791); - } - - LatLng _createLatLng(double lat, double lng) { - return LatLng(lat, lng); - } -} diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/place_marker.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/place_marker.dart deleted file mode 100644 index 9cba4975d40..00000000000 --- a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/place_marker.dart +++ /dev/null @@ -1,421 +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. - -// ignore_for_file: public_member_api_docs - -import 'dart:async'; -import 'dart:math'; -import 'dart:typed_data'; -import 'dart:ui'; - -import 'package:flutter/material.dart'; -import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart'; - -import 'example_google_map.dart'; -import 'page.dart'; - -class PlaceMarkerPage extends GoogleMapExampleAppPage { - const PlaceMarkerPage({Key? key}) - : super(const Icon(Icons.place), 'Place marker', key: key); - - @override - Widget build(BuildContext context) { - return const PlaceMarkerBody(); - } -} - -class PlaceMarkerBody extends StatefulWidget { - const PlaceMarkerBody({super.key}); - - @override - State createState() => PlaceMarkerBodyState(); -} - -typedef MarkerUpdateAction = Marker Function(Marker marker); - -class PlaceMarkerBodyState extends State { - PlaceMarkerBodyState(); - static const LatLng center = LatLng(-33.86711, 151.1947171); - - ExampleGoogleMapController? controller; - Map markers = {}; - MarkerId? selectedMarker; - int _markerIdCounter = 1; - LatLng? markerPosition; - - // ignore: use_setters_to_change_properties - void _onMapCreated(ExampleGoogleMapController controller) { - this.controller = controller; - } - - @override - void dispose() { - super.dispose(); - } - - void _onMarkerTapped(MarkerId markerId) { - final Marker? tappedMarker = markers[markerId]; - if (tappedMarker != null) { - setState(() { - final MarkerId? previousMarkerId = selectedMarker; - if (previousMarkerId != null && markers.containsKey(previousMarkerId)) { - final Marker resetOld = markers[previousMarkerId]! - .copyWith(iconParam: BitmapDescriptor.defaultMarker); - markers[previousMarkerId] = resetOld; - } - selectedMarker = markerId; - final Marker newMarker = tappedMarker.copyWith( - iconParam: BitmapDescriptor.defaultMarkerWithHue( - BitmapDescriptor.hueGreen, - ), - ); - markers[markerId] = newMarker; - - markerPosition = null; - }); - } - } - - Future _onMarkerDrag(MarkerId markerId, LatLng newPosition) async { - setState(() { - markerPosition = newPosition; - }); - } - - Future _onMarkerDragEnd(MarkerId markerId, LatLng newPosition) async { - final Marker? tappedMarker = markers[markerId]; - if (tappedMarker != null) { - setState(() { - markerPosition = null; - }); - await showDialog( - context: context, - builder: (BuildContext context) { - return AlertDialog( - actions: [ - TextButton( - child: const Text('OK'), - onPressed: () => Navigator.of(context).pop(), - ) - ], - content: Padding( - padding: const EdgeInsets.symmetric(vertical: 66), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Text('Old position: ${tappedMarker.position}'), - Text('New position: $newPosition'), - ], - ))); - }); - } - } - - void _add() { - final int markerCount = markers.length; - - if (markerCount == 12) { - return; - } - - final String markerIdVal = 'marker_id_$_markerIdCounter'; - _markerIdCounter++; - final MarkerId markerId = MarkerId(markerIdVal); - - final Marker marker = Marker( - markerId: markerId, - position: LatLng( - center.latitude + sin(_markerIdCounter * pi / 6.0) / 20.0, - center.longitude + cos(_markerIdCounter * pi / 6.0) / 20.0, - ), - infoWindow: InfoWindow(title: markerIdVal, snippet: '*'), - onTap: () => _onMarkerTapped(markerId), - onDragEnd: (LatLng position) => _onMarkerDragEnd(markerId, position), - onDrag: (LatLng position) => _onMarkerDrag(markerId, position), - ); - - setState(() { - markers[markerId] = marker; - }); - } - - void _remove(MarkerId markerId) { - setState(() { - if (markers.containsKey(markerId)) { - markers.remove(markerId); - } - }); - } - - void _changePosition(MarkerId markerId) { - final Marker marker = markers[markerId]!; - final LatLng current = marker.position; - final Offset offset = Offset( - center.latitude - current.latitude, - center.longitude - current.longitude, - ); - setState(() { - markers[markerId] = marker.copyWith( - positionParam: LatLng( - center.latitude + offset.dy, - center.longitude + offset.dx, - ), - ); - }); - } - - void _changeAnchor(MarkerId markerId) { - final Marker marker = markers[markerId]!; - final Offset currentAnchor = marker.anchor; - final Offset newAnchor = Offset(1.0 - currentAnchor.dy, currentAnchor.dx); - setState(() { - markers[markerId] = marker.copyWith( - anchorParam: newAnchor, - ); - }); - } - - Future _changeInfoAnchor(MarkerId markerId) async { - final Marker marker = markers[markerId]!; - final Offset currentAnchor = marker.infoWindow.anchor; - final Offset newAnchor = Offset(1.0 - currentAnchor.dy, currentAnchor.dx); - setState(() { - markers[markerId] = marker.copyWith( - infoWindowParam: marker.infoWindow.copyWith( - anchorParam: newAnchor, - ), - ); - }); - } - - Future _toggleDraggable(MarkerId markerId) async { - final Marker marker = markers[markerId]!; - setState(() { - markers[markerId] = marker.copyWith( - draggableParam: !marker.draggable, - ); - }); - } - - Future _toggleFlat(MarkerId markerId) async { - final Marker marker = markers[markerId]!; - setState(() { - markers[markerId] = marker.copyWith( - flatParam: !marker.flat, - ); - }); - } - - Future _changeInfo(MarkerId markerId) async { - final Marker marker = markers[markerId]!; - final String newSnippet = '${marker.infoWindow.snippet!}*'; - setState(() { - markers[markerId] = marker.copyWith( - infoWindowParam: marker.infoWindow.copyWith( - snippetParam: newSnippet, - ), - ); - }); - } - - Future _changeAlpha(MarkerId markerId) async { - final Marker marker = markers[markerId]!; - final double current = marker.alpha; - setState(() { - markers[markerId] = marker.copyWith( - alphaParam: current < 0.1 ? 1.0 : current * 0.75, - ); - }); - } - - Future _changeRotation(MarkerId markerId) async { - final Marker marker = markers[markerId]!; - final double current = marker.rotation; - setState(() { - markers[markerId] = marker.copyWith( - rotationParam: current == 330.0 ? 0.0 : current + 30.0, - ); - }); - } - - Future _toggleVisible(MarkerId markerId) async { - final Marker marker = markers[markerId]!; - setState(() { - markers[markerId] = marker.copyWith( - visibleParam: !marker.visible, - ); - }); - } - - Future _changeZIndex(MarkerId markerId) async { - final Marker marker = markers[markerId]!; - final double current = marker.zIndex; - setState(() { - markers[markerId] = marker.copyWith( - zIndexParam: current == 12.0 ? 0.0 : current + 1.0, - ); - }); - } - - void _setMarkerIcon(MarkerId markerId, BitmapDescriptor assetIcon) { - final Marker marker = markers[markerId]!; - setState(() { - markers[markerId] = marker.copyWith( - iconParam: assetIcon, - ); - }); - } - - Future _getAssetIcon(BuildContext context) async { - final Completer bitmapIcon = - Completer(); - final ImageConfiguration config = createLocalImageConfiguration(context); - - const AssetImage('assets/red_square.png') - .resolve(config) - .addListener(ImageStreamListener((ImageInfo image, bool sync) async { - final ByteData? bytes = - await image.image.toByteData(format: ImageByteFormat.png); - if (bytes == null) { - bitmapIcon.completeError(Exception('Unable to encode icon')); - return; - } - final BitmapDescriptor bitmap = - BitmapDescriptor.fromBytes(bytes.buffer.asUint8List()); - bitmapIcon.complete(bitmap); - })); - - return bitmapIcon.future; - } - - @override - Widget build(BuildContext context) { - final MarkerId? selectedId = selectedMarker; - return Stack(children: [ - Column( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - Expanded( - child: ExampleGoogleMap( - onMapCreated: _onMapCreated, - initialCameraPosition: const CameraPosition( - target: LatLng(-33.852, 151.211), - zoom: 11.0, - ), - markers: Set.of(markers.values), - ), - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - TextButton( - onPressed: _add, - child: const Text('Add'), - ), - TextButton( - onPressed: - selectedId == null ? null : () => _remove(selectedId), - child: const Text('Remove'), - ), - ], - ), - Wrap( - alignment: WrapAlignment.spaceEvenly, - children: [ - TextButton( - onPressed: - selectedId == null ? null : () => _changeInfo(selectedId), - child: const Text('change info'), - ), - TextButton( - onPressed: selectedId == null - ? null - : () => _changeInfoAnchor(selectedId), - child: const Text('change info anchor'), - ), - TextButton( - onPressed: - selectedId == null ? null : () => _changeAlpha(selectedId), - child: const Text('change alpha'), - ), - TextButton( - onPressed: - selectedId == null ? null : () => _changeAnchor(selectedId), - child: const Text('change anchor'), - ), - TextButton( - onPressed: selectedId == null - ? null - : () => _toggleDraggable(selectedId), - child: const Text('toggle draggable'), - ), - TextButton( - onPressed: - selectedId == null ? null : () => _toggleFlat(selectedId), - child: const Text('toggle flat'), - ), - TextButton( - onPressed: selectedId == null - ? null - : () => _changePosition(selectedId), - child: const Text('change position'), - ), - TextButton( - onPressed: selectedId == null - ? null - : () => _changeRotation(selectedId), - child: const Text('change rotation'), - ), - TextButton( - onPressed: selectedId == null - ? null - : () => _toggleVisible(selectedId), - child: const Text('toggle visible'), - ), - TextButton( - onPressed: - selectedId == null ? null : () => _changeZIndex(selectedId), - child: const Text('change zIndex'), - ), - TextButton( - onPressed: selectedId == null - ? null - : () { - _getAssetIcon(context).then( - (BitmapDescriptor icon) { - _setMarkerIcon(selectedId, icon); - }, - ); - }, - child: const Text('set marker icon'), - ), - ], - ), - ], - ), - Visibility( - visible: markerPosition != null, - child: Container( - color: Colors.white70, - height: 30, - padding: const EdgeInsets.only(left: 12, right: 12), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - if (markerPosition == null) - Container() - else - Expanded(child: Text('lat: ${markerPosition!.latitude}')), - if (markerPosition == null) - Container() - else - Expanded(child: Text('lng: ${markerPosition!.longitude}')), - ], - ), - ), - ), - ]); - } -} diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/place_polygon.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/place_polygon.dart deleted file mode 100644 index 889c38d6376..00000000000 --- a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/place_polygon.dart +++ /dev/null @@ -1,306 +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. - -// ignore_for_file: public_member_api_docs - -import 'package:flutter/material.dart'; -import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart'; - -import 'example_google_map.dart'; -import 'page.dart'; - -class PlacePolygonPage extends GoogleMapExampleAppPage { - const PlacePolygonPage({Key? key}) - : super(const Icon(Icons.linear_scale), 'Place polygon', key: key); - - @override - Widget build(BuildContext context) { - return const PlacePolygonBody(); - } -} - -class PlacePolygonBody extends StatefulWidget { - const PlacePolygonBody({super.key}); - - @override - State createState() => PlacePolygonBodyState(); -} - -class PlacePolygonBodyState extends State { - PlacePolygonBodyState(); - - ExampleGoogleMapController? controller; - Map polygons = {}; - Map polygonOffsets = {}; - int _polygonIdCounter = 0; - PolygonId? selectedPolygon; - - // Values when toggling polygon color - int strokeColorsIndex = 0; - int fillColorsIndex = 0; - List colors = [ - Colors.purple, - Colors.red, - Colors.green, - Colors.pink, - ]; - - // Values when toggling polygon width - int widthsIndex = 0; - List widths = [10, 20, 5]; - - // ignore: use_setters_to_change_properties - void _onMapCreated(ExampleGoogleMapController controller) { - this.controller = controller; - } - - @override - void dispose() { - super.dispose(); - } - - void _onPolygonTapped(PolygonId polygonId) { - setState(() { - selectedPolygon = polygonId; - }); - } - - void _remove(PolygonId polygonId) { - setState(() { - if (polygons.containsKey(polygonId)) { - polygons.remove(polygonId); - } - selectedPolygon = null; - }); - } - - void _add() { - final int polygonCount = polygons.length; - - if (polygonCount == 12) { - return; - } - - final String polygonIdVal = 'polygon_id_$_polygonIdCounter'; - final PolygonId polygonId = PolygonId(polygonIdVal); - - final Polygon polygon = Polygon( - polygonId: polygonId, - consumeTapEvents: true, - strokeColor: Colors.orange, - strokeWidth: 5, - fillColor: Colors.green, - points: _createPoints(), - onTap: () { - _onPolygonTapped(polygonId); - }, - ); - - setState(() { - polygons[polygonId] = polygon; - polygonOffsets[polygonId] = _polygonIdCounter.ceilToDouble(); - // increment _polygonIdCounter to have unique polygon id each time - _polygonIdCounter++; - }); - } - - void _toggleGeodesic(PolygonId polygonId) { - final Polygon polygon = polygons[polygonId]!; - setState(() { - polygons[polygonId] = polygon.copyWith( - geodesicParam: !polygon.geodesic, - ); - }); - } - - void _toggleVisible(PolygonId polygonId) { - final Polygon polygon = polygons[polygonId]!; - setState(() { - polygons[polygonId] = polygon.copyWith( - visibleParam: !polygon.visible, - ); - }); - } - - void _changeStrokeColor(PolygonId polygonId) { - final Polygon polygon = polygons[polygonId]!; - setState(() { - polygons[polygonId] = polygon.copyWith( - strokeColorParam: colors[++strokeColorsIndex % colors.length], - ); - }); - } - - void _changeFillColor(PolygonId polygonId) { - final Polygon polygon = polygons[polygonId]!; - setState(() { - polygons[polygonId] = polygon.copyWith( - fillColorParam: colors[++fillColorsIndex % colors.length], - ); - }); - } - - void _changeWidth(PolygonId polygonId) { - final Polygon polygon = polygons[polygonId]!; - setState(() { - polygons[polygonId] = polygon.copyWith( - strokeWidthParam: widths[++widthsIndex % widths.length], - ); - }); - } - - void _addHoles(PolygonId polygonId) { - final Polygon polygon = polygons[polygonId]!; - setState(() { - polygons[polygonId] = - polygon.copyWith(holesParam: _createHoles(polygonId)); - }); - } - - void _removeHoles(PolygonId polygonId) { - final Polygon polygon = polygons[polygonId]!; - setState(() { - polygons[polygonId] = polygon.copyWith( - holesParam: >[], - ); - }); - } - - @override - Widget build(BuildContext context) { - final PolygonId? selectedId = selectedPolygon; - return Column( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - Center( - child: SizedBox( - width: 350.0, - height: 300.0, - child: ExampleGoogleMap( - initialCameraPosition: const CameraPosition( - target: LatLng(52.4478, -3.5402), - zoom: 7.0, - ), - polygons: Set.of(polygons.values), - onMapCreated: _onMapCreated, - ), - ), - ), - Expanded( - child: SingleChildScrollView( - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - Row( - children: [ - Column( - children: [ - TextButton( - onPressed: _add, - child: const Text('add'), - ), - TextButton( - onPressed: (selectedId == null) - ? null - : () => _remove(selectedId), - child: const Text('remove'), - ), - TextButton( - onPressed: (selectedId == null) - ? null - : () => _toggleVisible(selectedId), - child: const Text('toggle visible'), - ), - TextButton( - onPressed: (selectedId == null) - ? null - : () => _toggleGeodesic(selectedId), - child: const Text('toggle geodesic'), - ), - ], - ), - Column( - children: [ - TextButton( - onPressed: (selectedId == null) - ? null - : ((polygons[selectedId]!.holes.isNotEmpty) - ? null - : () => _addHoles(selectedId)), - child: const Text('add holes'), - ), - TextButton( - onPressed: (selectedId == null) - ? null - : ((polygons[selectedId]!.holes.isEmpty) - ? null - : () => _removeHoles(selectedId)), - child: const Text('remove holes'), - ), - TextButton( - onPressed: (selectedId == null) - ? null - : () => _changeWidth(selectedId), - child: const Text('change stroke width'), - ), - TextButton( - onPressed: (selectedId == null) - ? null - : () => _changeStrokeColor(selectedId), - child: const Text('change stroke color'), - ), - TextButton( - onPressed: (selectedId == null) - ? null - : () => _changeFillColor(selectedId), - child: const Text('change fill color'), - ), - ], - ) - ], - ) - ], - ), - ), - ), - ], - ); - } - - List _createPoints() { - final List points = []; - final double offset = _polygonIdCounter.ceilToDouble(); - points.add(_createLatLng(51.2395 + offset, -3.4314)); - points.add(_createLatLng(53.5234 + offset, -3.5314)); - points.add(_createLatLng(52.4351 + offset, -4.5235)); - points.add(_createLatLng(52.1231 + offset, -5.0829)); - return points; - } - - List> _createHoles(PolygonId polygonId) { - final List> holes = >[]; - final double offset = polygonOffsets[polygonId]!; - - final List hole1 = []; - hole1.add(_createLatLng(51.8395 + offset, -3.8814)); - hole1.add(_createLatLng(52.0234 + offset, -3.9914)); - hole1.add(_createLatLng(52.1351 + offset, -4.4435)); - hole1.add(_createLatLng(52.0231 + offset, -4.5829)); - holes.add(hole1); - - final List hole2 = []; - hole2.add(_createLatLng(52.2395 + offset, -3.6814)); - hole2.add(_createLatLng(52.4234 + offset, -3.7914)); - hole2.add(_createLatLng(52.5351 + offset, -4.2435)); - hole2.add(_createLatLng(52.4231 + offset, -4.3829)); - holes.add(hole2); - - return holes; - } - - LatLng _createLatLng(double lat, double lng) { - return LatLng(lat, lng); - } -} diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/place_polyline.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/place_polyline.dart deleted file mode 100644 index 659ef87e87f..00000000000 --- a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/place_polyline.dart +++ /dev/null @@ -1,325 +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. - -// ignore_for_file: public_member_api_docs - -import 'package:flutter/foundation.dart'; -import 'package:flutter/material.dart'; -import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart'; - -import 'example_google_map.dart'; -import 'page.dart'; - -class PlacePolylinePage extends GoogleMapExampleAppPage { - const PlacePolylinePage({Key? key}) - : super(const Icon(Icons.linear_scale), 'Place polyline', key: key); - - @override - Widget build(BuildContext context) { - return const PlacePolylineBody(); - } -} - -class PlacePolylineBody extends StatefulWidget { - const PlacePolylineBody({super.key}); - - @override - State createState() => PlacePolylineBodyState(); -} - -class PlacePolylineBodyState extends State { - PlacePolylineBodyState(); - - ExampleGoogleMapController? controller; - Map polylines = {}; - int _polylineIdCounter = 0; - PolylineId? selectedPolyline; - - // Values when toggling polyline color - int colorsIndex = 0; - List colors = [ - Colors.purple, - Colors.red, - Colors.green, - Colors.pink, - ]; - - // Values when toggling polyline width - int widthsIndex = 0; - List widths = [10, 20, 5]; - - int jointTypesIndex = 0; - List jointTypes = [ - JointType.mitered, - JointType.bevel, - JointType.round - ]; - - // Values when toggling polyline end cap type - int endCapsIndex = 0; - List endCaps = [Cap.buttCap, Cap.squareCap, Cap.roundCap]; - - // Values when toggling polyline start cap type - int startCapsIndex = 0; - List startCaps = [Cap.buttCap, Cap.squareCap, Cap.roundCap]; - - // Values when toggling polyline pattern - int patternsIndex = 0; - List> patterns = >[ - [], - [ - PatternItem.dash(30.0), - PatternItem.gap(20.0), - PatternItem.dot, - PatternItem.gap(20.0) - ], - [PatternItem.dash(30.0), PatternItem.gap(20.0)], - [PatternItem.dot, PatternItem.gap(10.0)], - ]; - - // ignore: use_setters_to_change_properties - void _onMapCreated(ExampleGoogleMapController controller) { - this.controller = controller; - } - - @override - void dispose() { - super.dispose(); - } - - void _onPolylineTapped(PolylineId polylineId) { - setState(() { - selectedPolyline = polylineId; - }); - } - - void _remove(PolylineId polylineId) { - setState(() { - if (polylines.containsKey(polylineId)) { - polylines.remove(polylineId); - } - selectedPolyline = null; - }); - } - - void _add() { - final int polylineCount = polylines.length; - - if (polylineCount == 12) { - return; - } - - final String polylineIdVal = 'polyline_id_$_polylineIdCounter'; - _polylineIdCounter++; - final PolylineId polylineId = PolylineId(polylineIdVal); - - final Polyline polyline = Polyline( - polylineId: polylineId, - consumeTapEvents: true, - color: Colors.orange, - width: 5, - points: _createPoints(), - onTap: () { - _onPolylineTapped(polylineId); - }, - ); - - setState(() { - polylines[polylineId] = polyline; - }); - } - - void _toggleGeodesic(PolylineId polylineId) { - final Polyline polyline = polylines[polylineId]!; - setState(() { - polylines[polylineId] = polyline.copyWith( - geodesicParam: !polyline.geodesic, - ); - }); - } - - void _toggleVisible(PolylineId polylineId) { - final Polyline polyline = polylines[polylineId]!; - setState(() { - polylines[polylineId] = polyline.copyWith( - visibleParam: !polyline.visible, - ); - }); - } - - void _changeColor(PolylineId polylineId) { - final Polyline polyline = polylines[polylineId]!; - setState(() { - polylines[polylineId] = polyline.copyWith( - colorParam: colors[++colorsIndex % colors.length], - ); - }); - } - - void _changeWidth(PolylineId polylineId) { - final Polyline polyline = polylines[polylineId]!; - setState(() { - polylines[polylineId] = polyline.copyWith( - widthParam: widths[++widthsIndex % widths.length], - ); - }); - } - - void _changeJointType(PolylineId polylineId) { - final Polyline polyline = polylines[polylineId]!; - setState(() { - polylines[polylineId] = polyline.copyWith( - jointTypeParam: jointTypes[++jointTypesIndex % jointTypes.length], - ); - }); - } - - void _changeEndCap(PolylineId polylineId) { - final Polyline polyline = polylines[polylineId]!; - setState(() { - polylines[polylineId] = polyline.copyWith( - endCapParam: endCaps[++endCapsIndex % endCaps.length], - ); - }); - } - - void _changeStartCap(PolylineId polylineId) { - final Polyline polyline = polylines[polylineId]!; - setState(() { - polylines[polylineId] = polyline.copyWith( - startCapParam: startCaps[++startCapsIndex % startCaps.length], - ); - }); - } - - void _changePattern(PolylineId polylineId) { - final Polyline polyline = polylines[polylineId]!; - setState(() { - polylines[polylineId] = polyline.copyWith( - patternsParam: patterns[++patternsIndex % patterns.length], - ); - }); - } - - @override - Widget build(BuildContext context) { - final bool isIOS = !kIsWeb && defaultTargetPlatform == TargetPlatform.iOS; - - final PolylineId? selectedId = selectedPolyline; - - return Column( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - Center( - child: SizedBox( - width: 350.0, - height: 300.0, - child: ExampleGoogleMap( - initialCameraPosition: const CameraPosition( - target: LatLng(53.1721, -3.5402), - zoom: 7.0, - ), - polylines: Set.of(polylines.values), - onMapCreated: _onMapCreated, - ), - ), - ), - Expanded( - child: SingleChildScrollView( - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - Row( - children: [ - Column( - children: [ - TextButton( - onPressed: _add, - child: const Text('add'), - ), - TextButton( - onPressed: (selectedId == null) - ? null - : () => _remove(selectedId), - child: const Text('remove'), - ), - TextButton( - onPressed: (selectedId == null) - ? null - : () => _toggleVisible(selectedId), - child: const Text('toggle visible'), - ), - TextButton( - onPressed: (selectedId == null) - ? null - : () => _toggleGeodesic(selectedId), - child: const Text('toggle geodesic'), - ), - ], - ), - Column( - children: [ - TextButton( - onPressed: (selectedId == null) - ? null - : () => _changeWidth(selectedId), - child: const Text('change width'), - ), - TextButton( - onPressed: (selectedId == null) - ? null - : () => _changeColor(selectedId), - child: const Text('change color'), - ), - TextButton( - onPressed: isIOS || (selectedId == null) - ? null - : () => _changeStartCap(selectedId), - child: const Text('change start cap [Android only]'), - ), - TextButton( - onPressed: isIOS || (selectedId == null) - ? null - : () => _changeEndCap(selectedId), - child: const Text('change end cap [Android only]'), - ), - TextButton( - onPressed: isIOS || (selectedId == null) - ? null - : () => _changeJointType(selectedId), - child: const Text('change joint type [Android only]'), - ), - TextButton( - onPressed: isIOS || (selectedId == null) - ? null - : () => _changePattern(selectedId), - child: const Text('change pattern [Android only]'), - ), - ], - ) - ], - ) - ], - ), - ), - ), - ], - ); - } - - List _createPoints() { - final List points = []; - final double offset = _polylineIdCounter.ceilToDouble(); - points.add(_createLatLng(51.4816 + offset, -3.1791)); - points.add(_createLatLng(53.0430 + offset, -2.9925)); - points.add(_createLatLng(53.1396 + offset, -4.2739)); - points.add(_createLatLng(52.4153 + offset, -4.0829)); - return points; - } - - LatLng _createLatLng(double lat, double lng) { - return LatLng(lat, lng); - } -} diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/scrolling_map.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/scrolling_map.dart deleted file mode 100644 index a4901f2ce5f..00000000000 --- a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/scrolling_map.dart +++ /dev/null @@ -1,114 +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. - -// ignore_for_file: public_member_api_docs - -import 'package:flutter/foundation.dart'; -import 'package:flutter/gestures.dart'; -import 'package:flutter/material.dart'; -import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart'; - -import 'example_google_map.dart'; -import 'page.dart'; - -const LatLng _center = LatLng(32.080664, 34.9563837); - -class ScrollingMapPage extends GoogleMapExampleAppPage { - const ScrollingMapPage({Key? key}) - : super(const Icon(Icons.map), 'Scrolling map', key: key); - - @override - Widget build(BuildContext context) { - return const ScrollingMapBody(); - } -} - -class ScrollingMapBody extends StatelessWidget { - const ScrollingMapBody({super.key}); - - @override - Widget build(BuildContext context) { - return ListView( - children: [ - Card( - child: Padding( - padding: const EdgeInsets.symmetric(vertical: 30.0), - child: Column( - children: [ - const Padding( - padding: EdgeInsets.only(bottom: 12.0), - child: Text('This map consumes all touch events.'), - ), - Center( - child: SizedBox( - width: 300.0, - height: 300.0, - child: ExampleGoogleMap( - initialCameraPosition: const CameraPosition( - target: _center, - zoom: 11.0, - ), - gestureRecognizers: // - >{ - Factory( - () => EagerGestureRecognizer(), - ), - }, - ), - ), - ), - ], - ), - ), - ), - Card( - child: Padding( - padding: const EdgeInsets.symmetric(vertical: 30.0), - child: Column( - children: [ - const Text("This map doesn't consume the vertical drags."), - const Padding( - padding: EdgeInsets.only(bottom: 12.0), - child: - Text('It still gets other gestures (e.g scale or tap).'), - ), - Center( - child: SizedBox( - width: 300.0, - height: 300.0, - child: ExampleGoogleMap( - initialCameraPosition: const CameraPosition( - target: _center, - zoom: 11.0, - ), - markers: { - Marker( - markerId: const MarkerId('test_marker_id'), - position: LatLng( - _center.latitude, - _center.longitude, - ), - infoWindow: const InfoWindow( - title: 'An interesting location', - snippet: '*', - ), - ), - }, - gestureRecognizers: >{ - Factory( - () => ScaleGestureRecognizer(), - ), - }, - ), - ), - ), - ], - ), - ), - ), - ], - ); - } -} diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/snapshot.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/snapshot.dart deleted file mode 100644 index 56a90a8e49f..00000000000 --- a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/snapshot.dart +++ /dev/null @@ -1,76 +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. - -// ignore_for_file: public_member_api_docs - -import 'dart:typed_data'; - -import 'package:flutter/material.dart'; -import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart'; - -import 'example_google_map.dart'; -import 'page.dart'; - -const CameraPosition _kInitialPosition = - CameraPosition(target: LatLng(-33.852, 151.211), zoom: 11.0); - -class SnapshotPage extends GoogleMapExampleAppPage { - const SnapshotPage({Key? key}) - : super(const Icon(Icons.camera_alt), 'Take a snapshot of the map', - key: key); - - @override - Widget build(BuildContext context) { - return _SnapshotBody(); - } -} - -class _SnapshotBody extends StatefulWidget { - @override - _SnapshotBodyState createState() => _SnapshotBodyState(); -} - -class _SnapshotBodyState extends State<_SnapshotBody> { - ExampleGoogleMapController? _mapController; - Uint8List? _imageBytes; - - @override - Widget build(BuildContext context) { - return Padding( - padding: const EdgeInsets.all(16), - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - SizedBox( - height: 180, - child: ExampleGoogleMap( - onMapCreated: onMapCreated, - initialCameraPosition: _kInitialPosition, - ), - ), - TextButton( - child: const Text('Take a snapshot'), - onPressed: () async { - final Uint8List? imageBytes = - await _mapController?.takeSnapshot(); - setState(() { - _imageBytes = imageBytes; - }); - }, - ), - Container( - decoration: BoxDecoration(color: Colors.blueGrey[50]), - height: 180, - child: _imageBytes != null ? Image.memory(_imageBytes!) : null, - ), - ], - ), - ); - } - - // ignore: use_setters_to_change_properties - void onMapCreated(ExampleGoogleMapController controller) { - _mapController = controller; - } -} diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/tile_overlay.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/tile_overlay.dart deleted file mode 100644 index 9122fda76ce..00000000000 --- a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/lib/tile_overlay.dart +++ /dev/null @@ -1,154 +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. - -// ignore_for_file: public_member_api_docs - -import 'dart:typed_data'; -import 'dart:ui' as ui; - -import 'package:flutter/material.dart'; -import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart'; - -import 'example_google_map.dart'; -import 'page.dart'; - -class TileOverlayPage extends GoogleMapExampleAppPage { - const TileOverlayPage({Key? key}) - : super(const Icon(Icons.map), 'Tile overlay', key: key); - - @override - Widget build(BuildContext context) { - return const TileOverlayBody(); - } -} - -class TileOverlayBody extends StatefulWidget { - const TileOverlayBody({super.key}); - - @override - State createState() => TileOverlayBodyState(); -} - -class TileOverlayBodyState extends State { - TileOverlayBodyState(); - - ExampleGoogleMapController? controller; - TileOverlay? _tileOverlay; - - // ignore: use_setters_to_change_properties - void _onMapCreated(ExampleGoogleMapController controller) { - this.controller = controller; - } - - @override - void dispose() { - super.dispose(); - } - - void _removeTileOverlay() { - setState(() { - _tileOverlay = null; - }); - } - - void _addTileOverlay() { - final TileOverlay tileOverlay = TileOverlay( - tileOverlayId: const TileOverlayId('tile_overlay_1'), - tileProvider: _DebugTileProvider(), - ); - setState(() { - _tileOverlay = tileOverlay; - }); - } - - void _clearTileCache() { - if (_tileOverlay != null && controller != null) { - controller!.clearTileCache(_tileOverlay!.tileOverlayId); - } - } - - @override - Widget build(BuildContext context) { - final Set overlays = { - if (_tileOverlay != null) _tileOverlay!, - }; - return Column( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - Center( - child: SizedBox( - width: 350.0, - height: 300.0, - child: ExampleGoogleMap( - initialCameraPosition: const CameraPosition( - target: LatLng(59.935460, 30.325177), - zoom: 7.0, - ), - tileOverlays: overlays, - onMapCreated: _onMapCreated, - ), - ), - ), - TextButton( - onPressed: _addTileOverlay, - child: const Text('Add tile overlay'), - ), - TextButton( - onPressed: _removeTileOverlay, - child: const Text('Remove tile overlay'), - ), - TextButton( - onPressed: _clearTileCache, - child: const Text('Clear tile cache'), - ), - ], - ); - } -} - -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/ios13/pubspec.yaml b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/pubspec.yaml index e8a456358e7..f34109a26fd 100644 --- a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/pubspec.yaml +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/pubspec.yaml @@ -19,6 +19,8 @@ dependencies: # the parent directory to use the current plugin's version. path: ../../ google_maps_flutter_platform_interface: ^2.2.1 + maps_example_dart: + path: ../shared/maps_example_dart/ dev_dependencies: flutter_driver: diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/shared/README.md b/packages/google_maps_flutter/google_maps_flutter_ios/example/shared/README.md new file mode 100644 index 00000000000..21274701b13 --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/shared/README.md @@ -0,0 +1 @@ +This directory contains shared code used by all of the example apps. diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/lib/animate_camera.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/shared/maps_example_dart/lib/animate_camera.dart similarity index 100% rename from packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/lib/animate_camera.dart rename to packages/google_maps_flutter/google_maps_flutter_ios/example/shared/maps_example_dart/lib/animate_camera.dart diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/lib/example_google_map.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/shared/maps_example_dart/lib/example_google_map.dart similarity index 100% rename from packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/lib/example_google_map.dart rename to packages/google_maps_flutter/google_maps_flutter_ios/example/shared/maps_example_dart/lib/example_google_map.dart diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/lib/lite_mode.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/shared/maps_example_dart/lib/lite_mode.dart similarity index 100% rename from packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/lib/lite_mode.dart rename to packages/google_maps_flutter/google_maps_flutter_ios/example/shared/maps_example_dart/lib/lite_mode.dart diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/lib/map_click.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/shared/maps_example_dart/lib/map_click.dart similarity index 100% rename from packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/lib/map_click.dart rename to packages/google_maps_flutter/google_maps_flutter_ios/example/shared/maps_example_dart/lib/map_click.dart diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/lib/map_coordinates.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/shared/maps_example_dart/lib/map_coordinates.dart similarity index 100% rename from packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/lib/map_coordinates.dart rename to packages/google_maps_flutter/google_maps_flutter_ios/example/shared/maps_example_dart/lib/map_coordinates.dart diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/lib/map_ui.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/shared/maps_example_dart/lib/map_ui.dart similarity index 100% rename from packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/lib/map_ui.dart rename to packages/google_maps_flutter/google_maps_flutter_ios/example/shared/maps_example_dart/lib/map_ui.dart diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/shared/maps_example_dart/lib/maps_demo.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/shared/maps_example_dart/lib/maps_demo.dart new file mode 100644 index 00000000000..15dd4794058 --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/shared/maps_example_dart/lib/maps_demo.dart @@ -0,0 +1,39 @@ +// 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 'page.dart'; + +/// MapsDemo is the Main Application. +class MapsDemo extends StatelessWidget { + /// Default Constructor + const MapsDemo(this.pages, {super.key}); + + /// The list of demo pages. + final List pages; + + void _pushPage(BuildContext context, GoogleMapExampleAppPage page) { + Navigator.of(context).push(MaterialPageRoute( + builder: (_) => Scaffold( + appBar: AppBar(title: Text(page.title)), + body: page, + ))); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar(title: const Text('GoogleMaps examples')), + body: ListView.builder( + itemCount: pages.length, + itemBuilder: (_, int index) => ListTile( + leading: pages[index].leading, + title: Text(pages[index].title), + onTap: () => _pushPage(context, pages[index]), + ), + ), + ); + } +} diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/lib/marker_icons.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/shared/maps_example_dart/lib/marker_icons.dart similarity index 100% rename from packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/lib/marker_icons.dart rename to packages/google_maps_flutter/google_maps_flutter_ios/example/shared/maps_example_dart/lib/marker_icons.dart diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/lib/move_camera.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/shared/maps_example_dart/lib/move_camera.dart similarity index 100% rename from packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/lib/move_camera.dart rename to packages/google_maps_flutter/google_maps_flutter_ios/example/shared/maps_example_dart/lib/move_camera.dart diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/lib/padding.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/shared/maps_example_dart/lib/padding.dart similarity index 100% rename from packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/lib/padding.dart rename to packages/google_maps_flutter/google_maps_flutter_ios/example/shared/maps_example_dart/lib/padding.dart diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/lib/page.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/shared/maps_example_dart/lib/page.dart similarity index 100% rename from packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/lib/page.dart rename to packages/google_maps_flutter/google_maps_flutter_ios/example/shared/maps_example_dart/lib/page.dart diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/lib/place_circle.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/shared/maps_example_dart/lib/place_circle.dart similarity index 100% rename from packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/lib/place_circle.dart rename to packages/google_maps_flutter/google_maps_flutter_ios/example/shared/maps_example_dart/lib/place_circle.dart diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/lib/place_marker.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/shared/maps_example_dart/lib/place_marker.dart similarity index 100% rename from packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/lib/place_marker.dart rename to packages/google_maps_flutter/google_maps_flutter_ios/example/shared/maps_example_dart/lib/place_marker.dart diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/lib/place_polygon.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/shared/maps_example_dart/lib/place_polygon.dart similarity index 100% rename from packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/lib/place_polygon.dart rename to packages/google_maps_flutter/google_maps_flutter_ios/example/shared/maps_example_dart/lib/place_polygon.dart diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/lib/place_polyline.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/shared/maps_example_dart/lib/place_polyline.dart similarity index 100% rename from packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/lib/place_polyline.dart rename to packages/google_maps_flutter/google_maps_flutter_ios/example/shared/maps_example_dart/lib/place_polyline.dart diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/lib/scrolling_map.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/shared/maps_example_dart/lib/scrolling_map.dart similarity index 100% rename from packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/lib/scrolling_map.dart rename to packages/google_maps_flutter/google_maps_flutter_ios/example/shared/maps_example_dart/lib/scrolling_map.dart diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/lib/snapshot.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/shared/maps_example_dart/lib/snapshot.dart similarity index 100% rename from packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/lib/snapshot.dart rename to packages/google_maps_flutter/google_maps_flutter_ios/example/shared/maps_example_dart/lib/snapshot.dart diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/lib/tile_overlay.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/shared/maps_example_dart/lib/tile_overlay.dart similarity index 100% rename from packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/lib/tile_overlay.dart rename to packages/google_maps_flutter/google_maps_flutter_ios/example/shared/maps_example_dart/lib/tile_overlay.dart diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/shared/maps_example_dart/pubspec.yaml b/packages/google_maps_flutter/google_maps_flutter_ios/example/shared/maps_example_dart/pubspec.yaml new file mode 100644 index 00000000000..29640b926d8 --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/shared/maps_example_dart/pubspec.yaml @@ -0,0 +1,24 @@ +name: maps_example_dart +description: Shared Dart code for the example apps. +publish_to: none + +environment: + sdk: ">=2.17.0 <4.0.0" + flutter: ">=3.0.0" + +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.2.1 + +flutter: + uses-material-design: true From f8ae53fd4640443a231c41ed78980a3f4e1285d0 Mon Sep 17 00:00:00 2001 From: Stuart Morgan Date: Wed, 19 Apr 2023 19:52:42 -0400 Subject: [PATCH 16/16] Improve readmes --- .../google_maps_flutter_ios/example/ios11/README.md | 2 +- .../google_maps_flutter_ios/example/ios12/README.md | 2 +- .../google_maps_flutter_ios/example/ios13/README.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/README.md b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/README.md index 0cea26c941f..3d2d3db01e6 100644 --- a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/README.md +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios11/README.md @@ -10,4 +10,4 @@ very unlikely to be relevant. ## Versions -This example requires iOS 11, so will select a 5.x SDK version. +This example requires iOS 11, so will select a 5.x GoogleMaps SDK version. diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/README.md b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/README.md index 3ac96bff12b..9f00e033ae4 100644 --- a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/README.md +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios12/README.md @@ -10,4 +10,4 @@ very unlikely to be relevant. ## Versions -This example requires iOS 12, so will select a 6.x SDK version. +This example requires iOS 12, so will select a 6.x GoogleMaps SDK version. diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/README.md b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/README.md index 64712428ce0..6856977c119 100644 --- a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/README.md +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios13/README.md @@ -10,4 +10,4 @@ very unlikely to be relevant. ## Versions -This example requires iOS 13, so will select a 7.x SDK version. +This example requires iOS 13, so will select a 7.x GoogleMaps SDK version.