Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion gradle/dependencies.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ ext {
mapboxMapSdk : '7.0.1',
mapboxSdkServices : '4.3.0',
mapboxEvents : '4.2.0',
mapboxNavigator : '3.4.12',
mapboxNavigator : '4.0.0',
searchSdk : '0.1.0-SNAPSHOT',
autoValue : '1.5.4',
autoValueParcel : '0.2.5',
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,15 @@
package com.mapbox.services.android.navigation.v5.milestone;

import com.mapbox.api.directions.v5.models.BannerComponents;
import com.mapbox.api.directions.v5.models.BannerInstructions;
import com.mapbox.api.directions.v5.models.LegStep;
import com.mapbox.services.android.navigation.v5.routeprogress.RouteLegProgress;
import com.mapbox.api.directions.v5.models.BannerText;
import com.mapbox.navigator.BannerComponent;
import com.mapbox.navigator.BannerInstruction;
import com.mapbox.navigator.BannerSection;
import com.mapbox.services.android.navigation.v5.routeprogress.RouteProgress;
import com.mapbox.services.android.navigation.v5.utils.RouteUtils;

import java.util.ArrayList;
import java.util.List;

/**
* A default milestone that is added to {@link com.mapbox.services.android.navigation.v5.navigation.MapboxNavigation}
Expand All @@ -16,26 +21,74 @@
public class BannerInstructionMilestone extends Milestone {

private BannerInstructions instructions;
private RouteUtils routeUtils;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It looks like there are a few unused methods in RouteUtils / methods only being used by tests. Can we cleanup and remove them?


BannerInstructionMilestone(Builder builder) {
private BannerInstructionMilestone(Builder builder) {
super(builder);
routeUtils = new RouteUtils();
}

@Override
public boolean isOccurring(RouteProgress previousRouteProgress, RouteProgress routeProgress) {
RouteLegProgress legProgress = routeProgress.currentLegProgress();
LegStep currentStep = legProgress.currentStep();
double stepDistanceRemaining = legProgress.currentStepProgress().distanceRemaining();
BannerInstructions instructions = routeUtils.findCurrentBannerInstructions(currentStep, stepDistanceRemaining);
if (shouldBeShown(instructions, stepDistanceRemaining)) {
this.instructions = instructions;
return updateCurrentBanner(routeProgress);
}

private boolean updateCurrentBanner(RouteProgress routeProgress) {
BannerInstruction currentBannerInstruction = routeProgress.bannerInstruction();
if (currentBannerInstruction != null) {
BannerSection currentPrimary = currentBannerInstruction.getPrimary();
BannerText primary = retrieveBannerFrom(currentPrimary);
BannerSection currentSecondary = currentBannerInstruction.getSecondary();
BannerText secondary = retrieveBannerFrom(currentSecondary);
BannerSection currentSub = currentBannerInstruction.getSub();
BannerText sub = retrieveBannerFrom(currentSub);

this.instructions = BannerInstructions.builder()
.primary(primary)
.secondary(secondary)
.sub(sub)
.distanceAlongGeometry(currentBannerInstruction.getRemainingStepDistance())
.build();
return true;
}
return false;
}

private BannerText retrieveBannerFrom(BannerSection bannerSection) {
BannerText banner = null;
if (bannerSection == null) {
return banner;
}
List<BannerComponent> currentComponents = bannerSection.getComponents();
if (currentComponents != null) {
List<BannerComponents> primaryComponents = new ArrayList<>();
for (BannerComponent bannerComponent : currentComponents) {
BannerComponents bannerComponents = BannerComponents.builder()
.text(bannerComponent.getText())
.type(bannerComponent.getType())
.abbreviation(bannerComponent.getAbbr())
.abbreviationPriority(bannerComponent.getAbbrPriority())
.imageBaseUrl(bannerComponent.getImageBaseurl())
.directions(bannerComponent.getDirections())
.active(bannerComponent.getActive())
.build();
primaryComponents.add(bannerComponents);
}
Integer bannerSectionDegrees = bannerSection.getDegrees();
Double degrees = null;
if (bannerSectionDegrees != null) {
degrees = Double.valueOf(bannerSectionDegrees);
}
banner = BannerText.builder()
.text(bannerSection.getText())
.type(bannerSection.getType())
.modifier(bannerSection.getModifier())
.degrees(degrees)
.drivingSide(bannerSection.getDrivingSide())
.components(primaryComponents)
.build();
}
return banner;
}

/**
* Returns the given {@link BannerInstructions} for the time that the milestone is triggered.
*
Expand All @@ -46,22 +99,6 @@ public BannerInstructions getBannerInstructions() {
return instructions;
}

/**
* Uses the current step distance remaining to check against banner instructions distance.
*
* @param instructions given banner instructions from the list of step instructions
* @param stepDistanceRemaining distance remaining along the current step
* @return true if time to show the instructions, false if not
*/
private boolean shouldBeShown(BannerInstructions instructions, double stepDistanceRemaining) {
boolean isNewInstruction = this.instructions == null || !this.instructions.equals(instructions);
boolean isValidNewInstruction = instructions != null && isNewInstruction;
boolean withinDistanceAlongGeometry = isValidNewInstruction
&& instructions.distanceAlongGeometry() >= stepDistanceRemaining;
boolean isFirstInstruction = this.instructions == null && instructions != null;
return isFirstInstruction || withinDistanceAlongGeometry;
}

public static final class Builder extends Milestone.Builder {

private Trigger.Statement trigger;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import android.location.Location;

import com.mapbox.geojson.Point;
import com.mapbox.navigator.BannerInstruction;
import com.mapbox.navigator.FixLocation;
import com.mapbox.navigator.NavigationStatus;
import com.mapbox.navigator.Navigator;
Expand Down Expand Up @@ -71,6 +72,10 @@ synchronized VoiceInstruction retrieveVoiceInstruction(int index) {
return navigator.getVoiceInstruction(index);
}

synchronized BannerInstruction retrieveBannerInstruction(int index) {
return navigator.getBannerInstruction(index);
}

FixLocation buildFixLocationFromLocation(Location location) {
Date time = new Date();
Point rawPoint = Point.fromLngLat(location.getLongitude(), location.getLatitude());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import com.mapbox.api.directions.v5.models.RouteLeg;
import com.mapbox.api.directions.v5.models.StepIntersection;
import com.mapbox.geojson.Point;
import com.mapbox.navigator.BannerInstruction;
import com.mapbox.navigator.NavigationStatus;
import com.mapbox.navigator.RouteState;
import com.mapbox.navigator.VoiceInstruction;
Expand All @@ -30,6 +31,7 @@ class NavigationRouteProcessor {

private static final int ONE_INDEX = 1;
private static final double ONE_SECOND_IN_MILLISECONDS = 1000.0;
private static final int FIRST_BANNER_INSTRUCTION = 0;
private final RouteProgressStateMap progressStateMap = new RouteProgressStateMap();
private RouteProgress previousRouteProgress;
private DirectionsRoute route;
Expand All @@ -42,9 +44,9 @@ class NavigationRouteProcessor {
private List<Pair<StepIntersection, Double>> currentIntersectionDistances;
private CurrentLegAnnotation currentLegAnnotation;

RouteProgress buildNewRouteProgress(NavigationStatus status, DirectionsRoute route) {
RouteProgress buildNewRouteProgress(MapboxNavigator navigator, NavigationStatus status, DirectionsRoute route) {
updateRoute(route);
return buildRouteProgressFrom(status);
return buildRouteProgressFrom(status, navigator);
}

void updatePreviousRouteProgress(RouteProgress routeProgress) {
Expand All @@ -62,7 +64,7 @@ private void updateRoute(DirectionsRoute route) {
}
}

private RouteProgress buildRouteProgressFrom(NavigationStatus status) {
private RouteProgress buildRouteProgressFrom(NavigationStatus status, MapboxNavigator navigator) {
int legIndex = status.getLegIndex();
int stepIndex = status.getStepIndex();
int upcomingStepIndex = stepIndex + ONE_INDEX;
Expand Down Expand Up @@ -104,8 +106,8 @@ private RouteProgress buildRouteProgressFrom(NavigationStatus status) {
.inTunnel(status.getInTunnel())
.currentState(currentRouteState);

// TODO build banner instructions from status here
addVoiceInstructions(status, progressBuilder);
addBannerInstructions(status, navigator, progressBuilder);
addUpcomingStepPoints(progressBuilder);
return progressBuilder.build();
}
Expand Down Expand Up @@ -142,4 +144,13 @@ private void addVoiceInstructions(NavigationStatus status, RouteProgress.Builder
VoiceInstruction voiceInstruction = status.getVoiceInstruction();
progressBuilder.voiceInstruction(voiceInstruction);
}

private void addBannerInstructions(NavigationStatus status, MapboxNavigator navigator,
RouteProgress.Builder progressBuilder) {
BannerInstruction bannerInstruction = status.getBannerInstruction();
if (status.getRouteState() == RouteState.INITIALIZED) {
bannerInstruction = navigator.retrieveBannerInstruction(FIRST_BANNER_INSTRUCTION);
}
progressBuilder.bannerInstruction(bannerInstruction);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ private void process() {
NavigationStatus status = mapboxNavigator.retrieveStatus(new Date(),
options.navigationLocationEngineIntervalLagInMilliseconds());
status = checkForNewLegIndex(mapboxNavigator, route, status, options.enableAutoIncrementLegIndex());
RouteProgress routeProgress = routeProcessor.buildNewRouteProgress(status, route);
RouteProgress routeProgress = routeProcessor.buildNewRouteProgress(mapboxNavigator, status, route);

NavigationEngineFactory engineFactory = navigation.retrieveEngineFactory();
final boolean userOffRoute = isUserOffRoute(options, status, rawLocation, routeProgress, engineFactory);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import com.mapbox.api.directions.v5.models.RouteLeg;
import com.mapbox.api.directions.v5.models.StepIntersection;
import com.mapbox.geojson.Point;
import com.mapbox.navigator.BannerInstruction;
import com.mapbox.navigator.VoiceInstruction;

import java.util.List;
Expand Down Expand Up @@ -168,6 +169,15 @@ public int remainingWaypoints() {
@Nullable
public abstract VoiceInstruction voiceInstruction();

/**
* Current banner instruction.
*
* @return current banner instruction
* @since 0.25.0
*/
@Nullable
public abstract BannerInstruction bannerInstruction();

/**
* Returns the current state of progress along the route. Provides route and location tracking
* information.
Expand Down Expand Up @@ -264,6 +274,8 @@ public abstract Builder intersectionDistancesAlongStep(

public abstract Builder voiceInstruction(@Nullable VoiceInstruction voiceInstruction);

public abstract Builder bannerInstruction(@Nullable BannerInstruction bannerInstruction);

public abstract Builder currentState(@Nullable RouteProgressState currentState);

abstract RouteProgress autoBuild(); // not public
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
import android.location.Location;
import android.support.annotation.NonNull;

import com.mapbox.geojson.Point;
import com.mapbox.navigator.FixLocation;
import com.mapbox.navigator.NavigationStatus;
import com.mapbox.services.android.navigation.v5.routeprogress.RouteProgress;

Expand All @@ -21,10 +23,14 @@ public Location getSnappedLocationWith(NavigationStatus status, Location rawLoca
@NonNull
private Location buildSnappedLocation(NavigationStatus status, Location rawLocation) {
Location snappedLocation = new Location(rawLocation);
snappedLocation.setLatitude(status.getLocation().latitude());
snappedLocation.setLongitude(status.getLocation().longitude());
snappedLocation.setBearing(status.getBearing());
snappedLocation.setTime(status.getTime().getTime());
FixLocation fixLocation = status.getLocation();
Point coordinate = fixLocation.getCoordinate();
snappedLocation.setLatitude(coordinate.latitude());
snappedLocation.setLongitude(coordinate.longitude());
if (fixLocation.getBearing() != null) {
snappedLocation.setBearing(fixLocation.getBearing());
}
snappedLocation.setTime(fixLocation.getTime().getTime());
return snappedLocation;
}
}
Loading