diff --git a/libandroid-navigation-ui/src/main/java/com/mapbox/services/android/navigation/ui/v5/route/NavigationMapRoute.java b/libandroid-navigation-ui/src/main/java/com/mapbox/services/android/navigation/ui/v5/route/NavigationMapRoute.java index a988deb3201..2a30f032c48 100644 --- a/libandroid-navigation-ui/src/main/java/com/mapbox/services/android/navigation/ui/v5/route/NavigationMapRoute.java +++ b/libandroid-navigation-ui/src/main/java/com/mapbox/services/android/navigation/ui/v5/route/NavigationMapRoute.java @@ -99,7 +99,7 @@ public class NavigationMapRoute implements MapView.OnMapChangedListener, private static final String WAYPOINT_LAYER_ID = "mapbox-navigation-waypoint-layer"; private static final String ID_FORMAT = "%s-%d"; private static final String GENERIC_ROUTE_SHIELD_LAYER_ID = "mapbox-navigation-route-shield-layer"; - private static final int TWO_MANEUVERS = 2; + private static final int TWO_POINTS = 2; private static final int THIRTY = 30; private static final String ARROW_BEARING = "mapbox-navigation-arrow-bearing"; private static final String ARROW_SHAFT_SOURCE_ID = "mapbox-navigation-arrow-shaft-source"; @@ -445,7 +445,10 @@ private void addDirectionWaypoints() { } private void addUpcomingManeuverArrow(RouteProgress routeProgress) { - if (routeProgress.upcomingStepPoints() == null || routeProgress.upcomingStepPoints().size() < TWO_MANEUVERS) { + boolean invalidUpcomingStepPoints = routeProgress.upcomingStepPoints() == null + || routeProgress.upcomingStepPoints().size() < TWO_POINTS; + boolean invalidCurrentStepPoints = routeProgress.currentStepPoints().size() < TWO_POINTS; + if (invalidUpcomingStepPoints || invalidCurrentStepPoints) { updateArrowLayersVisibilityTo(false); return; } diff --git a/libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/offroute/OffRouteDetector.java b/libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/offroute/OffRouteDetector.java index 2161970da64..08a6c02bfc1 100644 --- a/libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/offroute/OffRouteDetector.java +++ b/libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/offroute/OffRouteDetector.java @@ -23,6 +23,7 @@ public class OffRouteDetector extends OffRoute { private Point lastReroutePoint; private OffRouteCallback callback; private RingBuffer distancesAwayFromManeuver = new RingBuffer<>(3); + private static final int TWO_POINTS = 2; /** * Method in charge of running a series of test based on the device current location @@ -208,8 +209,9 @@ private static boolean movingAwayFromManeuver(RouteProgress routeProgress, RingBuffer distancesAwayFromManeuver, List stepPoints, Point currentPoint) { - - if (routeProgress.currentLegProgress().upComingStep() == null || stepPoints.isEmpty()) { + boolean invalidUpcomingStep = routeProgress.currentLegProgress().upComingStep() == null; + boolean invalidStepPointSize = stepPoints.size() < TWO_POINTS; + if (invalidUpcomingStep || invalidStepPointSize) { return false; } diff --git a/libandroid-navigation/src/test/java/com/mapbox/services/android/navigation/v5/offroute/OffRouteDetectorTest.java b/libandroid-navigation/src/test/java/com/mapbox/services/android/navigation/v5/offroute/OffRouteDetectorTest.java index 9e54d6c9ba6..b9a399c1154 100644 --- a/libandroid-navigation/src/test/java/com/mapbox/services/android/navigation/v5/offroute/OffRouteDetectorTest.java +++ b/libandroid-navigation/src/test/java/com/mapbox/services/android/navigation/v5/offroute/OffRouteDetectorTest.java @@ -89,6 +89,21 @@ public void isUserOffRoute_AssertTrueWhenTooFarFromStep() throws Exception { assertTrue(isUserOffRoute); } + @Test + public void isUserOffRoute_StepPointSize() throws Exception { + RouteProgress routeProgress = buildDefaultTestRouteProgress(); + Point stepManeuverPoint = routeProgress.directionsRoute().legs().get(0).steps().get(0).maneuver().location(); + removeAllButOneStepPoints(routeProgress); + Location firstUpdate = buildDefaultLocationUpdate(-77.0339782574523, 38.89993519985637); + offRouteDetector.isUserOffRoute(firstUpdate, routeProgress, options); + Point offRoutePoint = buildPointAwayFromPoint(stepManeuverPoint, 50, 90); + Location secondUpdate = buildDefaultLocationUpdate(offRoutePoint.longitude(), offRoutePoint.latitude()); + + boolean isUserOffRoute = offRouteDetector.isUserOffRoute(secondUpdate, routeProgress, options); + + assertFalse(isUserOffRoute); + } + @Test public void isUserOffRoute_AssertFalseWhenOnStep() throws Exception { RouteProgress routeProgress = buildDefaultTestRouteProgress(); @@ -225,4 +240,10 @@ public void isUserOffRoute_assertTrueWhenRouteDistanceRemainingIsZero() { assertTrue(isOffRoute); } + + private void removeAllButOneStepPoints(RouteProgress routeProgress) { + for (int i = routeProgress.currentStepPoints().size() - 2; i >= 0; i--) { + routeProgress.currentStepPoints().remove(i); + } + } }