Skip to content

Commit 8bcb928

Browse files
committed
Migrate CarRouteRequest
1 parent 0b00489 commit 8bcb928

File tree

8 files changed

+86
-89
lines changed

8 files changed

+86
-89
lines changed

libnavui-androidauto/src/main/java/com/mapbox/androidauto/car/MainActionStrip.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ class MainActionStrip(
9292
val feedbackPoll = mainCarContext.feedbackPollProvider
9393
.getSearchFeedbackPoll(mainCarContext.carContext)
9494
return PlacesListOnMapScreen(
95-
mainCarContext,
95+
SearchCarContext(mainCarContext),
9696
placesProvider,
9797
PlacesListItemMapper(
9898
PlaceMarkerRenderer(mainCarContext.carContext),

libnavui-androidauto/src/main/java/com/mapbox/androidauto/car/placeslistonmap/PlacesListOnMapScreen.kt

Lines changed: 19 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import androidx.lifecycle.DefaultLifecycleObserver
1212
import androidx.lifecycle.LifecycleOwner
1313
import com.mapbox.androidauto.MapboxCarApp
1414
import com.mapbox.androidauto.R
15-
import com.mapbox.androidauto.car.MainCarContext
1615
import com.mapbox.androidauto.car.action.MapboxActionProvider
1716
import com.mapbox.androidauto.car.location.CarLocationRenderer
1817
import com.mapbox.androidauto.car.navigation.CarLocationsOverviewCamera
@@ -41,21 +40,20 @@ import java.util.concurrent.CopyOnWriteArrayList
4140

4241
@MapboxExperimental
4342
class PlacesListOnMapScreen(
44-
private val mainCarContext: MainCarContext,
43+
private val searchCarContext: SearchCarContext,
4544
private val placesProvider: PlacesListOnMapProvider,
4645
private val placesListItemMapper: PlacesListItemMapper,
4746
private val actionProviders: List<MapboxActionProvider>,
48-
private val searchCarContext: SearchCarContext = SearchCarContext(mainCarContext),
4947
private val placesLayerUtil: PlacesListOnMapLayerUtil = PlacesListOnMapLayerUtil()
50-
) : Screen(mainCarContext.carContext) {
48+
) : Screen(searchCarContext.carContext) {
5149

5250
@VisibleForTesting
5351
var itemList = buildErrorItemList(R.string.car_search_no_results)
5452

5553
private val placeRecords by lazy { CopyOnWriteArrayList<PlaceRecord>() }
56-
private val jobControl by lazy { mainCarContext.getJobControl() }
54+
private val jobControl by lazy { searchCarContext.mainCarContext.getJobControl() }
5755
private val carNavigationCamera = CarLocationsOverviewCamera()
58-
private val locationRenderer = CarLocationRenderer(mainCarContext)
56+
private val locationRenderer = CarLocationRenderer(searchCarContext.mainCarContext)
5957
private var styleLoadedListener: OnStyleLoadedListener? = null
6058

6159
private val surfaceListener = object : MapboxCarMapObserver {
@@ -116,32 +114,32 @@ class PlacesListOnMapScreen(
116114
logAndroidAuto("PlacesListOnMapScreen onCreate")
117115
}
118116

117+
override fun onDestroy(owner: LifecycleOwner) {
118+
logAndroidAuto("PlacesListOnMapScreen onDestroy")
119+
}
120+
119121
override fun onStart(owner: LifecycleOwner) {
120122
logAndroidAuto("PlacesListOnMapScreen onStart")
121123
}
122124

125+
override fun onStop(owner: LifecycleOwner) {
126+
logAndroidAuto("PlacesListOnMapScreen onStop")
127+
}
128+
123129
override fun onResume(owner: LifecycleOwner) {
124130
logAndroidAuto("PlacesListOnMapScreen onResume")
125-
mainCarContext.mapboxCarMap.registerObserver(surfaceListener)
126-
mainCarContext.mapboxCarMap.registerObserver(carNavigationCamera)
127-
mainCarContext.mapboxCarMap.registerObserver(locationRenderer)
131+
searchCarContext.mapboxCarMap.registerObserver(surfaceListener)
132+
searchCarContext.mapboxCarMap.registerObserver(carNavigationCamera)
133+
searchCarContext.mapboxCarMap.registerObserver(locationRenderer)
128134
}
129135

130136
override fun onPause(owner: LifecycleOwner) {
131137
logAndroidAuto("PlacesListOnMapScreen onPause")
132138
placesProvider.cancel()
133139
jobControl.job.cancelChildren()
134-
mainCarContext.mapboxCarMap.unregisterObserver(locationRenderer)
135-
mainCarContext.mapboxCarMap.unregisterObserver(carNavigationCamera)
136-
mainCarContext.mapboxCarMap.unregisterObserver(surfaceListener)
137-
}
138-
139-
override fun onStop(owner: LifecycleOwner) {
140-
logAndroidAuto("PlacesListOnMapScreen onStop")
141-
}
142-
143-
override fun onDestroy(owner: LifecycleOwner) {
144-
logAndroidAuto("PlacesListOnMapScreen onDestroy")
140+
searchCarContext.mapboxCarMap.unregisterObserver(locationRenderer)
141+
searchCarContext.mapboxCarMap.unregisterObserver(carNavigationCamera)
142+
searchCarContext.mapboxCarMap.unregisterObserver(surfaceListener)
145143
}
146144
})
147145
}
@@ -174,7 +172,7 @@ class PlacesListOnMapScreen(
174172

175173
private fun addPlaceIconsToMap(places: List<PlaceRecord>) {
176174
logAndroidAuto("PlacesListOnMapScreen addPlaceIconsToMap with ${places.size} places.")
177-
mainCarContext.mapboxCarMap.carMapSurface?.let { carMapSurface ->
175+
searchCarContext.mapboxCarMap.carMapSurface?.let { carMapSurface ->
178176
val features = places.filter { it.coordinate != null }.map {
179177
Feature.fromGeometry(
180178
Point.fromLngLat(it.coordinate!!.longitude(), it.coordinate.latitude())

libnavui-androidauto/src/main/java/com/mapbox/androidauto/car/preview/CarRouteRequest.kt

Lines changed: 24 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package com.mapbox.androidauto.car.preview
33
import com.mapbox.androidauto.car.search.PlaceRecord
44
import com.mapbox.androidauto.internal.logAndroidAuto
55
import com.mapbox.androidauto.internal.logAndroidAutoFailure
6+
import com.mapbox.androidauto.navigation.location.CarAppLocation
67
import com.mapbox.api.directions.v5.DirectionsCriteria
78
import com.mapbox.api.directions.v5.models.RouteOptions
89
import com.mapbox.geojson.Point
@@ -14,6 +15,8 @@ import com.mapbox.navigation.base.route.RouterCallback
1415
import com.mapbox.navigation.base.route.RouterFailure
1516
import com.mapbox.navigation.base.route.RouterOrigin
1617
import com.mapbox.navigation.core.MapboxNavigation
18+
import com.mapbox.navigation.core.lifecycle.MapboxNavigationApp
19+
import com.mapbox.navigation.core.lifecycle.MapboxNavigationObserver
1720
import com.mapbox.navigation.ui.maps.location.NavigationLocationProvider
1821
import kotlinx.coroutines.suspendCancellableCoroutine
1922
import kotlin.coroutines.resume
@@ -33,51 +36,29 @@ interface CarRouteRequestCallback {
3336
* Service class that requests routes for the preview screen.
3437
*/
3538
class CarRouteRequest(
36-
val mapboxNavigation: MapboxNavigation,
3739
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-
}
40+
) : MapboxNavigationObserver {
41+
private var currentRequestId: Long? = null
42+
private var mapboxNavigation: MapboxNavigation? = null
43+
44+
override fun onAttached(mapboxNavigation: MapboxNavigation) {
45+
this.mapboxNavigation = mapboxNavigation
46+
}
47+
48+
override fun onDetached(mapboxNavigation: MapboxNavigation) {
49+
cancelRequest()
50+
this.mapboxNavigation = null
7051
}
7152

7253
/**
7354
* When a search result was selected, request a route.
74-
*
75-
* @param searchResults potential destinations for directions
7655
*/
7756
fun request(placeRecord: PlaceRecord, callback: CarRouteRequestCallback) {
78-
currentRequestId?.let { mapboxNavigation.cancelRouteRequest(it) }
57+
val mapboxNavigation = this.mapboxNavigation ?: return
58+
cancelRequest()
7959

80-
val location = navigationLocationProvider.lastLocation
60+
val carAppLocation = MapboxNavigationApp.getObserver(CarAppLocation::class)
61+
val location = carAppLocation.navigationLocationProvider.lastLocation
8162
if (location == null) {
8263
logAndroidAutoFailure("CarRouteRequest.onUnknownCurrentLocation")
8364
callback.onUnknownCurrentLocation()
@@ -92,33 +73,33 @@ class CarRouteRequest(
9273
}
9374
else -> {
9475
currentRequestId = mapboxNavigation.requestRoutes(
95-
carRouteOptions(origin, placeRecord.coordinate),
76+
mapboxNavigation.carRouteOptions(origin, placeRecord.coordinate),
9677
carCallbackTransformer(placeRecord, callback)
9778
)
9879
}
9980
}
10081
}
10182

10283
fun cancelRequest() {
103-
currentRequestId?.let { mapboxNavigation.cancelRouteRequest(it) }
84+
currentRequestId?.let { mapboxNavigation?.cancelRouteRequest(it) }
10485
}
10586

10687
/**
10788
* Default [RouteOptions] for the car.
10889
*/
109-
private fun carRouteOptions(origin: Point, destination: Point) = RouteOptions.builder()
90+
private fun MapboxNavigation.carRouteOptions(origin: Point, destination: Point) = 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()

libnavui-androidauto/src/main/java/com/mapbox/androidauto/car/search/PlaceSearchScreen.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ class PlaceSearchScreen(
6666
}
6767

6868
init {
69-
attachCreated(searchCarContext.carPlaceSearch)
69+
attachCreated(searchCarContext.carRouteRequest, searchCarContext.carPlaceSearch)
7070
}
7171

7272
override fun onGetTemplate(): Template {
@@ -133,7 +133,7 @@ class PlaceSearchScreen(
133133
private fun onClickSearch(searchSuggestion: SearchSuggestion) {
134134
logAndroidAuto("onClickSearch $searchSuggestion")
135135
lifecycleScope.launch {
136-
val searchResults = searchCarContext.carPlaceSearch.select(searchSuggestion)
136+
val searchResults = searchCarContext.carPlaceSearch.select(searchSuggestion)!!
137137
.getOrDefault(emptyList())
138138
logAndroidAuto("onClickSearch select ${searchResults.joinToString()}")
139139
if (searchResults.isNotEmpty()) {

libnavui-androidauto/src/main/java/com/mapbox/androidauto/car/search/SearchCarContext.kt

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package com.mapbox.androidauto.car.search
22

3-
import com.mapbox.androidauto.MapboxCarApp
43
import com.mapbox.androidauto.car.MainCarContext
54
import com.mapbox.androidauto.car.preview.CarRouteRequest
65
import com.mapbox.androidauto.internal.car.search.CarPlaceSearch
@@ -19,13 +18,9 @@ class SearchCarContext(
1918
val feedbackPollProvider = mainCarContext.feedbackPollProvider
2019

2120
/** SearchCarContext **/
22-
internal val carPlaceSearch: CarPlaceSearch = CarPlaceSearchImpl(
23-
mainCarContext.carPlaceSearchOptions,
24-
CarSearchLocationProvider()
25-
)
26-
val carRouteRequest = CarRouteRequest(
27-
mainCarContext.mapboxNavigation,
28-
mainCarContext.routeOptionsInterceptor,
29-
MapboxCarApp.carAppLocationService().navigationLocationProvider
21+
val mapboxCarMap = mainCarContext.mapboxCarMap
22+
val carRouteRequest = CarRouteRequest(mainCarContext.routeOptionsInterceptor)
23+
val carPlaceSearch: CarPlaceSearch = CarPlaceSearchImpl(
24+
mainCarContext.carPlaceSearchOptions, CarSearchLocationProvider()
3025
)
3126
}

libnavui-androidauto/src/main/java/com/mapbox/androidauto/deeplink/GeoDeeplinkNavigateAction.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import com.mapbox.androidauto.car.feedback.ui.CarFeedbackAction
99
import com.mapbox.androidauto.car.placeslistonmap.PlaceMarkerRenderer
1010
import com.mapbox.androidauto.car.placeslistonmap.PlacesListItemMapper
1111
import com.mapbox.androidauto.car.placeslistonmap.PlacesListOnMapScreen
12+
import com.mapbox.androidauto.car.search.SearchCarContext
1213
import com.mapbox.androidauto.internal.logAndroidAuto
1314
import com.mapbox.navigation.core.MapboxNavigation
1415
import com.mapbox.navigation.core.geodeeplink.GeoDeeplink
@@ -43,7 +44,7 @@ class GeoDeeplinkNavigateAction(
4344
val feedbackPoll = mainCarContext.feedbackPollProvider
4445
.getSearchFeedbackPoll(mainCarContext.carContext)
4546
return PlacesListOnMapScreen(
46-
mainCarContext,
47+
SearchCarContext(mainCarContext),
4748
placesProvider,
4849
PlacesListItemMapper(
4950
PlaceMarkerRenderer(mainCarContext.carContext),

0 commit comments

Comments
 (0)