Skip to content

Commit 579b48f

Browse files
committed
- Added Waypoints to NavigationRoute; - RouteOptionsUpdater refactored.
1 parent 8273101 commit 579b48f

File tree

18 files changed

+753
-297
lines changed

18 files changed

+753
-297
lines changed
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
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+
/**
23+
* Return the index of **next requested** coordinate.
24+
*
25+
* For instance, EV waypoints are not requested explicitly, so they are not taken into account.
26+
*/
27+
fun indexOfNextRequestedCoordinate(
28+
waypoints: List<Waypoint>,
29+
remainingWaypoints: Int,
30+
): Int? {
31+
if (remainingWaypoints > waypoints.size) {
32+
return null
33+
}
34+
val nextRequestedWaypoint = waypoints
35+
.subList(waypoints.size - remainingWaypoints, waypoints.size)
36+
.requestedWaypoints()
37+
.firstOrNull()
38+
?: return null
39+
40+
return waypoints
41+
.requestedWaypoints()
42+
.indexOf(nextRequestedWaypoint)
43+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
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,
8+
@Type val type: Int,
9+
val name: String,
10+
val target: Point?,
11+
) {
12+
companion object {
13+
const val REGULAR = 1
14+
const val SILENT = 2
15+
const val EV_CHARGING = 3
16+
}
17+
18+
@Target(
19+
AnnotationTarget.PROPERTY,
20+
AnnotationTarget.VALUE_PARAMETER,
21+
AnnotationTarget.FUNCTION,
22+
AnnotationTarget.TYPE
23+
)
24+
@Retention(AnnotationRetention.BINARY)
25+
@IntDef(REGULAR, SILENT, EV_CHARGING)
26+
annotation class Type
27+
}

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>.mapToSdk(): 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

libnavigation-base/src/main/java/com/mapbox/navigation/base/route/NavigationRoute.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,11 @@ import com.mapbox.navigation.base.internal.NativeRouteParserWrapper
1717
import com.mapbox.navigation.base.internal.SDKRouteParser
1818
import com.mapbox.navigation.base.internal.factory.RoadObjectFactory.toUpcomingRoadObjects
1919
import com.mapbox.navigation.base.internal.route.RouteCompatibilityCache
20+
import com.mapbox.navigation.base.internal.route.Waypoint
21+
import com.mapbox.navigation.base.internal.route.toNavigationRoute
2022
import com.mapbox.navigation.base.internal.utils.DirectionsRouteMissingConditionsCheck
2123
import com.mapbox.navigation.base.internal.utils.mapToSdkRouteOrigin
24+
import com.mapbox.navigation.base.internal.utils.mapToSdk
2225
import com.mapbox.navigation.base.trip.model.roadobject.UpcomingRoadObject
2326
import com.mapbox.navigation.utils.internal.ThreadController
2427
import com.mapbox.navigation.utils.internal.logD
@@ -293,6 +296,8 @@ class NavigationRoute internal constructor(
293296
*/
294297
val upcomingRoadObjects = nativeRoute.routeInfo.alerts.toUpcomingRoadObjects()
295298

299+
internal val waypoints: List<Waypoint> by lazy { nativeRoute.waypoints.mapToSdk() }
300+
296301
/**
297302
* Indicates whether some other object is "equal to" this one.
298303
*
Lines changed: 236 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,236 @@
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+
assertEquals(expectedWaypoints.size, modified.size)
89+
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+
@RunWith(Parameterized::class)
109+
class IndexOfNextCoordinateTest(
110+
private val testDescription: String,
111+
private val waypoints: List<Waypoint>,
112+
private val remainingWaypoints: Int,
113+
private val expectedIndex: Int?
114+
) {
115+
116+
companion object {
117+
@JvmStatic
118+
@Parameterized.Parameters(name = "{0}")
119+
fun data() = listOf(
120+
arrayOf(
121+
"Next index: 1 for 2 relevant waypoints and remaining waypoint 1",
122+
provideWaypoints(
123+
Waypoint.REGULAR,
124+
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,
133+
Waypoint.SILENT,
134+
Waypoint.REGULAR
135+
),
136+
2,
137+
1,
138+
),
139+
arrayOf(
140+
"Next index: 2 for 3 relevant waypoints and remaining waypoint 1",
141+
provideWaypoints(
142+
Waypoint.REGULAR,
143+
Waypoint.SILENT,
144+
Waypoint.REGULAR
145+
),
146+
1,
147+
2,
148+
),
149+
arrayOf(
150+
"Next index: 3 for 4 relevant waypoints and remaining waypoint 1",
151+
provideWaypoints(
152+
Waypoint.REGULAR,
153+
Waypoint.SILENT,
154+
Waypoint.SILENT,
155+
Waypoint.REGULAR
156+
),
157+
1,
158+
3,
159+
),
160+
arrayOf(
161+
"Next index: 1 for 2 relevant waypoints (1 is EV) and remaining waypoint 2",
162+
provideWaypoints(
163+
Waypoint.REGULAR,
164+
Waypoint.EV_CHARGING,
165+
Waypoint.REGULAR
166+
),
167+
2,
168+
1,
169+
),
170+
arrayOf(
171+
"Next index: 1 for 3 relevant waypoints (2 is EV) and remaining waypoint 4",
172+
provideWaypoints(
173+
Waypoint.REGULAR,
174+
Waypoint.EV_CHARGING,
175+
Waypoint.SILENT,
176+
Waypoint.EV_CHARGING,
177+
Waypoint.REGULAR
178+
),
179+
4,
180+
1,
181+
),
182+
arrayOf(
183+
"Next index: 1 for 3 relevant waypoints (2 is EV) and remaining waypoint 2",
184+
provideWaypoints(
185+
Waypoint.REGULAR,
186+
Waypoint.EV_CHARGING,
187+
Waypoint.SILENT,
188+
Waypoint.EV_CHARGING,
189+
Waypoint.REGULAR
190+
),
191+
2,
192+
2,
193+
),
194+
arrayOf(
195+
"Next index: null for non-valid case - 3 relevant waypoints (2 is EV) and " +
196+
"remaining waypoint 7",
197+
provideWaypoints(
198+
Waypoint.REGULAR,
199+
Waypoint.EV_CHARGING,
200+
Waypoint.SILENT,
201+
Waypoint.EV_CHARGING,
202+
Waypoint.REGULAR
203+
),
204+
7,
205+
null,
206+
),
207+
arrayOf(
208+
"Next index: 0 for 3 relevant waypoints (2 is EV) and remaining waypoint 5",
209+
provideWaypoints(
210+
Waypoint.REGULAR,
211+
Waypoint.EV_CHARGING,
212+
Waypoint.SILENT,
213+
Waypoint.EV_CHARGING,
214+
Waypoint.REGULAR
215+
),
216+
5,
217+
0,
218+
),
219+
)
220+
}
221+
222+
@Test
223+
fun testCases() {
224+
assertEquals(
225+
testDescription,
226+
expectedIndex,
227+
indexOfNextRequestedCoordinate(waypoints, remainingWaypoints)
228+
)
229+
}
230+
}
231+
}
232+
233+
private fun provideWaypoints(@Waypoint.Type vararg waypointType: Int): List<Waypoint> =
234+
waypointType.map { mapToType ->
235+
mockk { every { type } returns mapToType }
236+
}

libnavigation-base/src/test/java/com/mapbox/navigation/base/internal/route/NavigationRouteExTest.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -562,6 +562,7 @@ class NavigationRouteExTest {
562562
every { routeInfo } returns mockk(relaxed = true)
563563
every { routeId } returns ""
564564
every { routerOrigin } returns RouterOrigin.ONLINE
565+
every { waypoints } returns emptyList()
565566
}
566567
)
567568
}

libnavigation-base/src/test/java/com/mapbox/navigation/base/route/NavigationRouteTest.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ class NavigationRouteTest {
5151
every { routeInfo } returns mockk(relaxed = true)
5252
every { routeId } returns "$idBase#$it"
5353
every { routerOrigin } returns com.mapbox.navigator.RouterOrigin.ONBOARD
54+
every { waypoints } returns emptyList()
5455
}
5556
)
5657
}
@@ -299,6 +300,7 @@ class NavigationRouteTest {
299300
every { routeInfo } returns mockk(relaxed = true)
300301
every { routeId } returns "some_id"
301302
every { routerOrigin } returns com.mapbox.navigator.RouterOrigin.ONBOARD
303+
every { waypoints } returns emptyList()
302304
}
303305
)
304306
}

0 commit comments

Comments
 (0)