Skip to content

Commit 73b3675

Browse files
author
Guardiola31337
committed
update route progress and banner instruction milestone for banner data from navigator
1 parent ba53579 commit 73b3675

File tree

13 files changed

+163
-541
lines changed

13 files changed

+163
-541
lines changed

gradle/dependencies.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ ext {
1111
mapboxMapSdk : '7.0.1',
1212
mapboxSdkServices : '4.3.0',
1313
mapboxEvents : '4.2.0',
14-
mapboxNavigator : '3.4.12',
14+
mapboxNavigator : '4.0.0',
1515
searchSdk : '0.1.0-SNAPSHOT',
1616
autoValue : '1.5.4',
1717
autoValueParcel : '0.2.5',

libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/milestone/BannerInstructionMilestone.java

Lines changed: 65 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,15 @@
11
package com.mapbox.services.android.navigation.v5.milestone;
22

3+
import com.mapbox.api.directions.v5.models.BannerComponents;
34
import com.mapbox.api.directions.v5.models.BannerInstructions;
4-
import com.mapbox.api.directions.v5.models.LegStep;
5-
import com.mapbox.services.android.navigation.v5.routeprogress.RouteLegProgress;
5+
import com.mapbox.api.directions.v5.models.BannerText;
6+
import com.mapbox.navigator.BannerComponent;
7+
import com.mapbox.navigator.BannerInstruction;
8+
import com.mapbox.navigator.BannerSection;
69
import com.mapbox.services.android.navigation.v5.routeprogress.RouteProgress;
7-
import com.mapbox.services.android.navigation.v5.utils.RouteUtils;
10+
11+
import java.util.ArrayList;
12+
import java.util.List;
813

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

1823
private BannerInstructions instructions;
19-
private RouteUtils routeUtils;
2024

21-
BannerInstructionMilestone(Builder builder) {
25+
private BannerInstructionMilestone(Builder builder) {
2226
super(builder);
23-
routeUtils = new RouteUtils();
2427
}
2528

2629
@Override
2730
public boolean isOccurring(RouteProgress previousRouteProgress, RouteProgress routeProgress) {
28-
RouteLegProgress legProgress = routeProgress.currentLegProgress();
29-
LegStep currentStep = legProgress.currentStep();
30-
double stepDistanceRemaining = legProgress.currentStepProgress().distanceRemaining();
31-
BannerInstructions instructions = routeUtils.findCurrentBannerInstructions(currentStep, stepDistanceRemaining);
32-
if (shouldBeShown(instructions, stepDistanceRemaining)) {
33-
this.instructions = instructions;
31+
return updateCurrentBanner(routeProgress);
32+
}
33+
34+
private boolean updateCurrentBanner(RouteProgress routeProgress) {
35+
BannerInstruction currentBannerInstruction = routeProgress.bannerInstruction();
36+
if (currentBannerInstruction != null) {
37+
BannerSection currentPrimary = currentBannerInstruction.getPrimary();
38+
BannerText primary = retrieveBannerFrom(currentPrimary);
39+
BannerSection currentSecondary = currentBannerInstruction.getSecondary();
40+
BannerText secondary = retrieveBannerFrom(currentSecondary);
41+
BannerSection currentSub = currentBannerInstruction.getSub();
42+
BannerText sub = retrieveBannerFrom(currentSub);
43+
44+
this.instructions = BannerInstructions.builder()
45+
.primary(primary)
46+
.secondary(secondary)
47+
.sub(sub)
48+
.distanceAlongGeometry(currentBannerInstruction.getRemainingStepDistance())
49+
.build();
3450
return true;
3551
}
3652
return false;
3753
}
3854

55+
private BannerText retrieveBannerFrom(BannerSection bannerSection) {
56+
BannerText banner = null;
57+
if (bannerSection == null) {
58+
return banner;
59+
}
60+
List<BannerComponent> currentComponents = bannerSection.getComponents();
61+
if (currentComponents != null) {
62+
List<BannerComponents> primaryComponents = new ArrayList<>();
63+
for (BannerComponent bannerComponent : currentComponents) {
64+
BannerComponents bannerComponents = BannerComponents.builder()
65+
.text(bannerComponent.getText())
66+
.type(bannerComponent.getType())
67+
.abbreviation(bannerComponent.getAbbr())
68+
.abbreviationPriority(bannerComponent.getAbbrPriority())
69+
.imageBaseUrl(bannerComponent.getImageBaseurl())
70+
.directions(bannerComponent.getDirections())
71+
.active(bannerComponent.getActive())
72+
.build();
73+
primaryComponents.add(bannerComponents);
74+
}
75+
Integer bannerSectionDegrees = bannerSection.getDegrees();
76+
Double degrees = null;
77+
if (bannerSectionDegrees != null) {
78+
degrees = Double.valueOf(bannerSectionDegrees);
79+
}
80+
banner = BannerText.builder()
81+
.text(bannerSection.getText())
82+
.type(bannerSection.getType())
83+
.modifier(bannerSection.getModifier())
84+
.degrees(degrees)
85+
.drivingSide(bannerSection.getDrivingSide())
86+
.components(primaryComponents)
87+
.build();
88+
}
89+
return banner;
90+
}
91+
3992
/**
4093
* Returns the given {@link BannerInstructions} for the time that the milestone is triggered.
4194
*
@@ -46,22 +99,6 @@ public BannerInstructions getBannerInstructions() {
4699
return instructions;
47100
}
48101

49-
/**
50-
* Uses the current step distance remaining to check against banner instructions distance.
51-
*
52-
* @param instructions given banner instructions from the list of step instructions
53-
* @param stepDistanceRemaining distance remaining along the current step
54-
* @return true if time to show the instructions, false if not
55-
*/
56-
private boolean shouldBeShown(BannerInstructions instructions, double stepDistanceRemaining) {
57-
boolean isNewInstruction = this.instructions == null || !this.instructions.equals(instructions);
58-
boolean isValidNewInstruction = instructions != null && isNewInstruction;
59-
boolean withinDistanceAlongGeometry = isValidNewInstruction
60-
&& instructions.distanceAlongGeometry() >= stepDistanceRemaining;
61-
boolean isFirstInstruction = this.instructions == null && instructions != null;
62-
return isFirstInstruction || withinDistanceAlongGeometry;
63-
}
64-
65102
public static final class Builder extends Milestone.Builder {
66103

67104
private Trigger.Statement trigger;

libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/navigation/MapboxNavigator.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import android.location.Location;
44

55
import com.mapbox.geojson.Point;
6+
import com.mapbox.navigator.BannerInstruction;
67
import com.mapbox.navigator.FixLocation;
78
import com.mapbox.navigator.NavigationStatus;
89
import com.mapbox.navigator.Navigator;
@@ -71,6 +72,10 @@ synchronized VoiceInstruction retrieveVoiceInstruction(int index) {
7172
return navigator.getVoiceInstruction(index);
7273
}
7374

75+
synchronized BannerInstruction retrieveBannerInstruction(int index) {
76+
return navigator.getBannerInstruction(index);
77+
}
78+
7479
FixLocation buildFixLocationFromLocation(Location location) {
7580
Date time = new Date();
7681
Point rawPoint = Point.fromLngLat(location.getLongitude(), location.getLatitude());

libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/navigation/NavigationRouteProcessor.java

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import com.mapbox.api.directions.v5.models.RouteLeg;
99
import com.mapbox.api.directions.v5.models.StepIntersection;
1010
import com.mapbox.geojson.Point;
11+
import com.mapbox.navigator.BannerInstruction;
1112
import com.mapbox.navigator.NavigationStatus;
1213
import com.mapbox.navigator.RouteState;
1314
import com.mapbox.navigator.VoiceInstruction;
@@ -30,6 +31,7 @@ class NavigationRouteProcessor {
3031

3132
private static final int ONE_INDEX = 1;
3233
private static final double ONE_SECOND_IN_MILLISECONDS = 1000.0;
34+
private static final int FIRST_BANNER_INSTRUCTION = 0;
3335
private final RouteProgressStateMap progressStateMap = new RouteProgressStateMap();
3436
private RouteProgress previousRouteProgress;
3537
private DirectionsRoute route;
@@ -42,9 +44,9 @@ class NavigationRouteProcessor {
4244
private List<Pair<StepIntersection, Double>> currentIntersectionDistances;
4345
private CurrentLegAnnotation currentLegAnnotation;
4446

45-
RouteProgress buildNewRouteProgress(NavigationStatus status, DirectionsRoute route) {
47+
RouteProgress buildNewRouteProgress(MapboxNavigator navigator, NavigationStatus status, DirectionsRoute route) {
4648
updateRoute(route);
47-
return buildRouteProgressFrom(status);
49+
return buildRouteProgressFrom(status, navigator);
4850
}
4951

5052
void updatePreviousRouteProgress(RouteProgress routeProgress) {
@@ -62,7 +64,7 @@ private void updateRoute(DirectionsRoute route) {
6264
}
6365
}
6466

65-
private RouteProgress buildRouteProgressFrom(NavigationStatus status) {
67+
private RouteProgress buildRouteProgressFrom(NavigationStatus status, MapboxNavigator navigator) {
6668
int legIndex = status.getLegIndex();
6769
int stepIndex = status.getStepIndex();
6870
int upcomingStepIndex = stepIndex + ONE_INDEX;
@@ -104,8 +106,8 @@ private RouteProgress buildRouteProgressFrom(NavigationStatus status) {
104106
.inTunnel(status.getInTunnel())
105107
.currentState(currentRouteState);
106108

107-
// TODO build banner instructions from status here
108109
addVoiceInstructions(status, progressBuilder);
110+
addBannerInstructions(status, navigator, progressBuilder);
109111
addUpcomingStepPoints(progressBuilder);
110112
return progressBuilder.build();
111113
}
@@ -142,4 +144,13 @@ private void addVoiceInstructions(NavigationStatus status, RouteProgress.Builder
142144
VoiceInstruction voiceInstruction = status.getVoiceInstruction();
143145
progressBuilder.voiceInstruction(voiceInstruction);
144146
}
147+
148+
private void addBannerInstructions(NavigationStatus status, MapboxNavigator navigator,
149+
RouteProgress.Builder progressBuilder) {
150+
BannerInstruction bannerInstruction = status.getBannerInstruction();
151+
if (status.getRouteState() == RouteState.INITIALIZED) {
152+
bannerInstruction = navigator.retrieveBannerInstruction(FIRST_BANNER_INSTRUCTION);
153+
}
154+
progressBuilder.bannerInstruction(bannerInstruction);
155+
}
145156
}

libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/navigation/RouteProcessorRunnable.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ private void process() {
5858
NavigationStatus status = mapboxNavigator.retrieveStatus(new Date(),
5959
options.navigationLocationEngineIntervalLagInMilliseconds());
6060
status = checkForNewLegIndex(mapboxNavigator, route, status, options.enableAutoIncrementLegIndex());
61-
RouteProgress routeProgress = routeProcessor.buildNewRouteProgress(status, route);
61+
RouteProgress routeProgress = routeProcessor.buildNewRouteProgress(mapboxNavigator, status, route);
6262

6363
NavigationEngineFactory engineFactory = navigation.retrieveEngineFactory();
6464
final boolean userOffRoute = isUserOffRoute(options, status, rawLocation, routeProgress, engineFactory);

libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/routeprogress/RouteProgress.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import com.mapbox.api.directions.v5.models.RouteLeg;
1010
import com.mapbox.api.directions.v5.models.StepIntersection;
1111
import com.mapbox.geojson.Point;
12+
import com.mapbox.navigator.BannerInstruction;
1213
import com.mapbox.navigator.VoiceInstruction;
1314

1415
import java.util.List;
@@ -168,6 +169,15 @@ public int remainingWaypoints() {
168169
@Nullable
169170
public abstract VoiceInstruction voiceInstruction();
170171

172+
/**
173+
* Current banner instruction.
174+
*
175+
* @return current banner instruction
176+
* @since 0.25.0
177+
*/
178+
@Nullable
179+
public abstract BannerInstruction bannerInstruction();
180+
171181
/**
172182
* Returns the current state of progress along the route. Provides route and location tracking
173183
* information.
@@ -264,6 +274,8 @@ public abstract Builder intersectionDistancesAlongStep(
264274

265275
public abstract Builder voiceInstruction(@Nullable VoiceInstruction voiceInstruction);
266276

277+
public abstract Builder bannerInstruction(@Nullable BannerInstruction bannerInstruction);
278+
267279
public abstract Builder currentState(@Nullable RouteProgressState currentState);
268280

269281
abstract RouteProgress autoBuild(); // not public

libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/snap/SnapToRoute.java

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
import android.location.Location;
44
import android.support.annotation.NonNull;
55

6+
import com.mapbox.geojson.Point;
7+
import com.mapbox.navigator.FixLocation;
68
import com.mapbox.navigator.NavigationStatus;
79
import com.mapbox.services.android.navigation.v5.routeprogress.RouteProgress;
810

@@ -21,10 +23,14 @@ public Location getSnappedLocationWith(NavigationStatus status, Location rawLoca
2123
@NonNull
2224
private Location buildSnappedLocation(NavigationStatus status, Location rawLocation) {
2325
Location snappedLocation = new Location(rawLocation);
24-
snappedLocation.setLatitude(status.getLocation().latitude());
25-
snappedLocation.setLongitude(status.getLocation().longitude());
26-
snappedLocation.setBearing(status.getBearing());
27-
snappedLocation.setTime(status.getTime().getTime());
26+
FixLocation fixLocation = status.getLocation();
27+
Point coordinate = fixLocation.getCoordinate();
28+
snappedLocation.setLatitude(coordinate.latitude());
29+
snappedLocation.setLongitude(coordinate.longitude());
30+
if (fixLocation.getBearing() != null) {
31+
snappedLocation.setBearing(fixLocation.getBearing());
32+
}
33+
snappedLocation.setTime(fixLocation.getTime().getTime());
2834
return snappedLocation;
2935
}
3036
}

0 commit comments

Comments
 (0)