Skip to content

Commit 4063b20

Browse files
[google_maps_flutter] Convert Obj-C->Dart calls to Pigeon (flutter#7086)
Converts all of the Obj-C->Dart calls from raw method channels to Pigeon. This finishes conversion of all of the invocations in `google_maps_flutter_ios` This is the iOS equivalent of flutter/packages#7040, and much of the Dart code is based on that PR. Part of flutter#117907
1 parent 1faccfe commit 4063b20

24 files changed

+1682
-418
lines changed

packages/google_maps_flutter/google_maps_flutter_ios/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
## 2.10.0
2+
3+
* Converts Obj-C->Dart calls to Pigeon.
4+
15
## 2.9.0
26

37
* Converts additional platform calls to Pigeon.

packages/google_maps_flutter/google_maps_flutter_ios/example/ios14/ios/RunnerTests/FLTGoogleMapJSONConversionsConversionTests.m

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -98,19 +98,19 @@ - (void)testHolesFromPointsArray {
9898
XCTAssertEqual(holes[1][1].coordinate.longitude, 8);
9999
}
100100

101-
- (void)testDictionaryFromPosition {
102-
id mockPosition = OCMClassMock([GMSCameraPosition class]);
103-
NSValue *locationValue = [NSValue valueWithMKCoordinate:CLLocationCoordinate2DMake(1, 2)];
104-
[(GMSCameraPosition *)[[mockPosition stub] andReturnValue:locationValue] target];
105-
[[[mockPosition stub] andReturnValue:@(2.0)] zoom];
106-
[[[mockPosition stub] andReturnValue:@(3.0)] bearing];
107-
[[[mockPosition stub] andReturnValue:@(75.0)] viewingAngle];
108-
NSDictionary *dictionary = [FLTGoogleMapJSONConversions dictionaryFromPosition:mockPosition];
109-
NSArray *targetArray = @[ @1, @2 ];
110-
XCTAssertEqualObjects(dictionary[@"target"], targetArray);
111-
XCTAssertEqualObjects(dictionary[@"zoom"], @2.0);
112-
XCTAssertEqualObjects(dictionary[@"bearing"], @3.0);
113-
XCTAssertEqualObjects(dictionary[@"tilt"], @75.0);
101+
- (void)testGetPigeonCameraPositionForPosition {
102+
GMSCameraPosition *position =
103+
[[GMSCameraPosition alloc] initWithTarget:CLLocationCoordinate2DMake(1, 2)
104+
zoom:2.0
105+
bearing:3.0
106+
viewingAngle:75.0];
107+
FGMPlatformCameraPosition *pigeonPosition = FGMGetPigeonCameraPositionForPosition(position);
108+
XCTAssertEqualWithAccuracy(pigeonPosition.target.latitude, position.target.latitude, DBL_EPSILON);
109+
XCTAssertEqualWithAccuracy(pigeonPosition.target.longitude, position.target.longitude,
110+
DBL_EPSILON);
111+
XCTAssertEqualWithAccuracy(pigeonPosition.zoom, position.zoom, DBL_EPSILON);
112+
XCTAssertEqualWithAccuracy(pigeonPosition.bearing, position.bearing, DBL_EPSILON);
113+
XCTAssertEqualWithAccuracy(pigeonPosition.tilt, position.viewingAngle, DBL_EPSILON);
114114
}
115115

116116
- (void)testPigeonPointForGCPoint {

packages/google_maps_flutter/google_maps_flutter_ios/example/ios14/ios/RunnerTests/FLTTileProviderControllerTests.m

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,24 @@
88

99
#import <OCMock/OCMock.h>
1010

11+
#import "messages.g.h"
12+
1113
@interface FLTTileProviderControllerTests : XCTestCase
1214
@end
1315

1416
@implementation FLTTileProviderControllerTests
1517

1618
- (void)testCallChannelOnPlatformThread {
17-
id channel = OCMClassMock(FlutterMethodChannel.class);
18-
FLTTileProviderController *controller = [[FLTTileProviderController alloc] init:channel
19-
withTileOverlayIdentifier:@"foo"];
19+
id handler = OCMClassMock([FGMMapsCallbackApi class]);
20+
FLTTileProviderController *controller =
21+
[[FLTTileProviderController alloc] initWithTileOverlayIdentifier:@"foo"
22+
callbackHandler:handler];
2023
XCTAssertNotNil(controller);
2124
XCTestExpectation *expectation = [self expectationWithDescription:@"invokeMethod"];
22-
OCMStub([channel invokeMethod:[OCMArg any] arguments:[OCMArg any] result:[OCMArg any]])
25+
OCMStub([handler tileWithOverlayIdentifier:[OCMArg any]
26+
location:[OCMArg any]
27+
zoom:0
28+
completion:[OCMArg any]])
2329
.andDo(^(NSInvocation *invocation) {
2430
XCTAssertTrue([[NSThread currentThread] isMainThread]);
2531
[expectation fulfill];

packages/google_maps_flutter/google_maps_flutter_ios/example/ios14/ios/RunnerTests/GoogleMapsPolylinesControllerTests.m

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,9 @@ - (FLTGoogleMapPolylineController *)polylineControllerWithMockedMap {
4141
NSString *identifier = polyline[@"polylineId"];
4242

4343
FLTGoogleMapPolylineController *polylineControllerWithMockedMap =
44-
[[FLTGoogleMapPolylineController alloc] initPolylineWithPath:path
45-
identifier:identifier
46-
mapView:mapView];
44+
[[FLTGoogleMapPolylineController alloc] initWithPath:path
45+
identifier:identifier
46+
mapView:mapView];
4747

4848
return polylineControllerWithMockedMap;
4949
}

packages/google_maps_flutter/google_maps_flutter_ios/ios/Classes/FLTGoogleMapJSONConversions.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,10 @@ extern FGMPlatformLatLng *FGMGetPigeonLatLngForCoordinate(CLLocationCoordinate2D
2828
extern FGMPlatformLatLngBounds *FGMGetPigeonLatLngBoundsForCoordinateBounds(
2929
GMSCoordinateBounds *bounds);
3030

31+
/// Converts a GMSCameraPosition to its Pigeon representation.
32+
extern FGMPlatformCameraPosition *FGMGetPigeonCameraPositionForPosition(
33+
GMSCameraPosition *position);
34+
3135
@interface FLTGoogleMapJSONConversions : NSObject
3236

3337
+ (CLLocationCoordinate2D)locationFromLatLong:(NSArray *)latlong;
@@ -36,8 +40,6 @@ extern FGMPlatformLatLngBounds *FGMGetPigeonLatLngBoundsForCoordinateBounds(
3640
+ (UIColor *)colorFromRGBA:(NSNumber *)data;
3741
+ (NSArray<CLLocation *> *)pointsFromLatLongs:(NSArray *)data;
3842
+ (NSArray<NSArray<CLLocation *> *> *)holesFromPointsArray:(NSArray *)data;
39-
+ (nullable NSDictionary<NSString *, id> *)dictionaryFromPosition:
40-
(nullable GMSCameraPosition *)position;
4143
+ (nullable GMSCameraPosition *)cameraPostionFromDictionary:(nullable NSDictionary *)channelValue;
4244
+ (GMSCoordinateBounds *)coordinateBoundsFromLatLongs:(NSArray *)latlongs;
4345
+ (GMSMapViewType)mapViewTypeFromTypeValue:(NSNumber *)value;

packages/google_maps_flutter/google_maps_flutter_ios/ios/Classes/FLTGoogleMapJSONConversions.m

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,13 @@ CLLocationCoordinate2D FGMGetCoordinateForPigeonLatLng(FGMPlatformLatLng *latLng
3232
southwest:FGMGetPigeonLatLngForCoordinate(bounds.southWest)];
3333
}
3434

35+
FGMPlatformCameraPosition *FGMGetPigeonCameraPositionForPosition(GMSCameraPosition *position) {
36+
return [FGMPlatformCameraPosition makeWithBearing:position.bearing
37+
target:FGMGetPigeonLatLngForCoordinate(position.target)
38+
tilt:position.viewingAngle
39+
zoom:position.zoom];
40+
}
41+
3542
@implementation FLTGoogleMapJSONConversions
3643

3744
+ (CLLocationCoordinate2D)locationFromLatLong:(NSArray *)latlong {
@@ -77,18 +84,6 @@ + (UIColor *)colorFromRGBA:(NSNumber *)numberColor {
7784
return holes;
7885
}
7986

80-
+ (nullable NSDictionary<NSString *, id> *)dictionaryFromPosition:(GMSCameraPosition *)position {
81-
if (!position) {
82-
return nil;
83-
}
84-
return @{
85-
@"target" : [FLTGoogleMapJSONConversions arrayFromLocation:[position target]],
86-
@"zoom" : @([position zoom]),
87-
@"bearing" : @([position bearing]),
88-
@"tilt" : @([position viewingAngle]),
89-
};
90-
}
91-
9287
+ (nullable GMSCameraPosition *)cameraPostionFromDictionary:(nullable NSDictionary *)data {
9388
if (!data) {
9489
return nil;

packages/google_maps_flutter/google_maps_flutter_ios/ios/Classes/FLTGoogleMapTileOverlayController.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,14 @@ NS_ASSUME_NONNULL_BEGIN
2222

2323
@interface FLTTileProviderController : GMSTileLayer
2424
@property(copy, nonatomic, readonly) NSString *tileOverlayIdentifier;
25-
- (instancetype)init:(FlutterMethodChannel *)methodChannel
26-
withTileOverlayIdentifier:(NSString *)identifier;
25+
- (instancetype)initWithTileOverlayIdentifier:(NSString *)identifier
26+
callbackHandler:(FGMMapsCallbackApi *)callbackHandler;
2727
@end
2828

2929
@interface FLTTileOverlaysController : NSObject
30-
- (instancetype)init:(FlutterMethodChannel *)methodChannel
31-
mapView:(GMSMapView *)mapView
32-
registrar:(NSObject<FlutterPluginRegistrar> *)registrar;
30+
- (instancetype)initWithMapView:(GMSMapView *)mapView
31+
callbackHandler:(FGMMapsCallbackApi *)callbackHandler
32+
registrar:(NSObject<FlutterPluginRegistrar> *)registrar;
3333
- (void)addJSONTileOverlays:(NSArray<NSDictionary<NSString *, id> *> *)tileOverlaysToAdd;
3434
- (void)addTileOverlays:(NSArray<FGMPlatformTileOverlay *> *)tileOverlaysToAdd;
3535
- (void)changeTileOverlays:(NSArray<FGMPlatformTileOverlay *> *)tileOverlaysToChange;

packages/google_maps_flutter/google_maps_flutter_ios/ios/Classes/FLTGoogleMapTileOverlayController.m

Lines changed: 30 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -89,17 +89,17 @@ - (void)interpretTileOverlayOptions:(NSDictionary *)data {
8989

9090
@interface FLTTileProviderController ()
9191

92-
@property(strong, nonatomic) FlutterMethodChannel *methodChannel;
92+
@property(strong, nonatomic) FGMMapsCallbackApi *callbackHandler;
9393

9494
@end
9595

9696
@implementation FLTTileProviderController
9797

98-
- (instancetype)init:(FlutterMethodChannel *)methodChannel
99-
withTileOverlayIdentifier:(NSString *)identifier {
98+
- (instancetype)initWithTileOverlayIdentifier:(NSString *)identifier
99+
callbackHandler:(FGMMapsCallbackApi *)callbackHandler {
100100
self = [super init];
101101
if (self) {
102-
_methodChannel = methodChannel;
102+
_callbackHandler = callbackHandler;
103103
_tileOverlayIdentifier = identifier;
104104
}
105105
return self;
@@ -135,35 +135,23 @@ - (void)requestTileForX:(NSUInteger)x
135135
zoom:(NSUInteger)zoom
136136
receiver:(id<GMSTileReceiver>)receiver {
137137
dispatch_async(dispatch_get_main_queue(), ^{
138-
[self.methodChannel invokeMethod:@"tileOverlay#getTile"
139-
arguments:@{
140-
@"tileOverlayId" : self.tileOverlayIdentifier,
141-
@"x" : @(x),
142-
@"y" : @(y),
143-
@"zoom" : @(zoom)
144-
}
145-
result:^(id _Nullable result) {
146-
UIImage *tileImage;
147-
if ([result isKindOfClass:[NSDictionary class]]) {
148-
FlutterStandardTypedData *typedData = (FlutterStandardTypedData *)result[@"data"];
149-
if (typedData == nil) {
150-
tileImage = kGMSTileLayerNoTile;
151-
} else {
152-
tileImage = [self handleResultTile:[UIImage imageWithData:typedData.data]];
153-
}
154-
} else {
155-
if ([result isKindOfClass:[FlutterError class]]) {
156-
FlutterError *error = (FlutterError *)result;
157-
NSLog(@"Can't get tile: errorCode = %@, errorMessage = %@, details = %@",
158-
[error code], [error message], [error details]);
159-
}
160-
if ([result isKindOfClass:[FlutterMethodNotImplemented class]]) {
161-
NSLog(@"Can't get tile: notImplemented");
162-
}
163-
tileImage = kGMSTileLayerNoTile;
164-
}
165-
[receiver receiveTileWithX:x y:y zoom:zoom image:tileImage];
166-
}];
138+
[self.callbackHandler
139+
tileWithOverlayIdentifier:self.tileOverlayIdentifier
140+
location:[FGMPlatformPoint makeWithX:x y:y]
141+
zoom:zoom
142+
completion:^(FGMPlatformTile *_Nullable tile,
143+
FlutterError *_Nullable error) {
144+
FlutterStandardTypedData *typedData = tile.data;
145+
UIImage *tileImage =
146+
typedData
147+
? [self handleResultTile:[UIImage imageWithData:typedData.data]]
148+
: kGMSTileLayerNoTile;
149+
if (error) {
150+
NSLog(@"Can't get tile: errorCode = %@, errorMessage = %@, details = %@",
151+
[error code], [error message], [error details]);
152+
}
153+
[receiver receiveTileWithX:x y:y zoom:zoom image:tileImage];
154+
}];
167155
});
168156
}
169157

@@ -173,19 +161,19 @@ @interface FLTTileOverlaysController ()
173161

174162
@property(strong, nonatomic) NSMutableDictionary<NSString *, FLTGoogleMapTileOverlayController *>
175163
*tileOverlayIdentifierToController;
176-
@property(strong, nonatomic) FlutterMethodChannel *methodChannel;
164+
@property(strong, nonatomic) FGMMapsCallbackApi *callbackHandler;
177165
@property(weak, nonatomic) GMSMapView *mapView;
178166

179167
@end
180168

181169
@implementation FLTTileOverlaysController
182170

183-
- (instancetype)init:(FlutterMethodChannel *)methodChannel
184-
mapView:(GMSMapView *)mapView
185-
registrar:(NSObject<FlutterPluginRegistrar> *)registrar {
171+
- (instancetype)initWithMapView:(GMSMapView *)mapView
172+
callbackHandler:(FGMMapsCallbackApi *)callbackHandler
173+
registrar:(NSObject<FlutterPluginRegistrar> *)registrar {
186174
self = [super init];
187175
if (self) {
188-
_methodChannel = methodChannel;
176+
_callbackHandler = callbackHandler;
189177
_mapView = mapView;
190178
_tileOverlayIdentifierToController = [[NSMutableDictionary alloc] init];
191179
}
@@ -196,8 +184,8 @@ - (void)addJSONTileOverlays:(NSArray<NSDictionary<NSString *, id> *> *)tileOverl
196184
for (NSDictionary<NSString *, id> *tileOverlay in tileOverlaysToAdd) {
197185
NSString *identifier = [FLTTileOverlaysController identifierForTileOverlay:tileOverlay];
198186
FLTTileProviderController *tileProvider =
199-
[[FLTTileProviderController alloc] init:self.methodChannel
200-
withTileOverlayIdentifier:identifier];
187+
[[FLTTileProviderController alloc] initWithTileOverlayIdentifier:identifier
188+
callbackHandler:self.callbackHandler];
201189
FLTGoogleMapTileOverlayController *controller =
202190
[[FLTGoogleMapTileOverlayController alloc] initWithTileLayer:tileProvider
203191
mapView:self.mapView
@@ -210,8 +198,8 @@ - (void)addTileOverlays:(NSArray<FGMPlatformTileOverlay *> *)tileOverlaysToAdd {
210198
for (FGMPlatformTileOverlay *tileOverlay in tileOverlaysToAdd) {
211199
NSString *identifier = [FLTTileOverlaysController identifierForTileOverlay:tileOverlay.json];
212200
FLTTileProviderController *tileProvider =
213-
[[FLTTileProviderController alloc] init:self.methodChannel
214-
withTileOverlayIdentifier:identifier];
201+
[[FLTTileProviderController alloc] initWithTileOverlayIdentifier:identifier
202+
callbackHandler:self.callbackHandler];
215203
FLTGoogleMapTileOverlayController *controller =
216204
[[FLTGoogleMapTileOverlayController alloc] initWithTileLayer:tileProvider
217205
mapView:self.mapView

packages/google_maps_flutter/google_maps_flutter_ios/ios/Classes/GoogleMapCircleController.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,9 @@
1818
@end
1919

2020
@interface FLTCirclesController : NSObject
21-
- (instancetype)init:(FlutterMethodChannel *)methodChannel
22-
mapView:(GMSMapView *)mapView
23-
registrar:(NSObject<FlutterPluginRegistrar> *)registrar;
21+
- (instancetype)initWithMapView:(GMSMapView *)mapView
22+
callbackHandler:(FGMMapsCallbackApi *)callbackHandler
23+
registrar:(NSObject<FlutterPluginRegistrar> *)registrar;
2424
- (void)addJSONCircles:(NSArray<NSDictionary<NSString *, id> *> *)circlesToAdd;
2525
- (void)addCircles:(NSArray<FGMPlatformCircle *> *)circlesToAdd;
2626
- (void)changeCircles:(NSArray<FGMPlatformCircle *> *)circlesToChange;

packages/google_maps_flutter/google_maps_flutter_ios/ios/Classes/GoogleMapCircleController.m

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -105,20 +105,20 @@ - (void)interpretCircleOptions:(NSDictionary *)data {
105105

106106
@interface FLTCirclesController ()
107107

108-
@property(strong, nonatomic) FlutterMethodChannel *methodChannel;
108+
@property(strong, nonatomic) FGMMapsCallbackApi *callbackHandler;
109109
@property(weak, nonatomic) GMSMapView *mapView;
110110
@property(strong, nonatomic) NSMutableDictionary *circleIdToController;
111111

112112
@end
113113

114114
@implementation FLTCirclesController
115115

116-
- (instancetype)init:(FlutterMethodChannel *)methodChannel
117-
mapView:(GMSMapView *)mapView
118-
registrar:(NSObject<FlutterPluginRegistrar> *)registrar {
116+
- (instancetype)initWithMapView:(GMSMapView *)mapView
117+
callbackHandler:(FGMMapsCallbackApi *)callbackHandler
118+
registrar:(NSObject<FlutterPluginRegistrar> *)registrar {
119119
self = [super init];
120120
if (self) {
121-
_methodChannel = methodChannel;
121+
_callbackHandler = callbackHandler;
122122
_mapView = mapView;
123123
_circleIdToController = [NSMutableDictionary dictionaryWithCapacity:1];
124124
}
@@ -189,7 +189,9 @@ - (void)didTapCircleWithIdentifier:(NSString *)identifier {
189189
if (!controller) {
190190
return;
191191
}
192-
[self.methodChannel invokeMethod:@"circle#onTap" arguments:@{@"circleId" : identifier}];
192+
[self.callbackHandler didTapCircleWithIdentifier:identifier
193+
completion:^(FlutterError *_Nullable _){
194+
}];
193195
}
194196

195197
+ (CLLocationCoordinate2D)getPosition:(NSDictionary *)circle {

0 commit comments

Comments
 (0)