Skip to content

Commit 0d4c912

Browse files
committed
- Added Waypoints to NavigationRoute; - RouteOptionsUpdater refactored;
1 parent 817b4fe commit 0d4c912

File tree

14 files changed

+698
-183
lines changed

14 files changed

+698
-183
lines changed

libnavigation-base/src/main/java/com/mapbox/navigation/base/internal/NativeRouteParserWrapper.kt

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,12 @@ interface SDKRouteParser {
1212
request: String,
1313
routerOrigin: RouterOrigin,
1414
): Expected<String, List<RouteInterface>>
15+
16+
fun parseDirectionsRoutes(
17+
directionsRoutes: String,
18+
request: String,
19+
routerOrigin: RouterOrigin,
20+
): Expected<String, List<RouteInterface>>
1521
}
1622

1723
object NativeRouteParserWrapper : SDKRouteParser {
@@ -23,4 +29,13 @@ object NativeRouteParserWrapper : SDKRouteParser {
2329
RouteParser.parseDirectionsResponse(
2430
response, request, routerOrigin.mapToNativeRouteOrigin()
2531
)
32+
33+
override fun parseDirectionsRoutes(
34+
directionsRoutes: String,
35+
request: String,
36+
routerOrigin: RouterOrigin,
37+
): Expected<String, List<RouteInterface>> =
38+
RouteParser.parseDirectionsRoutes(
39+
directionsRoutes, request, routerOrigin.mapToNativeRouteOrigin()
40+
)
2641
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
@file:JvmName("WaypointEx")
2+
3+
package com.mapbox.navigation.base.internal.extensions
4+
5+
import com.mapbox.api.directions.v5.models.DirectionsRoute
6+
import com.mapbox.navigation.base.internal.route.Waypoint
7+
import com.mapbox.navigation.base.trip.model.RouteProgress
8+
9+
/**
10+
* Return waypoints that are requested explicitly
11+
*/
12+
fun List<Waypoint>.requestedWaypoints(): List<Waypoint> =
13+
this.filter { it.type != Waypoint.EV_CHARGING }
14+
15+
/**
16+
* Return waypoints that tracking in [RouteProgress.currentLegProgress]#legIndex and based on
17+
* [DirectionsRoute.legs] index
18+
*/
19+
fun List<Waypoint>.legsWaypoints(): List<Waypoint> =
20+
this.filter { it.type != Waypoint.SILENT }
21+
22+
fun indexOfNextCoordinate(
23+
waypoints: List<Waypoint>, remainingWaypoints: Int
24+
): Int? {
25+
if (remainingWaypoints > waypoints.size) {
26+
return null
27+
}
28+
val nextRequestedWaypoint = waypoints
29+
.subList(waypoints.size - remainingWaypoints, waypoints.size)
30+
.requestedWaypoints()
31+
.firstOrNull()
32+
?: return null
33+
34+
return waypoints
35+
.requestedWaypoints()
36+
.indexOf(nextRequestedWaypoint)
37+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package com.mapbox.navigation.base.internal.route
2+
3+
import androidx.annotation.IntDef
4+
import com.mapbox.geojson.Point
5+
6+
data class Waypoint(
7+
val location: Point, @Type val type: Int, val name: String, val target: Point?,
8+
) {
9+
companion object {
10+
const val REGULAR = 1
11+
const val SILENT = 2
12+
const val EV_CHARGING = 3
13+
}
14+
15+
@Target(
16+
AnnotationTarget.PROPERTY,
17+
AnnotationTarget.VALUE_PARAMETER,
18+
AnnotationTarget.FUNCTION,
19+
AnnotationTarget.TYPE
20+
)
21+
@Retention(AnnotationRetention.BINARY)
22+
@IntDef(REGULAR, SILENT, EV_CHARGING)
23+
annotation class Type
24+
}
25+

libnavigation-base/src/main/java/com/mapbox/navigation/base/internal/utils/DirectionsRouteEx.kt

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ package com.mapbox.navigation.base.internal.utils
44

55
import com.mapbox.api.directions.v5.models.DirectionsRoute
66
import com.mapbox.api.directions.v5.models.LegStep
7+
import com.mapbox.navigation.base.internal.route.Waypoint
78
import com.mapbox.navigation.base.utils.ifNonNull
89

910
/**
@@ -36,3 +37,21 @@ private fun DirectionsRoute.stepsNamesAsString(): String? =
3637
?.joinToString { leg ->
3738
leg.steps()?.joinToString { step -> step.name() ?: "" } ?: ""
3839
}
40+
41+
internal fun List<com.mapbox.navigator.Waypoint>.mapToSkd(): List<Waypoint> =
42+
map { nativeWaypoint ->
43+
Waypoint(
44+
location = nativeWaypoint.location,
45+
type = nativeWaypoint.type.mapToSdk(),
46+
name = nativeWaypoint.name,
47+
target = nativeWaypoint.target,
48+
)
49+
}
50+
51+
@Waypoint.Type
52+
private fun com.mapbox.navigator.WaypointType.mapToSdk(): Int =
53+
when (this) {
54+
com.mapbox.navigator.WaypointType.REGULAR -> Waypoint.REGULAR
55+
com.mapbox.navigator.WaypointType.SILENT -> Waypoint.SILENT
56+
com.mapbox.navigator.WaypointType.EV_CHARGING -> Waypoint.EV_CHARGING
57+
}

libnavigation-base/src/main/java/com/mapbox/navigation/base/internal/utils/RouterEx.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package com.mapbox.navigation.base.internal.utils
22

3+
import com.mapbox.navigation.base.internal.route.Waypoint
4+
import com.mapbox.navigation.base.route.NavigationRoute
35
import com.mapbox.navigator.RouterOrigin
46

57
fun RouterOrigin.mapToSdkRouteOrigin(): com.mapbox.navigation.base.route.RouterOrigin =
@@ -15,3 +17,5 @@ fun com.mapbox.navigation.base.route.RouterOrigin.mapToNativeRouteOrigin(): Rout
1517
com.mapbox.navigation.base.route.RouterOrigin.Onboard -> RouterOrigin.ONBOARD
1618
is com.mapbox.navigation.base.route.RouterOrigin.Custom -> RouterOrigin.CUSTOM
1719
}
20+
21+
fun NavigationRoute._waypoints(): List<Waypoint> = waypoints
Lines changed: 227 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,227 @@
1+
package com.mapbox.navigation.base.internal.extensions
2+
3+
import com.mapbox.navigation.base.internal.route.Waypoint
4+
import io.mockk.every
5+
import io.mockk.mockk
6+
import junit.framework.Assert.assertEquals
7+
import junit.framework.Assert.assertTrue
8+
import org.junit.Test
9+
import org.junit.runner.RunWith
10+
import org.junit.runners.Parameterized
11+
12+
class WaypointExTest {
13+
14+
@RunWith(Parameterized::class)
15+
class FilterTest(
16+
private val waypoints: List<Waypoint>,
17+
private val requestedWaypointsExpected: List<@Waypoint.Type Int>,
18+
private val legsWaypointsExpected: List<@Waypoint.Type Int>
19+
) {
20+
companion object {
21+
@JvmStatic
22+
@Parameterized.Parameters
23+
fun data() = listOf(
24+
arrayOf(
25+
provideWaypoints(Waypoint.REGULAR, Waypoint.SILENT, Waypoint.REGULAR),
26+
listOf(Waypoint.REGULAR, Waypoint.SILENT, Waypoint.REGULAR),
27+
listOf(Waypoint.REGULAR, Waypoint.REGULAR),
28+
),
29+
arrayOf(
30+
provideWaypoints(
31+
Waypoint.REGULAR,
32+
Waypoint.SILENT,
33+
Waypoint.EV_CHARGING,
34+
Waypoint.SILENT,
35+
Waypoint.REGULAR
36+
),
37+
listOf(Waypoint.REGULAR, Waypoint.SILENT, Waypoint.SILENT, Waypoint.REGULAR),
38+
listOf(Waypoint.REGULAR, Waypoint.EV_CHARGING, Waypoint.REGULAR),
39+
),
40+
arrayOf(
41+
provideWaypoints(
42+
Waypoint.REGULAR,
43+
Waypoint.EV_CHARGING,
44+
Waypoint.EV_CHARGING,
45+
Waypoint.EV_CHARGING,
46+
Waypoint.REGULAR
47+
),
48+
listOf(Waypoint.REGULAR, Waypoint.REGULAR),
49+
listOf(
50+
Waypoint.REGULAR,
51+
Waypoint.EV_CHARGING,
52+
Waypoint.EV_CHARGING,
53+
Waypoint.EV_CHARGING,
54+
Waypoint.REGULAR
55+
),
56+
),
57+
arrayOf(
58+
provideWaypoints(
59+
Waypoint.REGULAR,
60+
Waypoint.SILENT,
61+
Waypoint.REGULAR,
62+
Waypoint.REGULAR,
63+
Waypoint.EV_CHARGING,
64+
Waypoint.REGULAR
65+
),
66+
listOf(
67+
Waypoint.REGULAR,
68+
Waypoint.SILENT,
69+
Waypoint.REGULAR,
70+
Waypoint.REGULAR,
71+
Waypoint.REGULAR
72+
),
73+
listOf(
74+
Waypoint.REGULAR,
75+
Waypoint.REGULAR,
76+
Waypoint.REGULAR,
77+
Waypoint.EV_CHARGING,
78+
Waypoint.REGULAR
79+
),
80+
),
81+
)
82+
83+
fun checkWaypoints(
84+
expectedWaypoints: List<@Waypoint.Type Int>,
85+
modified: List<Waypoint>,
86+
original: List<Waypoint>,
87+
) {
88+
89+
assertEquals(expectedWaypoints.size, modified.size)
90+
var bufferIndex = -1
91+
modified.forEachIndexed { index, waypoint ->
92+
assertEquals(expectedWaypoints[index], waypoint.type)
93+
assertTrue(original.contains(waypoint))
94+
val idx = original.indexOf(waypoint)
95+
assertTrue(idx > bufferIndex)
96+
bufferIndex = idx
97+
}
98+
}
99+
}
100+
101+
@Test
102+
fun testCases() {
103+
checkWaypoints(requestedWaypointsExpected, waypoints.requestedWaypoints(), waypoints)
104+
checkWaypoints(legsWaypointsExpected, waypoints.legsWaypoints(), waypoints)
105+
}
106+
107+
}
108+
109+
@RunWith(Parameterized::class)
110+
class IndexOfNextCoordinateTest(
111+
private val testDescription: String,
112+
private val waypoints: List<Waypoint>,
113+
private val remainingWaypoints: Int,
114+
private val expectedIndex: Int?
115+
) {
116+
117+
companion object {
118+
@JvmStatic
119+
@Parameterized.Parameters(name = "{0}")
120+
fun data() = listOf(
121+
arrayOf(
122+
"Next index: 1 for 2 relevant waypoints and remaining waypoint 1",
123+
provideWaypoints(
124+
Waypoint.REGULAR, Waypoint.REGULAR
125+
),
126+
1,
127+
1,
128+
),
129+
arrayOf(
130+
"Next index: 1 for 3 relevant waypoints and remaining waypoint 2",
131+
provideWaypoints(
132+
Waypoint.REGULAR, Waypoint.SILENT, Waypoint.REGULAR
133+
),
134+
2,
135+
1,
136+
),
137+
arrayOf(
138+
"Next index: 2 for 3 relevant waypoints and remaining waypoint 1",
139+
provideWaypoints(
140+
Waypoint.REGULAR, Waypoint.SILENT, Waypoint.REGULAR
141+
),
142+
1,
143+
2,
144+
),
145+
arrayOf(
146+
"Next index: 3 for 4 relevant waypoints and remaining waypoint 1",
147+
provideWaypoints(
148+
Waypoint.REGULAR, Waypoint.SILENT, Waypoint.SILENT, Waypoint.REGULAR
149+
),
150+
1,
151+
3,
152+
),
153+
arrayOf(
154+
"Next index: 1 for 2 relevant waypoints (1 is EV) and remaining waypoint 2",
155+
provideWaypoints(
156+
Waypoint.REGULAR, Waypoint.EV_CHARGING, Waypoint.REGULAR
157+
),
158+
2,
159+
1,
160+
),
161+
arrayOf(
162+
"Next index: 1 for 3 relevant waypoints (2 is EV) and remaining waypoint 4",
163+
provideWaypoints(
164+
Waypoint.REGULAR,
165+
Waypoint.EV_CHARGING,
166+
Waypoint.SILENT,
167+
Waypoint.EV_CHARGING,
168+
Waypoint.REGULAR
169+
),
170+
4,
171+
1,
172+
),
173+
arrayOf(
174+
"Next index: 1 for 3 relevant waypoints (2 is EV) and remaining waypoint 2",
175+
provideWaypoints(
176+
Waypoint.REGULAR,
177+
Waypoint.EV_CHARGING,
178+
Waypoint.SILENT,
179+
Waypoint.EV_CHARGING,
180+
Waypoint.REGULAR
181+
),
182+
2,
183+
2,
184+
),
185+
arrayOf(
186+
"Next index: null for non-valid case - 3 relevant waypoints (2 is EV) and " +
187+
"remaining waypoint 7",
188+
provideWaypoints(
189+
Waypoint.REGULAR,
190+
Waypoint.EV_CHARGING,
191+
Waypoint.SILENT,
192+
Waypoint.EV_CHARGING,
193+
Waypoint.REGULAR
194+
),
195+
7,
196+
null,
197+
),
198+
arrayOf(
199+
"Next index: 0 for 3 relevant waypoints (2 is EV) and remaining waypoint 5",
200+
provideWaypoints(
201+
Waypoint.REGULAR,
202+
Waypoint.EV_CHARGING,
203+
Waypoint.SILENT,
204+
Waypoint.EV_CHARGING,
205+
Waypoint.REGULAR
206+
),
207+
5,
208+
0,
209+
),
210+
)
211+
}
212+
213+
@Test
214+
fun testCases() {
215+
assertEquals(
216+
testDescription,
217+
expectedIndex,
218+
indexOfNextCoordinate(waypoints, remainingWaypoints)
219+
)
220+
}
221+
}
222+
}
223+
224+
private fun provideWaypoints(@Waypoint.Type vararg waypointType: Int): List<Waypoint> =
225+
waypointType.map { mapToType ->
226+
mockk { every { type } returns mapToType }
227+
}

0 commit comments

Comments
 (0)