Skip to content

Commit

Permalink
fixed an issue where remaining waypoints would always return 0 and br…
Browse files Browse the repository at this point in the history
…eak reroute handling
  • Loading branch information
LukasPaczos committed Feb 10, 2021
1 parent 81a06b6 commit 7437dc6
Show file tree
Hide file tree
Showing 7 changed files with 186 additions and 5 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,130 @@
package com.mapbox.navigation.instrumentation_tests.core

import androidx.test.espresso.Espresso
import com.mapbox.api.directions.v5.models.RouteOptions
import com.mapbox.geojson.Point
import com.mapbox.navigation.base.internal.extensions.applyDefaultParams
import com.mapbox.navigation.base.options.NavigationOptions
import com.mapbox.navigation.base.trip.model.RouteProgressState
import com.mapbox.navigation.core.MapboxNavigation
import com.mapbox.navigation.core.MapboxNavigationProvider
import com.mapbox.navigation.instrumentation_tests.R
import com.mapbox.navigation.instrumentation_tests.activity.EmptyTestActivity
import com.mapbox.navigation.instrumentation_tests.utils.MapboxNavigationRule
import com.mapbox.navigation.instrumentation_tests.utils.assertions.RouteProgressStateTransitionAssertion
import com.mapbox.navigation.instrumentation_tests.utils.http.MockDirectionsRequestHandler
import com.mapbox.navigation.instrumentation_tests.utils.idling.RouteProgressStateIdlingResource
import com.mapbox.navigation.instrumentation_tests.utils.location.MockLocationReplayerRule
import com.mapbox.navigation.instrumentation_tests.utils.readRawFileText
import com.mapbox.navigation.instrumentation_tests.utils.routes.MockRoutesProvider
import com.mapbox.navigation.instrumentation_tests.utils.runOnMainSync
import com.mapbox.navigation.testing.ui.BaseTest
import com.mapbox.navigation.testing.ui.utils.getMapboxAccessTokenFromResources
import org.junit.Before
import org.junit.Rule
import org.junit.Test

class CoreRerouteTest : BaseTest<EmptyTestActivity>(EmptyTestActivity::class.java) {

@get:Rule
val mapboxNavigationRule = MapboxNavigationRule()

@get:Rule
val mockLocationReplayerRule = MockLocationReplayerRule(mockLocationUpdatesRule)

private lateinit var mapboxNavigation: MapboxNavigation

private lateinit var offRouteIdlingResource: RouteProgressStateIdlingResource
private lateinit var locationTrackingIdlingResource: RouteProgressStateIdlingResource

@Before
fun setup() {
Espresso.onIdle()

mapboxNavigation = MapboxNavigationProvider.create(
NavigationOptions.Builder(activity)
.accessToken(getMapboxAccessTokenFromResources(activity))
.build()
)
locationTrackingIdlingResource = RouteProgressStateIdlingResource(
mapboxNavigation,
RouteProgressState.LOCATION_TRACKING
)
offRouteIdlingResource = RouteProgressStateIdlingResource(
mapboxNavigation,
RouteProgressState.OFF_ROUTE
)
}

@Test
fun reroute_completes() {
// prepare
val mockRoute = MockRoutesProvider.dc_very_short(activity)

val originLocation = mockLocationUpdatesRule.generateLocationUpdate {
latitude = mockRoute.routeWaypoints.first().latitude()
longitude = mockRoute.routeWaypoints.first().longitude()
}

val offRouteLocationUpdate = mockLocationUpdatesRule.generateLocationUpdate {
latitude = originLocation.latitude + 0.002
longitude = originLocation.longitude
}

mockWebServerRule.requestHandlers.addAll(mockRoute.mockRequestHandlers)
mockWebServerRule.requestHandlers.add(
MockDirectionsRequestHandler(
profile = "driving",
jsonResponse = readRawFileText(activity, R.raw.reroute_response_dc_very_short),
expectedCoordinates = listOf(
Point.fromLngLat(
offRouteLocationUpdate.longitude,
offRouteLocationUpdate.latitude
),
mockRoute.routeWaypoints.last()
)
)
)
locationTrackingIdlingResource.register()

val expectedStates = RouteProgressStateTransitionAssertion(mapboxNavigation) {
optionalState(RouteProgressState.ROUTE_INVALID)
requiredState(RouteProgressState.LOCATION_TRACKING)
requiredState(RouteProgressState.OFF_ROUTE)
optionalState(RouteProgressState.ROUTE_INITIALIZED)
requiredState(RouteProgressState.LOCATION_TRACKING)
}

// start a route
runOnMainSync {
mockLocationUpdatesRule.pushLocationUpdate(originLocation)
mapboxNavigation.startTripSession()
mapboxNavigation.requestRoutes(
RouteOptions.builder().applyDefaultParams()
.baseUrl(mockWebServerRule.baseUrl)
.accessToken(getMapboxAccessTokenFromResources(activity))
.coordinates(mockRoute.routeWaypoints).build()
)
}

// wait for tracking to start
Espresso.onIdle()
locationTrackingIdlingResource.unregister()

// push off route location and wait for the off route event
offRouteIdlingResource.register()
runOnMainSync {
mockLocationReplayerRule.loopUpdate(offRouteLocationUpdate, times = 5)
}
Espresso.onIdle()
offRouteIdlingResource.unregister()

// wait for tracking to start again
locationTrackingIdlingResource.register()
Espresso.onIdle()
locationTrackingIdlingResource.unregister()

// assert results
expectedStates.assert()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import android.os.SystemClock
import com.mapbox.api.directions.v5.models.DirectionsRoute
import com.mapbox.navigation.core.replay.MapboxReplayer
import com.mapbox.navigation.core.replay.history.ReplayEventBase
import com.mapbox.navigation.core.replay.history.ReplayEventLocation
import com.mapbox.navigation.core.replay.history.ReplayEventUpdateLocation
import com.mapbox.navigation.core.replay.history.ReplayEventsObserver
import com.mapbox.navigation.core.replay.route.ReplayRouteMapper
Expand Down Expand Up @@ -52,6 +53,22 @@ class MockLocationReplayerRule(mockLocationUpdatesRule: MockLocationUpdatesRule)
mapboxReplayer?.seekTo(replayEvents.first())
mapboxReplayer?.play()
}

fun loopUpdate(location: Location, times: Int) {
val events: List<ReplayEventUpdateLocation> =
mutableListOf<ReplayEventUpdateLocation>().apply {
repeat(times) {
this.add(location.toReplayEventUpdateLocation(it.toDouble()))
}
}
mapboxReplayer?.run {
stop()
clearEvents()
pushEvents(events)
seekTo(events.first())
play()
}
}
}

fun ReplayEventUpdateLocation.toLocation(
Expand All @@ -70,3 +87,21 @@ fun ReplayEventUpdateLocation.toLocation(

return location
}

fun Location.toReplayEventUpdateLocation(
timestamp: Double
): ReplayEventUpdateLocation {
return ReplayEventUpdateLocation(
timestamp,
ReplayEventLocation(
this.longitude,
this.latitude,
this.provider,
this.time.toDouble(),
this.altitude,
this.accuracy.toDouble(),
this.bearing.toDouble(),
this.speed.toDouble()
)
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ object MockRoutesProvider {
listOf(
MockDirectionsRequestHandler(
profile = "driving",
jsonResponse = readRawFileText(context, R.raw.route_response_dc_very_short),
jsonResponse = jsonResponse,
expectedCoordinates = coordinates
),
MockVoiceRequestHandler(
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"routes":[{"weight_name":"auto","weight":170.807,"duration":120.945,"distance":581.831,"legs":[{"annotation":{"congestion":["unknown","unknown","unknown","unknown","unknown","unknown","unknown","unknown","unknown","unknown","unknown","unknown","unknown","unknown","unknown","unknown","unknown","unknown","unknown","unknown","unknown","unknown","unknown"],"distance":[26.9,30.5,12.6,13.9,67.8,105.1,1.2,13.8,8.3,3.8,111.3,12.1,12.4,40.4,13.8,7.4,12,6.9,12.8,15.1,36.9,12.6,3.8]},"admins":[{"iso_3166_1_alpha3":"USA","iso_3166_1":"US"}],"weight":170.807,"duration":120.945,"steps":[{"bannerInstructions":[{"primary":{"components":[{"type":"text","text":"F Street Northwest"}],"type":"turn","modifier":"right","text":"F Street Northwest"},"distanceAlongGeometry":71.042}],"voiceInstructions":[{"ssmlAnnouncement":"<speak><amazon:effect name=\"drc\"><prosody rate=\"1.08\">Drive north on 14th Street Northwest. Then Turn right onto F Street Northwest.</prosody></amazon:effect></speak>","announcement":"Drive north on 14th Street Northwest. Then Turn right onto F Street Northwest.","distanceAlongGeometry":71.042}],"intersections":[{"entry":[true],"bearings":[0],"duration":2.95,"mapbox_streets_v8":{"class":"secondary"},"is_urban":true,"admin_index":0,"out":0,"weight":3.614,"geometry_index":0,"location":[-77.03195,38.896721]},{"entry":[true,false],"in":1,"bearings":[0,180],"duration":3.382,"turn_weight":0.5,"mapbox_streets_v8":{"class":"secondary"},"is_urban":true,"admin_index":0,"out":0,"weight":4.643,"geometry_index":1,"location":[-77.03195,38.896963]},{"bearings":[0,180],"entry":[true,false],"in":1,"turn_weight":2,"turn_duration":0.007,"mapbox_streets_v8":{"class":"secondary"},"is_urban":true,"admin_index":0,"out":0,"geometry_index":2,"location":[-77.03195,38.897237]}],"maneuver":{"type":"depart","instruction":"Drive north on 14th Street Northwest.","bearing_after":0,"bearing_before":0,"location":[-77.03195,38.896721]},"name":"14th Street Northwest","duration":7.757,"distance":71.042,"driving_side":"right","weight":11.994,"mode":"driving","geometry":"adaeiAz_t|qCcN?cP?aF?"},{"bannerInstructions":[{"primary":{"components":[{"type":"text","text":"13th Street Northwest"}],"type":"turn","modifier":"right","text":"13th Street Northwest"},"distanceAlongGeometry":202}],"voiceInstructions":[{"ssmlAnnouncement":"<speak><amazon:effect name=\"drc\"><prosody rate=\"1.08\">In 700 feet, Turn right onto 13th Street Northwest.</prosody></amazon:effect></speak>","announcement":"In 700 feet, Turn right onto 13th Street Northwest.","distanceAlongGeometry":185.667},{"ssmlAnnouncement":"<speak><amazon:effect name=\"drc\"><prosody rate=\"1.08\">Turn right onto 13th Street Northwest.</prosody></amazon:effect></speak>","announcement":"Turn right onto 13th Street Northwest.","distanceAlongGeometry":87.111}],"intersections":[{"entry":[true,false],"in":1,"bearings":[90,180],"duration":7.255,"turn_weight":8,"turn_duration":4.105,"mapbox_streets_v8":{"class":"secondary"},"is_urban":true,"admin_index":0,"out":0,"weight":11.859,"geometry_index":3,"location":[-77.03195,38.89735]},{"entry":[true,false],"in":1,"bearings":[90,270],"duration":38.932,"turn_weight":2,"turn_duration":0.007,"mapbox_streets_v8":{"class":"secondary"},"is_urban":true,"admin_index":0,"out":0,"weight":49.683,"geometry_index":4,"location":[-77.031789,38.89735]},{"bearings":[90,270],"entry":[true,false],"in":1,"turn_weight":2,"turn_duration":0.007,"mapbox_streets_v8":{"class":"secondary"},"is_urban":true,"admin_index":0,"out":0,"geometry_index":6,"location":[-77.029794,38.897346]}],"maneuver":{"type":"turn","instruction":"Turn right onto F Street Northwest.","modifier":"right","bearing_after":90,"bearing_before":0,"location":[-77.03195,38.89735]},"name":"F Street Northwest","duration":49.569,"distance":202,"driving_side":"right","weight":67.676,"mode":"driving","geometry":"kkbeiAz_t|qC?aI@{o@DyjA?[?}H"},{"bannerInstructions":[{"sub":{"components":[{"active":false,"directions":["left"],"type":"lane","text":""},{"active":false,"directions":["left"],"type":"lane","text":""},{"active_direction":"right","active":true,"directions":["straight","right"],"type":"lane","text":""}],"text":""},"primary":{"components":[{"type":"text","text":"Pennsylvania Avenue Northwest"}],"type":"turn","modifier":"right","text":"Pennsylvania Avenue Northwest"},"distanceAlongGeometry":201}],"voiceInstructions":[{"ssmlAnnouncement":"<speak><amazon:effect name=\"drc\"><prosody rate=\"1.08\">In 700 feet, Turn right onto Pennsylvania Avenue Northwest.</prosody></amazon:effect></speak>","announcement":"In 700 feet, Turn right onto Pennsylvania Avenue Northwest.","distanceAlongGeometry":184.667},{"ssmlAnnouncement":"<speak><amazon:effect name=\"drc\"><prosody rate=\"1.08\">Turn right onto Pennsylvania Avenue Northwest. Then, in 400 feet, Your destination will be on the left.</prosody></amazon:effect></speak>","announcement":"Turn right onto Pennsylvania Avenue Northwest. Then, in 400 feet, Your destination will be on the left.","distanceAlongGeometry":123.861}],"intersections":[{"entry":[true,false],"in":1,"bearings":[180,270],"duration":5.621,"turn_weight":8,"turn_duration":4.105,"mapbox_streets_v8":{"class":"secondary"},"is_urban":true,"admin_index":0,"out":0,"weight":9.857,"geometry_index":8,"location":[-77.029621,38.897346]},{"entry":[false,true],"in":0,"bearings":[0,180],"duration":21.796,"turn_weight":2,"turn_duration":0.007,"mapbox_streets_v8":{"class":"secondary"},"is_urban":true,"admin_index":0,"out":1,"weight":28.147,"geometry_index":9,"location":[-77.029621,38.897271]},{"entry":[false,true],"in":0,"bearings":[0,180],"duration":2.281,"turn_weight":2,"turn_duration":0.007,"mapbox_streets_v8":{"class":"secondary"},"is_urban":true,"admin_index":0,"out":1,"weight":4.728,"geometry_index":11,"location":[-77.029624,38.896237]},{"entry":[false,true],"in":0,"bearings":[0,196],"duration":3.62,"turn_weight":6,"turn_duration":2.02,"mapbox_streets_v8":{"class":"secondary"},"is_urban":true,"admin_index":0,"out":1,"weight":7.92,"geometry_index":12,"location":[-77.029624,38.896128]},{"entry":[false,true],"in":0,"bearings":[16,181],"duration":5.382,"turn_weight":2,"turn_duration":0.048,"mapbox_streets_v8":{"class":"secondary"},"is_urban":true,"admin_index":0,"out":1,"weight":8.4,"geometry_index":13,"location":[-77.029663,38.896021]},{"bearings":[1,188],"entry":[false,true],"in":0,"turn_weight":2,"lanes":[{"indications":["left"],"valid":false,"active":false},{"indications":["left"],"valid":false,"active":false},{"indications":["straight"],"valid_indication":"straight","valid":true,"active":true}],"turn_duration":0.012,"mapbox_streets_v8":{"class":"secondary"},"is_urban":true,"admin_index":0,"out":1,"geometry_index":14,"location":[-77.029672,38.895658]}],"maneuver":{"type":"turn","instruction":"Turn right onto 13th Street Northwest.","modifier":"right","bearing_after":180,"bearing_before":90,"location":[-77.029621,38.897346]},"name":"13th Street Northwest","duration":40.578,"distance":201,"driving_side":"right","weight":63.293,"mode":"driving","geometry":"ckbeiAhno|qCtC?bA?n}@DxE?tElAtUPtFj@"},{"bannerInstructions":[{"primary":{"components":[{"type":"text","text":"Your destination will be on the left"}],"type":"arrive","modifier":"left","text":"Your destination will be on the left"},"distanceAlongGeometry":107.79},{"primary":{"components":[{"type":"text","text":"Your destination is on the left"}],"type":"arrive","modifier":"left","text":"Your destination is on the left"},"distanceAlongGeometry":79.167}],"voiceInstructions":[{"ssmlAnnouncement":"<speak><amazon:effect name=\"drc\"><prosody rate=\"1.08\">Your destination is on the left.</prosody></amazon:effect></speak>","announcement":"Your destination is on the left.","distanceAlongGeometry":79.167}],"intersections":[{"lanes":[{"indications":["left"],"valid":false,"active":false},{"indications":["left"],"valid":false,"active":false},{"indications":["straight","right"],"valid_indication":"right","valid":true,"active":true}],"location":[-77.029694,38.895535],"geometry_index":15,"admin_index":0,"weight":10.043,"is_urban":true,"mapbox_streets_v8":{"class":"primary"},"turn_duration":5.373,"turn_weight":9,"duration":6.242,"bearings":[8,288],"out":1,"in":0,"entry":[false,true]},{"entry":[false,true],"in":0,"bearings":[108,281],"duration":2.387,"turn_duration":0.028,"mapbox_streets_v8":{"class":"primary"},"is_urban":true,"admin_index":0,"out":1,"weight":2.83,"geometry_index":16,"location":[-77.029775,38.895556]},{"entry":[false,true],"in":0,"bearings":[101,274],"duration":1.614,"mapbox_streets_v8":{"class":"primary"},"is_urban":true,"admin_index":0,"out":1,"weight":1.937,"geometry_index":18,"location":[-77.029989,38.895589]},{"entry":[false,true],"in":0,"bearings":[94,270],"duration":6.455,"mapbox_streets_v8":{"class":"primary"},"is_urban":true,"admin_index":0,"out":1,"weight":7.746,"geometry_index":19,"location":[-77.030136,38.895597]},{"entry":[false,true],"in":0,"bearings":[90,269],"duration":5.362,"lanes":[{"indications":["left"],"valid":false,"active":false},{"indications":["straight"],"valid_indication":"straight","valid":true,"active":true},{"indications":["straight"],"valid_indication":"straight","valid":true,"active":false}],"turn_duration":2.019,"mapbox_streets_v8":{"class":"primary"},"is_urban":true,"admin_index":0,"out":1,"weight":4.095,"geometry_index":21,"location":[-77.030736,38.895595]},{"bearings":[89,269],"entry":[false,true],"in":0,"turn_duration":0.007,"mapbox_streets_v8":{"class":"primary"},"is_urban":true,"admin_index":0,"out":1,"geometry_index":22,"location":[-77.030881,38.895593]}],"maneuver":{"type":"turn","instruction":"Turn right onto Pennsylvania Avenue Northwest.","modifier":"right","bearing_after":288,"bearing_before":188,"location":[-77.029694,38.895535]},"name":"Pennsylvania Avenue Northwest","duration":23.041,"distance":107.79,"driving_side":"right","weight":27.845,"mode":"driving","geometry":"}y~diAzro|qCi@`Do@lGQ|COdH@zI@rYB`H@vA"},{"bannerInstructions":[],"voiceInstructions":[],"intersections":[{"bearings":[89],"entry":[true],"in":0,"admin_index":0,"geometry_index":23,"location":[-77.030925,38.895592]}],"maneuver":{"type":"arrive","instruction":"Your destination is on the left.","modifier":"left","bearing_after":0,"bearing_before":269,"location":[-77.030925,38.895592]},"name":"Pennsylvania Avenue Northwest","duration":0,"distance":0,"driving_side":"right","weight":0,"mode":"driving","geometry":"o}~diAx_r|qC??"}],"distance":581.831,"summary":"F Street Northwest, 13th Street Northwest"}],"geometry":"adaeiAz_t|qCcN?cP?aF??aI@{o@DyjA?[?}HtC?bA?n}@DxE?tElAtUPtFj@i@`Do@lGQ|COdH@zI@rYB`H@vA","voiceLocale":"en-US"}],"waypoints":[{"distance":3.551,"name":"14th Street Northwest","location":[-77.03195,38.896721]},{"distance":7.719,"name":"Pennsylvania Avenue Northwest","location":[-77.030925,38.895592]}],"code":"Ok","uuid":""}
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import com.mapbox.navigation.base.trip.model.RouteProgress
import kotlin.math.min

private const val DEFAULT_REROUTE_BEARING_TOLERANCE = 90.0
private const val TAG = "MapboxRouteOptionsProvider"

/**
* Default implementation of [RouteOptionsUpdater].
Expand All @@ -32,8 +33,8 @@ class MapboxRouteOptionsUpdater(
if (routeOptions == null || routeProgress == null || location == null) {
val msg = "Cannot combine RouteOptions, invalid inputs. routeOptions, " +
"routeProgress, and location mustn't be null"
logger?.w(
Tag("MapboxRouteOptionsProvider"),
logger?.e(
Tag(TAG),
Message(msg)
)
return RouteOptionsUpdater.RouteOptionsResult.Error(Throwable(msg))
Expand All @@ -43,6 +44,20 @@ class MapboxRouteOptionsUpdater(
val coordinates = routeOptions.coordinates()
val remainingWaypoints = routeProgress.remainingWaypoints

if (remainingWaypoints == 0) {
val msg = """
Reroute failed. There are no remaining waypoints on the route.
routeOptions=$routeOptions
routeProgress=$routeProgress
location=$location
""".trimIndent()
logger?.e(
Tag(TAG),
Message(msg)
)
return RouteOptionsUpdater.RouteOptionsResult.Error(Throwable(msg))
}

try {
routeProgress.currentLegProgress?.legIndex?.let { index ->
optionsBuilder
Expand Down
Loading

0 comments on commit 7437dc6

Please sign in to comment.