Skip to content

Commit 9c02408

Browse files
committed
Android: Fix map border does not always receive click events
1 parent 1bd6a59 commit 9c02408

File tree

4 files changed

+40
-7
lines changed

4 files changed

+40
-7
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,3 +32,4 @@ See [metadata/en-US/changelogs](metadata/en-US/changelogs) for all changelogs.
3232
- Gtk: Show tracker controller buttons in map view
3333
- Lib: Fix infinite loop when parsing broken GPX-files (Issue #174)
3434
- Lib: Fix ignoring altitude precision when reading and displaying tracks
35+
- Android: Fix map border does not always receive click events

aat-android/src/main/kotlin/ch/bailu/aat/map/mapsforge/MapsForgeViewBase.kt

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
package ch.bailu.aat.map.mapsforge
22

33
import android.content.Context
4+
import android.view.GestureDetector
5+
import android.view.GestureDetector.SimpleOnGestureListener
6+
import android.view.MotionEvent
47
import android.view.View
58
import ch.bailu.aat.map.MapDensity
69
import ch.bailu.aat.preferences.Storage
@@ -14,6 +17,7 @@ import ch.bailu.aat_lib.map.layer.MapLayerInterface
1417
import ch.bailu.aat_lib.preferences.OnPreferencesChanged
1518
import ch.bailu.aat_lib.preferences.StorageInterface
1619
import ch.bailu.aat_lib.service.ServicesInterface
20+
import ch.bailu.aat_lib.util.Point
1721
import org.mapsforge.core.model.BoundingBox
1822
import org.mapsforge.core.model.Dimension
1923
import org.mapsforge.core.model.MapPosition
@@ -47,13 +51,27 @@ open class MapsForgeViewBase(
4751
storage = Storage(context)
4852
mapScaleBar.isVisible = false
4953
setBuiltInZoomControls(false)
54+
55+
// Mapsforge does only propagate click events that have latitude and longitude
56+
// but we are only interested in pixels (including those that are outside the visible map)
57+
setGestureDetector(GestureDetector(context, object : SimpleOnGestureListener() {
58+
override fun onSingleTapConfirmed(e: MotionEvent): Boolean {
59+
val point = Point(e.x, e.y)
60+
for (layer in layers) {
61+
if (layer.onTap(point)) {
62+
return true
63+
}
64+
}
65+
return false
66+
}
67+
} ))
5068
}
5169

5270
override fun onChange() {
5371
// Disable MapView.onChange to fix a speed bug in MapsForge
5472
}
5573

56-
override fun add(layer: MapLayerInterface) {
74+
final override fun add(layer: MapLayerInterface) {
5775
val wrapper: Layer = if (layer is Layer) {
5876
layer
5977
} else {

aat-gtk/src/main/kotlin/ch/bailu/aat_gtk/view/map/GtkCustomMapView.kt

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,9 @@ import ch.bailu.aat_lib.preferences.OnPreferencesChanged
2020
import ch.bailu.aat_lib.preferences.StorageInterface
2121
import ch.bailu.aat_lib.preferences.map.SolidTileSize
2222
import ch.bailu.aat_lib.util.Limit
23+
import ch.bailu.aat_lib.util.Point
2324
import ch.bailu.gtk.cairo.Context
25+
import ch.bailu.gtk.gtk.GestureClick
2426
import org.mapsforge.core.model.BoundingBox
2527
import org.mapsforge.core.model.Dimension
2628
import org.mapsforge.core.model.LatLong
@@ -80,10 +82,27 @@ open class GtkCustomMapView (
8082
}
8183
}
8284
})
85+
86+
// Mapsforge does only propagate click events that have latitude and longitude
87+
// but we are only interested in pixels (including those that are outside the visible map)
88+
drawingArea.addController(GestureClick().apply {
89+
var singleClick = false
90+
onPressed { i, _, _ -> singleClick = i == 1 }
91+
onStopped { singleClick = false }
92+
onReleased { i, x, y ->
93+
if (i == 1 && singleClick) {
94+
val point = Point(x, y)
95+
for (layer in layers) {
96+
if (layer.onTap(point)) {
97+
break
98+
}
99+
}
100+
}
101+
}
102+
})
83103
onAttached()
84104
}
85105

86-
87106
override fun frameBounding(boundingBox: BoundingBoxE6) {
88107
frameBounding(boundingBox.toBoundingBox())
89108
}

aat-lib/src/main/java/ch/bailu/aat_lib/map/layer/LayerWrapper.kt

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import ch.bailu.aat_lib.map.MapContext
44
import ch.bailu.aat_lib.service.ServicesInterface
55
import org.mapsforge.core.graphics.Canvas
66
import org.mapsforge.core.model.BoundingBox
7-
import org.mapsforge.core.model.LatLong
87
import org.mapsforge.core.model.Point
98
import org.mapsforge.core.model.Rotation
109
import org.mapsforge.map.layer.Layer
@@ -17,8 +16,4 @@ class LayerWrapper(
1716
override fun draw(bounding: BoundingBox, zoom: Byte, canvas: Canvas, topLeftPoint: Point, rotation: Rotation) {
1817
services.insideContext { layer.drawInside(mcontext) }
1918
}
20-
21-
override fun onTap(tapLatLong: LatLong, layerXY: Point?, tapXY: Point): Boolean {
22-
return layer.onTap(ch.bailu.aat_lib.util.Point(tapXY.x, tapXY.y))
23-
}
2419
}

0 commit comments

Comments
 (0)