[google_maps_flutter] Objective-C code clean up (#5780)
diff --git a/packages/google_maps_flutter/google_maps_flutter/CHANGELOG.md b/packages/google_maps_flutter/google_maps_flutter/CHANGELOG.md
index b4fb662..8d78ec3 100644
--- a/packages/google_maps_flutter/google_maps_flutter/CHANGELOG.md
+++ b/packages/google_maps_flutter/google_maps_flutter/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 2.1.7
+
+* Objective-C code cleanup.
+
## 2.1.6
* Fixes issue in Flutter v3.0.0 where some updates to the map don't take effect on Android.
diff --git a/packages/google_maps_flutter/google_maps_flutter/example/ios/Runner.xcodeproj/project.pbxproj b/packages/google_maps_flutter/google_maps_flutter/example/ios/Runner.xcodeproj/project.pbxproj
index a8d3710..b37246b 100644
--- a/packages/google_maps_flutter/google_maps_flutter/example/ios/Runner.xcodeproj/project.pbxproj
+++ b/packages/google_maps_flutter/google_maps_flutter/example/ios/Runner.xcodeproj/project.pbxproj
@@ -10,6 +10,8 @@
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 */; };
@@ -55,6 +57,8 @@
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = "<group>"; };
1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = "<group>"; };
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; };
+ 6851F3552835BC180032B7C8 /* FLTGoogleMapJSONConversionsConversionTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLTGoogleMapJSONConversionsConversionTests.m; sourceTree = "<group>"; };
+ 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 = "<group>"; };
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 = "<group>"; };
@@ -95,6 +99,7 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
+ 68E4726A2836FF0C00BDDDAC /* MapKit.framework in Frameworks */,
FC8F35FC8CD533B128950487 /* libPods-RunnerTests.a in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
@@ -112,6 +117,7 @@
1E7CF0857EFC88FC263CF3B2 /* Frameworks */ = {
isa = PBXGroup;
children = (
+ 68E472692836FF0C00BDDDAC /* MapKit.framework */,
7755F8F4BABC3D6A0BD4048B /* libPods-Runner.a */,
F267F68029D1A4E2E4C572A7 /* libPods-RunnerTests.a */,
);
@@ -190,6 +196,7 @@
F7151F11265D7ED70028CB91 /* RunnerTests */ = {
isa = PBXGroup;
children = (
+ 6851F3552835BC180032B7C8 /* FLTGoogleMapJSONConversionsConversionTests.m */,
F7151F12265D7ED70028CB91 /* GoogleMapsTests.m */,
982F2A6A27BADE17003C81F4 /* PartiallyMockedMapView.h */,
982F2A6B27BADE17003C81F4 /* PartiallyMockedMapView.m */,
@@ -446,6 +453,7 @@
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/example/ios/RunnerTests/FLTGoogleMapJSONConversionsConversionTests.m b/packages/google_maps_flutter/google_maps_flutter/example/ios/RunnerTests/FLTGoogleMapJSONConversionsConversionTests.m
new file mode 100644
index 0000000..bf226fe
--- /dev/null
+++ b/packages/google_maps_flutter/google_maps_flutter/example/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;
+@import google_maps_flutter.Test;
+@import XCTest;
+@import MapKit;
+@import GoogleMaps;
+
+#import <OCMock/OCMock.h>
+#import "PartiallyMockedMapView.h"
+
+@interface FLTGoogleMapJSONConversionsTests : XCTestCase
+@end
+
+@implementation FLTGoogleMapJSONConversionsTests
+
+- (void)testLocationFromLatLong {
+ NSArray<NSNumber *> *latlong = @[ @1, @2 ];
+ CLLocationCoordinate2D location = [FLTGoogleMapJSONConversions locationFromLatLong:latlong];
+ XCTAssertEqual(location.latitude, 1);
+ XCTAssertEqual(location.longitude, 2);
+}
+
+- (void)testPointFromArray {
+ NSArray<NSNumber *> *array = @[ @1, @2 ];
+ CGPoint point = [FLTGoogleMapJSONConversions pointFromArray:array];
+ XCTAssertEqual(point.x, 1);
+ XCTAssertEqual(point.y, 2);
+}
+
+- (void)testArrayFromLocation {
+ CLLocationCoordinate2D location = CLLocationCoordinate2DMake(1, 2);
+ NSArray<NSNumber *> *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<NSArray *> *latlongs = @[ @[ @1, @2 ], @[ @(3), @(4) ] ];
+ NSArray<CLLocation *> *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<NSArray *> *pointsArray =
+ @[ @[ @[ @1, @2 ], @[ @(3), @(4) ] ], @[ @[ @(5), @(6) ], @[ @(7), @(8) ] ] ];
+ NSArray<NSArray<CLLocation *> *> *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<NSNumber *> *latlong1 = @[ @1, @2 ];
+ NSArray<NSNumber *> *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<NSNumber *> *latlong1 = @[ @1, @2 ];
+ NSArray<NSNumber *> *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/Classes/FLTGoogleMapJSONConversions.h b/packages/google_maps_flutter/google_maps_flutter/ios/Classes/FLTGoogleMapJSONConversions.h
new file mode 100644
index 0000000..cfccb7b
--- /dev/null
+++ b/packages/google_maps_flutter/google_maps_flutter/ios/Classes/FLTGoogleMapJSONConversions.h
@@ -0,0 +1,30 @@
+// 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 <Flutter/Flutter.h>
+#import <GoogleMaps/GoogleMaps.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface FLTGoogleMapJSONConversions : NSObject
+
++ (CLLocationCoordinate2D)locationFromLatLong:(NSArray *)latlong;
++ (CGPoint)pointFromArray:(NSArray *)array;
++ (NSArray *)arrayFromLocation:(CLLocationCoordinate2D)location;
++ (UIColor *)colorFromRGBA:(NSNumber *)data;
++ (NSArray<CLLocation *> *)pointsFromLatLongs:(NSArray *)data;
++ (NSArray<NSArray<CLLocation *> *> *)holesFromPointsArray:(NSArray *)data;
++ (nullable NSDictionary<NSString *, id> *)dictionaryFromPosition:
+ (nullable GMSCameraPosition *)position;
++ (NSDictionary<NSString *, NSNumber *> *)dictionaryFromPoint:(CGPoint)point;
++ (nullable NSDictionary *)dictionaryFromCoordinateBounds:(nullable GMSCoordinateBounds *)bounds;
++ (nullable GMSCameraPosition *)cameraPostionFromDictionary:(nullable NSDictionary *)channelValue;
++ (CGPoint)pointFromDictionary:(NSDictionary *)dictionary;
++ (GMSCoordinateBounds *)coordinateBoundsFromLatLongs:(NSArray *)latlongs;
++ (GMSMapViewType)mapViewTypeFromTypeValue:(NSNumber *)value;
++ (nullable GMSCameraUpdate *)cameraUpdateFromChannelValue:(NSArray *)channelValue;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/packages/google_maps_flutter/google_maps_flutter/ios/Classes/FLTGoogleMapJSONConversions.m b/packages/google_maps_flutter/google_maps_flutter/ios/Classes/FLTGoogleMapJSONConversions.m
new file mode 100644
index 0000000..d554c50
--- /dev/null
+++ b/packages/google_maps_flutter/google_maps_flutter/ios/Classes/FLTGoogleMapJSONConversions.m
@@ -0,0 +1,144 @@
+// 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 "FLTGoogleMapJSONConversions.h"
+
+@implementation FLTGoogleMapJSONConversions
+
++ (CLLocationCoordinate2D)locationFromLatLong:(NSArray *)latlong {
+ return CLLocationCoordinate2DMake([latlong[0] doubleValue], [latlong[1] doubleValue]);
+}
+
++ (CGPoint)pointFromArray:(NSArray *)array {
+ return CGPointMake([array[0] doubleValue], [array[1] doubleValue]);
+}
+
++ (NSArray *)arrayFromLocation:(CLLocationCoordinate2D)location {
+ return @[ @(location.latitude), @(location.longitude) ];
+}
+
++ (UIColor *)colorFromRGBA:(NSNumber *)numberColor {
+ unsigned long value = [numberColor unsignedLongValue];
+ return [UIColor colorWithRed:((float)((value & 0xFF0000) >> 16)) / 255.0
+ green:((float)((value & 0xFF00) >> 8)) / 255.0
+ blue:((float)(value & 0xFF)) / 255.0
+ alpha:((float)((value & 0xFF000000) >> 24)) / 255.0];
+}
+
++ (NSArray<CLLocation *> *)pointsFromLatLongs:(NSArray *)data {
+ NSMutableArray *points = [[NSMutableArray alloc] init];
+ for (unsigned i = 0; i < [data count]; i++) {
+ NSNumber *latitude = data[i][0];
+ NSNumber *longitude = data[i][1];
+ CLLocation *point = [[CLLocation alloc] initWithLatitude:[latitude doubleValue]
+ longitude:[longitude doubleValue]];
+ [points addObject:point];
+ }
+
+ return points;
+}
+
++ (NSArray<NSArray<CLLocation *> *> *)holesFromPointsArray:(NSArray *)data {
+ NSMutableArray<NSArray<CLLocation *> *> *holes = [[[NSMutableArray alloc] init] init];
+ for (unsigned i = 0; i < [data count]; i++) {
+ NSArray<CLLocation *> *points = [FLTGoogleMapJSONConversions pointsFromLatLongs:data[i]];
+ [holes addObject:points];
+ }
+
+ return holes;
+}
+
++ (nullable NSDictionary<NSString *, id> *)dictionaryFromPosition:(GMSCameraPosition *)position {
+ if (!position) {
+ return nil;
+ }
+ return @{
+ @"target" : [FLTGoogleMapJSONConversions arrayFromLocation:[position target]],
+ @"zoom" : @([position zoom]),
+ @"bearing" : @([position bearing]),
+ @"tilt" : @([position viewingAngle]),
+ };
+}
+
++ (NSDictionary<NSString *, NSNumber *> *)dictionaryFromPoint:(CGPoint)point {
+ return @{
+ @"x" : @(lroundf(point.x)),
+ @"y" : @(lroundf(point.y)),
+ };
+}
+
++ (nullable NSDictionary *)dictionaryFromCoordinateBounds:(GMSCoordinateBounds *)bounds {
+ if (!bounds) {
+ return nil;
+ }
+ return @{
+ @"southwest" : [FLTGoogleMapJSONConversions arrayFromLocation:[bounds southWest]],
+ @"northeast" : [FLTGoogleMapJSONConversions arrayFromLocation:[bounds northEast]],
+ };
+}
+
++ (nullable GMSCameraPosition *)cameraPostionFromDictionary:(nullable NSDictionary *)data {
+ if (!data) {
+ return nil;
+ }
+ return [GMSCameraPosition
+ cameraWithTarget:[FLTGoogleMapJSONConversions locationFromLatLong:data[@"target"]]
+ zoom:[data[@"zoom"] floatValue]
+ bearing:[data[@"bearing"] doubleValue]
+ viewingAngle:[data[@"tilt"] doubleValue]];
+}
+
++ (CGPoint)pointFromDictionary:(NSDictionary *)dictionary {
+ double x = [dictionary[@"x"] doubleValue];
+ double y = [dictionary[@"y"] doubleValue];
+ return CGPointMake(x, y);
+}
+
++ (GMSCoordinateBounds *)coordinateBoundsFromLatLongs:(NSArray *)latlongs {
+ return [[GMSCoordinateBounds alloc]
+ initWithCoordinate:[FLTGoogleMapJSONConversions locationFromLatLong:latlongs[0]]
+ coordinate:[FLTGoogleMapJSONConversions locationFromLatLong:latlongs[1]]];
+}
+
++ (GMSMapViewType)mapViewTypeFromTypeValue:(NSNumber *)typeValue {
+ int value = [typeValue intValue];
+ return (GMSMapViewType)(value == 0 ? 5 : value);
+}
+
++ (nullable GMSCameraUpdate *)cameraUpdateFromChannelValue:(NSArray *)channelValue {
+ NSString *update = channelValue[0];
+ if ([update isEqualToString:@"newCameraPosition"]) {
+ return [GMSCameraUpdate
+ setCamera:[FLTGoogleMapJSONConversions cameraPostionFromDictionary:channelValue[1]]];
+ } else if ([update isEqualToString:@"newLatLng"]) {
+ return [GMSCameraUpdate
+ setTarget:[FLTGoogleMapJSONConversions locationFromLatLong:channelValue[1]]];
+ } else if ([update isEqualToString:@"newLatLngBounds"]) {
+ return [GMSCameraUpdate
+ fitBounds:[FLTGoogleMapJSONConversions coordinateBoundsFromLatLongs:channelValue[1]]
+ withPadding:[channelValue[2] doubleValue]];
+ } else if ([update isEqualToString:@"newLatLngZoom"]) {
+ return
+ [GMSCameraUpdate setTarget:[FLTGoogleMapJSONConversions locationFromLatLong:channelValue[1]]
+ zoom:[channelValue[2] floatValue]];
+ } else if ([update isEqualToString:@"scrollBy"]) {
+ return [GMSCameraUpdate scrollByX:[channelValue[1] doubleValue]
+ Y:[channelValue[2] doubleValue]];
+ } else if ([update isEqualToString:@"zoomBy"]) {
+ if (channelValue.count == 2) {
+ return [GMSCameraUpdate zoomBy:[channelValue[1] floatValue]];
+ } else {
+ return [GMSCameraUpdate zoomBy:[channelValue[1] floatValue]
+ atPoint:[FLTGoogleMapJSONConversions pointFromArray:channelValue[2]]];
+ }
+ } else if ([update isEqualToString:@"zoomIn"]) {
+ return [GMSCameraUpdate zoomIn];
+ } else if ([update isEqualToString:@"zoomOut"]) {
+ return [GMSCameraUpdate zoomOut];
+ } else if ([update isEqualToString:@"zoomTo"]) {
+ return [GMSCameraUpdate zoomTo:[channelValue[1] floatValue]];
+ }
+ return nil;
+}
+@end
diff --git a/packages/google_maps_flutter/google_maps_flutter/ios/Classes/FLTGoogleMapTileOverlayController.h b/packages/google_maps_flutter/google_maps_flutter/ios/Classes/FLTGoogleMapTileOverlayController.h
index 356a13f..5dcc665 100644
--- a/packages/google_maps_flutter/google_maps_flutter/ios/Classes/FLTGoogleMapTileOverlayController.h
+++ b/packages/google_maps_flutter/google_maps_flutter/ios/Classes/FLTGoogleMapTileOverlayController.h
@@ -7,25 +7,19 @@
NS_ASSUME_NONNULL_BEGIN
-// Defines map UI options writable from Flutter.
-@protocol FLTGoogleMapTileOverlayOptionsSink
-- (void)setFadeIn:(BOOL)fadeIn;
-- (void)setTransparency:(float)transparency;
-- (void)setZIndex:(int)zIndex;
-- (void)setVisible:(BOOL)visible;
-- (void)setTileSize:(NSInteger)tileSize;
-@end
-
-@interface FLTGoogleMapTileOverlayController : NSObject <FLTGoogleMapTileOverlayOptionsSink>
-- (instancetype)initWithTileLayer:(GMSTileLayer *)tileLayer mapView:(GMSMapView *)mapView;
+@interface FLTGoogleMapTileOverlayController : NSObject
+- (instancetype)initWithTileLayer:(GMSTileLayer *)tileLayer
+ mapView:(GMSMapView *)mapView
+ options:(NSDictionary *)optionsData;
- (void)removeTileOverlay;
- (void)clearTileCache;
- (NSDictionary *)getTileOverlayInfo;
@end
@interface FLTTileProviderController : GMSTileLayer
-@property(copy, nonatomic, readonly) NSString *tileOverlayId;
-- (instancetype)init:(FlutterMethodChannel *)methodChannel tileOverlayId:(NSString *)tileOverlayId;
+@property(copy, nonatomic, readonly) NSString *tileOverlayIdentifier;
+- (instancetype)init:(FlutterMethodChannel *)methodChannel
+ withTileOverlayIdentifier:(NSString *)identifier;
@end
@interface FLTTileOverlaysController : NSObject
@@ -34,9 +28,9 @@
registrar:(NSObject<FlutterPluginRegistrar> *)registrar;
- (void)addTileOverlays:(NSArray *)tileOverlaysToAdd;
- (void)changeTileOverlays:(NSArray *)tileOverlaysToChange;
-- (void)removeTileOverlayIds:(NSArray *)tileOverlayIdsToRemove;
-- (void)clearTileCache:(NSString *)tileOverlayId;
-- (nullable NSDictionary *)getTileOverlayInfo:(NSString *)tileverlayId;
+- (void)removeTileOverlayWithIdentifiers:(NSArray *)identifiers;
+- (void)clearTileCacheWithIdentifier:(NSString *)identifier;
+- (nullable NSDictionary *)tileOverlayInfoWithIdentifier:(NSString *)identifier;
@end
NS_ASSUME_NONNULL_END
diff --git a/packages/google_maps_flutter/google_maps_flutter/ios/Classes/FLTGoogleMapTileOverlayController.m b/packages/google_maps_flutter/google_maps_flutter/ios/Classes/FLTGoogleMapTileOverlayController.m
index 6baa753..5863697 100644
--- a/packages/google_maps_flutter/google_maps_flutter/ios/Classes/FLTGoogleMapTileOverlayController.m
+++ b/packages/google_maps_flutter/google_maps_flutter/ios/Classes/FLTGoogleMapTileOverlayController.m
@@ -3,36 +3,7 @@
// found in the LICENSE file.
#import "FLTGoogleMapTileOverlayController.h"
-#import "JsonConversions.h"
-
-static void InterpretTileOverlayOptions(NSDictionary *data,
- id<FLTGoogleMapTileOverlayOptionsSink> sink,
- NSObject<FlutterPluginRegistrar> *registrar) {
- NSNumber *visible = data[@"visible"];
- if (visible != nil) {
- [sink setVisible:visible.boolValue];
- }
-
- NSNumber *transparency = data[@"transparency"];
- if (transparency != nil) {
- [sink setTransparency:transparency.floatValue];
- }
-
- NSNumber *zIndex = data[@"zIndex"];
- if (zIndex != nil) {
- [sink setZIndex:zIndex.intValue];
- }
-
- NSNumber *fadeIn = data[@"fadeIn"];
- if (fadeIn != nil) {
- [sink setFadeIn:fadeIn.boolValue];
- }
-
- NSNumber *tileSize = data[@"tileSize"];
- if (tileSize != nil) {
- [sink setTileSize:tileSize.integerValue];
- }
-}
+#import "FLTGoogleMapJSONConversions.h"
@interface FLTGoogleMapTileOverlayController ()
@@ -43,11 +14,14 @@
@implementation FLTGoogleMapTileOverlayController
-- (instancetype)initWithTileLayer:(GMSTileLayer *)tileLayer mapView:(GMSMapView *)mapView {
+- (instancetype)initWithTileLayer:(GMSTileLayer *)tileLayer
+ mapView:(GMSMapView *)mapView
+ options:(NSDictionary *)optionsData {
self = [super init];
if (self) {
- self.layer = tileLayer;
- self.mapView = mapView;
+ _layer = tileLayer;
+ _mapView = mapView;
+ [self interpretTileOverlayOptions:optionsData];
}
return self;
}
@@ -71,8 +45,6 @@
return info;
}
-#pragma mark - FLTGoogleMapTileOverlayOptionsSink methods
-
- (void)setFadeIn:(BOOL)fadeIn {
self.layer.fadeIn = fadeIn;
}
@@ -93,22 +65,53 @@
- (void)setTileSize:(NSInteger)tileSize {
self.layer.tileSize = tileSize;
}
+
+- (void)interpretTileOverlayOptions:(NSDictionary *)data {
+ if (!data) {
+ return;
+ }
+ NSNumber *visible = data[@"visible"];
+ if (visible != nil && visible != (id)[NSNull null]) {
+ [self setVisible:visible.boolValue];
+ }
+
+ NSNumber *transparency = data[@"transparency"];
+ if (transparency != nil && transparency != (id)[NSNull null]) {
+ [self setTransparency:transparency.floatValue];
+ }
+
+ NSNumber *zIndex = data[@"zIndex"];
+ if (zIndex != nil && zIndex != (id)[NSNull null]) {
+ [self setZIndex:zIndex.intValue];
+ }
+
+ NSNumber *fadeIn = data[@"fadeIn"];
+ if (fadeIn != nil && fadeIn != (id)[NSNull null]) {
+ [self setFadeIn:fadeIn.boolValue];
+ }
+
+ NSNumber *tileSize = data[@"tileSize"];
+ if (tileSize != nil && tileSize != (id)[NSNull null]) {
+ [self setTileSize:tileSize.integerValue];
+ }
+}
+
@end
@interface FLTTileProviderController ()
-@property(weak, nonatomic) FlutterMethodChannel *methodChannel;
-@property(copy, nonatomic, readwrite) NSString *tileOverlayId;
+@property(strong, nonatomic) FlutterMethodChannel *methodChannel;
@end
@implementation FLTTileProviderController
-- (instancetype)init:(FlutterMethodChannel *)methodChannel tileOverlayId:(NSString *)tileOverlayId {
+- (instancetype)init:(FlutterMethodChannel *)methodChannel
+ withTileOverlayIdentifier:(NSString *)identifier {
self = [super init];
if (self) {
- self.methodChannel = methodChannel;
- self.tileOverlayId = tileOverlayId;
+ _methodChannel = methodChannel;
+ _tileOverlayIdentifier = identifier;
}
return self;
}
@@ -122,7 +125,7 @@
[self.methodChannel
invokeMethod:@"tileOverlay#getTile"
arguments:@{
- @"tileOverlayId" : self.tileOverlayId,
+ @"tileOverlayId" : self.tileOverlayIdentifier,
@"x" : @(x),
@"y" : @(y),
@"zoom" : @(zoom)
@@ -156,9 +159,8 @@
@interface FLTTileOverlaysController ()
-@property(strong, nonatomic) NSMutableDictionary *tileOverlayIdToController;
-@property(weak, nonatomic) FlutterMethodChannel *methodChannel;
-@property(weak, nonatomic) NSObject<FlutterPluginRegistrar> *registrar;
+@property(strong, nonatomic) NSMutableDictionary *tileOverlayIdentifierToController;
+@property(strong, nonatomic) FlutterMethodChannel *methodChannel;
@property(weak, nonatomic) GMSMapView *mapView;
@end
@@ -170,64 +172,67 @@
registrar:(NSObject<FlutterPluginRegistrar> *)registrar {
self = [super init];
if (self) {
- self.methodChannel = methodChannel;
- self.mapView = mapView;
- self.tileOverlayIdToController = [[NSMutableDictionary alloc] init];
- self.registrar = registrar;
+ _methodChannel = methodChannel;
+ _mapView = mapView;
+ _tileOverlayIdentifierToController = [[NSMutableDictionary alloc] init];
}
return self;
}
- (void)addTileOverlays:(NSArray *)tileOverlaysToAdd {
for (NSDictionary *tileOverlay in tileOverlaysToAdd) {
- NSString *tileOverlayId = [FLTTileOverlaysController getTileOverlayId:tileOverlay];
+ NSString *identifier = [FLTTileOverlaysController identifierForTileOverlay:tileOverlay];
FLTTileProviderController *tileProvider =
- [[FLTTileProviderController alloc] init:self.methodChannel tileOverlayId:tileOverlayId];
+ [[FLTTileProviderController alloc] init:self.methodChannel
+ withTileOverlayIdentifier:identifier];
FLTGoogleMapTileOverlayController *controller =
[[FLTGoogleMapTileOverlayController alloc] initWithTileLayer:tileProvider
- mapView:self.mapView];
- InterpretTileOverlayOptions(tileOverlay, controller, self.registrar);
- self.tileOverlayIdToController[tileOverlayId] = controller;
+ mapView:self.mapView
+ options:tileOverlay];
+ self.tileOverlayIdentifierToController[identifier] = controller;
}
}
- (void)changeTileOverlays:(NSArray *)tileOverlaysToChange {
for (NSDictionary *tileOverlay in tileOverlaysToChange) {
- NSString *tileOverlayId = [FLTTileOverlaysController getTileOverlayId:tileOverlay];
- FLTGoogleMapTileOverlayController *controller = self.tileOverlayIdToController[tileOverlayId];
+ NSString *identifier = [FLTTileOverlaysController identifierForTileOverlay:tileOverlay];
+ FLTGoogleMapTileOverlayController *controller =
+ self.tileOverlayIdentifierToController[identifier];
if (!controller) {
continue;
}
- InterpretTileOverlayOptions(tileOverlay, controller, self.registrar);
+ [controller interpretTileOverlayOptions:tileOverlay];
}
}
-- (void)removeTileOverlayIds:(NSArray *)tileOverlayIdsToRemove {
- for (NSString *tileOverlayId in tileOverlayIdsToRemove) {
- FLTGoogleMapTileOverlayController *controller = self.tileOverlayIdToController[tileOverlayId];
+- (void)removeTileOverlayWithIdentifiers:(NSArray *)identifiers {
+ for (NSString *identifier in identifiers) {
+ FLTGoogleMapTileOverlayController *controller =
+ self.tileOverlayIdentifierToController[identifier];
if (!controller) {
continue;
}
[controller removeTileOverlay];
- [self.tileOverlayIdToController removeObjectForKey:tileOverlayId];
+ [self.tileOverlayIdentifierToController removeObjectForKey:identifier];
}
}
-- (void)clearTileCache:(NSString *)tileOverlayId {
- FLTGoogleMapTileOverlayController *controller = self.tileOverlayIdToController[tileOverlayId];
+- (void)clearTileCacheWithIdentifier:(NSString *)identifier {
+ FLTGoogleMapTileOverlayController *controller =
+ self.tileOverlayIdentifierToController[identifier];
if (!controller) {
return;
}
[controller clearTileCache];
}
-- (nullable NSDictionary *)getTileOverlayInfo:(NSString *)tileverlayId {
- if (self.tileOverlayIdToController[tileverlayId] == nil) {
+- (nullable NSDictionary *)tileOverlayInfoWithIdentifier:(NSString *)identifier {
+ if (self.tileOverlayIdentifierToController[identifier] == nil) {
return nil;
}
- return [self.tileOverlayIdToController[tileverlayId] getTileOverlayInfo];
+ return [self.tileOverlayIdentifierToController[identifier] getTileOverlayInfo];
}
-+ (NSString *)getTileOverlayId:(NSDictionary *)tileOverlay {
++ (NSString *)identifierForTileOverlay:(NSDictionary *)tileOverlay {
return tileOverlay[@"tileOverlayId"];
}
diff --git a/packages/google_maps_flutter/google_maps_flutter/ios/Classes/FLTGoogleMapsPlugin.h b/packages/google_maps_flutter/google_maps_flutter/ios/Classes/FLTGoogleMapsPlugin.h
index 953c055..26f69ea 100644
--- a/packages/google_maps_flutter/google_maps_flutter/ios/Classes/FLTGoogleMapsPlugin.h
+++ b/packages/google_maps_flutter/google_maps_flutter/ios/Classes/FLTGoogleMapsPlugin.h
@@ -10,5 +10,9 @@
#import "GoogleMapPolygonController.h"
#import "GoogleMapPolylineController.h"
+NS_ASSUME_NONNULL_BEGIN
+
@interface FLTGoogleMapsPlugin : NSObject <FlutterPlugin>
@end
+
+NS_ASSUME_NONNULL_END
diff --git a/packages/google_maps_flutter/google_maps_flutter/ios/Classes/FLTGoogleMapsPlugin.m b/packages/google_maps_flutter/google_maps_flutter/ios/Classes/FLTGoogleMapsPlugin.m
index e78a505..d62f19c 100644
--- a/packages/google_maps_flutter/google_maps_flutter/ios/Classes/FLTGoogleMapsPlugin.m
+++ b/packages/google_maps_flutter/google_maps_flutter/ios/Classes/FLTGoogleMapsPlugin.m
@@ -6,11 +6,7 @@
#pragma mark - GoogleMaps plugin implementation
-@implementation FLTGoogleMapsPlugin {
- NSObject<FlutterPluginRegistrar> *_registrar;
- FlutterMethodChannel *_channel;
- NSMutableDictionary *_mapControllers;
-}
+@implementation FLTGoogleMapsPlugin
+ (void)registerWithRegistrar:(NSObject<FlutterPluginRegistrar> *)registrar {
FLTGoogleMapFactory *googleMapFactory = [[FLTGoogleMapFactory alloc] initWithRegistrar:registrar];
@@ -20,12 +16,4 @@
FlutterPlatformViewGestureRecognizersBlockingPolicyWaitUntilTouchesEnded];
}
-- (FLTGoogleMapController *)mapFromCall:(FlutterMethodCall *)call error:(FlutterError **)error {
- id mapId = call.arguments[@"map"];
- FLTGoogleMapController *controller = _mapControllers[mapId];
- if (!controller && error) {
- *error = [FlutterError errorWithCode:@"unknown_map" message:nil details:mapId];
- }
- return controller;
-}
@end
diff --git a/packages/google_maps_flutter/google_maps_flutter/ios/Classes/GoogleMapCircleController.h b/packages/google_maps_flutter/google_maps_flutter/ios/Classes/GoogleMapCircleController.h
index 26b7ce5..6b67760 100644
--- a/packages/google_maps_flutter/google_maps_flutter/ios/Classes/GoogleMapCircleController.h
+++ b/packages/google_maps_flutter/google_maps_flutter/ios/Classes/GoogleMapCircleController.h
@@ -5,25 +5,13 @@
#import <Flutter/Flutter.h>
#import <GoogleMaps/GoogleMaps.h>
-// Defines circle UI options writable from Flutter.
-@protocol FLTGoogleMapCircleOptionsSink
-- (void)setConsumeTapEvents:(BOOL)consume;
-- (void)setVisible:(BOOL)visible;
-- (void)setStrokeColor:(UIColor *)color;
-- (void)setStrokeWidth:(CGFloat)width;
-- (void)setFillColor:(UIColor *)color;
-- (void)setCenter:(CLLocationCoordinate2D)center;
-- (void)setRadius:(CLLocationDistance)radius;
-- (void)setZIndex:(int)zIndex;
-@end
-
// Defines circle controllable by Flutter.
-@interface FLTGoogleMapCircleController : NSObject <FLTGoogleMapCircleOptionsSink>
-@property(atomic, readonly) NSString *circleId;
+@interface FLTGoogleMapCircleController : NSObject
- (instancetype)initCircleWithPosition:(CLLocationCoordinate2D)position
radius:(CLLocationDistance)radius
- circleId:(NSString *)circleId
- mapView:(GMSMapView *)mapView;
+ circleId:(NSString *)circleIdentifier
+ mapView:(GMSMapView *)mapView
+ options:(NSDictionary *)options;
- (void)removeCircle;
@end
@@ -33,7 +21,7 @@
registrar:(NSObject<FlutterPluginRegistrar> *)registrar;
- (void)addCircles:(NSArray *)circlesToAdd;
- (void)changeCircles:(NSArray *)circlesToChange;
-- (void)removeCircleIds:(NSArray *)circleIdsToRemove;
-- (void)onCircleTap:(NSString *)circleId;
-- (bool)hasCircleWithId:(NSString *)circleId;
+- (void)removeCircleWithIdentifiers:(NSArray *)identifiers;
+- (void)didTapCircleWithIdentifier:(NSString *)identifier;
+- (bool)hasCircleWithIdentifier:(NSString *)identifier;
@end
diff --git a/packages/google_maps_flutter/google_maps_flutter/ios/Classes/GoogleMapCircleController.m b/packages/google_maps_flutter/google_maps_flutter/ios/Classes/GoogleMapCircleController.m
index d97de58..53bf690 100644
--- a/packages/google_maps_flutter/google_maps_flutter/ios/Classes/GoogleMapCircleController.m
+++ b/packages/google_maps_flutter/google_maps_flutter/ios/Classes/GoogleMapCircleController.m
@@ -3,122 +3,116 @@
// found in the LICENSE file.
#import "GoogleMapCircleController.h"
-#import "JsonConversions.h"
+#import "FLTGoogleMapJSONConversions.h"
-@implementation FLTGoogleMapCircleController {
- GMSCircle *_circle;
- GMSMapView *_mapView;
-}
+@interface FLTGoogleMapCircleController ()
+
+@property(nonatomic, strong) GMSCircle *circle;
+@property(nonatomic, weak) GMSMapView *mapView;
+
+@end
+
+@implementation FLTGoogleMapCircleController
+
- (instancetype)initCircleWithPosition:(CLLocationCoordinate2D)position
radius:(CLLocationDistance)radius
- circleId:(NSString *)circleId
- mapView:(GMSMapView *)mapView {
+ circleId:(NSString *)circleIdentifier
+ mapView:(GMSMapView *)mapView
+ options:(NSDictionary *)options {
self = [super init];
if (self) {
_circle = [GMSCircle circleWithPosition:position radius:radius];
_mapView = mapView;
- _circleId = circleId;
- _circle.userData = @[ circleId ];
+ _circle.userData = @[ circleIdentifier ];
+ [self interpretCircleOptions:options];
}
return self;
}
- (void)removeCircle {
- _circle.map = nil;
+ self.circle.map = nil;
}
-#pragma mark - FLTGoogleMapCircleOptionsSink methods
-
- (void)setConsumeTapEvents:(BOOL)consumes {
- _circle.tappable = consumes;
+ self.circle.tappable = consumes;
}
- (void)setVisible:(BOOL)visible {
- _circle.map = visible ? _mapView : nil;
+ self.circle.map = visible ? self.mapView : nil;
}
- (void)setZIndex:(int)zIndex {
- _circle.zIndex = zIndex;
+ self.circle.zIndex = zIndex;
}
- (void)setCenter:(CLLocationCoordinate2D)center {
- _circle.position = center;
+ self.circle.position = center;
}
- (void)setRadius:(CLLocationDistance)radius {
- _circle.radius = radius;
+ self.circle.radius = radius;
}
- (void)setStrokeColor:(UIColor *)color {
- _circle.strokeColor = color;
+ self.circle.strokeColor = color;
}
- (void)setStrokeWidth:(CGFloat)width {
- _circle.strokeWidth = width;
+ self.circle.strokeWidth = width;
}
- (void)setFillColor:(UIColor *)color {
- _circle.fillColor = color;
-}
-@end
-
-static int ToInt(NSNumber *data) { return [FLTGoogleMapJsonConversions toInt:data]; }
-
-static BOOL ToBool(NSNumber *data) { return [FLTGoogleMapJsonConversions toBool:data]; }
-
-static CLLocationCoordinate2D ToLocation(NSArray *data) {
- return [FLTGoogleMapJsonConversions toLocation:data];
+ self.circle.fillColor = color;
}
-static CLLocationDistance ToDistance(NSNumber *data) {
- return [FLTGoogleMapJsonConversions toFloat:data];
-}
-
-static UIColor *ToColor(NSNumber *data) { return [FLTGoogleMapJsonConversions toColor:data]; }
-
-static void InterpretCircleOptions(NSDictionary *data, id<FLTGoogleMapCircleOptionsSink> sink,
- NSObject<FlutterPluginRegistrar> *registrar) {
+- (void)interpretCircleOptions:(NSDictionary *)data {
NSNumber *consumeTapEvents = data[@"consumeTapEvents"];
- if (consumeTapEvents != nil) {
- [sink setConsumeTapEvents:ToBool(consumeTapEvents)];
+ if (consumeTapEvents && consumeTapEvents != (id)[NSNull null]) {
+ [self setConsumeTapEvents:consumeTapEvents.boolValue];
}
NSNumber *visible = data[@"visible"];
- if (visible != nil) {
- [sink setVisible:ToBool(visible)];
+ if (visible && visible != (id)[NSNull null]) {
+ [self setVisible:[visible boolValue]];
}
NSNumber *zIndex = data[@"zIndex"];
- if (zIndex != nil) {
- [sink setZIndex:ToInt(zIndex)];
+ if (zIndex && zIndex != (id)[NSNull null]) {
+ [self setZIndex:[zIndex intValue]];
}
NSArray *center = data[@"center"];
- if (center) {
- [sink setCenter:ToLocation(center)];
+ if (center && center != (id)[NSNull null]) {
+ [self setCenter:[FLTGoogleMapJSONConversions locationFromLatLong:center]];
}
NSNumber *radius = data[@"radius"];
- if (radius != nil) {
- [sink setRadius:ToDistance(radius)];
+ if (radius && radius != (id)[NSNull null]) {
+ [self setRadius:[radius floatValue]];
}
NSNumber *strokeColor = data[@"strokeColor"];
- if (strokeColor != nil) {
- [sink setStrokeColor:ToColor(strokeColor)];
+ if (strokeColor && strokeColor != (id)[NSNull null]) {
+ [self setStrokeColor:[FLTGoogleMapJSONConversions colorFromRGBA:strokeColor]];
}
NSNumber *strokeWidth = data[@"strokeWidth"];
- if (strokeWidth != nil) {
- [sink setStrokeWidth:ToInt(strokeWidth)];
+ if (strokeWidth && strokeWidth != (id)[NSNull null]) {
+ [self setStrokeWidth:[strokeWidth intValue]];
}
NSNumber *fillColor = data[@"fillColor"];
- if (fillColor != nil) {
- [sink setFillColor:ToColor(fillColor)];
+ if (fillColor && fillColor != (id)[NSNull null]) {
+ [self setFillColor:[FLTGoogleMapJSONConversions colorFromRGBA:fillColor]];
}
}
-@implementation FLTCirclesController {
- NSMutableDictionary *_circleIdToController;
- FlutterMethodChannel *_methodChannel;
- NSObject<FlutterPluginRegistrar> *_registrar;
- GMSMapView *_mapView;
-}
+@end
+
+@interface FLTCirclesController ()
+
+@property(strong, nonatomic) FlutterMethodChannel *methodChannel;
+@property(weak, nonatomic) GMSMapView *mapView;
+@property(strong, nonatomic) NSMutableDictionary *circleIdToController;
+
+@end
+
+@implementation FLTCirclesController
+
- (instancetype)init:(FlutterMethodChannel *)methodChannel
mapView:(GMSMapView *)mapView
registrar:(NSObject<FlutterPluginRegistrar> *)registrar {
@@ -127,10 +121,10 @@
_methodChannel = methodChannel;
_mapView = mapView;
_circleIdToController = [NSMutableDictionary dictionaryWithCapacity:1];
- _registrar = registrar;
}
return self;
}
+
- (void)addCircles:(NSArray *)circlesToAdd {
for (NSDictionary *circle in circlesToAdd) {
CLLocationCoordinate2D position = [FLTCirclesController getPosition:circle];
@@ -140,59 +134,64 @@
[[FLTGoogleMapCircleController alloc] initCircleWithPosition:position
radius:radius
circleId:circleId
- mapView:_mapView];
- InterpretCircleOptions(circle, controller, _registrar);
- _circleIdToController[circleId] = controller;
+ mapView:self.mapView
+ options:circle];
+ self.circleIdToController[circleId] = controller;
}
}
+
- (void)changeCircles:(NSArray *)circlesToChange {
for (NSDictionary *circle in circlesToChange) {
NSString *circleId = [FLTCirclesController getCircleId:circle];
- FLTGoogleMapCircleController *controller = _circleIdToController[circleId];
+ FLTGoogleMapCircleController *controller = self.circleIdToController[circleId];
if (!controller) {
continue;
}
- InterpretCircleOptions(circle, controller, _registrar);
+ [controller interpretCircleOptions:circle];
}
}
-- (void)removeCircleIds:(NSArray *)circleIdsToRemove {
- for (NSString *circleId in circleIdsToRemove) {
- if (!circleId) {
- continue;
- }
- FLTGoogleMapCircleController *controller = _circleIdToController[circleId];
+
+- (void)removeCircleWithIdentifiers:(NSArray *)identifiers {
+ for (NSString *identifier in identifiers) {
+ FLTGoogleMapCircleController *controller = self.circleIdToController[identifier];
if (!controller) {
continue;
}
[controller removeCircle];
- [_circleIdToController removeObjectForKey:circleId];
+ [self.circleIdToController removeObjectForKey:identifier];
}
}
-- (bool)hasCircleWithId:(NSString *)circleId {
- if (!circleId) {
+
+- (bool)hasCircleWithIdentifier:(NSString *)identifier {
+ if (!identifier) {
return false;
}
- return _circleIdToController[circleId] != nil;
+ return self.circleIdToController[identifier] != nil;
}
-- (void)onCircleTap:(NSString *)circleId {
- if (!circleId) {
+
+- (void)didTapCircleWithIdentifier:(NSString *)identifier {
+ if (!identifier) {
return;
}
- FLTGoogleMapCircleController *controller = _circleIdToController[circleId];
+ FLTGoogleMapCircleController *controller = self.circleIdToController[identifier];
if (!controller) {
return;
}
- [_methodChannel invokeMethod:@"circle#onTap" arguments:@{@"circleId" : circleId}];
+ [self.methodChannel invokeMethod:@"circle#onTap" arguments:@{@"circleId" : identifier}];
}
+
+ (CLLocationCoordinate2D)getPosition:(NSDictionary *)circle {
NSArray *center = circle[@"center"];
- return ToLocation(center);
+ return [FLTGoogleMapJSONConversions locationFromLatLong:center];
}
+
+ (CLLocationDistance)getRadius:(NSDictionary *)circle {
NSNumber *radius = circle[@"radius"];
- return ToDistance(radius);
+ return [radius floatValue];
}
+
+ (NSString *)getCircleId:(NSDictionary *)circle {
return circle[@"circleId"];
}
+
@end
diff --git a/packages/google_maps_flutter/google_maps_flutter/ios/Classes/GoogleMapController.h b/packages/google_maps_flutter/google_maps_flutter/ios/Classes/GoogleMapController.h
index a8cebb9..d1069ac 100644
--- a/packages/google_maps_flutter/google_maps_flutter/ios/Classes/GoogleMapController.h
+++ b/packages/google_maps_flutter/google_maps_flutter/ios/Classes/GoogleMapController.h
@@ -11,34 +11,13 @@
NS_ASSUME_NONNULL_BEGIN
-// Defines map UI options writable from Flutter.
-@protocol FLTGoogleMapOptionsSink
-- (void)setCameraTargetBounds:(nullable GMSCoordinateBounds *)bounds;
-- (void)setCompassEnabled:(BOOL)enabled;
-- (void)setIndoorEnabled:(BOOL)enabled;
-- (void)setTrafficEnabled:(BOOL)enabled;
-- (void)setBuildingsEnabled:(BOOL)enabled;
-- (void)setMapType:(GMSMapViewType)type;
-- (void)setMinZoom:(float)minZoom maxZoom:(float)maxZoom;
-- (void)setPaddingTop:(float)top left:(float)left bottom:(float)bottom right:(float)right;
-- (void)setRotateGesturesEnabled:(BOOL)enabled;
-- (void)setScrollGesturesEnabled:(BOOL)enabled;
-- (void)setTiltGesturesEnabled:(BOOL)enabled;
-- (void)setTrackCameraPosition:(BOOL)enabled;
-- (void)setZoomGesturesEnabled:(BOOL)enabled;
-- (void)setMyLocationEnabled:(BOOL)enabled;
-- (void)setMyLocationButtonEnabled:(BOOL)enabled;
-- (nullable NSString *)setMapStyle:(NSString *)mapStyle;
-@end
-
// Defines map overlay controllable from Flutter.
-@interface FLTGoogleMapController
- : NSObject <GMSMapViewDelegate, FLTGoogleMapOptionsSink, FlutterPlatformView>
+@interface FLTGoogleMapController : NSObject <GMSMapViewDelegate, FlutterPlatformView>
- (instancetype)initWithFrame:(CGRect)frame
viewIdentifier:(int64_t)viewId
arguments:(nullable id)args
registrar:(NSObject<FlutterPluginRegistrar> *)registrar;
-- (void)showAtX:(CGFloat)x Y:(CGFloat)y;
+- (void)showAtOrigin:(CGPoint)origin;
- (void)hide;
- (void)animateWithCameraUpdate:(GMSCameraUpdate *)cameraUpdate;
- (void)moveWithCameraUpdate:(GMSCameraUpdate *)cameraUpdate;
diff --git a/packages/google_maps_flutter/google_maps_flutter/ios/Classes/GoogleMapController.m b/packages/google_maps_flutter/google_maps_flutter/ios/Classes/GoogleMapController.m
index ca80681..6378994 100644
--- a/packages/google_maps_flutter/google_maps_flutter/ios/Classes/GoogleMapController.m
+++ b/packages/google_maps_flutter/google_maps_flutter/ios/Classes/GoogleMapController.m
@@ -3,25 +3,18 @@
// found in the LICENSE file.
#import "GoogleMapController.h"
+#import "FLTGoogleMapJSONConversions.h"
#import "FLTGoogleMapTileOverlayController.h"
-#import "JsonConversions.h"
#pragma mark - Conversion of JSON-like values sent via platform channels. Forward declarations.
-static NSDictionary *PositionToJson(GMSCameraPosition *position);
-static NSDictionary *PointToJson(CGPoint point);
-static NSArray *LocationToJson(CLLocationCoordinate2D position);
-static CGPoint ToCGPoint(NSDictionary *json);
-static GMSCameraPosition *ToOptionalCameraPosition(NSDictionary *json);
-static GMSCoordinateBounds *ToOptionalBounds(NSArray *json);
-static GMSCameraUpdate *ToCameraUpdate(NSArray *data);
-static NSDictionary *GMSCoordinateBoundsToJson(GMSCoordinateBounds *bounds);
-static void InterpretMapOptions(NSDictionary *data, id<FLTGoogleMapOptionsSink> sink);
-static double ToDouble(NSNumber *data) { return [FLTGoogleMapJsonConversions toDouble:data]; }
+@interface FLTGoogleMapFactory ()
-@implementation FLTGoogleMapFactory {
- NSObject<FlutterPluginRegistrar> *_registrar;
-}
+@property(weak, nonatomic) NSObject<FlutterPluginRegistrar> *registrar;
+
+@end
+
+@implementation FLTGoogleMapFactory
- (instancetype)initWithRegistrar:(NSObject<FlutterPluginRegistrar> *)registrar {
self = [super init];
@@ -41,28 +34,32 @@
return [[FLTGoogleMapController alloc] initWithFrame:frame
viewIdentifier:viewId
arguments:args
- registrar:_registrar];
+ registrar:self.registrar];
}
@end
-@implementation FLTGoogleMapController {
- GMSMapView *_mapView;
- int64_t _viewId;
- FlutterMethodChannel *_channel;
- BOOL _trackCameraPosition;
- NSObject<FlutterPluginRegistrar> *_registrar;
- FLTMarkersController *_markersController;
- FLTPolygonsController *_polygonsController;
- FLTPolylinesController *_polylinesController;
- FLTCirclesController *_circlesController;
- FLTTileOverlaysController *_tileOverlaysController;
-}
+@interface FLTGoogleMapController ()
+
+@property(nonatomic, strong) GMSMapView *mapView;
+@property(nonatomic, strong) FlutterMethodChannel *channel;
+@property(nonatomic, assign) BOOL trackCameraPosition;
+@property(nonatomic, weak) NSObject<FlutterPluginRegistrar> *registrar;
+@property(nonatomic, strong) FLTMarkersController *markersController;
+@property(nonatomic, strong) FLTPolygonsController *polygonsController;
+@property(nonatomic, strong) FLTPolylinesController *polylinesController;
+@property(nonatomic, strong) FLTCirclesController *circlesController;
+@property(nonatomic, strong) FLTTileOverlaysController *tileOverlaysController;
+
+@end
+
+@implementation FLTGoogleMapController
- (instancetype)initWithFrame:(CGRect)frame
viewIdentifier:(int64_t)viewId
arguments:(id _Nullable)args
registrar:(NSObject<FlutterPluginRegistrar> *)registrar {
- GMSCameraPosition *camera = ToOptionalCameraPosition(args[@"initialCameraPosition"]);
+ GMSCameraPosition *camera =
+ [FLTGoogleMapJSONConversions cameraPostionFromDictionary:args[@"initialCameraPosition"]];
GMSMapView *mapView = [GMSMapView mapWithFrame:frame camera:camera];
return [self initWithMapView:mapView viewIdentifier:viewId arguments:args registrar:registrar];
}
@@ -73,11 +70,11 @@
registrar:(NSObject<FlutterPluginRegistrar> *_Nonnull)registrar {
if (self = [super init]) {
_mapView = mapView;
- _viewId = viewId;
_mapView.accessibilityElementsHidden = NO;
- _trackCameraPosition = NO;
- InterpretMapOptions(args[@"options"], self);
+ // TODO(cyanglaz): avoid sending message to self in the middle of the init method.
+ // https://github.com/flutter/flutter/issues/104121
+ [self interpretMapOptions:args[@"options"]];
NSString *channelName =
[NSString stringWithFormat:@"plugins.flutter.io/google_maps_%lld", viewId];
_channel = [FlutterMethodChannel methodChannelWithName:channelName
@@ -90,9 +87,9 @@
}];
_mapView.delegate = weakSelf;
_registrar = registrar;
- _markersController = [[FLTMarkersController alloc] init:_channel
- mapView:_mapView
- registrar:registrar];
+ _markersController = [[FLTMarkersController alloc] initWithMethodChannel:_channel
+ mapView:_mapView
+ registrar:registrar];
_polygonsController = [[FLTPolygonsController alloc] init:_channel
mapView:_mapView
registrar:registrar];
@@ -132,25 +129,25 @@
}
- (UIView *)view {
- return _mapView;
+ return self.mapView;
}
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context {
- if (object == _mapView && [keyPath isEqualToString:@"frame"]) {
- CGRect bounds = _mapView.bounds;
+ if (object == self.mapView && [keyPath isEqualToString:@"frame"]) {
+ CGRect bounds = self.mapView.bounds;
if (CGRectEqualToRect(bounds, CGRectZero)) {
// The workaround is to fix an issue that the camera location is not current when
// the size of the map is zero at initialization.
- // So We only care about the size of the `_mapView`, ignore the frame changes when the size is
- // zero.
+ // So We only care about the size of the `self.mapView`, ignore the frame changes when the
+ // size is zero.
return;
}
// We only observe the frame for initial setup.
- [_mapView removeObserver:self forKeyPath:@"frame"];
- [_mapView moveCamera:[GMSCameraUpdate setCamera:_mapView.camera]];
+ [self.mapView removeObserver:self forKeyPath:@"frame"];
+ [self.mapView moveCamera:[GMSCameraUpdate setCamera:self.mapView.camera]];
} else {
[super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
}
@@ -158,46 +155,50 @@
- (void)onMethodCall:(FlutterMethodCall *)call result:(FlutterResult)result {
if ([call.method isEqualToString:@"map#show"]) {
- [self showAtX:ToDouble(call.arguments[@"x"]) Y:ToDouble(call.arguments[@"y"])];
+ [self showAtOrigin:CGPointMake([call.arguments[@"x"] doubleValue],
+ [call.arguments[@"y"] doubleValue])];
result(nil);
} else if ([call.method isEqualToString:@"map#hide"]) {
[self hide];
result(nil);
} else if ([call.method isEqualToString:@"camera#animate"]) {
- [self animateWithCameraUpdate:ToCameraUpdate(call.arguments[@"cameraUpdate"])];
+ [self
+ animateWithCameraUpdate:[FLTGoogleMapJSONConversions
+ cameraUpdateFromChannelValue:call.arguments[@"cameraUpdate"]]];
result(nil);
} else if ([call.method isEqualToString:@"camera#move"]) {
- [self moveWithCameraUpdate:ToCameraUpdate(call.arguments[@"cameraUpdate"])];
+ [self moveWithCameraUpdate:[FLTGoogleMapJSONConversions
+ cameraUpdateFromChannelValue:call.arguments[@"cameraUpdate"]]];
result(nil);
} else if ([call.method isEqualToString:@"map#update"]) {
- InterpretMapOptions(call.arguments[@"options"], self);
- result(PositionToJson([self cameraPosition]));
+ [self interpretMapOptions:call.arguments[@"options"]];
+ result([FLTGoogleMapJSONConversions dictionaryFromPosition:[self cameraPosition]]);
} else if ([call.method isEqualToString:@"map#getVisibleRegion"]) {
- if (_mapView != nil) {
- GMSVisibleRegion visibleRegion = _mapView.projection.visibleRegion;
+ if (self.mapView != nil) {
+ GMSVisibleRegion visibleRegion = self.mapView.projection.visibleRegion;
GMSCoordinateBounds *bounds = [[GMSCoordinateBounds alloc] initWithRegion:visibleRegion];
-
- result(GMSCoordinateBoundsToJson(bounds));
+ result([FLTGoogleMapJSONConversions dictionaryFromCoordinateBounds:bounds]);
} else {
result([FlutterError errorWithCode:@"GoogleMap uninitialized"
message:@"getVisibleRegion called prior to map initialization"
details:nil]);
}
} else if ([call.method isEqualToString:@"map#getScreenCoordinate"]) {
- if (_mapView != nil) {
- CLLocationCoordinate2D location = [FLTGoogleMapJsonConversions toLocation:call.arguments];
- CGPoint point = [_mapView.projection pointForCoordinate:location];
- result(PointToJson(point));
+ if (self.mapView != nil) {
+ CLLocationCoordinate2D location =
+ [FLTGoogleMapJSONConversions locationFromLatLong:call.arguments];
+ CGPoint point = [self.mapView.projection pointForCoordinate:location];
+ result([FLTGoogleMapJSONConversions dictionaryFromPoint:point]);
} else {
result([FlutterError errorWithCode:@"GoogleMap uninitialized"
message:@"getScreenCoordinate called prior to map initialization"
details:nil]);
}
} else if ([call.method isEqualToString:@"map#getLatLng"]) {
- if (_mapView != nil && call.arguments) {
- CGPoint point = ToCGPoint(call.arguments);
- CLLocationCoordinate2D latlng = [_mapView.projection coordinateForPoint:point];
- result(LocationToJson(latlng));
+ if (self.mapView != nil && call.arguments) {
+ CGPoint point = [FLTGoogleMapJSONConversions pointFromDictionary:call.arguments];
+ CLLocationCoordinate2D latlng = [self.mapView.projection coordinateForPoint:point];
+ result([FLTGoogleMapJSONConversions arrayFromLocation:latlng]);
} else {
result([FlutterError errorWithCode:@"GoogleMap uninitialized"
message:@"getLatLng called prior to map initialization"
@@ -207,14 +208,14 @@
result(nil);
} else if ([call.method isEqualToString:@"map#takeSnapshot"]) {
if (@available(iOS 10.0, *)) {
- if (_mapView != nil) {
+ if (self.mapView != nil) {
UIGraphicsImageRendererFormat *format = [UIGraphicsImageRendererFormat defaultFormat];
format.scale = [[UIScreen mainScreen] scale];
UIGraphicsImageRenderer *renderer =
- [[UIGraphicsImageRenderer alloc] initWithSize:_mapView.frame.size format:format];
+ [[UIGraphicsImageRenderer alloc] initWithSize:self.mapView.frame.size format:format];
UIImage *image = [renderer imageWithActions:^(UIGraphicsImageRendererContext *context) {
- [_mapView.layer renderInContext:context.CGContext];
+ [self.mapView.layer renderInContext:context.CGContext];
}];
result([FlutterStandardTypedData typedDataWithBytes:UIImagePNGRepresentation(image)]);
} else {
@@ -229,21 +230,21 @@
} else if ([call.method isEqualToString:@"markers#update"]) {
id markersToAdd = call.arguments[@"markersToAdd"];
if ([markersToAdd isKindOfClass:[NSArray class]]) {
- [_markersController addMarkers:markersToAdd];
+ [self.markersController addMarkers:markersToAdd];
}
id markersToChange = call.arguments[@"markersToChange"];
if ([markersToChange isKindOfClass:[NSArray class]]) {
- [_markersController changeMarkers:markersToChange];
+ [self.markersController changeMarkers:markersToChange];
}
id markerIdsToRemove = call.arguments[@"markerIdsToRemove"];
if ([markerIdsToRemove isKindOfClass:[NSArray class]]) {
- [_markersController removeMarkerIds:markerIdsToRemove];
+ [self.markersController removeMarkersWithIdentifiers:markerIdsToRemove];
}
result(nil);
} else if ([call.method isEqualToString:@"markers#showInfoWindow"]) {
id markerId = call.arguments[@"markerId"];
if ([markerId isKindOfClass:[NSString class]]) {
- [_markersController showMarkerInfoWindow:markerId result:result];
+ [self.markersController showMarkerInfoWindowWithIdentifier:markerId result:result];
} else {
result([FlutterError errorWithCode:@"Invalid markerId"
message:@"showInfoWindow called with invalid markerId"
@@ -252,7 +253,7 @@
} else if ([call.method isEqualToString:@"markers#hideInfoWindow"]) {
id markerId = call.arguments[@"markerId"];
if ([markerId isKindOfClass:[NSString class]]) {
- [_markersController hideMarkerInfoWindow:markerId result:result];
+ [self.markersController hideMarkerInfoWindowWithIdentifier:markerId result:result];
} else {
result([FlutterError errorWithCode:@"Invalid markerId"
message:@"hideInfoWindow called with invalid markerId"
@@ -261,7 +262,7 @@
} else if ([call.method isEqualToString:@"markers#isInfoWindowShown"]) {
id markerId = call.arguments[@"markerId"];
if ([markerId isKindOfClass:[NSString class]]) {
- [_markersController isMarkerInfoWindowShown:markerId result:result];
+ [self.markersController isInfoWindowShownForMarkerWithIdentifier:markerId result:result];
} else {
result([FlutterError errorWithCode:@"Invalid markerId"
message:@"isInfoWindowShown called with invalid markerId"
@@ -270,97 +271,97 @@
} else if ([call.method isEqualToString:@"polygons#update"]) {
id polygonsToAdd = call.arguments[@"polygonsToAdd"];
if ([polygonsToAdd isKindOfClass:[NSArray class]]) {
- [_polygonsController addPolygons:polygonsToAdd];
+ [self.polygonsController addPolygons:polygonsToAdd];
}
id polygonsToChange = call.arguments[@"polygonsToChange"];
if ([polygonsToChange isKindOfClass:[NSArray class]]) {
- [_polygonsController changePolygons:polygonsToChange];
+ [self.polygonsController changePolygons:polygonsToChange];
}
id polygonIdsToRemove = call.arguments[@"polygonIdsToRemove"];
if ([polygonIdsToRemove isKindOfClass:[NSArray class]]) {
- [_polygonsController removePolygonIds:polygonIdsToRemove];
+ [self.polygonsController removePolygonWithIdentifiers:polygonIdsToRemove];
}
result(nil);
} else if ([call.method isEqualToString:@"polylines#update"]) {
id polylinesToAdd = call.arguments[@"polylinesToAdd"];
if ([polylinesToAdd isKindOfClass:[NSArray class]]) {
- [_polylinesController addPolylines:polylinesToAdd];
+ [self.polylinesController addPolylines:polylinesToAdd];
}
id polylinesToChange = call.arguments[@"polylinesToChange"];
if ([polylinesToChange isKindOfClass:[NSArray class]]) {
- [_polylinesController changePolylines:polylinesToChange];
+ [self.polylinesController changePolylines:polylinesToChange];
}
id polylineIdsToRemove = call.arguments[@"polylineIdsToRemove"];
if ([polylineIdsToRemove isKindOfClass:[NSArray class]]) {
- [_polylinesController removePolylineIds:polylineIdsToRemove];
+ [self.polylinesController removePolylineWithIdentifiers:polylineIdsToRemove];
}
result(nil);
} else if ([call.method isEqualToString:@"circles#update"]) {
id circlesToAdd = call.arguments[@"circlesToAdd"];
if ([circlesToAdd isKindOfClass:[NSArray class]]) {
- [_circlesController addCircles:circlesToAdd];
+ [self.circlesController addCircles:circlesToAdd];
}
id circlesToChange = call.arguments[@"circlesToChange"];
if ([circlesToChange isKindOfClass:[NSArray class]]) {
- [_circlesController changeCircles:circlesToChange];
+ [self.circlesController changeCircles:circlesToChange];
}
id circleIdsToRemove = call.arguments[@"circleIdsToRemove"];
if ([circleIdsToRemove isKindOfClass:[NSArray class]]) {
- [_circlesController removeCircleIds:circleIdsToRemove];
+ [self.circlesController removeCircleWithIdentifiers:circleIdsToRemove];
}
result(nil);
} else if ([call.method isEqualToString:@"tileOverlays#update"]) {
id tileOverlaysToAdd = call.arguments[@"tileOverlaysToAdd"];
if ([tileOverlaysToAdd isKindOfClass:[NSArray class]]) {
- [_tileOverlaysController addTileOverlays:tileOverlaysToAdd];
+ [self.tileOverlaysController addTileOverlays:tileOverlaysToAdd];
}
id tileOverlaysToChange = call.arguments[@"tileOverlaysToChange"];
if ([tileOverlaysToChange isKindOfClass:[NSArray class]]) {
- [_tileOverlaysController changeTileOverlays:tileOverlaysToChange];
+ [self.tileOverlaysController changeTileOverlays:tileOverlaysToChange];
}
id tileOverlayIdsToRemove = call.arguments[@"tileOverlayIdsToRemove"];
if ([tileOverlayIdsToRemove isKindOfClass:[NSArray class]]) {
- [_tileOverlaysController removeTileOverlayIds:tileOverlayIdsToRemove];
+ [self.tileOverlaysController removeTileOverlayWithIdentifiers:tileOverlayIdsToRemove];
}
result(nil);
} else if ([call.method isEqualToString:@"tileOverlays#clearTileCache"]) {
id rawTileOverlayId = call.arguments[@"tileOverlayId"];
- [_tileOverlaysController clearTileCache:rawTileOverlayId];
+ [self.tileOverlaysController clearTileCacheWithIdentifier:rawTileOverlayId];
result(nil);
} else if ([call.method isEqualToString:@"map#isCompassEnabled"]) {
- NSNumber *isCompassEnabled = @(_mapView.settings.compassButton);
+ NSNumber *isCompassEnabled = @(self.mapView.settings.compassButton);
result(isCompassEnabled);
} else if ([call.method isEqualToString:@"map#isMapToolbarEnabled"]) {
NSNumber *isMapToolbarEnabled = @NO;
result(isMapToolbarEnabled);
} else if ([call.method isEqualToString:@"map#getMinMaxZoomLevels"]) {
- NSArray *zoomLevels = @[ @(_mapView.minZoom), @(_mapView.maxZoom) ];
+ NSArray *zoomLevels = @[ @(self.mapView.minZoom), @(self.mapView.maxZoom) ];
result(zoomLevels);
} else if ([call.method isEqualToString:@"map#getZoomLevel"]) {
- result(@(_mapView.camera.zoom));
+ result(@(self.mapView.camera.zoom));
} else if ([call.method isEqualToString:@"map#isZoomGesturesEnabled"]) {
- NSNumber *isZoomGesturesEnabled = @(_mapView.settings.zoomGestures);
+ NSNumber *isZoomGesturesEnabled = @(self.mapView.settings.zoomGestures);
result(isZoomGesturesEnabled);
} else if ([call.method isEqualToString:@"map#isZoomControlsEnabled"]) {
NSNumber *isZoomControlsEnabled = @NO;
result(isZoomControlsEnabled);
} else if ([call.method isEqualToString:@"map#isTiltGesturesEnabled"]) {
- NSNumber *isTiltGesturesEnabled = @(_mapView.settings.tiltGestures);
+ NSNumber *isTiltGesturesEnabled = @(self.mapView.settings.tiltGestures);
result(isTiltGesturesEnabled);
} else if ([call.method isEqualToString:@"map#isRotateGesturesEnabled"]) {
- NSNumber *isRotateGesturesEnabled = @(_mapView.settings.rotateGestures);
+ NSNumber *isRotateGesturesEnabled = @(self.mapView.settings.rotateGestures);
result(isRotateGesturesEnabled);
} else if ([call.method isEqualToString:@"map#isScrollGesturesEnabled"]) {
- NSNumber *isScrollGesturesEnabled = @(_mapView.settings.scrollGestures);
+ NSNumber *isScrollGesturesEnabled = @(self.mapView.settings.scrollGestures);
result(isScrollGesturesEnabled);
} else if ([call.method isEqualToString:@"map#isMyLocationButtonEnabled"]) {
- NSNumber *isMyLocationButtonEnabled = @(_mapView.settings.myLocationButton);
+ NSNumber *isMyLocationButtonEnabled = @(self.mapView.settings.myLocationButton);
result(isMyLocationButtonEnabled);
} else if ([call.method isEqualToString:@"map#isTrafficEnabled"]) {
- NSNumber *isTrafficEnabled = @(_mapView.trafficEnabled);
+ NSNumber *isTrafficEnabled = @(self.mapView.trafficEnabled);
result(isTrafficEnabled);
} else if ([call.method isEqualToString:@"map#isBuildingsEnabled"]) {
- NSNumber *isBuildingsEnabled = @(_mapView.buildingsEnabled);
+ NSNumber *isBuildingsEnabled = @(self.mapView.buildingsEnabled);
result(isBuildingsEnabled);
} else if ([call.method isEqualToString:@"map#setStyle"]) {
NSString *mapStyle = [call arguments];
@@ -372,86 +373,84 @@
}
} else if ([call.method isEqualToString:@"map#getTileOverlayInfo"]) {
NSString *rawTileOverlayId = call.arguments[@"tileOverlayId"];
- result([_tileOverlaysController getTileOverlayInfo:rawTileOverlayId]);
+ result([self.tileOverlaysController tileOverlayInfoWithIdentifier:rawTileOverlayId]);
} else {
result(FlutterMethodNotImplemented);
}
}
-- (void)showAtX:(CGFloat)x Y:(CGFloat)y {
- _mapView.frame =
- CGRectMake(x, y, CGRectGetWidth(_mapView.frame), CGRectGetHeight(_mapView.frame));
- _mapView.hidden = NO;
+- (void)showAtOrigin:(CGPoint)origin {
+ CGRect frame = {origin, self.mapView.frame.size};
+ self.mapView.frame = frame;
+ self.mapView.hidden = NO;
}
- (void)hide {
- _mapView.hidden = YES;
+ self.mapView.hidden = YES;
}
- (void)animateWithCameraUpdate:(GMSCameraUpdate *)cameraUpdate {
- [_mapView animateWithCameraUpdate:cameraUpdate];
+ [self.mapView animateWithCameraUpdate:cameraUpdate];
}
- (void)moveWithCameraUpdate:(GMSCameraUpdate *)cameraUpdate {
- [_mapView moveCamera:cameraUpdate];
+ [self.mapView moveCamera:cameraUpdate];
}
- (GMSCameraPosition *)cameraPosition {
- if (_trackCameraPosition) {
- return _mapView.camera;
+ if (self.trackCameraPosition) {
+ return self.mapView.camera;
} else {
return nil;
}
}
-#pragma mark - FLTGoogleMapOptionsSink methods
-
- (void)setCamera:(GMSCameraPosition *)camera {
- _mapView.camera = camera;
+ self.mapView.camera = camera;
}
- (void)setCameraTargetBounds:(GMSCoordinateBounds *)bounds {
- _mapView.cameraTargetBounds = bounds;
+ self.mapView.cameraTargetBounds = bounds;
}
- (void)setCompassEnabled:(BOOL)enabled {
- _mapView.settings.compassButton = enabled;
+ self.mapView.settings.compassButton = enabled;
}
- (void)setIndoorEnabled:(BOOL)enabled {
- _mapView.indoorEnabled = enabled;
+ self.mapView.indoorEnabled = enabled;
}
- (void)setTrafficEnabled:(BOOL)enabled {
- _mapView.trafficEnabled = enabled;
+ self.mapView.trafficEnabled = enabled;
}
- (void)setBuildingsEnabled:(BOOL)enabled {
- _mapView.buildingsEnabled = enabled;
+ self.mapView.buildingsEnabled = enabled;
}
- (void)setMapType:(GMSMapViewType)mapType {
- _mapView.mapType = mapType;
+ self.mapView.mapType = mapType;
}
- (void)setMinZoom:(float)minZoom maxZoom:(float)maxZoom {
- [_mapView setMinZoom:minZoom maxZoom:maxZoom];
+ [self.mapView setMinZoom:minZoom maxZoom:maxZoom];
}
- (void)setPaddingTop:(float)top left:(float)left bottom:(float)bottom right:(float)right {
- _mapView.padding = UIEdgeInsetsMake(top, left, bottom, right);
+ self.mapView.padding = UIEdgeInsetsMake(top, left, bottom, right);
}
- (void)setRotateGesturesEnabled:(BOOL)enabled {
- _mapView.settings.rotateGestures = enabled;
+ self.mapView.settings.rotateGestures = enabled;
}
- (void)setScrollGesturesEnabled:(BOOL)enabled {
- _mapView.settings.scrollGestures = enabled;
+ self.mapView.settings.scrollGestures = enabled;
}
- (void)setTiltGesturesEnabled:(BOOL)enabled {
- _mapView.settings.tiltGestures = enabled;
+ self.mapView.settings.tiltGestures = enabled;
}
- (void)setTrackCameraPosition:(BOOL)enabled {
@@ -459,20 +458,20 @@
}
- (void)setZoomGesturesEnabled:(BOOL)enabled {
- _mapView.settings.zoomGestures = enabled;
+ self.mapView.settings.zoomGestures = enabled;
}
- (void)setMyLocationEnabled:(BOOL)enabled {
- _mapView.myLocationEnabled = enabled;
+ self.mapView.myLocationEnabled = enabled;
}
- (void)setMyLocationButtonEnabled:(BOOL)enabled {
- _mapView.settings.myLocationButton = enabled;
+ self.mapView.settings.myLocationButton = enabled;
}
- (NSString *)setMapStyle:(NSString *)mapStyle {
if (mapStyle == (id)[NSNull null] || mapStyle.length == 0) {
- _mapView.mapStyle = nil;
+ self.mapView.mapStyle = nil;
return nil;
}
NSError *error;
@@ -480,7 +479,7 @@
if (!style) {
return [error localizedDescription];
} else {
- _mapView.mapStyle = style;
+ self.mapView.mapStyle = style;
return nil;
}
}
@@ -488,236 +487,141 @@
#pragma mark - GMSMapViewDelegate methods
- (void)mapView:(GMSMapView *)mapView willMove:(BOOL)gesture {
- [_channel invokeMethod:@"camera#onMoveStarted" arguments:@{@"isGesture" : @(gesture)}];
+ [self.channel invokeMethod:@"camera#onMoveStarted" arguments:@{@"isGesture" : @(gesture)}];
}
- (void)mapView:(GMSMapView *)mapView didChangeCameraPosition:(GMSCameraPosition *)position {
- if (_trackCameraPosition) {
- [_channel invokeMethod:@"camera#onMove" arguments:@{@"position" : PositionToJson(position)}];
+ if (self.trackCameraPosition) {
+ [self.channel invokeMethod:@"camera#onMove"
+ arguments:@{
+ @"position" : [FLTGoogleMapJSONConversions dictionaryFromPosition:position]
+ }];
}
}
- (void)mapView:(GMSMapView *)mapView idleAtCameraPosition:(GMSCameraPosition *)position {
- [_channel invokeMethod:@"camera#onIdle" arguments:@{}];
+ [self.channel invokeMethod:@"camera#onIdle" arguments:@{}];
}
- (BOOL)mapView:(GMSMapView *)mapView didTapMarker:(GMSMarker *)marker {
NSString *markerId = marker.userData[0];
- return [_markersController onMarkerTap:markerId];
+ return [self.markersController didTapMarkerWithIdentifier:markerId];
}
- (void)mapView:(GMSMapView *)mapView didEndDraggingMarker:(GMSMarker *)marker {
NSString *markerId = marker.userData[0];
- [_markersController onMarkerDragEnd:markerId coordinate:marker.position];
+ [self.markersController didEndDraggingMarkerWithIdentifier:markerId location:marker.position];
}
- (void)mapView:(GMSMapView *)mapView didStartDraggingMarker:(GMSMarker *)marker {
NSString *markerId = marker.userData[0];
- [_markersController onMarkerDragStart:markerId coordinate:marker.position];
+ [self.markersController didStartDraggingMarkerWithIdentifier:markerId location:marker.position];
}
- (void)mapView:(GMSMapView *)mapView didDragMarker:(GMSMarker *)marker {
NSString *markerId = marker.userData[0];
- [_markersController onMarkerDrag:markerId coordinate:marker.position];
+ [self.markersController didDragMarkerWithIdentifier:markerId location:marker.position];
}
- (void)mapView:(GMSMapView *)mapView didTapInfoWindowOfMarker:(GMSMarker *)marker {
NSString *markerId = marker.userData[0];
- [_markersController onInfoWindowTap:markerId];
+ [self.markersController didTapInfoWindowOfMarkerWithIdentifier:markerId];
}
- (void)mapView:(GMSMapView *)mapView didTapOverlay:(GMSOverlay *)overlay {
NSString *overlayId = overlay.userData[0];
- if ([_polylinesController hasPolylineWithId:overlayId]) {
- [_polylinesController onPolylineTap:overlayId];
- } else if ([_polygonsController hasPolygonWithId:overlayId]) {
- [_polygonsController onPolygonTap:overlayId];
- } else if ([_circlesController hasCircleWithId:overlayId]) {
- [_circlesController onCircleTap:overlayId];
+ if ([self.polylinesController hasPolylineWithIdentifier:overlayId]) {
+ [self.polylinesController didTapPolylineWithIdentifier:overlayId];
+ } else if ([self.polygonsController hasPolygonWithIdentifier:overlayId]) {
+ [self.polygonsController didTapPolygonWithIdentifier:overlayId];
+ } else if ([self.circlesController hasCircleWithIdentifier:overlayId]) {
+ [self.circlesController didTapCircleWithIdentifier:overlayId];
}
}
- (void)mapView:(GMSMapView *)mapView didTapAtCoordinate:(CLLocationCoordinate2D)coordinate {
- [_channel invokeMethod:@"map#onTap" arguments:@{@"position" : LocationToJson(coordinate)}];
+ [self.channel
+ invokeMethod:@"map#onTap"
+ arguments:@{@"position" : [FLTGoogleMapJSONConversions arrayFromLocation:coordinate]}];
}
- (void)mapView:(GMSMapView *)mapView didLongPressAtCoordinate:(CLLocationCoordinate2D)coordinate {
- [_channel invokeMethod:@"map#onLongPress" arguments:@{@"position" : LocationToJson(coordinate)}];
+ [self.channel
+ invokeMethod:@"map#onLongPress"
+ arguments:@{@"position" : [FLTGoogleMapJSONConversions arrayFromLocation:coordinate]}];
}
-@end
-
-#pragma mark - Implementations of JSON conversion functions.
-
-static NSArray *LocationToJson(CLLocationCoordinate2D position) {
- return @[ @(position.latitude), @(position.longitude) ];
-}
-
-static NSDictionary *PositionToJson(GMSCameraPosition *position) {
- if (!position) {
- return nil;
- }
- return @{
- @"target" : LocationToJson([position target]),
- @"zoom" : @([position zoom]),
- @"bearing" : @([position bearing]),
- @"tilt" : @([position viewingAngle]),
- };
-}
-
-static NSDictionary *PointToJson(CGPoint point) {
- return @{
- @"x" : @(lroundf(point.x)),
- @"y" : @(lroundf(point.y)),
- };
-}
-
-static NSDictionary *GMSCoordinateBoundsToJson(GMSCoordinateBounds *bounds) {
- if (!bounds) {
- return nil;
- }
- return @{
- @"southwest" : LocationToJson([bounds southWest]),
- @"northeast" : LocationToJson([bounds northEast]),
- };
-}
-
-static float ToFloat(NSNumber *data) { return [FLTGoogleMapJsonConversions toFloat:data]; }
-
-static CLLocationCoordinate2D ToLocation(NSArray *data) {
- return [FLTGoogleMapJsonConversions toLocation:data];
-}
-
-static int ToInt(NSNumber *data) { return [FLTGoogleMapJsonConversions toInt:data]; }
-
-static BOOL ToBool(NSNumber *data) { return [FLTGoogleMapJsonConversions toBool:data]; }
-
-static CGPoint ToPoint(NSArray *data) { return [FLTGoogleMapJsonConversions toPoint:data]; }
-
-static GMSCameraPosition *ToCameraPosition(NSDictionary *data) {
- return [GMSCameraPosition cameraWithTarget:ToLocation(data[@"target"])
- zoom:ToFloat(data[@"zoom"])
- bearing:ToDouble(data[@"bearing"])
- viewingAngle:ToDouble(data[@"tilt"])];
-}
-
-static GMSCameraPosition *ToOptionalCameraPosition(NSDictionary *json) {
- return json ? ToCameraPosition(json) : nil;
-}
-
-static CGPoint ToCGPoint(NSDictionary *json) {
- double x = ToDouble(json[@"x"]);
- double y = ToDouble(json[@"y"]);
- return CGPointMake(x, y);
-}
-
-static GMSCoordinateBounds *ToBounds(NSArray *data) {
- return [[GMSCoordinateBounds alloc] initWithCoordinate:ToLocation(data[0])
- coordinate:ToLocation(data[1])];
-}
-
-static GMSCoordinateBounds *ToOptionalBounds(NSArray *data) {
- return (data[0] == [NSNull null]) ? nil : ToBounds(data[0]);
-}
-
-static GMSMapViewType ToMapViewType(NSNumber *json) {
- int value = ToInt(json);
- return (GMSMapViewType)(value == 0 ? 5 : value);
-}
-
-static GMSCameraUpdate *ToCameraUpdate(NSArray *data) {
- NSString *update = data[0];
- if ([update isEqualToString:@"newCameraPosition"]) {
- return [GMSCameraUpdate setCamera:ToCameraPosition(data[1])];
- } else if ([update isEqualToString:@"newLatLng"]) {
- return [GMSCameraUpdate setTarget:ToLocation(data[1])];
- } else if ([update isEqualToString:@"newLatLngBounds"]) {
- return [GMSCameraUpdate fitBounds:ToBounds(data[1]) withPadding:ToDouble(data[2])];
- } else if ([update isEqualToString:@"newLatLngZoom"]) {
- return [GMSCameraUpdate setTarget:ToLocation(data[1]) zoom:ToFloat(data[2])];
- } else if ([update isEqualToString:@"scrollBy"]) {
- return [GMSCameraUpdate scrollByX:ToDouble(data[1]) Y:ToDouble(data[2])];
- } else if ([update isEqualToString:@"zoomBy"]) {
- if (data.count == 2) {
- return [GMSCameraUpdate zoomBy:ToFloat(data[1])];
- } else {
- return [GMSCameraUpdate zoomBy:ToFloat(data[1]) atPoint:ToPoint(data[2])];
- }
- } else if ([update isEqualToString:@"zoomIn"]) {
- return [GMSCameraUpdate zoomIn];
- } else if ([update isEqualToString:@"zoomOut"]) {
- return [GMSCameraUpdate zoomOut];
- } else if ([update isEqualToString:@"zoomTo"]) {
- return [GMSCameraUpdate zoomTo:ToFloat(data[1])];
- }
- return nil;
-}
-
-static void InterpretMapOptions(NSDictionary *data, id<FLTGoogleMapOptionsSink> sink) {
+- (void)interpretMapOptions:(NSDictionary *)data {
NSArray *cameraTargetBounds = data[@"cameraTargetBounds"];
- if (cameraTargetBounds) {
- [sink setCameraTargetBounds:ToOptionalBounds(cameraTargetBounds)];
+ if (cameraTargetBounds && cameraTargetBounds != (id)[NSNull null]) {
+ [self
+ setCameraTargetBounds:cameraTargetBounds.count > 0 && cameraTargetBounds[0] != [NSNull null]
+ ? [FLTGoogleMapJSONConversions
+ coordinateBoundsFromLatLongs:cameraTargetBounds.firstObject]
+ : nil];
}
NSNumber *compassEnabled = data[@"compassEnabled"];
- if (compassEnabled != nil) {
- [sink setCompassEnabled:ToBool(compassEnabled)];
+ if (compassEnabled && compassEnabled != (id)[NSNull null]) {
+ [self setCompassEnabled:[compassEnabled boolValue]];
}
id indoorEnabled = data[@"indoorEnabled"];
- if (indoorEnabled) {
- [sink setIndoorEnabled:ToBool(indoorEnabled)];
+ if (indoorEnabled && indoorEnabled != [NSNull null]) {
+ [self setIndoorEnabled:[indoorEnabled boolValue]];
}
id trafficEnabled = data[@"trafficEnabled"];
- if (trafficEnabled) {
- [sink setTrafficEnabled:ToBool(trafficEnabled)];
+ if (trafficEnabled && trafficEnabled != [NSNull null]) {
+ [self setTrafficEnabled:[trafficEnabled boolValue]];
}
id buildingsEnabled = data[@"buildingsEnabled"];
- if (buildingsEnabled) {
- [sink setBuildingsEnabled:ToBool(buildingsEnabled)];
+ if (buildingsEnabled && buildingsEnabled != [NSNull null]) {
+ [self setBuildingsEnabled:[buildingsEnabled boolValue]];
}
id mapType = data[@"mapType"];
- if (mapType) {
- [sink setMapType:ToMapViewType(mapType)];
+ if (mapType && mapType != [NSNull null]) {
+ [self setMapType:[FLTGoogleMapJSONConversions mapViewTypeFromTypeValue:mapType]];
}
NSArray *zoomData = data[@"minMaxZoomPreference"];
- if (zoomData) {
- float minZoom = (zoomData[0] == [NSNull null]) ? kGMSMinZoomLevel : ToFloat(zoomData[0]);
- float maxZoom = (zoomData[1] == [NSNull null]) ? kGMSMaxZoomLevel : ToFloat(zoomData[1]);
- [sink setMinZoom:minZoom maxZoom:maxZoom];
+ if (zoomData && zoomData != (id)[NSNull null]) {
+ float minZoom = (zoomData[0] == [NSNull null]) ? kGMSMinZoomLevel : [zoomData[0] floatValue];
+ float maxZoom = (zoomData[1] == [NSNull null]) ? kGMSMaxZoomLevel : [zoomData[1] floatValue];
+ [self setMinZoom:minZoom maxZoom:maxZoom];
}
NSArray *paddingData = data[@"padding"];
if (paddingData) {
- float top = (paddingData[0] == [NSNull null]) ? 0 : ToFloat(paddingData[0]);
- float left = (paddingData[1] == [NSNull null]) ? 0 : ToFloat(paddingData[1]);
- float bottom = (paddingData[2] == [NSNull null]) ? 0 : ToFloat(paddingData[2]);
- float right = (paddingData[3] == [NSNull null]) ? 0 : ToFloat(paddingData[3]);
- [sink setPaddingTop:top left:left bottom:bottom right:right];
+ float top = (paddingData[0] == [NSNull null]) ? 0 : [paddingData[0] floatValue];
+ float left = (paddingData[1] == [NSNull null]) ? 0 : [paddingData[1] floatValue];
+ float bottom = (paddingData[2] == [NSNull null]) ? 0 : [paddingData[2] floatValue];
+ float right = (paddingData[3] == [NSNull null]) ? 0 : [paddingData[3] floatValue];
+ [self setPaddingTop:top left:left bottom:bottom right:right];
}
NSNumber *rotateGesturesEnabled = data[@"rotateGesturesEnabled"];
- if (rotateGesturesEnabled != nil) {
- [sink setRotateGesturesEnabled:ToBool(rotateGesturesEnabled)];
+ if (rotateGesturesEnabled && rotateGesturesEnabled != (id)[NSNull null]) {
+ [self setRotateGesturesEnabled:[rotateGesturesEnabled boolValue]];
}
NSNumber *scrollGesturesEnabled = data[@"scrollGesturesEnabled"];
- if (scrollGesturesEnabled != nil) {
- [sink setScrollGesturesEnabled:ToBool(scrollGesturesEnabled)];
+ if (scrollGesturesEnabled && scrollGesturesEnabled != (id)[NSNull null]) {
+ [self setScrollGesturesEnabled:[scrollGesturesEnabled boolValue]];
}
NSNumber *tiltGesturesEnabled = data[@"tiltGesturesEnabled"];
- if (tiltGesturesEnabled != nil) {
- [sink setTiltGesturesEnabled:ToBool(tiltGesturesEnabled)];
+ if (tiltGesturesEnabled && tiltGesturesEnabled != (id)[NSNull null]) {
+ [self setTiltGesturesEnabled:[tiltGesturesEnabled boolValue]];
}
NSNumber *trackCameraPosition = data[@"trackCameraPosition"];
- if (trackCameraPosition != nil) {
- [sink setTrackCameraPosition:ToBool(trackCameraPosition)];
+ if (trackCameraPosition && trackCameraPosition != (id)[NSNull null]) {
+ [self setTrackCameraPosition:[trackCameraPosition boolValue]];
}
NSNumber *zoomGesturesEnabled = data[@"zoomGesturesEnabled"];
- if (zoomGesturesEnabled != nil) {
- [sink setZoomGesturesEnabled:ToBool(zoomGesturesEnabled)];
+ if (zoomGesturesEnabled && zoomGesturesEnabled != (id)[NSNull null]) {
+ [self setZoomGesturesEnabled:[zoomGesturesEnabled boolValue]];
}
NSNumber *myLocationEnabled = data[@"myLocationEnabled"];
- if (myLocationEnabled != nil) {
- [sink setMyLocationEnabled:ToBool(myLocationEnabled)];
+ if (myLocationEnabled && myLocationEnabled != (id)[NSNull null]) {
+ [self setMyLocationEnabled:[myLocationEnabled boolValue]];
}
NSNumber *myLocationButtonEnabled = data[@"myLocationButtonEnabled"];
- if (myLocationButtonEnabled != nil) {
- [sink setMyLocationButtonEnabled:ToBool(myLocationButtonEnabled)];
+ if (myLocationButtonEnabled && myLocationButtonEnabled != (id)[NSNull null]) {
+ [self setMyLocationButtonEnabled:[myLocationButtonEnabled boolValue]];
}
}
+
+@end
diff --git a/packages/google_maps_flutter/google_maps_flutter/ios/Classes/GoogleMapMarkerController.h b/packages/google_maps_flutter/google_maps_flutter/ios/Classes/GoogleMapMarkerController.h
index 8734c06..a33d480 100644
--- a/packages/google_maps_flutter/google_maps_flutter/ios/Classes/GoogleMapMarkerController.h
+++ b/packages/google_maps_flutter/google_maps_flutter/ios/Classes/GoogleMapMarkerController.h
@@ -8,50 +8,37 @@
NS_ASSUME_NONNULL_BEGIN
-// Defines marker UI options writable from Flutter.
-@protocol FLTGoogleMapMarkerOptionsSink
-- (void)setAlpha:(float)alpha;
-- (void)setAnchor:(CGPoint)anchor;
-- (void)setConsumeTapEvents:(BOOL)consume;
-- (void)setDraggable:(BOOL)draggable;
-- (void)setFlat:(BOOL)flat;
-- (void)setIcon:(UIImage *)icon;
-- (void)setInfoWindowAnchor:(CGPoint)anchor;
-- (void)setInfoWindowTitle:(NSString *)title snippet:(NSString *)snippet;
-- (void)setPosition:(CLLocationCoordinate2D)position;
-- (void)setRotation:(CLLocationDegrees)rotation;
-- (void)setVisible:(BOOL)visible;
-- (void)setZIndex:(int)zIndex;
-@end
-
// Defines marker controllable by Flutter.
-@interface FLTGoogleMapMarkerController : NSObject <FLTGoogleMapMarkerOptionsSink>
-@property(atomic, readonly) NSString *markerId;
+@interface FLTGoogleMapMarkerController : NSObject
+@property(assign, nonatomic, readonly) BOOL consumeTapEvents;
- (instancetype)initMarkerWithPosition:(CLLocationCoordinate2D)position
- markerId:(NSString *)markerId
+ identifier:(NSString *)identifier
mapView:(GMSMapView *)mapView;
- (void)showInfoWindow;
- (void)hideInfoWindow;
- (BOOL)isInfoWindowShown;
-- (BOOL)consumeTapEvents;
- (void)removeMarker;
@end
@interface FLTMarkersController : NSObject
-- (instancetype)init:(FlutterMethodChannel *)methodChannel
- mapView:(GMSMapView *)mapView
- registrar:(NSObject<FlutterPluginRegistrar> *)registrar;
+- (instancetype)initWithMethodChannel:(FlutterMethodChannel *)methodChannel
+ mapView:(GMSMapView *)mapView
+ registrar:(NSObject<FlutterPluginRegistrar> *)registrar;
- (void)addMarkers:(NSArray *)markersToAdd;
- (void)changeMarkers:(NSArray *)markersToChange;
-- (void)removeMarkerIds:(NSArray *)markerIdsToRemove;
-- (BOOL)onMarkerTap:(NSString *)markerId;
-- (void)onMarkerDragStart:(NSString *)markerId coordinate:(CLLocationCoordinate2D)coordinate;
-- (void)onMarkerDragEnd:(NSString *)markerId coordinate:(CLLocationCoordinate2D)coordinate;
-- (void)onMarkerDrag:(NSString *)markerId coordinate:(CLLocationCoordinate2D)coordinate;
-- (void)onInfoWindowTap:(NSString *)markerId;
-- (void)showMarkerInfoWindow:(NSString *)markerId result:(FlutterResult)result;
-- (void)hideMarkerInfoWindow:(NSString *)markerId result:(FlutterResult)result;
-- (void)isMarkerInfoWindowShown:(NSString *)markerId result:(FlutterResult)result;
+- (void)removeMarkersWithIdentifiers:(NSArray *)identifiers;
+- (BOOL)didTapMarkerWithIdentifier:(NSString *)identifier;
+- (void)didStartDraggingMarkerWithIdentifier:(NSString *)identifier
+ location:(CLLocationCoordinate2D)coordinate;
+- (void)didEndDraggingMarkerWithIdentifier:(NSString *)identifier
+ location:(CLLocationCoordinate2D)coordinate;
+- (void)didDragMarkerWithIdentifier:(NSString *)identifier
+ location:(CLLocationCoordinate2D)coordinate;
+- (void)didTapInfoWindowOfMarkerWithIdentifier:(NSString *)identifier;
+- (void)showMarkerInfoWindowWithIdentifier:(NSString *)identifier result:(FlutterResult)result;
+- (void)hideMarkerInfoWindowWithIdentifier:(NSString *)identifier result:(FlutterResult)result;
+- (void)isInfoWindowShownForMarkerWithIdentifier:(NSString *)identifier
+ result:(FlutterResult)result;
@end
NS_ASSUME_NONNULL_END
diff --git a/packages/google_maps_flutter/google_maps_flutter/ios/Classes/GoogleMapMarkerController.m b/packages/google_maps_flutter/google_maps_flutter/ios/Classes/GoogleMapMarkerController.m
index c2877e2..dd07e79 100644
--- a/packages/google_maps_flutter/google_maps_flutter/ios/Classes/GoogleMapMarkerController.m
+++ b/packages/google_maps_flutter/google_maps_flutter/ios/Classes/GoogleMapMarkerController.m
@@ -3,184 +3,159 @@
// found in the LICENSE file.
#import "GoogleMapMarkerController.h"
-#import "JsonConversions.h"
+#import "FLTGoogleMapJSONConversions.h"
-static UIImage *ExtractIcon(NSObject<FlutterPluginRegistrar> *registrar, NSArray *icon);
-static void InterpretInfoWindow(id<FLTGoogleMapMarkerOptionsSink> sink, NSDictionary *data);
+@interface FLTGoogleMapMarkerController ()
-@implementation FLTGoogleMapMarkerController {
- GMSMarker *_marker;
- GMSMapView *_mapView;
- BOOL _consumeTapEvents;
-}
+@property(strong, nonatomic) GMSMarker *marker;
+@property(weak, nonatomic) GMSMapView *mapView;
+@property(assign, nonatomic, readwrite) BOOL consumeTapEvents;
+
+@end
+
+@implementation FLTGoogleMapMarkerController
+
- (instancetype)initMarkerWithPosition:(CLLocationCoordinate2D)position
- markerId:(NSString *)markerId
+ identifier:(NSString *)identifier
mapView:(GMSMapView *)mapView {
self = [super init];
if (self) {
_marker = [GMSMarker markerWithPosition:position];
_mapView = mapView;
- _markerId = markerId;
- _marker.userData = @[ _markerId ];
- _consumeTapEvents = NO;
+ _marker.userData = @[ identifier ];
}
return self;
}
+
- (void)showInfoWindow {
- _mapView.selectedMarker = _marker;
-}
-- (void)hideInfoWindow {
- if (_mapView.selectedMarker == _marker) {
- _mapView.selectedMarker = nil;
- }
-}
-- (BOOL)isInfoWindowShown {
- return _mapView.selectedMarker == _marker;
-}
-- (BOOL)consumeTapEvents {
- return _consumeTapEvents;
-}
-- (void)removeMarker {
- _marker.map = nil;
+ self.mapView.selectedMarker = self.marker;
}
-#pragma mark - FLTGoogleMapMarkerOptionsSink methods
+- (void)hideInfoWindow {
+ if (self.mapView.selectedMarker == self.marker) {
+ self.mapView.selectedMarker = nil;
+ }
+}
+
+- (BOOL)isInfoWindowShown {
+ return self.mapView.selectedMarker == self.marker;
+}
+
+- (void)removeMarker {
+ self.marker.map = nil;
+}
- (void)setAlpha:(float)alpha {
- _marker.opacity = alpha;
+ self.marker.opacity = alpha;
}
+
- (void)setAnchor:(CGPoint)anchor {
- _marker.groundAnchor = anchor;
+ self.marker.groundAnchor = anchor;
}
-- (void)setConsumeTapEvents:(BOOL)consumes {
- _consumeTapEvents = consumes;
-}
+
- (void)setDraggable:(BOOL)draggable {
- _marker.draggable = draggable;
+ self.marker.draggable = draggable;
}
+
- (void)setFlat:(BOOL)flat {
- _marker.flat = flat;
+ self.marker.flat = flat;
}
+
- (void)setIcon:(UIImage *)icon {
- _marker.icon = icon;
+ self.marker.icon = icon;
}
+
- (void)setInfoWindowAnchor:(CGPoint)anchor {
- _marker.infoWindowAnchor = anchor;
+ self.marker.infoWindowAnchor = anchor;
}
+
- (void)setInfoWindowTitle:(NSString *)title snippet:(NSString *)snippet {
- _marker.title = title;
- _marker.snippet = snippet;
+ self.marker.title = title;
+ self.marker.snippet = snippet;
}
+
- (void)setPosition:(CLLocationCoordinate2D)position {
- _marker.position = position;
+ self.marker.position = position;
}
+
- (void)setRotation:(CLLocationDegrees)rotation {
- _marker.rotation = rotation;
+ self.marker.rotation = rotation;
}
+
- (void)setVisible:(BOOL)visible {
- _marker.map = visible ? _mapView : nil;
+ self.marker.map = visible ? self.mapView : nil;
}
+
- (void)setZIndex:(int)zIndex {
- _marker.zIndex = zIndex;
-}
-@end
-
-static double ToDouble(NSNumber *data) { return [FLTGoogleMapJsonConversions toDouble:data]; }
-
-static float ToFloat(NSNumber *data) { return [FLTGoogleMapJsonConversions toFloat:data]; }
-
-static CLLocationCoordinate2D ToLocation(NSArray *data) {
- return [FLTGoogleMapJsonConversions toLocation:data];
+ self.marker.zIndex = zIndex;
}
-static int ToInt(NSNumber *data) { return [FLTGoogleMapJsonConversions toInt:data]; }
-
-static BOOL ToBool(NSNumber *data) { return [FLTGoogleMapJsonConversions toBool:data]; }
-
-static CGPoint ToPoint(NSArray *data) { return [FLTGoogleMapJsonConversions toPoint:data]; }
-
-static NSArray *PositionToJson(CLLocationCoordinate2D data) {
- return [FLTGoogleMapJsonConversions positionToJson:data];
-}
-
-static void InterpretMarkerOptions(NSDictionary *data, id<FLTGoogleMapMarkerOptionsSink> sink,
- NSObject<FlutterPluginRegistrar> *registrar) {
+- (void)interpretMarkerOptions:(NSDictionary *)data
+ registrar:(NSObject<FlutterPluginRegistrar> *)registrar {
NSNumber *alpha = data[@"alpha"];
- if (alpha != nil) {
- [sink setAlpha:ToFloat(alpha)];
+ if (alpha && alpha != (id)[NSNull null]) {
+ [self setAlpha:[alpha floatValue]];
}
NSArray *anchor = data[@"anchor"];
- if (anchor) {
- [sink setAnchor:ToPoint(anchor)];
+ if (anchor && anchor != (id)[NSNull null]) {
+ [self setAnchor:[FLTGoogleMapJSONConversions pointFromArray:anchor]];
}
NSNumber *draggable = data[@"draggable"];
- if (draggable != nil) {
- [sink setDraggable:ToBool(draggable)];
+ if (draggable && draggable != (id)[NSNull null]) {
+ [self setDraggable:[draggable boolValue]];
}
NSArray *icon = data[@"icon"];
- if (icon) {
- UIImage *image = ExtractIcon(registrar, icon);
- [sink setIcon:image];
+ if (icon && icon != (id)[NSNull null]) {
+ UIImage *image = [self extractIconFromData:icon registrar:registrar];
+ [self setIcon:image];
}
NSNumber *flat = data[@"flat"];
- if (flat != nil) {
- [sink setFlat:ToBool(flat)];
+ if (flat && flat != (id)[NSNull null]) {
+ [self setFlat:[flat boolValue]];
}
NSNumber *consumeTapEvents = data[@"consumeTapEvents"];
- if (consumeTapEvents != nil) {
- [sink setConsumeTapEvents:ToBool(consumeTapEvents)];
+ if (consumeTapEvents && consumeTapEvents != (id)[NSNull null]) {
+ [self setConsumeTapEvents:[consumeTapEvents boolValue]];
}
- InterpretInfoWindow(sink, data);
+ [self interpretInfoWindow:data];
NSArray *position = data[@"position"];
- if (position) {
- [sink setPosition:ToLocation(position)];
+ if (position && position != (id)[NSNull null]) {
+ [self setPosition:[FLTGoogleMapJSONConversions locationFromLatLong:position]];
}
NSNumber *rotation = data[@"rotation"];
- if (rotation != nil) {
- [sink setRotation:ToDouble(rotation)];
+ if (rotation && rotation != (id)[NSNull null]) {
+ [self setRotation:[rotation doubleValue]];
}
NSNumber *visible = data[@"visible"];
- if (visible != nil) {
- [sink setVisible:ToBool(visible)];
+ if (visible && visible != (id)[NSNull null]) {
+ [self setVisible:[visible boolValue]];
}
NSNumber *zIndex = data[@"zIndex"];
- if (zIndex != nil) {
- [sink setZIndex:ToInt(zIndex)];
+ if (zIndex && zIndex != (id)[NSNull null]) {
+ [self setZIndex:[zIndex intValue]];
}
}
-static void InterpretInfoWindow(id<FLTGoogleMapMarkerOptionsSink> sink, NSDictionary *data) {
+- (void)interpretInfoWindow:(NSDictionary *)data {
NSDictionary *infoWindow = data[@"infoWindow"];
- if (infoWindow) {
+ if (infoWindow && infoWindow != (id)[NSNull null]) {
NSString *title = infoWindow[@"title"];
NSString *snippet = infoWindow[@"snippet"];
- if (title) {
- [sink setInfoWindowTitle:title snippet:snippet];
+ if (title && title != (id)[NSNull null]) {
+ [self setInfoWindowTitle:title snippet:snippet];
}
NSArray *infoWindowAnchor = infoWindow[@"infoWindowAnchor"];
- if (infoWindowAnchor) {
- [sink setInfoWindowAnchor:ToPoint(infoWindowAnchor)];
+ if (infoWindowAnchor && infoWindowAnchor != (id)[NSNull null]) {
+ [self setInfoWindowAnchor:[FLTGoogleMapJSONConversions pointFromArray:infoWindowAnchor]];
}
}
}
-static UIImage *scaleImage(UIImage *image, NSNumber *scaleParam) {
- double scale = 1.0;
- if ([scaleParam isKindOfClass:[NSNumber class]]) {
- scale = scaleParam.doubleValue;
- }
- if (fabs(scale - 1) > 1e-3) {
- return [UIImage imageWithCGImage:[image CGImage]
- scale:(image.scale * scale)
- orientation:(image.imageOrientation)];
- }
- return image;
-}
-
-static UIImage *ExtractIcon(NSObject<FlutterPluginRegistrar> *registrar, NSArray *iconData) {
+- (UIImage *)extractIconFromData:(NSArray *)iconData
+ registrar:(NSObject<FlutterPluginRegistrar> *)registrar {
UIImage *image;
if ([iconData.firstObject isEqualToString:@"defaultMarker"]) {
- CGFloat hue = (iconData.count == 1) ? 0.0f : ToDouble(iconData[1]);
+ CGFloat hue = (iconData.count == 1) ? 0.0f : [iconData[1] doubleValue];
image = [GMSMarker markerImageWithColor:[UIColor colorWithHue:hue / 360.0
saturation:1.0
brightness:0.7
@@ -195,8 +170,8 @@
} else if ([iconData.firstObject isEqualToString:@"fromAssetImage"]) {
if (iconData.count == 3) {
image = [UIImage imageNamed:[registrar lookupKeyForAsset:iconData[1]]];
- NSNumber *scaleParam = iconData[2];
- image = scaleImage(image, scaleParam);
+ id scaleParam = iconData[2];
+ image = [self scaleImage:image by:scaleParam];
} else {
NSString *error =
[NSString stringWithFormat:@"'fromAssetImage' should have exactly 3 arguments. Got: %lu",
@@ -231,110 +206,145 @@
return image;
}
-@implementation FLTMarkersController {
- NSMutableDictionary *_markerIdToController;
- FlutterMethodChannel *_methodChannel;
- NSObject<FlutterPluginRegistrar> *_registrar;
- GMSMapView *_mapView;
+- (UIImage *)scaleImage:(UIImage *)image by:(id)scaleParam {
+ double scale = 1.0;
+ if ([scaleParam isKindOfClass:[NSNumber class]]) {
+ scale = [scaleParam doubleValue];
+ }
+ if (fabs(scale - 1) > 1e-3) {
+ return [UIImage imageWithCGImage:[image CGImage]
+ scale:(image.scale * scale)
+ orientation:(image.imageOrientation)];
+ }
+ return image;
}
-- (instancetype)init:(FlutterMethodChannel *)methodChannel
- mapView:(GMSMapView *)mapView
- registrar:(NSObject<FlutterPluginRegistrar> *)registrar {
+
+@end
+
+@interface FLTMarkersController ()
+
+@property(strong, nonatomic) NSMutableDictionary *markerIdentifierToController;
+@property(strong, nonatomic) FlutterMethodChannel *methodChannel;
+@property(weak, nonatomic) NSObject<FlutterPluginRegistrar> *registrar;
+@property(weak, nonatomic) GMSMapView *mapView;
+
+@end
+
+@implementation FLTMarkersController
+
+- (instancetype)initWithMethodChannel:(FlutterMethodChannel *)methodChannel
+ mapView:(GMSMapView *)mapView
+ registrar:(NSObject<FlutterPluginRegistrar> *)registrar {
self = [super init];
if (self) {
_methodChannel = methodChannel;
_mapView = mapView;
- _markerIdToController = [NSMutableDictionary dictionaryWithCapacity:1];
+ _markerIdentifierToController = [[NSMutableDictionary alloc] init];
_registrar = registrar;
}
return self;
}
+
- (void)addMarkers:(NSArray *)markersToAdd {
for (NSDictionary *marker in markersToAdd) {
CLLocationCoordinate2D position = [FLTMarkersController getPosition:marker];
- NSString *markerId = [FLTMarkersController getMarkerId:marker];
+ NSString *identifier = marker[@"markerId"];
FLTGoogleMapMarkerController *controller =
[[FLTGoogleMapMarkerController alloc] initMarkerWithPosition:position
- markerId:markerId
- mapView:_mapView];
- InterpretMarkerOptions(marker, controller, _registrar);
- _markerIdToController[markerId] = controller;
+ identifier:identifier
+ mapView:self.mapView];
+ [controller interpretMarkerOptions:marker registrar:self.registrar];
+ self.markerIdentifierToController[identifier] = controller;
}
}
+
- (void)changeMarkers:(NSArray *)markersToChange {
for (NSDictionary *marker in markersToChange) {
- NSString *markerId = [FLTMarkersController getMarkerId:marker];
- FLTGoogleMapMarkerController *controller = _markerIdToController[markerId];
+ NSString *identifier = marker[@"markerId"];
+ FLTGoogleMapMarkerController *controller = self.markerIdentifierToController[identifier];
if (!controller) {
continue;
}
- InterpretMarkerOptions(marker, controller, _registrar);
+ [controller interpretMarkerOptions:marker registrar:self.registrar];
}
}
-- (void)removeMarkerIds:(NSArray *)markerIdsToRemove {
- for (NSString *markerId in markerIdsToRemove) {
- if (!markerId) {
- continue;
- }
- FLTGoogleMapMarkerController *controller = _markerIdToController[markerId];
+
+- (void)removeMarkersWithIdentifiers:(NSArray *)identifiers {
+ for (NSString *identifier in identifiers) {
+ FLTGoogleMapMarkerController *controller = self.markerIdentifierToController[identifier];
if (!controller) {
continue;
}
[controller removeMarker];
- [_markerIdToController removeObjectForKey:markerId];
+ [self.markerIdentifierToController removeObjectForKey:identifier];
}
}
-- (BOOL)onMarkerTap:(NSString *)markerId {
- if (!markerId) {
+
+- (BOOL)didTapMarkerWithIdentifier:(NSString *)identifier {
+ if (!identifier) {
return NO;
}
- FLTGoogleMapMarkerController *controller = _markerIdToController[markerId];
+ FLTGoogleMapMarkerController *controller = self.markerIdentifierToController[identifier];
if (!controller) {
return NO;
}
- [_methodChannel invokeMethod:@"marker#onTap" arguments:@{@"markerId" : markerId}];
+ [self.methodChannel invokeMethod:@"marker#onTap" arguments:@{@"markerId" : identifier}];
return controller.consumeTapEvents;
}
-- (void)onMarkerDragStart:(NSString *)markerId coordinate:(CLLocationCoordinate2D)coordinate {
- if (!markerId) {
+
+- (void)didStartDraggingMarkerWithIdentifier:(NSString *)identifier
+ location:(CLLocationCoordinate2D)location {
+ if (!identifier) {
return;
}
- FLTGoogleMapMarkerController *controller = _markerIdToController[markerId];
+ FLTGoogleMapMarkerController *controller = self.markerIdentifierToController[identifier];
if (!controller) {
return;
}
- [_methodChannel invokeMethod:@"marker#onDragStart"
- arguments:@{@"markerId" : markerId, @"position" : PositionToJson(coordinate)}];
+ [self.methodChannel invokeMethod:@"marker#onDragStart"
+ arguments:@{
+ @"markerId" : identifier,
+ @"position" : [FLTGoogleMapJSONConversions arrayFromLocation:location]
+ }];
}
-- (void)onMarkerDrag:(NSString *)markerId coordinate:(CLLocationCoordinate2D)coordinate {
- if (!markerId) {
+
+- (void)didDragMarkerWithIdentifier:(NSString *)identifier
+ location:(CLLocationCoordinate2D)location {
+ if (!identifier) {
return;
}
- FLTGoogleMapMarkerController *controller = _markerIdToController[markerId];
+ FLTGoogleMapMarkerController *controller = self.markerIdentifierToController[identifier];
if (!controller) {
return;
}
- [_methodChannel invokeMethod:@"marker#onDrag"
- arguments:@{@"markerId" : markerId, @"position" : PositionToJson(coordinate)}];
+ [self.methodChannel invokeMethod:@"marker#onDrag"
+ arguments:@{
+ @"markerId" : identifier,
+ @"position" : [FLTGoogleMapJSONConversions arrayFromLocation:location]
+ }];
}
-- (void)onMarkerDragEnd:(NSString *)markerId coordinate:(CLLocationCoordinate2D)coordinate {
- if (!markerId) {
- return;
- }
- FLTGoogleMapMarkerController *controller = _markerIdToController[markerId];
+
+- (void)didEndDraggingMarkerWithIdentifier:(NSString *)identifier
+ location:(CLLocationCoordinate2D)location {
+ FLTGoogleMapMarkerController *controller = self.markerIdentifierToController[identifier];
if (!controller) {
return;
}
- [_methodChannel invokeMethod:@"marker#onDragEnd"
- arguments:@{@"markerId" : markerId, @"position" : PositionToJson(coordinate)}];
+ [self.methodChannel invokeMethod:@"marker#onDragEnd"
+ arguments:@{
+ @"markerId" : identifier,
+ @"position" : [FLTGoogleMapJSONConversions arrayFromLocation:location]
+ }];
}
-- (void)onInfoWindowTap:(NSString *)markerId {
- if (markerId && _markerIdToController[markerId]) {
- [_methodChannel invokeMethod:@"infoWindow#onTap" arguments:@{@"markerId" : markerId}];
+
+- (void)didTapInfoWindowOfMarkerWithIdentifier:(NSString *)identifier {
+ if (identifier && self.markerIdentifierToController[identifier]) {
+ [self.methodChannel invokeMethod:@"infoWindow#onTap" arguments:@{@"markerId" : identifier}];
}
}
-- (void)showMarkerInfoWindow:(NSString *)markerId result:(FlutterResult)result {
- FLTGoogleMapMarkerController *controller = _markerIdToController[markerId];
+
+- (void)showMarkerInfoWindowWithIdentifier:(NSString *)identifier result:(FlutterResult)result {
+ FLTGoogleMapMarkerController *controller = self.markerIdentifierToController[identifier];
if (controller) {
[controller showInfoWindow];
result(nil);
@@ -344,8 +354,9 @@
details:nil]);
}
}
-- (void)hideMarkerInfoWindow:(NSString *)markerId result:(FlutterResult)result {
- FLTGoogleMapMarkerController *controller = _markerIdToController[markerId];
+
+- (void)hideMarkerInfoWindowWithIdentifier:(NSString *)identifier result:(FlutterResult)result {
+ FLTGoogleMapMarkerController *controller = self.markerIdentifierToController[identifier];
if (controller) {
[controller hideInfoWindow];
result(nil);
@@ -355,8 +366,10 @@
details:nil]);
}
}
-- (void)isMarkerInfoWindowShown:(NSString *)markerId result:(FlutterResult)result {
- FLTGoogleMapMarkerController *controller = _markerIdToController[markerId];
+
+- (void)isInfoWindowShownForMarkerWithIdentifier:(NSString *)identifier
+ result:(FlutterResult)result {
+ FLTGoogleMapMarkerController *controller = self.markerIdentifierToController[identifier];
if (controller) {
result(@([controller isInfoWindowShown]));
} else {
@@ -368,9 +381,7 @@
+ (CLLocationCoordinate2D)getPosition:(NSDictionary *)marker {
NSArray *position = marker[@"position"];
- return ToLocation(position);
+ return [FLTGoogleMapJSONConversions locationFromLatLong:position];
}
-+ (NSString *)getMarkerId:(NSDictionary *)marker {
- return marker[@"markerId"];
-}
+
@end
diff --git a/packages/google_maps_flutter/google_maps_flutter/ios/Classes/GoogleMapPolygonController.h b/packages/google_maps_flutter/google_maps_flutter/ios/Classes/GoogleMapPolygonController.h
index bdc5dd4..bd0c911 100644
--- a/packages/google_maps_flutter/google_maps_flutter/ios/Classes/GoogleMapPolygonController.h
+++ b/packages/google_maps_flutter/google_maps_flutter/ios/Classes/GoogleMapPolygonController.h
@@ -5,23 +5,10 @@
#import <Flutter/Flutter.h>
#import <GoogleMaps/GoogleMaps.h>
-// Defines polygon UI options writable from Flutter.
-@protocol FLTGoogleMapPolygonOptionsSink
-- (void)setConsumeTapEvents:(BOOL)consume;
-- (void)setVisible:(BOOL)visible;
-- (void)setFillColor:(UIColor *)color;
-- (void)setStrokeColor:(UIColor *)color;
-- (void)setStrokeWidth:(CGFloat)width;
-- (void)setPoints:(NSArray<CLLocation *> *)points;
-- (void)setHoles:(NSArray<NSArray<CLLocation *> *> *)holes;
-- (void)setZIndex:(int)zIndex;
-@end
-
// Defines polygon controllable by Flutter.
-@interface FLTGoogleMapPolygonController : NSObject <FLTGoogleMapPolygonOptionsSink>
-@property(atomic, readonly) NSString *polygonId;
+@interface FLTGoogleMapPolygonController : NSObject
- (instancetype)initPolygonWithPath:(GMSMutablePath *)path
- polygonId:(NSString *)polygonId
+ identifier:(NSString *)identifier
mapView:(GMSMapView *)mapView;
- (void)removePolygon;
@end
@@ -32,7 +19,7 @@
registrar:(NSObject<FlutterPluginRegistrar> *)registrar;
- (void)addPolygons:(NSArray *)polygonsToAdd;
- (void)changePolygons:(NSArray *)polygonsToChange;
-- (void)removePolygonIds:(NSArray *)polygonIdsToRemove;
-- (void)onPolygonTap:(NSString *)polygonId;
-- (bool)hasPolygonWithId:(NSString *)polygonId;
+- (void)removePolygonWithIdentifiers:(NSArray *)identifiers;
+- (void)didTapPolygonWithIdentifier:(NSString *)identifier;
+- (bool)hasPolygonWithIdentifier:(NSString *)identifier;
@end
diff --git a/packages/google_maps_flutter/google_maps_flutter/ios/Classes/GoogleMapPolygonController.m b/packages/google_maps_flutter/google_maps_flutter/ios/Classes/GoogleMapPolygonController.m
index 649ba98..398adfc 100644
--- a/packages/google_maps_flutter/google_maps_flutter/ios/Classes/GoogleMapPolygonController.m
+++ b/packages/google_maps_flutter/google_maps_flutter/ios/Classes/GoogleMapPolygonController.m
@@ -3,39 +3,41 @@
// found in the LICENSE file.
#import "GoogleMapPolygonController.h"
-#import "JsonConversions.h"
+#import "FLTGoogleMapJSONConversions.h"
-@implementation FLTGoogleMapPolygonController {
- GMSPolygon *_polygon;
- GMSMapView *_mapView;
-}
+@interface FLTGoogleMapPolygonController ()
+
+@property(strong, nonatomic) GMSPolygon *polygon;
+@property(weak, nonatomic) GMSMapView *mapView;
+
+@end
+
+@implementation FLTGoogleMapPolygonController
+
- (instancetype)initPolygonWithPath:(GMSMutablePath *)path
- polygonId:(NSString *)polygonId
+ identifier:(NSString *)identifier
mapView:(GMSMapView *)mapView {
self = [super init];
if (self) {
_polygon = [GMSPolygon polygonWithPath:path];
_mapView = mapView;
- _polygonId = polygonId;
- _polygon.userData = @[ polygonId ];
+ _polygon.userData = @[ identifier ];
}
return self;
}
- (void)removePolygon {
- _polygon.map = nil;
+ self.polygon.map = nil;
}
-#pragma mark - FLTGoogleMapPolygonOptionsSink methods
-
- (void)setConsumeTapEvents:(BOOL)consumes {
- _polygon.tappable = consumes;
+ self.polygon.tappable = consumes;
}
- (void)setVisible:(BOOL)visible {
- _polygon.map = visible ? _mapView : nil;
+ self.polygon.map = visible ? self.mapView : nil;
}
- (void)setZIndex:(int)zIndex {
- _polygon.zIndex = zIndex;
+ self.polygon.zIndex = zIndex;
}
- (void)setPoints:(NSArray<CLLocation *> *)points {
GMSMutablePath *path = [GMSMutablePath path];
@@ -43,7 +45,7 @@
for (CLLocation *location in points) {
[path addCoordinate:location.coordinate];
}
- _polygon.path = path;
+ self.polygon.path = path;
}
- (void)setHoles:(NSArray<NSArray<CLLocation *> *> *)rawHoles {
NSMutableArray<GMSMutablePath *> *holes = [[NSMutableArray<GMSMutablePath *> alloc] init];
@@ -56,83 +58,75 @@
[holes addObject:path];
}
- _polygon.holes = holes;
+ self.polygon.holes = holes;
}
- (void)setFillColor:(UIColor *)color {
- _polygon.fillColor = color;
+ self.polygon.fillColor = color;
}
- (void)setStrokeColor:(UIColor *)color {
- _polygon.strokeColor = color;
+ self.polygon.strokeColor = color;
}
- (void)setStrokeWidth:(CGFloat)width {
- _polygon.strokeWidth = width;
-}
-@end
-
-static int ToInt(NSNumber *data) { return [FLTGoogleMapJsonConversions toInt:data]; }
-
-static BOOL ToBool(NSNumber *data) { return [FLTGoogleMapJsonConversions toBool:data]; }
-
-static NSArray<CLLocation *> *ToPoints(NSArray *data) {
- return [FLTGoogleMapJsonConversions toPoints:data];
+ self.polygon.strokeWidth = width;
}
-static NSArray<NSArray<CLLocation *> *> *ToHoles(NSArray<NSArray *> *data) {
- return [FLTGoogleMapJsonConversions toHoles:data];
-}
-
-static UIColor *ToColor(NSNumber *data) { return [FLTGoogleMapJsonConversions toColor:data]; }
-
-static void InterpretPolygonOptions(NSDictionary *data, id<FLTGoogleMapPolygonOptionsSink> sink,
- NSObject<FlutterPluginRegistrar> *registrar) {
+- (void)interpretPolygonOptions:(NSDictionary *)data
+ registrar:(NSObject<FlutterPluginRegistrar> *)registrar {
NSNumber *consumeTapEvents = data[@"consumeTapEvents"];
- if (consumeTapEvents != nil) {
- [sink setConsumeTapEvents:ToBool(consumeTapEvents)];
+ if (consumeTapEvents && consumeTapEvents != (id)[NSNull null]) {
+ [self setConsumeTapEvents:[consumeTapEvents boolValue]];
}
NSNumber *visible = data[@"visible"];
- if (visible != nil) {
- [sink setVisible:ToBool(visible)];
+ if (visible && visible != (id)[NSNull null]) {
+ [self setVisible:[visible boolValue]];
}
NSNumber *zIndex = data[@"zIndex"];
- if (zIndex != nil) {
- [sink setZIndex:ToInt(zIndex)];
+ if (zIndex && zIndex != (id)[NSNull null]) {
+ [self setZIndex:[zIndex intValue]];
}
NSArray *points = data[@"points"];
- if (points) {
- [sink setPoints:ToPoints(points)];
+ if (points && points != (id)[NSNull null]) {
+ [self setPoints:[FLTGoogleMapJSONConversions pointsFromLatLongs:points]];
}
NSArray *holes = data[@"holes"];
- if (holes) {
- [sink setHoles:ToHoles(holes)];
+ if (holes && holes != (id)[NSNull null]) {
+ [self setHoles:[FLTGoogleMapJSONConversions holesFromPointsArray:holes]];
}
NSNumber *fillColor = data[@"fillColor"];
- if (fillColor != nil) {
- [sink setFillColor:ToColor(fillColor)];
+ if (fillColor && fillColor != (id)[NSNull null]) {
+ [self setFillColor:[FLTGoogleMapJSONConversions colorFromRGBA:fillColor]];
}
NSNumber *strokeColor = data[@"strokeColor"];
- if (strokeColor != nil) {
- [sink setStrokeColor:ToColor(strokeColor)];
+ if (strokeColor && strokeColor != (id)[NSNull null]) {
+ [self setStrokeColor:[FLTGoogleMapJSONConversions colorFromRGBA:strokeColor]];
}
NSNumber *strokeWidth = data[@"strokeWidth"];
- if (strokeWidth != nil) {
- [sink setStrokeWidth:ToInt(strokeWidth)];
+ if (strokeWidth && strokeWidth != (id)[NSNull null]) {
+ [self setStrokeWidth:[strokeWidth intValue]];
}
}
-@implementation FLTPolygonsController {
- NSMutableDictionary *_polygonIdToController;
- FlutterMethodChannel *_methodChannel;
- NSObject<FlutterPluginRegistrar> *_registrar;
- GMSMapView *_mapView;
-}
+@end
+
+@interface FLTPolygonsController ()
+
+@property(strong, nonatomic) NSMutableDictionary *polygonIdentifierToController;
+@property(strong, nonatomic) FlutterMethodChannel *methodChannel;
+@property(weak, nonatomic) NSObject<FlutterPluginRegistrar> *registrar;
+@property(weak, nonatomic) GMSMapView *mapView;
+
+@end
+
+@implementation FLTPolygonsController
+
- (instancetype)init:(FlutterMethodChannel *)methodChannel
mapView:(GMSMapView *)mapView
registrar:(NSObject<FlutterPluginRegistrar> *)registrar {
@@ -140,72 +134,73 @@
if (self) {
_methodChannel = methodChannel;
_mapView = mapView;
- _polygonIdToController = [NSMutableDictionary dictionaryWithCapacity:1];
+ _polygonIdentifierToController = [NSMutableDictionary dictionaryWithCapacity:1];
_registrar = registrar;
}
return self;
}
+
- (void)addPolygons:(NSArray *)polygonsToAdd {
for (NSDictionary *polygon in polygonsToAdd) {
GMSMutablePath *path = [FLTPolygonsController getPath:polygon];
- NSString *polygonId = [FLTPolygonsController getPolygonId:polygon];
+ NSString *identifier = polygon[@"polygonId"];
FLTGoogleMapPolygonController *controller =
[[FLTGoogleMapPolygonController alloc] initPolygonWithPath:path
- polygonId:polygonId
- mapView:_mapView];
- InterpretPolygonOptions(polygon, controller, _registrar);
- _polygonIdToController[polygonId] = controller;
+ identifier:identifier
+ mapView:self.mapView];
+ [controller interpretPolygonOptions:polygon registrar:self.registrar];
+ self.polygonIdentifierToController[identifier] = controller;
}
}
+
- (void)changePolygons:(NSArray *)polygonsToChange {
for (NSDictionary *polygon in polygonsToChange) {
- NSString *polygonId = [FLTPolygonsController getPolygonId:polygon];
- FLTGoogleMapPolygonController *controller = _polygonIdToController[polygonId];
+ NSString *identifier = polygon[@"polygonId"];
+ FLTGoogleMapPolygonController *controller = self.polygonIdentifierToController[identifier];
if (!controller) {
continue;
}
- InterpretPolygonOptions(polygon, controller, _registrar);
+ [controller interpretPolygonOptions:polygon registrar:self.registrar];
}
}
-- (void)removePolygonIds:(NSArray *)polygonIdsToRemove {
- for (NSString *polygonId in polygonIdsToRemove) {
- if (!polygonId) {
- continue;
- }
- FLTGoogleMapPolygonController *controller = _polygonIdToController[polygonId];
+
+- (void)removePolygonWithIdentifiers:(NSArray *)identifiers {
+ for (NSString *identifier in identifiers) {
+ FLTGoogleMapPolygonController *controller = self.polygonIdentifierToController[identifier];
if (!controller) {
continue;
}
[controller removePolygon];
- [_polygonIdToController removeObjectForKey:polygonId];
+ [self.polygonIdentifierToController removeObjectForKey:identifier];
}
}
-- (void)onPolygonTap:(NSString *)polygonId {
- if (!polygonId) {
+
+- (void)didTapPolygonWithIdentifier:(NSString *)identifier {
+ if (!identifier) {
return;
}
- FLTGoogleMapPolygonController *controller = _polygonIdToController[polygonId];
+ FLTGoogleMapPolygonController *controller = self.polygonIdentifierToController[identifier];
if (!controller) {
return;
}
- [_methodChannel invokeMethod:@"polygon#onTap" arguments:@{@"polygonId" : polygonId}];
+ [self.methodChannel invokeMethod:@"polygon#onTap" arguments:@{@"polygonId" : identifier}];
}
-- (bool)hasPolygonWithId:(NSString *)polygonId {
- if (!polygonId) {
+
+- (bool)hasPolygonWithIdentifier:(NSString *)identifier {
+ if (!identifier) {
return false;
}
- return _polygonIdToController[polygonId] != nil;
+ return self.polygonIdentifierToController[identifier] != nil;
}
+
+ (GMSMutablePath *)getPath:(NSDictionary *)polygon {
NSArray *pointArray = polygon[@"points"];
- NSArray<CLLocation *> *points = ToPoints(pointArray);
+ NSArray<CLLocation *> *points = [FLTGoogleMapJSONConversions pointsFromLatLongs:pointArray];
GMSMutablePath *path = [GMSMutablePath path];
for (CLLocation *location in points) {
[path addCoordinate:location.coordinate];
}
return path;
}
-+ (NSString *)getPolygonId:(NSDictionary *)polygon {
- return polygon[@"polygonId"];
-}
+
@end
diff --git a/packages/google_maps_flutter/google_maps_flutter/ios/Classes/GoogleMapPolylineController.h b/packages/google_maps_flutter/google_maps_flutter/ios/Classes/GoogleMapPolylineController.h
index 0e614ee..f85d1a3 100644
--- a/packages/google_maps_flutter/google_maps_flutter/ios/Classes/GoogleMapPolylineController.h
+++ b/packages/google_maps_flutter/google_maps_flutter/ios/Classes/GoogleMapPolylineController.h
@@ -5,22 +5,10 @@
#import <Flutter/Flutter.h>
#import <GoogleMaps/GoogleMaps.h>
-// Defines polyline UI options writable from Flutter.
-@protocol FLTGoogleMapPolylineOptionsSink
-- (void)setConsumeTapEvents:(BOOL)consume;
-- (void)setVisible:(BOOL)visible;
-- (void)setColor:(UIColor *)color;
-- (void)setStrokeWidth:(CGFloat)width;
-- (void)setPoints:(NSArray<CLLocation *> *)points;
-- (void)setZIndex:(int)zIndex;
-- (void)setGeodesic:(BOOL)isGeodesic;
-@end
-
// Defines polyline controllable by Flutter.
-@interface FLTGoogleMapPolylineController : NSObject <FLTGoogleMapPolylineOptionsSink>
-@property(atomic, readonly) NSString *polylineId;
+@interface FLTGoogleMapPolylineController : NSObject
- (instancetype)initPolylineWithPath:(GMSMutablePath *)path
- polylineId:(NSString *)polylineId
+ identifier:(NSString *)identifier
mapView:(GMSMapView *)mapView;
- (void)removePolyline;
@end
@@ -31,7 +19,7 @@
registrar:(NSObject<FlutterPluginRegistrar> *)registrar;
- (void)addPolylines:(NSArray *)polylinesToAdd;
- (void)changePolylines:(NSArray *)polylinesToChange;
-- (void)removePolylineIds:(NSArray *)polylineIdsToRemove;
-- (void)onPolylineTap:(NSString *)polylineId;
-- (bool)hasPolylineWithId:(NSString *)polylineId;
+- (void)removePolylineWithIdentifiers:(NSArray *)identifiers;
+- (void)didTapPolylineWithIdentifier:(NSString *)identifier;
+- (bool)hasPolylineWithIdentifier:(NSString *)identifier;
@end
diff --git a/packages/google_maps_flutter/google_maps_flutter/ios/Classes/GoogleMapPolylineController.m b/packages/google_maps_flutter/google_maps_flutter/ios/Classes/GoogleMapPolylineController.m
index f366051..77601d4 100644
--- a/packages/google_maps_flutter/google_maps_flutter/ios/Classes/GoogleMapPolylineController.m
+++ b/packages/google_maps_flutter/google_maps_flutter/ios/Classes/GoogleMapPolylineController.m
@@ -3,39 +3,41 @@
// found in the LICENSE file.
#import "GoogleMapPolylineController.h"
-#import "JsonConversions.h"
+#import "FLTGoogleMapJSONConversions.h"
-@implementation FLTGoogleMapPolylineController {
- GMSPolyline *_polyline;
- GMSMapView *_mapView;
-}
+@interface FLTGoogleMapPolylineController ()
+
+@property(strong, nonatomic) GMSPolyline *polyline;
+@property(weak, nonatomic) GMSMapView *mapView;
+
+@end
+
+@implementation FLTGoogleMapPolylineController
+
- (instancetype)initPolylineWithPath:(GMSMutablePath *)path
- polylineId:(NSString *)polylineId
+ identifier:(NSString *)identifier
mapView:(GMSMapView *)mapView {
self = [super init];
if (self) {
_polyline = [GMSPolyline polylineWithPath:path];
_mapView = mapView;
- _polylineId = polylineId;
- _polyline.userData = @[ polylineId ];
+ _polyline.userData = @[ identifier ];
}
return self;
}
- (void)removePolyline {
- _polyline.map = nil;
+ self.polyline.map = nil;
}
-#pragma mark - FLTGoogleMapPolylineOptionsSink methods
-
- (void)setConsumeTapEvents:(BOOL)consumes {
- _polyline.tappable = consumes;
+ self.polyline.tappable = consumes;
}
- (void)setVisible:(BOOL)visible {
- _polyline.map = visible ? _mapView : nil;
+ self.polyline.map = visible ? self.mapView : nil;
}
- (void)setZIndex:(int)zIndex {
- _polyline.zIndex = zIndex;
+ self.polyline.zIndex = zIndex;
}
- (void)setPoints:(NSArray<CLLocation *> *)points {
GMSMutablePath *path = [GMSMutablePath path];
@@ -43,75 +45,72 @@
for (CLLocation *location in points) {
[path addCoordinate:location.coordinate];
}
- _polyline.path = path;
+ self.polyline.path = path;
}
- (void)setColor:(UIColor *)color {
- _polyline.strokeColor = color;
+ self.polyline.strokeColor = color;
}
- (void)setStrokeWidth:(CGFloat)width {
- _polyline.strokeWidth = width;
+ self.polyline.strokeWidth = width;
}
- (void)setGeodesic:(BOOL)isGeodesic {
- _polyline.geodesic = isGeodesic;
-}
-@end
-
-static int ToInt(NSNumber *data) { return [FLTGoogleMapJsonConversions toInt:data]; }
-
-static BOOL ToBool(NSNumber *data) { return [FLTGoogleMapJsonConversions toBool:data]; }
-
-static NSArray<CLLocation *> *ToPoints(NSArray *data) {
- return [FLTGoogleMapJsonConversions toPoints:data];
+ self.polyline.geodesic = isGeodesic;
}
-static UIColor *ToColor(NSNumber *data) { return [FLTGoogleMapJsonConversions toColor:data]; }
-
-static void InterpretPolylineOptions(NSDictionary *data, id<FLTGoogleMapPolylineOptionsSink> sink,
- NSObject<FlutterPluginRegistrar> *registrar) {
+- (void)interpretPolylineOptions:(NSDictionary *)data
+ registrar:(NSObject<FlutterPluginRegistrar> *)registrar {
NSNumber *consumeTapEvents = data[@"consumeTapEvents"];
- if (consumeTapEvents != nil) {
- [sink setConsumeTapEvents:ToBool(consumeTapEvents)];
+ if (consumeTapEvents && consumeTapEvents != (id)[NSNull null]) {
+ [self setConsumeTapEvents:[consumeTapEvents boolValue]];
}
NSNumber *visible = data[@"visible"];
- if (visible != nil) {
- [sink setVisible:ToBool(visible)];
+ if (visible && visible != (id)[NSNull null]) {
+ [self setVisible:[visible boolValue]];
}
NSNumber *zIndex = data[@"zIndex"];
- if (zIndex != nil) {
- [sink setZIndex:ToInt(zIndex)];
+ if (zIndex && zIndex != (id)[NSNull null]) {
+ [self setZIndex:[zIndex intValue]];
}
NSArray *points = data[@"points"];
- if (points) {
- [sink setPoints:ToPoints(points)];
+ if (points && points != (id)[NSNull null]) {
+ [self setPoints:[FLTGoogleMapJSONConversions pointsFromLatLongs:points]];
}
NSNumber *strokeColor = data[@"color"];
- if (strokeColor != nil) {
- [sink setColor:ToColor(strokeColor)];
+ if (strokeColor && strokeColor != (id)[NSNull null]) {
+ [self setColor:[FLTGoogleMapJSONConversions colorFromRGBA:strokeColor]];
}
NSNumber *strokeWidth = data[@"width"];
- if (strokeWidth != nil) {
- [sink setStrokeWidth:ToInt(strokeWidth)];
+ if (strokeWidth && strokeWidth != (id)[NSNull null]) {
+ [self setStrokeWidth:[strokeWidth intValue]];
}
NSNumber *geodesic = data[@"geodesic"];
- if (geodesic != nil) {
- [sink setGeodesic:geodesic.boolValue];
+ if (geodesic && geodesic != (id)[NSNull null]) {
+ [self setGeodesic:geodesic.boolValue];
}
}
-@implementation FLTPolylinesController {
- NSMutableDictionary *_polylineIdToController;
- FlutterMethodChannel *_methodChannel;
- NSObject<FlutterPluginRegistrar> *_registrar;
- GMSMapView *_mapView;
-}
+@end
+
+@interface FLTPolylinesController ()
+
+@property(strong, nonatomic) NSMutableDictionary *polylineIdentifierToController;
+@property(strong, nonatomic) FlutterMethodChannel *methodChannel;
+@property(weak, nonatomic) NSObject<FlutterPluginRegistrar> *registrar;
+@property(weak, nonatomic) GMSMapView *mapView;
+
+@end
+;
+
+@implementation FLTPolylinesController
+
- (instancetype)init:(FlutterMethodChannel *)methodChannel
mapView:(GMSMapView *)mapView
registrar:(NSObject<FlutterPluginRegistrar> *)registrar {
@@ -119,7 +118,7 @@
if (self) {
_methodChannel = methodChannel;
_mapView = mapView;
- _polylineIdToController = [NSMutableDictionary dictionaryWithCapacity:1];
+ _polylineIdentifierToController = [NSMutableDictionary dictionaryWithCapacity:1];
_registrar = registrar;
}
return self;
@@ -127,64 +126,59 @@
- (void)addPolylines:(NSArray *)polylinesToAdd {
for (NSDictionary *polyline in polylinesToAdd) {
GMSMutablePath *path = [FLTPolylinesController getPath:polyline];
- NSString *polylineId = [FLTPolylinesController getPolylineId:polyline];
+ NSString *identifier = polyline[@"polylineId"];
FLTGoogleMapPolylineController *controller =
[[FLTGoogleMapPolylineController alloc] initPolylineWithPath:path
- polylineId:polylineId
- mapView:_mapView];
- InterpretPolylineOptions(polyline, controller, _registrar);
- _polylineIdToController[polylineId] = controller;
+ identifier:identifier
+ mapView:self.mapView];
+ [controller interpretPolylineOptions:polyline registrar:self.registrar];
+ self.polylineIdentifierToController[identifier] = controller;
}
}
- (void)changePolylines:(NSArray *)polylinesToChange {
for (NSDictionary *polyline in polylinesToChange) {
- NSString *polylineId = [FLTPolylinesController getPolylineId:polyline];
- FLTGoogleMapPolylineController *controller = _polylineIdToController[polylineId];
+ NSString *identifier = polyline[@"polylineId"];
+ FLTGoogleMapPolylineController *controller = self.polylineIdentifierToController[identifier];
if (!controller) {
continue;
}
- InterpretPolylineOptions(polyline, controller, _registrar);
+ [controller interpretPolylineOptions:polyline registrar:self.registrar];
}
}
-- (void)removePolylineIds:(NSArray *)polylineIdsToRemove {
- for (NSString *polylineId in polylineIdsToRemove) {
- if (!polylineId) {
- continue;
- }
- FLTGoogleMapPolylineController *controller = _polylineIdToController[polylineId];
+- (void)removePolylineWithIdentifiers:(NSArray *)identifiers {
+ for (NSString *identifier in identifiers) {
+ FLTGoogleMapPolylineController *controller = self.polylineIdentifierToController[identifier];
if (!controller) {
continue;
}
[controller removePolyline];
- [_polylineIdToController removeObjectForKey:polylineId];
+ [self.polylineIdentifierToController removeObjectForKey:identifier];
}
}
-- (void)onPolylineTap:(NSString *)polylineId {
- if (!polylineId) {
+- (void)didTapPolylineWithIdentifier:(NSString *)identifier {
+ if (!identifier) {
return;
}
- FLTGoogleMapPolylineController *controller = _polylineIdToController[polylineId];
+ FLTGoogleMapPolylineController *controller = self.polylineIdentifierToController[identifier];
if (!controller) {
return;
}
- [_methodChannel invokeMethod:@"polyline#onTap" arguments:@{@"polylineId" : polylineId}];
+ [self.methodChannel invokeMethod:@"polyline#onTap" arguments:@{@"polylineId" : identifier}];
}
-- (bool)hasPolylineWithId:(NSString *)polylineId {
- if (!polylineId) {
+- (bool)hasPolylineWithIdentifier:(NSString *)identifier {
+ if (!identifier) {
return false;
}
- return _polylineIdToController[polylineId] != nil;
+ return self.polylineIdentifierToController[identifier] != nil;
}
+ (GMSMutablePath *)getPath:(NSDictionary *)polyline {
NSArray *pointArray = polyline[@"points"];
- NSArray<CLLocation *> *points = ToPoints(pointArray);
+ NSArray<CLLocation *> *points = [FLTGoogleMapJSONConversions pointsFromLatLongs:pointArray];
GMSMutablePath *path = [GMSMutablePath path];
for (CLLocation *location in points) {
[path addCoordinate:location.coordinate];
}
return path;
}
-+ (NSString *)getPolylineId:(NSDictionary *)polyline {
- return polyline[@"polylineId"];
-}
+
@end
diff --git a/packages/google_maps_flutter/google_maps_flutter/ios/Classes/JsonConversions.h b/packages/google_maps_flutter/google_maps_flutter/ios/Classes/JsonConversions.h
deleted file mode 100644
index c0f673e..0000000
--- a/packages/google_maps_flutter/google_maps_flutter/ios/Classes/JsonConversions.h
+++ /dev/null
@@ -1,19 +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 <Flutter/Flutter.h>
-#import <GoogleMaps/GoogleMaps.h>
-
-@interface FLTGoogleMapJsonConversions : NSObject
-+ (bool)toBool:(NSNumber *)data;
-+ (int)toInt:(NSNumber *)data;
-+ (double)toDouble:(NSNumber *)data;
-+ (float)toFloat:(NSNumber *)data;
-+ (CLLocationCoordinate2D)toLocation:(NSArray *)data;
-+ (CGPoint)toPoint:(NSArray *)data;
-+ (NSArray *)positionToJson:(CLLocationCoordinate2D)position;
-+ (UIColor *)toColor:(NSNumber *)data;
-+ (NSArray<CLLocation *> *)toPoints:(NSArray *)data;
-+ (NSArray<NSArray<CLLocation *> *> *)toHoles:(NSArray *)data;
-@end
diff --git a/packages/google_maps_flutter/google_maps_flutter/ios/Classes/JsonConversions.m b/packages/google_maps_flutter/google_maps_flutter/ios/Classes/JsonConversions.m
deleted file mode 100644
index 0e88d47..0000000
--- a/packages/google_maps_flutter/google_maps_flutter/ios/Classes/JsonConversions.m
+++ /dev/null
@@ -1,71 +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 "JsonConversions.h"
-
-@implementation FLTGoogleMapJsonConversions
-
-+ (bool)toBool:(NSNumber *)data {
- return data.boolValue;
-}
-
-+ (int)toInt:(NSNumber *)data {
- return data.intValue;
-}
-
-+ (double)toDouble:(NSNumber *)data {
- return data.doubleValue;
-}
-
-+ (float)toFloat:(NSNumber *)data {
- return data.floatValue;
-}
-
-+ (CLLocationCoordinate2D)toLocation:(NSArray *)data {
- return CLLocationCoordinate2DMake([FLTGoogleMapJsonConversions toDouble:data[0]],
- [FLTGoogleMapJsonConversions toDouble:data[1]]);
-}
-
-+ (CGPoint)toPoint:(NSArray *)data {
- return CGPointMake([FLTGoogleMapJsonConversions toDouble:data[0]],
- [FLTGoogleMapJsonConversions toDouble:data[1]]);
-}
-
-+ (NSArray *)positionToJson:(CLLocationCoordinate2D)position {
- return @[ @(position.latitude), @(position.longitude) ];
-}
-
-+ (UIColor *)toColor:(NSNumber *)numberColor {
- unsigned long value = [numberColor unsignedLongValue];
- return [UIColor colorWithRed:((float)((value & 0xFF0000) >> 16)) / 255.0
- green:((float)((value & 0xFF00) >> 8)) / 255.0
- blue:((float)(value & 0xFF)) / 255.0
- alpha:((float)((value & 0xFF000000) >> 24)) / 255.0];
-}
-
-+ (NSArray<CLLocation *> *)toPoints:(NSArray *)data {
- NSMutableArray *points = [[NSMutableArray alloc] init];
- for (unsigned i = 0; i < [data count]; i++) {
- NSNumber *latitude = data[i][0];
- NSNumber *longitude = data[i][1];
- CLLocation *point =
- [[CLLocation alloc] initWithLatitude:[FLTGoogleMapJsonConversions toDouble:latitude]
- longitude:[FLTGoogleMapJsonConversions toDouble:longitude]];
- [points addObject:point];
- }
-
- return points;
-}
-
-+ (NSArray<NSArray<CLLocation *> *> *)toHoles:(NSArray *)data {
- NSMutableArray<NSArray<CLLocation *> *> *holes = [[[NSMutableArray alloc] init] init];
- for (unsigned i = 0; i < [data count]; i++) {
- NSArray<CLLocation *> *points = [FLTGoogleMapJsonConversions toPoints:data[i]];
- [holes addObject:points];
- }
-
- return holes;
-}
-
-@end
diff --git a/packages/google_maps_flutter/google_maps_flutter/ios/Classes/google_maps_flutter-umbrella.h b/packages/google_maps_flutter/google_maps_flutter/ios/Classes/google_maps_flutter-umbrella.h
index 50880a2..9969e71 100644
--- a/packages/google_maps_flutter/google_maps_flutter/ios/Classes/google_maps_flutter-umbrella.h
+++ b/packages/google_maps_flutter/google_maps_flutter/ios/Classes/google_maps_flutter-umbrella.h
@@ -3,9 +3,9 @@
// found in the LICENSE file.
#import <Foundation/Foundation.h>
+#import <google_maps_flutter/FLTGoogleMapJSONConversions.h>
#import <google_maps_flutter/FLTGoogleMapTileOverlayController.h>
#import <google_maps_flutter/FLTGoogleMapsPlugin.h>
-#import <google_maps_flutter/JsonConversions.h>
FOUNDATION_EXPORT double google_maps_flutterVersionNumber;
FOUNDATION_EXPORT const unsigned char google_maps_flutterVersionString[];
diff --git a/packages/google_maps_flutter/google_maps_flutter/pubspec.yaml b/packages/google_maps_flutter/google_maps_flutter/pubspec.yaml
index 59ee23d..215a930 100644
--- a/packages/google_maps_flutter/google_maps_flutter/pubspec.yaml
+++ b/packages/google_maps_flutter/google_maps_flutter/pubspec.yaml
@@ -2,7 +2,7 @@
description: A Flutter plugin for integrating Google Maps in iOS and Android applications.
repository: https://github.com/flutter/plugins/tree/main/packages/google_maps_flutter/google_maps_flutter
issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+maps%22
-version: 2.1.6
+version: 2.1.7
environment:
sdk: ">=2.14.0 <3.0.0"