Skip to content

Commit

Permalink
add an option to override route options used by android auto
Browse files Browse the repository at this point in the history
  • Loading branch information
Zayankovsky committed Aug 11, 2022
1 parent 3d5014f commit 253b03a
Show file tree
Hide file tree
Showing 8 changed files with 58 additions and 51 deletions.
1 change: 1 addition & 0 deletions libnavui-androidauto/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ Mapbox welcomes participation and contributions from everyone.
- Bumped maps extension version to fix AAOS issue when changing screens. [#6139](https://github.com/mapbox/mapbox-navigation-android/pull/6139)
- Added an option to override items displayed in the feedback screen. [#6144](https://github.com/mapbox/mapbox-navigation-android/pull/6144)
- Fixed an issue with alternative route line not vanishing. [#6153](https://github.com/mapbox/mapbox-navigation-android/pull/6153)
- Added an option to override route options used for route requests. [#6153](https://github.com/mapbox/mapbox-navigation-android/pull/6153)

## androidauto-v0.6.0 - Jul 29, 2022
### Changelog
Expand Down
15 changes: 11 additions & 4 deletions libnavui-androidauto/api/current.txt
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,10 @@ package com.mapbox.androidauto.car {
}

public final class MainCarContext {
ctor public MainCarContext(androidx.car.app.CarContext carContext, com.mapbox.maps.extension.androidauto.MapboxCarMap mapboxCarMap, com.mapbox.search.SearchEngine searchEngine, com.mapbox.androidauto.car.feedback.core.CarFeedbackPollProvider feedbackPollProvider = com.mapbox.androidauto.car.feedback.core.CarFeedbackPollProvider());
ctor public MainCarContext(androidx.car.app.CarContext carContext, com.mapbox.maps.extension.androidauto.MapboxCarMap mapboxCarMap, com.mapbox.search.SearchEngine searchEngine, com.mapbox.androidauto.car.feedback.core.CarFeedbackPollProvider feedbackPollProvider = com.mapbox.androidauto.car.feedback.core.CarFeedbackPollProvider(), com.mapbox.androidauto.car.preview.CarRouteOptionsInterceptor routeOptionsInterceptor = CarRouteOptionsInterceptor({ var it: com.mapbox.api.directions.v5.models.RouteOptions.Builder ->

return it
}));
method public androidx.car.app.CarContext getCarContext();
method public com.mapbox.androidauto.car.settings.CarSettingsStorage getCarSettingsStorage();
method public com.mapbox.navigation.base.formatter.DistanceFormatter getDistanceFormatter();
Expand All @@ -58,7 +61,7 @@ package com.mapbox.androidauto.car {
method public com.mapbox.navigation.ui.maneuver.api.MapboxManeuverApi getManeuverApi();
method public com.mapbox.maps.extension.androidauto.MapboxCarMap getMapboxCarMap();
method public com.mapbox.navigation.core.MapboxNavigation getMapboxNavigation();
method public kotlinx.coroutines.flow.MutableStateFlow<java.lang.Boolean> getRouteAlternativesEnabled();
method public com.mapbox.androidauto.car.preview.CarRouteOptionsInterceptor getRouteOptionsInterceptor();
method public com.mapbox.search.SearchEngine getSearchEngine();
property public final androidx.car.app.CarContext carContext;
property public final com.mapbox.androidauto.car.settings.CarSettingsStorage carSettingsStorage;
Expand All @@ -67,7 +70,7 @@ package com.mapbox.androidauto.car {
property public final com.mapbox.navigation.ui.maneuver.api.MapboxManeuverApi maneuverApi;
property public final com.mapbox.maps.extension.androidauto.MapboxCarMap mapboxCarMap;
property public final com.mapbox.navigation.core.MapboxNavigation mapboxNavigation;
property public final kotlinx.coroutines.flow.MutableStateFlow<java.lang.Boolean> routeAlternativesEnabled;
property public final com.mapbox.androidauto.car.preview.CarRouteOptionsInterceptor routeOptionsInterceptor;
property public final com.mapbox.search.SearchEngine searchEngine;
}

Expand Down Expand Up @@ -620,6 +623,10 @@ package com.mapbox.androidauto.car.preview {
property public final com.mapbox.androidauto.car.MainCarContext mainCarContext;
}

public fun interface CarRouteOptionsInterceptor {
method public com.mapbox.api.directions.v5.models.RouteOptions.Builder intercept(com.mapbox.api.directions.v5.models.RouteOptions.Builder builder);
}

@com.mapbox.maps.MapboxExperimental public final class CarRoutePreviewScreen extends androidx.car.app.Screen {
ctor public CarRoutePreviewScreen(com.mapbox.androidauto.car.preview.RoutePreviewCarContext routePreviewCarContext, com.mapbox.androidauto.car.search.PlaceRecord placeRecord, java.util.List<com.mapbox.navigation.base.route.NavigationRoute> navigationRoutes, com.mapbox.androidauto.car.placeslistonmap.PlacesListOnMapLayerUtil placesLayerUtil = com.mapbox.androidauto.car.placeslistonmap.PlacesListOnMapLayerUtil());
method public com.mapbox.androidauto.car.location.CarLocationRenderer getCarLocationRenderer();
Expand All @@ -637,7 +644,7 @@ package com.mapbox.androidauto.car.preview {
}

public final class CarRouteRequest {
ctor public CarRouteRequest(com.mapbox.navigation.core.MapboxNavigation mapboxNavigation, com.mapbox.navigation.ui.maps.location.NavigationLocationProvider navigationLocationProvider);
ctor public CarRouteRequest(com.mapbox.navigation.core.MapboxNavigation mapboxNavigation, com.mapbox.androidauto.car.preview.CarRouteOptionsInterceptor routeOptionsInterceptor, com.mapbox.navigation.ui.maps.location.NavigationLocationProvider navigationLocationProvider);
method public void cancelRequest();
method public com.mapbox.navigation.core.MapboxNavigation getMapboxNavigation();
method public void request(com.mapbox.androidauto.car.search.PlaceRecord placeRecord, com.mapbox.androidauto.car.preview.CarRouteRequestCallback callback);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package com.mapbox.androidauto.car

import androidx.car.app.CarContext
import com.mapbox.androidauto.car.feedback.core.CarFeedbackPollProvider
import com.mapbox.androidauto.car.preview.CarRouteOptionsInterceptor
import com.mapbox.androidauto.car.settings.CarSettingsStorage
import com.mapbox.maps.MapboxExperimental
import com.mapbox.maps.extension.androidauto.MapboxCarMap
Expand All @@ -15,14 +16,14 @@ import com.mapbox.search.SearchEngine
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.SupervisorJob
import kotlinx.coroutines.flow.MutableStateFlow

@OptIn(MapboxExperimental::class)
class MainCarContext(
val carContext: CarContext,
val mapboxCarMap: MapboxCarMap,
val searchEngine: SearchEngine,
val feedbackPollProvider: CarFeedbackPollProvider = CarFeedbackPollProvider(),
val routeOptionsInterceptor: CarRouteOptionsInterceptor = CarRouteOptionsInterceptor { it },
) {
val carSettingsStorage = CarSettingsStorage(carContext)

Expand All @@ -40,8 +41,6 @@ class MainCarContext(
MapboxManeuverApi(distanceFormatter)
}

val routeAlternativesEnabled = MutableStateFlow(value = true)

fun getJobControl(): JobControl {
val supervisorJob = SupervisorJob()
val scope = CoroutineScope(supervisorJob + Dispatchers.Main)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,12 +25,6 @@ import com.mapbox.navigation.ui.maps.route.line.api.MapboxRouteLineView
import com.mapbox.navigation.ui.maps.route.line.model.MapboxRouteLineOptions
import com.mapbox.navigation.ui.maps.route.line.model.RouteLineColorResources
import com.mapbox.navigation.ui.maps.route.line.model.RouteLineResources
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.MainScope
import kotlinx.coroutines.cancel
import kotlinx.coroutines.cancelChildren
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.launch

/**
* This class is to simplify the interaction with [MapboxRouteLineApi], [MapboxRouteArrowView]
Expand Down Expand Up @@ -59,8 +53,6 @@ class CarRouteLine internal constructor(
private lateinit var routeArrowApi: MapboxRouteArrowApi
private lateinit var routeArrowView: MapboxRouteArrowView

private var styleScope: CoroutineScope? = null

private val onPositionChangedListener = OnIndicatorPositionChangedListener { point ->
val result = routeLineApi.updateTraveledRouteLine(point)
mainCarContext.mapboxCarMap.carMapSurface?.getStyle()?.let {
Expand Down Expand Up @@ -107,7 +99,6 @@ class CarRouteLine internal constructor(
override fun onAttached(mapboxCarMapSurface: MapboxCarMapSurface) {
logAndroidAuto("CarRouteLine carMapSurface loaded $mapboxCarMapSurface")
val locationPlugin = mapboxCarMapSurface.mapSurface.location
val scope = MainScope().also { styleScope = it }
styleLoadedListener = mapboxCarMapSurface.handleStyleOnAttached { style ->
val routeLineOptions = getMapboxRouteLineOptions(style)
routeLineView = MapboxRouteLineView(routeLineOptions)
Expand All @@ -124,17 +115,6 @@ class CarRouteLine internal constructor(
locationPlugin.addOnIndicatorPositionChangedListener(onPositionChangedListener)
mainCarContext.mapboxNavigation.registerRouteProgressObserver(routeProgressObserver)
routesProvider.registerRoutesListener(routesListener)

scope.coroutineContext.cancelChildren()
scope.launch {
mainCarContext.routeAlternativesEnabled.collect { enabled ->
if (enabled) {
routeLineView.showAlternativeRoutes(style)
} else {
routeLineView.hideAlternativeRoutes(style)
}
}
}
}
}

Expand All @@ -145,8 +125,6 @@ class CarRouteLine internal constructor(
mapSurface.location.removeOnIndicatorPositionChangedListener(onPositionChangedListener)
mainCarContext.mapboxNavigation.unregisterRouteProgressObserver(routeProgressObserver)
routesProvider.unregisterRoutesListener(routesListener)
styleScope?.cancel()
styleScope = null
}

private fun getMapboxRouteLineOptions(style: Style): MapboxRouteLineOptions {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.mapbox.androidauto.car.preview

import com.mapbox.api.directions.v5.models.RouteOptions

/**
* This allows you to change the route options used by Android Auto for requesting a route.
*/
fun interface CarRouteOptionsInterceptor {

/**
* Called before the route is requested.
*
* @param builder with initial route options
*/
fun intercept(builder: RouteOptions.Builder): RouteOptions.Builder
}
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ interface CarRouteRequestCallback {
*/
class CarRouteRequest(
val mapboxNavigation: MapboxNavigation,
private val routeOptionsInterceptor: CarRouteOptionsInterceptor,
private val navigationLocationProvider: NavigationLocationProvider,
) {
internal var currentRequestId: Long? = null
Expand Down Expand Up @@ -119,6 +120,7 @@ class CarRouteRequest(
.coordinatesList(listOf(origin, destination))
.layersList(listOf(mapboxNavigation.getZLevel(), null))
.metadata(true)
.let { routeOptionsInterceptor.intercept(it) }
.build()

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ class SearchCarContext(
)
val carRouteRequest = CarRouteRequest(
mainCarContext.mapboxNavigation,
mainCarContext.routeOptionsInterceptor,
MapboxCarApp.carAppLocationService().navigationLocationProvider
)
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@
package com.mapbox.androidauto.car.preview

import androidx.test.core.app.ApplicationProvider
import com.mapbox.androidauto.testing.MapboxRobolectricTestRunner
import com.mapbox.api.directions.v5.models.RouteOptions
import com.mapbox.common.Logger
import com.mapbox.geojson.Point
import com.mapbox.navigation.base.formatter.UnitType
import com.mapbox.navigation.base.route.NavigationRoute
Expand All @@ -15,19 +12,18 @@ import io.mockk.Runs
import io.mockk.every
import io.mockk.just
import io.mockk.mockk
import io.mockk.mockkStatic
import io.mockk.unmockkStatic
import io.mockk.verify
import org.junit.After
import org.junit.Assert.assertEquals
import org.junit.Before
import org.junit.Test
import java.util.Locale

class CarRouteRequestTest : MapboxRobolectricTestRunner() {
class CarRouteRequestTest {

private val routeOptionsSlot = CapturingSlot<RouteOptions>()
private val routerCallbackSlot = CapturingSlot<NavigationRouterCallback>()
private val routeOptionsInterceptor = mockk<CarRouteOptionsInterceptor> {
every { intercept(any()) } answers { firstArg() }
}
private val navigationLocationProvider = mockk<NavigationLocationProvider>()
private var requestCount = 0L
private val mapboxNavigation = mockk<MapboxNavigation> {
Expand All @@ -36,7 +32,7 @@ class CarRouteRequestTest : MapboxRobolectricTestRunner() {
} returns requestCount++
every { cancelRouteRequest(any()) } just Runs
every { navigationOptions } returns mockk {
every { applicationContext } returns ApplicationProvider.getApplicationContext()
every { applicationContext } returns mockk()
every { distanceFormatterOptions } returns mockk {
every { locale } returns Locale.US
every { unitType } returns UnitType.METRIC
Expand All @@ -45,19 +41,8 @@ class CarRouteRequestTest : MapboxRobolectricTestRunner() {
every { getZLevel() } returns Z_LEVEL
}

private val carRouteRequest = CarRouteRequest(mapboxNavigation, navigationLocationProvider)

@Before
fun setup() {
mockkStatic(Logger::class)
every { Logger.e(any(), any()) } just Runs
every { Logger.i(any(), any()) } just Runs
}

@After
fun teardown() {
unmockkStatic(Logger::class)
}
private val carRouteRequest =
CarRouteRequest(mapboxNavigation, routeOptionsInterceptor, navigationLocationProvider)

@Test
fun `onRoutesReady is called after successful request`() {
Expand Down Expand Up @@ -185,6 +170,24 @@ class CarRouteRequestTest : MapboxRobolectricTestRunner() {
assertEquals(listOf(Z_LEVEL, null), routeOptionsSlot.captured.layersList())
}

@Test
fun `custom route options provided by interceptor are used for route request`() {
val customRouteOptions = mockk<RouteOptions>()
val customRouteOptionsBuilder = mockk<RouteOptions.Builder> {
every { build() } returns customRouteOptions
}
every { routeOptionsInterceptor.intercept(any()) } returns customRouteOptionsBuilder
every { navigationLocationProvider.lastLocation } returns mockk {
every { longitude } returns -121.4670161
every { latitude } returns 38.5630514
}
val callback = mockk<CarRouteRequestCallback>(relaxUnitFun = true)
val searchCoordinate = Point.fromLngLat(-121.467001, 38.568105)
carRouteRequest.request(mockk { every { coordinate } returns searchCoordinate }, callback)

assertEquals(customRouteOptions, routeOptionsSlot.captured)
}

private companion object {

private const val Z_LEVEL = 42
Expand Down

0 comments on commit 253b03a

Please sign in to comment.