Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions libnavui-androidauto/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ Mapbox welcomes participation and contributions from everyone.
- Use `MapboxAudioGuidance` from public api. [#6336](https://github.com/mapbox/mapbox-navigation-android/pull/6336)
- Fixed an issue that caused camera animations to interfere with user gestures. [#6357](https://github.com/mapbox/mapbox-navigation-android/pull/6357)
- 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)
- Removed `MapboxNavigation` from `CarRouteRequest` constructor. [#6372](https://github.com/mapbox/mapbox-navigation-android/pull/6372)

## androidauto-v0.11.0 - Sep 16, 2022
### Changelog
Expand Down
13 changes: 7 additions & 6 deletions libnavui-androidauto/api/current.txt
Original file line number Diff line number Diff line change
Expand Up @@ -631,7 +631,7 @@ package com.mapbox.androidauto.car.placeslistonmap {
}

@com.mapbox.maps.MapboxExperimental public final class PlacesListOnMapScreen extends androidx.car.app.Screen {
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());
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());
method public androidx.car.app.model.ItemList getItemList();
method public androidx.car.app.model.Template onGetTemplate();
method public void setItemList(androidx.car.app.model.ItemList);
Expand Down Expand Up @@ -670,13 +670,12 @@ package com.mapbox.androidauto.car.preview {
property public final int selectedIndex;
}

public final class CarRouteRequest {
ctor public CarRouteRequest(com.mapbox.navigation.core.MapboxNavigation mapboxNavigation, com.mapbox.androidauto.car.preview.CarRouteOptionsInterceptor routeOptionsInterceptor, com.mapbox.navigation.ui.maps.location.NavigationLocationProvider navigationLocationProvider);
public final class CarRouteRequest implements com.mapbox.navigation.core.lifecycle.MapboxNavigationObserver {
ctor public CarRouteRequest(com.mapbox.androidauto.car.preview.CarRouteOptionsInterceptor routeOptionsInterceptor);
method @UiThread public void cancelRequest();
method public com.mapbox.navigation.core.MapboxNavigation getMapboxNavigation();
method public void onAttached(com.mapbox.navigation.core.MapboxNavigation mapboxNavigation);
method public void onDetached(com.mapbox.navigation.core.MapboxNavigation mapboxNavigation);
method @UiThread public void request(com.mapbox.androidauto.car.search.PlaceRecord placeRecord, com.mapbox.androidauto.car.preview.CarRouteRequestCallback callback);
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>>);
property public final com.mapbox.navigation.core.MapboxNavigation mapboxNavigation;
}

public interface CarRouteRequestCallback {
Expand Down Expand Up @@ -789,11 +788,13 @@ package com.mapbox.androidauto.car.search {
method public com.mapbox.navigation.base.formatter.DistanceFormatter getDistanceFormatter();
method public com.mapbox.androidauto.car.feedback.core.CarFeedbackPollProvider getFeedbackPollProvider();
method public com.mapbox.androidauto.car.MainCarContext getMainCarContext();
method public com.mapbox.maps.extension.androidauto.MapboxCarMap getMapboxCarMap();
property public final androidx.car.app.CarContext carContext;
property public final com.mapbox.androidauto.car.preview.CarRouteRequest carRouteRequest;
property public final com.mapbox.navigation.base.formatter.DistanceFormatter distanceFormatter;
property public final com.mapbox.androidauto.car.feedback.core.CarFeedbackPollProvider feedbackPollProvider;
property public final com.mapbox.androidauto.car.MainCarContext mainCarContext;
property public final com.mapbox.maps.extension.androidauto.MapboxCarMap mapboxCarMap;
}

}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ class MainActionStrip(
val feedbackPoll = mainCarContext.feedbackPollProvider
.getSearchFeedbackPoll(mainCarContext.carContext)
return PlacesListOnMapScreen(
mainCarContext,
SearchCarContext(mainCarContext),
placesProvider,
PlacesListItemMapper(
PlaceMarkerRenderer(mainCarContext.carContext),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ import androidx.lifecycle.DefaultLifecycleObserver
import androidx.lifecycle.LifecycleOwner
import com.mapbox.androidauto.MapboxCarApp
import com.mapbox.androidauto.R
import com.mapbox.androidauto.car.MainCarContext
import com.mapbox.androidauto.car.action.MapboxActionProvider
import com.mapbox.androidauto.car.location.CarLocationRenderer
import com.mapbox.androidauto.car.navigation.CarLocationsOverviewCamera
Expand Down Expand Up @@ -42,21 +41,20 @@ import java.util.concurrent.CopyOnWriteArrayList

@MapboxExperimental
class PlacesListOnMapScreen @UiThread constructor(
private val mainCarContext: MainCarContext,
private val searchCarContext: SearchCarContext,
private val placesProvider: PlacesListOnMapProvider,
private val placesListItemMapper: PlacesListItemMapper,
private val actionProviders: List<MapboxActionProvider>,
private val searchCarContext: SearchCarContext = SearchCarContext(mainCarContext),
private val placesLayerUtil: PlacesListOnMapLayerUtil = PlacesListOnMapLayerUtil()
) : Screen(mainCarContext.carContext) {
) : Screen(searchCarContext.carContext) {

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

private val placeRecords by lazy { CopyOnWriteArrayList<PlaceRecord>() }
private val jobControl by lazy { mainCarContext.getJobControl() }
private val jobControl by lazy { searchCarContext.mainCarContext.getJobControl() }
private val carNavigationCamera = CarLocationsOverviewCamera()
private val locationRenderer = CarLocationRenderer(mainCarContext)
private val locationRenderer = CarLocationRenderer(searchCarContext.mainCarContext)
private var styleLoadedListener: OnStyleLoadedListener? = null

private val surfaceListener = object : MapboxCarMapObserver {
Expand Down Expand Up @@ -117,32 +115,32 @@ class PlacesListOnMapScreen @UiThread constructor(
logAndroidAuto("PlacesListOnMapScreen onCreate")
}

override fun onDestroy(owner: LifecycleOwner) {
logAndroidAuto("PlacesListOnMapScreen onDestroy")
}

override fun onStart(owner: LifecycleOwner) {
logAndroidAuto("PlacesListOnMapScreen onStart")
}

override fun onStop(owner: LifecycleOwner) {
logAndroidAuto("PlacesListOnMapScreen onStop")
}

override fun onResume(owner: LifecycleOwner) {
logAndroidAuto("PlacesListOnMapScreen onResume")
mainCarContext.mapboxCarMap.registerObserver(surfaceListener)
mainCarContext.mapboxCarMap.registerObserver(carNavigationCamera)
mainCarContext.mapboxCarMap.registerObserver(locationRenderer)
searchCarContext.mapboxCarMap.registerObserver(surfaceListener)
searchCarContext.mapboxCarMap.registerObserver(carNavigationCamera)
searchCarContext.mapboxCarMap.registerObserver(locationRenderer)
}

override fun onPause(owner: LifecycleOwner) {
logAndroidAuto("PlacesListOnMapScreen onPause")
placesProvider.cancel()
jobControl.job.cancelChildren()
mainCarContext.mapboxCarMap.unregisterObserver(locationRenderer)
mainCarContext.mapboxCarMap.unregisterObserver(carNavigationCamera)
mainCarContext.mapboxCarMap.unregisterObserver(surfaceListener)
}

override fun onStop(owner: LifecycleOwner) {
logAndroidAuto("PlacesListOnMapScreen onStop")
}

override fun onDestroy(owner: LifecycleOwner) {
logAndroidAuto("PlacesListOnMapScreen onDestroy")
searchCarContext.mapboxCarMap.unregisterObserver(locationRenderer)
searchCarContext.mapboxCarMap.unregisterObserver(carNavigationCamera)
searchCarContext.mapboxCarMap.unregisterObserver(surfaceListener)
}
})
}
Expand Down Expand Up @@ -175,7 +173,7 @@ class PlacesListOnMapScreen @UiThread constructor(

private fun addPlaceIconsToMap(places: List<PlaceRecord>) {
logAndroidAuto("PlacesListOnMapScreen addPlaceIconsToMap with ${places.size} places.")
mainCarContext.mapboxCarMap.carMapSurface?.let { carMapSurface ->
searchCarContext.mapboxCarMap.carMapSurface?.let { carMapSurface ->
val features = places.filter { it.coordinate != null }.map {
Feature.fromGeometry(
Point.fromLngLat(it.coordinate!!.longitude(), it.coordinate.latitude())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import androidx.annotation.UiThread
import com.mapbox.androidauto.car.search.PlaceRecord
import com.mapbox.androidauto.internal.logAndroidAuto
import com.mapbox.androidauto.internal.logAndroidAutoFailure
import com.mapbox.androidauto.navigation.location.CarAppLocation
import com.mapbox.api.directions.v5.DirectionsCriteria
import com.mapbox.api.directions.v5.models.RouteOptions
import com.mapbox.geojson.Point
Expand All @@ -15,9 +16,8 @@ import com.mapbox.navigation.base.route.RouterCallback
import com.mapbox.navigation.base.route.RouterFailure
import com.mapbox.navigation.base.route.RouterOrigin
import com.mapbox.navigation.core.MapboxNavigation
import com.mapbox.navigation.ui.maps.location.NavigationLocationProvider
import kotlinx.coroutines.suspendCancellableCoroutine
import kotlin.coroutines.resume
import com.mapbox.navigation.core.lifecycle.MapboxNavigationApp
import com.mapbox.navigation.core.lifecycle.MapboxNavigationObserver

/**
* This is a view interface. Each callback function represents a view that will be
Expand All @@ -34,53 +34,34 @@ interface CarRouteRequestCallback {
* Service class that requests routes for the preview screen.
*/
class CarRouteRequest(
val mapboxNavigation: MapboxNavigation,
private val routeOptionsInterceptor: CarRouteOptionsInterceptor,
private val navigationLocationProvider: NavigationLocationProvider,
) {
internal var currentRequestId: Long? = null
) : MapboxNavigationObserver {
private var currentRequestId: Long? = null
private var mapboxNavigation: MapboxNavigation? = null

@UiThread
suspend fun requestSync(placeRecord: PlaceRecord): List<NavigationRoute>? {
return suspendCancellableCoroutine { continuation ->
continuation.invokeOnCancellation { cancelRequest() }
request(
placeRecord,
object : CarRouteRequestCallback {

override fun onRoutesReady(
placeRecord: PlaceRecord,
routes: List<NavigationRoute>
) {
continuation.resume(routes)
}

override fun onUnknownCurrentLocation() {
continuation.resume(value = null)
}

override fun onDestinationLocationUnknown() {
continuation.resume(value = null)
}

override fun onNoRoutesFound() {
continuation.resume(value = null)
}
}
)
}
override fun onAttached(mapboxNavigation: MapboxNavigation) {
this.mapboxNavigation = mapboxNavigation
}

override fun onDetached(mapboxNavigation: MapboxNavigation) {
cancelRequest()
this.mapboxNavigation = null
}

/**
* When a search result was selected, request a route.
*
* @param searchResults potential destinations for directions
*/
@UiThread
fun request(placeRecord: PlaceRecord, callback: CarRouteRequestCallback) {
currentRequestId?.let { mapboxNavigation.cancelRouteRequest(it) }
val mapboxNavigation = this.mapboxNavigation
if (mapboxNavigation == null) {
callback.onNoRoutesFound()
return
}
cancelRequest()

val location = navigationLocationProvider.lastLocation
val carAppLocation = MapboxNavigationApp.getObserver(CarAppLocation::class)
val location = carAppLocation.navigationLocationProvider.lastLocation
if (location == null) {
logAndroidAutoFailure("CarRouteRequest.onUnknownCurrentLocation")
callback.onUnknownCurrentLocation()
Expand All @@ -90,12 +71,12 @@ class CarRouteRequest(

when (placeRecord.coordinate) {
null -> {
logAndroidAutoFailure("CarRouteRequest.onSearchResultLocationUnknown")
logAndroidAutoFailure("CarRouteRequest.onDestinationLocationUnknown")
callback.onDestinationLocationUnknown()
}
else -> {
currentRequestId = mapboxNavigation.requestRoutes(
carRouteOptions(origin, placeRecord.coordinate),
mapboxNavigation.carRouteOptions(origin, placeRecord.coordinate),
carCallbackTransformer(placeRecord, callback)
)
}
Expand All @@ -104,25 +85,28 @@ class CarRouteRequest(

@UiThread
fun cancelRequest() {
currentRequestId?.let { mapboxNavigation.cancelRouteRequest(it) }
currentRequestId?.let { mapboxNavigation?.cancelRouteRequest(it) }
}

/**
* Default [RouteOptions] for the car.
*/
private fun carRouteOptions(origin: Point, destination: Point) = RouteOptions.builder()
private fun MapboxNavigation.carRouteOptions(
origin: Point,
destination: Point
) = RouteOptions.builder()
.applyDefaultNavigationOptions()
.language(mapboxNavigation.navigationOptions.distanceFormatterOptions.locale.language)
.language(navigationOptions.distanceFormatterOptions.locale.language)
.voiceUnits(
when (mapboxNavigation.navigationOptions.distanceFormatterOptions.unitType) {
when (navigationOptions.distanceFormatterOptions.unitType) {
UnitType.IMPERIAL -> DirectionsCriteria.IMPERIAL
UnitType.METRIC -> DirectionsCriteria.METRIC
},
)
.alternatives(true)
.profile(DirectionsCriteria.PROFILE_DRIVING_TRAFFIC)
.coordinatesList(listOf(origin, destination))
.layersList(listOf(mapboxNavigation.getZLevel(), null))
.layersList(listOf(getZLevel(), null))
.metadata(true)
.let { routeOptionsInterceptor.intercept(it) }
.build()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ class PlaceSearchScreen @UiThread constructor(
}

init {
attachCreated(searchCarContext.carPlaceSearch)
attachCreated(searchCarContext.carRouteRequest, searchCarContext.carPlaceSearch)
}

override fun onGetTemplate(): Template {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.mapbox.androidauto.car.search

import com.mapbox.androidauto.MapboxCarApp
import com.mapbox.androidauto.car.MainCarContext
import com.mapbox.androidauto.car.preview.CarRouteRequest
import com.mapbox.androidauto.internal.car.search.CarPlaceSearch
Expand All @@ -19,13 +18,10 @@ class SearchCarContext(
val feedbackPollProvider = mainCarContext.feedbackPollProvider

/** SearchCarContext **/
val mapboxCarMap = mainCarContext.mapboxCarMap
val carRouteRequest = CarRouteRequest(mainCarContext.routeOptionsInterceptor)
internal val carPlaceSearch: CarPlaceSearch = CarPlaceSearchImpl(
mainCarContext.carPlaceSearchOptions,
CarSearchLocationProvider()
)
val carRouteRequest = CarRouteRequest(
mainCarContext.mapboxNavigation,
mainCarContext.routeOptionsInterceptor,
MapboxCarApp.carAppLocationService().navigationLocationProvider
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import com.mapbox.androidauto.car.feedback.ui.CarFeedbackAction
import com.mapbox.androidauto.car.placeslistonmap.PlaceMarkerRenderer
import com.mapbox.androidauto.car.placeslistonmap.PlacesListItemMapper
import com.mapbox.androidauto.car.placeslistonmap.PlacesListOnMapScreen
import com.mapbox.androidauto.car.search.SearchCarContext
import com.mapbox.androidauto.internal.logAndroidAuto
import com.mapbox.navigation.core.MapboxNavigation
import com.mapbox.navigation.core.geodeeplink.GeoDeeplink
Expand Down Expand Up @@ -43,7 +44,7 @@ class GeoDeeplinkNavigateAction(
val feedbackPoll = mainCarContext.feedbackPollProvider
.getSearchFeedbackPoll(mainCarContext.carContext)
return PlacesListOnMapScreen(
mainCarContext,
SearchCarContext(mainCarContext),
placesProvider,
PlacesListItemMapper(
PlaceMarkerRenderer(mainCarContext.carContext),
Expand Down
Loading