Skip to content

Commit 071775b

Browse files
authored
[google_maps_flutter] Add onPointOfInterestTap platform implementations (#12880)
## Summary - Platform implementations of `onPointOfInterestTap` for **Android**, **iOS** (`sdk9` / `sdk10` + shared source), and **web** - Depends on published `google_maps_flutter_platform_interface` 2.17.0 from #12752 - Federated implementations PR (per [Changing federated plugins](https://github.com/flutter/flutter/blob/master/docs/ecosystem/contributing/README.md#changing-federated-plugins)); app-facing package will follow in a separate PR **Notes** - Frozen `google_maps_flutter_ios` is intentionally unchanged (no new features per that package’s README); iOS support is in `google_maps_flutter_ios_sdk9` / `google_maps_flutter_ios_sdk10` - iOS DI follows the Swift controller conventions (required `callbackHandler` on the designated initializer) Supersedes the separate drafts #12881 (web) and #12882 (iOS). Part of #11872 / flutter/flutter#60695. ## Pre-Review Checklist
1 parent 431ea69 commit 071775b

55 files changed

Lines changed: 765 additions & 47 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎packages/google_maps_flutter/google_maps_flutter_android/CHANGELOG.md‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
## NEXT
1+
## 2.20.0
22

3+
* Adds support for tapping points of interest on the map.
34
* Updates minimum supported SDK version to Flutter 3.41/Dart 3.11.
45

56
## 2.19.13

‎packages/google_maps_flutter/google_maps_flutter_android/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapController.java‎

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
import com.google.android.gms.maps.model.MapCapabilities;
3939
import com.google.android.gms.maps.model.MapStyleOptions;
4040
import com.google.android.gms.maps.model.Marker;
41+
import com.google.android.gms.maps.model.PointOfInterest;
4142
import com.google.android.gms.maps.model.Polygon;
4243
import com.google.android.gms.maps.model.Polyline;
4344
import com.google.android.gms.maps.model.TileOverlay;
@@ -385,6 +386,14 @@ public void onCircleClick(Circle circle) {
385386
circlesController.onCircleTap(circle.getId());
386387
}
387388

389+
@Override
390+
public void onPoiClick(PointOfInterest pointOfInterest) {
391+
if (pointOfInterest.placeId != null) {
392+
flutterApi.onPointOfInterestTap(
393+
pointOfInterest.placeId, (Result<Unit> result) -> Unit.INSTANCE);
394+
}
395+
}
396+
388397
@Override
389398
public void onGroundOverlayClick(@NonNull GroundOverlay groundOverlay) {
390399
groundOverlaysController.onGroundOverlayTap(groundOverlay.getId());
@@ -421,6 +430,7 @@ private void setGoogleMapListener(@Nullable GoogleMapListener listener) {
421430
googleMap.setOnPolygonClickListener(listener);
422431
googleMap.setOnPolylineClickListener(listener);
423432
googleMap.setOnCircleClickListener(listener);
433+
googleMap.setOnPoiClickListener(listener);
424434
googleMap.setOnMapClickListener(listener);
425435
googleMap.setOnMapLongClickListener(listener);
426436
googleMap.setOnGroundOverlayClickListener(listener);

‎packages/google_maps_flutter/google_maps_flutter_android/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapListener.java‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ interface GoogleMapListener
1515
GoogleMap.OnPolygonClickListener,
1616
GoogleMap.OnPolylineClickListener,
1717
GoogleMap.OnCircleClickListener,
18+
GoogleMap.OnPoiClickListener,
1819
GoogleMap.OnMapClickListener,
1920
GoogleMap.OnMapLongClickListener,
2021
GoogleMap.OnMarkerDragListener,

‎packages/google_maps_flutter/google_maps_flutter_android/android/src/main/kotlin/io/flutter/plugins/googlemaps/Messages.kt‎

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4247,6 +4247,25 @@ class MapsCallbackApi(
42474247
}
42484248
}
42494249
}
4250+
/** Called when a point of interest is tapped. */
4251+
fun onPointOfInterestTap(placeIdArg: String, callback: (Result<Unit>) -> Unit) {
4252+
val separatedMessageChannelSuffix =
4253+
if (messageChannelSuffix.isNotEmpty()) ".$messageChannelSuffix" else ""
4254+
val channelName =
4255+
"dev.flutter.pigeon.google_maps_flutter_android.MapsCallbackApi.onPointOfInterestTap$separatedMessageChannelSuffix"
4256+
val channel = BasicMessageChannel<Any?>(binaryMessenger, channelName, codec)
4257+
channel.send(listOf(placeIdArg)) {
4258+
if (it is List<*>) {
4259+
if (it.size > 1) {
4260+
callback(Result.failure(FlutterError(it[0] as String, it[1] as String, it[2] as String?)))
4261+
} else {
4262+
callback(Result.success(Unit))
4263+
}
4264+
} else {
4265+
callback(Result.failure(MessagesPigeonUtils.createConnectionError(channelName)))
4266+
}
4267+
}
4268+
}
42504269
/** Called when a marker cluster is tapped. */
42514270
fun onClusterTap(clusterArg: PlatformCluster, callback: (Result<Unit>) -> Unit) {
42524271
val separatedMessageChannelSuffix =

‎packages/google_maps_flutter/google_maps_flutter_android/android/src/test/java/io/flutter/plugins/googlemaps/GoogleMapControllerTest.java‎

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import com.google.android.gms.maps.model.LatLng;
2828
import com.google.android.gms.maps.model.MapCapabilities;
2929
import com.google.android.gms.maps.model.Marker;
30+
import com.google.android.gms.maps.model.PointOfInterest;
3031
import com.google.maps.android.clustering.ClusterManager;
3132
import io.flutter.plugin.common.BinaryMessenger;
3233
import java.util.ArrayList;
@@ -258,6 +259,28 @@ public void OnClusterItemInfoWindowClickCallsMarkersController() {
258259
verify(mockMarkersController, times(1)).onClusterItemInfoWindowTap(markerBuilder.markerId());
259260
}
260261

262+
@Test
263+
public void OnPoiClickCallsFlutterApi() {
264+
GoogleMapController googleMapController = getGoogleMapControllerWithMockedDependencies();
265+
googleMapController.onMapReady(mockGoogleMap);
266+
267+
PointOfInterest pointOfInterest =
268+
new PointOfInterest(new LatLng(0, 0), "place-123", "Test Place");
269+
googleMapController.onPoiClick(pointOfInterest);
270+
271+
verify(flutterApi, times(1)).onPointOfInterestTap(eq("place-123"), any());
272+
}
273+
274+
@Test
275+
public void OnPoiClickNullPlaceIdDoesNotCallFlutterApi() {
276+
GoogleMapController googleMapController = getGoogleMapControllerWithMockedDependencies();
277+
googleMapController.onMapReady(mockGoogleMap);
278+
279+
googleMapController.onPoiClick(new PointOfInterest(new LatLng(0, 0), null, "Test Place"));
280+
281+
verify(flutterApi, times(0)).onPointOfInterestTap(any(), any());
282+
}
283+
261284
@Test
262285
public void SetInitialHeatmaps() {
263286
GoogleMapController googleMapController = getGoogleMapControllerWithMockedDependencies();

‎packages/google_maps_flutter/google_maps_flutter_android/example/pubspec.yaml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ dependencies:
1818
# The example app is bundled with the plugin so we use a path dependency on
1919
# the parent directory to use the current plugin's version.
2020
path: ../
21-
google_maps_flutter_platform_interface: ^2.13.0
21+
google_maps_flutter_platform_interface: ^2.17.0
2222

2323
dev_dependencies:
2424
build_runner: ^2.1.10

‎packages/google_maps_flutter/google_maps_flutter_android/example/test/fake_google_maps_flutter_platform.dart‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,11 @@ class FakeGoogleMapsFlutterPlatform extends GoogleMapsFlutterPlatform {
206206
return mapEventStreamController.stream.whereType<CircleTapEvent>();
207207
}
208208

209+
@override
210+
Stream<PointOfInterestTapEvent> onPointOfInterestTap({required int mapId}) {
211+
return mapEventStreamController.stream.whereType<PointOfInterestTapEvent>();
212+
}
213+
209214
@override
210215
Stream<GroundOverlayTapEvent> onGroundOverlayTap({required int mapId}) {
211216
return mapEventStreamController.stream.whereType<GroundOverlayTapEvent>();

‎packages/google_maps_flutter/google_maps_flutter_android/lib/src/google_maps_flutter_android.dart‎

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,11 @@ class GoogleMapsFlutterAndroid extends GoogleMapsFlutterPlatform {
205205
return _events(mapId).whereType<CircleTapEvent>();
206206
}
207207

208+
@override
209+
Stream<PointOfInterestTapEvent> onPointOfInterestTap({required int mapId}) {
210+
return _events(mapId).whereType<PointOfInterestTapEvent>();
211+
}
212+
208213
@override
209214
Stream<GroundOverlayTapEvent> onGroundOverlayTap({required int mapId}) {
210215
return _events(mapId).whereType<GroundOverlayTapEvent>();
@@ -1079,6 +1084,11 @@ class HostMapMessageHandler implements MapsCallbackApi {
10791084
streamController.add(CircleTapEvent(mapId, CircleId(circleId)));
10801085
}
10811086

1087+
@override
1088+
void onPointOfInterestTap(String placeId) {
1089+
streamController.add(PointOfInterestTapEvent(mapId, PointOfInterestId(placeId)));
1090+
}
1091+
10821092
@override
10831093
void onClusterTap(PlatformCluster cluster) {
10841094
streamController.add(

‎packages/google_maps_flutter/google_maps_flutter_android/lib/src/messages.g.dart‎

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3656,6 +3656,9 @@ abstract class MapsCallbackApi {
36563656
/// Called when a circle is tapped.
36573657
void onCircleTap(String circleId);
36583658

3659+
/// Called when a point of interest is tapped.
3660+
void onPointOfInterestTap(String placeId);
3661+
36593662
/// Called when a marker cluster is tapped.
36603663
void onClusterTap(PlatformCluster cluster);
36613664

@@ -3951,6 +3954,31 @@ abstract class MapsCallbackApi {
39513954
});
39523955
}
39533956
}
3957+
{
3958+
final pigeonVar_channel = BasicMessageChannel<Object?>(
3959+
'dev.flutter.pigeon.google_maps_flutter_android.MapsCallbackApi.onPointOfInterestTap$messageChannelSuffix',
3960+
pigeonChannelCodec,
3961+
binaryMessenger: binaryMessenger,
3962+
);
3963+
if (api == null) {
3964+
pigeonVar_channel.setMessageHandler(null);
3965+
} else {
3966+
pigeonVar_channel.setMessageHandler((Object? message) async {
3967+
final List<Object?> args = message! as List<Object?>;
3968+
final String arg_placeId = args[0]! as String;
3969+
try {
3970+
api.onPointOfInterestTap(arg_placeId);
3971+
return wrapResponse(empty: true);
3972+
} on PlatformException catch (e) {
3973+
return wrapResponse(error: e);
3974+
} catch (e) {
3975+
return wrapResponse(
3976+
error: PlatformException(code: 'error', message: e.toString()),
3977+
);
3978+
}
3979+
});
3980+
}
3981+
}
39543982
{
39553983
final pigeonVar_channel = BasicMessageChannel<Object?>(
39563984
'dev.flutter.pigeon.google_maps_flutter_android.MapsCallbackApi.onClusterTap$messageChannelSuffix',

‎packages/google_maps_flutter/google_maps_flutter_android/pigeons/messages.dart‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -831,6 +831,9 @@ abstract class MapsCallbackApi {
831831
/// Called when a circle is tapped.
832832
void onCircleTap(String circleId);
833833

834+
/// Called when a point of interest is tapped.
835+
void onPointOfInterestTap(String placeId);
836+
834837
/// Called when a marker cluster is tapped.
835838
void onClusterTap(PlatformCluster cluster);
836839

0 commit comments

Comments
 (0)