diff --git a/build.gradle b/build.gradle index e959361d65c..dc4d721e8ef 100644 --- a/build.gradle +++ b/build.gradle @@ -42,6 +42,7 @@ task testReport(type: TestReport, group: 'Build') { allprojects { repositories { + mavenLocal() google() mavenCentral() maven { diff --git a/gradle/dependencies.gradle b/gradle/dependencies.gradle index a6e1905ae91..062cb86afe8 100644 --- a/gradle/dependencies.gradle +++ b/gradle/dependencies.gradle @@ -19,7 +19,7 @@ ext { version = [ mapboxMapSdk : '10.13.0-rc.1', - mapboxSdkServices : '6.11.0', + mapboxSdkServices : '6.12.0-dzina', mapboxNavigator : "${mapboxNavigatorVersion}", mapboxCommonNative : '23.5.0-rc.1', mapboxCrashMonitor : '2.0.0', diff --git a/instrumentation-tests/src/androidTest/java/com/mapbox/navigation/instrumentation_tests/core/UpcomingRouteObjectsTest.kt b/instrumentation-tests/src/androidTest/java/com/mapbox/navigation/instrumentation_tests/core/UpcomingRouteObjectsTest.kt index bd016a90334..bfde8572673 100644 --- a/instrumentation-tests/src/androidTest/java/com/mapbox/navigation/instrumentation_tests/core/UpcomingRouteObjectsTest.kt +++ b/instrumentation-tests/src/androidTest/java/com/mapbox/navigation/instrumentation_tests/core/UpcomingRouteObjectsTest.kt @@ -10,6 +10,7 @@ import com.mapbox.navigation.base.extensions.applyDefaultNavigationOptions import com.mapbox.navigation.base.options.NavigationOptions import com.mapbox.navigation.base.options.RoutingTilesOptions import com.mapbox.navigation.base.route.NavigationRoute +import com.mapbox.navigation.base.route.RouteRefreshOptions import com.mapbox.navigation.base.route.RouterOrigin import com.mapbox.navigation.base.trip.model.RouteProgressState import com.mapbox.navigation.base.trip.model.roadobject.RoadObjectType @@ -18,6 +19,7 @@ import com.mapbox.navigation.base.trip.model.roadobject.border.CountryBorderCros import com.mapbox.navigation.base.trip.model.roadobject.ic.Interchange import com.mapbox.navigation.base.trip.model.roadobject.incident.Incident import com.mapbox.navigation.base.trip.model.roadobject.jct.Junction +import com.mapbox.navigation.base.trip.model.roadobject.notification.Notification import com.mapbox.navigation.base.trip.model.roadobject.railwaycrossing.RailwayCrossing import com.mapbox.navigation.base.trip.model.roadobject.restrictedarea.RestrictedArea import com.mapbox.navigation.base.trip.model.roadobject.reststop.RestStop @@ -28,6 +30,8 @@ import com.mapbox.navigation.core.MapboxNavigation import com.mapbox.navigation.core.MapboxNavigationProvider import com.mapbox.navigation.core.directions.session.RoutesExtra import com.mapbox.navigation.core.internal.extensions.flowLocationMatcherResult +import com.mapbox.navigation.core.trip.session.LocationMatcherResult +import com.mapbox.navigation.core.trip.session.LocationObserver import com.mapbox.navigation.instrumentation_tests.R import com.mapbox.navigation.instrumentation_tests.utils.http.FailByRequestMockRequestHandler import com.mapbox.navigation.instrumentation_tests.utils.http.MockDirectionsRefreshHandler @@ -502,6 +506,162 @@ class UpcomingRouteObjectsTest : BaseCoreNoCleanUpTest() { checkRoadObjects(expectedObjectsAfterFirstRefresh, updateAfterRefresh.upcomingRoadObjects) } + // TODO up NN when they add unique id + @OptIn(ExperimentalPreviewMapboxNavigationAPI::class) + @Test + fun roadObjectNotificationsTest() = sdkTest { + mapboxNavigation = createMapboxNavigation( + // only refresh on demand + RouteRefreshOptions.Builder().intervalMillis(300000).build() + ) + val coordinates = listOf( + Point.fromLngLat(-115.574669, 49.586752), + Point.fromLngLat(-115.243927, 49.419375), + Point.fromLngLat(-115.333568, 49.444112), + ) + mockWebServerRule.requestHandlers.clear() + val routeHandler = MockDirectionsRequestHandler( + "driving-traffic", + readRawFileText(context, R.raw.route_with_notifications), + coordinates, + relaxedExpectedCoordinates = true + ) + mockWebServerRule.requestHandlers.add(routeHandler) + mockWebServerRule.requestHandlers.add( + FailByRequestMockRequestHandler( + MockDirectionsRefreshHandler( + "route_with_notifications", + readRawFileText(context, R.raw.route_with_notifications_refresh1), + acceptedGeometryIndex = 400 + ) + ) + ) + + val routes = mapboxNavigation.requestRoutes( + RouteOptions.builder().applyDefaultNavigationOptions() + .profile(DirectionsCriteria.PROFILE_DRIVING_TRAFFIC) + .alternatives(false) + .enableRefresh(true) + .coordinatesList(coordinates) + .baseUrl(mockWebServerRule.baseUrl) + .build() + ).getSuccessfulResultOrThrowException().routes + + val originalRoadObjects = routes.first().upcomingRoadObjects + val expectedOriginalRoadObjectClasses = listOf( + Notification::class.java, + Notification::class.java, + Notification::class.java, + Notification::class.java, + Notification::class.java, + ) + + assertEquals( + expectedOriginalRoadObjectClasses, + originalRoadObjects.map { it.roadObject::class.java } + ) + + mapboxNavigation.startTripSession() + + stayOnPosition(coordinates[0], 90f) + mapboxNavigation.flowLocationMatcherResult() + .filter { + abs(it.enhancedLocation.latitude - coordinates[0].latitude()) < 0.01 && + abs(it.enhancedLocation.longitude - coordinates[0].longitude()) < 0.01 + }.first() + mapboxNavigation.setNavigationRoutes(routes) + + // no road objects passed + val geometryIndex400Point = routes.first().directionsRoute.completeGeometryToPoints()[400] + stayOnPosition(geometryIndex400Point, 320f) + val routeProgress1 = mapboxNavigation.routeProgressUpdates() + .filter { + it.currentState == RouteProgressState.TRACKING && + it.currentRouteGeometryIndex == 400 + } + .first() + val expectedObjects1 = originalRoadObjects.map { + it.roadObject::class.java to it.distanceToStart!! - routeProgress1.distanceTraveled + } + +// checkRoadObjects(expectedObjects1, routeProgress1.upcomingRoadObjects) + + mapboxNavigation.routeRefreshController.requestImmediateRouteRefresh() + mapboxNavigation.routesUpdates() + .filter { it.reason == RoutesExtra.ROUTES_UPDATE_REASON_REFRESH } + .first() + + val routeProgress2 = mapboxNavigation.routeProgressUpdates() + .take(2).toList().first() + val expectedObjects2 = originalRoadObjects.map { + it.roadObject::class.java to it.distanceToStart!! - routeProgress1.distanceTraveled + } + +// checkRoadObjects(expectedObjects2, routeProgress2.upcomingRoadObjects) + + // in the middle of the first notification + val firstLegSize = routes.first().directionsRoute.legs()?.firstOrNull()?.annotation()?.duration()?.size + val geometryIndex600Point = routes.first().directionsRoute.completeGeometryToPoints()[600] + stayOnPosition(geometryIndex600Point, 340f) + val routeProgress3 = mapboxNavigation.routeProgressUpdates() + .filter { + it.currentState == RouteProgressState.TRACKING && + it.currentRouteGeometryIndex == 600 + } + .first() + val expectedObjects3 = originalRoadObjects.map { + it.roadObject::class.java to it.distanceToStart!! - routeProgress1.distanceTraveled + } + +// checkRoadObjects(expectedObjects3, routeProgress3.upcomingRoadObjects) + + // after first notification + val geometryIndex634Point = routes.first().directionsRoute.completeGeometryToPoints()[634] + stayOnPosition(geometryIndex634Point, 0f) + mapboxNavigation.navigateNextRouteLeg() + + val routeProgress4 = mapboxNavigation.routeProgressUpdates() + .filter { + it.currentState == RouteProgressState.TRACKING && + it.currentRouteGeometryIndex == 634 + } + .first() + val expectedObjects4 = originalRoadObjects.drop(1).map { + it.roadObject::class.java to it.distanceToStart!! - routeProgress1.distanceTraveled + } +// checkRoadObjects(expectedObjects4, routeProgress4.upcomingRoadObjects) + + // 3 notifications passed + val geometryIndex659Point = routes.first().directionsRoute.completeGeometryToPoints()[659] + stayOnPosition(geometryIndex659Point, 0f) + + val routeProgress5 = mapboxNavigation.routeProgressUpdates() + .filter { + it.currentState == RouteProgressState.TRACKING && + it.currentRouteGeometryIndex == 659 + } + .first() + val expectedObjects5 = originalRoadObjects.drop(3).map { + it.roadObject::class.java to it.distanceToStart!! - routeProgress1.distanceTraveled + } +// checkRoadObjects(expectedObjects5, routeProgress5.upcomingRoadObjects) + + // 4 notifications passed + val geometryIndex760Point = routes.first().directionsRoute.completeGeometryToPoints()[760] + stayOnPosition(geometryIndex760Point, 0f) + + val routeProgress6 = mapboxNavigation.routeProgressUpdates() + .filter { + it.currentState == RouteProgressState.TRACKING && + it.currentRouteGeometryIndex == 760 + } + .first() + val expectedObjects6 = originalRoadObjects.drop(4).map { + it.roadObject::class.java to it.distanceToStart!! - routeProgress1.distanceTraveled + } +// checkRoadObjects(expectedObjects6, routeProgress6.upcomingRoadObjects) + } + private fun stayOnPosition(position: Point, bearing: Float = 0f) { mockLocationReplayerRule.loopUpdate( mockLocationUpdatesRule.generateLocationUpdate { @@ -601,7 +761,9 @@ class UpcomingRouteObjectsTest : BaseCoreNoCleanUpTest() { } } - private fun createMapboxNavigation(): MapboxNavigation = MapboxNavigationProvider.create( + private fun createMapboxNavigation( + routeRefreshOptions: RouteRefreshOptions = RouteRefreshOptions.Builder().build() + ): MapboxNavigation = MapboxNavigationProvider.create( NavigationOptions.Builder(context) .accessToken(getMapboxAccessTokenFromResources(context)) .routingTilesOptions( @@ -609,6 +771,7 @@ class UpcomingRouteObjectsTest : BaseCoreNoCleanUpTest() { .tilesBaseUri(URI(mockWebServerRule.baseUrl)) .build() ) + .routeRefreshOptions(routeRefreshOptions) .build() ) diff --git a/instrumentation-tests/src/main/res/raw/route_with_notifications.json b/instrumentation-tests/src/main/res/raw/route_with_notifications.json new file mode 100644 index 00000000000..63b81659d5d --- /dev/null +++ b/instrumentation-tests/src/main/res/raw/route_with_notifications.json @@ -0,0 +1 @@ +{"routes":[{"weight_typical":639313.359,"duration_typical":5252.346,"weight_name":"auto","weight":639313.359,"duration":5252.346,"distance":54338.797,"legs":[{"via_waypoints":[],"admins":[{"iso_3166_1_alpha3":"CAN","iso_3166_1":"CA"}],"notifications":[{"details":{"requested_value":"paved","actual_value":"gravel","message":"The road has an unpaved surface (gravel)."},"subtype":"unpaved","type":"violation","geometry_index_end":633,"geometry_index_start":562}],"annotation":{"maxspeed":[{"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},{"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},{"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},{"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},{"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},{"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},{"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},{"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},{"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},{"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},{"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},{"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":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"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},{"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},{"unknown":true},{"unknown":true},{"unknown":true}],"congestion_numeric":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,null,0,0,0,0,0,0,0,8,8,8,8,0,0,0,null,0,0,0,null,0,0,8,8,8,8,0,0,0,0,0,0,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"speed":[21.1,21.1,21.1,21.1,21.1,21.1,21.1,21.1,21.1,21.1,21.1,21.1,21.1,21.1,21.1,21.1,21.1,21.1,21.1,21.1,21.1,21.1,21.1,21.1,21.1,21.1,21.1,21.1,21.1,21.7,21.7,21.7,21.7,21.7,21.7,21.7,21.7,21.7,21.7,21.7,21.7,21.7,21.7,21.7,21.7,21.7,21.7,21.7,21.7,21.7,21.7,21.7,21.7,21.7,21.7,21.7,21.7,16.6,16.6,16.7,16.7,16.7,16.7,16.7,16.7,16.9,22,22,22,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,7.8,7.8,7.8,7.8,7.8,17.9,17.9,17.9,17.9,17.9,7.2,7.2,7.2,7.2,7.2,7.2,7.2,7.8,7.8,8.6,8.6,8.6,11.4,11.4,18.3,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,26.7,26.7,26.7,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,22.8,22.8,22.8,22.8,20.6,19.4,19.4,19.4,19.4,19.4,19.4,19.4,20.6,20.6,20.6,20.6,21.6,21.6,21.6,20.7,22,22,22,21.5,22.8,22.8,21.7,21.7,21.7,21.7,21.9,21.9,21.9,21.9,21.9,21.9,7.3,12,12,12.5,12.5,12.5,12.5,12.5,13.9,13.9,13.9,13.9,13.9,13.9,13.9,13.9,13.9,13.9,13.9,13.9,13.9,13.9,13.9,13.9,11.1,11.1,11.1,11.1,11.1,11.1,11.1,11.1,11.1,13.9,13.9,13.9,13.9,13.9,13.9,13.9,13.9,13.9,13.9,13.9,13.9,13.9,13.9,13.9,13.9,13.9,13.9,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,11.1,11.1,11.1,11.1,11.1,11.1,11.1,11.1,11.1,11.1,11.1,11.1,11.1,11.1,11.1,11.1,11.1,11.1,10.9,11.1,11.1,11.1,11.1,11.1,10.3,10.3,10.3,10.3,10.3,10.3,10.3,10.8,10.8,10.8,10.8,10.8,10.8,10.8,10.3,12,12,12,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,13.3,13.3,13.3,13.3,13.3,5.3,5.3,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4],"distance":[47.3,91.4,19.5,18.9,14.1,15.7,11.3,18.2,70.1,407.4,163.6,205.1,685.8,162.6,341.9,224.1,86.7,65.7,129.5,117.3,1195.4,93.2,85.2,76.1,450.4,241.1,112.6,71.5,53.3,94.3,206.6,183.1,94.9,53.6,75.4,161.5,65.2,122.7,158,85.9,69.2,144.4,158.3,117,163.3,105.5,50.2,70.3,371.7,174.2,76.8,41.1,38.5,79.7,72.4,188.7,146.8,209.9,20.7,65.5,88.9,67.7,91.2,46.7,108.3,13.1,245.1,159.9,306.5,18,21.9,43.7,66.9,101.5,69.6,63.6,86.9,71.2,67.8,96.1,79.7,98.1,188.4,121.6,119.5,68.7,240.6,98.6,151.8,244.4,117.7,107.4,63.2,165.5,136.4,58.1,58.2,51.9,53,172.5,91.4,129.3,103.6,174.1,71.5,56,59.6,120.4,73.3,46.4,60.7,55.9,99.1,94.1,83.8,90.8,200.4,164.1,86.3,162.1,73.3,34,40.1,23.2,27.1,37.1,29.4,45,18.8,20.4,17,28.1,44.9,43.1,56.5,36.6,47.3,53.5,30.4,32.2,35.7,38.5,63.3,74.8,79.7,73,22.1,28.7,32.6,37.4,49.4,47.6,36.3,54,45.8,37.9,37.3,35.2,45,42.3,43.2,38.5,36.7,61.6,50,41.5,47.8,31.5,51.2,28.6,28.1,35.9,34.5,32.1,38,35.8,34.5,37.9,33.2,30.4,30.2,18.6,21.5,39.3,36,34.6,45,24.2,20.1,20.5,23.4,44.2,109.5,106.5,44.9,44.1,49.8,16,18.2,11.9,15,15.3,36.8,29.3,29.4,28.8,42.8,76.9,65.6,23.1,34,18.5,52.1,7.4,59.7,56.7,36.9,41.7,38.7,54.9,127.5,43.6,99.3,42.2,39.5,61.1,43.3,203.7,105.1,30.3,81,81.4,70.3,72.1,56.7,42,134.7,78.2,101.3,50,31.1,20.3,26.8,45.7,45.5,46.9,14.1,20.3,19.8,15.5,15.4,16.8,18.4,22.6,26.1,27,23.4,34.5,28.9,27.3,23.1,17.2,32.5,29.8,39.2,27.1,31.1,23.7,49.9,38.2,85.2,68.6,65.7,62.7,82,41.2,55.7,46.7,26.4,39.5,44.3,28.2,26.3,47.6,28.8,20.2,20.7,18.4,15.3,18.3,16.3,14.3,13.9,15,18.1,30.1,25.3,19.1,27.3,19.8,24.2,21.3,32.7,23.5,32.2,15.4,22.2,31.1,36.4,39,22.1,56.4,33.5,55.9,72,41.6,48.2,50.7,39.6,33.8,37.2,43.4,49.2,24.9,46.7,33.8,25.5,15.9,17.1,15.6,13.9,20,28.9,30.3,34.6,28.2,23.9,15.8,14.7,13.6,18,15.9,20.2,10.3,10,19.2,61.2,32,54.9,368.4,64.8,58,145.5,150.2,94.6,59.3,95.2,92.2,81.5,702.8,112.8,305.8,42.6,39.7,83.6,59.8,97.5,64.4,51.5,61.3,49.1,62.7,62.9,77.3,68.1,59.8,70.8,65.9,66.5,64.4,38,34.2,61.6,62.2,50,38.5,56.4,59.8,54.4,49,39.4,47.6,30.9,49.2,40.8,35.8,51.7,43,63,52.9,43.5,33.4,26.3,10.7,8.3,14.9,25.4,361.7,66.4,49.5,252.7,138,167.1,541.3,200.6,166.5,221.4,110.8,141.8,108.6,139.5,471,331.3,162,327.5,111,110.1,145.3,326.8,19.6,157.7,568.1,16,70.8,66.7,70.4,57.3,43.9,42.1,43,36.8,55.3,53.7,57.6,49.8,70.4,35,61.9,91.4,135.1,44.9,52,56.6,45.1,21.8,67.2,92.1,157.1,59.5,251.3,126.5,48.3,62.7,50.5,9.5,55.6,47.8,40.3,50.1,49.1,57.7,40.4,82.8,37.3,51.4,72.1,29.1,69.8,74.5,40,72.5,47.5,32.4,29.8,31.1,57.7,72.6,49.6,65.2,53,72,92.3,61.7,54.8,32.7,19.7,39.9,47.7,100.6,111.5,51.6,36.2,37.5,24,5.1,55.7,30.1,54.9,88.8,51.5,31.5,14,26.9,20.4,20.5,22.5,18.6,38,31.6,32.2,22.5,28.1,19.1,16.1,13.9,15.9,13.7,44.2,42.2,32,25.6,62.5,43,40.4,26.4,24.5,29.8,27.1,21.2,25.9,20.1,30.7,41,61.1,46,47.6,28.8,56.4,9.6,22.6,17.7,45.3,51.6,39,29,13.4,30.8,65.2,71.1,80.1,57.2,27.2,54.2,36.1,33.1,19.4,45.2,93.5,420.3,92.1,48.4,43.7,18.3,36.5,37.1,74.6,107.8,13,49.8,51.7,71.6,47.2,74.2,90.9,126.3,102.2,86.1,116.2,67.7,109.8,50.9,122.9,186.6,152.2,36.9,41.6,97.5,36.2,20,29.9,68,126.8,90.2,192.2,140.4,36.5,67.9,67.7,63.1,22.6,70,47.8,49.5,66.2,75,36.5,101,59.4,36.1,23.6,146.6,94.2,171.4,46.4,177,98.9,29.4,130.6,27.1,51.4,31.1,117.1,132.7],"duration":[2.239,4.331,0.924,0.896,0.667,0.746,0.533,0.862,3.322,19.297,7.749,9.717,32.484,7.704,16.192,10.616,4.108,3.121,6.133,5.556,56.617,4.413,4.033,3.607,21.331,11.42,5.332,3.387,2.525,4.371,9.533,8.449,4.378,2.474,3.481,7.454,3.007,5.665,7.29,3.963,3.198,6.662,7.303,5.402,7.538,4.869,2.314,3.246,17.151,8.039,3.545,1.896,1.778,3.681,3.341,8.708,6.775,12.62,1.247,3.933,5.333,4.058,5.469,2.803,6.49,0.787,11.18,7.283,13.956,1.088,1.314,2.623,4.016,6.086,4.179,3.817,5.214,4.271,4.068,5.769,4.777,5.887,11.307,7.292,7.17,4.124,14.437,5.918,9.106,14.663,7.06,6.447,3.789,9.93,8.185,3.486,3.494,3.111,3.184,10.345,5.489,7.759,6.215,10.447,4.289,3.36,3.576,7.223,4.396,2.785,3.645,3.351,5.945,5.649,5.027,5.448,12.024,9.845,5.181,9.728,4.397,2.039,2.405,1.391,1.628,2.226,1.765,2.703,1.125,1.227,1.019,1.684,2.692,2.588,4.436,2.863,3.698,4.193,2.373,2.522,2.791,3.015,4.955,5.857,6.241,5.71,1.732,2.247,2.552,2.923,3.868,3.726,2.838,4.231,3.586,2.965,2.915,2.756,3.527,3.311,3.38,3.007,2.873,4.822,3.917,3.251,3.74,2.463,4.006,2.24,2.201,2.808,2.703,2.513,2.97,2.802,2.7,2.966,2.6,2.381,2.365,1.454,1.682,3.079,2.814,2.71,3.524,1.889,1.578,1.605,1.829,3.462,14.108,13.705,5.771,5.672,6.409,0.896,1.02,0.665,0.839,0.856,5.1,4.062,4.084,3.989,5.928,10.664,9.096,2.975,4.361,2.152,6.06,0.853,5.232,4.961,2.026,2.565,2.359,3.354,7.777,2.661,6.056,2.579,2.411,3.727,2.64,12.433,6.415,1.846,4.94,4.969,4.291,4.402,3.459,2.56,8.223,4.767,6.184,3.052,1.897,1.235,1.638,2.79,2.778,2.859,0.865,1.241,1.212,0.945,0.941,1.025,1.117,1.379,1.598,1.648,1.423,2.108,1.765,1.664,1.411,1.05,1.984,1.818,2.39,1.655,1.898,1.446,3.046,2.327,5.203,4.185,4.01,3.827,5.005,2.515,3.399,2.847,1.609,2.415,2.701,1.723,1.606,2.904,1.759,1.229,1.267,1.122,0.934,1.115,0.993,0.877,0.844,0.916,1.107,1.835,1.546,1.163,1.664,1.208,1.479,1.298,2,1.435,1.964,0.937,1.356,1.896,2.221,2.378,1.351,3.441,2.047,3.41,4.394,2.539,2.943,3.09,2.417,2.065,2.269,2.651,3.002,1.521,2.847,2.063,1.558,0.971,1.044,0.95,0.848,1.217,1.763,1.854,2.109,1.718,1.46,0.966,0.896,0.833,1.095,0.973,1.233,0.63,0.608,1.175,4.547,1.198,2.06,13.535,2.379,2.13,5.344,5.516,3.474,2.18,3.496,3.386,2.994,25.809,4.15,11.235,1.566,1.457,3.07,2.198,3.58,2.365,1.894,2.249,1.805,2.304,2.309,2.84,2.502,2.194,2.601,2.422,2.442,2.368,1.395,1.257,2.263,2.285,1.835,1.416,2.071,2.197,1.998,1.801,1.447,1.748,1.134,1.806,1.501,1.313,1.899,1.58,2.316,1.943,1.596,1.227,0.969,0.392,0.306,0.562,0.914,13.024,2.387,1.784,9.097,4.969,6.015,19.485,7.222,5.995,7.969,3.99,5.104,3.909,5.024,16.955,11.929,5.832,11.787,3.997,3.964,5.229,11.767,0.705,5.677,20.45,0.578,2.549,2.399,3.098,2.514,1.93,1.853,2.113,1.921,2.847,2.765,2.963,2.566,3.625,1.802,3.031,4.446,6.568,2.182,2.423,2.621,2.083,1.056,3.06,4.191,7.149,2.776,11.06,5.556,2.236,2.895,2.331,0.438,2.545,2.183,1.839,2.284,2.24,2.635,8.871,6.941,3.12,4.12,5.768,2.33,5.591,5.96,2.889,5.212,3.416,2.332,2.145,2.235,4.154,5.223,3.571,4.685,3.826,5.185,6.658,4.448,3.949,2.358,1.849,3.59,4.294,9.065,10.043,4.641,3.267,3.379,2.159,0.376,4.006,2.171,3.956,6.39,3.715,2.265,1.011,1.936,1.469,1.479,1.616,1.345,2.734,2.274,2.322,1.621,2.019,1.721,1.258,1.091,1.25,1.073,3.459,3.307,2.508,2.008,5.622,3.866,3.629,2.373,2.215,2.676,2.437,1.903,2.326,1.807,2.763,3.683,5.541,4.15,4.289,2.598,5.084,0.866,2.07,1.602,4.085,4.652,3.522,2.61,1.534,2.991,6.343,6.917,7.803,5.557,2.646,6.558,3.337,3.049,1.794,4.172,8.632,38.81,8.958,4.042,3.641,1.526,3.938,3.103,6.245,9.028,1.1,4.167,4.329,5.994,3.958,6.216,7.609,10.584,8.559,7.205,9.734,5.676,9.196,4.26,9.311,13.984,11.414,2.765,3.12,22.419,6.884,5.328,7.227,15.31,28.548,20.302,43.259,31.585,8.226,15.281,15.225,14.216,7.103,15.739,10.752,11.131,14.909,16.873,8.216,22.72,13.348,8.118,5.313,32.996,21.172,38.566,10.436,39.818,22.263,6.611,29.379,6.092,11.566,7.007,26.343,29.834]},"weight_typical":95627.234,"duration_typical":3110.191,"weight":95627.234,"duration":3110.191,"steps":[{"voiceInstructions":[{"ssmlAnnouncement":"Drive east for 15 miles.","announcement":"Drive east for 15 miles.","distanceAlongGeometry":23942.047},{"ssmlAnnouncement":"In a quarter mile, Turn left onto 3.","announcement":"In a quarter mile, Turn left onto 3.","distanceAlongGeometry":402.336},{"ssmlAnnouncement":"Turn left onto 3, 93.","announcement":"Turn left onto 3, 93.","distanceAlongGeometry":100}],"intersections":[{"entry":[true],"bearings":[83],"duration":122.385,"mapbox_streets_v8":{"class":"secondary"},"is_urban":false,"admin_index":0,"out":0,"weight":104.028,"geometry_index":0,"location":[-115.574669,49.586752]},{"entry":[true,true,false],"in":2,"bearings":[128,237,308],"duration":127.475,"turn_weight":0.5,"turn_duration":0.007,"mapbox_streets_v8":{"class":"secondary"},"is_urban":false,"admin_index":0,"out":0,"weight":108.848,"geometry_index":17,"location":[-115.553643,49.569755]},{"entry":[true,true,false],"in":2,"bearings":[18,99,280],"duration":155.511,"turn_weight":0.5,"turn_duration":0.019,"mapbox_streets_v8":{"class":"secondary"},"is_urban":false,"admin_index":0,"out":1,"weight":132.668,"geometry_index":29,"location":[-115.517775,49.564583]},{"entry":[false,true,true],"in":0,"bearings":[2,107,182],"duration":13.867,"turn_weight":0.5,"turn_duration":0.007,"mapbox_streets_v8":{"class":"secondary"},"is_urban":false,"admin_index":0,"out":2,"weight":12.281,"geometry_index":57,"location":[-115.48894,49.544518]},{"entry":[true,true,false],"in":2,"bearings":[176,256,356],"duration":28.087,"turn_weight":0.5,"turn_duration":0.007,"mapbox_streets_v8":{"class":"secondary"},"is_urban":false,"admin_index":0,"out":0,"weight":24.368,"geometry_index":59,"location":[-115.489023,49.542448]},{"entry":[false,true,false],"in":2,"bearings":[28,131,311],"duration":0.787,"turn_weight":0.5,"turn_duration":0.007,"mapbox_streets_v8":{"class":"secondary"},"is_urban":false,"admin_index":0,"out":1,"weight":1.163,"geometry_index":65,"location":[-115.486059,49.53888]},{"entry":[true,true,false],"in":2,"bearings":[129,208,311],"duration":32.419,"turn_weight":0.5,"turn_duration":0.019,"mapbox_streets_v8":{"class":"secondary"},"is_urban":false,"admin_index":0,"out":0,"weight":28.04,"geometry_index":66,"location":[-115.485922,49.538802]},{"entry":[true,true,false],"in":2,"bearings":[130,215,310],"duration":336.427,"turn_weight":0.5,"turn_duration":0.007,"mapbox_streets_v8":{"class":"secondary"},"is_urban":false,"admin_index":0,"out":0,"weight":286.457,"geometry_index":69,"location":[-115.478298,49.534757]},{"entry":[false,true,true],"in":0,"bearings":[31,122,214],"duration":180.165,"turn_weight":0.5,"turn_duration":0.008,"mapbox_streets_v8":{"class":"secondary"},"is_urban":false,"admin_index":0,"out":2,"weight":158.137,"geometry_index":134,"location":[-115.452986,49.48833]},{"entry":[true,true,false],"in":2,"bearings":[83,169,266],"duration":45.665,"turn_weight":0.5,"turn_duration":0.022,"mapbox_streets_v8":{"class":"secondary"},"is_urban":false,"admin_index":0,"out":0,"weight":40.438,"geometry_index":192,"location":[-115.456478,49.473177]},{"entry":[true,false],"in":1,"bearings":[112,288],"duration":4.275,"turn_weight":5.5,"mapbox_streets_v8":{"class":"secondary"},"is_urban":false,"admin_index":0,"out":0,"weight":9.241,"geometry_index":197,"location":[-115.451641,49.473162]},{"entry":[true,false],"in":1,"bearings":[125,305],"duration":42.923,"turn_weight":0.5,"mapbox_streets_v8":{"class":"secondary"},"is_urban":false,"admin_index":0,"out":0,"weight":38.058,"geometry_index":202,"location":[-115.450713,49.472839]},{"entry":[true,true,false],"in":2,"bearings":[142,228,322],"duration":7.335,"turn_weight":0.5,"turn_duration":0.007,"mapbox_streets_v8":{"class":"secondary"},"is_urban":false,"admin_index":0,"out":0,"weight":6.912,"geometry_index":209,"location":[-115.447887,49.47077]},{"entry":[true,true,false],"in":2,"bearings":[141,203,321],"duration":9.065,"turn_weight":0.5,"turn_duration":0.007,"mapbox_streets_v8":{"class":"secondary"},"is_urban":false,"admin_index":0,"out":0,"weight":8.426,"geometry_index":211,"location":[-115.447389,49.470371]},{"entry":[true,true,false],"in":2,"bearings":[149,266,326],"duration":10.193,"turn_weight":0.5,"turn_duration":0.008,"mapbox_streets_v8":{"class":"secondary"},"is_urban":false,"admin_index":0,"out":0,"weight":9.412,"geometry_index":214,"location":[-115.446753,49.469807]},{"entry":[true,true,false],"in":2,"bearings":[111,156,335],"duration":2.026,"turn_weight":0.5,"turn_duration":0.007,"mapbox_streets_v8":{"class":"secondary"},"is_urban":false,"admin_index":0,"out":1,"weight":2.266,"geometry_index":216,"location":[-115.446002,49.468883]},{"entry":[true,true,false],"in":2,"bearings":[44,155,336],"duration":116.867,"turn_weight":0.5,"turn_duration":0.019,"mapbox_streets_v8":{"class":"secondary"},"is_urban":false,"admin_index":0,"out":1,"weight":99.82,"geometry_index":217,"location":[-115.445792,49.468581]},{"bearings":[16,113,195],"entry":[false,true,true],"in":0,"turn_weight":0.5,"turn_duration":0.007,"mapbox_streets_v8":{"class":"secondary"},"is_urban":false,"admin_index":0,"out":2,"geometry_index":246,"location":[-115.430955,49.455481]}],"bannerInstructions":[{"primary":{"components":[{"mapbox_shield":{"text_color":"black","name":"default","display_ref":"3","base_url":"https://api.mapbox.com/styles/v1"},"type":"icon","text":"3"},{"type":"delimiter","text":"/"},{"mapbox_shield":{"text_color":"black","name":"default","display_ref":"93","base_url":"https://api.mapbox.com/styles/v1"},"type":"icon","text":"93"}],"type":"turn","modifier":"left","text":"3 / 93"},"distanceAlongGeometry":23942.047}],"speedLimitUnit":"km/h","maneuver":{"type":"depart","instruction":"Drive east on Wardner - Fort Steele Road.","bearing_after":83,"bearing_before":0,"location":[-115.574669,49.586752]},"speedLimitSign":"mutcd","name":"Wardner - Fort Steele Road","weight_typical":1227.797,"duration_typical":1419.874,"duration":1419.874,"distance":23942.047,"driving_side":"right","weight":1227.797,"mode":"driving","geometry":"_cpq}Axwbm{EgBsg@_DymAK{Or@eOnAqJ~CgJhCcF|GsF~d@{N`aFst@nrA_z@lyA_mBxrHucJbz@ijBdcCquEvpAorCt\\oz@nUcl@bYsgB|LgbBde@eh_@~E}nApLueA|Ne|@veBgcJbu@i~DpPs|ApEa|@~Col@nGqoAxPuoDtNs{CtJcoAxGkk@zO{z@jk@}xBfQ{o@t`@u{Anl@ktBv\\oy@bYmk@`z@qtAp`Am{Azr@e}@~hAorAnn@qu@bVwWd`@_`@fwD}uCbuAmfAbe@a^|S}MhSmJ`k@iKrg@_AzhBrDjqAjCvtBhErJc@tc@qBho@mRxa@mVnj@sh@vRsY|f@qeAzCqG~uAgcDbw@_kBtlBgkEnE}JxFsM`PeZ|Ykg@no@_m@d`@{^f]g\\zh@qe@tc@mWbd@}Kpt@iInk@oEju@sLrfB}_@|aAkSj`AgVpc@_Rz|BqjAvr@k]~mAep@`~BwnAf|@ce@~v@qa@n_@yThrAk~@~cAer@f\\gUx\\uSzZ}Kb\\uHl}Aw_@bq@gPxeAuWvw@qRp~Au^`f@eMt]qI|_@aHvaAiO|f@eNvWqK~^eQt[oRvo@gh@~k@ui@pf@ef@tj@mg@n`BmuAboA_eAti@kb@xnAkbAzb@_^nPuJxRmOhKoEzMaDtSuBnOb@bXlCbIlC~I`DbHfCbMvIrTzRtSjRhYjZhP~OfTlWrXfWzMvK~N~KvQxIlSzIpa@vKlg@pPzh@jWtd@tWnJfFjNlFfQdA|Ss@hXoPdWoPzQwJt[gNhXaFfTg@vS~B`R`GpVdM`SpRhRpUtMhWfKnXjNtn@rJjf@rHt_@zIvd@vEbXfLff@|HlRlJvOxO`PrPlKrPxDbTfCtRgEtQyFjQoOtMuPrJgRrHoTpCmMbDyO`Eu_@jD}\\jDw[~Ekd@`BiS`AcPd@sPIeSu@ce@{Fy|AmEozA`Ase@pCmd@rG}g@dB}KrCaM`BcHfCeJ`DuIxJaY~IyQjK{OdKiOdReUt`@qh@`\\ya@dImKvMuQ~FcItVmYpBeBz[gYz[uSzQcLdTkN|ReLd[iRb`Asl@jUiNnp@kf@tRkS`PyTbWod@`Ni\\fjAqcCvi@s}@~JoQh_@ep@zZwv@`Ret@dR{u@`Qig@rNcZxw@{kA|_@qk@`k@kv@jV}VjOiHhJs@|M`BnWxJvWxHhX~IrFbB~ItCzIxBpGhArGb@fHyA|GyFhIkJ~I_N`KcMbJsIbP_MxMgIzL}HpJaHtGoEjPsG`OeFzSsIbMwGpMyMnIqKtUiXtPqQhf@_i@l^ea@x\\m`@h[e_@jc@mj@jQsTfWk]zRgYzImNbOoVtQeXlJ{O|HyOdOu_@hIeRrGgJ|HkH|HiCpGe@fIMbHUzFuApFuA|FkCfHqEhN}IzKiHpHkF~KmKnH{GhJsJpH_JbNcOzIoJvNsL`GuCxJeEpOmGjR_IxSkI|JiDf]kMbQ{F~\\cM`f@_OtUqGtY_F~ZqF|TqDvQwCrS}C`WcEdZmFxLmBxXyEvQoCdMcB|GApHj@rGdArFpArIlDjN|FdOfGhQzHvMvGxKdEjGpCzFvBjFdB|HnAzGx@bJlBvDb@lD~@lIhC"},{"voiceInstructions":[{"ssmlAnnouncement":"Continue for 8 miles.","announcement":"Continue for 8 miles.","distanceAlongGeometry":12613.81},{"ssmlAnnouncement":"In a quarter mile, Turn left onto Rosen Lake Road.","announcement":"In a quarter mile, Turn left onto Rosen Lake Road.","distanceAlongGeometry":402.336},{"ssmlAnnouncement":"Turn left onto Rosen Lake Road.","announcement":"Turn left onto Rosen Lake Road.","distanceAlongGeometry":124.444}],"intersections":[{"entry":[false,true,true],"in":0,"bearings":[15,128,303],"duration":7.804,"turn_weight":18.75,"turn_duration":2.254,"mapbox_streets_v8":{"class":"trunk"},"is_urban":false,"admin_index":0,"out":1,"weight":23.606,"geometry_index":346,"location":[-115.417188,49.431336]},{"entry":[true,true,false],"in":2,"bearings":[135,183,314],"duration":70.244,"turn_weight":0.5,"turn_duration":0.007,"mapbox_streets_v8":{"class":"trunk"},"is_urban":false,"admin_index":0,"out":0,"weight":61.957,"geometry_index":349,"location":[-115.41565,49.430461]},{"entry":[true,true,false],"in":2,"bearings":[56,135,315],"duration":97.244,"turn_duration":0.007,"mapbox_streets_v8":{"class":"trunk"},"is_urban":false,"admin_index":0,"out":1,"weight":85.082,"geometry_index":360,"location":[-115.396924,49.418346]},{"entry":[true,true,false],"in":2,"bearings":[122,214,307],"duration":201.266,"turn_weight":0.5,"turn_duration":0.026,"mapbox_streets_v8":{"class":"trunk"},"is_urban":false,"admin_index":0,"out":0,"weight":176.585,"geometry_index":405,"location":[-115.371118,49.401572]},{"entry":[true,false],"in":1,"bearings":[119,307],"duration":9.395,"mapbox_streets_v8":{"class":"trunk"},"is_urban":false,"admin_index":0,"out":0,"weight":8.221,"geometry_index":435,"location":[-115.306497,49.377098]},{"entry":[true,true,false],"in":2,"bearings":[104,267,286],"duration":2.113,"turn_duration":0.021,"mapbox_streets_v8":{"class":"trunk"},"is_urban":false,"admin_index":0,"out":0,"weight":1.83,"geometry_index":439,"location":[-115.303821,49.376308]},{"entry":[true,true,false],"in":2,"bearings":[99,182,284],"duration":18.489,"turn_weight":0.5,"turn_duration":0.026,"mapbox_streets_v8":{"class":"trunk"},"is_urban":false,"admin_index":0,"out":0,"weight":16.655,"geometry_index":440,"location":[-115.303246,49.376213]},{"entry":[true,true,false,true],"in":2,"bearings":[67,180,254,355],"duration":16.226,"turn_duration":0.026,"mapbox_streets_v8":{"class":"trunk"},"is_urban":false,"admin_index":0,"out":0,"weight":14.175,"geometry_index":447,"location":[-115.298367,49.376448]},{"entry":[true,true,false],"in":2,"bearings":[70,155,250],"duration":7.127,"turn_duration":0.019,"mapbox_streets_v8":{"class":"trunk"},"is_urban":false,"admin_index":0,"out":0,"weight":6.219,"geometry_index":451,"location":[-115.294133,49.377614]},{"entry":[true,false],"in":1,"bearings":[74,252],"duration":1.056,"mapbox_streets_v8":{"class":"trunk"},"is_urban":false,"admin_index":0,"out":0,"weight":0.924,"geometry_index":454,"location":[-115.292126,49.378058]},{"entry":[true,false],"in":1,"bearings":[75,254],"duration":14.4,"mapbox_streets_v8":{"class":"trunk"},"is_urban":false,"admin_index":0,"out":0,"weight":12.6,"geometry_index":455,"location":[-115.291837,49.378113]},{"entry":[true,true,false,true],"in":2,"bearings":[79,163,259,344],"duration":2.776,"turn_duration":0.007,"mapbox_streets_v8":{"class":"trunk"},"is_urban":false,"admin_index":0,"out":0,"weight":2.423,"geometry_index":458,"location":[-115.287565,49.378695]},{"entry":[true,true,false],"in":2,"bearings":[78,175,259],"duration":16.616,"turn_duration":0.021,"mapbox_streets_v8":{"class":"trunk"},"is_urban":false,"admin_index":0,"out":0,"weight":14.521,"geometry_index":459,"location":[-115.286759,49.378797]},{"entry":[true,true,false],"in":2,"bearings":[79,173,258],"duration":7.9,"turn_duration":0.007,"mapbox_streets_v8":{"class":"trunk"},"is_urban":false,"admin_index":0,"out":0,"weight":6.906,"geometry_index":461,"location":[-115.281664,49.379512]},{"bearings":[91,199,269],"entry":[true,true,false],"in":2,"turn_duration":0.008,"mapbox_streets_v8":{"class":"trunk"},"is_urban":false,"admin_index":0,"out":0,"geometry_index":465,"location":[-115.279333,49.379724]}],"bannerInstructions":[{"primary":{"components":[{"type":"text","text":"Rosen Lake Road"}],"type":"turn","modifier":"left","text":"Rosen Lake Road"},"distanceAlongGeometry":12647.143}],"speedLimitUnit":"km/h","maneuver":{"type":"end of road","instruction":"Turn left onto 3/93/Crowsnest Highway.","modifier":"left","bearing_after":128,"bearing_before":195,"location":[-115.417188,49.431336]},"speedLimitSign":"mutcd","name":"Crowsnest Highway","weight_typical":443.706,"duration_typical":486.38,"duration":486.38,"distance":12647.143,"driving_side":"right","weight":443.706,"mode":"driving","ref":"3; 93","geometry":"oq`h}Afeoc{EdTqh@dKgShTia@dpCmaFnX{f@vUyb@tx@}wArz@uzAvd@mx@hVsc@|d@{x@tc@cw@f_@}p@nuGslL`l@kcAnwBa{D|NmZ~NyV|_@kr@xVmc@bf@yy@dZsc@xTg\\zY}_@lTuYjZaa@pZ{`@`a@kh@t\\ad@bYi_@t\\sg@zYcf@|Xgh@hXwf@`NeVxK_UdVmf@`Vig@`Rs^`N{V`Tic@xU{d@zSga@~P__@bNyW`Qg]fJgSbQ__@|NkXnLyUzQ{`@|N{ZrVog@bSq`@bOc[`KaU~GaQtBgFrA}DjC}I|FeQjjB}gGtRqo@vMgc@hjAwwD~c@sgBn`@seCfmAebMlW}gD|EgnCk@}}D~E_~A|S_uBlWytAve@sgBzvCqkIlhBojFhj@{yBtoAw|Fb_@aqAve@_iAjz@{tA~lCsqDnGuIndAgsAlqFg}HzE_HbZsk@hUcm@hRat@tM{j@tGmb@tE{a@|D}b@bBk^nBkn@Lim@gAop@uCki@oH}y@iDa\\wL}o@oSigAc]}iBoGmc@}Hci@_Ikm@yF}c@mBaQsHaw@wH_mA_P}cCkEkq@}\\wrEwMuiBeD{g@uEct@o@oj@BeGJ}n@|A_h@fCca@|Dei@~Hmf@fLml@"},{"voiceInstructions":[{"ssmlAnnouncement":"Continue for 1.5 miles.","announcement":"Continue for 1.5 miles.","distanceAlongGeometry":2367.207},{"ssmlAnnouncement":"In a quarter mile, Turn right onto Rosen Lake Road E..","announcement":"In a quarter mile, Turn right onto Rosen Lake Road E..","distanceAlongGeometry":402.336},{"ssmlAnnouncement":"Turn right onto Rosen Lake Road E..","announcement":"Turn right onto Rosen Lake Road E..","distanceAlongGeometry":94.444}],"intersections":[{"entry":[true,true,true,false],"in":3,"bearings":[40,124,201,294],"duration":8.871,"turn_weight":12.5,"turn_duration":3.332,"mapbox_streets_v8":{"class":"tertiary"},"is_urban":false,"admin_index":0,"out":0,"weight":17.346,"geometry_index":471,"location":[-115.275331,49.379136]},{"entry":[true,true,false,true],"in":2,"bearings":[51,113,220,318],"duration":10.061,"turn_weight":1.5,"turn_duration":0.014,"mapbox_streets_v8":{"class":"tertiary"},"is_urban":false,"admin_index":0,"out":0,"weight":10.291,"geometry_index":472,"location":[-115.274975,49.379415]},{"entry":[true,false,true],"in":1,"bearings":[52,228,322],"duration":23.769,"turn_weight":0.75,"turn_duration":0.009,"mapbox_streets_v8":{"class":"tertiary"},"is_urban":false,"admin_index":0,"out":0,"weight":21.54,"geometry_index":474,"location":[-115.273702,49.380106]},{"entry":[true,true,false],"in":2,"bearings":[50,144,230],"duration":35.864,"turn_weight":0.75,"turn_duration":0.008,"mapbox_streets_v8":{"class":"tertiary"},"is_urban":false,"admin_index":0,"out":0,"weight":32.124,"geometry_index":479,"location":[-115.270518,49.381783]},{"entry":[true,false],"in":1,"bearings":[60,255],"duration":26.424,"turn_weight":1.125,"mapbox_streets_v8":{"class":"tertiary"},"is_urban":false,"admin_index":0,"out":0,"weight":24.246,"geometry_index":489,"location":[-115.26442,49.383658]},{"entry":[true,true,false],"in":2,"bearings":[7,87,205],"duration":42.287,"turn_weight":1.5,"turn_duration":0.077,"mapbox_streets_v8":{"class":"tertiary"},"is_urban":false,"admin_index":0,"out":0,"weight":38.434,"geometry_index":495,"location":[-115.260639,49.385791]},{"bearings":[27,84,207],"entry":[true,true,false],"in":2,"turn_weight":0.75,"turn_duration":0.007,"mapbox_streets_v8":{"class":"tertiary"},"is_urban":false,"admin_index":0,"out":0,"geometry_index":504,"location":[-115.260777,49.389924]}],"bannerInstructions":[{"primary":{"components":[{"type":"text","text":"Rosen Lake Road E."}],"type":"turn","modifier":"right","text":"Rosen Lake Road E."},"distanceAlongGeometry":2383.874}],"speedLimitUnit":"km/h","maneuver":{"type":"turn","instruction":"Turn left onto Rosen Lake Road.","modifier":"left","bearing_after":40,"bearing_before":114,"location":[-115.275331,49.379136]},"speedLimitSign":"mutcd","name":"Rosen Lake Road","weight_typical":182.09,"duration_typical":189.979,"duration":189.979,"distance":2383.874,"driving_side":"right","weight":182.09,"mode":"driving","geometry":"_szd}AdczzzEmPgUe\\sv@_M}VsPab@gXqo@uI_RkWen@{Yep@kMqYmXwo@kOi_@wIqU_HuT{EsWaHyn@_Ha|@uEqh@sHeu@aNof@oWip@a`@k|@kUsg@uTo`@sO_K}IkAkUVoYxD{v@~K_}@jLy[`CaSkDwRgJ_KkHqA_AyZyTuNwHe]uHwp@zB{[lBsPq@{FOyMmCsIqEkHiIuHkKcFyJkLoXeJcTyIiUsGeMqKqM"},{"voiceInstructions":[{"ssmlAnnouncement":"Continue for 1 mile.","announcement":"Continue for 1 mile.","distanceAlongGeometry":1398.323},{"ssmlAnnouncement":"In a quarter mile, Turn right onto McLean Road.","announcement":"In a quarter mile, Turn right onto McLean Road.","distanceAlongGeometry":402.336},{"ssmlAnnouncement":"Turn right onto McLean Road.","announcement":"Turn right onto McLean Road.","distanceAlongGeometry":83.333}],"intersections":[{"entry":[true,false,true],"in":1,"bearings":[89,217,329],"duration":17.673,"turn_weight":6.5,"turn_duration":0.221,"mapbox_streets_v8":{"class":"tertiary"},"is_urban":false,"admin_index":0,"out":0,"weight":21.771,"geometry_index":522,"location":[-115.257878,49.394541]},{"entry":[true,true,false],"in":2,"bearings":[30,121,295],"duration":15.49,"turn_weight":0.75,"turn_duration":0.01,"mapbox_streets_v8":{"class":"tertiary"},"is_urban":false,"admin_index":0,"out":1,"weight":14.295,"geometry_index":531,"location":[-115.255247,49.393608]},{"entry":[true,true,false],"in":2,"bearings":[90,119,294],"duration":19.81,"turn_weight":0.75,"turn_duration":0.01,"mapbox_streets_v8":{"class":"tertiary"},"is_urban":false,"admin_index":0,"out":1,"weight":18.075,"geometry_index":535,"location":[-115.253128,49.392911]},{"entry":[true,false,true],"in":1,"bearings":[16,202,311],"duration":22.528,"turn_weight":0.75,"turn_duration":0.028,"mapbox_streets_v8":{"class":"tertiary"},"is_urban":false,"admin_index":0,"out":0,"weight":20.438,"geometry_index":543,"location":[-115.250733,49.393506]},{"entry":[true,false],"in":1,"bearings":[8,194],"duration":2.07,"turn_weight":0.75,"mapbox_streets_v8":{"class":"tertiary"},"is_urban":false,"admin_index":0,"out":0,"weight":2.561,"geometry_index":549,"location":[-115.24968,49.395638]},{"entry":[true,false],"in":1,"bearings":[8,188],"duration":16.47,"turn_weight":0.75,"mapbox_streets_v8":{"class":"tertiary"},"is_urban":false,"admin_index":0,"out":0,"weight":15.161,"geometry_index":550,"location":[-115.249636,49.395839]},{"bearings":[68,175,322],"entry":[true,false,true],"in":1,"turn_weight":1.125,"turn_duration":0.223,"mapbox_streets_v8":{"class":"tertiary"},"is_urban":false,"admin_index":0,"out":2,"geometry_index":555,"location":[-115.249239,49.397448]}],"bannerInstructions":[{"primary":{"components":[{"type":"text","text":"McLean Road"}],"type":"turn","modifier":"right","text":"McLean Road"},"distanceAlongGeometry":1414.99}],"speedLimitUnit":"km/h","maneuver":{"type":"turn","instruction":"Turn right onto Rosen Lake Road E..","modifier":"right","bearing_after":89,"bearing_before":37,"location":[-115.257878,49.394541]},"speedLimitSign":"mutcd","name":"Rosen Lake Road E.","weight_typical":122.797,"duration_typical":127.832,"duration":127.832,"distance":1414.99,"driving_side":"right","weight":122.797,"mode":"driving","geometry":"yuxe}Aj`xyzEKoOx@qLx@uJ~BiKrCmHfOw[lM{[rHiVbE_S`Qem@zH{`@tHo^|D{StEoQvCsWLkVsAyPwDoSiEkM_LmPkTaL}_@yMgWuLoXeKaNaHe]sMiDm@qKwA{HcAaXqE}ZuJoTqEeObAkEfEqJtRuNxq@aPlv@k]`r@aWp_@iKzL"},{"voiceInstructions":[{"ssmlAnnouncement":"Continue for a half mile.","announcement":"Continue for a half mile.","distanceAlongGeometry":890.991},{"ssmlAnnouncement":"In a quarter mile, Turn right.","announcement":"In a quarter mile, Turn right.","distanceAlongGeometry":402.336},{"ssmlAnnouncement":"Turn right.","announcement":"Turn right.","distanceAlongGeometry":33.333}],"intersections":[{"entry":[true,false,true],"in":1,"bearings":[48,144,317],"duration":66.351,"turn_weight":5006.5,"turn_duration":1.551,"mapbox_streets_v8":{"class":"tertiary"},"is_urban":false,"admin_index":0,"out":0,"weight":11559.401,"geometry_index":562,"location":[-115.252914,49.399327]},{"entry":[false,true,true],"in":0,"bearings":[174,283,355],"duration":8.958,"turn_weight":0.75,"turn_duration":0.007,"mapbox_streets_v8":{"class":"tertiary"},"is_urban":false,"admin_index":0,"out":2,"weight":905.955,"geometry_index":569,"location":[-115.2524,49.405302]},{"bearings":[175,353],"entry":[false,true],"in":0,"turn_weight":5.75,"mapbox_streets_v8":{"class":"tertiary"},"is_urban":false,"admin_index":0,"out":1,"geometry_index":570,"location":[-115.252508,49.406126]}],"bannerInstructions":[{"primary":{"components":[{"type":"text","text":"Turn right"}],"type":"turn","modifier":"right","text":"Turn right"},"distanceAlongGeometry":904.325}],"speedLimitUnit":"km/h","maneuver":{"type":"turn","instruction":"Turn right onto McLean Road.","modifier":"right","bearing_after":48,"bearing_before":324,"location":[-115.252914,49.399327]},"speedLimitSign":"mutcd","name":"McLean Road","weight_typical":13402.397,"duration_typical":84.519,"duration":84.519,"distance":904.325,"driving_side":"right","weight":13402.397,"mode":"driving","geometry":"}`bf}AbjnyzEgS}a@yMiTkOkLqHaGiXtAks@jDwiFnd@or@vE_Z`DmWtAgI^"},{"voiceInstructions":[{"ssmlAnnouncement":"Continue for 1 mile.","announcement":"Continue for 1 mile.","distanceAlongGeometry":1305.303},{"ssmlAnnouncement":"In a quarter mile, Bear right onto Galloway Forest Service Road.","announcement":"In a quarter mile, Bear right onto Galloway Forest Service Road.","distanceAlongGeometry":402.336},{"ssmlAnnouncement":"Bear right.","announcement":"Bear right.","distanceAlongGeometry":33.333}],"intersections":[{"entry":[true,false,true],"in":1,"bearings":[71,176,334],"duration":22.314,"turn_weight":1.5,"turn_duration":0.882,"mapbox_streets_v8":{"class":"tertiary"},"is_urban":false,"admin_index":0,"out":0,"weight":2168.867,"geometry_index":573,"location":[-115.252648,49.407113]},{"bearings":[58,101,278],"entry":[true,true,false],"in":2,"turn_weight":0.75,"turn_duration":0.009,"mapbox_streets_v8":{"class":"tertiary"},"is_urban":false,"admin_index":0,"out":1,"geometry_index":577,"location":[-115.249162,49.407036]}],"bannerInstructions":[{"primary":{"components":[{"type":"text","text":"Galloway Forest Service Road"}],"type":"turn","modifier":"slight right","text":"Galloway Forest Service Road"},"distanceAlongGeometry":1313.637}],"speedLimitUnit":"km/h","maneuver":{"type":"turn","instruction":"Turn right.","modifier":"right","bearing_after":71,"bearing_before":356,"location":[-115.252648,49.407113]},"speedLimitSign":"mutcd","name":"","weight_typical":11126.939,"duration_typical":110.9,"duration":110.9,"distance":1313.637,"driving_side":"right","weight":11126.939,"mode":"driving","geometry":"qgqf}AnymyzEwEw\\c@}^bCa_ApGc{A`@cJ~Eqh@|S{]vb@e[hQo\\~Li{@hJmkAtUifBhXcnAjl@mXz}@yYtU}m@pOgzAnDaj@"},{"voiceInstructions":[{"ssmlAnnouncement":"In a quarter mile, Turn left.","announcement":"In a quarter mile, Turn left.","distanceAlongGeometry":531.858},{"ssmlAnnouncement":"Turn left.","announcement":"Turn left.","distanceAlongGeometry":33.333}],"intersections":[{"bearings":[141,281,321],"entry":[true,false,true],"in":1,"turn_weight":6.5,"turn_duration":0.094,"mapbox_streets_v8":{"class":"tertiary"},"is_urban":false,"admin_index":0,"out":0,"geometry_index":591,"location":[-115.238059,49.402086]}],"bannerInstructions":[{"primary":{"components":[{"type":"text","text":"Turn left"}],"type":"turn","modifier":"left","text":"Turn left"},"distanceAlongGeometry":540.192}],"speedLimitUnit":"km/h","maneuver":{"type":"turn","instruction":"Bear right onto Galloway Forest Service Road.","modifier":"slight right","bearing_after":141,"bearing_before":101,"location":[-115.238059,49.402086]},"speedLimitSign":"mutcd","name":"Galloway Forest Service Road","weight_typical":4102.062,"duration_typical":40.594,"duration":40.594,"distance":540.192,"driving_side":"right","weight":4102.062,"mode":"driving","geometry":"kmgf}AtiqxzElt@cbA~mAshBl`AosAzPaOfT}M"},{"voiceInstructions":[{"ssmlAnnouncement":"In 400 feet, Turn left.","announcement":"In 400 feet, Turn left.","distanceAlongGeometry":127.048},{"ssmlAnnouncement":"Turn left.","announcement":"Turn left.","distanceAlongGeometry":26.667}],"intersections":[{"bearings":[76,158,335],"entry":[true,true,false],"in":2,"turn_weight":10,"turn_duration":3.913,"mapbox_streets_v8":{"class":"street"},"is_urban":false,"admin_index":0,"out":0,"geometry_index":596,"location":[-115.233447,49.398294]}],"bannerInstructions":[{"primary":{"components":[{"type":"text","text":"Turn left"}],"type":"turn","modifier":"left","text":"Turn left"},"distanceAlongGeometry":133.714}],"speedLimitUnit":"km/h","maneuver":{"type":"turn","instruction":"Turn left.","modifier":"left","bearing_after":76,"bearing_before":155,"location":[-115.233447,49.398294]},"speedLimitSign":"mutcd","name":"","weight_typical":2577.512,"duration_typical":29.302,"duration":29.302,"distance":133.714,"driving_side":"right","weight":2577.512,"mode":"driving","geometry":"k``f}AlihxzEcLspAaIeZ"},{"voiceInstructions":[{"ssmlAnnouncement":"Continue for a half mile.","announcement":"Continue for a half mile.","distanceAlongGeometry":896.028},{"ssmlAnnouncement":"In a quarter mile, Turn left.","announcement":"In a quarter mile, Turn left.","distanceAlongGeometry":402.336},{"ssmlAnnouncement":"Turn left.","announcement":"Turn left.","distanceAlongGeometry":26.667}],"intersections":[{"entry":[true,true,false],"in":2,"bearings":[8,44,240],"duration":5.328,"turn_weight":5,"turn_duration":0.828,"mapbox_streets_v8":{"class":"street"},"is_urban":false,"admin_index":0,"out":0,"weight":460.062,"geometry_index":598,"location":[-115.231706,49.398665]},{"bearings":[144,188,325],"entry":[true,false,true],"in":1,"turn_weight":1.5,"turn_duration":0.504,"mapbox_streets_v8":{"class":"street"},"is_urban":false,"admin_index":0,"out":2,"geometry_index":599,"location":[-115.231669,49.398843]}],"bannerInstructions":[{"primary":{"components":[{"type":"text","text":"Turn left"}],"type":"turn","modifier":"left","text":"Turn left"},"distanceAlongGeometry":902.695}],"speedLimitUnit":"km/h","maneuver":{"type":"turn","instruction":"Turn left.","modifier":"left","bearing_after":8,"bearing_before":60,"location":[-115.231706,49.398665]},"speedLimitSign":"mutcd","name":"","weight_typical":20552.574,"duration_typical":204.507,"duration":204.507,"distance":902.695,"driving_side":"right","weight":20552.574,"mode":"driving","geometry":"qw`f}Ar|dxzEcJiAwLvMw_@d]cfAkD_o@xWa{AnuAmgArn@oSk@g\\qd@}d@uAg\\y]"},{"voiceInstructions":[{"ssmlAnnouncement":"Continue for 1 mile.","announcement":"Continue for 1 mile.","distanceAlongGeometry":1834.876},{"ssmlAnnouncement":"In a quarter mile, You will arrive at your destination.","announcement":"In a quarter mile, You will arrive at your destination.","distanceAlongGeometry":402.336},{"ssmlAnnouncement":"You have arrived at your destination.","announcement":"You have arrived at your destination.","distanceAlongGeometry":27.778}],"intersections":[{"bearings":[61,214,329],"entry":[true,false,true],"in":1,"turn_weight":5,"turn_duration":2.017,"mapbox_streets_v8":{"class":"street"},"is_urban":false,"admin_index":0,"out":2,"geometry_index":609,"location":[-115.233686,49.405996]}],"bannerInstructions":[{"primary":{"components":[{"type":"text","text":"You will arrive at your destination"}],"type":"arrive","modifier":"straight","text":"You will arrive at your destination"},"distanceAlongGeometry":1841.543},{"primary":{"components":[{"type":"text","text":"You have arrived at your destination"}],"type":"arrive","modifier":"straight","text":"You have arrived at your destination"},"distanceAlongGeometry":27.778}],"speedLimitUnit":"km/h","maneuver":{"type":"turn","instruction":"Turn left.","modifier":"left","bearing_after":329,"bearing_before":34,"location":[-115.233686,49.405996]},"speedLimitSign":"mutcd","name":"","weight_typical":41889.359,"duration_typical":416.303,"duration":416.303,"distance":1841.543,"driving_side":"right","weight":41889.359,"mode":"driving","geometry":"waof}AjxhxzE{I`IeO~u@wQn\\mIpf@{^n\\_h@vM{PlNyTloAoPpj@sAz]aEbQwoAxWws@tC{xA|s@wX_Ew`BnZ}u@wKcOjDcd@d`BoLvIaZmNmP~@gw@hs@{fAz\\"},{"voiceInstructions":[],"intersections":[{"bearings":[165],"entry":[true],"in":0,"admin_index":0,"geometry_index":633,"location":[-115.243927,49.419375]}],"bannerInstructions":[],"speedLimitUnit":"km/h","maneuver":{"type":"arrive","instruction":"You have arrived at your destination.","bearing_after":0,"bearing_before":345,"location":[-115.243927,49.419375]},"speedLimitSign":"mutcd","name":"","weight_typical":0,"duration_typical":0,"duration":0,"distance":0,"driving_side":"right","weight":0,"mode":"driving","geometry":"}eig}Alx|xzE??"}],"distance":46024.16,"summary":"Wardner - Fort Steele Road, 3"},{"via_waypoints":[],"admins":[{"iso_3166_1_alpha3":"CAN","iso_3166_1":"CA"}],"notifications":[{"details":{"requested_value":"paved","actual_value":"gravel","message":"The road has an unpaved surface (gravel)."},"subtype":"unpaved","type":"violation","geometry_index_end":16,"geometry_index_start":0},{"details":{"requested_value":"paved","actual_value":"dirt","message":"The road has an unpaved surface (dirt)."},"subtype":"unpaved","type":"violation","geometry_index_end":19,"geometry_index_start":16},{"details":{"requested_value":"paved","actual_value":"gravel","message":"The road has an unpaved surface (gravel)."},"subtype":"unpaved","type":"violation","geometry_index_end":69,"geometry_index_start":19},{"details":{"requested_value":"paved","actual_value":"gravel","message":"The road has an unpaved surface (gravel)."},"subtype":"unpaved","type":"violation","geometry_index_end":138,"geometry_index_start":70}],"annotation":{"maxspeed":[{"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},{"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},{"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},{"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},{"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}],"congestion_numeric":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"speed":[4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,0.6,0.6,0.6,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,12,12,12.1,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9],"distance":[51.7,52.8,66.4,172.3,91.3,53,61.4,50,52.8,31.7,119.4,132.7,79.2,121.7,87.4,163.1,124.4,193.8,274.3,47.2,85.6,66.4,100.8,37.4,62.5,56.4,124.3,81.9,111.7,57.5,50,39.2,54.1,66.9,17.9,72.7,37.3,58.6,75.7,53.9,51.4,51.8,48.3,29.7,24.5,29.6,43.2,23.4,18.3,20,36,14.9,20.8,70.4,57.4,55.6,37.5,47.1,82.5,28.6,26.7,61.1,56.3,58.7,17,30.1,51.4,52,53.4,9.1,17.4,46.3,50.4,52.8,70,64.9,78.1,57.1,48.4,69,100.6,49.8,42,48,31.6,21.7,20.6,14.1,37.9,28.7,60.6,40.4,30.3,40.6,41.5,39.9,26.2,41,46.9,61,26.9,64.6,95.7,81.6,64.2,49.8,96,103.3,86.2,70.5,102.1,63.6,92,78.5,92.8,58.4,56,78.5,25.6,34.3,43.7,28.1,51,49.1,45.1,59.4,49,45,69.1,75,67.8,54.1,51.2,82.6,73.7,63.8,52,12.3],"duration":[11.652,11.878,14.926,38.783,20.528,11.935,13.806,11.265,11.866,7.148,26.852,29.844,17.82,27.373,19.671,36.701,229.617,348.743,493.264,4.785,7.166,5.558,8.436,3.136,5.231,4.721,10.409,6.858,9.353,4.812,4.19,3.284,4.526,5.602,1.517,6.089,3.116,4.908,6.337,4.511,4.304,4.333,4.039,2.488,2.054,2.473,3.621,1.958,1.53,1.67,3.019,1.242,1.747,5.888,4.802,4.657,3.14,3.939,6.909,2.393,2.24,5.109,4.711,4.918,1.418,2.523,4.3,4.364,4.458,0.754,2.496,6.671,7.258,7.595,10.084,9.352,11.234,8.224,6.971,9.934,14.493,7.172,6.044,6.905,4.558,3.121,2.98,2.031,5.456,4.13,8.742,5.819,4.358,5.848,5.98,5.752,3.779,5.902,6.769,8.78,3.892,9.294,13.778,11.752,9.243,7.167,13.821,14.877,12.404,10.164,14.699,9.152,13.249,11.307,13.356,8.415,8.056,11.299,3.691,4.939,6.289,4.048,7.346,7.061,6.498,8.547,7.06,6.481,9.949,10.798,9.763,7.787,7.373,11.893,10.609,9.183,7.49,1.774]},"weight_typical":543686.125,"duration_typical":2142.156,"weight":543686.125,"duration":2142.156,"steps":[{"voiceInstructions":[{"ssmlAnnouncement":"Drive north for 1 mile.","announcement":"Drive north for 1 mile.","distanceAlongGeometry":1386.983},{"ssmlAnnouncement":"In a quarter mile, Turn left.","announcement":"In a quarter mile, Turn left.","distanceAlongGeometry":402.336},{"ssmlAnnouncement":"Turn left.","announcement":"Turn left.","distanceAlongGeometry":26.667}],"intersections":[{"entry":[true],"bearings":[345],"duration":146.639,"mapbox_streets_v8":{"class":"street"},"is_urban":false,"admin_index":0,"out":0,"weight":14825.17,"geometry_index":0,"location":[-115.243927,49.419375]},{"entry":[true,false,true],"in":1,"bearings":[122,146,326],"duration":128.707,"turn_weight":1,"turn_duration":0.007,"mapbox_streets_v8":{"class":"street"},"is_urban":false,"admin_index":0,"out":2,"weight":13012.572,"geometry_index":9,"location":[-115.24698,49.424773]},{"bearings":[46,108,309],"entry":[true,false,true],"in":1,"turn_weight":1.5,"turn_duration":0.026,"mapbox_streets_v8":{"class":"street"},"is_urban":false,"admin_index":0,"out":2,"geometry_index":15,"location":[-115.252976,49.427933]}],"bannerInstructions":[{"primary":{"components":[{"type":"text","text":"Turn left"}],"type":"turn","modifier":"left","text":"Turn left"},"distanceAlongGeometry":1386.983}],"speedLimitUnit":"km/h","maneuver":{"type":"depart","instruction":"Drive north.","bearing_after":345,"bearing_before":0,"location":[-115.243927,49.419375]},"speedLimitSign":"mutcd","name":"","weight_typical":31547.086,"duration_typical":312.048,"duration":312.048,"distance":1386.983,"driving_side":"right","weight":31547.086,"mode":"driving","geometry":"}eig}Alx|xzEa[tJs\\j@wb@`OyuAv`A_o@nZiXbWma@k@{WbSoWpXwMjN}k@lkAwz@jcAs\\~q@e`@xzAgNvfA_y@~kB"},{"voiceInstructions":[{"ssmlAnnouncement":"Continue for a quarter mile.","announcement":"Continue for a quarter mile.","distanceAlongGeometry":591.79},{"ssmlAnnouncement":"In 300 feet, Turn right onto Galloway Forest Service Road.","announcement":"In 300 feet, Turn right onto Galloway Forest Service Road.","distanceAlongGeometry":91.44},{"ssmlAnnouncement":"Turn right.","announcement":"Turn right.","distanceAlongGeometry":2.667}],"intersections":[{"bearings":[6,129,214,296],"entry":[true,false,true,true],"in":1,"turn_weight":307.5,"turn_duration":6.024,"mapbox_streets_v8":{"class":"service"},"is_urban":false,"admin_index":0,"out":2,"geometry_index":16,"location":[-115.25472,49.428861]}],"bannerInstructions":[{"primary":{"components":[{"type":"text","text":"Galloway Forest Service Road"}],"type":"turn","modifier":"right","text":"Galloway Forest Service Road"},"distanceAlongGeometry":592.456}],"speedLimitUnit":"km/h","maneuver":{"type":"turn","instruction":"Turn left.","modifier":"left","bearing_after":214,"bearing_before":309,"location":[-115.25472,49.428861]},"speedLimitSign":"mutcd","name":"","weight_typical":430596.82,"duration_typical":1071.625,"duration":1071.625,"distance":592.456,"driving_side":"right","weight":430596.82,"mode":"driving","geometry":"yv{g}A~zqyzEpx@t{@paB`fAzmCfwA"},{"voiceInstructions":[{"ssmlAnnouncement":"Continue for 4 miles.","announcement":"Continue for 4 miles.","distanceAlongGeometry":6326.868},{"ssmlAnnouncement":"In a quarter mile, You will arrive at your destination.","announcement":"In a quarter mile, You will arrive at your destination.","distanceAlongGeometry":402.336},{"ssmlAnnouncement":"You have arrived at your destination.","announcement":"You have arrived at your destination.","distanceAlongGeometry":34.722}],"intersections":[{"entry":[false,true,true,true],"in":0,"bearings":[22,99,201,276],"duration":88.068,"turn_weight":8,"turn_duration":0.831,"mapbox_streets_v8":{"class":"tertiary"},"is_urban":false,"admin_index":0,"out":3,"weight":8827.688,"geometry_index":19,"location":[-115.25824,49.424077]},{"entry":[false,true,true],"in":0,"bearings":[97,275,341],"duration":117.9,"turn_weight":0.75,"turn_duration":0.021,"mapbox_streets_v8":{"class":"tertiary"},"is_urban":false,"admin_index":0,"out":1,"weight":11918.312,"geometry_index":34,"location":[-115.270707,49.428257]},{"entry":[false,true,true],"in":0,"bearings":[137,214,310],"duration":8.821,"turn_weight":0.75,"turn_duration":0.03,"mapbox_streets_v8":{"class":"tertiary"},"is_urban":false,"admin_index":0,"out":2,"weight":889.719,"geometry_index":67,"location":[-115.284374,49.43483]},{"entry":[false,true],"in":0,"bearings":[114,301],"duration":0.754,"turn_weight":5.75,"mapbox_streets_v8":{"class":"tertiary"},"is_urban":false,"admin_index":0,"out":1,"weight":6.406,"geometry_index":69,"location":[-115.285603,49.435322]},{"entry":[false,true],"in":0,"bearings":[121,293],"duration":122.112,"turn_weight":5005.75,"mapbox_streets_v8":{"class":"tertiary"},"is_urban":false,"admin_index":0,"out":1,"weight":17354.344,"geometry_index":70,"location":[-115.285711,49.435364]},{"entry":[false,true,true],"in":0,"bearings":[113,293,306],"duration":76.327,"turn_weight":0.75,"turn_duration":0.007,"mapbox_streets_v8":{"class":"tertiary"},"is_urban":false,"admin_index":0,"out":1,"weight":7716.688,"geometry_index":86,"location":[-115.296483,49.438113]},{"bearings":[115,298,338],"entry":[false,true,true],"in":0,"turn_weight":0.75,"turn_duration":0.008,"mapbox_streets_v8":{"class":"tertiary"},"is_urban":false,"admin_index":0,"out":1,"geometry_index":100,"location":[-115.30257,49.440555]}],"bannerInstructions":[{"primary":{"components":[{"type":"text","text":"You will arrive at your destination"}],"type":"arrive","modifier":"straight","text":"You will arrive at your destination"},"distanceAlongGeometry":6335.202},{"primary":{"components":[{"type":"text","text":"You have arrived at your destination"}],"type":"arrive","modifier":"straight","text":"You have arrived at your destination"},"distanceAlongGeometry":34.722}],"speedLimitUnit":"km/h","maneuver":{"type":"turn","instruction":"Turn right onto Galloway Forest Service Road.","modifier":"right","bearing_after":276,"bearing_before":202,"location":[-115.25824,49.424077]},"speedLimitSign":"mutcd","name":"Galloway Forest Service Road","weight_typical":81542.219,"duration_typical":758.483,"duration":758.483,"distance":6335.202,"driving_side":"right","weight":81542.219,"mode":"driving","geometry":"ykrg}A~vxyzEsApg@sMjeA}Grv@uNprAsHv[sPrm@_O~h@ol@jpAm\\hu@ci@lfAcTnd@uPp`@qHn]kErl@iCjx@[jNmAt}@cCn^mP|i@_W|t@qJ~i@kCzj@dApk@b@rh@dAlX?dTaB`Xv@fd@`@bSSvNmD`NqJpXyEjFiJtCke@jMw]vMm\\`OuS`EeYjD}k@lPqMjIgKjL{Wfc@aQzf@cOfk@_DlKiL`O}Sn]qQra@eKdi@sAvE}BtL}Gpd@gIpg@aLzg@cT~q@eOfq@uSjz@cOri@qEpg@sD|y@gFduA_Dhi@qHb`@gKzc@mIbUyCdPqCjOyAjJuDn^kCxVeMrn@aLn[qJbRgS`OyOxWmIn]wEbSuKn\\yMp`@sMpn@eFnS}Jrs@cLboA}GbdAkAhv@|@zi@ZzqAo@dxA[jiAtBt{@}EnvAkE~t@a@lnAsAtbAkCxnA}@jq@q@fo@ZvbALbUrCv[xHpa@nEbUjHrh@jJpe@vEpd@Lfr@gDph@qJpa@_Wzm@w[hn@{Zzf@mRzb@wO|b@_R``AsPpx@yOro@gPfc@{BxG"},{"voiceInstructions":[],"intersections":[{"bearings":[125],"entry":[true],"in":0,"admin_index":0,"geometry_index":138,"location":[-115.333568,49.444112]}],"bannerInstructions":[],"speedLimitUnit":"km/h","maneuver":{"type":"arrive","instruction":"You have arrived at your destination.","bearing_after":0,"bearing_before":305,"location":[-115.333568,49.444112]},"speedLimitSign":"mutcd","name":"Galloway Forest Service Road","weight_typical":0,"duration_typical":0,"duration":0,"distance":0,"driving_side":"right","weight":0,"mode":"driving","geometry":"_pyh}A~zk~zE??"}],"distance":8314.641,"summary":"Galloway Forest Service Road"}],"geometry":"_cpq}Axwbm{EgBsg@_DymAK{Or@eOnAqJ~CgJhCcF|GsF~d@{N`aFst@nrA_z@lyA_mBxrHucJbz@ijBdcCquEvpAorCt\\oz@nUcl@bYsgB|LgbBde@eh_@~E}nApLueA|Ne|@veBgcJbu@i~DpPs|ApEa|@~Col@nGqoAxPuoDtNs{CtJcoAxGkk@zO{z@jk@}xBfQ{o@t`@u{Anl@ktBv\\oy@bYmk@`z@qtAp`Am{Azr@e}@~hAorAnn@qu@bVwWd`@_`@fwD}uCbuAmfAbe@a^|S}MhSmJ`k@iKrg@_AzhBrDjqAjCvtBhErJc@tc@qBho@mRxa@mVnj@sh@vRsY|f@qeAzCqG~uAgcDbw@_kBtlBgkEnE}JxFsM`PeZ|Ykg@no@_m@d`@{^f]g\\zh@qe@tc@mWbd@}Kpt@iInk@oEju@sLrfB}_@|aAkSj`AgVpc@_Rz|BqjAvr@k]~mAep@`~BwnAf|@ce@~v@qa@n_@yThrAk~@~cAer@f\\gUx\\uSzZ}Kb\\uHl}Aw_@bq@gPxeAuWvw@qRp~Au^`f@eMt]qI|_@aHvaAiO|f@eNvWqK~^eQt[oRvo@gh@~k@ui@pf@ef@tj@mg@n`BmuAboA_eAti@kb@xnAkbAzb@_^nPuJxRmOhKoEzMaDtSuBnOb@bXlCbIlC~I`DbHfCbMvIrTzRtSjRhYjZhP~OfTlWrXfWzMvK~N~KvQxIlSzIpa@vKlg@pPzh@jWtd@tWnJfFjNlFfQdA|Ss@hXoPdWoPzQwJt[gNhXaFfTg@vS~B`R`GpVdM`SpRhRpUtMhWfKnXjNtn@rJjf@rHt_@zIvd@vEbXfLff@|HlRlJvOxO`PrPlKrPxDbTfCtRgEtQyFjQoOtMuPrJgRrHoTpCmMbDyO`Eu_@jD}\\jDw[~Ekd@`BiS`AcPd@sPIeSu@ce@{Fy|AmEozA`Ase@pCmd@rG}g@dB}KrCaM`BcHfCeJ`DuIxJaY~IyQjK{OdKiOdReUt`@qh@`\\ya@dImKvMuQ~FcItVmYpBeBz[gYz[uSzQcLdTkN|ReLd[iRb`Asl@jUiNnp@kf@tRkS`PyTbWod@`Ni\\fjAqcCvi@s}@~JoQh_@ep@zZwv@`Ret@dR{u@`Qig@rNcZxw@{kA|_@qk@`k@kv@jV}VjOiHhJs@|M`BnWxJvWxHhX~IrFbB~ItCzIxBpGhArGb@fHyA|GyFhIkJ~I_N`KcMbJsIbP_MxMgIzL}HpJaHtGoEjPsG`OeFzSsIbMwGpMyMnIqKtUiXtPqQhf@_i@l^ea@x\\m`@h[e_@jc@mj@jQsTfWk]zRgYzImNbOoVtQeXlJ{O|HyOdOu_@hIeRrGgJ|HkH|HiCpGe@fIMbHUzFuApFuA|FkCfHqEhN}IzKiHpHkF~KmKnH{GhJsJpH_JbNcOzIoJvNsL`GuCxJeEpOmGjR_IxSkI|JiDf]kMbQ{F~\\cM`f@_OtUqGtY_F~ZqF|TqDvQwCrS}C`WcEdZmFxLmBxXyEvQoCdMcB|GApHj@rGdArFpArIlDjN|FdOfGhQzHvMvGxKdEjGpCzFvBjFdB|HnAzGx@bJlBvDb@lD~@lIhCdTqh@dKgShTia@dpCmaFnX{f@vUyb@tx@}wArz@uzAvd@mx@hVsc@|d@{x@tc@cw@f_@}p@nuGslL`l@kcAnwBa{D|NmZ~NyV|_@kr@xVmc@bf@yy@dZsc@xTg\\zY}_@lTuYjZaa@pZ{`@`a@kh@t\\ad@bYi_@t\\sg@zYcf@|Xgh@hXwf@`NeVxK_UdVmf@`Vig@`Rs^`N{V`Tic@xU{d@zSga@~P__@bNyW`Qg]fJgSbQ__@|NkXnLyUzQ{`@|N{ZrVog@bSq`@bOc[`KaU~GaQtBgFrA}DjC}I|FeQjjB}gGtRqo@vMgc@hjAwwD~c@sgBn`@seCfmAebMlW}gD|EgnCk@}}D~E_~A|S_uBlWytAve@sgBzvCqkIlhBojFhj@{yBtoAw|Fb_@aqAve@_iAjz@{tA~lCsqDnGuIndAgsAlqFg}HzE_HbZsk@hUcm@hRat@tM{j@tGmb@tE{a@|D}b@bBk^nBkn@Lim@gAop@uCki@oH}y@iDa\\wL}o@oSigAc]}iBoGmc@}Hci@_Ikm@yF}c@mBaQsHaw@wH_mA_P}cCkEkq@}\\wrEwMuiBeD{g@uEct@o@oj@BeGJ}n@|A_h@fCca@|Dei@~Hmf@fLml@mPgUe\\sv@_M}VsPab@gXqo@uI_RkWen@{Yep@kMqYmXwo@kOi_@wIqU_HuT{EsWaHyn@_Ha|@uEqh@sHeu@aNof@oWip@a`@k|@kUsg@uTo`@sO_K}IkAkUVoYxD{v@~K_}@jLy[`CaSkDwRgJ_KkHqA_AyZyTuNwHe]uHwp@zB{[lBsPq@{FOyMmCsIqEkHiIuHkKcFyJkLoXeJcTyIiUsGeMqKqMKoOx@qLx@uJ~BiKrCmHfOw[lM{[rHiVbE_S`Qem@zH{`@tHo^|D{StEoQvCsWLkVsAyPwDoSiEkM_LmPkTaL}_@yMgWuLoXeKaNaHe]sMiDm@qKwA{HcAaXqE}ZuJoTqEeObAkEfEqJtRuNxq@aPlv@k]`r@aWp_@iKzLgS}a@yMiTkOkLqHaGiXtAks@jDwiFnd@or@vE_Z`DmWtAgI^wEw\\c@}^bCa_ApGc{A`@cJ~Eqh@|S{]vb@e[hQo\\~Li{@hJmkAtUifBhXcnAjl@mXz}@yYtU}m@pOgzAnDaj@lt@cbA~mAshBl`AosAzPaOfT}McLspAaIeZcJiAwLvMw_@d]cfAkD_o@xWa{AnuAmgArn@oSk@g\\qd@}d@uAg\\y]{I`IeO~u@wQn\\mIpf@{^n\\_h@vM{PlNyTloAoPpj@sAz]aEbQwoAxWws@tC{xA|s@wX_Ew`BnZ}u@wKcOjDcd@d`BoLvIaZmNmP~@gw@hs@{fAz\\a[tJs\\j@wb@`OyuAv`A_o@nZiXbWma@k@{WbSoWpXwMjN}k@lkAwz@jcAs\\~q@e`@xzAgNvfA_y@~kBpx@t{@paB`fAzmCfwAsApg@sMjeA}Grv@uNprAsHv[sPrm@_O~h@ol@jpAm\\hu@ci@lfAcTnd@uPp`@qHn]kErl@iCjx@[jNmAt}@cCn^mP|i@_W|t@qJ~i@kCzj@dApk@b@rh@dAlX?dTaB`Xv@fd@`@bSSvNmD`NqJpXyEjFiJtCke@jMw]vMm\\`OuS`EeYjD}k@lPqMjIgKjL{Wfc@aQzf@cOfk@_DlKiL`O}Sn]qQra@eKdi@sAvE}BtL}Gpd@gIpg@aLzg@cT~q@eOfq@uSjz@cOri@qEpg@sD|y@gFduA_Dhi@qHb`@gKzc@mIbUyCdPqCjOyAjJuDn^kCxVeMrn@aLn[qJbRgS`OyOxWmIn]wEbSuKn\\yMp`@sMpn@eFnS}Jrs@cLboA}GbdAkAhv@|@zi@ZzqAo@dxA[jiAtBt{@}EnvAkE~t@a@lnAsAtbAkCxnA}@jq@q@fo@ZvbALbUrCv[xHpa@nEbUjHrh@jJpe@vEpd@Lfr@gDph@qJpa@_Wzm@w[hn@{Zzf@mRzb@wO|b@_R``AsPpx@yOro@gPfc@{BxG","voiceLocale":"en-US"}],"waypoints":[{"distance":0.047,"name":"Wardner - Fort Steele Road","location":[-115.574669,49.586752]},{"distance":0.019,"name":"","location":[-115.243927,49.419375]},{"distance":0.012,"name":"Galloway Forest Service Road","location":[-115.333568,49.444112]}],"code":"Ok","uuid":"route_with_notifications"} \ No newline at end of file diff --git a/instrumentation-tests/src/main/res/raw/route_with_notifications_refresh1.json b/instrumentation-tests/src/main/res/raw/route_with_notifications_refresh1.json new file mode 100644 index 00000000000..326b32d64d3 --- /dev/null +++ b/instrumentation-tests/src/main/res/raw/route_with_notifications_refresh1.json @@ -0,0 +1 @@ +{"code":"Ok","route":{"legs":[{"annotation":{"maxspeed":[{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"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},{"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},{"unknown":true},{"unknown":true},{"unknown":true}],"congestion_numeric":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,null,0,0,0,0,0,0,0,8,8,8,8,0,0,0,null,0,0,0,null,0,0,8,8,8,8,0,0,0,0,0,0,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"speed":[27.3,27.3,27.3,27.3,27.3,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,22.8,22.8,22.8,22.8,20.6,19.4,19.4,19.4,19.4,19.4,19.4,19.4,20.6,20.6,20.6,20.6,21.6,21.6,21.6,20.7,22,22,22,21.5,22.8,22.8,21.7,21.7,21.7,21.7,21.9,21.9,21.9,21.9,21.9,21.9,7.3,12,12,12.5,12.5,12.5,12.5,12.5,13.9,13.9,13.9,13.9,13.9,13.9,13.9,13.9,13.9,13.9,13.9,13.9,13.9,13.9,13.9,13.9,11.1,11.1,11.1,11.1,11.1,11.1,11.1,11.1,11.1,13.9,13.9,13.9,13.9,13.9,13.9,13.9,13.9,13.9,13.9,13.9,13.9,13.9,13.9,13.9,13.9,13.9,13.9,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,11.1,11.1,11.1,11.1,11.1,11.1,11.1,11.1,11.1,11.1,11.1,11.1,11.1,11.1,11.1,11.1,11.1,11.1,10.9,11.1,11.1,11.1,11.1,11.1,10.3,10.3,10.3,10.3,10.3,10.3,10.3,10.8,10.8,10.8,10.8,10.8,10.8,10.8,10.3,12,12,12,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,13.3,13.3,13.3,13.3,13.3,5.3,5.3,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4],"distance":[43.4,33.4,26.4,10.7,8.3,14.9,25.4,361.7,66.4,49.5,252.7,138,167.1,541.3,200.6,166.5,221.3,110.9,141.8,108.5,139.6,471,331.3,162,327.5,111,110.1,145.2,326.9,19.6,157.7,568,16.1,70.8,66.6,70.5,57.2,44,42.1,43,36.8,55.3,53.7,57.6,49.8,70.4,35,61.8,91.5,135.1,44.9,52,56.6,45.1,21.8,67.2,92.1,157.1,59.5,251.3,126.5,48.3,62.7,50.5,9.5,55.6,47.8,40.3,50.1,49,57.8,40.4,82.8,37.3,51.4,72,29.2,69.8,74.5,40,72.5,47.4,32.5,29.8,31.1,57.7,72.6,49.6,65.2,53,72,92.3,61.7,54.8,32.7,19.7,39.9,47.6,100.7,111.5,51.5,36.3,37.5,24,5.1,55.7,30.1,54.9,88.7,51.6,31.5,14,26.9,20.4,20.5,22.5,18.6,38,31.6,32.2,22.5,28.1,19.1,16,14,15.9,13.7,44.2,42.2,32,25.6,62.5,43,40.4,26.4,24.5,29.8,27.1,21.2,25.9,20.1,30.7,41,61.1,46,47.6,28.8,56.4,9.6,22.6,17.7,45.3,51.6,39,29,13.4,30.8,65.2,71.1,80.1,57.1,27.2,54.3,36.1,33,19.5,45.2,93.5,420.3,92.1,48.4,43.7,18.3,36.5,37,74.7,107.8,13,49.8,51.7,71.5,47.3,74.2,90.9,126.3,102.2,86.1,116.2,67.7,109.8,50.9,122.9,186.6,152.2,36.9,41.6,97.5,36.2,20,29.9,68,126.8,90.2,192.2,140.4,36.5,67.9,67.6,63.2,22.6,70,47.8,49.4,66.3,75,36.5,101,59.4,36,23.7,146.6,94.1,171.5,46.4,177,98.9,29.4,130.6,27.1,51.4,31.1,117.1,132.6],"duration":[1.594,1.226,0.968,0.391,0.305,0.562,0.914,13.024,2.387,1.784,9.097,4.969,6.015,19.485,7.222,5.995,7.969,3.99,5.104,3.909,5.024,16.955,11.929,5.832,11.787,3.997,3.964,5.229,11.767,0.705,5.677,20.45,0.578,2.549,2.399,3.098,2.514,1.93,1.853,2.113,1.921,2.847,2.765,2.963,2.566,3.625,1.802,3.031,4.446,6.568,2.182,2.423,2.621,2.083,1.056,3.06,4.191,7.149,2.776,11.06,5.556,2.236,2.895,2.331,0.438,2.545,2.183,1.839,2.284,2.24,2.635,8.871,6.941,3.12,4.12,5.768,2.33,5.591,5.96,2.889,5.212,3.416,2.332,2.145,2.235,4.154,5.223,3.571,4.685,3.826,5.185,6.658,4.448,3.949,2.358,1.849,3.59,4.294,9.065,10.043,4.641,3.267,3.379,2.159,0.376,4.006,2.171,3.956,6.39,3.715,2.265,1.011,1.936,1.469,1.479,1.616,1.345,2.734,2.274,2.322,1.621,2.019,1.721,1.258,1.091,1.25,1.073,3.459,3.307,2.508,2.008,5.622,3.866,3.629,2.373,2.215,2.676,2.437,1.903,2.326,1.807,2.763,3.683,5.541,4.15,4.289,2.598,5.084,0.866,2.07,1.602,4.085,4.652,3.522,2.61,1.534,2.991,6.343,6.917,7.803,5.557,2.646,6.558,3.337,3.049,1.794,4.172,8.632,38.81,8.958,4.042,3.641,1.526,3.938,3.103,6.245,9.028,1.1,4.167,4.329,5.994,3.958,6.216,7.609,10.584,8.559,7.205,9.734,5.676,9.196,4.26,9.311,13.984,11.414,2.765,3.12,22.419,6.884,5.328,7.227,15.31,28.548,20.302,43.259,31.585,8.226,15.281,15.225,14.216,7.103,15.739,10.752,11.131,14.909,16.873,8.216,22.72,13.348,8.118,5.313,32.996,21.172,38.566,10.436,39.818,22.263,6.611,29.379,6.092,11.566,7.007,26.343,29.834]}},{"annotation":{"maxspeed":[{"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},{"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},{"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},{"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},{"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}],"congestion_numeric":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"speed":[4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,0.6,0.6,0.6,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,12,12,12.1,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9],"distance":[51.8,52.8,66.4,172.3,91.3,53,61.4,50,52.8,31.7,119.4,132.6,79.3,121.6,87.5,163.1,124.3,193.9,274.3,47.2,85.6,66.4,100.7,37.5,62.5,56.4,124.3,81.9,111.7,57.5,50,39.2,54.1,66.9,17.9,72.7,37.3,58.6,75.7,53.9,51.4,51.8,48.2,29.8,24.5,29.6,43.2,23.4,18.3,19.9,36.1,14.9,20.8,70.4,57.3,55.7,37.5,47,82.6,28.6,26.7,61.1,56.3,58.7,17,30.1,51.4,51.9,53.5,9.1,17.4,46.3,50.4,52.7,70.1,64.9,78,57.2,48.4,69,100.6,49.8,42,48,31.6,21.7,20.6,14.1,37.9,28.7,60.6,40.4,30.3,40.5,41.5,40,26.2,41,46.9,61,26.9,64.6,95.7,81.6,64.2,49.8,96,103.3,86.1,70.6,102.1,63.6,92,78.5,92.8,58.4,56,78.5,25.6,34.3,43.7,28.1,51,49.1,45.1,59.3,49.1,45,69.1,75,67.8,54.1,51.2,82.6,73.7,63.7,52.1,12.3],"duration":[11.652,11.878,14.926,38.783,20.528,11.935,13.806,11.265,11.866,7.148,26.852,29.844,17.82,27.373,19.671,36.701,229.617,348.743,493.264,4.785,7.166,5.558,8.436,3.136,5.231,4.721,10.409,6.858,9.353,4.812,4.19,3.284,4.526,5.602,1.517,6.089,3.116,4.908,6.337,4.511,4.304,4.333,4.039,2.488,2.054,2.473,3.621,1.958,1.53,1.67,3.019,1.242,1.747,5.888,4.802,4.657,3.14,3.939,6.909,2.393,2.24,5.109,4.711,4.918,1.418,2.523,4.3,4.364,4.458,0.754,2.496,6.671,7.258,7.595,10.084,9.352,11.234,8.224,6.971,9.934,14.493,7.172,6.044,6.905,4.558,3.121,2.98,2.031,5.456,4.13,8.742,5.819,4.358,5.848,5.98,5.752,3.779,5.902,6.769,8.78,3.892,9.294,13.778,11.752,9.243,7.167,13.821,14.877,12.404,10.164,14.699,9.152,13.249,11.307,13.356,8.415,8.056,11.299,3.691,4.939,6.289,4.048,7.346,7.061,6.498,8.547,7.06,6.481,9.949,10.798,9.763,7.787,7.373,11.893,10.609,9.183,7.49,1.774]}}]}} \ No newline at end of file diff --git a/libnavigation-base/api/current.txt b/libnavigation-base/api/current.txt index ab4fd389021..49acf405c4b 100644 --- a/libnavigation-base/api/current.txt +++ b/libnavigation-base/api/current.txt @@ -1281,6 +1281,7 @@ package com.mapbox.navigation.base.trip.model.roadobject { field public static final int INCIDENT = 6; // 0x6 field public static final com.mapbox.navigation.base.trip.model.roadobject.RoadObjectType INSTANCE; field public static final int JCT = 10; // 0xa + field public static final int NOTIFICATION = 11; // 0xb field public static final int RAILWAY_CROSSING = 8; // 0x8 field public static final int RESTRICTED_AREA = 4; // 0x4 field public static final int REST_STOP = 3; // 0x3 @@ -1288,7 +1289,7 @@ package com.mapbox.navigation.base.trip.model.roadobject { field public static final int TUNNEL = 0; // 0x0 } - @IntDef({com.mapbox.navigation.base.trip.model.roadobject.RoadObjectType.TUNNEL, com.mapbox.navigation.base.trip.model.roadobject.RoadObjectType.COUNTRY_BORDER_CROSSING, com.mapbox.navigation.base.trip.model.roadobject.RoadObjectType.TOLL_COLLECTION, com.mapbox.navigation.base.trip.model.roadobject.RoadObjectType.REST_STOP, com.mapbox.navigation.base.trip.model.roadobject.RoadObjectType.RESTRICTED_AREA, com.mapbox.navigation.base.trip.model.roadobject.RoadObjectType.BRIDGE, com.mapbox.navigation.base.trip.model.roadobject.RoadObjectType.INCIDENT, com.mapbox.navigation.base.trip.model.roadobject.RoadObjectType.CUSTOM, com.mapbox.navigation.base.trip.model.roadobject.RoadObjectType.RAILWAY_CROSSING, com.mapbox.navigation.base.trip.model.roadobject.RoadObjectType.IC, com.mapbox.navigation.base.trip.model.roadobject.RoadObjectType.JCT}) @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) public static @interface RoadObjectType.Type { + @IntDef({com.mapbox.navigation.base.trip.model.roadobject.RoadObjectType.TUNNEL, com.mapbox.navigation.base.trip.model.roadobject.RoadObjectType.COUNTRY_BORDER_CROSSING, com.mapbox.navigation.base.trip.model.roadobject.RoadObjectType.TOLL_COLLECTION, com.mapbox.navigation.base.trip.model.roadobject.RoadObjectType.REST_STOP, com.mapbox.navigation.base.trip.model.roadobject.RoadObjectType.RESTRICTED_AREA, com.mapbox.navigation.base.trip.model.roadobject.RoadObjectType.BRIDGE, com.mapbox.navigation.base.trip.model.roadobject.RoadObjectType.INCIDENT, com.mapbox.navigation.base.trip.model.roadobject.RoadObjectType.CUSTOM, com.mapbox.navigation.base.trip.model.roadobject.RoadObjectType.RAILWAY_CROSSING, com.mapbox.navigation.base.trip.model.roadobject.RoadObjectType.IC, com.mapbox.navigation.base.trip.model.roadobject.RoadObjectType.JCT, com.mapbox.navigation.base.trip.model.roadobject.RoadObjectType.NOTIFICATION}) @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) public static @interface RoadObjectType.Type { } public final class UpcomingRoadObject { @@ -1638,6 +1639,46 @@ package com.mapbox.navigation.base.trip.model.roadobject.location { } +package com.mapbox.navigation.base.trip.model.roadobject.notification { + + public final class Notification extends com.mapbox.navigation.base.trip.model.roadobject.RoadObject { + method public com.mapbox.navigation.base.trip.model.roadobject.notification.NotificationInfo getInfo(); + property public final com.mapbox.navigation.base.trip.model.roadobject.notification.NotificationInfo info; + } + + public final class NotificationInfo { + method public String? getActualValue(); + method public String? getMessage(); + method public String? getRequestedValue(); + method public String? getSubtype(); + method public String getType(); + method public String? getUnit(); + property public final String? actualValue; + property public final String? message; + property public final String? requestedValue; + property public final String? subtype; + property public final String type; + property public final String? unit; + field public static final com.mapbox.navigation.base.trip.model.roadobject.notification.NotificationInfo.Companion Companion; + field public static final String NOTIFICATION_SUBTYPE_MAX_HEIGHT = "maxHeight"; + field public static final String NOTIFICATION_SUBTYPE_MAX_WEIGHT = "maxWeight"; + field public static final String NOTIFICATION_SUBTYPE_MAX_WIDTH = "maxWidth"; + field public static final String NOTIFICATION_SUBTYPE_POINT_EXCLUSION = "pointExclusion"; + field public static final String NOTIFICATION_SUBTYPE_UNPAVED = "unpaved"; + field public static final String NOTIFICATION_TYPE_VIOLATION = "violation"; + } + + public static final class NotificationInfo.Companion { + } + + @StringDef({com.mapbox.navigation.base.trip.model.roadobject.notification.NotificationInfo.NOTIFICATION_SUBTYPE_MAX_HEIGHT, com.mapbox.navigation.base.trip.model.roadobject.notification.NotificationInfo.NOTIFICATION_SUBTYPE_MAX_WIDTH, com.mapbox.navigation.base.trip.model.roadobject.notification.NotificationInfo.NOTIFICATION_SUBTYPE_MAX_WEIGHT, com.mapbox.navigation.base.trip.model.roadobject.notification.NotificationInfo.NOTIFICATION_SUBTYPE_UNPAVED, com.mapbox.navigation.base.trip.model.roadobject.notification.NotificationInfo.NOTIFICATION_SUBTYPE_POINT_EXCLUSION}) @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) public static @interface NotificationInfo.Companion.NotificationsSubtype { + } + + @StringDef(com.mapbox.navigation.base.trip.model.roadobject.notification.NotificationInfo.NOTIFICATION_TYPE_VIOLATION) @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) public static @interface NotificationInfo.Companion.NotificationsType { + } + +} + package com.mapbox.navigation.base.trip.model.roadobject.railwaycrossing { public final class RailwayCrossing extends com.mapbox.navigation.base.trip.model.roadobject.RoadObject { diff --git a/libnavigation-base/src/main/java/com/mapbox/navigation/base/internal/factory/RoadObjectFactory.kt b/libnavigation-base/src/main/java/com/mapbox/navigation/base/internal/factory/RoadObjectFactory.kt index 95ea9845a5b..5d05e038c20 100644 --- a/libnavigation-base/src/main/java/com/mapbox/navigation/base/internal/factory/RoadObjectFactory.kt +++ b/libnavigation-base/src/main/java/com/mapbox/navigation/base/internal/factory/RoadObjectFactory.kt @@ -25,6 +25,7 @@ object RoadObjectFactory { RoadObjectType.RAILWAY_CROSSING, RoadObjectType.IC, RoadObjectType.JCT, + RoadObjectType.NOTIFICATION, ) fun List.toUpcomingRoadObjects(): diff --git a/libnavigation-base/src/main/java/com/mapbox/navigation/base/trip/model/roadobject/RoadObject.kt b/libnavigation-base/src/main/java/com/mapbox/navigation/base/trip/model/roadobject/RoadObject.kt index cf77584bb52..34a97e38676 100644 --- a/libnavigation-base/src/main/java/com/mapbox/navigation/base/trip/model/roadobject/RoadObject.kt +++ b/libnavigation-base/src/main/java/com/mapbox/navigation/base/trip/model/roadobject/RoadObject.kt @@ -23,6 +23,7 @@ import com.mapbox.navigation.base.trip.model.roadobject.location.RoadObjectLocat * - [RoadObjectType.CUSTOM] * - [RoadObjectType.IC] * - [RoadObjectType.JCT] + * - [RoadObjectType.NOTIFICATION] * * @param length length of the object, null if the object is point-like. * @param provider provider of the road object diff --git a/libnavigation-base/src/main/java/com/mapbox/navigation/base/trip/model/roadobject/RoadObjectMapper.kt b/libnavigation-base/src/main/java/com/mapbox/navigation/base/trip/model/roadobject/RoadObjectMapper.kt index 153f7ebb54a..f67ca2ecb7b 100644 --- a/libnavigation-base/src/main/java/com/mapbox/navigation/base/trip/model/roadobject/RoadObjectMapper.kt +++ b/libnavigation-base/src/main/java/com/mapbox/navigation/base/trip/model/roadobject/RoadObjectMapper.kt @@ -10,6 +10,7 @@ import com.mapbox.navigation.base.trip.model.roadobject.ic.Interchange import com.mapbox.navigation.base.trip.model.roadobject.incident.Incident import com.mapbox.navigation.base.trip.model.roadobject.jct.Junction import com.mapbox.navigation.base.trip.model.roadobject.notification.Notification +import com.mapbox.navigation.base.trip.model.roadobject.notification.NotificationInfo import com.mapbox.navigation.base.trip.model.roadobject.railwaycrossing.RailwayCrossing import com.mapbox.navigation.base.trip.model.roadobject.restrictedarea.RestrictedArea import com.mapbox.navigation.base.trip.model.roadobject.reststop.RestStop @@ -148,6 +149,16 @@ internal fun com.mapbox.navigator.RoadObject.mapToRoadObject(): RoadObject { ) RoadObjectType.NOTIFICATION -> Notification( id, + metadata.notificationInfo.let { + NotificationInfo( + it.type, + it.subType, + it.details.requestedValue, + it.details.actualValue, + it.details.unit, + it.details.message, + ) + }, length, provider, isUrban, diff --git a/libnavigation-base/src/main/java/com/mapbox/navigation/base/trip/model/roadobject/RoadObjectType.kt b/libnavigation-base/src/main/java/com/mapbox/navigation/base/trip/model/roadobject/RoadObjectType.kt index 7ffcce2f984..0bc1dbbe3c1 100644 --- a/libnavigation-base/src/main/java/com/mapbox/navigation/base/trip/model/roadobject/RoadObjectType.kt +++ b/libnavigation-base/src/main/java/com/mapbox/navigation/base/trip/model/roadobject/RoadObjectType.kt @@ -76,9 +76,9 @@ object RoadObjectType { const val JCT = 10 /** - * Not finished yet, see https://mapbox.atlassian.net/browse/NAVAND-1311 + * Type of [NOTIFICATION] - corresponds to route notification. */ - internal const val NOTIFICATION = 11 + const val NOTIFICATION = 11 /** * Retention policy for the RoadObjectType @@ -96,6 +96,7 @@ object RoadObjectType { RAILWAY_CROSSING, IC, JCT, + NOTIFICATION, ) annotation class Type } diff --git a/libnavigation-base/src/main/java/com/mapbox/navigation/base/trip/model/roadobject/notification/Notification.kt b/libnavigation-base/src/main/java/com/mapbox/navigation/base/trip/model/roadobject/notification/Notification.kt index 991824a0fde..cd4d9e18fe5 100644 --- a/libnavigation-base/src/main/java/com/mapbox/navigation/base/trip/model/roadobject/notification/Notification.kt +++ b/libnavigation-base/src/main/java/com/mapbox/navigation/base/trip/model/roadobject/notification/Notification.kt @@ -9,9 +9,12 @@ import com.mapbox.navigation.base.trip.model.roadobject.RoadObjectType * * @see RoadObject * @see RoadObjectType.NOTIFICATION + * + * @param info notification details, see [NotificationInfo] */ -internal class Notification internal constructor( +class Notification internal constructor( id: String, + val info: NotificationInfo, length: Double?, @RoadObjectProvider.Type provider: String, isUrban: Boolean?, @@ -33,6 +36,10 @@ internal class Notification internal constructor( if (javaClass != other?.javaClass) return false if (!super.equals(other)) return false + other as Notification + + if (info != other.info) return false + return true } @@ -40,13 +47,17 @@ internal class Notification internal constructor( * Returns a hash code value for the object. */ override fun hashCode(): Int { - return super.hashCode() + var result = super.hashCode() + result = 31 * result + info.hashCode() + return result } + /** * Returns a string representation of the object. */ override fun toString(): String { - return "Notification" + return "Notification(info=$info) ${super.toString()}" } + } diff --git a/libnavigation-base/src/main/java/com/mapbox/navigation/base/trip/model/roadobject/notification/NotificationInfo.kt b/libnavigation-base/src/main/java/com/mapbox/navigation/base/trip/model/roadobject/notification/NotificationInfo.kt new file mode 100644 index 00000000000..c3dc5aea6b8 --- /dev/null +++ b/libnavigation-base/src/main/java/com/mapbox/navigation/base/trip/model/roadobject/notification/NotificationInfo.kt @@ -0,0 +1,134 @@ +package com.mapbox.navigation.base.trip.model.roadobject.notification + +import androidx.annotation.StringDef +import com.mapbox.api.directions.v5.DirectionsCriteria.NOTIFICATION_TYPE_VIOLATION + + +/** + * Class containing detailed information about a notification (see [Notification]). + * + * @param type notification type, for possible values see []. + * @param subtype notification subtype, for possible values see []. + * @param requestedValue the value passed in route request which was not respected. + * @param actualValue the value used in route response instead of the value passed in route request. + * @param unit unit in which requestedValue and actualValue are specified. + * @param message a string describing the parameter violation. + */ +class NotificationInfo internal constructor( + @NotificationsType val type: String, + @NotificationsSubtype val subtype: String?, + val requestedValue: String?, + val actualValue: String?, + val unit: String?, + val message: String? +) { + + companion object { + + /** + * Violation notification type. [NotificationInfo.type] will have this value + * if some request parameters were violated. + */ + const val NOTIFICATION_TYPE_VIOLATION = "violation" + + /** + * Max height notification subtype of type [NOTIFICATION_TYPE_VIOLATION]. + * [NotificationInfo.subtype] will have this value if `maxHeight` parameter is violated. + */ + const val NOTIFICATION_SUBTYPE_MAX_HEIGHT = "maxHeight" + + /** + * Max width notification subtype of type [NOTIFICATION_TYPE_VIOLATION]. + * [NotificationInfo.subtype] will have this value if `maxWidth` parameter is violated. + */ + const val NOTIFICATION_SUBTYPE_MAX_WIDTH = "maxWidth" + + /** + * Max weight notification subtype of type [NOTIFICATION_TYPE_VIOLATION]. + * [NotificationInfo.subtype] will have this value if `maxWeight` parameter is violated. + */ + const val NOTIFICATION_SUBTYPE_MAX_WEIGHT = "maxWeight" + + /** + * Unpaved notification subtype of type [NOTIFICATION_TYPE_VIOLATION]. + * [NotificationInfo.subtype] will have this value + * if `exclude` parameter with value "unpaved" is violated. + */ + const val NOTIFICATION_SUBTYPE_UNPAVED = "unpaved" + + /** + * Point exclusion notification subtype of type [NOTIFICATION_TYPE_VIOLATION]. + * [NotificationInfo.subtype] will have this value + * if `exclude` parameter with point value is violated. + */ + const val NOTIFICATION_SUBTYPE_POINT_EXCLUSION = "pointExclusion" + + /** + * Supported notification types. See [NotificationInfo.type]. + */ + @Retention(AnnotationRetention.BINARY) + @StringDef( + NOTIFICATION_TYPE_VIOLATION + ) + annotation class NotificationsType + + /** + * Supported notification subtypes. See [NotificationInfo.subtype]. + */ + @Retention(AnnotationRetention.BINARY) + @StringDef( + NOTIFICATION_SUBTYPE_MAX_HEIGHT, + NOTIFICATION_SUBTYPE_MAX_WIDTH, + NOTIFICATION_SUBTYPE_MAX_WEIGHT, + NOTIFICATION_SUBTYPE_UNPAVED, + NOTIFICATION_SUBTYPE_POINT_EXCLUSION + ) + annotation class NotificationsSubtype + } + + /** + * Indicates whether some other object is "equal to" this one. + */ + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (javaClass != other?.javaClass) return false + + other as NotificationInfo + + if (type != other.type) return false + if (subtype != other.subtype) return false + if (requestedValue != other.requestedValue) return false + if (actualValue != other.actualValue) return false + if (unit != other.unit) return false + if (message != other.message) return false + + return true + } + + /** + * Returns a hash code value for the object. + */ + override fun hashCode(): Int { + var result = type.hashCode() + result = 31 * result + (subtype?.hashCode() ?: 0) + result = 31 * result + (requestedValue?.hashCode() ?: 0) + result = 31 * result + (actualValue?.hashCode() ?: 0) + result = 31 * result + (unit?.hashCode() ?: 0) + result = 31 * result + (message?.hashCode() ?: 0) + return result + } + + /** + * Returns a string representation of the object. + */ + override fun toString(): String { + return "NotificationInfo(" + + "type='$type', " + + "subtype=$subtype, " + + "requestedValue=$requestedValue, " + + "actualValue=$actualValue, " + + "unit=$unit, " + + "message=$message" + + ")" + } +} diff --git a/libnavigation-base/src/test/java/com/mapbox/navigation/base/internal/factory/RoadObjectFactoryTest.kt b/libnavigation-base/src/test/java/com/mapbox/navigation/base/internal/factory/RoadObjectFactoryTest.kt index e0ced581229..1830e88fc8f 100644 --- a/libnavigation-base/src/test/java/com/mapbox/navigation/base/internal/factory/RoadObjectFactoryTest.kt +++ b/libnavigation-base/src/test/java/com/mapbox/navigation/base/internal/factory/RoadObjectFactoryTest.kt @@ -18,6 +18,7 @@ import com.mapbox.navigation.base.trip.model.roadobject.incident.IncidentInfo import com.mapbox.navigation.base.trip.model.roadobject.incident.IncidentType import com.mapbox.navigation.base.trip.model.roadobject.jct.Junction import com.mapbox.navigation.base.trip.model.roadobject.notification.Notification +import com.mapbox.navigation.base.trip.model.roadobject.notification.NotificationInfo import com.mapbox.navigation.base.trip.model.roadobject.railwaycrossing.RailwayCrossing import com.mapbox.navigation.base.trip.model.roadobject.railwaycrossing.RailwayCrossingInfo import com.mapbox.navigation.base.trip.model.roadobject.restrictedarea.RestrictedArea @@ -295,11 +296,19 @@ class RoadObjectFactoryTest { } @Test - fun `buildRoadObject - unsupported notification`() { + fun `buildRoadObject - notification`() { val nativeObject = notification val expected = Notification( ID, + NotificationInfo( + NotificationInfo.NOTIFICATION_TYPE_VIOLATION, + NotificationInfo.NOTIFICATION_SUBTYPE_MAX_HEIGHT, + "2.5", + "3.1", + "m", + "some message" + ), LENGTH, SDKRoadObjectProvider.MAPBOX, false, @@ -329,13 +338,10 @@ class RoadObjectFactoryTest { ).mapIndexed { distanceToStart, roadObject -> UpcomingRouteAlert(roadObject, distanceToStart.toDouble()) } - // notification object isn't supported yet, - // see https://mapbox.atlassian.net/browse/NAVAND-1311 - val unsupportedObjectsCount = 1 val sdkObjects = nativeObjects.toUpcomingRoadObjects() - assertEquals(nativeObjects.size - unsupportedObjectsCount, sdkObjects.size) + assertEquals(nativeObjects.size, sdkObjects.size) assertTrue(sdkObjects[0].roadObject is Tunnel) assertTrue(sdkObjects[1].roadObject is CountryBorderCrossing) assertTrue(sdkObjects[2].roadObject is TollCollection) @@ -347,7 +353,8 @@ class RoadObjectFactoryTest { assertTrue(sdkObjects[8].roadObject is RailwayCrossing) assertTrue(sdkObjects[9].roadObject is Interchange) assertTrue(sdkObjects[10].roadObject is Junction) - sdkObjects.dropLast(unsupportedObjectsCount).forEachIndexed { distanceToStart, obj -> + assertTrue(sdkObjects[11].roadObject is Notification) + sdkObjects.forEachIndexed { distanceToStart, obj -> assertEquals(distanceToStart.toDouble(), obj.distanceToStart) } } @@ -519,7 +526,19 @@ class RoadObjectFactoryTest { private val notification = createRoadObject( type = com.mapbox.navigator.RoadObjectType.NOTIFICATION, - location = matchedRoadObjectLocation(location.shape) + location = matchedRoadObjectLocation(location.shape), + notificationInfo = com.mapbox.navigator.NotificationInfo( + "violation", + "maxHeight", + 123, + 145, + com.mapbox.navigator.NotificationDetails( + "2.5", + "3.1", + "m", + "some message" + ) + ) ) private fun createRoadObject( @@ -533,6 +552,7 @@ class RoadObjectFactoryTest { railwayCrossingInfo: com.mapbox.navigator.RailwayCrossingInfo? = null, icInfo: com.mapbox.navigator.IcInfo? = null, jctInfo: com.mapbox.navigator.JctInfo? = null, + notificationInfo: com.mapbox.navigator.NotificationInfo? = null, id: String = ID ): RoadObject { val metadata = when (type) { @@ -552,6 +572,8 @@ class RoadObjectFactoryTest { RoadObjectMetadata.valueOf(icInfo!!) com.mapbox.navigator.RoadObjectType.JCT -> RoadObjectMetadata.valueOf(jctInfo!!) + com.mapbox.navigator.RoadObjectType.NOTIFICATION -> + RoadObjectMetadata.valueOf(notificationInfo!!) else -> mockk() }