Skip to content

Commit 0cda156

Browse files
committed
NAVAND-1172: introduce RouteLegProgress#legDestination
1 parent 0bc9675 commit 0cda156

File tree

15 files changed

+6201
-148
lines changed

15 files changed

+6201
-148
lines changed
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
- Added `RouteProgress#nextLegWaypoint` to be used in `ArrivalObserver#onWaypointArrival` to understand which waypoint the user has arrived at.

instrumentation-tests/src/androidTest/java/com/mapbox/navigation/instrumentation_tests/core/WaypointsTest.kt

Lines changed: 153 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,14 @@ import com.mapbox.navigation.base.extensions.applyDefaultNavigationOptions
99
import com.mapbox.navigation.base.internal.utils.internalWaypoints
1010
import com.mapbox.navigation.base.options.NavigationOptions
1111
import com.mapbox.navigation.base.options.RoutingTilesOptions
12+
import com.mapbox.navigation.base.route.LegWaypoint
1213
import com.mapbox.navigation.base.route.NavigationRoute
14+
import com.mapbox.navigation.base.trip.model.RouteLegProgress
15+
import com.mapbox.navigation.base.trip.model.RouteProgress
1316
import com.mapbox.navigation.core.MapboxNavigation
1417
import com.mapbox.navigation.core.MapboxNavigationProvider
18+
import com.mapbox.navigation.core.arrival.ArrivalObserver
19+
import com.mapbox.navigation.core.internal.extensions.flowLocationMatcherResult
1520
import com.mapbox.navigation.instrumentation_tests.R
1621
import com.mapbox.navigation.instrumentation_tests.activity.EmptyTestActivity
1722
import com.mapbox.navigation.instrumentation_tests.utils.ApproximateCoordinates
@@ -22,16 +27,24 @@ import com.mapbox.navigation.instrumentation_tests.utils.toApproximateCoordinate
2227
import com.mapbox.navigation.testing.ui.BaseTest
2328
import com.mapbox.navigation.testing.ui.utils.MapboxNavigationRule
2429
import com.mapbox.navigation.testing.ui.utils.coroutines.getSuccessfulResultOrThrowException
30+
import com.mapbox.navigation.testing.ui.utils.coroutines.navigateNextRouteLeg
2531
import com.mapbox.navigation.testing.ui.utils.coroutines.requestRoutes
2632
import com.mapbox.navigation.testing.ui.utils.coroutines.sdkTest
33+
import com.mapbox.navigation.testing.ui.utils.coroutines.setNavigationRoutesAndWaitForUpdate
2734
import com.mapbox.navigation.testing.ui.utils.getMapboxAccessTokenFromResources
2835
import com.mapbox.navigation.testing.ui.utils.runOnMainSync
36+
import kotlinx.coroutines.delay
37+
import kotlinx.coroutines.flow.filter
38+
import kotlinx.coroutines.flow.take
39+
import kotlinx.coroutines.flow.toList
40+
import kotlinx.coroutines.withTimeout
2941
import org.junit.Assert.assertEquals
3042
import org.junit.Assert.assertNull
3143
import org.junit.Before
3244
import org.junit.Rule
3345
import org.junit.Test
3446
import java.net.URI
47+
import kotlin.math.abs
3548

3649
class WaypointsTest : BaseTest<EmptyTestActivity>(EmptyTestActivity::class.java) {
3750

@@ -145,6 +158,146 @@ class WaypointsTest : BaseTest<EmptyTestActivity>(EmptyTestActivity::class.java)
145158
checkWaypointsPerRoute(expectedSecondNonEvWaypointsNamesAndLocations, routes[1])
146159
}
147160

161+
@Test
162+
fun leg_destination_non_ev_route() = sdkTest {
163+
val coordinates = listOf(
164+
Point.fromLngLat(140.025878, 35.660315),
165+
Point.fromLngLat(140.02985194436837, 35.6621859075361),
166+
Point.fromLngLat(140.0277017481984, 35.65792632910045),
167+
Point.fromLngLat(140.03887765416835, 35.66023142441715),
168+
Point.fromLngLat(140.0231453915486, 35.667495318461164),
169+
Point.fromLngLat(140.03969561587877, 35.67009382118668),
170+
)
171+
addResponseHandler(R.raw.route_response_with_many_waypoints, coordinates)
172+
stayOnPosition(coordinates[0], 270f)
173+
mapboxNavigation.startTripSession()
174+
mapboxNavigation.flowLocationMatcherResult().filter {
175+
abs(it.enhancedLocation.latitude - coordinates[0].latitude()) < 0.01 &&
176+
abs(it.enhancedLocation.longitude - coordinates[0].longitude()) < 0.01
177+
}.take(3).toList()
178+
val routes = mapboxNavigation.requestRoutes(
179+
generateRouteOptions(coordinates, electric = false, waypointsPerRoute = false)
180+
.toBuilder()
181+
.waypointIndicesList(listOf(0, 1, 3, 5))
182+
.build()
183+
)
184+
.getSuccessfulResultOrThrowException()
185+
.routes
186+
187+
mapboxNavigation.setNavigationRoutesAndWaitForUpdate(routes)
188+
189+
val nextWaypoints = mutableListOf<LegWaypoint?>()
190+
mapboxNavigation.registerArrivalObserver(object : ArrivalObserver {
191+
override fun onWaypointArrival(routeProgress: RouteProgress) {
192+
nextWaypoints.add(routeProgress.currentLegProgress?.legDestination)
193+
}
194+
195+
override fun onNextRouteLegStart(routeLegProgress: RouteLegProgress) {
196+
}
197+
198+
override fun onFinalDestinationArrival(routeProgress: RouteProgress) {
199+
}
200+
})
201+
stayOnPosition(coordinates[1], 90f)
202+
nextWaypoints.waitUntilHasSize(1)
203+
var legWaypoint = nextWaypoints[0]!!
204+
205+
checkLocation(coordinates[1], legWaypoint.location)
206+
assertEquals(LegWaypoint.REGULAR, legWaypoint.type)
207+
208+
mapboxNavigation.navigateNextRouteLeg()
209+
stayOnPosition(coordinates[2], 270f)
210+
delay(1000)
211+
assertEquals(1, nextWaypoints.size)
212+
213+
stayOnPosition(coordinates[3], 180f)
214+
nextWaypoints.waitUntilHasSize(2)
215+
legWaypoint = nextWaypoints[1]!!
216+
checkLocation(coordinates[3], legWaypoint.location)
217+
assertEquals(LegWaypoint.REGULAR, legWaypoint.type)
218+
219+
mapboxNavigation.navigateNextRouteLeg()
220+
stayOnPosition(coordinates[4], 45f)
221+
delay(1000)
222+
assertEquals(2, nextWaypoints.size)
223+
}
224+
225+
@Test
226+
fun leg_destination_ev_route() = sdkTest {
227+
val coordinates = listOf(
228+
Point.fromLngLat(48.39023, 11.063842),
229+
Point.fromLngLat(49.164725, 10.340713)
230+
)
231+
addResponseHandler(R.raw.ev_route_response_for_refresh_with_2_waypoints, coordinates)
232+
stayOnPosition(coordinates[0])
233+
mapboxNavigation.startTripSession()
234+
mapboxNavigation.flowLocationMatcherResult().filter {
235+
abs(it.enhancedLocation.latitude - coordinates[0].latitude()) < 0.01 &&
236+
abs(it.enhancedLocation.longitude - coordinates[0].longitude()) < 0.01
237+
}.take(3).toList()
238+
val routes = requestRoutes(coordinates, electric = true, waypointsPerRoute = false)
239+
240+
mapboxNavigation.setNavigationRoutesAndWaitForUpdate(routes)
241+
242+
val nextWaypoints = mutableListOf<LegWaypoint?>()
243+
mapboxNavigation.registerArrivalObserver(object : ArrivalObserver {
244+
override fun onWaypointArrival(routeProgress: RouteProgress) {
245+
nextWaypoints.add(routeProgress.currentLegProgress?.legDestination)
246+
}
247+
248+
override fun onNextRouteLegStart(routeLegProgress: RouteLegProgress) {
249+
}
250+
251+
override fun onFinalDestinationArrival(routeProgress: RouteProgress) {
252+
}
253+
})
254+
stayOnPosition(routes[0].directionsResponse.waypoints()!![1].location(), 315f)
255+
nextWaypoints.waitUntilHasSize(1)
256+
var legWaypoint = nextWaypoints[0]!!
257+
258+
checkLocation(
259+
routes[0].directionsResponse.waypoints()!![1].location(),
260+
legWaypoint.location
261+
)
262+
assertEquals(LegWaypoint.EV_CHARGING_ADDED, legWaypoint.type)
263+
264+
mapboxNavigation.navigateNextRouteLeg()
265+
stayOnPosition(routes[0].directionsResponse.waypoints()!![2].location(), 0f)
266+
nextWaypoints.waitUntilHasSize(2)
267+
legWaypoint = nextWaypoints[1]!!
268+
269+
checkLocation(
270+
routes[0].directionsResponse.waypoints()!![2].location(),
271+
legWaypoint.location
272+
)
273+
assertEquals(LegWaypoint.EV_CHARGING_ADDED, legWaypoint.type)
274+
}
275+
276+
private fun checkLocation(expected: Point, actual: Point) {
277+
assertEquals(expected.latitude(), actual.latitude(), 0.00001)
278+
assertEquals(expected.longitude(), actual.longitude(), 0.00001)
279+
}
280+
281+
private suspend fun List<*>.waitUntilHasSize(size: Int) {
282+
val list = this
283+
withTimeout(10000) {
284+
while (list.size < size) {
285+
delay(50)
286+
}
287+
}
288+
}
289+
290+
private fun stayOnPosition(point: Point, bearing: Float = 0f) {
291+
mockLocationReplayerRule.loopUpdate(
292+
mockLocationUpdatesRule.generateLocationUpdate {
293+
latitude = point.latitude()
294+
longitude = point.longitude()
295+
this.bearing = bearing
296+
},
297+
100
298+
)
299+
}
300+
148301
private suspend fun requestRoutes(
149302
coordinates: List<Point>,
150303
electric: Boolean,

0 commit comments

Comments
 (0)