Skip to content

Commit c314b02

Browse files
committed
add option to override route options used by drop-in (#6017)
1 parent 7062266 commit c314b02

File tree

22 files changed

+312
-251
lines changed

22 files changed

+312
-251
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ Mapbox welcomes participation and contributions from everyone.
44

55
## Unreleased
66
#### Features
7+
- Introduced `NavigationView.setRouteOptionsInterceptor` that allows to override `RouteOptions` used by `NavigationView`. [#6391](https://github.com/mapbox/mapbox-navigation-android/pull/6391)
78
#### Bug fixes and improvements
89
- Marked `ReplayProgressObserver`, `MapboxReplayer`, `ReplayLocationEngine`, `RerouteController#RoutesCallback`, `NavigationRerouteController#RoutesCallback`, `LocationObserver`, `NavigationSessionStateObserver`, `OffRouteObserver`, `RouteProgressObserver`, `TripSessionStateObserver`, `VoiceInstructionsObserver` methods with `@UiThread` annotation. [#6266](https://github.com/mapbox/mapbox-navigation-android/pull/6266)
910
- Fix crash due to multiple DataStores active. [#6392](https://github.com/mapbox/mapbox-navigation-android/pull/6392)

libnavui-app/src/main/java/com/mapbox/navigation/ui/app/internal/ThunkActions.kt

Lines changed: 28 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,14 @@ package com.mapbox.navigation.ui.app.internal
22

33
import com.mapbox.geojson.Point
44
import com.mapbox.navigation.base.route.NavigationRoute
5+
import com.mapbox.navigation.core.MapboxNavigation
56
import com.mapbox.navigation.ui.app.internal.destination.Destination
67
import com.mapbox.navigation.ui.app.internal.destination.DestinationAction
78
import com.mapbox.navigation.ui.app.internal.extension.ThunkAction
89
import com.mapbox.navigation.ui.app.internal.extension.dispatch
910
import com.mapbox.navigation.ui.app.internal.navigation.NavigationState
1011
import com.mapbox.navigation.ui.app.internal.navigation.NavigationStateAction
12+
import com.mapbox.navigation.ui.app.internal.routefetch.RouteOptionsProvider
1113
import com.mapbox.navigation.ui.app.internal.routefetch.RoutePreviewAction
1214
import com.mapbox.navigation.ui.app.internal.routefetch.RoutePreviewState
1315
import com.mapbox.navigation.ui.app.internal.routefetch.RoutesAction
@@ -76,28 +78,38 @@ fun startArrival(point: Point, routes: List<NavigationRoute>) = ThunkAction { st
7678
/**
7779
* Fetch Route and Show Route Preview ThunkAction creator.
7880
*/
79-
fun CoroutineScope.fetchRouteAndShowRoutePreview() = fetchRouteAndContinue { store ->
81+
fun CoroutineScope.fetchRouteAndShowRoutePreview(
82+
routeOptionsProvider: RouteOptionsProvider,
83+
mapboxNavigation: MapboxNavigation,
84+
) = fetchRouteAndContinue(routeOptionsProvider, mapboxNavigation) { store ->
8085
store.dispatch(NavigationStateAction.Update(NavigationState.RoutePreview))
8186
}
8287

8388
/**
8489
* Fetch Route and Start Active Navigation ThunkAction creator.
8590
*/
86-
fun CoroutineScope.fetchRouteAndStartActiveNavigation() = fetchRouteAndContinue { store ->
91+
fun CoroutineScope.fetchRouteAndStartActiveNavigation(
92+
routeOptionsProvider: RouteOptionsProvider,
93+
mapboxNavigation: MapboxNavigation,
94+
) = fetchRouteAndContinue(routeOptionsProvider, mapboxNavigation) { store ->
8795
val previewRoutes = store.state.value.previewRoutes
8896
if (previewRoutes is RoutePreviewState.Ready) {
8997
store.dispatch(startActiveNavigation(previewRoutes.routes))
9098
}
9199
}
92100

93-
private fun CoroutineScope.fetchRouteAndContinue(continuation: (Store) -> Unit) =
94-
ThunkAction { store ->
95-
launch {
96-
if (fetchRouteIfNeeded(store)) {
97-
continuation(store)
98-
}
101+
// TODO: simplify after :libnavui-app module is merged with :libnavui-dropin
102+
private fun CoroutineScope.fetchRouteAndContinue(
103+
routeOptionsProvider: RouteOptionsProvider,
104+
mapboxNavigation: MapboxNavigation,
105+
continuation: (Store) -> Unit,
106+
) = ThunkAction { store ->
107+
launch {
108+
if (fetchRouteIfNeeded(store, routeOptionsProvider, mapboxNavigation)) {
109+
continuation(store)
99110
}
100111
}
112+
}
101113

102114
/**
103115
* Dispatch FetchPoints action and wait for RoutePreviewState.Ready.
@@ -106,16 +118,21 @@ private fun CoroutineScope.fetchRouteAndContinue(continuation: (Store) -> Unit)
106118
*
107119
* @return `true` once in RoutePreviewState.Ready state, otherwise `false`
108120
*/
109-
private suspend fun fetchRouteIfNeeded(store: Store): Boolean {
121+
private suspend fun fetchRouteIfNeeded(
122+
store: Store,
123+
routeOptionsProvider: RouteOptionsProvider,
124+
mapboxNavigation: MapboxNavigation,
125+
): Boolean {
110126
val storeState = store.state.value
111127
if (storeState.previewRoutes is RoutePreviewState.Ready) return true
112128
if (storeState.previewRoutes is RoutePreviewState.Fetching) return false
113129

114130
return ifNonNull(
115131
storeState.location?.enhancedLocation?.toPoint(),
116-
storeState.destination
132+
storeState.destination?.point
117133
) { lastPoint, destination ->
118-
store.dispatch(RoutePreviewAction.FetchPoints(listOf(lastPoint, destination.point)))
134+
val options = routeOptionsProvider.getOptions(mapboxNavigation, lastPoint, destination)
135+
store.dispatch(RoutePreviewAction.FetchOptions(options))
119136
store.waitWhileFetching()
120137
store.state.value.previewRoutes is RoutePreviewState.Ready
121138
} ?: false

libnavui-app/src/main/java/com/mapbox/navigation/ui/app/internal/controller/RoutePreviewStateController.kt

Lines changed: 1 addition & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
package com.mapbox.navigation.ui.app.internal.controller
22

33
import com.mapbox.api.directions.v5.models.RouteOptions
4-
import com.mapbox.geojson.Point
54
import com.mapbox.navigation.base.ExperimentalPreviewMapboxNavigationAPI
6-
import com.mapbox.navigation.base.extensions.applyDefaultNavigationOptions
7-
import com.mapbox.navigation.base.extensions.applyLanguageAndVoiceUnitOptions
85
import com.mapbox.navigation.base.route.NavigationRoute
96
import com.mapbox.navigation.base.route.NavigationRouterCallback
107
import com.mapbox.navigation.base.route.RouterFailure
@@ -59,7 +56,6 @@ class RoutePreviewStateController(private val store: Store) : StateController()
5956

6057
private fun processRoutesAction(action: RoutePreviewAction): RoutePreviewState {
6158
return when (action) {
62-
is RoutePreviewAction.FetchPoints,
6359
is RoutePreviewAction.FetchOptions -> {
6460
RoutePreviewState.Fetching(0)
6561
}
@@ -85,13 +81,11 @@ class RoutePreviewStateController(private val store: Store) : StateController()
8581
private suspend fun MapboxNavigation.fetchRouteSaga() {
8682
store.actionsFlowable()
8783
.filter {
88-
it is RoutePreviewAction.FetchPoints ||
89-
it is RoutePreviewAction.FetchOptions ||
84+
it is RoutePreviewAction.FetchOptions ||
9085
it is DestinationAction.SetDestination
9186
}
9287
.map {
9388
when (it) {
94-
is RoutePreviewAction.FetchPoints -> routeOptions(it.points)
9589
is RoutePreviewAction.FetchOptions -> it.options
9690
else -> null
9791
}
@@ -115,16 +109,6 @@ class RoutePreviewStateController(private val store: Store) : StateController()
115109
}
116110
}
117111

118-
private fun MapboxNavigation.routeOptions(points: List<Point>): RouteOptions {
119-
return RouteOptions.builder()
120-
.applyDefaultNavigationOptions()
121-
.applyLanguageAndVoiceUnitOptions(navigationOptions.applicationContext)
122-
.layersList(listOf(getZLevel(), null))
123-
.coordinatesList(points)
124-
.alternatives(true)
125-
.build()
126-
}
127-
128112
private suspend fun MapboxNavigation.fetchRoute(
129113
routeOptions: RouteOptions,
130114
fetchStarted: (requestId: Long) -> Unit
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package com.mapbox.navigation.ui.app.internal.routefetch
2+
3+
import com.mapbox.api.directions.v5.models.RouteOptions
4+
import com.mapbox.geojson.Point
5+
import com.mapbox.navigation.base.extensions.applyDefaultNavigationOptions
6+
import com.mapbox.navigation.base.extensions.applyLanguageAndVoiceUnitOptions
7+
import com.mapbox.navigation.core.MapboxNavigation
8+
9+
class RouteOptionsProvider {
10+
11+
private var interceptor: (RouteOptions.Builder) -> RouteOptions.Builder = { it }
12+
13+
fun setInterceptor(interceptor: (RouteOptions.Builder) -> RouteOptions.Builder) {
14+
this.interceptor = interceptor
15+
}
16+
17+
fun getOptions(
18+
mapboxNavigation: MapboxNavigation,
19+
origin: Point,
20+
destination: Point,
21+
): RouteOptions {
22+
return RouteOptions.builder()
23+
.applyDefaultNavigationOptions()
24+
.applyLanguageAndVoiceUnitOptions(mapboxNavigation.navigationOptions.applicationContext)
25+
.layersList(listOf(mapboxNavigation.getZLevel(), null))
26+
.coordinatesList(listOf(origin, destination))
27+
.alternatives(true)
28+
.let(interceptor)
29+
.build()
30+
}
31+
}

libnavui-app/src/main/java/com/mapbox/navigation/ui/app/internal/routefetch/RoutePreviewAction.kt

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,12 @@
11
package com.mapbox.navigation.ui.app.internal.routefetch
22

33
import com.mapbox.api.directions.v5.models.RouteOptions
4-
import com.mapbox.geojson.Point
54
import com.mapbox.navigation.base.route.NavigationRoute
65
import com.mapbox.navigation.base.route.RouterFailure
76
import com.mapbox.navigation.base.route.RouterOrigin
87
import com.mapbox.navigation.ui.app.internal.Action
98

109
sealed class RoutePreviewAction : Action {
11-
/**
12-
* The action is used to fetch route based on the list of [points].
13-
* @param points list of points
14-
*/
15-
data class FetchPoints(val points: List<Point>) : RoutePreviewAction()
1610

1711
/**
1812
* The action is used to request and set routes based on [RouteOptions].

0 commit comments

Comments
 (0)