Skip to content

Commit 472b190

Browse files
yuryybkgithub-actions[bot]
authored andcommitted
NAVAND-1842 Don't reset route request when off-route is flaky (#9824)
* NAVAND-1842 Don't reset route request when off-route is flaky GitOrigin-RevId: 817cc2e36acabd18833f3bd5daa575aa26bae892
1 parent c0f5c59 commit 472b190

File tree

8 files changed

+57
-37
lines changed

8 files changed

+57
-37
lines changed
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
- Don't reset the re-route request when on-route/off-route events are flaky.

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

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -237,13 +237,24 @@ class CoreRerouteTest(
237237
mockWebServerRule.requestHandlers.add(requestHandler)
238238
mockWebServerRule.requestHandlers.add(rerouteRequestHandler)
239239

240-
val rerouteStateTransitionAssertion = RerouteStateTransitionAssertion(
241-
mapboxNavigation.getRerouteController()!!,
242-
) {
243-
requiredState(RerouteState.Idle)
244-
requiredState(RerouteState.FetchingRoute)
245-
requiredState(RerouteState.Interrupted)
246-
requiredState(RerouteState.Idle)
240+
// TODO This behavior should be the same for both NN and Nav SDK reroute controllers
241+
// Keep the single flow when NN will apply fix
242+
val rerouteStateTransitionAssertion = if (!runOptions.nativeReroute) {
243+
RerouteStateTransitionAssertion(
244+
mapboxNavigation.getRerouteController()!!,
245+
) {
246+
requiredState(RerouteState.Idle)
247+
requiredState(RerouteState.FetchingRoute)
248+
}
249+
} else {
250+
RerouteStateTransitionAssertion(
251+
mapboxNavigation.getRerouteController()!!,
252+
) {
253+
requiredState(RerouteState.Idle)
254+
requiredState(RerouteState.FetchingRoute)
255+
requiredState(RerouteState.Interrupted)
256+
requiredState(RerouteState.Idle)
257+
}
247258
}
248259

249260
val originalRoutes = mapboxNavigation.requestRoutes(

navigation/src/main/java/com/mapbox/navigation/core/MapboxNavigation.kt

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2190,8 +2190,6 @@ class MapboxNavigation @VisibleForTesting internal constructor(
21902190
private fun createInternalOffRouteObserver() = OffRouteObserver { offRoute ->
21912191
if (offRoute) {
21922192
rerouteOnDeviation()
2193-
} else {
2194-
rerouteController?.interrupt()
21952193
}
21962194
}
21972195

@@ -2257,10 +2255,12 @@ class MapboxNavigation @VisibleForTesting internal constructor(
22572255

22582256
private fun rerouteOnDeviation() {
22592257
rerouteController?.rerouteOnDeviation { result: RerouteResult ->
2260-
internalSetNavigationRoutes(
2261-
result.routes,
2262-
SetRoutes.Reroute(result.initialLegIndex),
2263-
)
2258+
if (tripSession.isOffRoute) {
2259+
internalSetNavigationRoutes(
2260+
result.routes,
2261+
SetRoutes.Reroute(result.initialLegIndex),
2262+
)
2263+
}
22642264
}
22652265
}
22662266

navigation/src/main/java/com/mapbox/navigation/core/reroute/MapboxRerouteController.kt

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,8 @@ internal class MapboxRerouteController @VisibleForTesting constructor(
5656

5757
private var runningRerouteCausedByRouteReplan = false
5858

59+
private var lastSignature: GetRouteSignature? = null
60+
5961
constructor(
6062
directionsSession: DirectionsSession,
6163
tripSession: TripSession,
@@ -86,6 +88,9 @@ internal class MapboxRerouteController @VisibleForTesting constructor(
8688
if (value is RerouteState.Idle) {
8789
runningRerouteCausedByRouteReplan = false
8890
}
91+
if (value !is RerouteState.FetchingRoute) {
92+
lastSignature = null
93+
}
8994
observers.forEach { it.onRerouteStateChanged(field) }
9095
}
9196

@@ -122,7 +127,10 @@ internal class MapboxRerouteController @VisibleForTesting constructor(
122127
}
123128

124129
override fun rerouteOnDeviation(callback: RoutesCallback) {
125-
rerouteInternal(deviationSignature, callback)
130+
// Do not reroute if we are already fetching a route for deviation
131+
if (state != RerouteState.FetchingRoute || lastSignature != deviationSignature) {
132+
rerouteInternal(deviationSignature, callback)
133+
}
126134
}
127135

128136
override fun rerouteOnParametersChange(callback: RoutesCallback) {
@@ -134,6 +142,7 @@ internal class MapboxRerouteController @VisibleForTesting constructor(
134142
signature: GetRouteSignature,
135143
callback: RoutesCallback,
136144
) {
145+
this.lastSignature = signature
137146
val ignoreDeviationToAlternatives = runningRerouteCausedByRouteReplan
138147
logD(LOG_CATEGORY) {
139148
"Starting reroute"

navigation/src/main/java/com/mapbox/navigation/core/trip/session/MapboxTripSession.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -235,8 +235,8 @@ internal class MapboxTripSession(
235235
stateObservers.forEach { it.onSessionStateChanged(value) }
236236
}
237237

238-
private var isOffRoute: Boolean = false
239-
set(value) {
238+
override var isOffRoute: Boolean = false
239+
private set(value) {
240240
if (field == value) {
241241
return
242242
}

navigation/src/main/java/com/mapbox/navigation/core/trip/session/TripSession.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ internal interface TripSession {
1919
fun getRawLocation(): Location?
2020
val zLevel: Int?
2121
val locationMatcherResult: LocationMatcherResult?
22+
val isOffRoute: Boolean
2223
fun getRouteProgress(): RouteProgress?
2324
fun getState(): TripSessionState
2425

navigation/src/test/java/com/mapbox/navigation/core/MapboxNavigationTest.kt

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -512,10 +512,9 @@ internal class MapboxNavigationTest : MapboxNavigationBaseTest() {
512512
it.onOffRouteStateChanged(false)
513513
}
514514

515-
verify(exactly = 1) { defaultRerouteController.interrupt() }
516-
verify(ordering = Ordering.ORDERED) {
515+
verify(exactly = 0) { defaultRerouteController.interrupt() }
516+
verify(exactly = 1) {
517517
tripSession.registerOffRouteObserver(any())
518-
defaultRerouteController.interrupt()
519518
}
520519
}
521520

@@ -552,9 +551,12 @@ internal class MapboxNavigationTest : MapboxNavigationBaseTest() {
552551
val observers = mutableListOf<OffRouteObserver>()
553552
verify { tripSession.registerOffRouteObserver(capture(observers)) }
554553

554+
every { tripSession.isOffRoute } returns true
555+
555556
observers.forEach {
556557
it.onOffRouteStateChanged(true)
557558
}
559+
558560
coVerify(exactly = 1) {
559561
directionsSession.setNavigationRoutesFinished(
560562
DirectionsSessionRoutes(
@@ -1469,6 +1471,8 @@ internal class MapboxNavigationTest : MapboxNavigationBaseTest() {
14691471
} returns NativeSetRouteValue(newRoutes, emptyList())
14701472
createMapboxNavigation()
14711473

1474+
every { tripSession.isOffRoute } returns true
1475+
14721476
observers.forEach {
14731477
it.onOffRouteStateChanged(true)
14741478
}

navigation/src/test/java/com/mapbox/navigation/core/reroute/MapboxRerouteControllerTest.kt

Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -861,19 +861,13 @@ class MapboxRerouteControllerTest {
861861
rerouteController.rerouteOnDeviation(internalRouteCallback)
862862
routeRequestCallback1.captured.onCanceled(routeOptions1, RouterOrigin.ONLINE)
863863
}
864-
verify(exactly = 1) { directionsSession.cancelRouteRequest(1L) }
865-
866-
routeRequestCallback2.captured.onRoutesReady(
867-
listOf(mockk(relaxed = true)),
868-
RouterOrigin.ONLINE,
869-
)
864+
verify(exactly = 0) { directionsSession.cancelRouteRequest(1L) }
870865

871866
verifyOrder {
867+
primaryRerouteObserver.onRerouteStateChanged(RerouteState.Idle)
872868
primaryRerouteObserver.onRerouteStateChanged(RerouteState.FetchingRoute)
873869
primaryRerouteObserver.onRerouteStateChanged(RerouteState.Interrupted)
874870
primaryRerouteObserver.onRerouteStateChanged(RerouteState.Idle)
875-
primaryRerouteObserver.onRerouteStateChanged(RerouteState.FetchingRoute)
876-
primaryRerouteObserver.onRerouteStateChanged(ofType<RerouteState.RouteFetched>())
877871
}
878872
}
879873

@@ -1154,6 +1148,11 @@ class MapboxRerouteControllerTest {
11541148
clearMocks(routeOptionsUpdater, answers = false)
11551149
rerouteController.rerouteOnDeviation(internalRouteCallback)
11561150

1151+
routeRequestCallback.captured.onRoutesReady(
1152+
listOf(mockk(relaxed = true)),
1153+
RouterOrigin.ONLINE,
1154+
)
1155+
11571156
verify(exactly = 1) {
11581157
routeOptionsUpdater.update(
11591158
mockRoute.toBuilder().avoidManeuverRadius(expectedMetersRadius).build(),
@@ -1162,11 +1161,6 @@ class MapboxRerouteControllerTest {
11621161
)
11631162
}
11641163
}
1165-
1166-
routeRequestCallback.captured.onRoutesReady(
1167-
listOf(mockk(relaxed = true)),
1168-
RouterOrigin.ONLINE,
1169-
)
11701164
}
11711165

11721166
@Test
@@ -1204,6 +1198,11 @@ class MapboxRerouteControllerTest {
12041198
clearMocks(routeOptionsUpdater, answers = false)
12051199
rerouteController.rerouteOnDeviation(internalRouteCallback)
12061200

1201+
routeRequestCallback.captured.onRoutesReady(
1202+
listOf(mockk(relaxed = true)),
1203+
RouterOrigin.ONLINE,
1204+
)
1205+
12071206
verify(exactly = 1) {
12081207
routeOptionsUpdater.update(
12091208
mockRo.toBuilder().avoidManeuverRadius(if (result) 200.0 else null).build(),
@@ -1212,11 +1211,6 @@ class MapboxRerouteControllerTest {
12121211
)
12131212
}
12141213
}
1215-
1216-
routeRequestCallback.captured.onRoutesReady(
1217-
listOf(mockk(relaxed = true)),
1218-
RouterOrigin.ONLINE,
1219-
)
12201214
}
12211215

12221216
@Test

0 commit comments

Comments
 (0)