blob: 6688d4d57695f13a4dca328a8472c733ca34b732 [file] [log] [blame]
// Copyright 2019 The Chromium 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 "GoogleMapCircleController.h"
#import "JsonConversions.h"
@implementation FLTGoogleMapCircleController {
GMSCircle* _circle;
GMSMapView* _mapView;
}
- (instancetype)initCircleWithPosition:(CLLocationCoordinate2D)position
radius:(CLLocationDistance)radius
circleId:(NSString*)circleId
mapView:(GMSMapView*)mapView {
self = [super init];
if (self) {
_circle = [GMSCircle circleWithPosition:position radius:radius];
_mapView = mapView;
_circleId = circleId;
_circle.userData = @[ circleId ];
}
return self;
}
- (void)removeCircle {
_circle.map = nil;
}
#pragma mark - FLTGoogleMapCircleOptionsSink methods
- (void)setConsumeTapEvents:(BOOL)consumes {
_circle.tappable = consumes;
}
- (void)setVisible:(BOOL)visible {
_circle.map = visible ? _mapView : nil;
}
- (void)setZIndex:(int)zIndex {
_circle.zIndex = zIndex;
}
- (void)setCenter:(CLLocationCoordinate2D)center {
_circle.position = center;
}
- (void)setRadius:(CLLocationDistance)radius {
_circle.radius = radius;
}
- (void)setStrokeColor:(UIColor*)color {
_circle.strokeColor = color;
}
- (void)setStrokeWidth:(CGFloat)width {
_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];
}
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) {
NSNumber* consumeTapEvents = data[@"consumeTapEvents"];
if (consumeTapEvents != nil) {
[sink setConsumeTapEvents:ToBool(consumeTapEvents)];
}
NSNumber* visible = data[@"visible"];
if (visible != nil) {
[sink setVisible:ToBool(visible)];
}
NSNumber* zIndex = data[@"zIndex"];
if (zIndex != nil) {
[sink setZIndex:ToInt(zIndex)];
}
NSArray* center = data[@"center"];
if (center) {
[sink setCenter:ToLocation(center)];
}
NSNumber* radius = data[@"radius"];
if (radius != nil) {
[sink setRadius:ToDistance(radius)];
}
NSNumber* strokeColor = data[@"strokeColor"];
if (strokeColor != nil) {
[sink setStrokeColor:ToColor(strokeColor)];
}
NSNumber* strokeWidth = data[@"strokeWidth"];
if (strokeWidth != nil) {
[sink setStrokeWidth:ToInt(strokeWidth)];
}
NSNumber* fillColor = data[@"fillColor"];
if (fillColor != nil) {
[sink setFillColor:ToColor(fillColor)];
}
}
@implementation FLTCirclesController {
NSMutableDictionary* _circleIdToController;
FlutterMethodChannel* _methodChannel;
NSObject<FlutterPluginRegistrar>* _registrar;
GMSMapView* _mapView;
}
- (instancetype)init:(FlutterMethodChannel*)methodChannel
mapView:(GMSMapView*)mapView
registrar:(NSObject<FlutterPluginRegistrar>*)registrar {
self = [super init];
if (self) {
_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];
CLLocationDistance radius = [FLTCirclesController getRadius:circle];
NSString* circleId = [FLTCirclesController getCircleId:circle];
FLTGoogleMapCircleController* controller =
[[FLTGoogleMapCircleController alloc] initCircleWithPosition:position
radius:radius
circleId:circleId
mapView:_mapView];
InterpretCircleOptions(circle, controller, _registrar);
_circleIdToController[circleId] = controller;
}
}
- (void)changeCircles:(NSArray*)circlesToChange {
for (NSDictionary* circle in circlesToChange) {
NSString* circleId = [FLTCirclesController getCircleId:circle];
FLTGoogleMapCircleController* controller = _circleIdToController[circleId];
if (!controller) {
continue;
}
InterpretCircleOptions(circle, controller, _registrar);
}
}
- (void)removeCircleIds:(NSArray*)circleIdsToRemove {
for (NSString* circleId in circleIdsToRemove) {
if (!circleId) {
continue;
}
FLTGoogleMapCircleController* controller = _circleIdToController[circleId];
if (!controller) {
continue;
}
[controller removeCircle];
[_circleIdToController removeObjectForKey:circleId];
}
}
- (bool)hasCircleWithId:(NSString*)circleId {
if (!circleId) {
return false;
}
return _circleIdToController[circleId] != nil;
}
- (void)onCircleTap:(NSString*)circleId {
if (!circleId) {
return;
}
FLTGoogleMapCircleController* controller = _circleIdToController[circleId];
if (!controller) {
return;
}
[_methodChannel invokeMethod:@"circle#onTap" arguments:@{@"circleId" : circleId}];
}
+ (CLLocationCoordinate2D)getPosition:(NSDictionary*)circle {
NSArray* center = circle[@"center"];
return ToLocation(center);
}
+ (CLLocationDistance)getRadius:(NSDictionary*)circle {
NSNumber* radius = circle[@"radius"];
return ToDistance(radius);
}
+ (NSString*)getCircleId:(NSDictionary*)circle {
return circle[@"circleId"];
}
@end