Skip to content

Commit 6962b9b

Browse files
committed
Migrate CarRouteRequest
1 parent 0b00489 commit 6962b9b

File tree

10 files changed

+95
-96
lines changed

10 files changed

+95
-96
lines changed

libnavui-androidauto/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ Mapbox welcomes participation and contributions from everyone.
77
#### Bug fixes and improvements
88
- Use `MapboxAudioGuidance` from public api. [#6336](https://github.com/mapbox/mapbox-navigation-android/pull/6336)
99
- Fixed an issue that caused camera animations to interfere with user gestures. [#6357](https://github.com/mapbox/mapbox-navigation-android/pull/6357)
10+
- Removed `MapboxNavigation` from `CarRouteRequest` constructor. [#6372](https://github.com/mapbox/mapbox-navigation-android/pull/6372)
1011

1112
## androidauto-v0.11.0 - Sep 16, 2022
1213
### Changelog

libnavui-androidauto/api/current.txt

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -631,7 +631,7 @@ package com.mapbox.androidauto.car.placeslistonmap {
631631
}
632632

633633
@com.mapbox.maps.MapboxExperimental public final class PlacesListOnMapScreen extends androidx.car.app.Screen {
634-
ctor public PlacesListOnMapScreen(com.mapbox.androidauto.car.MainCarContext mainCarContext, com.mapbox.androidauto.car.placeslistonmap.PlacesListOnMapProvider placesProvider, com.mapbox.androidauto.car.placeslistonmap.PlacesListItemMapper placesListItemMapper, java.util.List<? extends com.mapbox.androidauto.car.action.MapboxActionProvider> actionProviders, com.mapbox.androidauto.car.search.SearchCarContext searchCarContext = com.mapbox.androidauto.car.search.SearchCarContext(mainCarContext), com.mapbox.androidauto.car.placeslistonmap.PlacesListOnMapLayerUtil placesLayerUtil = com.mapbox.androidauto.car.placeslistonmap.PlacesListOnMapLayerUtil());
634+
ctor public PlacesListOnMapScreen(com.mapbox.androidauto.car.search.SearchCarContext searchCarContext, com.mapbox.androidauto.car.placeslistonmap.PlacesListOnMapProvider placesProvider, com.mapbox.androidauto.car.placeslistonmap.PlacesListItemMapper placesListItemMapper, java.util.List<? extends com.mapbox.androidauto.car.action.MapboxActionProvider> actionProviders, com.mapbox.androidauto.car.placeslistonmap.PlacesListOnMapLayerUtil placesLayerUtil = com.mapbox.androidauto.car.placeslistonmap.PlacesListOnMapLayerUtil());
635635
method public androidx.car.app.model.ItemList getItemList();
636636
method public androidx.car.app.model.Template onGetTemplate();
637637
method public void setItemList(androidx.car.app.model.ItemList);
@@ -670,13 +670,12 @@ package com.mapbox.androidauto.car.preview {
670670
property public final int selectedIndex;
671671
}
672672

673-
public final class CarRouteRequest {
674-
ctor public CarRouteRequest(com.mapbox.navigation.core.MapboxNavigation mapboxNavigation, com.mapbox.androidauto.car.preview.CarRouteOptionsInterceptor routeOptionsInterceptor, com.mapbox.navigation.ui.maps.location.NavigationLocationProvider navigationLocationProvider);
673+
public final class CarRouteRequest implements com.mapbox.navigation.core.lifecycle.MapboxNavigationObserver {
674+
ctor public CarRouteRequest(com.mapbox.androidauto.car.preview.CarRouteOptionsInterceptor routeOptionsInterceptor);
675675
method public void cancelRequest();
676-
method public com.mapbox.navigation.core.MapboxNavigation getMapboxNavigation();
676+
method public void onAttached(com.mapbox.navigation.core.MapboxNavigation mapboxNavigation);
677+
method public void onDetached(com.mapbox.navigation.core.MapboxNavigation mapboxNavigation);
677678
method public void request(com.mapbox.androidauto.car.search.PlaceRecord placeRecord, com.mapbox.androidauto.car.preview.CarRouteRequestCallback callback);
678-
method public suspend Object? requestSync(com.mapbox.androidauto.car.search.PlaceRecord placeRecord, kotlin.coroutines.Continuation<? super java.util.List<? extends com.mapbox.navigation.base.route.NavigationRoute>>);
679-
property public final com.mapbox.navigation.core.MapboxNavigation mapboxNavigation;
680679
}
681680

682681
public interface CarRouteRequestCallback {
@@ -789,11 +788,13 @@ package com.mapbox.androidauto.car.search {
789788
method public com.mapbox.navigation.base.formatter.DistanceFormatter getDistanceFormatter();
790789
method public com.mapbox.androidauto.car.feedback.core.CarFeedbackPollProvider getFeedbackPollProvider();
791790
method public com.mapbox.androidauto.car.MainCarContext getMainCarContext();
791+
method public com.mapbox.maps.extension.androidauto.MapboxCarMap getMapboxCarMap();
792792
property public final androidx.car.app.CarContext carContext;
793793
property public final com.mapbox.androidauto.car.preview.CarRouteRequest carRouteRequest;
794794
property public final com.mapbox.navigation.base.formatter.DistanceFormatter distanceFormatter;
795795
property public final com.mapbox.androidauto.car.feedback.core.CarFeedbackPollProvider feedbackPollProvider;
796796
property public final com.mapbox.androidauto.car.MainCarContext mainCarContext;
797+
property public final com.mapbox.maps.extension.androidauto.MapboxCarMap mapboxCarMap;
797798
}
798799

799800
}

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: 27 additions & 46 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,9 +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
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
*/
3535
class 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()

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: 2 additions & 6 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,10 @@ class SearchCarContext(
1918
val feedbackPollProvider = mainCarContext.feedbackPollProvider
2019

2120
/** SearchCarContext **/
21+
val mapboxCarMap = mainCarContext.mapboxCarMap
22+
val carRouteRequest = CarRouteRequest(mainCarContext.routeOptionsInterceptor)
2223
internal val carPlaceSearch: CarPlaceSearch = CarPlaceSearchImpl(
2324
mainCarContext.carPlaceSearchOptions,
2425
CarSearchLocationProvider()
2526
)
26-
val carRouteRequest = CarRouteRequest(
27-
mainCarContext.mapboxNavigation,
28-
mainCarContext.routeOptionsInterceptor,
29-
MapboxCarApp.carAppLocationService().navigationLocationProvider
30-
)
3127
}

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)