diff --git a/libnavigation-core/src/main/java/com/mapbox/navigation/core/MapboxNavigation.kt b/libnavigation-core/src/main/java/com/mapbox/navigation/core/MapboxNavigation.kt index cbfb7cd4381..52f60647822 100644 --- a/libnavigation-core/src/main/java/com/mapbox/navigation/core/MapboxNavigation.kt +++ b/libnavigation-core/src/main/java/com/mapbox/navigation/core/MapboxNavigation.kt @@ -426,7 +426,6 @@ class MapboxNavigation @VisibleForTesting internal constructor( routeAlternativesController = RouteAlternativesControllerProvider.create( navigationOptions.routeAlternativesOptions, navigator, - directionsSession, tripSession ) routeRefreshController = RouteRefreshControllerProvider.createRouteRefreshController( @@ -621,10 +620,14 @@ class MapboxNavigation @VisibleForTesting internal constructor( } rerouteController?.interrupt() + // Telemetry uses this field to determine what type of event should be triggered. @RoutesExtra.RoutesUpdateReason val reason = when { routes.isEmpty() -> { RoutesExtra.ROUTES_UPDATE_REASON_CLEAN_UP } + routes.first() == directionsSession.routes.firstOrNull() -> { + RoutesExtra.ROUTES_UPDATE_REASON_ALTERNATIVE + } else -> { RoutesExtra.ROUTES_UPDATE_REASON_NEW } diff --git a/libnavigation-core/src/main/java/com/mapbox/navigation/core/routealternatives/RouteAlternativesController.kt b/libnavigation-core/src/main/java/com/mapbox/navigation/core/routealternatives/RouteAlternativesController.kt index 27ac8a71148..46531bab8b0 100644 --- a/libnavigation-core/src/main/java/com/mapbox/navigation/core/routealternatives/RouteAlternativesController.kt +++ b/libnavigation-core/src/main/java/com/mapbox/navigation/core/routealternatives/RouteAlternativesController.kt @@ -6,8 +6,6 @@ import com.mapbox.base.common.logger.model.Tag import com.mapbox.navigation.base.internal.utils.parseDirectionsResponse import com.mapbox.navigation.base.route.RouteAlternativesOptions import com.mapbox.navigation.base.route.RouterOrigin -import com.mapbox.navigation.core.directions.session.DirectionsSession -import com.mapbox.navigation.core.directions.session.RoutesExtra.ROUTES_UPDATE_REASON_ALTERNATIVE import com.mapbox.navigation.core.trip.session.TripSession import com.mapbox.navigation.navigator.internal.MapboxNativeNavigator import com.mapbox.navigation.utils.internal.logI @@ -17,9 +15,9 @@ import java.util.concurrent.CopyOnWriteArraySet internal class RouteAlternativesController constructor( private val options: RouteAlternativesOptions, private val navigator: MapboxNativeNavigator, - private val directionsSession: DirectionsSession, private val tripSession: TripSession ) { + private val nativeRouteAlternativesController = navigator.createRouteAlternativesController() .apply { setRouteAlternativesOptions( @@ -65,11 +63,6 @@ internal class RouteAlternativesController constructor( val routeProgress = tripSession.getRouteProgress() ?: return emptyList() - // Create a new list of routes, add the current route at index 0. - val changedRoutes = mutableListOf() - val currentRoute = routeProgress.route - changedRoutes.add(currentRoute) - // Map the alternatives from nav-native, add the existing RouteOptions. var alternatives: List // TODO make async @@ -77,21 +70,13 @@ internal class RouteAlternativesController constructor( alternatives = routeAlternatives.map { routeAlternative -> parseDirectionsResponse( routeAlternative.route, - currentRoute.routeOptions() + routeProgress.route.routeOptions() ) { logI(TAG, Message("Response metadata: $it")) }.first() } } - changedRoutes.addAll(alternatives) - - directionsSession.setRoutes( - routes = changedRoutes, - initialLegIndex = 0, - ROUTES_UPDATE_REASON_ALTERNATIVE - ) - // Notify the listeners. // TODO https://github.com/mapbox/mapbox-navigation-native/issues/4409 // There is no way to determine if the route was Onboard or Offboard diff --git a/libnavigation-core/src/main/java/com/mapbox/navigation/core/routealternatives/RouteAlternativesControllerProvider.kt b/libnavigation-core/src/main/java/com/mapbox/navigation/core/routealternatives/RouteAlternativesControllerProvider.kt index bc96fef23aa..8ec105da2bc 100644 --- a/libnavigation-core/src/main/java/com/mapbox/navigation/core/routealternatives/RouteAlternativesControllerProvider.kt +++ b/libnavigation-core/src/main/java/com/mapbox/navigation/core/routealternatives/RouteAlternativesControllerProvider.kt @@ -1,7 +1,6 @@ package com.mapbox.navigation.core.routealternatives import com.mapbox.navigation.base.route.RouteAlternativesOptions -import com.mapbox.navigation.core.directions.session.DirectionsSession import com.mapbox.navigation.core.trip.session.TripSession import com.mapbox.navigation.navigator.internal.MapboxNativeNavigator @@ -10,12 +9,10 @@ internal object RouteAlternativesControllerProvider { fun create( options: RouteAlternativesOptions, navigator: MapboxNativeNavigator, - directionsSession: DirectionsSession, tripSession: TripSession ) = RouteAlternativesController( options, navigator, - directionsSession, tripSession ) } diff --git a/libnavigation-core/src/test/java/com/mapbox/navigation/core/MapboxNavigationTest.kt b/libnavigation-core/src/test/java/com/mapbox/navigation/core/MapboxNavigationTest.kt index 87984ae05b2..34137cfd095 100644 --- a/libnavigation-core/src/test/java/com/mapbox/navigation/core/MapboxNavigationTest.kt +++ b/libnavigation-core/src/test/java/com/mapbox/navigation/core/MapboxNavigationTest.kt @@ -104,8 +104,7 @@ class MapboxNavigationTest { private val distanceFormatterOptions: DistanceFormatterOptions = mockk(relaxed = true) private val routingTilesOptions: RoutingTilesOptions = mockk(relaxed = true) private val routeRefreshController: RouteRefreshController = mockk(relaxUnitFun = true) - private val routeAlternativesController: RouteAlternativesController = - mockk(relaxUnitFun = true) + private val routeAlternativesController: RouteAlternativesController = mockk(relaxed = true) private val routeProgress: RouteProgress = mockk(relaxed = true) private val navigationSession: NavigationSession = mockk(relaxed = true) private val billingController: BillingController = mockk(relaxUnitFun = true) @@ -181,7 +180,7 @@ class MapboxNavigationTest { } returns routeRefreshController mockkObject(RouteAlternativesControllerProvider) every { - RouteAlternativesControllerProvider.create(any(), any(), any(), any()) + RouteAlternativesControllerProvider.create(any(), any(), any()) } returns routeAlternativesController every { applicationContext.applicationContext } returns applicationContext @@ -1074,6 +1073,22 @@ class MapboxNavigationTest { } } + @Test + fun `adding or removing alternative routes creates alternative reason`() { + createMapboxNavigation() + val primaryRoute = mockk() + val alternativeRoute = mockk() + every { directionsSession.routes } returns listOf(primaryRoute) + + mapboxNavigation.setRoutes(listOf(primaryRoute, alternativeRoute)) + mapboxNavigation.setRoutes(listOf(primaryRoute)) + + verifyOrder { + directionsSession.setRoutes(any(), any(), RoutesExtra.ROUTES_UPDATE_REASON_ALTERNATIVE) + directionsSession.setRoutes(any(), any(), RoutesExtra.ROUTES_UPDATE_REASON_ALTERNATIVE) + } + } + @Test fun `verify that billing controller is notified of instance destruction`() { createMapboxNavigation() diff --git a/libnavigation-core/src/test/java/com/mapbox/navigation/core/routealternatives/RouteAlternativesControllerTest.kt b/libnavigation-core/src/test/java/com/mapbox/navigation/core/routealternatives/RouteAlternativesControllerTest.kt index 270f862ac9f..f55bb2823a4 100644 --- a/libnavigation-core/src/test/java/com/mapbox/navigation/core/routealternatives/RouteAlternativesControllerTest.kt +++ b/libnavigation-core/src/test/java/com/mapbox/navigation/core/routealternatives/RouteAlternativesControllerTest.kt @@ -4,8 +4,6 @@ import com.mapbox.api.directions.v5.models.DirectionsRoute import com.mapbox.navigation.base.route.RouteAlternativesOptions import com.mapbox.navigation.base.route.RouterOrigin import com.mapbox.navigation.base.trip.model.RouteProgress -import com.mapbox.navigation.core.directions.session.DirectionsSession -import com.mapbox.navigation.core.directions.session.RoutesExtra import com.mapbox.navigation.core.trip.session.TripSession import com.mapbox.navigation.navigator.internal.MapboxNativeNavigator import com.mapbox.navigation.testing.FileUtils @@ -32,7 +30,6 @@ class RouteAlternativesControllerTest { private val navigator: MapboxNativeNavigator = mockk { every { createRouteAlternativesController() } returns controllerInterface } - private val directionsSession: DirectionsSession = mockk(relaxed = true) private val tripSession: TripSession = mockk(relaxed = true) private fun routeAlternativesController( @@ -40,7 +37,6 @@ class RouteAlternativesControllerTest { ) = RouteAlternativesController( options, navigator, - directionsSession, tripSession, ) @@ -172,40 +168,6 @@ class RouteAlternativesControllerTest { assertEquals(RouterOrigin.Onboard, routerOriginSlot.captured) } - @Test - fun `should set route with the new alternatives`() { - val routeAlternativesController = routeAlternativesController() - val nativeObserver = slot() - every { controllerInterface.addObserver(capture(nativeObserver)) } just runs - every { tripSession.getRouteProgress() } returns mockk { - every { route } returns mockk(relaxed = true) - } - - val firstObserver: RouteAlternativesObserver = mockk(relaxed = true) - routeAlternativesController.register(firstObserver) - val alternativeRouteJson = FileUtils.loadJsonFixture( - "route_alternative_from_native.txt" - ) - nativeObserver.captured.onRouteAlternativesChanged( - listOf( - mockk { - every { route } returns alternativeRouteJson - } - ) - ) - - val routesSetCapture = slot>() - verify(exactly = 1) { - directionsSession.setRoutes( - capture(routesSetCapture), - 0, - RoutesExtra.ROUTES_UPDATE_REASON_ALTERNATIVE - ) - } - assertEquals(2, routesSetCapture.captured.size) - assertEquals(221.796, routesSetCapture.captured[1].duration(), 0.001) - } - @Test fun `should set alternative RouteOptions to primary RouteOptions`() { val originalCoordinates = "-122.270375,37.801429;-122.271496, 37.799063" @@ -219,8 +181,6 @@ class RouteAlternativesControllerTest { } } } - val routesSetCapture = slot>() - every { directionsSession.setRoutes(capture(routesSetCapture), any(), any()) } just runs val firstObserver: RouteAlternativesObserver = mockk(relaxed = true) routeAlternativesController.register(firstObserver) @@ -235,11 +195,22 @@ class RouteAlternativesControllerTest { ) ) + val routeProgressSlot = slot() + val alternativesSlot = slot>() + val routerOriginSlot = slot() + verify(exactly = 1) { + firstObserver.onRouteAlternatives( + capture(routeProgressSlot), + capture(alternativesSlot), + capture(routerOriginSlot) + ) + } + assertEquals( - originalCoordinates, routesSetCapture.captured[0].routeOptions()?.coordinates() + originalCoordinates, routeProgressSlot.captured.route.routeOptions()?.coordinates() ) assertEquals( - originalCoordinates, routesSetCapture.captured[1].routeOptions()?.coordinates() + originalCoordinates, alternativesSlot.captured[0].routeOptions()?.coordinates() ) } } diff --git a/libnavigation-core/src/test/resources/route_alternative_from_native.txt b/libnavigation-core/src/test/resources/route_alternative_from_native.txt index d7a40b7abe3..414579a6862 100644 --- a/libnavigation-core/src/test/resources/route_alternative_from_native.txt +++ b/libnavigation-core/src/test/resources/route_alternative_from_native.txt @@ -1 +1 @@ -{"routes":[{"distance":1006.574,"duration":221.796,"duration_typical":226.731,"geometry":"i|ebgAlixehFfCyIvA_FrAwErVc{@xAeFpAoEfEeO~Ogk@tA{EvA_FnBsGtHuVxIuZvA}EzC`Bx_@nSpDlBdDfBxK~FnRbKnDnB~C`BjBbAt[zPhDhBsAtEuHvW}ErPqFhRgAtDgApD{GxUqI`Zs@bCm@rBq@`CqApEsAvEuFlRgLr`@mAfEcBzF|DtBhE|B","legs":[{"admins":[{"iso_3166_1":"US","iso_3166_1_alpha3":"USA"}],"annotation":{"congestion_numeric":[0,0,0,0,0,null,null,null,null,null,null,17,17,17,null,null,null,27,27,27,27,0,0,0,0,8,8,8,8,8,0,0,0,0,0,0,0,20,20,20,20,20,72,72],"distance":[17,11,10.6,94.5,11.3,10.2,25.4,69.2,10.8,11,13.6,37.5,43.5,10.9,9.7,65.2,11,10.3,25.4,38.7,11,9.9,6.7,57,10.5,10.5,38.9,27.7,30.3,9,8.8,35.8,42.5,6.5,5.7,6.4,10.3,10.6,30.6,52.9,9.8,12.4,11.8,12.6],"duration":[2.271,1.467,2.242,20.012,2.39,1.753,4.347,11.871,1.851,1.165,1.445,7.507,8.693,2.185,2.327,15.642,2.646,1.687,4.164,6.332,1.794,1.781,1.208,10.252,1.899,1.182,4.373,3.118,3.413,1.007,1.173,4.772,5.664,0.865,0.761,0.848,1.374,2.382,6.883,11.898,2.207,2.79,10.602,11.306],"maxspeed":[{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true}],"speed":[7.5,7.5,4.7,4.7,4.7,5.8,5.8,5.8,5.8,9.4,9.4,5,5,5,4.2,4.2,4.2,6.1,6.1,6.1,6.1,5.6,5.6,5.6,5.6,8.9,8.9,8.9,8.9,8.9,7.5,7.5,7.5,7.5,7.5,7.5,7.5,4.4,4.4,4.4,4.4,4.4,1.1,1.1]},"distance":1006.574,"duration":221.796,"duration_typical":226.731,"steps":[{"bannerInstructions":[{"distanceAlongGeometry":377.232,"primary":{"components":[{"text":"Jackson Street","type":"text"}],"modifier":"right","text":"Jackson Street","type":"turn"}}],"distance":377.232,"driving_side":"right","duration":73.322,"duration_typical":73.322,"geometry":"i|ebgAlixehFfCyIvA_FrAwErVc{@xAeFpAoEfEeO~Ogk@tA{EvA_FnBsGtHuVxIuZvA}E","intersections":[{"admin_index":0,"bearings":[116],"duration":3.764,"entry":[true],"geometry_index":0,"is_urban":true,"location":[-122.270375,37.801429],"mapbox_streets_v8":{"class":"primary"},"out":0,"weight":4.423},{"admin_index":0,"bearings":[116,296],"duration":26.584,"entry":[true,false],"geometry_index":2,"in":1,"is_urban":true,"location":[-122.27009,37.801317],"mapbox_streets_v8":{"class":"primary"},"out":0,"turn_duration":2.019,"weight":28.864},{"admin_index":0,"bearings":[117,296],"duration":3.722,"entry":[true,false],"geometry_index":5,"in":1,"is_urban":true,"location":[-122.268905,37.800852],"mapbox_streets_v8":{"class":"primary"},"out":0,"turn_duration":2.007,"turn_weight":2,"weight":4.014},{"admin_index":0,"bearings":[116,297],"duration":16.286,"entry":[true,false],"geometry_index":6,"in":1,"is_urban":true,"location":[-122.268801,37.800811],"mapbox_streets_v8":{"class":"primary"},"out":0,"weight":19.136},{"admin_index":0,"bearings":[116,296],"duration":1.905,"entry":[true,false],"geometry_index":8,"in":1,"is_urban":true,"location":[-122.267834,37.800439],"mapbox_streets_v8":{"class":"primary"},"out":0,"turn_duration":0.019,"weight":2.216},{"admin_index":0,"bearings":[117,296],"duration":2.654,"entry":[true,false],"geometry_index":9,"in":1,"is_urban":true,"location":[-122.267724,37.800396],"mapbox_streets_v8":{"class":"primary"},"out":0,"turn_duration":0.007,"weight":3.11},{"admin_index":0,"bearings":[117,297],"entry":[true,false],"geometry_index":11,"in":1,"is_urban":true,"location":[-122.26747400000001,37.800296],"mapbox_streets_v8":{"class":"primary"},"out":0,"turn_duration":0.007}],"maneuver":{"bearing_after":116,"bearing_before":0,"instruction":"Drive southeast on 11th Street.","location":[-122.270375,37.801429],"type":"depart"},"mode":"driving","name":"11th Street","speedLimitSign":"mutcd","speedLimitUnit":"mph","voiceInstructions":[{"announcement":"Drive southeast on 11th Street. Then, in a quarter mile, Turn right onto Jackson Street.","distanceAlongGeometry":377.232,"ssmlAnnouncement":"Drive southeast on 11th Street. Then, in a quarter mile, Turn right onto Jackson Street."},{"announcement":"Turn right onto Jackson Street.","distanceAlongGeometry":66.667,"ssmlAnnouncement":"Turn right onto Jackson Street."}],"weight":83.383,"weight_typical":83.383},{"bannerInstructions":[{"distanceAlongGeometry":257,"primary":{"components":[{"text":"8th Street","type":"text"}],"modifier":"right","text":"8th Street","type":"turn"}}],"distance":257,"driving_side":"right","duration":58.159,"duration_typical":66.398,"geometry":"g~bbgAxypehFzC`Bx_@nSpDlBdDfBxK~FnRbKnDnB~C`BjBbAt[zPhDhB","intersections":[{"admin_index":0,"bearings":[206,296],"duration":24.745,"entry":[true,false],"geometry_index":14,"in":1,"is_urban":true,"location":[-122.266541,37.799924],"mapbox_streets_v8":{"class":"street"},"out":0,"turn_duration":4.105,"turn_weight":5,"weight":29.252},{"admin_index":0,"bearings":[26,206],"duration":7.898,"entry":[false,true],"geometry_index":17,"in":0,"is_urban":true,"location":[-122.266973,37.799232],"mapbox_streets_v8":{"class":"street"},"out":1,"turn_duration":2.007,"turn_weight":2,"weight":8.922},{"admin_index":0,"bearings":[26,206],"duration":8.189,"entry":[false,true],"geometry_index":19,"in":0,"is_urban":true,"location":[-122.267153,37.798944],"mapbox_streets_v8":{"class":"street"},"out":1,"turn_duration":0.007,"turn_weight":0.5,"weight":10.114},{"admin_index":0,"bearings":[27,206],"duration":5.079,"entry":[false,true],"geometry_index":21,"in":0,"is_urban":true,"location":[-122.267403,37.798544],"mapbox_streets_v8":{"class":"street"},"out":1,"turn_duration":2.019,"turn_weight":2,"weight":5.596},{"admin_index":0,"bearings":[26,206],"entry":[false,true],"geometry_index":23,"in":0,"is_urban":true,"location":[-122.267486,37.79841],"mapbox_streets_v8":{"class":"street"},"out":1,"turn_duration":0.007,"turn_weight":0.5}],"maneuver":{"bearing_after":206,"bearing_before":116,"instruction":"Turn right onto Jackson Street.","location":[-122.266541,37.799924],"modifier":"right","type":"turn"},"mode":"driving","name":"Jackson Street","speedLimitSign":"mutcd","speedLimitUnit":"mph","voiceInstructions":[{"announcement":"In 800 feet, Turn right onto 8th Street.","distanceAlongGeometry":247,"ssmlAnnouncement":"In 800 feet, Turn right onto 8th Street."},{"announcement":"Turn right onto 8th Street.","distanceAlongGeometry":50,"ssmlAnnouncement":"Turn right onto 8th Street."}],"weight":68.459,"weight_typical":77.974},{"bannerInstructions":[{"distanceAlongGeometry":348,"primary":{"components":[{"text":"Webster Street","type":"text"}],"modifier":"left","text":"Webster Street","type":"turn"},"sub":{"components":[{"active":false,"directions":["left"],"driving_side":"right","text":"","type":"lane"},{"active":true,"active_direction":"left","directions":["left","straight"],"driving_side":"right","text":"","type":"lane"},{"active":false,"directions":["straight"],"driving_side":"right","text":"","type":"lane"},{"active":false,"directions":["straight"],"driving_side":"right","text":"","type":"lane"}],"text":""}}],"distance":348,"driving_side":"right","duration":60.897,"duration_typical":72.761,"geometry":"s}~agA`jsehFsAtEuHvW}ErPqFhRgAtDgApD{GxUqI`Zs@bCm@rBq@`CqApEsAvEuFlRgLr`@mAfEcBzF","intersections":[{"admin_index":0,"bearings":[26,296],"duration":9.721,"entry":[false,true],"geometry_index":25,"in":0,"is_urban":true,"location":[-122.267825,37.797866],"mapbox_streets_v8":{"class":"secondary"},"out":1,"turn_duration":4.208,"turn_weight":10,"weight":16.339},{"admin_index":0,"bearings":[116,296],"duration":3.157,"entry":[false,true],"geometry_index":27,"in":0,"is_urban":true,"location":[-122.268328,37.798063],"mapbox_streets_v8":{"class":"secondary"},"out":1,"turn_duration":0.007,"turn_weight":0.5,"weight":4.201},{"admin_index":0,"bearings":[116,296],"duration":4.395,"entry":[false,true],"geometry_index":28,"in":0,"is_urban":true,"location":[-122.26861,37.798174],"mapbox_streets_v8":{"class":"secondary"},"out":1,"turn_duration":0.007,"turn_weight":0.5,"weight":5.655},{"admin_index":0,"bearings":[116,297],"duration":6.008,"entry":[false,true],"geometry_index":30,"in":0,"is_urban":true,"location":[-122.26901,37.798331],"mapbox_streets_v8":{"class":"secondary"},"out":1,"turn_duration":0.008,"turn_weight":2,"weight":9.05},{"admin_index":0,"bearings":[116,296],"duration":5.607,"entry":[false,true],"geometry_index":32,"in":0,"is_urban":true,"location":[-122.269464,37.798509],"mapbox_streets_v8":{"class":"secondary"},"out":1,"turn_duration":0.007,"turn_weight":0.5,"weight":7.08},{"admin_index":0,"bearings":[116,296],"duration":0.807,"entry":[false,true],"geometry_index":33,"in":0,"is_urban":true,"location":[-122.269897,37.798678],"mapbox_streets_v8":{"class":"secondary"},"out":1,"turn_duration":0.007,"turn_weight":0.5,"weight":1.44},{"admin_index":0,"bearings":[116,297],"duration":0.808,"entry":[false,true],"geometry_index":34,"in":0,"is_urban":true,"location":[-122.269963,37.798704],"mapbox_streets_v8":{"class":"secondary"},"out":1,"turn_duration":0.008,"turn_weight":0.5,"weight":1.44},{"admin_index":0,"bearings":[117,296],"duration":2.286,"entry":[false,true],"geometry_index":35,"in":0,"is_urban":true,"location":[-122.270021,37.798727],"mapbox_streets_v8":{"class":"secondary"},"out":1,"turn_duration":0.019,"turn_weight":0.5,"weight":3.163},{"admin_index":0,"bearings":[116,296],"duration":23.157,"entry":[false,true],"geometry_index":37,"in":0,"is_urban":true,"location":[-122.270191,37.798793],"mapbox_streets_v8":{"class":"secondary"},"out":1,"turn_duration":2.007,"turn_weight":2,"weight":26.851},{"admin_index":0,"bearings":[117,296],"entry":[false,true],"geometry_index":40,"in":0,"is_urban":true,"location":[-122.271148,37.79917],"mapbox_streets_v8":{"class":"secondary"},"out":1,"turn_weight":0.5}],"maneuver":{"bearing_after":296,"bearing_before":206,"instruction":"Turn right onto 8th Street.","location":[-122.267825,37.797866],"modifier":"right","type":"turn"},"mode":"driving","name":"8th Street","speedLimitSign":"mutcd","speedLimitUnit":"mph","voiceInstructions":[{"announcement":"In a quarter mile, Turn left onto Webster Street.","distanceAlongGeometry":331.667,"ssmlAnnouncement":"In a quarter mile, Turn left onto Webster Street."},{"announcement":"Turn left onto Webster Street. Then Your destination will be on the right.","distanceAlongGeometry":107.528,"ssmlAnnouncement":"Turn left onto Webster Street. Then Your destination will be on the right."}],"weight":81.537,"weight_typical":95.477},{"bannerInstructions":[{"distanceAlongGeometry":24.342,"primary":{"components":[{"text":"Your destination is on the right","type":"text"}],"modifier":"right","text":"Your destination is on the right","type":"arrive"}}],"distance":24.342,"driving_side":"right","duration":29.418,"duration_typical":14.251,"geometry":"utabgAzgzehF|DtBhE|B","intersections":[{"admin_index":0,"bearings":[117,206],"entry":[false,true],"geometry_index":42,"in":0,"is_urban":true,"lanes":[{"active":false,"indications":["left"],"valid":true,"valid_indication":"left"},{"active":true,"indications":["left","straight"],"valid":true,"valid_indication":"left"},{"active":false,"indications":["straight"],"valid":false},{"active":false,"indications":["straight"],"valid":false}],"location":[-122.271374,37.799259],"mapbox_streets_v8":{"class":"tertiary"},"out":1,"turn_duration":7.51,"turn_weight":15}],"maneuver":{"bearing_after":206,"bearing_before":297,"instruction":"Turn left onto Webster Street.","location":[-122.271374,37.799259],"modifier":"left","type":"turn"},"mode":"driving","name":"Webster Street","speedLimitSign":"mutcd","speedLimitUnit":"mph","voiceInstructions":[{"announcement":"Your destination is on the right.","distanceAlongGeometry":24.342,"ssmlAnnouncement":"Your destination is on the right."}],"weight":40.742,"weight_typical":22.921},{"bannerInstructions":[],"distance":0,"driving_side":"right","duration":0,"duration_typical":0,"geometry":"mhabgAnozehF??","intersections":[{"admin_index":0,"bearings":[26],"entry":[true],"geometry_index":44,"in":0,"location":[-122.271496,37.799063]}],"maneuver":{"bearing_after":0,"bearing_before":206,"instruction":"Your destination is on the right.","location":[-122.271496,37.799063],"modifier":"right","type":"arrive"},"mode":"driving","name":"Webster Street","speedLimitSign":"mutcd","speedLimitUnit":"mph","voiceInstructions":[],"weight":0,"weight_typical":0}],"summary":"11th Street, 8th Street","via_waypoints":[],"weight":274.12,"weight_typical":279.754}],"voiceLocale":"en-US","weight":274.12,"weight_name":"auto","weight_typical":279.754}],"code":"Ok","uuid":"route_alternative_uuid"} \ No newline at end of file +{"routes":[{"distance":1006.574,"duration":221.796,"duration_typical":226.731,"geometry":"i|ebgAlixehFfCyIvA_FrAwErVc{@xAeFpAoEfEeO~Ogk@tA{EvA_FnBsGtHuVxIuZvA}EzC`Bx_@nSpDlBdDfBxK~FnRbKnDnB~C`BjBbAt[zPhDhBsAtEuHvW}ErPqFhRgAtDgApD{GxUqI`Zs@bCm@rBq@`CqApEsAvEuFlRgLr`@mAfEcBzF|DtBhE|B","legs":[{"admins":[{"iso_3166_1":"US","iso_3166_1_alpha3":"USA"}],"annotation":{"congestion_numeric":[0,0,0,0,0,null,null,null,null,null,null,17,17,17,null,null,null,27,27,27,27,0,0,0,0,8,8,8,8,8,0,0,0,0,0,0,0,20,20,20,20,20,72,72],"distance":[17,11,10.6,94.5,11.3,10.2,25.4,69.2,10.8,11,13.6,37.5,43.5,10.9,9.7,65.2,11,10.3,25.4,38.7,11,9.9,6.7,57,10.5,10.5,38.9,27.7,30.3,9,8.8,35.8,42.5,6.5,5.7,6.4,10.3,10.6,30.6,52.9,9.8,12.4,11.8,12.6],"duration":[2.271,1.467,2.242,20.012,2.39,1.753,4.347,11.871,1.851,1.165,1.445,7.507,8.693,2.185,2.327,15.642,2.646,1.687,4.164,6.332,1.794,1.781,1.208,10.252,1.899,1.182,4.373,3.118,3.413,1.007,1.173,4.772,5.664,0.865,0.761,0.848,1.374,2.382,6.883,11.898,2.207,2.79,10.602,11.306],"maxspeed":[{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true}],"speed":[7.5,7.5,4.7,4.7,4.7,5.8,5.8,5.8,5.8,9.4,9.4,5,5,5,4.2,4.2,4.2,6.1,6.1,6.1,6.1,5.6,5.6,5.6,5.6,8.9,8.9,8.9,8.9,8.9,7.5,7.5,7.5,7.5,7.5,7.5,7.5,4.4,4.4,4.4,4.4,4.4,1.1,1.1]},"distance":1006.574,"duration":221.796,"duration_typical":226.731,"steps":[{"bannerInstructions":[{"distanceAlongGeometry":377.232,"primary":{"components":[{"text":"Jackson Street","type":"text"}],"modifier":"right","text":"Jackson Street","type":"turn"}}],"distance":377.232,"driving_side":"right","duration":73.322,"duration_typical":73.322,"geometry":"i|ebgAlixehFfCyIvA_FrAwErVc{@xAeFpAoEfEeO~Ogk@tA{EvA_FnBsGtHuVxIuZvA}E","intersections":[{"admin_index":0,"bearings":[116],"duration":3.764,"entry":[true],"geometry_index":0,"is_urban":true,"location":[-122.270375,37.801429],"mapbox_streets_v8":{"class":"primary"},"out":0,"weight":4.423},{"admin_index":0,"bearings":[116,296],"duration":26.584,"entry":[true,false],"geometry_index":2,"in":1,"is_urban":true,"location":[-122.27009,37.801317],"mapbox_streets_v8":{"class":"primary"},"out":0,"turn_duration":2.019,"weight":28.864},{"admin_index":0,"bearings":[117,296],"duration":3.722,"entry":[true,false],"geometry_index":5,"in":1,"is_urban":true,"location":[-122.268905,37.800852],"mapbox_streets_v8":{"class":"primary"},"out":0,"turn_duration":2.007,"turn_weight":2,"weight":4.014},{"admin_index":0,"bearings":[116,297],"duration":16.286,"entry":[true,false],"geometry_index":6,"in":1,"is_urban":true,"location":[-122.268801,37.800811],"mapbox_streets_v8":{"class":"primary"},"out":0,"weight":19.136},{"admin_index":0,"bearings":[116,296],"duration":1.905,"entry":[true,false],"geometry_index":8,"in":1,"is_urban":true,"location":[-122.267834,37.800439],"mapbox_streets_v8":{"class":"primary"},"out":0,"turn_duration":0.019,"weight":2.216},{"admin_index":0,"bearings":[117,296],"duration":2.654,"entry":[true,false],"geometry_index":9,"in":1,"is_urban":true,"location":[-122.267724,37.800396],"mapbox_streets_v8":{"class":"primary"},"out":0,"turn_duration":0.007,"weight":3.11},{"admin_index":0,"bearings":[117,297],"entry":[true,false],"geometry_index":11,"in":1,"is_urban":true,"location":[-122.26747400000001,37.800296],"mapbox_streets_v8":{"class":"primary"},"out":0,"turn_duration":0.007}],"maneuver":{"bearing_after":116,"bearing_before":0,"instruction":"Drive southeast on 11th Street.","location":[-122.270375,37.801429],"type":"depart"},"mode":"driving","name":"11th Street","speedLimitSign":"mutcd","speedLimitUnit":"mph","voiceInstructions":[{"announcement":"Drive southeast on 11th Street. Then, in a quarter mile, Turn right onto Jackson Street.","distanceAlongGeometry":377.232,"ssmlAnnouncement":"Drive southeast on 11th Street. Then, in a quarter mile, Turn right onto Jackson Street."},{"announcement":"Turn right onto Jackson Street.","distanceAlongGeometry":66.667,"ssmlAnnouncement":"Turn right onto Jackson Street."}],"weight":83.383,"weight_typical":83.383},{"bannerInstructions":[{"distanceAlongGeometry":257,"primary":{"components":[{"text":"8th Street","type":"text"}],"modifier":"right","text":"8th Street","type":"turn"}}],"distance":257,"driving_side":"right","duration":58.159,"duration_typical":66.398,"geometry":"g~bbgAxypehFzC`Bx_@nSpDlBdDfBxK~FnRbKnDnB~C`BjBbAt[zPhDhB","intersections":[{"admin_index":0,"bearings":[206,296],"duration":24.745,"entry":[true,false],"geometry_index":14,"in":1,"is_urban":true,"location":[-122.266541,37.799924],"mapbox_streets_v8":{"class":"street"},"out":0,"turn_duration":4.105,"turn_weight":5,"weight":29.252},{"admin_index":0,"bearings":[26,206],"duration":7.898,"entry":[false,true],"geometry_index":17,"in":0,"is_urban":true,"location":[-122.266973,37.799232],"mapbox_streets_v8":{"class":"street"},"out":1,"turn_duration":2.007,"turn_weight":2,"weight":8.922},{"admin_index":0,"bearings":[26,206],"duration":8.189,"entry":[false,true],"geometry_index":19,"in":0,"is_urban":true,"location":[-122.267153,37.798944],"mapbox_streets_v8":{"class":"street"},"out":1,"turn_duration":0.007,"turn_weight":0.5,"weight":10.114},{"admin_index":0,"bearings":[27,206],"duration":5.079,"entry":[false,true],"geometry_index":21,"in":0,"is_urban":true,"location":[-122.267403,37.798544],"mapbox_streets_v8":{"class":"street"},"out":1,"turn_duration":2.019,"turn_weight":2,"weight":5.596},{"admin_index":0,"bearings":[26,206],"entry":[false,true],"geometry_index":23,"in":0,"is_urban":true,"location":[-122.267486,37.79841],"mapbox_streets_v8":{"class":"street"},"out":1,"turn_duration":0.007,"turn_weight":0.5}],"maneuver":{"bearing_after":206,"bearing_before":116,"instruction":"Turn right onto Jackson Street.","location":[-122.266541,37.799924],"modifier":"right","type":"turn"},"mode":"driving","name":"Jackson Street","speedLimitSign":"mutcd","speedLimitUnit":"mph","voiceInstructions":[{"announcement":"In 800 feet, Turn right onto 8th Street.","distanceAlongGeometry":247,"ssmlAnnouncement":"In 800 feet, Turn right onto 8th Street."},{"announcement":"Turn right onto 8th Street.","distanceAlongGeometry":50,"ssmlAnnouncement":"Turn right onto 8th Street."}],"weight":68.459,"weight_typical":77.974},{"bannerInstructions":[{"distanceAlongGeometry":348,"primary":{"components":[{"text":"Webster Street","type":"text"}],"modifier":"left","text":"Webster Street","type":"turn"},"sub":{"components":[{"active":false,"directions":["left"],"driving_side":"right","text":"","type":"lane"},{"active":true,"active_direction":"left","directions":["left","straight"],"driving_side":"right","text":"","type":"lane"},{"active":false,"directions":["straight"],"driving_side":"right","text":"","type":"lane"},{"active":false,"directions":["straight"],"driving_side":"right","text":"","type":"lane"}],"text":""}}],"distance":348,"driving_side":"right","duration":60.897,"duration_typical":72.761,"geometry":"s}~agA`jsehFsAtEuHvW}ErPqFhRgAtDgApD{GxUqI`Zs@bCm@rBq@`CqApEsAvEuFlRgLr`@mAfEcBzF","intersections":[{"admin_index":0,"bearings":[26,296],"duration":9.721,"entry":[false,true],"geometry_index":25,"in":0,"is_urban":true,"location":[-122.267825,37.797866],"mapbox_streets_v8":{"class":"secondary"},"out":1,"turn_duration":4.208,"turn_weight":10,"weight":16.339},{"admin_index":0,"bearings":[116,296],"duration":3.157,"entry":[false,true],"geometry_index":27,"in":0,"is_urban":true,"location":[-122.268328,37.798063],"mapbox_streets_v8":{"class":"secondary"},"out":1,"turn_duration":0.007,"turn_weight":0.5,"weight":4.201},{"admin_index":0,"bearings":[116,296],"duration":4.395,"entry":[false,true],"geometry_index":28,"in":0,"is_urban":true,"location":[-122.26861,37.798174],"mapbox_streets_v8":{"class":"secondary"},"out":1,"turn_duration":0.007,"turn_weight":0.5,"weight":5.655},{"admin_index":0,"bearings":[116,297],"duration":6.008,"entry":[false,true],"geometry_index":30,"in":0,"is_urban":true,"location":[-122.26901,37.798331],"mapbox_streets_v8":{"class":"secondary"},"out":1,"turn_duration":0.008,"turn_weight":2,"weight":9.05},{"admin_index":0,"bearings":[116,296],"duration":5.607,"entry":[false,true],"geometry_index":32,"in":0,"is_urban":true,"location":[-122.269464,37.798509],"mapbox_streets_v8":{"class":"secondary"},"out":1,"turn_duration":0.007,"turn_weight":0.5,"weight":7.08},{"admin_index":0,"bearings":[116,296],"duration":0.807,"entry":[false,true],"geometry_index":33,"in":0,"is_urban":true,"location":[-122.269897,37.798678],"mapbox_streets_v8":{"class":"secondary"},"out":1,"turn_duration":0.007,"turn_weight":0.5,"weight":1.44},{"admin_index":0,"bearings":[116,297],"duration":0.808,"entry":[false,true],"geometry_index":34,"in":0,"is_urban":true,"location":[-122.269963,37.798704],"mapbox_streets_v8":{"class":"secondary"},"out":1,"turn_duration":0.008,"turn_weight":0.5,"weight":1.44},{"admin_index":0,"bearings":[117,296],"duration":2.286,"entry":[false,true],"geom diff --git a/qa-test-app/src/main/java/com/mapbox/navigation/qa_test_app/view/AlternativeRouteActivity.kt b/qa-test-app/src/main/java/com/mapbox/navigation/qa_test_app/view/AlternativeRouteActivity.kt index 5bbed67cc57..8df2c7c8899 100644 --- a/qa-test-app/src/main/java/com/mapbox/navigation/qa_test_app/view/AlternativeRouteActivity.kt +++ b/qa-test-app/src/main/java/com/mapbox/navigation/qa_test_app/view/AlternativeRouteActivity.kt @@ -115,7 +115,7 @@ class AlternativeRouteActivity : AppCompatActivity(), OnMapLongClickListener { mapboxNavigation.unregisterRouteProgressObserver(replayProgressObserver) mapboxNavigation.unregisterLocationObserver(locationObserver) mapboxNavigation.unregisterRoutesObserver(routesObserver) - mapboxNavigation.unregisterRouteAlternativesObserver(requestAlternativesObserver) + mapboxNavigation.unregisterRouteAlternativesObserver(routeAlternativesObserver) } override fun onDestroy() { @@ -134,7 +134,7 @@ class AlternativeRouteActivity : AppCompatActivity(), OnMapLongClickListener { mapboxNavigation.registerLocationObserver(locationObserver) mapboxNavigation.registerRouteProgressObserver(replayProgressObserver) mapboxNavigation.registerRoutesObserver(routesObserver) - mapboxNavigation.registerRouteAlternativesObserver(requestAlternativesObserver) + mapboxNavigation.registerRouteAlternativesObserver(routeAlternativesObserver) mapboxReplayer.pushRealLocation(this, 0.0) mapboxReplayer.playbackSpeed(1.5) mapboxReplayer.play() @@ -201,10 +201,17 @@ class AlternativeRouteActivity : AppCompatActivity(), OnMapLongClickListener { } /** - * Whenever alternatives have changed, request a new set of alternatives. + * Example of how to handle route alternatives during navigation. */ - private val requestAlternativesObserver = - RouteAlternativesObserver { _, _, _ -> + private val routeAlternativesObserver = + RouteAlternativesObserver { routeProgress, alternatives, _ -> + // Set the alternatives suggested + val updatedRoutes = mutableListOf() + updatedRoutes.add(routeProgress.route) + updatedRoutes.addAll(alternatives) + mapboxNavigation.setRoutes(updatedRoutes) + + // Request new alternatives instead of waiting for the interval. mapboxNavigation.requestAlternativeRoutes() } @@ -222,7 +229,7 @@ class AlternativeRouteActivity : AppCompatActivity(), OnMapLongClickListener { routes: List, routerOrigin: RouterOrigin ) { - mapboxNavigation.setRoutes(routes) + mapboxNavigation.setRoutes(routes.reversed()) } override fun onFailure(