@@ -2,10 +2,6 @@ package com.mapbox.maps.mapbox_maps.annotation
2
2
3
3
import com.mapbox.maps.MapView
4
4
import com.mapbox.maps.mapbox_maps.pigeons.*
5
- import com.mapbox.maps.mapbox_maps.pigeons.OnCircleAnnotationClickListener
6
- import com.mapbox.maps.mapbox_maps.pigeons.OnPointAnnotationClickListener
7
- import com.mapbox.maps.mapbox_maps.pigeons.OnPolygonAnnotationClickListener
8
- import com.mapbox.maps.mapbox_maps.pigeons.OnPolylineAnnotationClickListener
9
5
import com.mapbox.maps.mapbox_maps.pigeons.PointAnnotation
10
6
import com.mapbox.maps.plugin.annotation.Annotation
11
7
import com.mapbox.maps.plugin.annotation.AnnotationConfig
@@ -18,22 +14,19 @@ import com.mapbox.maps.plugin.annotation.generated.PolylineAnnotation
18
14
import io.flutter.plugin.common.BinaryMessenger
19
15
import io.flutter.plugin.common.MethodCall
20
16
import io.flutter.plugin.common.MethodChannel
17
+ import kotlin.collections.set
21
18
22
19
class AnnotationController (
23
20
private val mapView : MapView ,
24
21
private val messenger : BinaryMessenger ,
25
22
private val channelSuffix : String
26
23
) : ControllerDelegate {
27
24
private val managerMap = mutableMapOf<String , AnnotationManager <* , * , * , * , * , * , * >>()
28
- private val streamSinkMap = mutableMapOf<String , PigeonEventSink < AnnotationInteractionContext > >()
25
+ private val streamSinkMap = mutableMapOf<String , InteractionEventsHandler >()
29
26
private val pointAnnotationController = PointAnnotationController (this )
30
27
private val circleAnnotationController = CircleAnnotationController (this )
31
28
private val polygonAnnotationController = PolygonAnnotationController (this )
32
29
private val polylineAnnotationController = PolylineAnnotationController (this )
33
- private var onPointAnnotationClickListener: OnPointAnnotationClickListener ? = null
34
- private var onPolygonAnnotationClickListener: OnPolygonAnnotationClickListener ? = null
35
- private var onPolylineAnnotationClickListener: OnPolylineAnnotationClickListener ? = null
36
- private var onCircleAnnotationClickListener: OnCircleAnnotationClickListener ? = null
37
30
private var index = 0
38
31
39
32
fun handleCreateManager (call : MethodCall , result : MethodChannel .Result ) {
@@ -50,7 +43,13 @@ class AnnotationController(
50
43
mapView.annotations.createCircleAnnotationManager(AnnotationConfig (belowLayerId, id, id)).apply {
51
44
this .addClickListener(
52
45
com.mapbox.maps.plugin.annotation.generated.OnCircleAnnotationClickListener { annotation ->
53
- onCircleAnnotationClickListener?.onCircleAnnotationClick(annotation.toFLTCircleAnnotation()) {}
46
+ sendTapEvent(id, annotation)
47
+ false
48
+ }
49
+ )
50
+ this .addLongClickListener(
51
+ OnCircleAnnotationLongClickListener { annotation ->
52
+ sendLongPressEvent(id, annotation)
54
53
false
55
54
}
56
55
)
@@ -74,7 +73,13 @@ class AnnotationController(
74
73
mapView.annotations.createPointAnnotationManager(AnnotationConfig (belowLayerId, id, id)).apply {
75
74
this .addClickListener(
76
75
com.mapbox.maps.plugin.annotation.generated.OnPointAnnotationClickListener { annotation ->
77
- onPointAnnotationClickListener?.onPointAnnotationClick(annotation.toFLTPointAnnotation()) {}
76
+ sendTapEvent(id, annotation)
77
+ false
78
+ }
79
+ )
80
+ this .addLongClickListener(
81
+ OnPointAnnotationLongClickListener { annotation ->
82
+ sendLongPressEvent(id, annotation)
78
83
false
79
84
}
80
85
)
@@ -98,7 +103,13 @@ class AnnotationController(
98
103
mapView.annotations.createPolygonAnnotationManager(AnnotationConfig (belowLayerId, id, id)).apply {
99
104
this .addClickListener(
100
105
com.mapbox.maps.plugin.annotation.generated.OnPolygonAnnotationClickListener { annotation ->
101
- onPolygonAnnotationClickListener?.onPolygonAnnotationClick(annotation.toFLTPolygonAnnotation()) {}
106
+ sendTapEvent(id, annotation)
107
+ false
108
+ }
109
+ )
110
+ this .addLongClickListener(
111
+ OnPolygonAnnotationLongClickListener { annotation ->
112
+ sendLongPressEvent(id, annotation)
102
113
false
103
114
}
104
115
)
@@ -122,7 +133,13 @@ class AnnotationController(
122
133
mapView.annotations.createPolylineAnnotationManager(AnnotationConfig (belowLayerId, id, id)).apply {
123
134
this .addClickListener(
124
135
com.mapbox.maps.plugin.annotation.generated.OnPolylineAnnotationClickListener { annotation ->
125
- onPolylineAnnotationClickListener?.onPolylineAnnotationClick(annotation.toFLTPolylineAnnotation()) {}
136
+ sendTapEvent(id, annotation)
137
+ false
138
+ }
139
+ )
140
+ this .addLongClickListener(
141
+ OnPolylineAnnotationLongClickListener { annotation ->
142
+ sendLongPressEvent(id, annotation)
126
143
false
127
144
}
128
145
)
@@ -147,23 +164,13 @@ class AnnotationController(
147
164
return
148
165
}
149
166
}
150
-
151
- val interactionEvents = object : AnnotationDragEventsStreamHandler () {
152
- override fun onListen (p0 : Any? , sink : PigeonEventSink <AnnotationInteractionContext >) {
153
- streamSinkMap[id] = sink
154
- }
155
-
156
- override fun onCancel (p0 : Any? ) {
157
- streamSinkMap.remove(id)
158
- }
159
- }
160
-
161
- AnnotationDragEventsStreamHandler .register(
167
+ managerMap[id] = manager
168
+ val eventsHandler = InteractionEventsHandler ()
169
+ eventsHandler.register(
162
170
messenger,
163
- interactionEvents, " $channelSuffix /$id "
171
+ " $channelSuffix /$id "
164
172
)
165
-
166
- managerMap[id] = manager
173
+ streamSinkMap[id] = eventsHandler
167
174
result.success(id)
168
175
}
169
176
@@ -176,10 +183,6 @@ class AnnotationController(
176
183
}
177
184
178
185
fun setup () {
179
- onPointAnnotationClickListener = OnPointAnnotationClickListener (messenger, channelSuffix)
180
- onCircleAnnotationClickListener = OnCircleAnnotationClickListener (messenger, channelSuffix)
181
- onPolygonAnnotationClickListener = OnPolygonAnnotationClickListener (messenger, channelSuffix)
182
- onPolylineAnnotationClickListener = OnPolylineAnnotationClickListener (messenger, channelSuffix)
183
186
_PointAnnotationMessenger .setUp(messenger, pointAnnotationController, channelSuffix)
184
187
_CircleAnnotationMessenger .setUp(
185
188
messenger,
@@ -200,10 +203,6 @@ class AnnotationController(
200
203
_CircleAnnotationMessenger .setUp(messenger, null , channelSuffix)
201
204
_PolylineAnnotationMessenger .setUp(messenger, null , channelSuffix)
202
205
_PolygonAnnotationMessenger .setUp(messenger, null , channelSuffix)
203
- onPointAnnotationClickListener = null
204
- onCircleAnnotationClickListener = null
205
- onPolygonAnnotationClickListener = null
206
- onPolylineAnnotationClickListener = null
207
206
}
208
207
209
208
fun sendDragEvent (managerId : String , annotation : Annotation <* >, gestureState : GestureState ) {
@@ -219,7 +218,39 @@ class AnnotationController(
219
218
220
219
else -> throw IllegalArgumentException (" $annotation is unsupported" )
221
220
}
222
- streamSinkMap[managerId]?.success(context)
221
+ streamSinkMap[managerId]?.dragEventsSink?.success(context)
222
+ }
223
+
224
+ fun sendTapEvent (managerId : String , annotation : Annotation <* >) {
225
+ val context: AnnotationInteractionContext = when (annotation) {
226
+ is com.mapbox.maps.plugin.annotation.generated.PointAnnotation ->
227
+ PointAnnotationInteractionContext (annotation.toFLTPointAnnotation(), GestureState .ENDED )
228
+ is CircleAnnotation ->
229
+ CircleAnnotationInteractionContext (annotation.toFLTCircleAnnotation(), GestureState .ENDED )
230
+ is PolygonAnnotation ->
231
+ PolygonAnnotationInteractionContext (annotation.toFLTPolygonAnnotation(), GestureState .ENDED )
232
+ is PolylineAnnotation ->
233
+ PolylineAnnotationInteractionContext (annotation.toFLTPolylineAnnotation(), GestureState .ENDED )
234
+
235
+ else -> throw IllegalArgumentException (" $annotation is unsupported" )
236
+ }
237
+ streamSinkMap[managerId]?.tapEventsSink?.success(context)
238
+ }
239
+
240
+ fun sendLongPressEvent (managerId : String , annotation : Annotation <* >) {
241
+ val context: AnnotationInteractionContext = when (annotation) {
242
+ is com.mapbox.maps.plugin.annotation.generated.PointAnnotation ->
243
+ PointAnnotationInteractionContext (annotation.toFLTPointAnnotation(), GestureState .ENDED )
244
+ is CircleAnnotation ->
245
+ CircleAnnotationInteractionContext (annotation.toFLTCircleAnnotation(), GestureState .ENDED )
246
+ is PolygonAnnotation ->
247
+ PolygonAnnotationInteractionContext (annotation.toFLTPolygonAnnotation(), GestureState .ENDED )
248
+ is PolylineAnnotation ->
249
+ PolylineAnnotationInteractionContext (annotation.toFLTPolylineAnnotation(), GestureState .ENDED )
250
+
251
+ else -> throw IllegalArgumentException (" $annotation is unsupported" )
252
+ }
253
+ streamSinkMap[managerId]?.longPressEventsSink?.success(context)
223
254
}
224
255
225
256
override fun getManager (managerId : String ): AnnotationManager <* , * , * , * , * , * , * > {
@@ -228,4 +259,45 @@ class AnnotationController(
228
259
}
229
260
return managerMap[managerId]!!
230
261
}
262
+
263
+ companion object {
264
+ class InteractionEventsHandler {
265
+ var tapEventsSink: PigeonEventSink <AnnotationInteractionContext >? = null
266
+ var dragEventsSink: PigeonEventSink <AnnotationInteractionContext >? = null
267
+ var longPressEventsSink: PigeonEventSink <AnnotationInteractionContext >? = null
268
+
269
+ fun register (messenger : BinaryMessenger , channelName : String ) {
270
+ val tapEvents = object : AnnotationInteractionEventsStreamHandler () {
271
+ override fun onListen (p0 : Any? , sink : PigeonEventSink <AnnotationInteractionContext >) {
272
+ tapEventsSink = sink
273
+ }
274
+
275
+ override fun onCancel (p0 : Any? ) {
276
+ tapEventsSink = null
277
+ }
278
+ }
279
+ val longPressEvents = object : AnnotationInteractionEventsStreamHandler () {
280
+ override fun onListen (p0 : Any? , sink : PigeonEventSink <AnnotationInteractionContext >) {
281
+ longPressEventsSink = sink
282
+ }
283
+
284
+ override fun onCancel (p0 : Any? ) {
285
+ longPressEventsSink = null
286
+ }
287
+ }
288
+ val dragEvents = object : AnnotationInteractionEventsStreamHandler () {
289
+ override fun onListen (p0 : Any? , sink : PigeonEventSink <AnnotationInteractionContext >) {
290
+ dragEventsSink = sink
291
+ }
292
+
293
+ override fun onCancel (p0 : Any? ) {
294
+ dragEventsSink = null
295
+ }
296
+ }
297
+ AnnotationInteractionEventsStreamHandler .register(messenger, tapEvents, " $channelName /tap" )
298
+ AnnotationInteractionEventsStreamHandler .register(messenger, tapEvents, " $channelName /drag" )
299
+ AnnotationInteractionEventsStreamHandler .register(messenger, longPressEvents, " $channelName /long_press" )
300
+ }
301
+ }
302
+ }
231
303
}
0 commit comments