Skip to content

Commit 80444d9

Browse files
committed
NAVAND-1073: fix alternative routes refresh
1 parent 1098030 commit 80444d9

23 files changed

+6208
-42
lines changed
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
- Fixed an issue where alternative routes might have had an incorrect or incomplete portion of the route refreshed or occasionally fail to refresh.

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

Lines changed: 103 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package com.mapbox.navigation.instrumentation_tests.core
22

3+
import android.content.Context
34
import android.location.Location
45
import androidx.annotation.IntegerRes
56
import com.mapbox.api.directions.v5.DirectionsCriteria
67
import com.mapbox.api.directions.v5.models.Closure
8+
import com.mapbox.api.directions.v5.models.DirectionsResponse
79
import com.mapbox.api.directions.v5.models.Incident
810
import com.mapbox.api.directions.v5.models.RouteOptions
911
import com.mapbox.geojson.Point
@@ -26,6 +28,7 @@ import com.mapbox.navigation.instrumentation_tests.utils.coroutines.roadObjectsO
2628
import com.mapbox.navigation.instrumentation_tests.utils.coroutines.routeProgressUpdates
2729
import com.mapbox.navigation.instrumentation_tests.utils.coroutines.routesUpdates
2830
import com.mapbox.navigation.instrumentation_tests.utils.coroutines.sdkTest
31+
import com.mapbox.navigation.instrumentation_tests.utils.coroutines.setNavigationRoutesAndWaitForAlternativesUpdate
2932
import com.mapbox.navigation.instrumentation_tests.utils.coroutines.setNavigationRoutesAndWaitForUpdate
3033
import com.mapbox.navigation.instrumentation_tests.utils.http.FailByRequestMockRequestHandler
3134
import com.mapbox.navigation.instrumentation_tests.utils.http.MockDirectionsRefreshHandler
@@ -34,6 +37,8 @@ import com.mapbox.navigation.instrumentation_tests.utils.http.MockRoutingTileEnd
3437
import com.mapbox.navigation.instrumentation_tests.utils.idling.IdlingPolicyTimeoutRule
3538
import com.mapbox.navigation.instrumentation_tests.utils.location.MockLocationReplayerRule
3639
import com.mapbox.navigation.instrumentation_tests.utils.readRawFileText
40+
import com.mapbox.navigation.instrumentation_tests.utils.routes.MockRoute
41+
import com.mapbox.navigation.instrumentation_tests.utils.routes.RoutesProvider.toNavigationRoutes
3742
import com.mapbox.navigation.testing.ui.BaseTest
3843
import com.mapbox.navigation.testing.ui.utils.getMapboxAccessTokenFromResources
3944
import com.mapbox.navigation.testing.ui.utils.runOnMainSync
@@ -80,6 +85,11 @@ class RouteRefreshTest : BaseTest<EmptyTestActivity>(EmptyTestActivity::class.ja
8085
Point.fromLngLat(-75.525486, 38.772959),
8186
Point.fromLngLat(-74.698765, 39.822911)
8287
)
88+
private val multilegCoordinates = listOf(
89+
Point.fromLngLat(38.577764, -121.496066),
90+
Point.fromLngLat(38.576795, -121.480256),
91+
Point.fromLngLat(38.582195, -121.468458)
92+
)
8393

8494
private lateinit var failByRequestRouteRefreshResponse: FailByRequestMockRequestHandler
8595

@@ -424,7 +434,7 @@ class RouteRefreshTest : BaseTest<EmptyTestActivity>(EmptyTestActivity::class.ja
424434
R.raw.route_response_route_refresh,
425435
R.raw.route_response_route_refresh_truncated_first_leg,
426436
"route_response_route_refresh",
427-
acceptedGeometryIndex = 5
437+
acceptedGeometryIndex = 3
428438
)
429439
val routeOptions = generateRouteOptions(twoCoordinates)
430440
val requestedRoutes = mapboxNavigation.requestRoutes(routeOptions)
@@ -433,10 +443,10 @@ class RouteRefreshTest : BaseTest<EmptyTestActivity>(EmptyTestActivity::class.ja
433443

434444
mapboxNavigation.setNavigationRoutes(requestedRoutes)
435445
mapboxNavigation.startTripSession()
436-
// corresponds to currentRouteGeometryIndex = 5
437-
stayOnPosition(38.57622, -121.496731)
446+
// corresponds to currentRouteGeometryIndex = 3
447+
stayOnPosition(38.577344, -121.496248)
438448
mapboxNavigation.routeProgressUpdates()
439-
.filter { it.currentRouteGeometryIndex == 5 }
449+
.filter { it.currentRouteGeometryIndex == 3 }
440450
.first()
441451
val refreshedRoutes = mapboxNavigation.routesUpdates()
442452
.filter {
@@ -446,10 +456,76 @@ class RouteRefreshTest : BaseTest<EmptyTestActivity>(EmptyTestActivity::class.ja
446456
.navigationRoutes
447457

448458
assertEquals(224.224, requestedRoutes[0].getSumOfDurationAnnotationsFromLeg(0), 0.0001)
449-
assertEquals(169.582, refreshedRoutes[0].getSumOfDurationAnnotationsFromLeg(0), 0.0001)
459+
assertEquals(172.175, refreshedRoutes[0].getSumOfDurationAnnotationsFromLeg(0), 0.0001)
450460

451461
assertEquals(227.918, requestedRoutes[1].getSumOfDurationAnnotationsFromLeg(0), 0.0001)
452-
assertEquals(234.024, refreshedRoutes[1].getSumOfDurationAnnotationsFromLeg(0), 0.0001)
462+
assertEquals(235.641, refreshedRoutes[1].getSumOfDurationAnnotationsFromLeg(0), 0.0001)
463+
}
464+
465+
@Test
466+
fun route_refresh_updates_annotations_for_new_alternative_with_different_number_of_legs() =
467+
sdkTest {
468+
setupMockRequestHandlers(
469+
multilegCoordinates,
470+
R.raw.route_response_single_route_multileg,
471+
R.raw.route_response_single_route_multileg_refreshed,
472+
"route_response_single_route_multileg",
473+
acceptedGeometryIndex = 70
474+
)
475+
mockWebServerRule.requestHandlers.add(
476+
FailByRequestMockRequestHandler(
477+
MockDirectionsRefreshHandler(
478+
"route_response_single_route_multileg_alternative",
479+
readRawFileText(
480+
activity,
481+
R.raw.route_response_single_route_multileg_alternative_refreshed
482+
),
483+
acceptedGeometryIndex = 11
484+
)
485+
)
486+
)
487+
val routeOptions = generateRouteOptions(multilegCoordinates)
488+
val requestedRoutes = mapboxNavigation.requestRoutes(routeOptions)
489+
.getSuccessfulResultOrThrowException()
490+
.routes
491+
// alternative which was requested on the second leg of the original route,
492+
// so the alternative has only one leg while the original route has two
493+
val alternativeRoute = alternativeForMultileg(activity).toNavigationRoutes().first()
494+
495+
mapboxNavigation.setNavigationRoutes(requestedRoutes, initialLegIndex = 1)
496+
mapboxNavigation.startTripSession()
497+
498+
// corresponds to currentRouteGeometryIndex = 70 for primary route and 11 for alternative route
499+
stayOnPosition(38.581798, -121.476146)
500+
mapboxNavigation.routeProgressUpdates()
501+
.filter {
502+
it.currentRouteGeometryIndex == 70
503+
}
504+
.first()
505+
506+
mapboxNavigation.setNavigationRoutesAndWaitForAlternativesUpdate(
507+
requestedRoutes + alternativeRoute,
508+
initialLegIndex = 1
509+
)
510+
511+
val refreshedRoutes = mapboxNavigation.routesUpdates()
512+
.filter {
513+
it.reason == ROUTES_UPDATE_REASON_REFRESH
514+
}
515+
.first()
516+
.navigationRoutes
517+
518+
assertEquals(
519+
requestedRoutes[0].getSumOfDurationAnnotationsFromLeg(0),
520+
refreshedRoutes[0].getSumOfDurationAnnotationsFromLeg(0),
521+
0.0001
522+
)
523+
524+
assertEquals(201.673, requestedRoutes[0].getSumOfDurationAnnotationsFromLeg(1), 0.0001)
525+
assertEquals(202.881, refreshedRoutes[0].getSumOfDurationAnnotationsFromLeg(1), 0.0001)
526+
527+
assertEquals(194.3, alternativeRoute.getSumOfDurationAnnotationsFromLeg(0), 0.0001)
528+
assertEquals(187.126, refreshedRoutes[1].getSumOfDurationAnnotationsFromLeg(0), 0.0001)
453529
}
454530

455531
@Test
@@ -714,6 +790,27 @@ class RouteRefreshTest : BaseTest<EmptyTestActivity>(EmptyTestActivity::class.ja
714790
)
715791
)
716792
}
793+
794+
private fun alternativeForMultileg(context: Context): MockRoute {
795+
val jsonResponse = readRawFileText(context, R.raw.route_response_single_route_multileg_alternative)
796+
val coordinates = listOf(
797+
Point.fromLngLat(38.577427, -121.478077),
798+
Point.fromLngLat(38.582195, -121.468458)
799+
)
800+
return MockRoute(
801+
jsonResponse,
802+
DirectionsResponse.fromJson(jsonResponse),
803+
listOf(
804+
MockDirectionsRequestHandler(
805+
profile = DirectionsCriteria.PROFILE_DRIVING_TRAFFIC,
806+
jsonResponse = jsonResponse,
807+
expectedCoordinates = coordinates
808+
)
809+
),
810+
coordinates,
811+
emptyList()
812+
)
813+
}
717814
}
718815

719816
private fun NavigationRoute.getSumOfDurationAnnotationsFromLeg(legIndex: Int): Double =

instrumentation-tests/src/androidTest/java/com/mapbox/navigation/instrumentation_tests/utils/coroutines/TestUtils.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,10 +93,11 @@ suspend fun MapboxNavigation.setNavigationRoutesAndAwaitError(
9393
}
9494

9595
suspend fun MapboxNavigation.setNavigationRoutesAndWaitForAlternativesUpdate(
96-
routes: List<NavigationRoute>
96+
routes: List<NavigationRoute>,
97+
initialLegIndex: Int = 0,
9798
) =
9899
withTimeout(MAX_TIME_TO_UPDATE_ROUTE) {
99-
setNavigationRoutes(routes)
100+
setNavigationRoutes(routes, initialLegIndex)
100101
waitForAlternativeRoute()
101102
}
102103

instrumentation-tests/src/main/res/raw/route_response_route_refresh_truncated_first_leg.json

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,12 @@
111111
{
112112
"unknown": true
113113
},
114+
{
115+
"unknown": true
116+
},
117+
{
118+
"unknown": true
119+
},
114120
{
115121
"speed": 40,
116122
"unit": "km/h"
@@ -198,6 +204,8 @@
198204
"unknown",
199205
"unknown",
200206
"unknown",
207+
"unknown",
208+
"unknown",
201209
"low",
202210
"low",
203211
"low",
@@ -213,6 +221,8 @@
213221
"low"
214222
],
215223
"speed": [
224+
6.2,
225+
6.3,
216226
6.1,
217227
5.8,
218228
5.8,
@@ -249,6 +259,8 @@
249259
9.7
250260
],
251261
"distance": [
262+
10.2,
263+
9.7,
252264
24.5,
253265
4,
254266
4.6,
@@ -285,6 +297,8 @@
285297
3.7
286298
],
287299
"duration": [
300+
1.802,
301+
3.002,
288302
4.003,
289303
0.687,
290304
0.787,

0 commit comments

Comments
 (0)