Skip to content

Commit 1419bb1

Browse files
[Drop-In UI] Move fetchRouteIfNeeded to RoutePreviewStateController: (#6638)
* Move `fetchRouteIfNeeded` to `RoutePreviewStateController`: - Moved RouteOptionsProvider to SharedApp to allow its injection to RoutePreviewStateController. - Introduced FetchRouteAndShowRoutePreview and FeetchRouteAndStartActivenNavigation actions. - Removed fetchRouteAnd** thunk actions (replaced by the above) - Moved fetch route and start preview/active nav. processing to RoutePreviewStateController - Renamed FetchOptions -> FetchRoute action. - Updated RoutePreviewStateController to directly use RouteOptionsProvider to generate necessary RouteOptions for fetch route request. addressing PR review comments * Unit tests fix.
1 parent d001c77 commit 1419bb1

File tree

16 files changed

+404
-397
lines changed

16 files changed

+404
-397
lines changed

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

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

3-
import com.mapbox.navigation.base.ExperimentalPreviewMapboxNavigationAPI
43
import com.mapbox.navigation.core.internal.extensions.attachCreated
54
import com.mapbox.navigation.core.lifecycle.MapboxNavigationApp
65
import com.mapbox.navigation.core.lifecycle.MapboxNavigationObserver
@@ -14,39 +13,29 @@ import com.mapbox.navigation.ui.app.internal.controller.RoutePreviewStateControl
1413
import com.mapbox.navigation.ui.app.internal.controller.RouteStateController
1514
import com.mapbox.navigation.ui.app.internal.controller.StateResetController
1615
import com.mapbox.navigation.ui.app.internal.controller.TripSessionStarterStateController
16+
import com.mapbox.navigation.ui.app.internal.routefetch.RouteOptionsProvider
1717
import com.mapbox.navigation.ui.maps.internal.ui.RouteAlternativeComponent
1818
import com.mapbox.navigation.ui.maps.internal.ui.RouteAlternativeContract
1919
import java.util.concurrent.atomic.AtomicBoolean
2020

21-
@OptIn(ExperimentalPreviewMapboxNavigationAPI::class)
2221
object SharedApp {
2322
private var isSetup = false
2423

2524
val store = Store()
2625
val state get() = store.state.value
26+
val routeOptionsProvider: RouteOptionsProvider = RouteOptionsProvider()
2727

2828
private val ignoreTripSessionUpdates = AtomicBoolean(false)
2929

30-
/**
31-
* These classes are accessible through MapboxNavigationApp.getObserver(..)
32-
*/
33-
val navigationStateController = NavigationStateController(store)
34-
val locationStateController = LocationStateController(store)
35-
val tripSessionStarterStateController = TripSessionStarterStateController(store)
36-
val audioGuidanceStateController = AudioGuidanceStateController(store)
37-
val cameraStateController = CameraStateController(store)
38-
val destinationStateController = DestinationStateController(store)
39-
val routeStateController = RouteStateController(store)
40-
val routePreviewStateController = RoutePreviewStateController(store)
4130
private val navigationObservers: Array<MapboxNavigationObserver> = arrayOf(
42-
routeStateController,
43-
cameraStateController,
44-
locationStateController,
45-
navigationStateController,
46-
destinationStateController,
47-
routePreviewStateController,
48-
audioGuidanceStateController,
49-
tripSessionStarterStateController,
31+
RouteStateController(store),
32+
CameraStateController(store),
33+
LocationStateController(store),
34+
NavigationStateController(store),
35+
DestinationStateController(store),
36+
RoutePreviewStateController(store, routeOptionsProvider),
37+
AudioGuidanceStateController(store),
38+
TripSessionStarterStateController(store),
5039
)
5140

5241
@JvmOverloads

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

Lines changed: 14 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -2,40 +2,30 @@ 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
65
import com.mapbox.navigation.ui.app.internal.destination.Destination
76
import com.mapbox.navigation.ui.app.internal.destination.DestinationAction
87
import com.mapbox.navigation.ui.app.internal.extension.ThunkAction
9-
import com.mapbox.navigation.ui.app.internal.extension.dispatch
108
import com.mapbox.navigation.ui.app.internal.navigation.NavigationState
119
import com.mapbox.navigation.ui.app.internal.navigation.NavigationStateAction
12-
import com.mapbox.navigation.ui.app.internal.routefetch.RouteOptionsProvider
1310
import com.mapbox.navigation.ui.app.internal.routefetch.RoutePreviewAction
14-
import com.mapbox.navigation.ui.app.internal.routefetch.RoutePreviewState
1511
import com.mapbox.navigation.ui.app.internal.routefetch.RoutesAction
16-
import com.mapbox.navigation.utils.internal.ifNonNull
17-
import com.mapbox.navigation.utils.internal.toPoint
18-
import kotlinx.coroutines.CoroutineScope
19-
import kotlinx.coroutines.flow.collect
20-
import kotlinx.coroutines.flow.takeWhile
21-
import kotlinx.coroutines.launch
2212

2313
/**
2414
* End Navigation ThunkAction creator.
2515
*/
2616
fun endNavigation() = ThunkAction { store ->
2717
store.setRoutes(emptyList())
2818
store.setPreviewRoutes(emptyList())
29-
store.dispatch(DestinationAction.SetDestination(null))
30-
store.dispatch(NavigationStateAction.Update(NavigationState.FreeDrive))
19+
store.setDestination(null)
20+
store.setNavigationState(NavigationState.FreeDrive)
3121
}
3222

3323
/**
3424
* Show Destination Preview ThunkAction creator.
3525
*/
3626
fun showDestinationPreview(point: Point) = ThunkAction { store ->
3727
store.setDestination(point)
38-
store.dispatch(NavigationStateAction.Update(NavigationState.DestinationPreview))
28+
store.setNavigationState(NavigationState.DestinationPreview)
3929
}
4030

4131
/**
@@ -44,15 +34,15 @@ fun showDestinationPreview(point: Point) = ThunkAction { store ->
4434
fun showRoutePreview(point: Point, routes: List<NavigationRoute>) = ThunkAction { store ->
4535
store.setDestination(point)
4636
store.setPreviewRoutes(routes)
47-
store.dispatch(NavigationStateAction.Update(NavigationState.RoutePreview))
37+
store.setNavigationState(NavigationState.RoutePreview)
4838
}
4939

5040
/**
5141
* Start Active Navigation ThunkAction creator.
5242
*/
5343
fun startActiveNavigation(routes: List<NavigationRoute>) = ThunkAction { store ->
5444
store.setRoutes(routes)
55-
store.dispatch(NavigationStateAction.Update(NavigationState.ActiveNavigation))
45+
store.setNavigationState(NavigationState.ActiveNavigation)
5646
}
5747

5848
/**
@@ -62,7 +52,7 @@ fun startActiveNavigation(point: Point, routes: List<NavigationRoute>) = ThunkAc
6252
store.setDestination(point)
6353
store.setPreviewRoutes(routes)
6454
store.setRoutes(routes)
65-
store.dispatch(NavigationStateAction.Update(NavigationState.ActiveNavigation))
55+
store.setNavigationState(NavigationState.ActiveNavigation)
6656
}
6757

6858
/**
@@ -72,78 +62,12 @@ fun startArrival(point: Point, routes: List<NavigationRoute>) = ThunkAction { st
7262
store.setDestination(point)
7363
store.setPreviewRoutes(routes)
7464
store.setRoutes(routes)
75-
store.dispatch(NavigationStateAction.Update(NavigationState.Arrival))
65+
store.setNavigationState(NavigationState.Arrival)
7666
}
7767

78-
/**
79-
* Fetch Route and Show Route Preview ThunkAction creator.
80-
*/
81-
fun CoroutineScope.fetchRouteAndShowRoutePreview(
82-
routeOptionsProvider: RouteOptionsProvider,
83-
mapboxNavigation: MapboxNavigation,
84-
) = fetchRouteAndContinue(routeOptionsProvider, mapboxNavigation) { store ->
85-
store.dispatch(NavigationStateAction.Update(NavigationState.RoutePreview))
86-
}
87-
88-
/**
89-
* Fetch Route and Start Active Navigation ThunkAction creator.
90-
*/
91-
fun CoroutineScope.fetchRouteAndStartActiveNavigation(
92-
routeOptionsProvider: RouteOptionsProvider,
93-
mapboxNavigation: MapboxNavigation,
94-
) = fetchRouteAndContinue(routeOptionsProvider, mapboxNavigation) { store ->
95-
val previewRoutes = store.state.value.previewRoutes
96-
if (previewRoutes is RoutePreviewState.Ready) {
97-
store.dispatch(startActiveNavigation(previewRoutes.routes))
98-
}
99-
}
100-
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)
110-
}
111-
}
112-
}
113-
114-
/**
115-
* Dispatch FetchPoints action and wait for RoutePreviewState.Ready.
116-
* Method returns immediately if already in RoutePreviewState.Ready or RoutePreviewState.Fetching, or if
117-
* required location or destination data is missing.
118-
*
119-
* @return `true` once in RoutePreviewState.Ready state, otherwise `false`
120-
*/
121-
private suspend fun fetchRouteIfNeeded(
122-
store: Store,
123-
routeOptionsProvider: RouteOptionsProvider,
124-
mapboxNavigation: MapboxNavigation,
125-
): Boolean {
126-
val storeState = store.state.value
127-
if (storeState.previewRoutes is RoutePreviewState.Ready) return true
128-
if (storeState.previewRoutes is RoutePreviewState.Fetching) return false
129-
130-
return ifNonNull(
131-
storeState.location?.enhancedLocation?.toPoint(),
132-
storeState.destination?.point
133-
) { lastPoint, destination ->
134-
val options = routeOptionsProvider.getOptions(mapboxNavigation, lastPoint, destination)
135-
store.dispatch(RoutePreviewAction.FetchOptions(options))
136-
store.waitWhileFetching()
137-
store.state.value.previewRoutes is RoutePreviewState.Ready
138-
} ?: false
139-
}
140-
141-
private suspend fun Store.waitWhileFetching() {
142-
select { it.previewRoutes }.takeWhile { it is RoutePreviewState.Fetching }.collect()
143-
}
144-
145-
private fun Store.setDestination(point: Point) {
146-
dispatch(DestinationAction.SetDestination(Destination(point)))
68+
private fun Store.setDestination(point: Point?) {
69+
val destination = point?.let { Destination(point) }
70+
dispatch(DestinationAction.SetDestination(destination))
14771
}
14872

14973
private fun Store.setPreviewRoutes(routes: List<NavigationRoute>) {
@@ -153,3 +77,7 @@ private fun Store.setPreviewRoutes(routes: List<NavigationRoute>) {
15377
private fun Store.setRoutes(routes: List<NavigationRoute>) {
15478
dispatch(RoutesAction.SetRoutes(routes))
15579
}
80+
81+
private fun Store.setNavigationState(navState: NavigationState) {
82+
dispatch(NavigationStateAction.Update(navState))
83+
}

0 commit comments

Comments
 (0)