Skip to content

Commit

Permalink
Create synchronized Navigator for location and status updates
Browse files Browse the repository at this point in the history
  • Loading branch information
danesfeder committed Sep 14, 2018
1 parent f171b54 commit 1772f38
Show file tree
Hide file tree
Showing 16 changed files with 132 additions and 197 deletions.
1 change: 0 additions & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -157,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();

Expand Down Expand Up @@ -796,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();
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
}

void updateRoute(String routeJson) {
navigator.setDirections(routeJson);
}

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
);
}
}
Original file line number Diff line number Diff line change
@@ -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;

Expand All @@ -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() {
Expand Down Expand Up @@ -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();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand All @@ -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
);
}
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,11 @@
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;
Expand All @@ -29,7 +27,6 @@ class NavigationRouteProcessor {

private static final int ONE_INDEX = 1;
private final RingBuffer<RouteProgress> previousProgressList = new RingBuffer<>(2);
private final Navigator navigator;
private DirectionsRoute route;
private RouteLeg currentLeg;
private LegStep currentStep;
Expand All @@ -40,14 +37,9 @@ class NavigationRouteProcessor {
private List<Pair<StepIntersection, Double>> currentIntersectionDistances;
private CurrentLegAnnotation currentLegAnnotation;

NavigationRouteProcessor(Navigator navigator) {
this.navigator = navigator;
}

RouteProgress buildNewRouteProgress(Date date, DirectionsRoute route) {
NavigationStatus status = navigator.getStatus(date);
RouteProgress buildNewRouteProgress(NavigationStatus status, DirectionsRoute route) {
updateRoute(route);
return buildRouteProgressWith(status);
return buildRouteProgressFrom(status);
}

RouteProgress retrievePreviousRouteProgress() {
Expand All @@ -60,7 +52,7 @@ 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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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);
}

/**
Expand Down
Loading

0 comments on commit 1772f38

Please sign in to comment.