Skip to content

Commit 420d326

Browse files
authored
[AndroidAuto] Migrate CarRouteRequest to MapboxNavigationApp (#6372)
* Migrate CarRouteRequest * always call callback
1 parent 4ee3c7f commit 420d326

File tree

10 files changed

+117
-96
lines changed

10 files changed

+117
-96
lines changed

libnavui-androidauto/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ Mapbox welcomes participation and contributions from everyone.
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)
1010
- Marked `CarFeedbackSender`, `CarGridFeedbackScreen`, `CarLocationsOverviewCamera`, `CarNavigationCamera`, `PlacesListItemClickListener`, `PlacesListOnMapLayerUtil`, `PlacesListOnMapScreen`, `CarRoutePreviewScreen`, `CarRouteRequest`, `PlaceSearchScreen`, `MainCarScreen`, `AppAudioGuidanceUtil`, `MapboxCarApp` methods with `@UiThread` annotation. [#6267](https://github.com/mapbox/mapbox-navigation-android/pull/6267)
11+
- Removed `MapboxNavigation` from `CarRouteRequest` constructor. [#6372](https://github.com/mapbox/mapbox-navigation-android/pull/6372)
1112

1213
## androidauto-v0.11.0 - Sep 16, 2022
1314
### 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 @UiThread 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 @UiThread 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 @UiThread 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 @UiThread public void request(com.mapbox.androidauto.car.search.PlaceRecord placeRecord, com.mapbox.androidauto.car.preview.CarRouteRequestCallback callback);
678-
method @UiThread 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
@@ -13,7 +13,6 @@ import androidx.lifecycle.DefaultLifecycleObserver
1313
import androidx.lifecycle.LifecycleOwner
1414
import com.mapbox.androidauto.MapboxCarApp
1515
import com.mapbox.androidauto.R
16-
import com.mapbox.androidauto.car.MainCarContext
1716
import com.mapbox.androidauto.car.action.MapboxActionProvider
1817
import com.mapbox.androidauto.car.location.CarLocationRenderer
1918
import com.mapbox.androidauto.car.navigation.CarLocationsOverviewCamera
@@ -42,21 +41,20 @@ import java.util.concurrent.CopyOnWriteArrayList
4241

4342
@MapboxExperimental
4443
class PlacesListOnMapScreen @UiThread constructor(
45-
private val mainCarContext: MainCarContext,
44+
private val searchCarContext: SearchCarContext,
4645
private val placesProvider: PlacesListOnMapProvider,
4746
private val placesListItemMapper: PlacesListItemMapper,
4847
private val actionProviders: List<MapboxActionProvider>,
49-
private val searchCarContext: SearchCarContext = SearchCarContext(mainCarContext),
5048
private val placesLayerUtil: PlacesListOnMapLayerUtil = PlacesListOnMapLayerUtil()
51-
) : Screen(mainCarContext.carContext) {
49+
) : Screen(searchCarContext.carContext) {
5250

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

5654
private val placeRecords by lazy { CopyOnWriteArrayList<PlaceRecord>() }
57-
private val jobControl by lazy { mainCarContext.getJobControl() }
55+
private val jobControl by lazy { searchCarContext.mainCarContext.getJobControl() }
5856
private val carNavigationCamera = CarLocationsOverviewCamera()
59-
private val locationRenderer = CarLocationRenderer(mainCarContext)
57+
private val locationRenderer = CarLocationRenderer(searchCarContext.mainCarContext)
6058
private var styleLoadedListener: OnStyleLoadedListener? = null
6159

6260
private val surfaceListener = object : MapboxCarMapObserver {
@@ -117,32 +115,32 @@ class PlacesListOnMapScreen @UiThread constructor(
117115
logAndroidAuto("PlacesListOnMapScreen onCreate")
118116
}
119117

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

126+
override fun onStop(owner: LifecycleOwner) {
127+
logAndroidAuto("PlacesListOnMapScreen onStop")
128+
}
129+
124130
override fun onResume(owner: LifecycleOwner) {
125131
logAndroidAuto("PlacesListOnMapScreen onResume")
126-
mainCarContext.mapboxCarMap.registerObserver(surfaceListener)
127-
mainCarContext.mapboxCarMap.registerObserver(carNavigationCamera)
128-
mainCarContext.mapboxCarMap.registerObserver(locationRenderer)
132+
searchCarContext.mapboxCarMap.registerObserver(surfaceListener)
133+
searchCarContext.mapboxCarMap.registerObserver(carNavigationCamera)
134+
searchCarContext.mapboxCarMap.registerObserver(locationRenderer)
129135
}
130136

131137
override fun onPause(owner: LifecycleOwner) {
132138
logAndroidAuto("PlacesListOnMapScreen onPause")
133139
placesProvider.cancel()
134140
jobControl.job.cancelChildren()
135-
mainCarContext.mapboxCarMap.unregisterObserver(locationRenderer)
136-
mainCarContext.mapboxCarMap.unregisterObserver(carNavigationCamera)
137-
mainCarContext.mapboxCarMap.unregisterObserver(surfaceListener)
138-
}
139-
140-
override fun onStop(owner: LifecycleOwner) {
141-
logAndroidAuto("PlacesListOnMapScreen onStop")
142-
}
143-
144-
override fun onDestroy(owner: LifecycleOwner) {
145-
logAndroidAuto("PlacesListOnMapScreen onDestroy")
141+
searchCarContext.mapboxCarMap.unregisterObserver(locationRenderer)
142+
searchCarContext.mapboxCarMap.unregisterObserver(carNavigationCamera)
143+
searchCarContext.mapboxCarMap.unregisterObserver(surfaceListener)
146144
}
147145
})
148146
}
@@ -175,7 +173,7 @@ class PlacesListOnMapScreen @UiThread constructor(
175173

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

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

Lines changed: 31 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import androidx.annotation.UiThread
44
import com.mapbox.androidauto.car.search.PlaceRecord
55
import com.mapbox.androidauto.internal.logAndroidAuto
66
import com.mapbox.androidauto.internal.logAndroidAutoFailure
7+
import com.mapbox.androidauto.navigation.location.CarAppLocation
78
import com.mapbox.api.directions.v5.DirectionsCriteria
89
import com.mapbox.api.directions.v5.models.RouteOptions
910
import com.mapbox.geojson.Point
@@ -15,9 +16,8 @@ import com.mapbox.navigation.base.route.RouterCallback
1516
import com.mapbox.navigation.base.route.RouterFailure
1617
import com.mapbox.navigation.base.route.RouterOrigin
1718
import com.mapbox.navigation.core.MapboxNavigation
18-
import com.mapbox.navigation.ui.maps.location.NavigationLocationProvider
19-
import kotlinx.coroutines.suspendCancellableCoroutine
20-
import kotlin.coroutines.resume
19+
import com.mapbox.navigation.core.lifecycle.MapboxNavigationApp
20+
import com.mapbox.navigation.core.lifecycle.MapboxNavigationObserver
2121

2222
/**
2323
* This is a view interface. Each callback function represents a view that will be
@@ -34,53 +34,34 @@ interface CarRouteRequestCallback {
3434
* Service class that requests routes for the preview screen.
3535
*/
3636
class CarRouteRequest(
37-
val mapboxNavigation: MapboxNavigation,
3837
private val routeOptionsInterceptor: CarRouteOptionsInterceptor,
39-
private val navigationLocationProvider: NavigationLocationProvider,
40-
) {
41-
internal var currentRequestId: Long? = null
38+
) : MapboxNavigationObserver {
39+
private var currentRequestId: Long? = null
40+
private var mapboxNavigation: MapboxNavigation? = null
4241

43-
@UiThread
44-
suspend fun requestSync(placeRecord: PlaceRecord): List<NavigationRoute>? {
45-
return suspendCancellableCoroutine { continuation ->
46-
continuation.invokeOnCancellation { cancelRequest() }
47-
request(
48-
placeRecord,
49-
object : CarRouteRequestCallback {
50-
51-
override fun onRoutesReady(
52-
placeRecord: PlaceRecord,
53-
routes: List<NavigationRoute>
54-
) {
55-
continuation.resume(routes)
56-
}
57-
58-
override fun onUnknownCurrentLocation() {
59-
continuation.resume(value = null)
60-
}
61-
62-
override fun onDestinationLocationUnknown() {
63-
continuation.resume(value = null)
64-
}
65-
66-
override fun onNoRoutesFound() {
67-
continuation.resume(value = null)
68-
}
69-
}
70-
)
71-
}
42+
override fun onAttached(mapboxNavigation: MapboxNavigation) {
43+
this.mapboxNavigation = mapboxNavigation
44+
}
45+
46+
override fun onDetached(mapboxNavigation: MapboxNavigation) {
47+
cancelRequest()
48+
this.mapboxNavigation = null
7249
}
7350

7451
/**
7552
* When a search result was selected, request a route.
76-
*
77-
* @param searchResults potential destinations for directions
7853
*/
7954
@UiThread
8055
fun request(placeRecord: PlaceRecord, callback: CarRouteRequestCallback) {
81-
currentRequestId?.let { mapboxNavigation.cancelRouteRequest(it) }
56+
val mapboxNavigation = this.mapboxNavigation
57+
if (mapboxNavigation == null) {
58+
callback.onNoRoutesFound()
59+
return
60+
}
61+
cancelRequest()
8262

83-
val location = navigationLocationProvider.lastLocation
63+
val carAppLocation = MapboxNavigationApp.getObserver(CarAppLocation::class)
64+
val location = carAppLocation.navigationLocationProvider.lastLocation
8465
if (location == null) {
8566
logAndroidAutoFailure("CarRouteRequest.onUnknownCurrentLocation")
8667
callback.onUnknownCurrentLocation()
@@ -90,12 +71,12 @@ class CarRouteRequest(
9071

9172
when (placeRecord.coordinate) {
9273
null -> {
93-
logAndroidAutoFailure("CarRouteRequest.onSearchResultLocationUnknown")
74+
logAndroidAutoFailure("CarRouteRequest.onDestinationLocationUnknown")
9475
callback.onDestinationLocationUnknown()
9576
}
9677
else -> {
9778
currentRequestId = mapboxNavigation.requestRoutes(
98-
carRouteOptions(origin, placeRecord.coordinate),
79+
mapboxNavigation.carRouteOptions(origin, placeRecord.coordinate),
9980
carCallbackTransformer(placeRecord, callback)
10081
)
10182
}
@@ -104,25 +85,28 @@ class CarRouteRequest(
10485

10586
@UiThread
10687
fun cancelRequest() {
107-
currentRequestId?.let { mapboxNavigation.cancelRouteRequest(it) }
88+
currentRequestId?.let { mapboxNavigation?.cancelRouteRequest(it) }
10889
}
10990

11091
/**
11192
* Default [RouteOptions] for the car.
11293
*/
113-
private fun carRouteOptions(origin: Point, destination: Point) = RouteOptions.builder()
94+
private fun MapboxNavigation.carRouteOptions(
95+
origin: Point,
96+
destination: Point
97+
) = RouteOptions.builder()
11498
.applyDefaultNavigationOptions()
115-
.language(mapboxNavigation.navigationOptions.distanceFormatterOptions.locale.language)
99+
.language(navigationOptions.distanceFormatterOptions.locale.language)
116100
.voiceUnits(
117-
when (mapboxNavigation.navigationOptions.distanceFormatterOptions.unitType) {
101+
when (navigationOptions.distanceFormatterOptions.unitType) {
118102
UnitType.IMPERIAL -> DirectionsCriteria.IMPERIAL
119103
UnitType.METRIC -> DirectionsCriteria.METRIC
120104
},
121105
)
122106
.alternatives(true)
123107
.profile(DirectionsCriteria.PROFILE_DRIVING_TRAFFIC)
124108
.coordinatesList(listOf(origin, destination))
125-
.layersList(listOf(mapboxNavigation.getZLevel(), null))
109+
.layersList(listOf(getZLevel(), null))
126110
.metadata(true)
127111
.let { routeOptionsInterceptor.intercept(it) }
128112
.build()

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ class PlaceSearchScreen @UiThread constructor(
6767
}
6868

6969
init {
70-
attachCreated(searchCarContext.carPlaceSearch)
70+
attachCreated(searchCarContext.carRouteRequest, searchCarContext.carPlaceSearch)
7171
}
7272

7373
override fun onGetTemplate(): Template {

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)