From 04ee730071f801b2728c47a1744804eb476519aa Mon Sep 17 00:00:00 2001 From: Fynn Godau Date: Fri, 27 Mar 2026 15:01:03 +0100 Subject: [PATCH] maps: click listeners on polylines and polygons --- .../gms/maps/mapbox/AbstractGoogleMap.kt | 6 ++-- .../org/microg/gms/maps/mapbox/GoogleMap.kt | 30 +++++++++++++++++++ .../microg/gms/maps/mapbox/model/Polygon.kt | 15 ++++++++++ .../microg/gms/maps/mapbox/model/Polyline.kt | 17 +++++++++++ 4 files changed, 66 insertions(+), 2 deletions(-) diff --git a/play-services-maps/core/mapbox/src/main/kotlin/org/microg/gms/maps/mapbox/AbstractGoogleMap.kt b/play-services-maps/core/mapbox/src/main/kotlin/org/microg/gms/maps/mapbox/AbstractGoogleMap.kt index 05f3b216f4..a6ac2e2f69 100644 --- a/play-services-maps/core/mapbox/src/main/kotlin/org/microg/gms/maps/mapbox/AbstractGoogleMap.kt +++ b/play-services-maps/core/mapbox/src/main/kotlin/org/microg/gms/maps/mapbox/AbstractGoogleMap.kt @@ -32,6 +32,8 @@ abstract class AbstractGoogleMap(context: Context) : IGoogleMapDelegate.Stub() { internal var mapLongClickListener: IOnMapLongClickListener? = null internal var markerClickListener: IOnMarkerClickListener? = null internal var circleClickListener: IOnCircleClickListener? = null + internal var polygonClickListener : IOnPolygonClickListener? = null + internal var polylineClickListener : IOnPolylineClickListener? = null internal var myLocationChangeListener: IOnMyLocationChangeListener? = null @@ -87,11 +89,11 @@ abstract class AbstractGoogleMap(context: Context) : IGoogleMapDelegate.Stub() { } override fun setOnPolygonClickListener(listener: IOnPolygonClickListener?) { - Log.d(TAG, "Not yet implemented: setOnPolygonClickListener") + polygonClickListener = listener } override fun setOnPolylineClickListener(listener: IOnPolylineClickListener?) { - Log.d(TAG, "Not yet implemented: setOnPolylineClickListener") + polylineClickListener = listener } override fun setOnGroundOverlayClickListener(listener: IOnGroundOverlayClickListener?) { diff --git a/play-services-maps/core/mapbox/src/main/kotlin/org/microg/gms/maps/mapbox/GoogleMap.kt b/play-services-maps/core/mapbox/src/main/kotlin/org/microg/gms/maps/mapbox/GoogleMap.kt index e542fb6a53..3d6f289323 100644 --- a/play-services-maps/core/mapbox/src/main/kotlin/org/microg/gms/maps/mapbox/GoogleMap.kt +++ b/play-services-maps/core/mapbox/src/main/kotlin/org/microg/gms/maps/mapbox/GoogleMap.kt @@ -101,10 +101,12 @@ class GoogleMapImpl(context: Context, var options: GoogleMapOptions) : AbstractG var lineManager: LineManager? = null val pendingLines = mutableSetOf>() + val lines = mutableMapOf() var lineId = 0L var fillManager: FillManager? = null val pendingFills = mutableSetOf>() + val polygons = mutableMapOf() val circles = mutableMapOf() var fillId = 0L @@ -760,6 +762,9 @@ class GoogleMapImpl(context: Context, var options: GoogleMapOptions) : AbstractG }) fillManager.addClickListener { fill -> try { + /* IDs are assigned consecutively across all types of fill, so no ID + * corresponds to both circle and polygon. + */ circles[fill.id]?.let { circle -> if (circle.isClickable) { circleClickListener?.let { @@ -768,6 +773,29 @@ class GoogleMapImpl(context: Context, var options: GoogleMapOptions) : AbstractG } } } + polygons[fill.id]?.let { polygon -> + if (polygon.isClickable) { + polygonClickListener?.let { + it.onPolygonClick(polygon) + return@addClickListener true + } + } + } + } catch (e: Exception) { + Log.w(TAG, e) + } + false + } + lineManager.addClickListener { line -> + try { + lines[line.id]?.let { polyline -> + if (polyline.isClickable) { + polylineClickListener?.let { + it.onPolylineClick(polyline) + return@addClickListener true + } + } + } } catch (e: Exception) { Log.w(TAG, e) } @@ -860,8 +888,10 @@ class GoogleMapImpl(context: Context, var options: GoogleMapOptions) : AbstractG userOnInitializedCallbackList.clear() lineManager?.onDestroy() lineManager = null + lines.clear() fillManager?.onDestroy() fillManager = null + polygons.clear() circles.clear() symbolManager?.onDestroy() symbolManager = null diff --git a/play-services-maps/core/mapbox/src/main/kotlin/org/microg/gms/maps/mapbox/model/Polygon.kt b/play-services-maps/core/mapbox/src/main/kotlin/org/microg/gms/maps/mapbox/model/Polygon.kt index c5c205ed23..24e5713347 100644 --- a/play-services-maps/core/mapbox/src/main/kotlin/org/microg/gms/maps/mapbox/model/Polygon.kt +++ b/play-services-maps/core/mapbox/src/main/kotlin/org/microg/gms/maps/mapbox/model/Polygon.kt @@ -15,6 +15,7 @@ import com.google.android.gms.maps.model.PatternItem import com.google.android.gms.maps.model.PolygonOptions import com.google.android.gms.maps.model.PolylineOptions import com.google.android.gms.maps.model.internal.IPolygonDelegate +import com.mapbox.mapboxsdk.plugins.annotation.AnnotationManager import com.mapbox.mapboxsdk.plugins.annotation.Fill import com.mapbox.mapboxsdk.plugins.annotation.FillOptions import com.mapbox.mapboxsdk.utils.ColorUtils @@ -226,6 +227,20 @@ class PolygonImpl(private val map: GoogleMapImpl, id: String, options: PolygonOp strokes.add(PolylineImpl(map, id, options)) } + override fun update(manager: AnnotationManager<*, Fill, FillOptions, *, *, *>) { + synchronized(this) { + val id = annotation?.id + if (removed && id != null) { + map.polygons.remove(id) + } + super.update(manager) + val annotation = annotation + if (annotation != null && id == null) { + map.polygons[annotation.id] = this + } + } + } + override fun onTransact(code: Int, data: Parcel, reply: Parcel?, flags: Int): Boolean = warnOnTransactionIssues(code, reply, flags) { super.onTransact(code, data, reply, flags) } companion object { diff --git a/play-services-maps/core/mapbox/src/main/kotlin/org/microg/gms/maps/mapbox/model/Polyline.kt b/play-services-maps/core/mapbox/src/main/kotlin/org/microg/gms/maps/mapbox/model/Polyline.kt index 4405c21c77..ee6df78178 100644 --- a/play-services-maps/core/mapbox/src/main/kotlin/org/microg/gms/maps/mapbox/model/Polyline.kt +++ b/play-services-maps/core/mapbox/src/main/kotlin/org/microg/gms/maps/mapbox/model/Polyline.kt @@ -12,6 +12,9 @@ import com.google.android.gms.maps.model.Cap import com.google.android.gms.maps.model.LatLng import com.google.android.gms.maps.model.PatternItem import com.google.android.gms.maps.model.internal.IPolylineDelegate +import com.mapbox.mapboxsdk.plugins.annotation.AnnotationManager +import com.mapbox.mapboxsdk.plugins.annotation.Fill +import com.mapbox.mapboxsdk.plugins.annotation.FillOptions import com.mapbox.mapboxsdk.plugins.annotation.Line import com.mapbox.mapboxsdk.plugins.annotation.LineOptions import com.mapbox.mapboxsdk.utils.ColorUtils @@ -169,6 +172,20 @@ class PolylineImpl(private val map: GoogleMapImpl, id: String, options: GmsLineO map.lineManager?.let { update(it) } } + override fun update(manager: AnnotationManager<*, Line, LineOptions, *, *, *>) { + synchronized(this) { + val id = annotation?.id + if (removed && id != null) { + map.lines.remove(id) + } + super.update(manager) + val annotation = annotation + if (annotation != null && id == null) { + map.lines[annotation.id] = this + } + } + } + companion object { private val TAG = "GmsMapPolyline" }