@@ -2,40 +2,30 @@ package com.mapbox.navigation.ui.app.internal
22
33import com.mapbox.geojson.Point
44import com.mapbox.navigation.base.route.NavigationRoute
5- import com.mapbox.navigation.core.MapboxNavigation
65import com.mapbox.navigation.ui.app.internal.destination.Destination
76import com.mapbox.navigation.ui.app.internal.destination.DestinationAction
87import com.mapbox.navigation.ui.app.internal.extension.ThunkAction
9- import com.mapbox.navigation.ui.app.internal.extension.dispatch
108import com.mapbox.navigation.ui.app.internal.navigation.NavigationState
119import com.mapbox.navigation.ui.app.internal.navigation.NavigationStateAction
12- import com.mapbox.navigation.ui.app.internal.routefetch.RouteOptionsProvider
1310import com.mapbox.navigation.ui.app.internal.routefetch.RoutePreviewAction
14- import com.mapbox.navigation.ui.app.internal.routefetch.RoutePreviewState
1511import 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 */
2616fun 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 */
3626fun 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 ->
4434fun 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 */
5343fun 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
14973private fun Store.setPreviewRoutes (routes : List <NavigationRoute >) {
@@ -153,3 +77,7 @@ private fun Store.setPreviewRoutes(routes: List<NavigationRoute>) {
15377private 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