@@ -3,6 +3,7 @@ package com.mapbox.androidauto.car.preview
33import com.mapbox.androidauto.car.search.PlaceRecord
44import com.mapbox.androidauto.internal.logAndroidAuto
55import com.mapbox.androidauto.internal.logAndroidAutoFailure
6+ import com.mapbox.androidauto.navigation.location.CarAppLocation
67import com.mapbox.api.directions.v5.DirectionsCriteria
78import com.mapbox.api.directions.v5.models.RouteOptions
89import com.mapbox.geojson.Point
@@ -14,9 +15,8 @@ import com.mapbox.navigation.base.route.RouterCallback
1415import com.mapbox.navigation.base.route.RouterFailure
1516import com.mapbox.navigation.base.route.RouterOrigin
1617import com.mapbox.navigation.core.MapboxNavigation
17- import com.mapbox.navigation.ui.maps.location.NavigationLocationProvider
18- import kotlinx.coroutines.suspendCancellableCoroutine
19- import kotlin.coroutines.resume
18+ import com.mapbox.navigation.core.lifecycle.MapboxNavigationApp
19+ import com.mapbox.navigation.core.lifecycle.MapboxNavigationObserver
2020
2121/* *
2222 * This is a view interface. Each callback function represents a view that will be
@@ -33,51 +33,29 @@ interface CarRouteRequestCallback {
3333 * Service class that requests routes for the preview screen.
3434 */
3535class CarRouteRequest (
36- val mapboxNavigation : MapboxNavigation ,
3736 private val routeOptionsInterceptor : CarRouteOptionsInterceptor ,
38- private val navigationLocationProvider : NavigationLocationProvider ,
39- ) {
40- internal var currentRequestId: Long? = null
41-
42- suspend fun requestSync (placeRecord : PlaceRecord ): List <NavigationRoute >? {
43- return suspendCancellableCoroutine { continuation ->
44- continuation.invokeOnCancellation { cancelRequest() }
45- request(
46- placeRecord,
47- object : CarRouteRequestCallback {
48-
49- override fun onRoutesReady (
50- placeRecord : PlaceRecord ,
51- routes : List <NavigationRoute >
52- ) {
53- continuation.resume(routes)
54- }
55-
56- override fun onUnknownCurrentLocation () {
57- continuation.resume(value = null )
58- }
59-
60- override fun onDestinationLocationUnknown () {
61- continuation.resume(value = null )
62- }
63-
64- override fun onNoRoutesFound () {
65- continuation.resume(value = null )
66- }
67- }
68- )
69- }
37+ ) : MapboxNavigationObserver {
38+ private var currentRequestId: Long? = null
39+ private var mapboxNavigation: MapboxNavigation ? = null
40+
41+ override fun onAttached (mapboxNavigation : MapboxNavigation ) {
42+ this .mapboxNavigation = mapboxNavigation
43+ }
44+
45+ override fun onDetached (mapboxNavigation : MapboxNavigation ) {
46+ cancelRequest()
47+ this .mapboxNavigation = null
7048 }
7149
7250 /* *
7351 * When a search result was selected, request a route.
74- *
75- * @param searchResults potential destinations for directions
7652 */
7753 fun request (placeRecord : PlaceRecord , callback : CarRouteRequestCallback ) {
78- currentRequestId?.let { mapboxNavigation.cancelRouteRequest(it) }
54+ val mapboxNavigation = this .mapboxNavigation ? : return
55+ cancelRequest()
7956
80- val location = navigationLocationProvider.lastLocation
57+ val carAppLocation = MapboxNavigationApp .getObserver(CarAppLocation ::class )
58+ val location = carAppLocation.navigationLocationProvider.lastLocation
8159 if (location == null ) {
8260 logAndroidAutoFailure(" CarRouteRequest.onUnknownCurrentLocation" )
8361 callback.onUnknownCurrentLocation()
@@ -92,33 +70,36 @@ class CarRouteRequest(
9270 }
9371 else -> {
9472 currentRequestId = mapboxNavigation.requestRoutes(
95- carRouteOptions(origin, placeRecord.coordinate),
73+ mapboxNavigation. carRouteOptions(origin, placeRecord.coordinate),
9674 carCallbackTransformer(placeRecord, callback)
9775 )
9876 }
9977 }
10078 }
10179
10280 fun cancelRequest () {
103- currentRequestId?.let { mapboxNavigation.cancelRouteRequest(it) }
81+ currentRequestId?.let { mapboxNavigation? .cancelRouteRequest(it) }
10482 }
10583
10684 /* *
10785 * Default [RouteOptions] for the car.
10886 */
109- private fun carRouteOptions (origin : Point , destination : Point ) = RouteOptions .builder()
87+ private fun MapboxNavigation.carRouteOptions (
88+ origin : Point ,
89+ destination : Point
90+ ) = RouteOptions .builder()
11091 .applyDefaultNavigationOptions()
111- .language(mapboxNavigation. navigationOptions.distanceFormatterOptions.locale.language)
92+ .language(navigationOptions.distanceFormatterOptions.locale.language)
11293 .voiceUnits(
113- when (mapboxNavigation. navigationOptions.distanceFormatterOptions.unitType) {
94+ when (navigationOptions.distanceFormatterOptions.unitType) {
11495 UnitType .IMPERIAL -> DirectionsCriteria .IMPERIAL
11596 UnitType .METRIC -> DirectionsCriteria .METRIC
11697 },
11798 )
11899 .alternatives(true )
119100 .profile(DirectionsCriteria .PROFILE_DRIVING_TRAFFIC )
120101 .coordinatesList(listOf (origin, destination))
121- .layersList(listOf (mapboxNavigation. getZLevel(), null ))
102+ .layersList(listOf (getZLevel(), null ))
122103 .metadata(true )
123104 .let { routeOptionsInterceptor.intercept(it) }
124105 .build()
0 commit comments