Skip to content

Commit 9446e35

Browse files
committed
NAVAND-842: use route's options as fallback EV data
1 parent fe31488 commit 9446e35

16 files changed

Lines changed: 235 additions & 166 deletions

File tree

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ class RouteRefreshRequestData(
5454
return "RouteRefreshRequestData(" +
5555
"legIndex=$legIndex, " +
5656
"routeGeometryIndex=$routeGeometryIndex, " +
57-
"legGeometryIndex=$legGeometryIndex" +
57+
"legGeometryIndex=$legGeometryIndex, " +
5858
"experimentalProperties=$experimentalProperties" +
5959
")"
6060
}

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -283,6 +283,8 @@ class MapboxNavigation @VisibleForTesting internal constructor(
283283
private val routeRefreshRequestDataProvider =
284284
NavigationComponentProvider.createRouteRefreshRequestDataProvider()
285285

286+
private val evDataHolder = NavigationComponentProvider.createEVDataHolder()
287+
286288
// Router provided via @Modules, might be outer
287289
private val moduleRouter: NavigationRouterV2
288290

@@ -542,6 +544,7 @@ class MapboxNavigation @VisibleForTesting internal constructor(
542544
navigationOptions.routeRefreshOptions,
543545
directionsSession,
544546
routeRefreshRequestDataProvider,
547+
evDataHolder
545548
)
546549

547550
defaultRerouteController = MapboxRerouteController(
@@ -1702,7 +1705,7 @@ class MapboxNavigation @VisibleForTesting internal constructor(
17021705
*/
17031706
@ExperimentalPreviewMapboxNavigationAPI
17041707
fun onEVDataUpdated(data: Map<String, String>) {
1705-
routeRefreshRequestDataProvider.onEVDataUpdated(data)
1708+
evDataHolder.updateData(data)
17061709
}
17071710

17081711
private fun createHistoryRecorderHandles(config: ConfigHandle) =
@@ -1740,7 +1743,7 @@ class MapboxNavigation @VisibleForTesting internal constructor(
17401743
)
17411744
internalSetNavigationRoutes(
17421745
refreshed.routes,
1743-
SetRefreshedRoutesInfo(refreshed.requestData),
1746+
SetRefreshedRoutesInfo(refreshed.routeProgressData),
17441747
)
17451748
}
17461749
}

libnavigation-core/src/main/java/com/mapbox/navigation/core/NavigationComponentProvider.kt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import com.mapbox.navigation.core.accounts.BillingController
88
import com.mapbox.navigation.core.arrival.ArrivalProgressObserver
99
import com.mapbox.navigation.core.directions.session.DirectionsSession
1010
import com.mapbox.navigation.core.directions.session.MapboxDirectionsSession
11+
import com.mapbox.navigation.core.routerefresh.EVDataHolder
1112
import com.mapbox.navigation.core.trip.service.MapboxTripService
1213
import com.mapbox.navigation.core.trip.service.TripService
1314
import com.mapbox.navigation.core.trip.session.MapboxTripSession
@@ -99,6 +100,8 @@ internal object NavigationComponentProvider {
99100
historyRecordingStateHandler.registerCopilotSessionObserver(it)
100101
}
101102

102-
fun createRouteRefreshRequestDataProvider(): RouteRefreshRequestDataProvider =
103-
RouteRefreshRequestDataProvider()
103+
fun createRouteRefreshRequestDataProvider(): RouteProgressDataProvider =
104+
RouteProgressDataProvider()
105+
106+
fun createEVDataHolder(): EVDataHolder = EVDataHolder()
104107
}

libnavigation-core/src/main/java/com/mapbox/navigation/core/RouteRefreshRequestDataProvider.kt renamed to libnavigation-core/src/main/java/com/mapbox/navigation/core/RouteProgressDataProvider.kt

Lines changed: 3 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
package com.mapbox.navigation.core
22

33
import androidx.annotation.MainThread
4-
import com.mapbox.api.directions.v5.models.RouteOptions
5-
import com.mapbox.navigation.base.internal.RouteRefreshRequestData
64
import com.mapbox.navigation.base.trip.model.RouteProgress
7-
import com.mapbox.navigation.core.routerefresh.EVDataHolder
85
import com.mapbox.navigation.core.trip.session.RouteProgressObserver
96
import kotlinx.coroutines.CancellableContinuation
107
import kotlinx.coroutines.suspendCancellableCoroutine
@@ -20,9 +17,7 @@ internal data class RouteProgressData(
2017
* Accumulates and provides route refresh model data from different sources.
2118
*/
2219
@MainThread
23-
internal class RouteRefreshRequestDataProvider(
24-
private val evDataHolder: EVDataHolder = EVDataHolder()
25-
) : RouteProgressObserver {
20+
internal class RouteProgressDataProvider : RouteProgressObserver {
2621

2722
private val defaultRouteProgressData = RouteProgressData(0, 0, null)
2823
private var routeProgressData: RouteProgressData? = null
@@ -31,27 +26,14 @@ internal class RouteRefreshRequestDataProvider(
3126
/**
3227
* Returns either last saved value (if has one) or waits for the next update.
3328
*/
34-
suspend fun getRouteRefreshRequestDataOrWait(
35-
routeOptions: RouteOptions
36-
): RouteRefreshRequestData {
37-
return (routeProgressData ?: suspendCancellableCoroutine { continuation = it }).let {
38-
RouteRefreshRequestData(
39-
it.legIndex,
40-
it.routeGeometryIndex,
41-
it.legGeometryIndex,
42-
evDataHolder.currentData(routeOptions.unrecognizedJsonProperties)
43-
)
44-
}
29+
suspend fun getRouteRefreshRequestDataOrWait(): RouteProgressData {
30+
return (routeProgressData ?: suspendCancellableCoroutine { continuation = it })
4531
}
4632

4733
fun onNewRoutes() {
4834
routeProgressData = null
4935
}
5036

51-
fun onEVDataUpdated(data: Map<String, String>) {
52-
evDataHolder.updateData(data)
53-
}
54-
5537
override fun onRouteProgressChanged(routeProgress: RouteProgress) {
5638
routeProgressData = RouteProgressData(
5739
legIndex = routeProgress.currentLegProgress?.legIndex

libnavigation-core/src/main/java/com/mapbox/navigation/core/SetRoutesInfo.kt

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

3-
import com.mapbox.navigation.base.internal.RouteRefreshRequestData
43
import com.mapbox.navigation.core.directions.session.RoutesExtra
54

65
internal sealed class SetRoutesInfo(
@@ -63,8 +62,8 @@ internal class SetAlternativeRoutesInfo(legIndex: Int) : SetRoutesInfo(
6362
}
6463

6564
internal class SetRefreshedRoutesInfo(
66-
val routeRefreshRequestData: RouteRefreshRequestData
67-
) : SetRoutesInfo(RoutesExtra.ROUTES_UPDATE_REASON_REFRESH, routeRefreshRequestData.legIndex) {
65+
val routeProgressData: RouteProgressData
66+
) : SetRoutesInfo(RoutesExtra.ROUTES_UPDATE_REASON_REFRESH, routeProgressData.legIndex) {
6867

6968
override fun equals(other: Any?): Boolean {
7069
if (this === other) return true
@@ -73,20 +72,20 @@ internal class SetRefreshedRoutesInfo(
7372

7473
other as SetRefreshedRoutesInfo
7574

76-
if (routeRefreshRequestData != other.routeRefreshRequestData) return false
75+
if (routeProgressData != other.routeProgressData) return false
7776

7877
return true
7978
}
8079

8180
override fun hashCode(): Int {
8281
var result = super.hashCode()
83-
result = 31 * result + routeRefreshRequestData.hashCode()
82+
result = 31 * result + routeProgressData.hashCode()
8483
return result
8584
}
8685

8786
override fun toString(): String {
8887
return "SetRefreshedRoutesInfo(" +
89-
"routeRefreshRequestData=$routeRefreshRequestData) " +
88+
"routeProgressData=$routeProgressData) " +
9089
super.toString() +
9190
""
9291
}
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
package com.mapbox.navigation.core.routerefresh
22

3-
import com.mapbox.navigation.base.internal.RouteRefreshRequestData
43
import com.mapbox.navigation.base.route.NavigationRoute
4+
import com.mapbox.navigation.core.RouteProgressData
55

66
internal data class RefreshedRouteInfo(
77
val routes: List<NavigationRoute>,
8-
val requestData: RouteRefreshRequestData,
8+
val routeProgressData: RouteProgressData,
99
)

libnavigation-core/src/main/java/com/mapbox/navigation/core/routerefresh/RouteRefreshController.kt

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@ import com.mapbox.navigation.base.route.NavigationRoute
1111
import com.mapbox.navigation.base.route.NavigationRouterRefreshCallback
1212
import com.mapbox.navigation.base.route.NavigationRouterRefreshError
1313
import com.mapbox.navigation.base.route.RouteRefreshOptions
14-
import com.mapbox.navigation.core.RouteRefreshRequestDataProvider
14+
import com.mapbox.navigation.core.RouteProgressData
15+
import com.mapbox.navigation.core.RouteProgressDataProvider
1516
import com.mapbox.navigation.core.directions.session.RouteRefresh
1617
import com.mapbox.navigation.utils.internal.logE
1718
import com.mapbox.navigation.utils.internal.logI
@@ -35,7 +36,8 @@ import kotlin.coroutines.resume
3536
internal class RouteRefreshController(
3637
private val routeRefreshOptions: RouteRefreshOptions,
3738
private val routeRefresh: RouteRefresh,
38-
private val routeRefreshRequestDataProvider: RouteRefreshRequestDataProvider,
39+
private val routeProgressDataProvider: RouteProgressDataProvider,
40+
private val evDataHolder: EVDataHolder,
3941
private val routeDiffProvider: DirectionsRouteDiffProvider = DirectionsRouteDiffProvider(),
4042
private val localDateProvider: () -> Date,
4143
) {
@@ -152,28 +154,28 @@ internal class RouteRefreshController(
152154
onNewState(RouteRefreshExtra.REFRESH_STATE_STARTED)
153155
}
154156
timeUntilNextAttempt = async { delay(routeRefreshOptions.intervalMillis) }
155-
val routeRefreshRequestData = routeRefreshRequestDataProvider
156-
.getRouteRefreshRequestDataOrWait(routes.first().routeOptions)
157-
val refreshedRoutes = refreshRoutesOrNull(routes, routeRefreshRequestData)
157+
val routeProgressData = routeProgressDataProvider
158+
.getRouteRefreshRequestDataOrWait()
159+
val refreshedRoutes = refreshRoutesOrNull(routes, routeProgressData)
158160
if (refreshedRoutes.any { it != null }) {
159161
onNewState(RouteRefreshExtra.REFRESH_STATE_FINISHED_SUCCESS)
160162
return@coroutineScope RefreshedRouteInfo(
161163
refreshedRoutes.mapIndexed { index, navigationRoute ->
162164
navigationRoute ?: routes[index]
163165
},
164-
routeRefreshRequestData
166+
routeProgressData
165167
)
166168
}
167169
}
168170
} finally {
169171
timeUntilNextAttempt.cancel() // otherwise current coroutine will wait for its child
170172
}
171173
onNewState(RouteRefreshExtra.REFRESH_STATE_FINISHED_FAILED)
172-
val requestData = routeRefreshRequestDataProvider
173-
.getRouteRefreshRequestDataOrWait(routes.first().routeOptions)
174+
val routeProgressData = routeProgressDataProvider
175+
.getRouteRefreshRequestDataOrWait()
174176
RefreshedRouteInfo(
175-
routes.map { removeExpiringDataFromRoute(it, requestData.legIndex) },
176-
requestData
177+
routes.map { removeExpiringDataFromRoute(it, routeProgressData.legIndex) },
178+
routeProgressData
177179
)
178180
}
179181

@@ -222,13 +224,19 @@ internal class RouteRefreshController(
222224

223225
private suspend fun refreshRouteOrNull(
224226
route: NavigationRoute,
225-
routeRefreshRequestData: RouteRefreshRequestData,
227+
routeProgressData: RouteProgressData,
226228
): NavigationRoute? {
227229
val validationResult = validateRoute(route)
228230
if (validationResult is RouteValidationResult.Invalid) {
229231
logI("route ${route.id} can't be refreshed because ${validationResult.reason}")
230232
return null
231233
}
234+
val routeRefreshRequestData = RouteRefreshRequestData(
235+
routeProgressData.legIndex,
236+
routeProgressData.routeGeometryIndex,
237+
routeProgressData.legGeometryIndex,
238+
evDataHolder.currentData(route.routeOptions.unrecognizedJsonProperties)
239+
)
232240
return when (val result = requestRouteRefresh(route, routeRefreshRequestData)) {
233241
is RouteRefreshResult.Fail -> {
234242
logE(
@@ -252,13 +260,13 @@ internal class RouteRefreshController(
252260

253261
private suspend fun refreshRoutesOrNull(
254262
routes: List<NavigationRoute>,
255-
routeRefreshRequestData: RouteRefreshRequestData,
263+
routeProgressData: RouteProgressData,
256264
): List<NavigationRoute?> {
257265
return coroutineScope {
258266
routes.map { route ->
259267
async {
260268
withTimeoutOrNull(routeRefreshOptions.intervalMillis) {
261-
refreshRouteOrNull(route, routeRefreshRequestData)
269+
refreshRouteOrNull(route, routeProgressData)
262270
}
263271
}
264272
}.awaitAll()

libnavigation-core/src/main/java/com/mapbox/navigation/core/routerefresh/RouteRefreshControllerProvider.kt

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package com.mapbox.navigation.core.routerefresh
22

33
import com.mapbox.navigation.base.route.RouteRefreshOptions
4-
import com.mapbox.navigation.core.RouteRefreshRequestDataProvider
4+
import com.mapbox.navigation.core.RouteProgressDataProvider
55
import com.mapbox.navigation.core.directions.session.DirectionsSession
66
import java.util.Date
77

@@ -10,11 +10,13 @@ internal object RouteRefreshControllerProvider {
1010
fun createRouteRefreshController(
1111
routeRefreshOptions: RouteRefreshOptions,
1212
directionsSession: DirectionsSession,
13-
routeRefreshRequestDataProvider: RouteRefreshRequestDataProvider,
13+
routeProgressDataProvider: RouteProgressDataProvider,
14+
evDataHolder: EVDataHolder,
1415
) = RouteRefreshController(
1516
routeRefreshOptions,
1617
directionsSession,
17-
routeRefreshRequestDataProvider,
18+
routeProgressDataProvider,
19+
evDataHolder,
1820
DirectionsRouteDiffProvider(),
1921
{ Date() },
2022
)

libnavigation-core/src/test/java/com/mapbox/navigation/core/MapboxNavigationBaseTest.kt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import com.mapbox.navigation.core.reroute.RerouteController
2424
import com.mapbox.navigation.core.reroute.RerouteState
2525
import com.mapbox.navigation.core.routealternatives.RouteAlternativesController
2626
import com.mapbox.navigation.core.routealternatives.RouteAlternativesControllerProvider
27+
import com.mapbox.navigation.core.routerefresh.EVDataHolder
2728
import com.mapbox.navigation.core.routerefresh.RouteRefreshController
2829
import com.mapbox.navigation.core.routerefresh.RouteRefreshControllerProvider
2930
import com.mapbox.navigation.core.telemetry.MapboxNavigationTelemetry
@@ -84,6 +85,7 @@ internal open class MapboxNavigationBaseTest {
8485
val distanceFormatterOptions: DistanceFormatterOptions = mockk(relaxed = true)
8586
val routingTilesOptions: RoutingTilesOptions = mockk(relaxed = true)
8687
val routeRefreshController: RouteRefreshController = mockk(relaxed = true)
88+
val evDataHolder: EVDataHolder = mockk(relaxed = true)
8789
val routeAlternativesController: RouteAlternativesController = mockk(relaxed = true)
8890
val routeProgress: RouteProgress = mockk(relaxed = true)
8991
val navigationSession: NavigationSession = mockk(relaxed = true)
@@ -97,7 +99,7 @@ internal open class MapboxNavigationBaseTest {
9799
val historyRecordingStateHandler: HistoryRecordingStateHandler = mockk(relaxed = true)
98100
val developerMetadataAggregator: DeveloperMetadataAggregator = mockk(relaxUnitFun = true)
99101
val threadController = mockk<ThreadController>(relaxed = true)
100-
val routeRefreshRequestDataProvider = mockk<RouteRefreshRequestDataProvider>(relaxed = true)
102+
val routeProgressDataProvider = mockk<RouteProgressDataProvider>(relaxed = true)
101103

102104
val applicationContext: Context = mockk(relaxed = true) {
103105
every { inferDeviceLocale() } returns Locale.US
@@ -167,11 +169,13 @@ internal open class MapboxNavigationBaseTest {
167169
mockkObject(RouteRefreshControllerProvider)
168170
every {
169171
RouteRefreshControllerProvider.createRouteRefreshController(
172+
any(),
170173
any(),
171174
any(),
172175
any()
173176
)
174177
} returns routeRefreshController
178+
every { NavigationComponentProvider.createEVDataHolder() } returns evDataHolder
175179
mockkObject(RouteAlternativesControllerProvider)
176180
every {
177181
RouteAlternativesControllerProvider.create(any(), any(), any(), any())
@@ -201,7 +205,7 @@ internal open class MapboxNavigationBaseTest {
201205
} returns developerMetadataAggregator
202206
every {
203207
NavigationComponentProvider.createRouteRefreshRequestDataProvider()
204-
} returns routeRefreshRequestDataProvider
208+
} returns routeProgressDataProvider
205209

206210
every {
207211
navigator.create(

0 commit comments

Comments
 (0)