From 6d6e4da9bded55587e245365a88f921417582694 Mon Sep 17 00:00:00 2001 From: danesfeder Date: Wed, 5 Sep 2018 17:02:07 -0400 Subject: [PATCH] Add voice instruction from NavigationStatus --- build.gradle | 1 - gradle/dependencies.gradle | 2 + .../ui/v5/TestRouteProgressBuilder.java | 1 + libandroid-navigation/build.gradle | 4 +- .../milestone/VoiceInstructionMilestone.java | 107 ++++++----------- .../v5/navigation/MapboxNavigation.java | 16 +-- .../v5/navigation/MapboxNavigator.java | 51 +++++++++ .../navigation/NavigationEngineFactory.java | 30 +---- .../navigation/NavigationLibraryLoader.java | 11 +- .../NavigationLocationEngineListener.java | 34 +----- .../navigation/NavigationLocationUpdate.java | 17 --- .../navigation/NavigationRouteProcessor.java | 43 +++---- .../v5/navigation/NavigationService.java | 2 +- .../RouteProcessorBackgroundThread.java | 23 ++-- .../v5/navigation/RouteProcessorRunnable.java | 51 +++++---- .../v5/offroute/OffRouteDetector.java | 16 +-- .../v5/routeprogress/RouteProgress.java | 21 +++- .../navigation/v5/snap/SnapToRoute.java | 16 +-- .../v5/TestRouteProgressBuilder.java | 1 + .../VoiceInstructionMilestoneTest.java | 108 ++++++------------ .../NavigationEngineFactoryTest.java | 20 ++-- .../NavigationLocationEngineListenerTest.java | 26 +---- .../NavigationRouteProcessorTest.java | 11 +- .../v5/offroute/OffRouteDetectorTest.java | 18 +-- .../navigation/v5/snap/SnapToRouteTest.java | 14 +-- 25 files changed, 260 insertions(+), 384 deletions(-) create mode 100644 libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/navigation/MapboxNavigator.java delete mode 100644 libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/navigation/NavigationLocationUpdate.java diff --git a/build.gradle b/build.gradle index 225112c9169..c0ec9c86c72 100644 --- a/build.gradle +++ b/build.gradle @@ -8,7 +8,6 @@ buildscript { google() jcenter() maven { url 'https://plugins.gradle.org/m2' } - maven { url 'https://mapbox.bintray.com/mapbox' } } dependencies { classpath pluginDependencies.gradle diff --git a/gradle/dependencies.gradle b/gradle/dependencies.gradle index 1f6ce3e0834..6b11242bac2 100644 --- a/gradle/dependencies.gradle +++ b/gradle/dependencies.gradle @@ -11,6 +11,7 @@ ext { mapboxMapSdk : '6.5.0', mapboxSdkServices : '3.4.1', mapboxEvents : '3.2.0', + mapboxNavigator : '2.0.0', locationLayerPlugin: '0.8.1', autoValue : '1.5.4', autoValueParcel : '0.2.5', @@ -51,6 +52,7 @@ ext { mapboxSdkServices : "com.mapbox.mapboxsdk:mapbox-sdk-services:${version.mapboxSdkServices}", mapboxSdkTurf : "com.mapbox.mapboxsdk:mapbox-sdk-turf:${version.mapboxSdkServices}", mapboxEvents : "com.mapbox.mapboxsdk:mapbox-android-telemetry:${version.mapboxEvents}", + mapboxNavigator : "com.mapbox.navigator:mapbox-navigation-native:${version.mapboxNavigator}", locationLayerPlugin : "com.mapbox.mapboxsdk:mapbox-android-plugin-locationlayer:${version.locationLayerPlugin}", // AutoValue diff --git a/libandroid-navigation-ui/src/test/java/com/mapbox/services/android/navigation/ui/v5/TestRouteProgressBuilder.java b/libandroid-navigation-ui/src/test/java/com/mapbox/services/android/navigation/ui/v5/TestRouteProgressBuilder.java index 7ea1857ff3d..b7f0e3ec8d4 100644 --- a/libandroid-navigation-ui/src/test/java/com/mapbox/services/android/navigation/ui/v5/TestRouteProgressBuilder.java +++ b/libandroid-navigation-ui/src/test/java/com/mapbox/services/android/navigation/ui/v5/TestRouteProgressBuilder.java @@ -63,6 +63,7 @@ RouteProgress buildTestRouteProgress(DirectionsRoute route, .intersectionDistancesAlongStep(intersectionDistances) .stepIndex(stepIndex) .legIndex(legIndex) + .inTunnel(false) .build(); } diff --git a/libandroid-navigation/build.gradle b/libandroid-navigation/build.gradle index 975f5d6863f..04b8a489308 100644 --- a/libandroid-navigation/build.gradle +++ b/libandroid-navigation/build.gradle @@ -43,8 +43,8 @@ dependencies { api dependenciesList.mapboxSdkServices api dependenciesList.mapboxSdkTurf - // Native - implementation 'com.mapbox.navigator:mapbox-navigation-native:master-SNAPSHOT' + // Navigator + implementation dependenciesList.mapboxNavigator // Support implementation dependenciesList.supportAppcompatV7 diff --git a/libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/milestone/VoiceInstructionMilestone.java b/libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/milestone/VoiceInstructionMilestone.java index 9c3c1fad13a..33112fabfdb 100644 --- a/libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/milestone/VoiceInstructionMilestone.java +++ b/libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/milestone/VoiceInstructionMilestone.java @@ -1,12 +1,9 @@ package com.mapbox.services.android.navigation.v5.milestone; import com.mapbox.api.directions.v5.models.DirectionsRoute; -import com.mapbox.api.directions.v5.models.LegStep; -import com.mapbox.api.directions.v5.models.VoiceInstructions; import com.mapbox.services.android.navigation.v5.instruction.Instruction; import com.mapbox.services.android.navigation.v5.navigation.VoiceInstructionLoader; import com.mapbox.services.android.navigation.v5.routeprogress.RouteProgress; -import com.mapbox.services.android.navigation.v5.utils.RouteUtils; /** * A default milestone that is added to {@link com.mapbox.services.android.navigation.v5.navigation.MapboxNavigation} @@ -18,28 +15,17 @@ public class VoiceInstructionMilestone extends Milestone { private static final String EMPTY_STRING = ""; - - private VoiceInstructions instructions; - private DirectionsRoute currentRoute; - private RouteUtils routeUtils; + private String announcement = EMPTY_STRING; + private String ssmlAnnouncement = EMPTY_STRING; VoiceInstructionMilestone(Builder builder) { super(builder); - routeUtils = new RouteUtils(); } @Override public boolean isOccurring(RouteProgress previousRouteProgress, RouteProgress routeProgress) { - if (isNewRoute(routeProgress)) { - cacheInstructions(routeProgress, true); - } - LegStep currentStep = routeProgress.currentLegProgress().currentStep(); - double stepDistanceRemaining = routeProgress.currentLegProgress().currentStepProgress().distanceRemaining(); - VoiceInstructions instructions = routeUtils.findCurrentVoiceInstructions(currentStep, stepDistanceRemaining); - if (shouldBeVoiced(instructions, stepDistanceRemaining)) { - return updateInstructions(routeProgress, instructions); - } - return false; + checkForNewRoute(previousRouteProgress, routeProgress); + return updateCurrentAnnouncement(routeProgress); } @Override @@ -47,10 +33,7 @@ public Instruction getInstruction() { return new Instruction() { @Override public String buildInstruction(RouteProgress routeProgress) { - if (instructions == null) { - return routeProgress.currentLegProgress().currentStep().name(); - } - return instructions.announcement(); + return announcement; } }; } @@ -65,10 +48,7 @@ public String buildInstruction(RouteProgress routeProgress) { * @since 0.8.0 */ public String getSsmlAnnouncement() { - if (instructions == null) { - return EMPTY_STRING; - } - return instructions.ssmlAnnouncement(); + return ssmlAnnouncement; } /** @@ -80,55 +60,7 @@ public String getSsmlAnnouncement() { * @since 0.12.0 */ public String getAnnouncement() { - if (instructions == null) { - return EMPTY_STRING; - } - return instructions.announcement(); - } - - /** - * Looks to see if we have a new route. - * - * @param routeProgress provides updated route information - * @return true if new route, false if not - */ - private boolean isNewRoute(RouteProgress routeProgress) { - boolean newRoute = currentRoute == null || !currentRoute.equals(routeProgress.directionsRoute()); - currentRoute = routeProgress.directionsRoute(); - return newRoute; - } - - /** - * Checks if the current instructions are different from the instructions - * determined by the step distance remaining. - * - * @param instructions the current voice instructions from the list of step instructions - * @param stepDistanceRemaining the current step distance remaining - * @return true if time to voice the announcement, false if not - */ - private boolean shouldBeVoiced(VoiceInstructions instructions, double stepDistanceRemaining) { - boolean isNewInstruction = this.instructions == null || !this.instructions.equals(instructions); - boolean isValidNewInstruction = instructions != null && isNewInstruction; - return isValidNewInstruction && instructions.distanceAlongGeometry() >= stepDistanceRemaining; - } - - private boolean updateInstructions(RouteProgress routeProgress, VoiceInstructions instructions) { - cacheInstructions(routeProgress, false); - this.instructions = instructions; - return true; - } - - /** - * Caches the instructions in the VoiceInstructionLoader if it has been initialized - * - * @param routeProgress containing the instructions - * @param isFirst whether it's the first routeProgress of the route - */ - private void cacheInstructions(RouteProgress routeProgress, boolean isFirst) { - VoiceInstructionLoader voiceInstructionLoader = VoiceInstructionLoader.getInstance(); - if (voiceInstructionLoader != null) { - voiceInstructionLoader.cacheInstructions(routeProgress, isFirst); - } + return announcement; } public static final class Builder extends Milestone.Builder { @@ -155,4 +87,29 @@ public VoiceInstructionMilestone build() { return new VoiceInstructionMilestone(this); } } + + private void checkForNewRoute(RouteProgress previousRouteProgress, RouteProgress routeProgress) { + DirectionsRoute previousRoute = previousRouteProgress.directionsRoute(); + DirectionsRoute currentRoute = routeProgress.directionsRoute(); + if (!previousRoute.equals(currentRoute)) { + cacheInstructions(routeProgress, true); + } + } + + private void cacheInstructions(RouteProgress routeProgress, boolean isFirst) { + VoiceInstructionLoader voiceInstructionLoader = VoiceInstructionLoader.getInstance(); + if (voiceInstructionLoader != null) { + voiceInstructionLoader.cacheInstructions(routeProgress, isFirst); + } + } + + private boolean updateCurrentAnnouncement(RouteProgress routeProgress) { + if (!announcement.equals(routeProgress.currentAnnouncement())) { + announcement = routeProgress.currentAnnouncement(); + ssmlAnnouncement = routeProgress.currentSsmlAnnouncement(); + cacheInstructions(routeProgress, false); + return true; + } + return false; + } } \ No newline at end of file diff --git a/libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/navigation/MapboxNavigation.java b/libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/navigation/MapboxNavigation.java index 3c87ba9c3ab..96d4b9acb49 100644 --- a/libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/navigation/MapboxNavigation.java +++ b/libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/navigation/MapboxNavigation.java @@ -55,7 +55,7 @@ public class MapboxNavigation implements ServiceConnection { private NavigationEngineFactory navigationEngineFactory; private NavigationTelemetry navigationTelemetry = null; private NavigationService navigationService; - private Navigator navigator; + private MapboxNavigator mapboxNavigator; private DirectionsRoute directionsRoute; private MapboxNavigationOptions options; private LocationEngine locationEngine = null; @@ -64,7 +64,9 @@ public class MapboxNavigation implements ServiceConnection { private Context applicationContext; private boolean isBound; - static { NavigationLibraryLoader.load(); } + static { + NavigationLibraryLoader.load(); + } /** * Constructs a new instance of this class using the default options. This should be used over @@ -155,9 +157,9 @@ private void initializeForTest() { */ private void initialize() { // Initialize event dispatcher and add internal listeners - navigator = new Navigator(); + mapboxNavigator = new MapboxNavigator(new Navigator()); navigationEventDispatcher = new NavigationEventDispatcher(); - navigationEngineFactory = new NavigationEngineFactory(navigator); + navigationEngineFactory = new NavigationEngineFactory(); initializeDefaultLocationEngine(); initializeTelemetry(); @@ -794,14 +796,14 @@ NavigationEngineFactory retrieveEngineFactory() { return navigationEngineFactory; } - Navigator retrieveNavigator() { - return navigator; + MapboxNavigator retrieveMapboxNavigator() { + return mapboxNavigator; } private void startNavigationWith(@NonNull DirectionsRoute directionsRoute) { ValidationUtils.validDirectionsRoute(directionsRoute, options.defaultMilestonesEnabled()); this.directionsRoute = directionsRoute; - navigator.setDirections(directionsRoute.toJson()); + mapboxNavigator.updateRoute(directionsRoute.toJson()); if (!isBound) { navigationTelemetry.startSession(directionsRoute); startNavigationService(); diff --git a/libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/navigation/MapboxNavigator.java b/libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/navigation/MapboxNavigator.java new file mode 100644 index 00000000000..3d17c26470d --- /dev/null +++ b/libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/navigation/MapboxNavigator.java @@ -0,0 +1,51 @@ +package com.mapbox.services.android.navigation.v5.navigation; + +import android.location.Location; + +import com.mapbox.geojson.Point; +import com.mapbox.navigator.FixLocation; +import com.mapbox.navigator.NavigationStatus; +import com.mapbox.navigator.Navigator; + +import java.util.Date; + +class MapboxNavigator { + + private final Navigator navigator; + + MapboxNavigator(Navigator navigator) { + this.navigator = navigator; + } + + synchronized void updateRoute(String routeJson) { + navigator.setDirections(routeJson); + } + + synchronized NavigationStatus retrieveStatus(Date date) { + return navigator.getStatus(date); + } + + void updateLocation(Location location) { + navigator.updateLocation(buildFixLocationFrom(location)); + } + + private FixLocation buildFixLocationFrom(Location rawLocation) { + Point rawPoint = Point.fromLngLat(rawLocation.getLongitude(), rawLocation.getLatitude()); + Date time = new Date(rawLocation.getTime()); + Float speed = rawLocation.getSpeed(); + Float bearing = rawLocation.getBearing(); + Float altitude = (float) rawLocation.getAltitude(); + Float horizontalAccuracy = rawLocation.getAccuracy(); + String provider = rawLocation.getProvider(); + + return new FixLocation( + rawPoint, + time, + speed, + bearing, + altitude, + horizontalAccuracy, + provider + ); + } +} diff --git a/libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/navigation/NavigationEngineFactory.java b/libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/navigation/NavigationEngineFactory.java index b9d08f0d705..f86c0bafd8e 100644 --- a/libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/navigation/NavigationEngineFactory.java +++ b/libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/navigation/NavigationEngineFactory.java @@ -1,15 +1,11 @@ package com.mapbox.services.android.navigation.v5.navigation; -import android.location.Location; - -import com.mapbox.navigator.Navigator; import com.mapbox.services.android.navigation.v5.navigation.camera.Camera; import com.mapbox.services.android.navigation.v5.navigation.camera.SimpleCamera; import com.mapbox.services.android.navigation.v5.offroute.OffRoute; import com.mapbox.services.android.navigation.v5.offroute.OffRouteDetector; import com.mapbox.services.android.navigation.v5.route.FasterRoute; import com.mapbox.services.android.navigation.v5.route.FasterRouteDetector; -import com.mapbox.services.android.navigation.v5.routeprogress.RouteProgress; import com.mapbox.services.android.navigation.v5.snap.Snap; import com.mapbox.services.android.navigation.v5.snap.SnapToRoute; @@ -20,26 +16,8 @@ class NavigationEngineFactory { private Snap snapEngine; private Camera cameraEngine; - NavigationEngineFactory(Navigator navigator) { - initializeDefaultEngines(navigator); - } - - // For testing purposes only NavigationEngineFactory() { - cameraEngine = new SimpleCamera(); - fasterRouteEngine = new FasterRouteDetector(); - snapEngine = new Snap() { - @Override - public Location getSnappedLocation(Location location, RouteProgress routeProgress) { - return location; - } - }; - offRouteEngine = new OffRoute() { - @Override - public boolean isUserOffRoute(Location location, RouteProgress routeProgress, MapboxNavigationOptions options) { - return false; - } - }; + initializeDefaultEngines(); } OffRoute retrieveOffRouteEngine() { @@ -86,10 +64,10 @@ void updateCameraEngine(Camera cameraEngine) { this.cameraEngine = cameraEngine; } - private void initializeDefaultEngines(Navigator navigator) { + private void initializeDefaultEngines() { cameraEngine = new SimpleCamera(); - snapEngine = new SnapToRoute(navigator); - offRouteEngine = new OffRouteDetector(navigator); + snapEngine = new SnapToRoute(); + offRouteEngine = new OffRouteDetector(); fasterRouteEngine = new FasterRouteDetector(); } } diff --git a/libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/navigation/NavigationLibraryLoader.java b/libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/navigation/NavigationLibraryLoader.java index bfc10e032b5..8f8969c75a4 100644 --- a/libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/navigation/NavigationLibraryLoader.java +++ b/libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/navigation/NavigationLibraryLoader.java @@ -15,16 +15,7 @@ public void load(String name) { private static volatile NavigationLibraryLoader loader = DEFAULT; /** - * Set the library loader that loads the shared library. - * - * @param libraryLoader the library loader - */ - public static void setLibraryLoader(NavigationLibraryLoader libraryLoader) { - loader = libraryLoader; - } - - /** - * Loads navigation native shared library. + * Loads navigation shared library. *

* Catches UnsatisfiedLinkErrors and prints a warning to logcat. *

diff --git a/libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/navigation/NavigationLocationEngineListener.java b/libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/navigation/NavigationLocationEngineListener.java index ce9f11b9bdb..dbedbfdf968 100644 --- a/libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/navigation/NavigationLocationEngineListener.java +++ b/libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/navigation/NavigationLocationEngineListener.java @@ -4,25 +4,18 @@ import com.mapbox.android.core.location.LocationEngine; import com.mapbox.android.core.location.LocationEngineListener; -import com.mapbox.geojson.Point; -import com.mapbox.navigator.FixLocation; -import com.mapbox.navigator.Navigator; import com.mapbox.services.android.navigation.v5.location.LocationValidator; -import java.util.Date; - class NavigationLocationEngineListener implements LocationEngineListener { private final RouteProcessorBackgroundThread thread; - private final Navigator navigator; private final LocationEngine locationEngine; private final LocationValidator validator; - NavigationLocationEngineListener(RouteProcessorBackgroundThread thread, Navigator navigator, - LocationEngine locationEngine, LocationValidator validator) { + NavigationLocationEngineListener(RouteProcessorBackgroundThread thread, LocationEngine locationEngine, + LocationValidator validator) { this.thread = thread; this.locationEngine = locationEngine; - this.navigator = navigator; this.validator = validator; } @@ -34,31 +27,10 @@ public void onConnected() { @Override public void onLocationChanged(Location location) { - navigator.updateLocation(buildFixLocationFrom(location)); - thread.updateLocation(location); + thread.updateRawLocation(location); } boolean isValidLocationUpdate(Location location) { return location != null && validator.isValidUpdate(location); } - - private FixLocation buildFixLocationFrom(Location rawLocation) { - Point rawPoint = Point.fromLngLat(rawLocation.getLongitude(), rawLocation.getLatitude()); - Date time = new Date(rawLocation.getTime()); - Float speed = rawLocation.getSpeed(); - Float bearing = rawLocation.getBearing(); - Float altitude = (float) rawLocation.getAltitude(); - Float horizontalAccuracy = rawLocation.getAccuracy(); - String provider = rawLocation.getProvider(); - - return new FixLocation( - rawPoint, - time, - speed, - bearing, - altitude, - horizontalAccuracy, - provider - ); - } } \ No newline at end of file diff --git a/libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/navigation/NavigationLocationUpdate.java b/libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/navigation/NavigationLocationUpdate.java deleted file mode 100644 index 8343739f4be..00000000000 --- a/libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/navigation/NavigationLocationUpdate.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.mapbox.services.android.navigation.v5.navigation; - -import android.location.Location; - -import com.google.auto.value.AutoValue; - -@AutoValue -abstract class NavigationLocationUpdate { - - static NavigationLocationUpdate create(Location location, MapboxNavigation mapboxNavigation) { - return new AutoValue_NavigationLocationUpdate(location, mapboxNavigation); - } - - abstract Location location(); - - abstract MapboxNavigation mapboxNavigation(); -} diff --git a/libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/navigation/NavigationRouteProcessor.java b/libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/navigation/NavigationRouteProcessor.java index 6af554b8c06..01ae7b46216 100644 --- a/libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/navigation/NavigationRouteProcessor.java +++ b/libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/navigation/NavigationRouteProcessor.java @@ -1,5 +1,6 @@ package com.mapbox.services.android.navigation.v5.navigation; +import android.support.annotation.Nullable; import android.support.v4.util.Pair; import com.mapbox.api.directions.v5.models.DirectionsRoute; @@ -8,12 +9,10 @@ import com.mapbox.api.directions.v5.models.StepIntersection; import com.mapbox.geojson.Point; import com.mapbox.navigator.NavigationStatus; -import com.mapbox.navigator.Navigator; +import com.mapbox.navigator.VoiceInstruction; import com.mapbox.services.android.navigation.v5.routeprogress.CurrentLegAnnotation; import com.mapbox.services.android.navigation.v5.routeprogress.RouteProgress; -import com.mapbox.services.android.navigation.v5.utils.RingBuffer; -import java.util.Date; import java.util.List; import static com.mapbox.services.android.navigation.v5.navigation.NavigationHelper.createCurrentAnnotation; @@ -27,8 +26,7 @@ class NavigationRouteProcessor { private static final int ONE_INDEX = 1; - private final RingBuffer previousProgressList = new RingBuffer<>(2); - private final Navigator navigator; + private RouteProgress previousRouteProgress; private DirectionsRoute route; private RouteLeg currentLeg; private LegStep currentStep; @@ -39,18 +37,18 @@ class NavigationRouteProcessor { private List> currentIntersectionDistances; private CurrentLegAnnotation currentLegAnnotation; - NavigationRouteProcessor(Navigator navigator) { - this.navigator = navigator; + RouteProgress buildNewRouteProgress(NavigationStatus status, DirectionsRoute route) { + updateRoute(route); + return buildRouteProgressFrom(status); } - RouteProgress buildNewRouteProgress(Date date, DirectionsRoute route) { - NavigationStatus status = navigator.getStatus(date); - updateRoute(route); - return buildRouteProgressWith(status); + void updatePreviousRouteProgress(RouteProgress routeProgress) { + previousRouteProgress = routeProgress; } + @Nullable RouteProgress retrievePreviousRouteProgress() { - return previousProgressList.pollLast(); + return previousRouteProgress; } private void updateRoute(DirectionsRoute route) { @@ -59,20 +57,19 @@ private void updateRoute(DirectionsRoute route) { } } - private RouteProgress buildRouteProgressWith(NavigationStatus status) { + private RouteProgress buildRouteProgressFrom(NavigationStatus status) { int legIndex = status.getLegIndex(); int stepIndex = status.getStepIndex(); int upcomingStepIndex = stepIndex + ONE_INDEX; - double stepDistanceRemaining = status.getRemainingStepDistance(); updateSteps(route, legIndex, stepIndex, upcomingStepIndex); updateStepPoints(route, legIndex, stepIndex, upcomingStepIndex); updateIntersections(); double legDistanceRemaining = status.getRemainingLegDistance(); double routeDistanceRemaining = routeDistanceRemaining(legDistanceRemaining, legIndex, route); + double stepDistanceRemaining = status.getRemainingStepDistance(); double stepDistanceTraveled = currentStep.distance() - stepDistanceRemaining; currentLegAnnotation = createCurrentAnnotation(currentLegAnnotation, currentLeg, legDistanceRemaining); - StepIntersection currentIntersection = findCurrentIntersection( currentIntersections, currentIntersectionDistances, stepDistanceTraveled ); @@ -96,12 +93,10 @@ private RouteProgress buildRouteProgressWith(NavigationStatus status) { .currentLegAnnotation(currentLegAnnotation) .inTunnel(status.getInTunnel()); - // TODO voice banner "current" in RouteProgress - + // TODO build banner instructions from status here + addVoiceInstructions(status, progressBuilder); addUpcomingStepPoints(progressBuilder); - RouteProgress routeProgress = progressBuilder.build(); - previousProgressList.add(routeProgress); - return routeProgress; + return progressBuilder.build(); } private void updateSteps(DirectionsRoute route, int legIndex, int stepIndex, int upcomingStepIndex) { @@ -126,4 +121,12 @@ private void addUpcomingStepPoints(RouteProgress.Builder progressBuilder) { progressBuilder.upcomingStepPoints(upcomingStepPoints); } } + + private void addVoiceInstructions(NavigationStatus status, RouteProgress.Builder progressBuilder) { + VoiceInstruction voiceInstruction = status.getVoiceInstruction(); + if (voiceInstruction != null) { + progressBuilder.currentAnnouncement(voiceInstruction.getAnnouncement()); + progressBuilder.currentSsmlAnnouncement(voiceInstruction.getSsmlAnnouncement()); + } + } } diff --git a/libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/navigation/NavigationService.java b/libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/navigation/NavigationService.java index 68c4833fbdf..a2271e0dd31 100644 --- a/libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/navigation/NavigationService.java +++ b/libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/navigation/NavigationService.java @@ -124,7 +124,7 @@ private void initializeLocationProvider(MapboxNavigation mapboxNavigation) { int accuracyThreshold = mapboxNavigation.options().locationAcceptableAccuracyInMetersThreshold(); LocationValidator validator = new LocationValidator(accuracyThreshold); NavigationLocationEngineListener listener = new NavigationLocationEngineListener( - thread, mapboxNavigation.retrieveNavigator(), locationEngine, validator + thread, locationEngine, validator ); locationUpdater = new NavigationLocationEngineUpdater(locationEngine, listener); } diff --git a/libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/navigation/RouteProcessorBackgroundThread.java b/libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/navigation/RouteProcessorBackgroundThread.java index c111615f462..20f26045724 100644 --- a/libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/navigation/RouteProcessorBackgroundThread.java +++ b/libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/navigation/RouteProcessorBackgroundThread.java @@ -22,14 +22,14 @@ class RouteProcessorBackgroundThread extends HandlerThread { private final Listener listener; private final NavigationRouteProcessor routeProcessor; private Handler workerHandler; - private Location unfilteredLocation; + private RouteProcessorRunnable runnable; RouteProcessorBackgroundThread(MapboxNavigation navigation, Handler responseHandler, Listener listener) { super(MAPBOX_NAVIGATION_THREAD_NAME, Process.THREAD_PRIORITY_BACKGROUND); this.navigation = navigation; this.responseHandler = responseHandler; this.listener = listener; - this.routeProcessor = new NavigationRouteProcessor(navigation.retrieveNavigator()); + this.routeProcessor = new NavigationRouteProcessor(); } @Override @@ -38,19 +38,26 @@ public synchronized void start() { if (workerHandler == null) { workerHandler = new Handler(getLooper()); } - - NavigationLocationUpdate locationUpdate = NavigationLocationUpdate.create(unfilteredLocation, navigation); - RouteProcessorRunnable runnable = new RouteProcessorRunnable( - routeProcessor, locationUpdate, workerHandler, responseHandler, listener + runnable = new RouteProcessorRunnable( + routeProcessor, navigation, workerHandler, responseHandler, listener ); workerHandler.post(runnable); } - void updateLocation(Location location) { - unfilteredLocation = location; + @Override + public boolean quit() { + if (isAlive()) { + workerHandler.removeCallbacks(runnable); + } + return super.quit(); + } + + void updateRawLocation(Location rawLocation) { if (!isAlive()) { start(); } + navigation.retrieveMapboxNavigator().updateLocation(rawLocation); + runnable.updateRawLocation(rawLocation); } /** diff --git a/libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/navigation/RouteProcessorRunnable.java b/libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/navigation/RouteProcessorRunnable.java index 295514ef023..8010683ca4b 100644 --- a/libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/navigation/RouteProcessorRunnable.java +++ b/libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/navigation/RouteProcessorRunnable.java @@ -4,6 +4,7 @@ import android.os.Handler; import com.mapbox.api.directions.v5.models.DirectionsRoute; +import com.mapbox.navigator.NavigationStatus; import com.mapbox.services.android.navigation.v5.milestone.Milestone; import com.mapbox.services.android.navigation.v5.offroute.OffRoute; import com.mapbox.services.android.navigation.v5.offroute.OffRouteDetector; @@ -16,24 +17,23 @@ import java.util.Date; import java.util.List; -import timber.log.Timber; - class RouteProcessorRunnable implements Runnable { - private static final int ONE_SECOND = 1000; + private static final int ONE_SECOND_IN_MILLISECONDS = 1000; private final NavigationRouteProcessor routeProcessor; - private final NavigationLocationUpdate locationUpdate; + private final MapboxNavigation navigation; private final Handler workerHandler; private final Handler responseHandler; private final RouteProcessorBackgroundThread.Listener listener; + private Location rawLocation; RouteProcessorRunnable(NavigationRouteProcessor routeProcessor, - NavigationLocationUpdate locationUpdate, + MapboxNavigation navigation, Handler workerHandler, Handler responseHandler, RouteProcessorBackgroundThread.Listener listener) { this.routeProcessor = routeProcessor; - this.locationUpdate = locationUpdate; + this.navigation = navigation; this.workerHandler = workerHandler; this.responseHandler = responseHandler; this.listener = listener; @@ -44,40 +44,43 @@ public void run() { process(); } + void updateRawLocation(Location rawLocation) { + this.rawLocation = rawLocation; + } + private void process() { - Timber.d("NAV_DEBUG Processor Runnable fired - processing..."); - - MapboxNavigation mapboxNavigation = locationUpdate.mapboxNavigation(); - MapboxNavigationOptions options = mapboxNavigation.options(); - Location rawLocation = locationUpdate.location(); - DirectionsRoute route = mapboxNavigation.getRoute(); - Date currentDate = new Date(); - RouteProgress routeProgress = routeProcessor.buildNewRouteProgress(currentDate, route); - - NavigationEngineFactory engineFactory = mapboxNavigation.retrieveEngineFactory(); - final boolean userOffRoute = isUserOffRoute(options, currentDate, rawLocation, routeProgress, engineFactory); - final Location snappedLocation = findSnappedLocation(currentDate, rawLocation, routeProgress, engineFactory); + MapboxNavigator mapboxNavigator = navigation.retrieveMapboxNavigator(); + MapboxNavigationOptions options = navigation.options(); + DirectionsRoute route = navigation.getRoute(); + + NavigationStatus status = mapboxNavigator.retrieveStatus(new Date()); + RouteProgress routeProgress = routeProcessor.buildNewRouteProgress(status, route); + + NavigationEngineFactory engineFactory = navigation.retrieveEngineFactory(); + final boolean userOffRoute = isUserOffRoute(options, status, rawLocation, routeProgress, engineFactory); + final Location snappedLocation = findSnappedLocation(status, rawLocation, routeProgress, engineFactory); final boolean checkFasterRoute = checkFasterRoute(options, rawLocation, routeProgress, engineFactory, userOffRoute); - final List milestones = findTriggeredMilestones(mapboxNavigation, routeProgress); + final List milestones = findTriggeredMilestones(navigation, routeProgress); - workerHandler.postDelayed(this, ONE_SECOND); + workerHandler.postDelayed(this, ONE_SECOND_IN_MILLISECONDS); sendUpdateToResponseHandler(userOffRoute, milestones, snappedLocation, checkFasterRoute, routeProgress); + routeProcessor.updatePreviousRouteProgress(routeProgress); } - private boolean isUserOffRoute(MapboxNavigationOptions options, Date date, Location rawLocation, + private boolean isUserOffRoute(MapboxNavigationOptions options, NavigationStatus status, Location rawLocation, RouteProgress routeProgress, NavigationEngineFactory engineFactory) { OffRoute offRoute = engineFactory.retrieveOffRouteEngine(); if (offRoute instanceof OffRouteDetector) { - return ((OffRouteDetector) offRoute).isUserOffRouteWith(date); + return ((OffRouteDetector) offRoute).isUserOffRouteWith(status); } return offRoute.isUserOffRoute(rawLocation, routeProgress, options); } - private Location findSnappedLocation(Date date, Location rawLocation, RouteProgress routeProgress, + private Location findSnappedLocation(NavigationStatus status, Location rawLocation, RouteProgress routeProgress, NavigationEngineFactory engineFactory) { Snap snap = engineFactory.retrieveSnapEngine(); if (snap instanceof SnapToRoute) { - return ((SnapToRoute) snap).getSnappedLocationWith(rawLocation, date); + return ((SnapToRoute) snap).getSnappedLocationWith(rawLocation, status); } return snap.getSnappedLocation(rawLocation, routeProgress); } 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 85411207760..e959c5569fb 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 @@ -3,33 +3,19 @@ import android.location.Location; import com.mapbox.navigator.NavigationStatus; -import com.mapbox.navigator.Navigator; import com.mapbox.navigator.RouteState; import com.mapbox.services.android.navigation.v5.navigation.MapboxNavigationOptions; import com.mapbox.services.android.navigation.v5.routeprogress.RouteProgress; -import java.util.Date; - public class OffRouteDetector extends OffRoute { - private final Navigator navigator; - - public OffRouteDetector(Navigator navigator) { - this.navigator = navigator; - } - @Override public boolean isUserOffRoute(Location location, RouteProgress routeProgress, MapboxNavigationOptions options) { // No impl return false; } - public boolean isUserOffRouteWith(Date date) { - return determineIsUserOffRoute(date); - } - - private boolean determineIsUserOffRoute(Date date) { - NavigationStatus status = navigator.getStatus(date); + public boolean isUserOffRouteWith(NavigationStatus status) { return status.getRouteState() == RouteState.OFFROUTE; } } diff --git a/libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/routeprogress/RouteProgress.java b/libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/routeprogress/RouteProgress.java index a3b6d6fb9c1..a2801c88e96 100644 --- a/libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/routeprogress/RouteProgress.java +++ b/libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/routeprogress/RouteProgress.java @@ -28,6 +28,8 @@ @AutoValue public abstract class RouteProgress { + private static final String EMPTY_ANNOUNCEMENT = ""; + /** * Get the route the navigation session is currently using. When a reroute occurs and a new * directions route gets obtained, with the next location update this directions route should @@ -158,6 +160,18 @@ public int remainingWaypoints() { */ public abstract boolean inTunnel(); + /** + * @return current announcement + * @since 0.19.0 + */ + public abstract String currentAnnouncement(); + + /** + * @return current announcement with SSML markup + * @since 0.19.0 + */ + public abstract String currentSsmlAnnouncement(); + public abstract RouteProgress.Builder toBuilder(); abstract int stepIndex(); @@ -237,6 +251,10 @@ public abstract Builder intersectionDistancesAlongStep( public abstract Builder inTunnel(boolean inTunnel); + public abstract Builder currentAnnouncement(String announcement); + + public abstract Builder currentSsmlAnnouncement(String ssmlAnnouncement); + abstract RouteProgress autoBuild(); // not public public RouteProgress build() { @@ -262,6 +280,7 @@ public RouteProgress build() { public static Builder builder() { return new AutoValue_RouteProgress.Builder() - .inTunnel(false); + .currentAnnouncement(EMPTY_ANNOUNCEMENT) + .currentSsmlAnnouncement(EMPTY_ANNOUNCEMENT); } } \ No newline at end of file diff --git a/libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/snap/SnapToRoute.java b/libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/snap/SnapToRoute.java index 31baa60bec7..5ebdb4f451a 100644 --- a/libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/snap/SnapToRoute.java +++ b/libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/snap/SnapToRoute.java @@ -4,32 +4,22 @@ import android.support.annotation.NonNull; import com.mapbox.navigator.NavigationStatus; -import com.mapbox.navigator.Navigator; import com.mapbox.services.android.navigation.v5.routeprogress.RouteProgress; -import java.util.Date; - public class SnapToRoute extends Snap { - private final Navigator navigator; - - public SnapToRoute(Navigator navigator) { - this.navigator = navigator; - } - @Override public Location getSnappedLocation(Location location, RouteProgress routeProgress) { // No impl return location; } - public Location getSnappedLocationWith(Location location, Date date) { - return buildSnappedLocation(location, date); + public Location getSnappedLocationWith(Location location, NavigationStatus status) { + return buildSnappedLocation(location, status); } @NonNull - private Location buildSnappedLocation(Location location, Date date) { - NavigationStatus status = navigator.getStatus(date); + private Location buildSnappedLocation(Location location, NavigationStatus status) { Location snappedLocation = new Location(location); snappedLocation.setLatitude(status.getLocation().latitude()); snappedLocation.setLongitude(status.getLocation().longitude()); diff --git a/libandroid-navigation/src/test/java/com/mapbox/services/android/navigation/v5/TestRouteProgressBuilder.java b/libandroid-navigation/src/test/java/com/mapbox/services/android/navigation/v5/TestRouteProgressBuilder.java index 3cf7e3eaf97..edfb967c9fa 100644 --- a/libandroid-navigation/src/test/java/com/mapbox/services/android/navigation/v5/TestRouteProgressBuilder.java +++ b/libandroid-navigation/src/test/java/com/mapbox/services/android/navigation/v5/TestRouteProgressBuilder.java @@ -65,6 +65,7 @@ RouteProgress buildTestRouteProgress(DirectionsRoute route, .intersectionDistancesAlongStep(intersectionDistances) .stepIndex(stepIndex) .legIndex(legIndex) + .inTunnel(false) .build(); } diff --git a/libandroid-navigation/src/test/java/com/mapbox/services/android/navigation/v5/milestone/VoiceInstructionMilestoneTest.java b/libandroid-navigation/src/test/java/com/mapbox/services/android/navigation/v5/milestone/VoiceInstructionMilestoneTest.java index e547e0d715c..127dcc5d06f 100644 --- a/libandroid-navigation/src/test/java/com/mapbox/services/android/navigation/v5/milestone/VoiceInstructionMilestoneTest.java +++ b/libandroid-navigation/src/test/java/com/mapbox/services/android/navigation/v5/milestone/VoiceInstructionMilestoneTest.java @@ -1,20 +1,17 @@ package com.mapbox.services.android.navigation.v5.milestone; -import com.mapbox.api.directions.v5.models.LegStep; -import com.mapbox.api.directions.v5.models.VoiceInstructions; -import com.mapbox.services.android.navigation.v5.BaseTest; +import com.mapbox.api.directions.v5.models.DirectionsRoute; import com.mapbox.services.android.navigation.v5.routeprogress.RouteProgress; import org.junit.Test; -import java.util.List; - import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertFalse; import static junit.framework.Assert.assertNotNull; -import static junit.framework.Assert.assertTrue; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; -public class VoiceInstructionMilestoneTest extends BaseTest { +public class VoiceInstructionMilestoneTest { @Test public void sanity() { @@ -24,24 +21,13 @@ public void sanity() { } @Test - public void onBeginningOfStep_voiceInstructionsShouldTrigger() throws Exception { - RouteProgress routeProgress = buildDefaultTestRouteProgress(); - routeProgress = createBeginningOfStepRouteProgress(routeProgress); - VoiceInstructionMilestone milestone = buildVoiceInstructionMilestone(); - - boolean isOccurring = milestone.isOccurring(routeProgress, routeProgress); - - assertTrue(isOccurring); - } - - @Test - public void onSameInstructionOccurring_milestoneDoesNotTriggerTwice() throws Exception { - RouteProgress routeProgress = buildDefaultTestRouteProgress(); - RouteProgress firstProgress = createBeginningOfStepRouteProgress(routeProgress); - RouteProgress secondProgress = routeProgress.toBuilder() - .stepDistanceRemaining(routeProgress.currentLegProgress().currentStep().distance() - 40) - .stepIndex(0) - .build(); + public void onSameInstructionOccurring_milestoneDoesNotTriggerTwice() { + RouteProgress firstProgress = mock(RouteProgress.class); + when(firstProgress.currentAnnouncement()).thenReturn("instruction"); + when(firstProgress.directionsRoute()).thenReturn(mock(DirectionsRoute.class)); + RouteProgress secondProgress = mock(RouteProgress.class); + when(secondProgress.directionsRoute()).thenReturn(mock(DirectionsRoute.class)); + when(secondProgress.currentAnnouncement()).thenReturn("instruction"); VoiceInstructionMilestone milestone = buildVoiceInstructionMilestone(); milestone.isOccurring(firstProgress, firstProgress); @@ -51,85 +37,63 @@ public void onSameInstructionOccurring_milestoneDoesNotTriggerTwice() throws Exc } @Test - public void nullInstructions_doNotGetTriggered() throws Exception { - RouteProgress routeProgress = buildDefaultTestRouteProgress(); - LegStep currentStep = routeProgress.currentLegProgress().currentStep(); - List instructions = currentStep.voiceInstructions(); - instructions.clear(); - routeProgress = createBeginningOfStepRouteProgress(routeProgress); - VoiceInstructionMilestone milestone = buildVoiceInstructionMilestone(); - - boolean isOccurring = milestone.isOccurring(routeProgress, routeProgress); - - assertFalse(isOccurring); - } - - @Test - public void onOccurringMilestone_voiceSsmlInstructionsAreReturned() throws Exception { - RouteProgress routeProgress = buildDefaultTestRouteProgress(); - routeProgress = createBeginningOfStepRouteProgress(routeProgress); - VoiceInstructions instructions = routeProgress.currentLegProgress().currentStep().voiceInstructions().get(0); + public void onOccurringMilestone_voiceSsmlInstructionsAreReturned() { + RouteProgress routeProgress = mock(RouteProgress.class); + when(routeProgress.directionsRoute()).thenReturn(mock(DirectionsRoute.class)); + when(routeProgress.currentAnnouncement()).thenReturn("current announcement"); + String currentSsmlAnnouncement = "current SSML announcement"; + when(routeProgress.currentSsmlAnnouncement()).thenReturn(currentSsmlAnnouncement); VoiceInstructionMilestone milestone = buildVoiceInstructionMilestone(); milestone.isOccurring(routeProgress, routeProgress); - assertEquals(instructions.ssmlAnnouncement(), milestone.getSsmlAnnouncement()); + assertEquals(currentSsmlAnnouncement, milestone.getSsmlAnnouncement()); } @Test - public void onOccurringMilestone_voiceInstructionsAreReturned() throws Exception { - RouteProgress routeProgress = buildDefaultTestRouteProgress(); - routeProgress = createBeginningOfStepRouteProgress(routeProgress); - VoiceInstructions instructions = routeProgress.currentLegProgress().currentStep().voiceInstructions().get(0); + public void onOccurringMilestone_voiceInstructionsAreReturned() { + RouteProgress routeProgress = mock(RouteProgress.class); + when(routeProgress.directionsRoute()).thenReturn(mock(DirectionsRoute.class)); + String currentAnnouncement = "current announcement"; + when(routeProgress.currentAnnouncement()).thenReturn(currentAnnouncement); + String currentSsmlAnnouncement = "current SSML announcement"; + when(routeProgress.currentSsmlAnnouncement()).thenReturn(currentSsmlAnnouncement); VoiceInstructionMilestone milestone = buildVoiceInstructionMilestone(); milestone.isOccurring(routeProgress, routeProgress); - assertEquals(instructions.announcement(), milestone.getAnnouncement()); + assertEquals(currentAnnouncement, milestone.getAnnouncement()); } @Test - public void onOccurringMilestone_instructionsAreReturned() throws Exception { - RouteProgress routeProgress = buildDefaultTestRouteProgress(); - routeProgress = createBeginningOfStepRouteProgress(routeProgress); - VoiceInstructions instructions = routeProgress.currentLegProgress().currentStep().voiceInstructions().get(0); + public void onOccurringMilestone_instructionsAreReturned() { + RouteProgress routeProgress = mock(RouteProgress.class); + when(routeProgress.directionsRoute()).thenReturn(mock(DirectionsRoute.class)); + String currentAnnouncement = "current announcement"; + when(routeProgress.currentAnnouncement()).thenReturn(currentAnnouncement); + String currentSsmlAnnouncement = "current SSML announcement"; + when(routeProgress.currentSsmlAnnouncement()).thenReturn(currentSsmlAnnouncement); VoiceInstructionMilestone milestone = buildVoiceInstructionMilestone(); milestone.isOccurring(routeProgress, routeProgress); - assertEquals(instructions.announcement(), milestone.getInstruction().buildInstruction(routeProgress)); + assertEquals(currentAnnouncement, milestone.getInstruction().buildInstruction(routeProgress)); } @Test - public void onNullMilestoneInstructions_emptyInstructionsAreReturned() throws Exception { + public void onNullMilestoneInstructions_emptyInstructionsAreReturned() { VoiceInstructionMilestone milestone = buildVoiceInstructionMilestone(); assertEquals("", milestone.getAnnouncement()); } @Test - public void onNullMilestoneInstructions_emptySsmlInstructionsAreReturned() throws Exception { + public void onNullMilestoneInstructions_emptySsmlInstructionsAreReturned() { VoiceInstructionMilestone milestone = buildVoiceInstructionMilestone(); assertEquals("", milestone.getSsmlAnnouncement()); } - @Test - public void onNullMilestoneInstructions_stepNameIsReturnedForInstruction() throws Exception { - RouteProgress routeProgress = buildDefaultTestRouteProgress(); - LegStep currentStep = routeProgress.currentLegProgress().currentStep(); - VoiceInstructionMilestone milestone = buildVoiceInstructionMilestone(); - - assertEquals(currentStep.name(), milestone.getInstruction().buildInstruction(routeProgress)); - } - - private RouteProgress createBeginningOfStepRouteProgress(RouteProgress routeProgress) { - return routeProgress.toBuilder() - .stepDistanceRemaining(routeProgress.currentLegProgress().currentStep().distance()) - .stepIndex(0) - .build(); - } - private VoiceInstructionMilestone buildVoiceInstructionMilestone() { return (VoiceInstructionMilestone) new VoiceInstructionMilestone.Builder().setIdentifier(1234).build(); } diff --git a/libandroid-navigation/src/test/java/com/mapbox/services/android/navigation/v5/navigation/NavigationEngineFactoryTest.java b/libandroid-navigation/src/test/java/com/mapbox/services/android/navigation/v5/navigation/NavigationEngineFactoryTest.java index 53711f2e739..60bd79699c4 100644 --- a/libandroid-navigation/src/test/java/com/mapbox/services/android/navigation/v5/navigation/NavigationEngineFactoryTest.java +++ b/libandroid-navigation/src/test/java/com/mapbox/services/android/navigation/v5/navigation/NavigationEngineFactoryTest.java @@ -8,35 +8,35 @@ public class NavigationEngineFactoryTest { @Test public void onInitialization_defaultCameraEngineIsCreated() { - NavigationEngineFactory provider = buildNavigationEngineFactory(); + NavigationEngineFactory provider = new NavigationEngineFactory(); assertNotNull(provider.retrieveCameraEngine()); } @Test public void onInitialization_defaultOffRouteEngineIsCreated() { - NavigationEngineFactory provider = buildNavigationEngineFactory(); + NavigationEngineFactory provider = new NavigationEngineFactory(); assertNotNull(provider.retrieveOffRouteEngine()); } @Test public void onInitialization_defaultSnapEngineIsCreated() { - NavigationEngineFactory provider = buildNavigationEngineFactory(); + NavigationEngineFactory provider = new NavigationEngineFactory(); assertNotNull(provider.retrieveSnapEngine()); } @Test public void onInitialization_defaultFasterRouteEngineIsCreated() { - NavigationEngineFactory provider = buildNavigationEngineFactory(); + NavigationEngineFactory provider = new NavigationEngineFactory(); assertNotNull(provider.retrieveFasterRouteEngine()); } @Test public void updateFasterRouteEngine_ignoresNull() { - NavigationEngineFactory provider = buildNavigationEngineFactory(); + NavigationEngineFactory provider = new NavigationEngineFactory(); provider.updateFasterRouteEngine(null); @@ -45,7 +45,7 @@ public void updateFasterRouteEngine_ignoresNull() { @Test public void updateOffRouteEngine_ignoresNull() { - NavigationEngineFactory provider = buildNavigationEngineFactory(); + NavigationEngineFactory provider = new NavigationEngineFactory(); provider.updateOffRouteEngine(null); @@ -54,7 +54,7 @@ public void updateOffRouteEngine_ignoresNull() { @Test public void updateCameraEngine_ignoresNull() { - NavigationEngineFactory provider = buildNavigationEngineFactory(); + NavigationEngineFactory provider = new NavigationEngineFactory(); provider.updateCameraEngine(null); @@ -63,14 +63,10 @@ public void updateCameraEngine_ignoresNull() { @Test public void updateSnapEngine_ignoresNull() { - NavigationEngineFactory provider = buildNavigationEngineFactory(); + NavigationEngineFactory provider = new NavigationEngineFactory(); provider.updateSnapEngine(null); assertNotNull(provider.retrieveSnapEngine()); } - - private NavigationEngineFactory buildNavigationEngineFactory() { - return new NavigationEngineFactory(); - } } \ No newline at end of file diff --git a/libandroid-navigation/src/test/java/com/mapbox/services/android/navigation/v5/navigation/NavigationLocationEngineListenerTest.java b/libandroid-navigation/src/test/java/com/mapbox/services/android/navigation/v5/navigation/NavigationLocationEngineListenerTest.java index f7f30a5ddd4..0c30a3f602b 100644 --- a/libandroid-navigation/src/test/java/com/mapbox/services/android/navigation/v5/navigation/NavigationLocationEngineListenerTest.java +++ b/libandroid-navigation/src/test/java/com/mapbox/services/android/navigation/v5/navigation/NavigationLocationEngineListenerTest.java @@ -3,18 +3,13 @@ import android.location.Location; import com.mapbox.android.core.location.LocationEngine; -import com.mapbox.navigator.FixLocation; -import com.mapbox.navigator.Navigator; import com.mapbox.services.android.navigation.v5.location.LocationValidator; -import org.junit.Ignore; import org.junit.Test; -import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; -@Ignore public class NavigationLocationEngineListenerTest { @Test @@ -35,31 +30,16 @@ public void queueValidLocationUpdate_threadReceivesUpdate() { listener.onLocationChanged(location); - verify(thread).updateLocation(location); - } - - @Test - public void queueInvalidLocationUpdate_navigatorReceivesUpdate() { - Navigator navigator = mock(Navigator.class); - NavigationLocationEngineListener listener = buildListener(navigator); - - listener.onLocationChanged(mock(Location.class)); - - verify(navigator).updateLocation(any(FixLocation.class)); + verify(thread).updateRawLocation(location); } private NavigationLocationEngineListener buildListener(RouteProcessorBackgroundThread thread) { - return new NavigationLocationEngineListener(thread, mock(Navigator.class), mock(LocationEngine.class), + return new NavigationLocationEngineListener(thread, mock(LocationEngine.class), mock(LocationValidator.class)); } - private NavigationLocationEngineListener buildListener(Navigator navigator) { - return new NavigationLocationEngineListener(mock(RouteProcessorBackgroundThread.class), navigator, - mock(LocationEngine.class), mock(LocationValidator.class)); - } - private NavigationLocationEngineListener buildListener(LocationEngine locationEngine) { - return new NavigationLocationEngineListener(mock(RouteProcessorBackgroundThread.class), mock(Navigator.class), + return new NavigationLocationEngineListener(mock(RouteProcessorBackgroundThread.class), locationEngine, mock(LocationValidator.class)); } } \ No newline at end of file diff --git a/libandroid-navigation/src/test/java/com/mapbox/services/android/navigation/v5/navigation/NavigationRouteProcessorTest.java b/libandroid-navigation/src/test/java/com/mapbox/services/android/navigation/v5/navigation/NavigationRouteProcessorTest.java index c227e8b00a0..c14852f1966 100644 --- a/libandroid-navigation/src/test/java/com/mapbox/services/android/navigation/v5/navigation/NavigationRouteProcessorTest.java +++ b/libandroid-navigation/src/test/java/com/mapbox/services/android/navigation/v5/navigation/NavigationRouteProcessorTest.java @@ -1,6 +1,6 @@ package com.mapbox.services.android.navigation.v5.navigation; -import com.mapbox.navigator.Navigator; +import com.mapbox.navigator.NavigationStatus; import com.mapbox.services.android.navigation.v5.BaseTest; import com.mapbox.services.android.navigation.v5.routeprogress.RouteProgress; @@ -8,20 +8,19 @@ import org.junit.Test; import java.io.IOException; -import java.util.Date; import static junit.framework.Assert.assertNotNull; +import static org.mockito.Mockito.mock; @Ignore public class NavigationRouteProcessorTest extends BaseTest { @Test public void buildNewRouteProgress_routeProgressReturned() throws IOException { - Navigator navigator = new Navigator(); - NavigationRouteProcessor processor = new NavigationRouteProcessor(navigator); - Date date = new Date(); + NavigationRouteProcessor processor = new NavigationRouteProcessor(); - RouteProgress progress = processor.buildNewRouteProgress(date, buildTestDirectionsRoute()); + // TODO mock final status + RouteProgress progress = processor.buildNewRouteProgress(mock(NavigationStatus.class), buildTestDirectionsRoute()); assertNotNull(progress); } 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 ade2909547f..272f5c03f52 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 @@ -1,17 +1,13 @@ package com.mapbox.services.android.navigation.v5.offroute; import com.mapbox.navigator.NavigationStatus; -import com.mapbox.navigator.Navigator; import com.mapbox.navigator.RouteState; import org.junit.Ignore; import org.junit.Test; -import java.util.Date; - import static junit.framework.Assert.assertFalse; import static junit.framework.Assert.assertTrue; -import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -20,26 +16,24 @@ public class OffRouteDetectorTest { @Test public void isUserOffRouteWith_returnsTrueWithRouteStateOffRoute() { - Navigator navigator = mock(Navigator.class); + // TODO mock final class NavigationStatus status = mock(NavigationStatus.class); when(status.getRouteState()).thenReturn(RouteState.OFFROUTE); - when(navigator.getStatus(any(Date.class))).thenReturn(status); - OffRouteDetector offRouteDetector = new OffRouteDetector(navigator); + OffRouteDetector offRouteDetector = new OffRouteDetector(); - boolean isOffRoute = offRouteDetector.isUserOffRouteWith(new Date()); + boolean isOffRoute = offRouteDetector.isUserOffRouteWith(status); assertTrue(isOffRoute); } @Test public void isUserOffRouteWith_returnsFalseWithRouteStateOffRoute() { - Navigator navigator = mock(Navigator.class); + // TODO mock final class NavigationStatus status = mock(NavigationStatus.class); when(status.getRouteState()).thenReturn(RouteState.COMPLETE); - when(navigator.getStatus(any(Date.class))).thenReturn(status); - OffRouteDetector offRouteDetector = new OffRouteDetector(navigator); + OffRouteDetector offRouteDetector = new OffRouteDetector(); - boolean isOffRoute = offRouteDetector.isUserOffRouteWith(new Date()); + boolean isOffRoute = offRouteDetector.isUserOffRouteWith(status); assertFalse(isOffRoute); } diff --git a/libandroid-navigation/src/test/java/com/mapbox/services/android/navigation/v5/snap/SnapToRouteTest.java b/libandroid-navigation/src/test/java/com/mapbox/services/android/navigation/v5/snap/SnapToRouteTest.java index 9c6ccdee2a8..4fcccfd3ebc 100644 --- a/libandroid-navigation/src/test/java/com/mapbox/services/android/navigation/v5/snap/SnapToRouteTest.java +++ b/libandroid-navigation/src/test/java/com/mapbox/services/android/navigation/v5/snap/SnapToRouteTest.java @@ -2,13 +2,11 @@ import android.location.Location; -import com.mapbox.navigator.Navigator; +import com.mapbox.navigator.NavigationStatus; import org.junit.Ignore; import org.junit.Test; -import java.util.Date; - import static junit.framework.Assert.assertNotNull; import static junit.framework.Assert.assertTrue; import static org.mockito.Mockito.mock; @@ -18,19 +16,19 @@ public class SnapToRouteTest { @Test public void sanity() { - Navigator navigator = mock(Navigator.class); - Snap snap = new SnapToRoute(navigator); + Snap snap = new SnapToRoute(); assertNotNull(snap); } @Test public void getSnappedLocation_returnsProviderNameCorrectly() { - Navigator navigator = mock(Navigator.class); - SnapToRoute snap = new SnapToRoute(navigator); + // TODO mock final class + NavigationStatus status = mock(NavigationStatus.class); + SnapToRoute snap = new SnapToRoute(); Location location = new Location("test"); - Location snappedLocation = snap.getSnappedLocationWith(location, new Date()); + Location snappedLocation = snap.getSnappedLocationWith(location, status); assertTrue(snappedLocation.getProvider().equals("test")); }