Skip to content

Commit 83cc24b

Browse files
committed
add new route preview controller
1 parent e74e336 commit 83cc24b

File tree

33 files changed

+819
-254
lines changed

33 files changed

+819
-254
lines changed

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

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ import com.mapbox.navigation.ui.app.internal.controller.CameraStateController
1010
import com.mapbox.navigation.ui.app.internal.controller.DestinationStateController
1111
import com.mapbox.navigation.ui.app.internal.controller.LocationStateController
1212
import com.mapbox.navigation.ui.app.internal.controller.NavigationStateController
13-
import com.mapbox.navigation.ui.app.internal.controller.RoutesStateController
13+
import com.mapbox.navigation.ui.app.internal.controller.RoutePreviewStateController
14+
import com.mapbox.navigation.ui.app.internal.controller.RouteStateController
1415
import com.mapbox.navigation.ui.app.internal.controller.StateResetController
1516
import com.mapbox.navigation.ui.app.internal.controller.TripSessionStarterStateController
1617
import com.mapbox.navigation.ui.utils.internal.datastore.NavigationDataStoreOwner
@@ -33,13 +34,15 @@ object SharedApp {
3334
val audioGuidanceStateController = AudioGuidanceStateController(store)
3435
val cameraStateController = CameraStateController(store)
3536
val destinationStateController = DestinationStateController(store)
36-
val routesStateController = RoutesStateController(store)
37+
val routeStateController = RouteStateController(store)
38+
val routePreviewStateController = RoutePreviewStateController(store)
3739
private val navigationObservers: Array<MapboxNavigationObserver> = arrayOf(
3840
destinationStateController,
3941
tripSessionStarterStateController,
4042
audioGuidanceStateController,
4143
locationStateController,
42-
routesStateController,
44+
routeStateController,
45+
routePreviewStateController,
4346
cameraStateController,
4447
navigationStateController,
4548
)
Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,24 @@
11
package com.mapbox.navigation.ui.app.internal
22

3+
import com.mapbox.navigation.base.route.NavigationRoute
34
import com.mapbox.navigation.core.trip.session.LocationMatcherResult
45
import com.mapbox.navigation.ui.app.internal.audioguidance.AudioGuidanceState
56
import com.mapbox.navigation.ui.app.internal.camera.CameraState
67
import com.mapbox.navigation.ui.app.internal.destination.Destination
78
import com.mapbox.navigation.ui.app.internal.navigation.NavigationState
8-
import com.mapbox.navigation.ui.app.internal.routefetch.RoutesState
9+
import com.mapbox.navigation.ui.app.internal.routefetch.RoutePreviewState
910
import com.mapbox.navigation.ui.app.internal.tripsession.TripSessionStarterState
1011

1112
/**
1213
* Navigation state for internal use.
1314
*/
14-
data class State(
15+
data class State constructor(
1516
val destination: Destination? = null,
1617
val location: LocationMatcherResult? = null,
1718
val navigation: NavigationState = NavigationState.FreeDrive,
1819
val camera: CameraState = CameraState(),
1920
val audio: AudioGuidanceState = AudioGuidanceState(),
20-
val routes: RoutesState = RoutesState.Empty,
21+
val routes: List<NavigationRoute> = emptyList(),
22+
val previewRoutes: RoutePreviewState = RoutePreviewState.Empty,
2123
val tripSession: TripSessionStarterState = TripSessionStarterState()
2224
)

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

Lines changed: 23 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -10,19 +10,14 @@ import com.mapbox.navigation.base.route.NavigationRouterCallback
1010
import com.mapbox.navigation.base.route.RouterFailure
1111
import com.mapbox.navigation.base.route.RouterOrigin
1212
import com.mapbox.navigation.core.MapboxNavigation
13-
import com.mapbox.navigation.core.internal.extensions.flowRoutesUpdated
1413
import com.mapbox.navigation.ui.app.internal.Action
1514
import com.mapbox.navigation.ui.app.internal.State
1615
import com.mapbox.navigation.ui.app.internal.Store
17-
import com.mapbox.navigation.ui.app.internal.routefetch.RoutesAction
18-
import com.mapbox.navigation.ui.app.internal.routefetch.RoutesState
19-
import kotlinx.coroutines.flow.collect
20-
import kotlinx.coroutines.launch
16+
import com.mapbox.navigation.ui.app.internal.routefetch.RoutePreviewAction
17+
import com.mapbox.navigation.ui.app.internal.routefetch.RoutePreviewState
2118

2219
@OptIn(ExperimentalPreviewMapboxNavigationAPI::class)
23-
class RoutesStateController(
24-
private val store: Store
25-
) : StateController() {
20+
class RoutePreviewStateController(private val store: Store) : StateController() {
2621
init {
2722
store.register(this)
2823
}
@@ -32,20 +27,12 @@ class RoutesStateController(
3227
override fun onAttached(mapboxNavigation: MapboxNavigation) {
3328
super.onAttached(mapboxNavigation)
3429
this.mapboxNavigation = mapboxNavigation
35-
36-
coroutineScope.launch {
37-
mapboxNavigation.flowRoutesUpdated().collect { result ->
38-
// Empty is ignored on purpose. When the action is processed
39-
// it will be converted to RoutesState.Empty.
40-
store.dispatch(RoutesAction.Ready(result.navigationRoutes))
41-
}
42-
}
4330
}
4431

4532
override fun onDetached(mapboxNavigation: MapboxNavigation) {
4633
super.onDetached(mapboxNavigation)
47-
when (val currentState = store.state.value.routes) {
48-
is RoutesState.Fetching -> {
34+
when (val currentState = store.state.value.previewRoutes) {
35+
is RoutePreviewState.Fetching -> {
4936
mapboxNavigation.cancelRouteRequest(currentState.requestId)
5037
}
5138
else -> Unit
@@ -54,10 +41,10 @@ class RoutesStateController(
5441
}
5542

5643
override fun process(state: State, action: Action): State {
57-
if (action is RoutesAction) {
44+
if (action is RoutePreviewAction) {
5845
return this.mapboxNavigation?.let {
5946
return state.copy(
60-
routes = processRoutesAction(it, state.routes, action)
47+
previewRoutes = processRoutesAction(it, action)
6148
)
6249
} ?: state
6350
}
@@ -66,39 +53,30 @@ class RoutesStateController(
6653

6754
private fun processRoutesAction(
6855
mapboxNavigation: MapboxNavigation,
69-
state: RoutesState,
70-
action: RoutesAction
71-
): RoutesState {
56+
action: RoutePreviewAction
57+
): RoutePreviewState {
7258
return when (action) {
73-
is RoutesAction.FetchPoints -> {
59+
is RoutePreviewAction.FetchPoints -> {
7460
val routeOptions = getDefaultOptions(mapboxNavigation, action.points)
7561
val requestId = mapboxNavigation.fetchRoute(routeOptions)
76-
RoutesState.Fetching(requestId)
62+
RoutePreviewState.Fetching(requestId)
7763
}
78-
is RoutesAction.FetchOptions -> {
64+
is RoutePreviewAction.FetchOptions -> {
7965
val requestId = mapboxNavigation.fetchRoute(action.options)
80-
RoutesState.Fetching(requestId)
81-
}
82-
is RoutesAction.SetRoutes -> {
83-
mapboxNavigation.setNavigationRoutes(action.routes)
84-
if (action.routes.isEmpty()) {
85-
RoutesState.Empty
86-
} else {
87-
RoutesState.Ready(action.routes)
88-
}
66+
RoutePreviewState.Fetching(requestId)
8967
}
90-
is RoutesAction.Ready -> {
68+
is RoutePreviewAction.Ready -> {
9169
if (action.routes.isEmpty()) {
92-
RoutesState.Empty
70+
RoutePreviewState.Empty
9371
} else {
94-
RoutesState.Ready(action.routes)
72+
RoutePreviewState.Ready(action.routes)
9573
}
9674
}
97-
is RoutesAction.Canceled -> {
98-
RoutesState.Canceled(action.routeOptions, action.routerOrigin)
75+
is RoutePreviewAction.Canceled -> {
76+
RoutePreviewState.Canceled(action.routeOptions, action.routerOrigin)
9977
}
100-
is RoutesAction.Failed -> {
101-
RoutesState.Failed(action.reasons, action.routeOptions)
78+
is RoutePreviewAction.Failed -> {
79+
RoutePreviewState.Failed(action.reasons, action.routeOptions)
10280
}
10381
}
10482
}
@@ -111,18 +89,18 @@ class RoutesStateController(
11189
routes: List<NavigationRoute>,
11290
routerOrigin: RouterOrigin
11391
) {
114-
store.dispatch(RoutesAction.SetRoutes(routes))
92+
store.dispatch(RoutePreviewAction.Ready(routes))
11593
}
11694

11795
override fun onFailure(
11896
reasons: List<RouterFailure>,
11997
routeOptions: RouteOptions
12098
) {
121-
store.dispatch(RoutesAction.Failed(reasons, routeOptions))
99+
store.dispatch(RoutePreviewAction.Failed(reasons, routeOptions))
122100
}
123101

124102
override fun onCanceled(routeOptions: RouteOptions, routerOrigin: RouterOrigin) {
125-
store.dispatch(RoutesAction.Canceled(routeOptions, routerOrigin))
103+
store.dispatch(RoutePreviewAction.Canceled(routeOptions, routerOrigin))
126104
}
127105
}
128106
)
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package com.mapbox.navigation.ui.app.internal.controller
2+
3+
import com.mapbox.navigation.base.ExperimentalPreviewMapboxNavigationAPI
4+
import com.mapbox.navigation.base.route.NavigationRoute
5+
import com.mapbox.navigation.core.MapboxNavigation
6+
import com.mapbox.navigation.ui.app.internal.Action
7+
import com.mapbox.navigation.ui.app.internal.State
8+
import com.mapbox.navigation.ui.app.internal.Store
9+
import com.mapbox.navigation.ui.app.internal.routefetch.RoutesAction
10+
11+
@OptIn(ExperimentalPreviewMapboxNavigationAPI::class)
12+
class RouteStateController(store: Store) : StateController() {
13+
init {
14+
store.register(this)
15+
}
16+
17+
private var mapboxNavigation: MapboxNavigation? = null
18+
19+
override fun onAttached(mapboxNavigation: MapboxNavigation) {
20+
super.onAttached(mapboxNavigation)
21+
this.mapboxNavigation = mapboxNavigation
22+
}
23+
24+
override fun onDetached(mapboxNavigation: MapboxNavigation) {
25+
super.onDetached(mapboxNavigation)
26+
this.mapboxNavigation = null
27+
}
28+
29+
override fun process(state: State, action: Action): State {
30+
if (action is RoutesAction) {
31+
return this.mapboxNavigation?.let {
32+
return state.copy(
33+
routes = processRoutesAction(it, action)
34+
)
35+
} ?: state
36+
}
37+
return state
38+
}
39+
40+
private fun processRoutesAction(
41+
mapboxNavigation: MapboxNavigation,
42+
action: RoutesAction
43+
): List<NavigationRoute> {
44+
return when (action) {
45+
is RoutesAction.SetRoutes -> {
46+
mapboxNavigation.setNavigationRoutes(action.routes)
47+
action.routes
48+
}
49+
}
50+
}
51+
}

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import com.mapbox.navigation.ui.app.internal.Store
88
import com.mapbox.navigation.ui.app.internal.destination.DestinationAction
99
import com.mapbox.navigation.ui.app.internal.navigation.NavigationState
1010
import com.mapbox.navigation.ui.app.internal.navigation.NavigationStateAction
11+
import com.mapbox.navigation.ui.app.internal.routefetch.RoutePreviewAction
1112
import com.mapbox.navigation.ui.app.internal.routefetch.RoutesAction
1213
import com.mapbox.navigation.ui.base.lifecycle.UIComponent
1314
import kotlinx.coroutines.FlowPreview
@@ -27,6 +28,7 @@ internal class StateResetController(private val store: Store) : UIComponent() {
2728
if (prevState == TripSessionState.STARTED && newState == TripSessionState.STOPPED) {
2829
// we only reset Store state when TripSessionState switches from STARTED to STOPPED.
2930
store.dispatch(RoutesAction.SetRoutes(emptyList()))
31+
store.dispatch(RoutePreviewAction.Ready(emptyList()))
3032
store.dispatch(DestinationAction.SetDestination(null))
3133
store.dispatch(NavigationStateAction.Update(NavigationState.FreeDrive))
3234
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
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.route.NavigationRoute
6+
import com.mapbox.navigation.base.route.RouterFailure
7+
import com.mapbox.navigation.base.route.RouterOrigin
8+
import com.mapbox.navigation.ui.app.internal.Action
9+
10+
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()
16+
17+
/**
18+
* The action is used to request and set routes based on [RouteOptions].
19+
* @param options
20+
*/
21+
data class FetchOptions(val options: RouteOptions) : RoutePreviewAction()
22+
23+
/**
24+
* The action informs that route request was successful and routes are ready to be used.
25+
* @param routes list of [NavigationRoute]
26+
*/
27+
data class Ready(val routes: List<NavigationRoute>) : RoutePreviewAction()
28+
29+
/**
30+
* The action informs that the route request failed.
31+
* @param reasons for why the request failed
32+
* @param routeOptions used to fetch the route
33+
*/
34+
data class Failed(
35+
val reasons: List<RouterFailure>,
36+
val routeOptions: RouteOptions
37+
) : RoutePreviewAction()
38+
39+
/**
40+
* The action informs that the route request was canceled.
41+
* @param routeOptions used to fetch the route
42+
* @param routerOrigin origin of the route request
43+
*/
44+
data class Canceled(
45+
val routeOptions: RouteOptions,
46+
val routerOrigin: RouterOrigin
47+
) : RoutePreviewAction()
48+
}

libnavui-app/src/main/java/com/mapbox/navigation/ui/app/internal/routefetch/RoutesState.kt renamed to libnavui-app/src/main/java/com/mapbox/navigation/ui/app/internal/routefetch/RoutePreviewState.kt

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,23 +8,23 @@ import com.mapbox.navigation.base.route.RouterOrigin
88
/**
99
* Defines the state for route between origin and destination.
1010
*/
11-
sealed class RoutesState {
11+
sealed class RoutePreviewState {
1212
/**
1313
* Represents no route available.
1414
*/
15-
object Empty : RoutesState()
15+
object Empty : RoutePreviewState()
1616

1717
/**
1818
* Represents the state when the route is being fetched.
1919
* @param requestId of the route requested
2020
*/
21-
data class Fetching constructor(val requestId: Long) : RoutesState()
21+
data class Fetching constructor(val requestId: Long) : RoutePreviewState()
2222

2323
/**
2424
* Represents the state when route fetching is complete and the route is ready.
2525
* @param routes fetched as a result of network request
2626
*/
27-
data class Ready constructor(val routes: List<NavigationRoute>) : RoutesState()
27+
data class Ready constructor(val routes: List<NavigationRoute>) : RoutePreviewState()
2828

2929
/**
3030
* Represents the state when route fetching is canceled.
@@ -34,7 +34,7 @@ sealed class RoutesState {
3434
data class Canceled constructor(
3535
val routeOptions: RouteOptions,
3636
val routerOrigin: RouterOrigin
37-
) : RoutesState()
37+
) : RoutePreviewState()
3838

3939
/**
4040
* Represents the state when route request is failed.
@@ -44,5 +44,5 @@ sealed class RoutesState {
4444
data class Failed constructor(
4545
val reasons: List<RouterFailure>,
4646
val routeOptions: RouteOptions
47-
) : RoutesState()
47+
) : RoutePreviewState()
4848
}

0 commit comments

Comments
 (0)