From d6bae3bed627d22d12bedac8cc2f00e9b0631648 Mon Sep 17 00:00:00 2001 From: Kyle Madsen Date: Thu, 22 Sep 2022 18:33:22 -0700 Subject: [PATCH 1/2] Migrate CarRouteRequest --- libnavui-androidauto/CHANGELOG.md | 1 + libnavui-androidauto/api/current.txt | 13 ++-- .../mapbox/androidauto/car/MainActionStrip.kt | 2 +- .../placeslistonmap/PlacesListOnMapScreen.kt | 40 +++++----- .../car/preview/CarRouteRequest.kt | 74 +++++++------------ .../car/search/PlaceSearchScreen.kt | 2 +- .../car/search/SearchCarContext.kt | 8 +- .../deeplink/GeoDeeplinkNavigateAction.kt | 3 +- .../car/preview/CarRouteRequestTest.kt | 43 ++++++++--- .../car/search/PlaceSearchScreenTest.kt | 4 +- 10 files changed, 94 insertions(+), 96 deletions(-) diff --git a/libnavui-androidauto/CHANGELOG.md b/libnavui-androidauto/CHANGELOG.md index 6212c90f6c0..a8e37a1691b 100644 --- a/libnavui-androidauto/CHANGELOG.md +++ b/libnavui-androidauto/CHANGELOG.md @@ -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 diff --git a/libnavui-androidauto/api/current.txt b/libnavui-androidauto/api/current.txt index 85ad271137b..05dc086a1c5 100644 --- a/libnavui-androidauto/api/current.txt +++ b/libnavui-androidauto/api/current.txt @@ -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 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 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); @@ -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>); - property public final com.mapbox.navigation.core.MapboxNavigation mapboxNavigation; } public interface CarRouteRequestCallback { @@ -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; } } diff --git a/libnavui-androidauto/src/main/java/com/mapbox/androidauto/car/MainActionStrip.kt b/libnavui-androidauto/src/main/java/com/mapbox/androidauto/car/MainActionStrip.kt index b23943d8397..6147fcc45d3 100644 --- a/libnavui-androidauto/src/main/java/com/mapbox/androidauto/car/MainActionStrip.kt +++ b/libnavui-androidauto/src/main/java/com/mapbox/androidauto/car/MainActionStrip.kt @@ -92,7 +92,7 @@ class MainActionStrip( val feedbackPoll = mainCarContext.feedbackPollProvider .getSearchFeedbackPoll(mainCarContext.carContext) return PlacesListOnMapScreen( - mainCarContext, + SearchCarContext(mainCarContext), placesProvider, PlacesListItemMapper( PlaceMarkerRenderer(mainCarContext.carContext), diff --git a/libnavui-androidauto/src/main/java/com/mapbox/androidauto/car/placeslistonmap/PlacesListOnMapScreen.kt b/libnavui-androidauto/src/main/java/com/mapbox/androidauto/car/placeslistonmap/PlacesListOnMapScreen.kt index 09078c2a5ad..5b49b5f6aad 100644 --- a/libnavui-androidauto/src/main/java/com/mapbox/androidauto/car/placeslistonmap/PlacesListOnMapScreen.kt +++ b/libnavui-androidauto/src/main/java/com/mapbox/androidauto/car/placeslistonmap/PlacesListOnMapScreen.kt @@ -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 @@ -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, - 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() } - 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 { @@ -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) } }) } @@ -175,7 +173,7 @@ class PlacesListOnMapScreen @UiThread constructor( private fun addPlaceIconsToMap(places: List) { 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()) diff --git a/libnavui-androidauto/src/main/java/com/mapbox/androidauto/car/preview/CarRouteRequest.kt b/libnavui-androidauto/src/main/java/com/mapbox/androidauto/car/preview/CarRouteRequest.kt index b06ea374265..b72d187e085 100644 --- a/libnavui-androidauto/src/main/java/com/mapbox/androidauto/car/preview/CarRouteRequest.kt +++ b/libnavui-androidauto/src/main/java/com/mapbox/androidauto/car/preview/CarRouteRequest.kt @@ -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 @@ -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 @@ -34,53 +34,30 @@ 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? { - return suspendCancellableCoroutine { continuation -> - continuation.invokeOnCancellation { cancelRequest() } - request( - placeRecord, - object : CarRouteRequestCallback { - - override fun onRoutesReady( - placeRecord: PlaceRecord, - routes: List - ) { - 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 ?: 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() @@ -90,12 +67,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) ) } @@ -104,17 +81,20 @@ 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 }, @@ -122,7 +102,7 @@ class CarRouteRequest( .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() diff --git a/libnavui-androidauto/src/main/java/com/mapbox/androidauto/car/search/PlaceSearchScreen.kt b/libnavui-androidauto/src/main/java/com/mapbox/androidauto/car/search/PlaceSearchScreen.kt index 44472f14df9..03f898353ee 100644 --- a/libnavui-androidauto/src/main/java/com/mapbox/androidauto/car/search/PlaceSearchScreen.kt +++ b/libnavui-androidauto/src/main/java/com/mapbox/androidauto/car/search/PlaceSearchScreen.kt @@ -67,7 +67,7 @@ class PlaceSearchScreen @UiThread constructor( } init { - attachCreated(searchCarContext.carPlaceSearch) + attachCreated(searchCarContext.carRouteRequest, searchCarContext.carPlaceSearch) } override fun onGetTemplate(): Template { diff --git a/libnavui-androidauto/src/main/java/com/mapbox/androidauto/car/search/SearchCarContext.kt b/libnavui-androidauto/src/main/java/com/mapbox/androidauto/car/search/SearchCarContext.kt index 5ab9bce496c..82509f8b234 100644 --- a/libnavui-androidauto/src/main/java/com/mapbox/androidauto/car/search/SearchCarContext.kt +++ b/libnavui-androidauto/src/main/java/com/mapbox/androidauto/car/search/SearchCarContext.kt @@ -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 @@ -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 - ) } diff --git a/libnavui-androidauto/src/main/java/com/mapbox/androidauto/deeplink/GeoDeeplinkNavigateAction.kt b/libnavui-androidauto/src/main/java/com/mapbox/androidauto/deeplink/GeoDeeplinkNavigateAction.kt index ef70eef295c..1e295ac6c24 100644 --- a/libnavui-androidauto/src/main/java/com/mapbox/androidauto/deeplink/GeoDeeplinkNavigateAction.kt +++ b/libnavui-androidauto/src/main/java/com/mapbox/androidauto/deeplink/GeoDeeplinkNavigateAction.kt @@ -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 @@ -43,7 +44,7 @@ class GeoDeeplinkNavigateAction( val feedbackPoll = mainCarContext.feedbackPollProvider .getSearchFeedbackPoll(mainCarContext.carContext) return PlacesListOnMapScreen( - mainCarContext, + SearchCarContext(mainCarContext), placesProvider, PlacesListItemMapper( PlaceMarkerRenderer(mainCarContext.carContext), diff --git a/libnavui-androidauto/src/test/java/com/mapbox/androidauto/car/preview/CarRouteRequestTest.kt b/libnavui-androidauto/src/test/java/com/mapbox/androidauto/car/preview/CarRouteRequestTest.kt index e3b6bf9d4c4..4c7793fc393 100644 --- a/libnavui-androidauto/src/test/java/com/mapbox/androidauto/car/preview/CarRouteRequestTest.kt +++ b/libnavui-androidauto/src/test/java/com/mapbox/androidauto/car/preview/CarRouteRequestTest.kt @@ -1,11 +1,14 @@ package com.mapbox.androidauto.car.preview +import com.mapbox.androidauto.navigation.location.CarAppLocation +import com.mapbox.androidauto.testing.CarAppTestRule import com.mapbox.api.directions.v5.models.RouteOptions import com.mapbox.geojson.Point import com.mapbox.navigation.base.formatter.UnitType import com.mapbox.navigation.base.route.NavigationRoute import com.mapbox.navigation.base.route.NavigationRouterCallback import com.mapbox.navigation.core.MapboxNavigation +import com.mapbox.navigation.core.lifecycle.MapboxNavigationApp import com.mapbox.navigation.testing.LoggingFrontendTestRule import com.mapbox.navigation.ui.maps.location.NavigationLocationProvider import io.mockk.CapturingSlot @@ -15,6 +18,7 @@ import io.mockk.just import io.mockk.mockk import io.mockk.verify import org.junit.Assert.assertEquals +import org.junit.Before import org.junit.Rule import org.junit.Test import java.util.Locale @@ -24,12 +28,15 @@ class CarRouteRequestTest { @get:Rule val loggerRule = LoggingFrontendTestRule() + @get:Rule + val carAppTestRule = CarAppTestRule() + private val routeOptionsSlot = CapturingSlot() private val routerCallbackSlot = CapturingSlot() private val routeOptionsInterceptor = mockk { every { intercept(any()) } answers { firstArg() } } - private val navigationLocationProvider = mockk() + private val locationProvider = mockk() private var requestCount = 0L private val mapboxNavigation = mockk { every { @@ -46,19 +53,26 @@ class CarRouteRequestTest { every { getZLevel() } returns Z_LEVEL } - private val carRouteRequest = - CarRouteRequest(mapboxNavigation, routeOptionsInterceptor, navigationLocationProvider) + @Before + fun setup() { + every { MapboxNavigationApp.getObserver(CarAppLocation::class) } returns mockk { + every { navigationLocationProvider } returns locationProvider + } + } + + private val carRouteRequest = CarRouteRequest(routeOptionsInterceptor) @Test fun `onRoutesReady is called after successful request`() { every { - navigationLocationProvider.lastLocation + locationProvider.lastLocation } returns mockk { every { longitude } returns -121.4670161 every { latitude } returns 38.5630514 } val callback: CarRouteRequestCallback = mockk(relaxUnitFun = true) val searchCoordinate = Point.fromLngLat(-121.467001, 38.568105) + carRouteRequest.onAttached(mapboxNavigation) carRouteRequest.request( mockk { every { coordinate } returns searchCoordinate }, callback @@ -72,9 +86,10 @@ class CarRouteRequestTest { @Test fun `onUnknownCurrentLocation is called when current location is null`() { - every { navigationLocationProvider.lastLocation } returns null + every { locationProvider.lastLocation } returns null val callback: CarRouteRequestCallback = mockk(relaxUnitFun = true) val searchCoordinate = Point.fromLngLat(-121.467001, 38.568105) + carRouteRequest.onAttached(mapboxNavigation) carRouteRequest.request( mockk { every { coordinate } returns searchCoordinate }, callback @@ -86,12 +101,13 @@ class CarRouteRequestTest { @Test fun `onSearchResultLocationUnknown is called when search result coordinate is`() { every { - navigationLocationProvider.lastLocation + locationProvider.lastLocation } returns mockk { every { longitude } returns -121.4670161 every { latitude } returns 38.5630514 } val callback: CarRouteRequestCallback = mockk(relaxUnitFun = true) + carRouteRequest.onAttached(mapboxNavigation) carRouteRequest.request( mockk { every { coordinate } returns null }, callback @@ -103,13 +119,14 @@ class CarRouteRequestTest { @Test fun `onNoRoutesFound is called when route request is canceled`() { every { - navigationLocationProvider.lastLocation + locationProvider.lastLocation } returns mockk { every { longitude } returns -121.4670161 every { latitude } returns 38.5630514 } val callback: CarRouteRequestCallback = mockk(relaxUnitFun = true) val searchCoordinate = Point.fromLngLat(-121.467001, 38.568105) + carRouteRequest.onAttached(mapboxNavigation) carRouteRequest.request( mockk { every { coordinate } returns searchCoordinate }, callback @@ -123,13 +140,14 @@ class CarRouteRequestTest { @Test fun `onNoRoutesFound is called when route request fails`() { every { - navigationLocationProvider.lastLocation + locationProvider.lastLocation } returns mockk { every { longitude } returns -121.4670161 every { latitude } returns 38.5630514 } val callback: CarRouteRequestCallback = mockk(relaxUnitFun = true) val searchCoordinate = Point.fromLngLat(-121.467001, 38.568105) + carRouteRequest.onAttached(mapboxNavigation) carRouteRequest.request( mockk { every { coordinate } returns searchCoordinate }, callback @@ -143,13 +161,14 @@ class CarRouteRequestTest { @Test fun `should cancel previous route request`() { every { - navigationLocationProvider.lastLocation + locationProvider.lastLocation } returns mockk { every { longitude } returns -121.4670161 every { latitude } returns 38.5630514 } val callback: CarRouteRequestCallback = mockk(relaxUnitFun = true) val searchCoordinate = Point.fromLngLat(-121.467001, 38.568105) + carRouteRequest.onAttached(mapboxNavigation) carRouteRequest.request( mockk { every { coordinate } returns searchCoordinate }, callback @@ -164,12 +183,13 @@ class CarRouteRequestTest { @Test fun `z level is passed to route options`() { - every { navigationLocationProvider.lastLocation } returns mockk { + every { locationProvider.lastLocation } returns mockk { every { longitude } returns -121.4670161 every { latitude } returns 38.5630514 } val callback = mockk(relaxUnitFun = true) val searchCoordinate = Point.fromLngLat(-121.467001, 38.568105) + carRouteRequest.onAttached(mapboxNavigation) carRouteRequest.request(mockk { every { coordinate } returns searchCoordinate }, callback) assertEquals(listOf(Z_LEVEL, null), routeOptionsSlot.captured.layersList()) @@ -182,12 +202,13 @@ class CarRouteRequestTest { every { build() } returns customRouteOptions } every { routeOptionsInterceptor.intercept(any()) } returns customRouteOptionsBuilder - every { navigationLocationProvider.lastLocation } returns mockk { + every { locationProvider.lastLocation } returns mockk { every { longitude } returns -121.4670161 every { latitude } returns 38.5630514 } val callback = mockk(relaxUnitFun = true) val searchCoordinate = Point.fromLngLat(-121.467001, 38.568105) + carRouteRequest.onAttached(mapboxNavigation) carRouteRequest.request(mockk { every { coordinate } returns searchCoordinate }, callback) assertEquals(customRouteOptions, routeOptionsSlot.captured) diff --git a/libnavui-androidauto/src/test/java/com/mapbox/androidauto/internal/car/search/PlaceSearchScreenTest.kt b/libnavui-androidauto/src/test/java/com/mapbox/androidauto/internal/car/search/PlaceSearchScreenTest.kt index 0aca80df827..1b12736f6e5 100644 --- a/libnavui-androidauto/src/test/java/com/mapbox/androidauto/internal/car/search/PlaceSearchScreenTest.kt +++ b/libnavui-androidauto/src/test/java/com/mapbox/androidauto/internal/car/search/PlaceSearchScreenTest.kt @@ -6,7 +6,6 @@ import com.mapbox.androidauto.R import com.mapbox.androidauto.car.search.PlaceSearchScreen import com.mapbox.androidauto.car.search.SearchCarContext import com.mapbox.androidauto.testing.MapboxRobolectricTestRunner -import com.mapbox.navigation.base.ExperimentalPreviewMapboxNavigationAPI import com.mapbox.navigation.testing.MainCoroutineRule import io.mockk.coEvery import io.mockk.every @@ -18,7 +17,7 @@ import org.junit.Assert.assertTrue import org.junit.Rule import org.junit.Test -@OptIn(ExperimentalCoroutinesApi::class, ExperimentalPreviewMapboxNavigationAPI::class) +@OptIn(ExperimentalCoroutinesApi::class) class PlaceSearchScreenTest : MapboxRobolectricTestRunner() { @get:Rule @@ -30,6 +29,7 @@ class PlaceSearchScreenTest : MapboxRobolectricTestRunner() { every { getString(R.string.car_search_no_results) } returns "No results" } every { carPlaceSearch } returns mockk(relaxed = true) + every { carRouteRequest } returns mockk() every { distanceFormatter } returns mockk() } From 185dd0edc349dad4595e2fd7ab988fbc8af735c2 Mon Sep 17 00:00:00 2001 From: Kyle Madsen Date: Fri, 23 Sep 2022 14:22:17 -0700 Subject: [PATCH 2/2] always call callback --- .../car/preview/CarRouteRequest.kt | 6 +++++- .../car/preview/CarRouteRequestTest.kt | 19 +++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/libnavui-androidauto/src/main/java/com/mapbox/androidauto/car/preview/CarRouteRequest.kt b/libnavui-androidauto/src/main/java/com/mapbox/androidauto/car/preview/CarRouteRequest.kt index b72d187e085..5716be58e75 100644 --- a/libnavui-androidauto/src/main/java/com/mapbox/androidauto/car/preview/CarRouteRequest.kt +++ b/libnavui-androidauto/src/main/java/com/mapbox/androidauto/car/preview/CarRouteRequest.kt @@ -53,7 +53,11 @@ class CarRouteRequest( */ @UiThread fun request(placeRecord: PlaceRecord, callback: CarRouteRequestCallback) { - val mapboxNavigation = this.mapboxNavigation ?: return + val mapboxNavigation = this.mapboxNavigation + if (mapboxNavigation == null) { + callback.onNoRoutesFound() + return + } cancelRequest() val carAppLocation = MapboxNavigationApp.getObserver(CarAppLocation::class) diff --git a/libnavui-androidauto/src/test/java/com/mapbox/androidauto/car/preview/CarRouteRequestTest.kt b/libnavui-androidauto/src/test/java/com/mapbox/androidauto/car/preview/CarRouteRequestTest.kt index 4c7793fc393..7a87791bdb6 100644 --- a/libnavui-androidauto/src/test/java/com/mapbox/androidauto/car/preview/CarRouteRequestTest.kt +++ b/libnavui-androidauto/src/test/java/com/mapbox/androidauto/car/preview/CarRouteRequestTest.kt @@ -158,6 +158,25 @@ class CarRouteRequestTest { verify { callback.onNoRoutesFound() } } + @Test + fun `onNoRoutesFound is called when mapboxNavigation is not attached`() { + every { + locationProvider.lastLocation + } returns mockk { + every { longitude } returns -121.4670161 + every { latitude } returns 38.5630514 + } + val callback: CarRouteRequestCallback = mockk(relaxUnitFun = true) + val searchCoordinate = Point.fromLngLat(-121.467001, 38.568105) + carRouteRequest.request( + mockk { every { coordinate } returns searchCoordinate }, + callback + ) + carRouteRequest.onAttached(mapboxNavigation) + + verify { callback.onNoRoutesFound() } + } + @Test fun `should cancel previous route request`() { every {