@@ -4,30 +4,35 @@ import android.graphics.Color
44import androidx.annotation.ColorInt
55import com.kylecorry.andromeda.canvas.ICanvasDrawer
66import com.kylecorry.andromeda.core.units.PixelCoordinate
7+ import com.kylecorry.andromeda.geojson.GeoJsonFeature
8+ import com.kylecorry.andromeda.geojson.GeoJsonFeatureCollection
9+ import com.kylecorry.andromeda.geojson.GeoJsonPoint
710import com.kylecorry.sol.units.Coordinate
8- import com.kylecorry.trail_sense.tools.beacons.domain.Beacon
9- import com.kylecorry.trail_sense.tools.navigation.ui.MappablePath
10- import com.kylecorry.trail_sense.tools.beacons.map_layers.LegacyBeaconLayer
11+ import com.kylecorry.trail_sense.shared.extensions.lineString
12+ import com.kylecorry.trail_sense.shared.extensions.point
1113import com.kylecorry.trail_sense.shared.map_layers.ui.layers.ILayer
1214import com.kylecorry.trail_sense.shared.map_layers.ui.layers.IMapView
13- import com.kylecorry.trail_sense.tools.paths. map_layers.LegacyPathLayer
15+ import com.kylecorry.trail_sense.shared. map_layers.ui.layers.geojson.GeoJsonRenderer
1416import com.kylecorry.trail_sense.tools.paths.domain.LineStyle
1517
1618class MapDistanceLayer (private val onPathChanged : (points: List <Coordinate >) -> Unit = {}) :
1719 ILayer {
1820
19- private val pointLayer = LegacyBeaconLayer {
20- if (! isEnabled) {
21- return @LegacyBeaconLayer false
22- }
23- add(it.coordinate)
24- true
25- }
26- private val pathLayer = LegacyPathLayer ()
21+ private val renderer = GeoJsonRenderer ()
2722 private var points = mutableListOf<Coordinate >()
23+ private var pathColor = Color .BLACK
24+ private var outlineColor = Color .WHITE
2825
2926 init {
30- pathLayer.setShouldRenderWithDrawLines(true )
27+ renderer.setOnClickListener {
28+ val geometry = it.geometry
29+ if (geometry is GeoJsonPoint ) {
30+ geometry.point?.coordinate?.let { point -> add(point) }
31+ true
32+ } else {
33+ false
34+ }
35+ }
3136 }
3237
3338 var isEnabled = true
@@ -36,15 +41,14 @@ class MapDistanceLayer(private val onPathChanged: (points: List<Coordinate>) ->
3641 clear()
3742 }
3843
39- private var pathColor: Int = Color .BLACK
40-
4144 fun setPathColor (@ColorInt color : Int ) {
4245 pathColor = color
4346 updateLayers()
4447 }
4548
4649 fun setOutlineColor (@ColorInt color : Int ) {
47- pointLayer.setOutlineColor(color)
50+ outlineColor = color
51+ updateLayers()
4852 }
4953
5054 fun add (location : Coordinate ) {
@@ -78,36 +82,26 @@ class MapDistanceLayer(private val onPathChanged: (points: List<Coordinate>) ->
7882 if (! isEnabled) {
7983 return
8084 }
81-
82- pathLayer.draw(drawer, map)
83- pointLayer.draw(drawer, map)
85+ renderer.draw(drawer, map)
8486 }
8587
8688 override fun drawOverlay (
8789 drawer : ICanvasDrawer ,
8890 map : IMapView
8991 ) {
90- if (! isEnabled) {
91- return
92- }
93-
94- pathLayer.drawOverlay(drawer, map)
95- pointLayer.drawOverlay(drawer, map)
92+ // Do nothing
9693 }
9794
9895 override fun invalidate () {
99- pointLayer.invalidate()
100- pathLayer.invalidate()
96+ renderer.invalidate()
10197 }
10298
10399 override fun onClick (drawer : ICanvasDrawer , map : IMapView , pixel : PixelCoordinate ): Boolean {
104100 if (! isEnabled) {
105101 return false
106102 }
107103
108- val wasPointClicked = pointLayer.onClick(drawer, map, pixel)
109-
110- if (wasPointClicked) {
104+ if (renderer.onClick(drawer, map, pixel)) {
111105 return true
112106 }
113107
@@ -116,33 +110,35 @@ class MapDistanceLayer(private val onPathChanged: (points: List<Coordinate>) ->
116110 }
117111
118112 private fun updateLayers () {
119- pointLayer.setBeacons(getBeacons())
120- pathLayer.setPaths(listOf (getPath()))
121- }
113+ val features = mutableListOf<GeoJsonFeature >()
122114
123- private fun getPath (): MappablePath {
124- return MappablePath (
125- 0 ,
126- getBeacons(),
127- pathColor,
128- LineStyle .Solid
129- )
130- }
131-
132- private fun getBeacons (): List <Beacon > {
133- return points.mapIndexed { index, coordinate ->
134- Beacon (
135- index.toLong(),
136- " " ,
137- coordinate,
138- color = pathColor,
139- temporary = true
140- )
115+ if (points.isNotEmpty()) {
116+ // Path
117+ if (points.size > 1 ) {
118+ features.add(
119+ GeoJsonFeature .lineString(
120+ points,
121+ color = pathColor,
122+ lineStyle = LineStyle .Solid
123+ )
124+ )
125+ }
126+
127+ // Points
128+ points.forEach {
129+ features.add(
130+ GeoJsonFeature .point(
131+ it,
132+ color = pathColor,
133+ strokeColor = outlineColor,
134+ isClickable = true
135+ )
136+ )
137+ }
141138 }
142- }
143139
144- private var _percentOpacity : Float = 1f
140+ renderer.setGeoJsonObject(GeoJsonFeatureCollection (features))
141+ }
145142
146- override val percentOpacity: Float
147- get() = _percentOpacity
148- }
143+ override var percentOpacity: Float = 1f
144+ }
0 commit comments