[google_maps_flutter] Adds long press / long click support to GoogleMap (#1575)

* Adds long press / long click support to GoogleMap

* Adds example for map tap and long press callbacks
diff --git a/packages/google_maps_flutter/CHANGELOG.md b/packages/google_maps_flutter/CHANGELOG.md
index 51d918a..0cda582 100644
--- a/packages/google_maps_flutter/CHANGELOG.md
+++ b/packages/google_maps_flutter/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 0.5.14
+
+* Adds onLongPress callback for GoogleMap.
+
 ## 0.5.13
 
 * Add support for Circle overlays.
diff --git a/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapController.java b/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapController.java
index f038bc4..338f33a 100644
--- a/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapController.java
+++ b/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapController.java
@@ -56,6 +56,7 @@
         MethodChannel.MethodCallHandler,
         OnMapReadyCallback,
         GoogleMap.OnMapClickListener,
+        GoogleMap.OnMapLongClickListener,
         PlatformView {
 
   private static final String TAG = "GoogleMapController";
@@ -171,6 +172,7 @@
     googleMap.setOnPolylineClickListener(this);
     googleMap.setOnCircleClickListener(this);
     googleMap.setOnMapClickListener(this);
+    googleMap.setOnMapLongClickListener(this);
     updateMyLocationSettings();
     markersController.setGoogleMap(googleMap);
     polylinesController.setGoogleMap(googleMap);
@@ -309,6 +311,13 @@
   }
 
   @Override
+  public void onMapLongClick(LatLng latLng) {
+    final Map<String, Object> arguments = new HashMap<>(2);
+    arguments.put("position", Convert.latLngToJson(latLng));
+    methodChannel.invokeMethod("map#onLongPress", arguments);
+  }
+
+  @Override
   public void onCameraMoveStarted(int reason) {
     final Map<String, Object> arguments = new HashMap<>(2);
     boolean isGesture = reason == GoogleMap.OnCameraMoveStartedListener.REASON_GESTURE;
diff --git a/packages/google_maps_flutter/example/lib/main.dart b/packages/google_maps_flutter/example/lib/main.dart
index 43a80d1..5a8d28c 100644
--- a/packages/google_maps_flutter/example/lib/main.dart
+++ b/packages/google_maps_flutter/example/lib/main.dart
@@ -4,6 +4,7 @@
 
 import 'package:flutter/material.dart';
 import 'animate_camera.dart';
+import 'map_click.dart';
 import 'map_coordinates.dart';
 import 'map_ui.dart';
 import 'marker_icons.dart';
@@ -17,6 +18,7 @@
 final List<Page> _allPages = <Page>[
   MapUiPage(),
   MapCoordinatesPage(),
+  MapClickPage(),
   AnimateCameraPage(),
   MoveCameraPage(),
   PlaceMarkerPage(),
diff --git a/packages/google_maps_flutter/example/lib/map_click.dart b/packages/google_maps_flutter/example/lib/map_click.dart
new file mode 100644
index 0000000..a73595d
--- /dev/null
+++ b/packages/google_maps_flutter/example/lib/map_click.dart
@@ -0,0 +1,90 @@
+// 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 'package:flutter/material.dart';
+import 'package:flutter/widgets.dart';
+import 'package:google_maps_flutter/google_maps_flutter.dart';
+import 'page.dart';
+
+const CameraPosition _kInitialPosition =
+    CameraPosition(target: LatLng(-33.852, 151.211), zoom: 11.0);
+
+class MapClickPage extends Page {
+  MapClickPage() : super(const Icon(Icons.mouse), 'Map click');
+
+  @override
+  Widget build(BuildContext context) {
+    return const _MapClickBody();
+  }
+}
+
+class _MapClickBody extends StatefulWidget {
+  const _MapClickBody();
+
+  @override
+  State<StatefulWidget> createState() => _MapClickBodyState();
+}
+
+class _MapClickBodyState extends State<_MapClickBody> {
+  _MapClickBodyState();
+
+  GoogleMapController mapController;
+  LatLng _lastTap;
+  LatLng _lastLongPress;
+
+  @override
+  Widget build(BuildContext context) {
+    final GoogleMap googleMap = GoogleMap(
+      onMapCreated: onMapCreated,
+      initialCameraPosition: _kInitialPosition,
+      onTap: (LatLng pos) {
+        setState(() {
+          _lastTap = pos;
+        });
+      },
+      onLongPress: (LatLng pos) {
+        setState(() {
+          _lastLongPress = pos;
+        });
+      },
+    );
+
+    final List<Widget> columnChildren = <Widget>[
+      Padding(
+        padding: const EdgeInsets.all(10.0),
+        child: Center(
+          child: SizedBox(
+            width: 300.0,
+            height: 200.0,
+            child: googleMap,
+          ),
+        ),
+      ),
+    ];
+
+    if (mapController != null) {
+      final String lastTap = 'Tap:\n${_lastTap ?? ""}\n';
+      final String lastLongPress = 'Long press:\n${_lastLongPress ?? ""}';
+      columnChildren
+          .add(Center(child: Text(lastTap, textAlign: TextAlign.center)));
+      columnChildren.add(Center(
+          child: Text(
+        lastLongPress,
+        textAlign: TextAlign.center,
+      )));
+    }
+
+    return Column(
+      mainAxisAlignment: MainAxisAlignment.start,
+      crossAxisAlignment: CrossAxisAlignment.stretch,
+      children: columnChildren,
+    );
+  }
+
+  void onMapCreated(GoogleMapController controller) async {
+    setState(() {
+      mapController = controller;
+    });
+  }
+}
diff --git a/packages/google_maps_flutter/ios/Classes/GoogleMapController.m b/packages/google_maps_flutter/ios/Classes/GoogleMapController.m
index 3041b48..5dd1d25 100644
--- a/packages/google_maps_flutter/ios/Classes/GoogleMapController.m
+++ b/packages/google_maps_flutter/ios/Classes/GoogleMapController.m
@@ -334,6 +334,10 @@
   [_channel invokeMethod:@"map#onTap" arguments:@{@"position" : LocationToJson(coordinate)}];
 }
 
+- (void)mapView:(GMSMapView*)mapView didLongPressAtCoordinate:(CLLocationCoordinate2D)coordinate {
+  [_channel invokeMethod:@"map#onLongPress" arguments:@{@"position" : LocationToJson(coordinate)}];
+}
+
 @end
 
 #pragma mark - Implementations of JSON conversion functions.
diff --git a/packages/google_maps_flutter/lib/src/controller.dart b/packages/google_maps_flutter/lib/src/controller.dart
index a8660e5..5cc4065 100644
--- a/packages/google_maps_flutter/lib/src/controller.dart
+++ b/packages/google_maps_flutter/lib/src/controller.dart
@@ -72,6 +72,10 @@
       case 'map#onTap':
         _googleMapState.onTap(LatLng._fromJson(call.arguments['position']));
         break;
+      case 'map#onLongPress':
+        _googleMapState
+            .onLongPress(LatLng._fromJson(call.arguments['position']));
+        break;
       default:
         throw MissingPluginException();
     }
diff --git a/packages/google_maps_flutter/lib/src/google_map.dart b/packages/google_maps_flutter/lib/src/google_map.dart
index fcbc00c..2a2562f 100644
--- a/packages/google_maps_flutter/lib/src/google_map.dart
+++ b/packages/google_maps_flutter/lib/src/google_map.dart
@@ -37,6 +37,7 @@
     this.onCameraMove,
     this.onCameraIdle,
     this.onTap,
+    this.onLongPress,
   })  : assert(initialCameraPosition != null),
         super(key: key);
 
@@ -104,6 +105,9 @@
   /// Called every time a [GoogleMap] is tapped.
   final ArgumentCallback<LatLng> onTap;
 
+  /// Called every time a [GoogleMap] is long pressed.
+  final ArgumentCallback<LatLng> onLongPress;
+
   /// True if a "My Location" layer should be shown on the map.
   ///
   /// This layer includes a location indicator at the current device location,
@@ -296,6 +300,13 @@
       widget.onTap(position);
     }
   }
+
+  void onLongPress(LatLng position) {
+    assert(position != null);
+    if (widget.onLongPress != null) {
+      widget.onLongPress(position);
+    }
+  }
 }
 
 /// Configuration options for the GoogleMaps user interface.
diff --git a/packages/google_maps_flutter/pubspec.yaml b/packages/google_maps_flutter/pubspec.yaml
index 40c4e4b..1238301 100644
--- a/packages/google_maps_flutter/pubspec.yaml
+++ b/packages/google_maps_flutter/pubspec.yaml
@@ -2,7 +2,7 @@
 description: A Flutter plugin for integrating Google Maps in iOS and Android applications.
 author: Flutter Team <flutter-dev@googlegroups.com>
 homepage: https://github.com/flutter/plugins/tree/master/packages/google_maps_flutter
-version: 0.5.13
+version: 0.5.14
 
 dependencies:
   flutter: