From 484264ed8bfcbe703d3d0444fccf4f7256502490 Mon Sep 17 00:00:00 2001 From: danesfeder Date: Mon, 12 Feb 2018 16:59:32 -0500 Subject: [PATCH 1/4] Update Maps SDK with MAS 3.0 --- build.gradle | 1 + gradle/dependencies.gradle | 4 +- .../ui/v5/route/NavigationMapRoute.java | 50 +++++++++---------- .../navigation/ui/v5/utils/MapUtils.java | 4 +- 4 files changed, 29 insertions(+), 30 deletions(-) diff --git a/build.gradle b/build.gradle index e66e3e3c9a1..5c9f47073a5 100644 --- a/build.gradle +++ b/build.gradle @@ -25,6 +25,7 @@ task testReport(type: TestReport, group: 'Build') { allprojects { repositories { maven { url 'https://plugins.gradle.org/m2' } + maven { url "http://oss.sonatype.org/content/repositories/snapshots/" } google() jcenter() } diff --git a/gradle/dependencies.gradle b/gradle/dependencies.gradle index bf13343e8f2..53e909e1117 100644 --- a/gradle/dependencies.gradle +++ b/gradle/dependencies.gradle @@ -8,10 +8,10 @@ ext { ] version = [ - mapboxMapSdk : '5.5.2', + mapboxMapSdk : '6.0.0-beta.6', mapboxServices : '2.2.10', mapboxSdkServices : '3.0.1', - locationLayerPlugin: '0.4.0', + locationLayerPlugin: '0.5.0-beta.2', autoValue : '1.5', autoValueParcel : '0.2.5', junit : '4.12', diff --git a/libandroid-navigation-ui/src/main/java/com/mapbox/services/android/navigation/ui/v5/route/NavigationMapRoute.java b/libandroid-navigation-ui/src/main/java/com/mapbox/services/android/navigation/ui/v5/route/NavigationMapRoute.java index 8302ad4eb6b..21daefcb016 100644 --- a/libandroid-navigation-ui/src/main/java/com/mapbox/services/android/navigation/ui/v5/route/NavigationMapRoute.java +++ b/libandroid-navigation-ui/src/main/java/com/mapbox/services/android/navigation/ui/v5/route/NavigationMapRoute.java @@ -16,6 +16,10 @@ import com.mapbox.api.directions.v5.models.DirectionsRoute; import com.mapbox.api.directions.v5.models.RouteLeg; import com.mapbox.core.constants.Constants; +import com.mapbox.geojson.Feature; +import com.mapbox.geojson.FeatureCollection; +import com.mapbox.geojson.LineString; +import com.mapbox.geojson.Point; import com.mapbox.mapboxsdk.geometry.LatLng; import com.mapbox.mapboxsdk.maps.MapView; import com.mapbox.mapboxsdk.maps.MapboxMap; @@ -33,11 +37,6 @@ import com.mapbox.services.android.navigation.v5.navigation.MapboxNavigation; import com.mapbox.services.android.navigation.v5.routeprogress.ProgressChangeListener; import com.mapbox.services.android.navigation.v5.routeprogress.RouteProgress; -import com.mapbox.services.commons.geojson.Feature; -import com.mapbox.services.commons.geojson.FeatureCollection; -import com.mapbox.services.commons.geojson.LineString; -import com.mapbox.services.commons.geojson.Point; -import com.mapbox.services.commons.models.Position; import com.mapbox.turf.TurfConstants; import com.mapbox.turf.TurfMeasurement; import com.mapbox.turf.TurfMisc; @@ -306,11 +305,11 @@ private void drawRoutes() { for (int i = featureCollections.size() - 1; i >= 0; i--) { MapUtils.updateMapSourceFromFeatureCollection( mapboxMap, featureCollections.get(i), - featureCollections.get(i).getFeatures().get(0).getStringProperty(SOURCE_KEY) + featureCollections.get(i).features().get(0).getStringProperty(SOURCE_KEY) ); // Get some required information for the next step - String sourceId = featureCollections.get(i).getFeatures() + String sourceId = featureCollections.get(i).features() .get(0).getStringProperty(SOURCE_KEY); int index = featureCollections.indexOf(featureCollections.get(i)); @@ -350,8 +349,8 @@ private void generateFeatureCollectionList(List directionsRoute private static FeatureCollection waypointFeatureCollection(DirectionsRoute route) { final List waypointFeatures = new ArrayList<>(); for (RouteLeg leg : route.legs()) { - waypointFeatures.add(getPointFromLineString(leg, 0)); - waypointFeatures.add(getPointFromLineString(leg, leg.steps().size() - 1)); + waypointFeatures.add(getPointFromLineString(route, 0)); + waypointFeatures.add(getPointFromLineString(route, leg.steps().size() - 1)); } return FeatureCollection.fromFeatures(waypointFeatures); } @@ -580,15 +579,13 @@ private void drawWaypointMarkers(@NonNull MapboxMap mapboxMap, @Nullable Drawabl } } - private static Feature getPointFromLineString(RouteLeg leg, int stepIndex) { - Feature feature = Feature.fromGeometry(Point.fromCoordinates( - new double[] { - leg.steps().get(stepIndex).maneuver().location().longitude(), - leg.steps().get(stepIndex).maneuver().location().latitude() - })); + private static Feature getPointFromLineString(DirectionsRoute route, int index) { + List coordinates = route.routeOptions().coordinates(); + Point waypoint = coordinates.get(index); + Feature feature = Feature.fromGeometry(waypoint); feature.addStringProperty(SOURCE_KEY, WAYPOINT_SOURCE_ID); feature.addStringProperty("waypoint", - stepIndex == 0 ? "origin" : "destination" + index == 0 ? "origin" : "destination" ); return feature; } @@ -666,9 +663,9 @@ private boolean calculateClickDistancesFromRoutes(HashMap linePoints = new ArrayList<>(); - List positions = lineString.getCoordinates(); - for (Position pos : positions) { - linePoints.add(com.mapbox.geojson.Point.fromLngLat(pos.getLongitude(), pos.getLatitude())); + List positions = lineString.coordinates(); + for (Point pos : positions) { + linePoints.add(com.mapbox.geojson.Point.fromLngLat(pos.longitude(), pos.latitude())); } com.mapbox.geojson.Feature feature = TurfMisc.nearestPointOnLine(clickPoint, linePoints); @@ -690,8 +687,8 @@ private void updateRoute() { // Update all route geometries to reflect their appropriate colors depending on if they are // alternative or primary. for (FeatureCollection featureCollection : featureCollections) { - if (!(featureCollection.getFeatures().get(0).getGeometry() instanceof Point)) { - int index = featureCollection.getFeatures().get(0).getNumberProperty(INDEX_KEY).intValue(); + if (!(featureCollection.features().get(0).geometry() instanceof Point)) { + int index = featureCollection.features().get(0).getNumberProperty(INDEX_KEY).intValue(); updatePrimaryShieldRoute(String.format(Locale.US, ID_FORMAT, GENERIC_ROUTE_SHIELD_LAYER_ID, index), index); updatePrimaryRoute(String.format(Locale.US, ID_FORMAT, GENERIC_ROUTE_LAYER_ID, @@ -764,12 +761,13 @@ private void buildTrafficFeaturesFromRoute(DirectionsRoute route, int index, if (leg.annotation() != null && leg.annotation().congestion() != null) { for (int i = 0; i < leg.annotation().congestion().size(); i++) { // See https://github.com/mapbox/mapbox-navigation-android/issues/353 - if (leg.annotation().congestion().size() + 1 <= lineString.getCoordinates().size()) { - double[] startCoord = lineString.getCoordinates().get(i).getCoordinates(); - double[] endCoord = lineString.getCoordinates().get(i + 1).getCoordinates(); + if (leg.annotation().congestion().size() + 1 <= lineString.coordinates().size()) { - LineString congestionLineString = LineString.fromCoordinates(new double[][] {startCoord, - endCoord}); + List points = new ArrayList<>(); + points.add(lineString.coordinates().get(i)); + points.add(lineString.coordinates().get(i + 1)); + + LineString congestionLineString = LineString.fromLngLats(points); Feature feature = Feature.fromGeometry(congestionLineString); feature.addStringProperty(CONGESTION_KEY, leg.annotation().congestion().get(i)); feature.addStringProperty(SOURCE_KEY, String.format(Locale.US, ID_FORMAT, diff --git a/libandroid-navigation-ui/src/main/java/com/mapbox/services/android/navigation/ui/v5/utils/MapUtils.java b/libandroid-navigation-ui/src/main/java/com/mapbox/services/android/navigation/ui/v5/utils/MapUtils.java index b3689acca64..78a812de222 100644 --- a/libandroid-navigation-ui/src/main/java/com/mapbox/services/android/navigation/ui/v5/utils/MapUtils.java +++ b/libandroid-navigation-ui/src/main/java/com/mapbox/services/android/navigation/ui/v5/utils/MapUtils.java @@ -3,12 +3,12 @@ import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import com.mapbox.geojson.Feature; +import com.mapbox.geojson.FeatureCollection; import com.mapbox.mapboxsdk.maps.MapboxMap; import com.mapbox.mapboxsdk.style.layers.Layer; import com.mapbox.mapboxsdk.style.sources.GeoJsonOptions; import com.mapbox.mapboxsdk.style.sources.GeoJsonSource; -import com.mapbox.services.commons.geojson.Feature; -import com.mapbox.services.commons.geojson.FeatureCollection; /** * Utils class useful for performing map operations such as adding sources, layers, and more. From 8b1d172e4020c9f0af72798493f8588279fd273c Mon Sep 17 00:00:00 2001 From: danesfeder Date: Mon, 12 Feb 2018 17:36:17 -0500 Subject: [PATCH 2/4] Add java 8 to test app --- app/build.gradle | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/build.gradle b/app/build.gradle index 62f0656d2f8..7c1ad49b257 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -4,6 +4,11 @@ android { compileSdkVersion androidVersions.compileSdkVersion buildToolsVersion androidVersions.buildToolsVersion + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + defaultConfig { applicationId "com.mapbox.services.android.navigation.testapp" minSdkVersion androidVersions.minSdkVersion From ff18a94cd3522d618191adf33ef2b69cb27e10a3 Mon Sep 17 00:00:00 2001 From: danesfeder Date: Mon, 12 Feb 2018 16:59:32 -0500 Subject: [PATCH 3/4] Update Maps SDK with MAS 3.0 --- .../ui/v5/route/NavigationMapRoute.java | 29 +++++++------------ 1 file changed, 10 insertions(+), 19 deletions(-) diff --git a/libandroid-navigation-ui/src/main/java/com/mapbox/services/android/navigation/ui/v5/route/NavigationMapRoute.java b/libandroid-navigation-ui/src/main/java/com/mapbox/services/android/navigation/ui/v5/route/NavigationMapRoute.java index 21daefcb016..c8f0a1c352d 100644 --- a/libandroid-navigation-ui/src/main/java/com/mapbox/services/android/navigation/ui/v5/route/NavigationMapRoute.java +++ b/libandroid-navigation-ui/src/main/java/com/mapbox/services/android/navigation/ui/v5/route/NavigationMapRoute.java @@ -79,8 +79,7 @@ public class NavigationMapRoute implements ProgressChangeListener, MapView.OnMap private static final String WAYPOINT_SOURCE_ID = "mapbox-navigation-waypoint-source"; private static final String WAYPOINT_LAYER_ID = "mapbox-navigation-waypoint-layer"; private static final String ID_FORMAT = "%s-%d"; - private static final String GENERIC_ROUTE_SHIELD_LAYER_ID - = "mapbox-navigation-route-shield-layer"; + private static final String GENERIC_ROUTE_SHIELD_LAYER_ID = "mapbox-navigation-route-shield-layer"; @StyleRes private int styleRes; @@ -485,8 +484,7 @@ private void addRouteShieldLayer(String layerId, String sourceId, int index) { */ private void getAttributes() { Context context = mapView.getContext(); - TypedArray typedArray - = context.obtainStyledAttributes(styleRes, R.styleable.NavigationMapRoute); + TypedArray typedArray = context.obtainStyledAttributes(styleRes, R.styleable.NavigationMapRoute); // Primary Route attributes routeDefaultColor = typedArray.getColor(R.styleable.NavigationMapRoute_routeColor, @@ -633,8 +631,7 @@ private boolean invalidMapClick() { private boolean findClickedRoute(@NonNull LatLng point) { HashMap routeDistancesAwayFromClick = new HashMap<>(); - com.mapbox.geojson.Point clickPoint - = com.mapbox.geojson.Point.fromLngLat(point.getLongitude(), point.getLatitude()); + Point clickPoint = Point.fromLngLat(point.getLongitude(), point.getLatitude()); if (calculateClickDistancesFromRoutes(routeDistancesAwayFromClick, clickPoint)) { return true; @@ -648,9 +645,9 @@ private boolean findClickedRoute(@NonNull LatLng point) { } private boolean calculateClickDistancesFromRoutes(HashMap routeDistancesAwayFromClick, - com.mapbox.geojson.Point clickPoint) { + Point clickPoint) { for (LineString lineString : routeLineStrings.keySet()) { - com.mapbox.geojson.Point pointOnLine = findPointOnLine(clickPoint, lineString); + Point pointOnLine = findPointOnLine(clickPoint, lineString); if (pointOnLine == null) { return true; @@ -661,15 +658,10 @@ private boolean calculateClickDistancesFromRoutes(HashMap linePoints = new ArrayList<>(); - List positions = lineString.coordinates(); - for (Point pos : positions) { - linePoints.add(com.mapbox.geojson.Point.fromLngLat(pos.longitude(), pos.latitude())); - } - - com.mapbox.geojson.Feature feature = TurfMisc.nearestPointOnLine(clickPoint, linePoints); - return (com.mapbox.geojson.Point) feature.geometry(); + private Point findPointOnLine(Point clickPoint, LineString lineString) { + List linePoints = lineString.coordinates(); + Feature feature = TurfMisc.nearestPointOnLine(clickPoint, linePoints); + return (Point) feature.geometry(); } private void checkNewRouteFound(int currentRouteIndex) { @@ -749,8 +741,7 @@ private FeatureCollection addTrafficToSource(DirectionsRoute route, int index) { private void buildRouteFeatureFromGeometry(int index, List features, LineString originalGeometry) { Feature feat = Feature.fromGeometry(originalGeometry); - feat.addStringProperty(SOURCE_KEY, String.format(Locale.US, ID_FORMAT, GENERIC_ROUTE_SOURCE_ID, - index)); + feat.addStringProperty(SOURCE_KEY, String.format(Locale.US, ID_FORMAT, GENERIC_ROUTE_SOURCE_ID, index)); feat.addNumberProperty(INDEX_KEY, index); features.add(feat); } From 251ea82ea4d3e3da1f49374adb41406656105f00 Mon Sep 17 00:00:00 2001 From: Guardiola31337 Date: Mon, 12 Mar 2018 12:17:27 +0100 Subject: [PATCH 4/4] bump dependencies to the latest versions and adapt code to them --- app/build.gradle | 3 + .../navigation/testapp/MainActivity.java | 11 +- .../activity/MockNavigationActivity.java | 17 +- .../testapp/activity/RerouteActivity.java | 8 +- .../navigationui/NavigationViewActivity.java | 16 +- build.gradle | 3 +- gradle/dependencies.gradle | 16 +- libandroid-navigation-ui/build.gradle | 11 +- .../navigation/ui/v5/NavigationLauncher.java | 2 +- .../navigation/ui/v5/NavigationView.java | 6 +- .../navigation/ui/v5/NavigationViewModel.java | 2 +- .../ui/v5/NavigationViewSubscriber.java | 2 +- .../ui/v5/location/LocationViewModel.java | 10 +- .../ui/v5/route/NavigationMapRoute.java | 124 +++-- libandroid-navigation/build.gradle | 4 +- .../v5/location/MockLocationEngine.java | 8 +- .../v5/navigation/MapboxNavigation.java | 10 +- .../v5/navigation/NavigationHelper.java | 2 +- .../navigation/NavigationMetricsWrapper.java | 448 ++++++++++++------ .../v5/navigation/NavigationService.java | 7 +- .../v5/navigation/NavigationTelemetry.java | 45 +- .../v5/navigation/metrics/FeedbackEvent.java | 8 +- .../v5/navigation/metrics/RerouteEvent.java | 4 +- .../v5/offroute/OffRouteDetector.java | 3 +- .../navigation/v5/snap/SnapToRoute.java | 2 +- .../navigation/v5/utils/DistanceUtils.java | 15 +- .../navigation/v5/utils/MathUtils.java | 80 ++++ .../navigation/FasterRouteDetectorTest.java | 2 +- .../v5/navigation/MapboxNavigationTest.java | 2 +- .../NavigationEventDispatcherTest.java | 2 +- .../v5/navigation/NavigationHelperTest.java | 2 +- .../NavigationRouteProcessorTest.java | 2 +- 32 files changed, 537 insertions(+), 340 deletions(-) create mode 100644 libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/utils/MathUtils.java diff --git a/app/build.gradle b/app/build.gradle index 7c1ad49b257..1590a4d50cc 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -54,6 +54,9 @@ dependencies { implementation dependenciesList.supportRecyclerView implementation dependenciesList.supportConstraintLayout implementation dependenciesList.supportCardView + implementation dependenciesList.lifecycleExtensions + + implementation dependenciesList.gmsLocation // Logging implementation dependenciesList.timber diff --git a/app/src/main/java/com/mapbox/services/android/navigation/testapp/MainActivity.java b/app/src/main/java/com/mapbox/services/android/navigation/testapp/MainActivity.java index 66b19927d94..d6b99a9d5d8 100644 --- a/app/src/main/java/com/mapbox/services/android/navigation/testapp/MainActivity.java +++ b/app/src/main/java/com/mapbox/services/android/navigation/testapp/MainActivity.java @@ -1,6 +1,5 @@ package com.mapbox.services.android.navigation.testapp; -import android.Manifest; import android.content.Intent; import android.os.Bundle; import android.support.annotation.NonNull; @@ -13,6 +12,8 @@ import android.widget.TextView; import android.widget.Toast; +import com.mapbox.android.core.permissions.PermissionsListener; +import com.mapbox.android.core.permissions.PermissionsManager; import com.mapbox.services.android.navigation.testapp.activity.MockNavigationActivity; import com.mapbox.services.android.navigation.testapp.activity.RerouteActivity; import com.mapbox.services.android.navigation.testapp.activity.navigationui.EmbeddedNavigationActivity; @@ -20,18 +21,12 @@ import com.mapbox.services.android.navigation.testapp.activity.navigationui.NavigationViewActivity; import com.mapbox.services.android.navigation.testapp.activity.navigationui.WaypointNavigationActivity; import com.mapbox.services.android.navigation.testapp.activity.navigationui.fragment.FragmentNavigationActivity; -import com.mapbox.services.android.telemetry.permissions.PermissionsListener; -import com.mapbox.services.android.telemetry.permissions.PermissionsManager; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class MainActivity extends AppCompatActivity implements PermissionsListener { - - private static final String[] PERMISSIONS = {Manifest.permission.ACCESS_FINE_LOCATION, - Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_NETWORK_STATE}; - private RecyclerView recyclerView; private PermissionsManager permissionsManager; @@ -94,7 +89,7 @@ protected void onCreate(Bundle savedInstanceState) { permissionsManager = new PermissionsManager(this); if (!PermissionsManager.areLocationPermissionsGranted(this)) { recyclerView.setEnabled(false); - permissionsManager.requestPermissions(this, PERMISSIONS); + permissionsManager.requestLocationPermissions(this); } } diff --git a/app/src/main/java/com/mapbox/services/android/navigation/testapp/activity/MockNavigationActivity.java b/app/src/main/java/com/mapbox/services/android/navigation/testapp/activity/MockNavigationActivity.java index 731e5c9bd5b..9c7f8027e5c 100644 --- a/app/src/main/java/com/mapbox/services/android/navigation/testapp/activity/MockNavigationActivity.java +++ b/app/src/main/java/com/mapbox/services/android/navigation/testapp/activity/MockNavigationActivity.java @@ -11,19 +11,19 @@ import android.widget.Button; import android.widget.Toast; +import com.mapbox.android.core.location.LocationEngine; import com.mapbox.api.directions.v5.models.DirectionsResponse; import com.mapbox.api.directions.v5.models.DirectionsRoute; import com.mapbox.geojson.Point; import com.mapbox.mapboxsdk.Mapbox; import com.mapbox.mapboxsdk.annotations.MarkerOptions; import com.mapbox.mapboxsdk.camera.CameraUpdateFactory; -import com.mapbox.mapboxsdk.constants.MyLocationTracking; import com.mapbox.mapboxsdk.geometry.LatLng; import com.mapbox.mapboxsdk.maps.MapView; import com.mapbox.mapboxsdk.maps.MapboxMap; import com.mapbox.mapboxsdk.maps.OnMapReadyCallback; -import com.mapbox.mapboxsdk.plugins.locationlayer.LocationLayerMode; import com.mapbox.mapboxsdk.plugins.locationlayer.LocationLayerPlugin; +import com.mapbox.mapboxsdk.plugins.locationlayer.modes.RenderMode; import com.mapbox.services.android.navigation.testapp.R; import com.mapbox.services.android.navigation.testapp.Utils; import com.mapbox.services.android.navigation.testapp.activity.notification.CustomNavigationNotification; @@ -42,7 +42,6 @@ import com.mapbox.services.android.navigation.v5.offroute.OffRouteListener; import com.mapbox.services.android.navigation.v5.routeprogress.ProgressChangeListener; import com.mapbox.services.android.navigation.v5.routeprogress.RouteProgress; -import com.mapbox.services.android.telemetry.location.LocationEngine; import com.mapbox.turf.TurfConstants; import com.mapbox.turf.TurfMeasurement; @@ -126,7 +125,7 @@ public void onStartRouteClick() { ((MockLocationEngine) locationEngine).setRoute(route); navigation.setLocationEngine(locationEngine); navigation.startNavigation(route); - mapboxMap.addOnMapClickListener(null); + mapboxMap.removeOnMapClickListener(this); } } @@ -142,8 +141,6 @@ private void newOrigin() { Point.fromLngLat(latLng.getLongitude(), latLng.getLatitude()) ); mapboxMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, 12)); - mapboxMap.setMyLocationEnabled(true); - mapboxMap.getTrackingSettings().setMyLocationTrackingMode(MyLocationTracking.TRACKING_FOLLOW); } } @@ -152,15 +149,13 @@ public void onMapReady(MapboxMap mapboxMap) { this.mapboxMap = mapboxMap; locationLayerPlugin = new LocationLayerPlugin(mapView, mapboxMap, null); - locationLayerPlugin.setLocationLayerEnabled(LocationLayerMode.NAVIGATION); - + locationLayerPlugin.setRenderMode(RenderMode.GPS); navigationMapRoute = new NavigationMapRoute(navigation, mapView, mapboxMap); mapboxMap.addOnMapClickListener(this); Snackbar.make(mapView, "Tap map to place waypoint", BaseTransientBottomBar.LENGTH_LONG).show(); locationEngine = new MockLocationEngine(1000, 50, true); - mapboxMap.setLocationSource(locationEngine); newOrigin(); } @@ -181,7 +176,7 @@ public void onMapClick(@NonNull LatLng point) { } private void calculateRoute() { - Location userLocation = mapboxMap.getMyLocation(); + Location userLocation = locationEngine.getLastLocation(); if (userLocation == null) { Timber.d("calculateRoute: User location is null, therefore, origin can't be set."); return; @@ -216,7 +211,7 @@ public void onResponse(Call call, Response call, Throwable throwable) { - Timber.e("onFailure: navigation.getRoute()", throwable); + Timber.e(throwable, "onFailure: navigation.getRoute()"); } }); } diff --git a/app/src/main/java/com/mapbox/services/android/navigation/testapp/activity/RerouteActivity.java b/app/src/main/java/com/mapbox/services/android/navigation/testapp/activity/RerouteActivity.java index 9168586d7c0..f3ad4e4f3d5 100644 --- a/app/src/main/java/com/mapbox/services/android/navigation/testapp/activity/RerouteActivity.java +++ b/app/src/main/java/com/mapbox/services/android/navigation/testapp/activity/RerouteActivity.java @@ -9,8 +9,10 @@ import android.support.v7.app.AppCompatActivity; import android.view.View; +import com.mapbox.android.core.location.LocationEngineListener; import com.mapbox.api.directions.v5.models.DirectionsResponse; import com.mapbox.api.directions.v5.models.DirectionsRoute; +import com.mapbox.core.constants.Constants; import com.mapbox.geojson.LineString; import com.mapbox.geojson.Point; import com.mapbox.mapboxsdk.Mapbox; @@ -23,9 +25,8 @@ import com.mapbox.mapboxsdk.maps.MapView; import com.mapbox.mapboxsdk.maps.MapboxMap; import com.mapbox.mapboxsdk.maps.OnMapReadyCallback; -import com.mapbox.mapboxsdk.plugins.locationlayer.LocationLayerMode; import com.mapbox.mapboxsdk.plugins.locationlayer.LocationLayerPlugin; -import com.mapbox.services.Constants; +import com.mapbox.mapboxsdk.plugins.locationlayer.modes.RenderMode; import com.mapbox.services.android.navigation.testapp.R; import com.mapbox.services.android.navigation.v5.location.MockLocationEngine; import com.mapbox.services.android.navigation.v5.milestone.Milestone; @@ -37,7 +38,6 @@ import com.mapbox.services.android.navigation.v5.offroute.OffRouteListener; import com.mapbox.services.android.navigation.v5.routeprogress.ProgressChangeListener; import com.mapbox.services.android.navigation.v5.routeprogress.RouteProgress; -import com.mapbox.services.android.telemetry.location.LocationEngineListener; import java.util.ArrayList; import java.util.List; @@ -150,7 +150,7 @@ public void onMapReady(MapboxMap mapboxMap) { mapboxMap.setOnMapClickListener(this); locationLayerPlugin = new LocationLayerPlugin(mapView, mapboxMap, null); - locationLayerPlugin.setLocationLayerEnabled(LocationLayerMode.NAVIGATION); + locationLayerPlugin.setRenderMode(RenderMode.GPS); // Setup the mockLocationEngine mockLocationEngine = new MockLocationEngine(1000, 30, false); diff --git a/app/src/main/java/com/mapbox/services/android/navigation/testapp/activity/navigationui/NavigationViewActivity.java b/app/src/main/java/com/mapbox/services/android/navigation/testapp/activity/navigationui/NavigationViewActivity.java index 5302f6d0a52..2bcb5cb26dc 100644 --- a/app/src/main/java/com/mapbox/services/android/navigation/testapp/activity/navigationui/NavigationViewActivity.java +++ b/app/src/main/java/com/mapbox/services/android/navigation/testapp/activity/navigationui/NavigationViewActivity.java @@ -18,8 +18,12 @@ import android.widget.Toast; import com.mapbox.api.directions.v5.DirectionsCriteria; +import com.mapbox.android.core.location.LocationEngine; +import com.mapbox.android.core.location.LocationEngineListener; +import com.mapbox.android.core.location.LocationEngineProvider; import com.mapbox.api.directions.v5.models.DirectionsResponse; import com.mapbox.api.directions.v5.models.DirectionsRoute; +import com.mapbox.core.constants.Constants; import com.mapbox.geojson.LineString; import com.mapbox.geojson.Point; import com.mapbox.mapboxsdk.Mapbox; @@ -33,9 +37,8 @@ import com.mapbox.mapboxsdk.maps.MapView; import com.mapbox.mapboxsdk.maps.MapboxMap; import com.mapbox.mapboxsdk.maps.OnMapReadyCallback; -import com.mapbox.mapboxsdk.plugins.locationlayer.LocationLayerMode; import com.mapbox.mapboxsdk.plugins.locationlayer.LocationLayerPlugin; -import com.mapbox.services.Constants; +import com.mapbox.mapboxsdk.plugins.locationlayer.modes.RenderMode; import com.mapbox.services.android.navigation.testapp.R; import com.mapbox.services.android.navigation.ui.v5.NavigationLauncher; import com.mapbox.services.android.navigation.ui.v5.NavigationLauncherOptions; @@ -44,9 +47,6 @@ import com.mapbox.services.android.navigation.v5.navigation.NavigationRoute; import com.mapbox.services.android.navigation.v5.navigation.NavigationUnitType; import com.mapbox.services.android.navigation.v5.utils.LocaleUtils; -import com.mapbox.services.android.telemetry.location.LocationEngine; -import com.mapbox.services.android.telemetry.location.LocationEngineListener; -import com.mapbox.services.android.telemetry.location.LostLocationEngine; import java.util.ArrayList; import java.util.List; @@ -60,7 +60,7 @@ import retrofit2.Response; import timber.log.Timber; -import static com.mapbox.services.android.telemetry.location.LocationEnginePriority.HIGH_ACCURACY; +import static com.mapbox.android.core.location.LocationEnginePriority.HIGH_ACCURACY; public class NavigationViewActivity extends AppCompatActivity implements OnMapReadyCallback, MapboxMap.OnMapLongClickListener, LocationEngineListener, Callback, @@ -248,7 +248,7 @@ public void onNewPrimaryRouteSelected(DirectionsRoute directionsRoute) { @SuppressWarnings( {"MissingPermission"}) private void initLocationEngine() { - locationEngine = new LostLocationEngine(this); + locationEngine = new LocationEngineProvider(this).obtainBestLocationEngineAvailable(); locationEngine.setPriority(HIGH_ACCURACY); locationEngine.setInterval(0); locationEngine.setFastestInterval(1000); @@ -265,7 +265,7 @@ private void initLocationEngine() { @SuppressWarnings( {"MissingPermission"}) private void initLocationLayer() { locationLayer = new LocationLayerPlugin(mapView, mapboxMap, locationEngine); - locationLayer.setLocationLayerEnabled(LocationLayerMode.COMPASS); + locationLayer.setRenderMode(RenderMode.COMPASS); } private void initMapRoute() { diff --git a/build.gradle b/build.gradle index 5c9f47073a5..766d116989b 100644 --- a/build.gradle +++ b/build.gradle @@ -25,7 +25,6 @@ task testReport(type: TestReport, group: 'Build') { allprojects { repositories { maven { url 'https://plugins.gradle.org/m2' } - maven { url "http://oss.sonatype.org/content/repositories/snapshots/" } google() jcenter() } @@ -48,4 +47,4 @@ task clean(type: Delete) { delete rootProject.buildDir } -apply from: "${rootDir}/gradle/sonarqube.gradle" \ No newline at end of file +apply from: "${rootDir}/gradle/sonarqube.gradle" diff --git a/gradle/dependencies.gradle b/gradle/dependencies.gradle index 53e909e1117..c46fd6347a5 100644 --- a/gradle/dependencies.gradle +++ b/gradle/dependencies.gradle @@ -8,10 +8,10 @@ ext { ] version = [ - mapboxMapSdk : '6.0.0-beta.6', - mapboxServices : '2.2.10', + mapboxMapSdk : '6.0.1', mapboxSdkServices : '3.0.1', - locationLayerPlugin: '0.5.0-beta.2', + mapboxEvents : '3.0.3', + locationLayerPlugin: '0.5.0', autoValue : '1.5', autoValueParcel : '0.2.5', junit : '4.12', @@ -29,8 +29,9 @@ ext { spoonRunner : '1.6.2', commonsIO : '2.5', robolectric : '3.5.1', - lifecycle : '1.0.0', - picasso : '2.5.2' + lifecycle : '1.1.1', + picasso : '2.5.2', + gmsLocation : '11.0.4' ] pluginVersion = [ @@ -48,10 +49,9 @@ ext { dependenciesList = [ // mapbox mapboxMapSdk : "com.mapbox.mapboxsdk:mapbox-android-sdk:${version.mapboxMapSdk}", - mapboxServices : "com.mapbox.mapboxsdk:mapbox-android-services:${version.mapboxServices}", - mapboxJavaServices : "com.mapbox.mapboxsdk:mapbox-java-services:${version.mapboxServices}", 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}", locationLayerPlugin : "com.mapbox.mapboxsdk:mapbox-android-plugin-locationlayer:${version.locationLayerPlugin}", // AutoValue @@ -99,6 +99,8 @@ ext { // aws polly polly : "com.amazonaws:aws-android-sdk-polly:${version.awsPolly}", + // play services + gmsLocation : "com.google.android.gms:play-services-location:${version.gmsLocation}", errorprone : "com.google.errorprone:error_prone_core:${version.errorprone}" diff --git a/libandroid-navigation-ui/build.gradle b/libandroid-navigation-ui/build.gradle index c8afda54816..36293713f8c 100644 --- a/libandroid-navigation-ui/build.gradle +++ b/libandroid-navigation-ui/build.gradle @@ -36,11 +36,7 @@ dependencies { api project(':libandroid-navigation') // Mapbox Map SDK - implementation(dependenciesList.mapboxMapSdk) { - exclude module: 'lost' - exclude module: 'mapbox-java-geojson' - exclude module: 'mapbox-android-telemetry' - } + implementation dependenciesList.mapboxMapSdk // Support libraries implementation dependenciesList.supportDesign @@ -53,10 +49,7 @@ dependencies { annotationProcessor dependenciesList.lifecycleCompiler // Mapbox plugins - implementation(dependenciesList.locationLayerPlugin) { - exclude module: 'mapbox-android-services' - exclude module: 'mapbox-android-sdk' - } + implementation dependenciesList.locationLayerPlugin // AutoValues annotationProcessor dependenciesList.autoValue diff --git a/libandroid-navigation-ui/src/main/java/com/mapbox/services/android/navigation/ui/v5/NavigationLauncher.java b/libandroid-navigation-ui/src/main/java/com/mapbox/services/android/navigation/ui/v5/NavigationLauncher.java index bb462450738..42c34f180eb 100644 --- a/libandroid-navigation-ui/src/main/java/com/mapbox/services/android/navigation/ui/v5/NavigationLauncher.java +++ b/libandroid-navigation-ui/src/main/java/com/mapbox/services/android/navigation/ui/v5/NavigationLauncher.java @@ -29,7 +29,7 @@ * You have an option to include a AWS Cognito Pool ID, which will initialize the UI with AWS Polly Voice instructions *

* For testing, you can launch with simulation, in which our - * {@link com.mapbox.services.android.location.MockLocationEngine} will begin + * {@link com.mapbox.services.android.navigation.v5.location.MockLocationEngine} will begin * following the given {@link DirectionsRoute} once the UI is initialized *

*/ diff --git a/libandroid-navigation-ui/src/main/java/com/mapbox/services/android/navigation/ui/v5/NavigationView.java b/libandroid-navigation-ui/src/main/java/com/mapbox/services/android/navigation/ui/v5/NavigationView.java index 6de1c0f0125..f99ddf9ba09 100644 --- a/libandroid-navigation-ui/src/main/java/com/mapbox/services/android/navigation/ui/v5/NavigationView.java +++ b/libandroid-navigation-ui/src/main/java/com/mapbox/services/android/navigation/ui/v5/NavigationView.java @@ -30,8 +30,8 @@ import com.mapbox.mapboxsdk.maps.MapView; import com.mapbox.mapboxsdk.maps.MapboxMap; import com.mapbox.mapboxsdk.maps.OnMapReadyCallback; -import com.mapbox.mapboxsdk.plugins.locationlayer.LocationLayerMode; import com.mapbox.mapboxsdk.plugins.locationlayer.LocationLayerPlugin; +import com.mapbox.mapboxsdk.plugins.locationlayer.modes.RenderMode; import com.mapbox.services.android.navigation.ui.v5.camera.NavigationCamera; import com.mapbox.services.android.navigation.ui.v5.instruction.InstructionLoader; import com.mapbox.services.android.navigation.ui.v5.instruction.InstructionView; @@ -200,12 +200,12 @@ public void onDestroy() { @Override public void onMapReady(MapboxMap mapboxMap) { map = mapboxMap; - initMapPadding(); ThemeSwitcher.setMapStyle(getContext(), map, new MapboxMap.OnStyleLoadedListener() { @Override public void onStyleLoaded(String style) { initRoute(); initLocationLayer(); + initMapPadding(); initLifecycleObservers(); initNavigationPresenter(); initClickListeners(); @@ -514,7 +514,7 @@ private void initLocationLayer() { int locationLayerStyleRes = ThemeSwitcher.retrieveNavigationViewStyle(getContext(), R.attr.navigationViewLocationLayerStyle); locationLayer = new LocationLayerPlugin(mapView, map, null, locationLayerStyleRes); - locationLayer.setLocationLayerEnabled(LocationLayerMode.NAVIGATION); + locationLayer.setRenderMode(RenderMode.GPS); } /** diff --git a/libandroid-navigation-ui/src/main/java/com/mapbox/services/android/navigation/ui/v5/NavigationViewModel.java b/libandroid-navigation-ui/src/main/java/com/mapbox/services/android/navigation/ui/v5/NavigationViewModel.java index 77ee021e6b2..9fcc7f1aab5 100644 --- a/libandroid-navigation-ui/src/main/java/com/mapbox/services/android/navigation/ui/v5/NavigationViewModel.java +++ b/libandroid-navigation-ui/src/main/java/com/mapbox/services/android/navigation/ui/v5/NavigationViewModel.java @@ -9,6 +9,7 @@ import android.net.NetworkInfo; import android.text.TextUtils; +import com.mapbox.android.core.location.LocationEngine; import com.mapbox.api.directions.v5.models.DirectionsRoute; import com.mapbox.geojson.Point; import com.mapbox.mapboxsdk.Mapbox; @@ -34,7 +35,6 @@ import com.mapbox.services.android.navigation.v5.routeprogress.ProgressChangeListener; import com.mapbox.services.android.navigation.v5.routeprogress.RouteProgress; import com.mapbox.services.android.navigation.v5.utils.LocaleUtils; -import com.mapbox.services.android.telemetry.location.LocationEngine; import java.util.Locale; diff --git a/libandroid-navigation-ui/src/main/java/com/mapbox/services/android/navigation/ui/v5/NavigationViewSubscriber.java b/libandroid-navigation-ui/src/main/java/com/mapbox/services/android/navigation/ui/v5/NavigationViewSubscriber.java index 7a966e21c2c..2668de9d8bc 100644 --- a/libandroid-navigation-ui/src/main/java/com/mapbox/services/android/navigation/ui/v5/NavigationViewSubscriber.java +++ b/libandroid-navigation-ui/src/main/java/com/mapbox/services/android/navigation/ui/v5/NavigationViewSubscriber.java @@ -5,13 +5,13 @@ import android.location.Location; import android.support.annotation.Nullable; +import com.mapbox.android.core.location.LocationEngine; import com.mapbox.api.directions.v5.models.DirectionsRoute; import com.mapbox.geojson.Point; import com.mapbox.services.android.navigation.ui.v5.feedback.FeedbackItem; import com.mapbox.services.android.navigation.ui.v5.location.LocationViewModel; import com.mapbox.services.android.navigation.ui.v5.route.OffRouteEvent; import com.mapbox.services.android.navigation.ui.v5.route.RouteViewModel; -import com.mapbox.services.android.telemetry.location.LocationEngine; class NavigationViewSubscriber { diff --git a/libandroid-navigation-ui/src/main/java/com/mapbox/services/android/navigation/ui/v5/location/LocationViewModel.java b/libandroid-navigation-ui/src/main/java/com/mapbox/services/android/navigation/ui/v5/location/LocationViewModel.java index 2fab11c1d3c..e2216891bb4 100644 --- a/libandroid-navigation-ui/src/main/java/com/mapbox/services/android/navigation/ui/v5/location/LocationViewModel.java +++ b/libandroid-navigation-ui/src/main/java/com/mapbox/services/android/navigation/ui/v5/location/LocationViewModel.java @@ -8,13 +8,13 @@ import android.arch.lifecycle.OnLifecycleEvent; import android.location.Location; +import com.mapbox.android.core.location.LocationEngine; +import com.mapbox.android.core.location.LocationEngineListener; +import com.mapbox.android.core.location.LocationEnginePriority; +import com.mapbox.android.core.location.LocationEngineProvider; import com.mapbox.api.directions.v5.models.DirectionsRoute; import com.mapbox.services.android.navigation.v5.location.MockLocationEngine; import com.mapbox.services.android.navigation.v5.navigation.NavigationRoute; -import com.mapbox.services.android.telemetry.location.LocationEngine; -import com.mapbox.services.android.telemetry.location.LocationEngineListener; -import com.mapbox.services.android.telemetry.location.LocationEnginePriority; -import com.mapbox.services.android.telemetry.location.LocationEngineProvider; public class LocationViewModel extends AndroidViewModel implements LifecycleObserver, LocationEngineListener { @@ -95,7 +95,7 @@ public void updateRoute(DirectionsRoute route) { * Initializes the {@link LocationEngine} based on whether or not * simulation is enabled. */ - @SuppressWarnings({"MissingPermission"}) + @SuppressWarnings( {"MissingPermission"}) private void initLocation(Application application) { if (!shouldSimulateRoute) { LocationEngineProvider locationEngineProvider = new LocationEngineProvider(application.getApplicationContext()); diff --git a/libandroid-navigation-ui/src/main/java/com/mapbox/services/android/navigation/ui/v5/route/NavigationMapRoute.java b/libandroid-navigation-ui/src/main/java/com/mapbox/services/android/navigation/ui/v5/route/NavigationMapRoute.java index c8f0a1c352d..35ef2390e20 100644 --- a/libandroid-navigation-ui/src/main/java/com/mapbox/services/android/navigation/ui/v5/route/NavigationMapRoute.java +++ b/libandroid-navigation-ui/src/main/java/com/mapbox/services/android/navigation/ui/v5/route/NavigationMapRoute.java @@ -23,9 +23,7 @@ import com.mapbox.mapboxsdk.geometry.LatLng; import com.mapbox.mapboxsdk.maps.MapView; import com.mapbox.mapboxsdk.maps.MapboxMap; -import com.mapbox.mapboxsdk.style.functions.Function; -import com.mapbox.mapboxsdk.style.functions.stops.Stop; -import com.mapbox.mapboxsdk.style.functions.stops.Stops; +import com.mapbox.mapboxsdk.style.expressions.Expression; import com.mapbox.mapboxsdk.style.layers.Layer; import com.mapbox.mapboxsdk.style.layers.LineLayer; import com.mapbox.mapboxsdk.style.layers.Property; @@ -47,9 +45,14 @@ import java.util.List; import java.util.Locale; -import static com.mapbox.mapboxsdk.style.functions.stops.Stop.stop; -import static com.mapbox.mapboxsdk.style.functions.stops.Stops.categorical; -import static com.mapbox.mapboxsdk.style.functions.stops.Stops.exponential; +import static com.mapbox.mapboxsdk.style.expressions.Expression.color; +import static com.mapbox.mapboxsdk.style.expressions.Expression.exponential; +import static com.mapbox.mapboxsdk.style.expressions.Expression.get; +import static com.mapbox.mapboxsdk.style.expressions.Expression.interpolate; +import static com.mapbox.mapboxsdk.style.expressions.Expression.literal; +import static com.mapbox.mapboxsdk.style.expressions.Expression.match; +import static com.mapbox.mapboxsdk.style.expressions.Expression.stop; +import static com.mapbox.mapboxsdk.style.expressions.Expression.zoom; /** * Provide a route using {@link NavigationMapRoute#addRoutes(List)} and a route will be drawn using @@ -348,8 +351,8 @@ private void generateFeatureCollectionList(List directionsRoute private static FeatureCollection waypointFeatureCollection(DirectionsRoute route) { final List waypointFeatures = new ArrayList<>(); for (RouteLeg leg : route.legs()) { - waypointFeatures.add(getPointFromLineString(route, 0)); - waypointFeatures.add(getPointFromLineString(route, leg.steps().size() - 1)); + waypointFeatures.add(getPointFromLineString(leg, 0)); + waypointFeatures.add(getPointFromLineString(leg, leg.steps().size() - 1)); } return FeatureCollection.fromFeatures(waypointFeatures); } @@ -371,16 +374,14 @@ private void updatePrimaryRoute(String layerId, int index) { Layer layer = mapboxMap.getLayer(layerId); if (layer != null) { layer.setProperties( - PropertyFactory.lineColor( - Function.property(CONGESTION_KEY, categorical( - stop("moderate", PropertyFactory.lineColor( - index == primaryRouteIndex ? routeModerateColor : alternativeRouteModerateColor)), - stop("heavy", PropertyFactory.lineColor( - index == primaryRouteIndex ? routeSevereColor : alternativeRouteSevereColor)), - stop("severe", PropertyFactory.lineColor( - index == primaryRouteIndex ? routeSevereColor : alternativeRouteSevereColor)) - )).withDefaultValue(PropertyFactory.lineColor( - index == primaryRouteIndex ? routeDefaultColor : alternativeRouteDefaultColor))) + PropertyFactory.lineColor(match( + Expression.toString(get(CONGESTION_KEY)), + color(index == primaryRouteIndex ? routeDefaultColor : alternativeRouteDefaultColor), + stop("moderate", color(index == primaryRouteIndex ? routeModerateColor : alternativeRouteModerateColor)), + stop("heavy", color(index == primaryRouteIndex ? routeSevereColor : alternativeRouteSevereColor)), + stop("severe", color(index == primaryRouteIndex ? routeSevereColor : alternativeRouteSevereColor)) + ) + ) ); if (index == primaryRouteIndex) { mapboxMap.removeLayer(layer); @@ -393,8 +394,7 @@ private void updatePrimaryShieldRoute(String layerId, int index) { Layer layer = mapboxMap.getLayer(layerId); if (layer != null) { layer.setProperties( - PropertyFactory.lineColor( - index == primaryRouteIndex ? routeShieldColor : alternativeRouteShieldColor) + PropertyFactory.lineColor(index == primaryRouteIndex ? routeShieldColor : alternativeRouteShieldColor) ); if (index == primaryRouteIndex) { mapboxMap.removeLayer(layer); @@ -411,26 +411,24 @@ private void addRouteLayer(String layerId, String sourceId, int index) { Layer routeLayer = new LineLayer(layerId, sourceId).withProperties( PropertyFactory.lineCap(Property.LINE_CAP_ROUND), PropertyFactory.lineJoin(Property.LINE_JOIN_ROUND), - PropertyFactory.lineWidth(Function.zoom( - exponential( - stop(4f, PropertyFactory.lineWidth(3f * scale)), - stop(10f, PropertyFactory.lineWidth(4f * scale)), - stop(13f, PropertyFactory.lineWidth(6f * scale)), - stop(16f, PropertyFactory.lineWidth(10f * scale)), - stop(19f, PropertyFactory.lineWidth(14f * scale)), - stop(22f, PropertyFactory.lineWidth(18f * scale)) - ).withBase(1.5f)) + PropertyFactory.lineWidth(interpolate( + exponential(1.5f), zoom(), + stop(4f, 3f * scale), + stop(10f, 4f * scale), + stop(13f, 6f * scale), + stop(16f, 10f * scale), + stop(19f, 14f * scale), + stop(22f, 18f * scale) + ) ), - PropertyFactory.lineColor( - Function.property(CONGESTION_KEY, categorical( - stop("moderate", PropertyFactory.lineColor( - index == primaryRouteIndex ? routeModerateColor : alternativeRouteModerateColor)), - stop("heavy", PropertyFactory.lineColor( - index == primaryRouteIndex ? routeSevereColor : alternativeRouteSevereColor)), - stop("severe", PropertyFactory.lineColor( - index == primaryRouteIndex ? routeSevereColor : alternativeRouteSevereColor)) - )).withDefaultValue(PropertyFactory.lineColor( - index == primaryRouteIndex ? routeDefaultColor : alternativeRouteDefaultColor))) + PropertyFactory.lineColor(match( + Expression.toString(get(CONGESTION_KEY)), + color(index == primaryRouteIndex ? routeDefaultColor : alternativeRouteDefaultColor), + stop("moderate", color(index == primaryRouteIndex ? routeModerateColor : alternativeRouteModerateColor)), + stop("heavy", color(index == primaryRouteIndex ? routeSevereColor : alternativeRouteSevereColor)), + stop("severe", color(index == primaryRouteIndex ? routeSevereColor : alternativeRouteSevereColor)) + ) + ) ); MapUtils.addLayerToMap(mapboxMap, routeLayer, belowLayer); } @@ -463,14 +461,14 @@ private void addRouteShieldLayer(String layerId, String sourceId, int index) { Layer routeLayer = new LineLayer(layerId, sourceId).withProperties( PropertyFactory.lineCap(Property.LINE_CAP_ROUND), PropertyFactory.lineJoin(Property.LINE_JOIN_ROUND), - PropertyFactory.lineWidth(Function.zoom( - exponential( - stop(10f, PropertyFactory.lineWidth(7f)), - stop(14f, PropertyFactory.lineWidth(10.5f * scale)), - stop(16.5f, PropertyFactory.lineWidth(15.5f * scale)), - stop(19f, PropertyFactory.lineWidth(24f * scale)), - stop(22f, PropertyFactory.lineWidth(29f * scale)) - ).withBase(1.5f)) + PropertyFactory.lineWidth(interpolate( + exponential(1.5f), zoom(), + stop(10f, 7f), + stop(14f, 10.5f * scale), + stop(16.5f, 15.5f * scale), + stop(19f, 24f * scale), + stop(22f, 29f * scale) + ) ), PropertyFactory.lineColor( index == primaryRouteIndex ? routeShieldColor : alternativeRouteShieldColor) @@ -554,20 +552,19 @@ private void drawWaypointMarkers(@NonNull MapboxMap mapboxMap, @Nullable Drawabl mapboxMap.addImage("destinationMarker", bitmap); waypointLayer = new SymbolLayer(WAYPOINT_LAYER_ID, WAYPOINT_SOURCE_ID).withProperties( - PropertyFactory.iconImage(Function.property( - "waypoint", - categorical( - stop("origin", PropertyFactory.iconImage("originMarker")), - stop("destination", PropertyFactory.iconImage("destinationMarker")) + PropertyFactory.iconImage(match( + Expression.toString(get("waypoint")), literal("originMarker"), + stop("origin", literal("originMarker")), + stop("destination", literal("destinationMarker")) ) + ), + PropertyFactory.iconSize(interpolate( + exponential(1.5f), zoom(), + stop(22f, 2.8f), + stop(12f, 1.3f), + stop(10f, 0.8f), + stop(0f, 0.6f) )), - PropertyFactory.iconSize(Function.zoom( - Stops.exponential( - Stop.stop(22f, PropertyFactory.iconSize(2.8f)), - Stop.stop(12f, PropertyFactory.iconSize(1.3f)), - Stop.stop(10f, PropertyFactory.iconSize(0.8f)), - Stop.stop(0f, PropertyFactory.iconSize(0.6f)) - ).withBase(1.5f))), PropertyFactory.iconPitchAlignment(Property.ANCHOR_MAP), PropertyFactory.iconAllowOverlap(true), PropertyFactory.iconIgnorePlacement(true) @@ -577,10 +574,11 @@ private void drawWaypointMarkers(@NonNull MapboxMap mapboxMap, @Nullable Drawabl } } - private static Feature getPointFromLineString(DirectionsRoute route, int index) { - List coordinates = route.routeOptions().coordinates(); - Point waypoint = coordinates.get(index); - Feature feature = Feature.fromGeometry(waypoint); + private static Feature getPointFromLineString(RouteLeg leg, int index) { + Feature feature = Feature.fromGeometry(Point.fromLngLat( + leg.steps().get(index).maneuver().location().longitude(), + leg.steps().get(index).maneuver().location().latitude() + )); feature.addStringProperty(SOURCE_KEY, WAYPOINT_SOURCE_ID); feature.addStringProperty("waypoint", index == 0 ? "origin" : "destination" diff --git a/libandroid-navigation/build.gradle b/libandroid-navigation/build.gradle index ba64a5c6907..9e79aed2f11 100644 --- a/libandroid-navigation/build.gradle +++ b/libandroid-navigation/build.gradle @@ -39,9 +39,7 @@ android { } dependencies { - // Mapbox Android Services - api dependenciesList.mapboxServices - + api dependenciesList.mapboxEvents api dependenciesList.mapboxSdkServices api dependenciesList.mapboxSdkTurf diff --git a/libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/location/MockLocationEngine.java b/libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/location/MockLocationEngine.java index 74a29c6a646..3317bcaa2d9 100644 --- a/libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/location/MockLocationEngine.java +++ b/libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/location/MockLocationEngine.java @@ -4,17 +4,15 @@ import android.os.Handler; import android.support.annotation.Nullable; +import com.mapbox.android.core.location.LocationEngine; +import com.mapbox.android.core.location.LocationEngineListener; import com.mapbox.api.directions.v5.models.DirectionsRoute; +import com.mapbox.core.constants.Constants; import com.mapbox.geojson.LineString; import com.mapbox.geojson.Point; - -import com.mapbox.services.android.telemetry.location.LocationEngine; -import com.mapbox.services.android.telemetry.location.LocationEngineListener; -import com.mapbox.core.constants.Constants; import com.mapbox.turf.TurfConstants; import com.mapbox.turf.TurfMeasurement; - import java.util.ArrayList; import java.util.List; import java.util.Random; 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 401259d014e..8f2d1c4009b 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 @@ -9,6 +9,9 @@ import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import com.mapbox.android.core.location.LocationEngine; +import com.mapbox.android.core.location.LocationEnginePriority; +import com.mapbox.android.core.location.LocationEngineProvider; import com.mapbox.api.directions.v5.models.DirectionsRoute; import com.mapbox.services.android.navigation.v5.milestone.BannerInstructionMilestone; import com.mapbox.services.android.navigation.v5.milestone.Milestone; @@ -27,9 +30,6 @@ import com.mapbox.services.android.navigation.v5.snap.Snap; import com.mapbox.services.android.navigation.v5.snap.SnapToRoute; import com.mapbox.services.android.navigation.v5.utils.ValidationUtils; -import com.mapbox.services.android.telemetry.location.LocationEngine; -import com.mapbox.services.android.telemetry.location.LocationEnginePriority; -import com.mapbox.services.android.telemetry.location.LostLocationEngine; import java.util.ArrayList; import java.util.List; @@ -188,7 +188,7 @@ private void initializeDefaultLocationEngine() { private LocationEngine obtainLocationEngine() { if (locationEngine == null) { - return new LostLocationEngine(context); + return new LocationEngineProvider(context).obtainBestLocationEngineAvailable(); } return locationEngine; @@ -347,6 +347,7 @@ public LocationEngine getLocationEngine() { * Navigation uses a camera engine to determine the camera position while routing. * By default, it uses a {@link SimpleCamera}. If you would like to customize how the camera is * positioned, create a new {@link Camera} and set it here. + * * @param cameraEngine camera engine used to configure camera position while routing * @since 0.10.0 */ @@ -357,6 +358,7 @@ public void setCameraEngine(@NonNull Camera cameraEngine) { /** * Returns the current camera engine used to configure the camera position while routing. By default, * a {@link SimpleCamera} is used. + * * @return camera engine used to configure camera position while routing * @since 0.10.0 */ diff --git a/libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/navigation/NavigationHelper.java b/libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/navigation/NavigationHelper.java index 7f05dd9c2f4..2e63073d51d 100644 --- a/libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/navigation/NavigationHelper.java +++ b/libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/navigation/NavigationHelper.java @@ -25,7 +25,7 @@ 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.snap.Snap; -import com.mapbox.services.android.telemetry.utils.MathUtils; +import com.mapbox.services.android.navigation.v5.utils.MathUtils; import com.mapbox.turf.TurfConstants; import com.mapbox.turf.TurfMeasurement; import com.mapbox.turf.TurfMisc; diff --git a/libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/navigation/NavigationMetricsWrapper.java b/libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/navigation/NavigationMetricsWrapper.java index 9adad2689ab..a51852d6592 100644 --- a/libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/navigation/NavigationMetricsWrapper.java +++ b/libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/navigation/NavigationMetricsWrapper.java @@ -1,19 +1,29 @@ package com.mapbox.services.android.navigation.v5.navigation; +import android.content.Context; import android.location.Location; +import com.mapbox.android.telemetry.AppUserTurnstile; +import com.mapbox.android.telemetry.Event; +import com.mapbox.android.telemetry.FeedbackData; +import com.mapbox.android.telemetry.FeedbackEventData; +import com.mapbox.android.telemetry.MapboxTelemetry; +import com.mapbox.android.telemetry.NavigationCancelData; +import com.mapbox.android.telemetry.NavigationEventFactory; +import com.mapbox.android.telemetry.NavigationLocationData; +import com.mapbox.android.telemetry.NavigationMetadata; +import com.mapbox.android.telemetry.NavigationNewData; +import com.mapbox.android.telemetry.NavigationRerouteData; +import com.mapbox.android.telemetry.NavigationState; +import com.mapbox.android.telemetry.NavigationStepMetadata; import com.mapbox.services.android.navigation.BuildConfig; import com.mapbox.services.android.navigation.v5.navigation.metrics.RerouteEvent; import com.mapbox.services.android.navigation.v5.navigation.metrics.SessionState; import com.mapbox.services.android.navigation.v5.routeprogress.MetricsRouteProgress; import com.mapbox.services.android.navigation.v5.routeprogress.RouteProgress; import com.mapbox.services.android.navigation.v5.utils.DistanceUtils; -import com.mapbox.services.android.telemetry.MapboxTelemetry; -import com.mapbox.services.android.telemetry.navigation.MapboxNavigationEvent; -import com.mapbox.services.android.telemetry.utils.TelemetryUtils; import java.util.Date; -import java.util.Hashtable; import java.util.List; final class NavigationMetricsWrapper { @@ -27,180 +37,323 @@ final class NavigationMetricsWrapper { private static String upcomingName; private static String previousType; private static String previousName; + // TODO Where are we going to create MapboxTelemetry instance? Which class is going to hold it? + private static MapboxTelemetry mapboxTelemetry; private NavigationMetricsWrapper() { // Empty private constructor for preventing initialization of this class. } + static void init(Context context, String accessToken, String userAgent) { + mapboxTelemetry = new MapboxTelemetry(context, accessToken, userAgent); + mapboxTelemetry.enable(); + } + + static void enableLogging() { + mapboxTelemetry.updateDebugLoggingEnabled(true); + } + + static void disable() { + if (mapboxTelemetry != null) { + mapboxTelemetry.disable(); + } + } + + static void push(Event event) { + mapboxTelemetry.push(event); + } + static void arriveEvent(SessionState sessionState, RouteProgress routeProgress, Location location) { - Hashtable arriveEvent = MapboxNavigationEvent.buildArriveEvent( - sdkIdentifier, BuildConfig.MAPBOX_NAVIGATION_VERSION_NAME, - sessionState.sessionIdentifier(), location.getLatitude(), location.getLongitude(), - sessionState.currentGeometry(), routeProgress.directionsRoute().routeOptions().profile(), - routeProgress.directionsRoute().distance().intValue(), - routeProgress.directionsRoute().duration().intValue(), - sessionState.rerouteCount(), checkNullStartTimestamp(sessionState), + Date startTimestamp = obtainStartTimestamp(sessionState); + // TODO We should generate the Nav event spec version somehow. Should be managed and generated by the Events + // library? + int hardcodedEventVersion = 7; + MetricsRouteProgress metricsRouteProgress = new MetricsRouteProgress(routeProgress); + int absoluteDistanceToDestination = DistanceUtils.calculateAbsoluteDistance(location, metricsRouteProgress); + NavigationMetadata metadata = new NavigationMetadata( + startTimestamp, (int) (sessionState.eventRouteDistanceCompleted() + routeProgress.distanceTraveled()), - (int) routeProgress.distanceRemaining(), (int) routeProgress.durationRemaining(), - sessionState.mockLocation(), sessionState.originalRequestIdentifier(), - sessionState.requestIdentifier(), - sessionState.originalGeometry(), sessionState.originalDistance(), - sessionState.originalDuration(), null, sessionState.currentStepCount(), - sessionState.originalStepCount() + (int) routeProgress.distanceRemaining(), + (int) routeProgress.durationRemaining(), + sdkIdentifier, + BuildConfig.MAPBOX_NAVIGATION_VERSION_NAME, + hardcodedEventVersion, + sessionState.sessionIdentifier(), + location.getLatitude(), + location.getLongitude(), + sessionState.currentGeometry(), + routeProgress.directionsRoute().routeOptions().profile(), + sessionState.mockLocation(), + sessionState.locationEngineName(), + absoluteDistanceToDestination ); - - MetricsRouteProgress metricsRouteProgress = new MetricsRouteProgress(routeProgress); - int absoluteDistance = DistanceUtils.calculateAbsoluteDistance(location, metricsRouteProgress); - - MapboxTelemetry.getInstance().addPercentTimeInForeground(sessionState.percentInForeground(), arriveEvent); - MapboxTelemetry.getInstance().addPercentTimeInPortrait(sessionState.percentInPortrait(), arriveEvent); - MapboxTelemetry.getInstance().addAbsoluteDistanceToDestination(absoluteDistance, arriveEvent); - MapboxTelemetry.getInstance().addLocationEngineName(sessionState.locationEngineName(), arriveEvent); - MapboxTelemetry.getInstance().pushEvent(arriveEvent); - MapboxTelemetry.getInstance().flushEventsQueueImmediately(false); + metadata.setEstimatedDistance(routeProgress.directionsRoute().distance().intValue()); + metadata.setEstimatedDuration(routeProgress.directionsRoute().duration().intValue()); + metadata.setRerouteCount(sessionState.rerouteCount()); + metadata.setOriginalRequestIdentifier(sessionState.originalRequestIdentifier()); + metadata.setRequestIdentifier(sessionState.requestIdentifier()); + metadata.setOriginalGeometry(sessionState.originalGeometry()); + metadata.setOriginalEstimatedDistance(sessionState.originalDistance()); + metadata.setOriginalEstimatedDuration(sessionState.originalDuration()); + metadata.setStepCount(sessionState.currentStepCount()); + metadata.setOriginalStepCount(sessionState.originalStepCount()); + metadata.setPercentTimeInForeground(sessionState.percentInForeground()); + metadata.setPercentTimeInPortrait(sessionState.percentInPortrait()); + NavigationState state = new NavigationState(metadata); + NavigationEventFactory factory = new NavigationEventFactory(); + Event arriveEvent = factory.createNavigationEvent(Event.Type.NAV_ARRIVE, state); + mapboxTelemetry.push(arriveEvent); } static void cancelEvent(SessionState sessionState, MetricsRouteProgress metricProgress, Location location) { - Hashtable cancelEvent = MapboxNavigationEvent.buildCancelEvent( - sdkIdentifier, BuildConfig.MAPBOX_NAVIGATION_VERSION_NAME, - sessionState.sessionIdentifier(), - location.getLatitude(), location.getLongitude(), - sessionState.currentGeometry(), metricProgress.getDirectionsRouteProfile(), - metricProgress.getDirectionsRouteDistance(), - metricProgress.getDirectionsRouteDuration(), - sessionState.rerouteCount(), checkNullStartTimestamp(sessionState), + Date startTimestamp = obtainStartTimestamp(sessionState); + // TODO We should generate the Nav event spec version somehow. Should be managed and generated by the Events + // library? + int hardcodedEventVersion = 7; + int absoluteDistanceToDestination = DistanceUtils.calculateAbsoluteDistance(location, metricProgress); + NavigationMetadata metadata = new NavigationMetadata( + startTimestamp, (int) (sessionState.eventRouteDistanceCompleted() + metricProgress.getDistanceTraveled()), - metricProgress.getDistanceRemaining(), metricProgress.getDurationRemaining(), + metricProgress.getDistanceRemaining(), + metricProgress.getDurationRemaining(), + sdkIdentifier, + BuildConfig.MAPBOX_NAVIGATION_VERSION_NAME, + hardcodedEventVersion, + sessionState.sessionIdentifier(), + location.getLatitude(), + location.getLongitude(), + sessionState.currentGeometry(), + metricProgress.getDirectionsRouteProfile(), sessionState.mockLocation(), - sessionState.originalRequestIdentifier(), - sessionState.requestIdentifier(), - sessionState.originalGeometry(), - sessionState.originalDistance(), sessionState.originalDuration(), null, - sessionState.arrivalTimestamp(), sessionState.currentStepCount(), sessionState.originalStepCount() + sessionState.locationEngineName(), + absoluteDistanceToDestination ); - - int absoluteDistance = DistanceUtils.calculateAbsoluteDistance(location, metricProgress); - - MapboxTelemetry.getInstance().addPercentTimeInForeground(sessionState.percentInForeground(), cancelEvent); - MapboxTelemetry.getInstance().addPercentTimeInPortrait(sessionState.percentInPortrait(), cancelEvent); - MapboxTelemetry.getInstance().addAbsoluteDistanceToDestination(absoluteDistance, cancelEvent); - MapboxTelemetry.getInstance().addLocationEngineName(sessionState.locationEngineName(), cancelEvent); - MapboxTelemetry.getInstance().pushEvent(cancelEvent); - MapboxTelemetry.getInstance().flushEventsQueueImmediately(false); + metadata.setEstimatedDistance(metricProgress.getDirectionsRouteDistance()); + metadata.setEstimatedDuration(metricProgress.getDirectionsRouteDuration()); + metadata.setRerouteCount(sessionState.rerouteCount()); + metadata.setOriginalRequestIdentifier(sessionState.originalRequestIdentifier()); + metadata.setRequestIdentifier(sessionState.requestIdentifier()); + metadata.setOriginalGeometry(sessionState.originalGeometry()); + metadata.setOriginalEstimatedDistance(sessionState.originalDistance()); + metadata.setOriginalEstimatedDuration(sessionState.originalDuration()); + metadata.setStepCount(sessionState.currentStepCount()); + metadata.setOriginalStepCount(sessionState.originalStepCount()); + metadata.setPercentTimeInForeground(sessionState.percentInForeground()); + metadata.setPercentTimeInPortrait(sessionState.percentInPortrait()); + NavigationState state = new NavigationState(metadata); + Date arrivalDate = sessionState.arrivalTimestamp(); + NavigationCancelData data = new NavigationCancelData(); + if (arrivalDate != null) { + data.setArrivalTimestamp(arrivalDate); + } + state.setNavigationCancelData(data); + NavigationEventFactory factory = new NavigationEventFactory(); + Event cancelEvent = factory.createNavigationEvent(Event.Type.NAV_CANCEL, state); + mapboxTelemetry.push(cancelEvent); } static void departEvent(SessionState sessionState, MetricsRouteProgress metricProgress, Location location) { - Hashtable departEvent = MapboxNavigationEvent.buildDepartEvent( - sdkIdentifier, BuildConfig.MAPBOX_NAVIGATION_VERSION_NAME, - sessionState.sessionIdentifier(), location.getLatitude(), location.getLongitude(), - sessionState.currentGeometry(), metricProgress.getDirectionsRouteProfile(), - metricProgress.getDirectionsRouteDistance(), - metricProgress.getDirectionsRouteDuration(), - sessionState.rerouteCount(), sessionState.mockLocation(), - sessionState.originalRequestIdentifier(), sessionState.requestIdentifier(), - sessionState.originalGeometry(), sessionState.originalDistance(), sessionState.originalDuration(), - null, sessionState.currentStepCount(), sessionState.originalStepCount(), - metricProgress.getDistanceTraveled(), metricProgress.getDistanceRemaining(), - metricProgress.getDurationRemaining(), checkNullStartTimestamp(sessionState) + Date startTimestamp = obtainStartTimestamp(sessionState); + // TODO We should generate the Nav event spec version somehow. Should be managed and generated by the Events + // library? + int hardcodedEventVersion = 7; + int absoluteDistanceToDestination = DistanceUtils.calculateAbsoluteDistance(location, metricProgress); + NavigationMetadata metadata = new NavigationMetadata( + startTimestamp, + metricProgress.getDistanceTraveled(), + metricProgress.getDistanceRemaining(), + metricProgress.getDurationRemaining(), + sdkIdentifier, + BuildConfig.MAPBOX_NAVIGATION_VERSION_NAME, + hardcodedEventVersion, + sessionState.sessionIdentifier(), + location.getLatitude(), + location.getLongitude(), + sessionState.currentGeometry(), + metricProgress.getDirectionsRouteProfile(), + sessionState.mockLocation(), + sessionState.locationEngineName(), + absoluteDistanceToDestination ); - - int absoluteDistance = DistanceUtils.calculateAbsoluteDistance(location, metricProgress); - - MapboxTelemetry.getInstance().addPercentTimeInForeground(sessionState.percentInForeground(), departEvent); - MapboxTelemetry.getInstance().addPercentTimeInPortrait(sessionState.percentInPortrait(), departEvent); - MapboxTelemetry.getInstance().addAbsoluteDistanceToDestination(absoluteDistance, departEvent); - MapboxTelemetry.getInstance().addLocationEngineName(sessionState.locationEngineName(), departEvent); - MapboxTelemetry.getInstance().pushEvent(departEvent); - MapboxTelemetry.getInstance().flushEventsQueueImmediately(false); + metadata.setEstimatedDistance(metricProgress.getDirectionsRouteDistance()); + metadata.setEstimatedDuration(metricProgress.getDirectionsRouteDuration()); + metadata.setRerouteCount(sessionState.rerouteCount()); + metadata.setOriginalRequestIdentifier(sessionState.originalRequestIdentifier()); + metadata.setRequestIdentifier(sessionState.requestIdentifier()); + metadata.setOriginalGeometry(sessionState.originalGeometry()); + metadata.setOriginalEstimatedDistance(sessionState.originalDistance()); + metadata.setOriginalEstimatedDuration(sessionState.originalDuration()); + metadata.setStepCount(sessionState.currentStepCount()); + metadata.setOriginalStepCount(sessionState.originalStepCount()); + metadata.setPercentTimeInForeground(sessionState.percentInForeground()); + metadata.setPercentTimeInPortrait(sessionState.percentInPortrait()); + NavigationState state = new NavigationState(metadata); + NavigationEventFactory factory = new NavigationEventFactory(); + Event departEvent = factory.createNavigationEvent(Event.Type.NAV_DEPART, state); + mapboxTelemetry.push(departEvent); } static void rerouteEvent(RerouteEvent rerouteEvent, MetricsRouteProgress metricProgress, Location location) { - SessionState sessionState = rerouteEvent.getSessionState(); + Date startTimestamp = obtainStartTimestamp(sessionState); + // TODO We should generate the Nav event spec version somehow. Should be managed and generated by the Events + // library? + int hardcodedEventVersion = 7; + int absoluteDistanceToDestination = DistanceUtils.calculateAbsoluteDistance(location, metricProgress); + NavigationMetadata metadata = new NavigationMetadata( + startTimestamp, + (int) sessionState.eventRouteDistanceCompleted(), + sessionState.eventRouteProgress().getDistanceRemaining(), + sessionState.eventRouteProgress().getDurationRemaining(), + sdkIdentifier, + BuildConfig.MAPBOX_NAVIGATION_VERSION_NAME, + hardcodedEventVersion, + sessionState.sessionIdentifier(), + location.getLatitude(), + location.getLongitude(), + sessionState.currentGeometry(), + metricProgress.getDirectionsRouteProfile(), + sessionState.mockLocation(), + sessionState.locationEngineName(), + absoluteDistanceToDestination + ); + metadata.setEstimatedDistance(metricProgress.getDirectionsRouteDistance()); + metadata.setEstimatedDuration(metricProgress.getDirectionsRouteDuration()); + metadata.setRerouteCount(sessionState.rerouteCount()); + metadata.setOriginalRequestIdentifier(sessionState.originalRequestIdentifier()); + metadata.setRequestIdentifier(sessionState.requestIdentifier()); + metadata.setOriginalGeometry(sessionState.originalGeometry()); + metadata.setOriginalEstimatedDistance(sessionState.originalDistance()); + metadata.setOriginalEstimatedDuration(sessionState.originalDuration()); + metadata.setStepCount(sessionState.currentStepCount()); + metadata.setOriginalStepCount(sessionState.originalStepCount()); + metadata.setPercentTimeInForeground(sessionState.percentInForeground()); + metadata.setPercentTimeInPortrait(sessionState.percentInPortrait()); + metadata.setCreated(new Date(location.getTime())); + NavigationState state = new NavigationState(metadata); + Location[] before = convertToArray(sessionState.beforeEventLocations()); + Location[] after = convertToArray(sessionState.afterEventLocations()); + NavigationLocationData locationData = new NavigationLocationData(before, after); + state.setNavigationLocationData(locationData); + int newDistanceRemaining = rerouteEvent.getNewDistanceRemaining(); + int newDurationRemaining = rerouteEvent.getNewDurationRemaining(); + String newGeometry = rerouteEvent.getNewRouteGeometry(); + NavigationNewData navigationNewData = new NavigationNewData(newDistanceRemaining, newDurationRemaining, + newGeometry); + int secondsSinceLastReroute = sessionState.secondsSinceLastReroute(); + NavigationRerouteData navigationRerouteData = new NavigationRerouteData(navigationNewData, secondsSinceLastReroute); + state.setNavigationRerouteData(navigationRerouteData); + FeedbackData feedbackData = new FeedbackData(); + // TODO Do we want to set the screenshot here? + state.setFeedbackData(feedbackData); updateRouteProgressSessionData(metricProgress); - - Hashtable navRerouteEvent = MapboxNavigationEvent.buildRerouteEvent( - sdkIdentifier, BuildConfig.MAPBOX_NAVIGATION_VERSION_NAME, sessionState.sessionIdentifier(), - location.getLatitude(), location.getLongitude(), - sessionState.currentGeometry(), metricProgress.getDirectionsRouteProfile(), - metricProgress.getDirectionsRouteDistance(), - metricProgress.getDirectionsRouteDuration(), - sessionState.rerouteCount(), checkNullStartTimestamp(sessionState), - convertToArray(sessionState.beforeEventLocations()), - convertToArray(sessionState.afterEventLocations()), - (int) sessionState.eventRouteDistanceCompleted(), // distanceCompleted - sessionState.eventRouteProgress().getDistanceRemaining(), // distanceRemaining - sessionState.eventRouteProgress().getDurationRemaining(), // durationRemaining - rerouteEvent.getNewDistanceRemaining(), // new distanceRemaining - rerouteEvent.getNewDurationRemaining(), // new durationRemaining - sessionState.secondsSinceLastReroute(), TelemetryUtils.buildUUID(), - rerouteEvent.getNewRouteGeometry(), sessionState.mockLocation(), - sessionState.originalRequestIdentifier(), sessionState.requestIdentifier(), sessionState.originalGeometry(), - sessionState.originalDistance(), sessionState.originalDuration(), null, - upcomingInstruction, upcomingType, upcomingModifier, upcomingName, - previousInstruction, previousType, previousModifier, previousName, - metricProgress.getCurrentStepDistance(), - metricProgress.getCurrentStepDuration(), - metricProgress.getCurrentStepDistanceRemaining(), - metricProgress.getCurrentStepDurationRemaining(), - sessionState.currentStepCount(), sessionState.originalStepCount()); - navRerouteEvent.put(MapboxNavigationEvent.KEY_CREATED, TelemetryUtils.generateCreateDate(location)); - - int absoluteDistance = DistanceUtils.calculateAbsoluteDistance(location, metricProgress); - - MapboxTelemetry.getInstance().addPercentTimeInForeground(sessionState.percentInForeground(), navRerouteEvent); - MapboxTelemetry.getInstance().addPercentTimeInPortrait(sessionState.percentInPortrait(), navRerouteEvent); - MapboxTelemetry.getInstance().addAbsoluteDistanceToDestination(absoluteDistance, navRerouteEvent); - MapboxTelemetry.getInstance().addLocationEngineName(sessionState.locationEngineName(), navRerouteEvent); - MapboxTelemetry.getInstance().pushEvent(navRerouteEvent); - MapboxTelemetry.getInstance().flushEventsQueueImmediately(false); + NavigationStepMetadata navigationStepMetadata = new NavigationStepMetadata(); + navigationStepMetadata.setUpcomingInstruction(upcomingInstruction); + navigationStepMetadata.setUpcomingType(upcomingType); + navigationStepMetadata.setUpcomingModifier(upcomingModifier); + navigationStepMetadata.setUpcomingName(upcomingName); + navigationStepMetadata.setPreviousInstruction(previousInstruction); + navigationStepMetadata.setPreviousType(previousType); + navigationStepMetadata.setPreviousModifier(previousModifier); + navigationStepMetadata.setPreviousName(previousName); + int distance = metricProgress.getCurrentStepDistance(); + navigationStepMetadata.setDistance(distance); + int duration = metricProgress.getCurrentStepDuration(); + navigationStepMetadata.setDuration(duration); + int stepDistanceRemaining = metricProgress.getCurrentStepDistanceRemaining(); + navigationStepMetadata.setDistanceRemaining(stepDistanceRemaining); + int stepDurationRemaining = metricProgress.getCurrentStepDurationRemaining(); + navigationStepMetadata.setDurationRemaining(stepDurationRemaining); + state.setNavigationStepMetadata(navigationStepMetadata); + NavigationEventFactory factory = new NavigationEventFactory(); + Event navRerouteEvent = factory.createNavigationEvent(Event.Type.NAV_REROUTE, state); + mapboxTelemetry.push(navRerouteEvent); } static void feedbackEvent(SessionState sessionState, MetricsRouteProgress metricProgress, Location location, - String description, String feedbackType, String screenshot, String feedbackId, - String vendorId) { - - updateRouteProgressSessionData(metricProgress); - - Hashtable feedbackEvent = MapboxNavigationEvent.buildFeedbackEvent(sdkIdentifier, - BuildConfig.MAPBOX_NAVIGATION_VERSION_NAME, sessionState.sessionIdentifier(), location.getLatitude(), - location.getLongitude(), sessionState.currentGeometry(), metricProgress.getDirectionsRouteProfile(), - metricProgress.getDirectionsRouteDistance(), metricProgress.getDirectionsRouteDuration(), - sessionState.rerouteCount(), checkNullStartTimestamp(sessionState), feedbackType, - convertToArray(sessionState.beforeEventLocations()), - convertToArray(sessionState.afterEventLocations()), + String description, String feedbackType, String screenshot, String feedbackSource) { + Date startTimestamp = obtainStartTimestamp(sessionState); + // TODO We should generate the Nav event spec version somehow. Should be managed and generated by the Events + // library? + int hardcodedEventVersion = 7; + int absoluteDistanceToDestination = DistanceUtils.calculateAbsoluteDistance(location, metricProgress); + NavigationMetadata metadata = new NavigationMetadata( + startTimestamp, (int) sessionState.eventRouteDistanceCompleted(), sessionState.eventRouteProgress().getDistanceRemaining(), sessionState.eventRouteProgress().getDurationRemaining(), - description, vendorId, feedbackId, screenshot, - sessionState.mockLocation(), sessionState.originalRequestIdentifier(), - sessionState.requestIdentifier(), sessionState.originalGeometry(), - sessionState.originalDistance(), sessionState.originalDuration(), null, - upcomingInstruction, upcomingType, upcomingModifier, upcomingName, - previousInstruction, previousType, previousModifier, previousName, - metricProgress.getCurrentStepDistance(), - metricProgress.getCurrentStepDuration(), - metricProgress.getCurrentStepDistanceRemaining(), - metricProgress.getCurrentStepDurationRemaining(), - sessionState.currentStepCount(), sessionState.originalStepCount() + sdkIdentifier, + BuildConfig.MAPBOX_NAVIGATION_VERSION_NAME, + hardcodedEventVersion, + sessionState.sessionIdentifier(), + location.getLatitude(), + location.getLongitude(), + sessionState.currentGeometry(), + metricProgress.getDirectionsRouteProfile(), + sessionState.mockLocation(), + sessionState.locationEngineName(), + absoluteDistanceToDestination ); + metadata.setEstimatedDistance(metricProgress.getDirectionsRouteDistance()); + metadata.setEstimatedDuration(metricProgress.getDirectionsRouteDuration()); + metadata.setRerouteCount(sessionState.rerouteCount()); + metadata.setOriginalRequestIdentifier(sessionState.originalRequestIdentifier()); + metadata.setRequestIdentifier(sessionState.requestIdentifier()); + metadata.setOriginalGeometry(sessionState.originalGeometry()); + metadata.setOriginalEstimatedDistance(sessionState.originalDistance()); + metadata.setOriginalEstimatedDuration(sessionState.originalDuration()); + metadata.setStepCount(sessionState.currentStepCount()); + metadata.setOriginalStepCount(sessionState.originalStepCount()); + metadata.setPercentTimeInForeground(sessionState.percentInForeground()); + metadata.setPercentTimeInPortrait(sessionState.percentInPortrait()); + metadata.setCreated(new Date(location.getTime())); + NavigationState state = new NavigationState(metadata); + Location[] before = convertToArray(sessionState.beforeEventLocations()); + Location[] after = convertToArray(sessionState.afterEventLocations()); + NavigationLocationData locationData = new NavigationLocationData(before, after); + state.setNavigationLocationData(locationData); + FeedbackData feedbackData = new FeedbackData(); + feedbackData.setScreenshot(screenshot); + state.setFeedbackData(feedbackData); + updateRouteProgressSessionData(metricProgress); + NavigationStepMetadata navigationStepMetadata = new NavigationStepMetadata(); + navigationStepMetadata.setUpcomingInstruction(upcomingInstruction); + navigationStepMetadata.setUpcomingType(upcomingType); + navigationStepMetadata.setUpcomingModifier(upcomingModifier); + navigationStepMetadata.setUpcomingName(upcomingName); + navigationStepMetadata.setPreviousInstruction(previousInstruction); + navigationStepMetadata.setPreviousType(previousType); + navigationStepMetadata.setPreviousModifier(previousModifier); + navigationStepMetadata.setPreviousName(previousName); + int distance = metricProgress.getCurrentStepDistance(); + navigationStepMetadata.setDistance(distance); + int duration = metricProgress.getCurrentStepDuration(); + navigationStepMetadata.setDuration(duration); + int stepDistanceRemaining = metricProgress.getCurrentStepDistanceRemaining(); + navigationStepMetadata.setDistanceRemaining(stepDistanceRemaining); + int stepDurationRemaining = metricProgress.getCurrentStepDurationRemaining(); + navigationStepMetadata.setDurationRemaining(stepDurationRemaining); + state.setNavigationStepMetadata(navigationStepMetadata); + FeedbackEventData feedbackEventData = new FeedbackEventData(feedbackType, feedbackSource); + feedbackEventData.setDescription(description); + state.setFeedbackEventData(feedbackEventData); + NavigationEventFactory factory = new NavigationEventFactory(); + Event feedbackEvent = factory.createNavigationEvent(Event.Type.NAV_FEEDBACK, state); + mapboxTelemetry.push(feedbackEvent); + } - int absoluteDistance = DistanceUtils.calculateAbsoluteDistance(location, metricProgress); - - MapboxTelemetry.getInstance().addPercentTimeInForeground(sessionState.percentInForeground(), feedbackEvent); - MapboxTelemetry.getInstance().addPercentTimeInPortrait(sessionState.percentInPortrait(), feedbackEvent); - MapboxTelemetry.getInstance().addAbsoluteDistanceToDestination(absoluteDistance, feedbackEvent); - feedbackEvent.put(MapboxNavigationEvent.KEY_CREATED, TelemetryUtils.generateCreateDate(location)); - MapboxTelemetry.getInstance().addLocationEngineName(sessionState.locationEngineName(), feedbackEvent); - MapboxTelemetry.getInstance().pushEvent(feedbackEvent); - MapboxTelemetry.getInstance().flushEventsQueueImmediately(false); + static Event turnstileEvent() { + Event navTurnstileEvent = new AppUserTurnstile(sdkIdentifier, + BuildConfig.MAPBOX_NAVIGATION_VERSION_NAME); + return navTurnstileEvent; } - static void turnstileEvent() { - MapboxTelemetry.getInstance().setCustomTurnstileEvent( - MapboxNavigationEvent.buildTurnstileEvent(sdkIdentifier, BuildConfig.MAPBOX_NAVIGATION_VERSION_NAME) - ); + private static Date obtainStartTimestamp(SessionState sessionState) { + if (sessionState.startTimestamp() == null) { + return new Date(); + } + return sessionState.startTimestamp(); } private static void updateRouteProgressSessionData(MetricsRouteProgress routeProgress) { @@ -217,11 +370,4 @@ private static void updateRouteProgressSessionData(MetricsRouteProgress routePro private static Location[] convertToArray(List locationList) { return locationList.toArray(new Location[locationList.size()]); } - - private static Date checkNullStartTimestamp(SessionState sessionState) { - if (sessionState.startTimestamp() == null) { - return new Date(); - } - return sessionState.startTimestamp(); - } } 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 8cf767ed962..2e7355bc605 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 @@ -10,6 +10,8 @@ import android.os.IBinder; import android.support.annotation.Nullable; +import com.mapbox.android.core.location.LocationEngine; +import com.mapbox.android.core.location.LocationEngineListener; import com.mapbox.api.directions.v5.models.DirectionsResponse; import com.mapbox.api.directions.v5.models.DirectionsRoute; import com.mapbox.services.android.navigation.v5.location.LocationValidator; @@ -19,8 +21,6 @@ import com.mapbox.services.android.navigation.v5.routeprogress.RouteProgress; import com.mapbox.services.android.navigation.v5.utils.LocaleUtils; import com.mapbox.services.android.navigation.v5.utils.RouteUtils; -import com.mapbox.services.android.telemetry.location.LocationEngine; -import com.mapbox.services.android.telemetry.location.LocationEngineListener; import java.util.List; import java.util.Locale; @@ -56,7 +56,8 @@ public class NavigationService extends Service implements LocationEngineListener private LocationValidator locationValidator; private NavigationEngine thread; private Locale locale; - private @NavigationUnitType.UnitType int unitType; + @NavigationUnitType.UnitType + private int unitType; @Nullable @Override diff --git a/libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/navigation/NavigationTelemetry.java b/libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/navigation/NavigationTelemetry.java index b8564ec0028..8e61096f398 100644 --- a/libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/navigation/NavigationTelemetry.java +++ b/libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/navigation/NavigationTelemetry.java @@ -2,10 +2,13 @@ import android.app.Application; import android.content.Context; -import android.content.SharedPreferences; import android.location.Location; import android.support.annotation.NonNull; +import com.mapbox.android.core.location.LocationEngine; +import com.mapbox.android.core.location.LocationEngineListener; +import com.mapbox.android.telemetry.Event; +import com.mapbox.android.telemetry.TelemetryUtils; import com.mapbox.api.directions.v5.models.DirectionsRoute; import com.mapbox.core.constants.Constants; import com.mapbox.core.utils.TextUtils; @@ -24,12 +27,6 @@ import com.mapbox.services.android.navigation.v5.utils.RingBuffer; import com.mapbox.services.android.navigation.v5.utils.RouteUtils; import com.mapbox.services.android.navigation.v5.utils.time.TimeUtils; -import com.mapbox.services.android.telemetry.MapboxEvent; -import com.mapbox.services.android.telemetry.MapboxTelemetry; -import com.mapbox.services.android.telemetry.constants.TelemetryConstants; -import com.mapbox.services.android.telemetry.location.LocationEngine; -import com.mapbox.services.android.telemetry.location.LocationEngineListener; -import com.mapbox.services.android.telemetry.utils.TelemetryUtils; import java.util.ArrayList; import java.util.Arrays; @@ -63,7 +60,6 @@ class NavigationTelemetry implements LocationEngineListener, NavigationMetricLis private RingBuffer locationBuffer; private Date lastRerouteDate; - private String vendorId; private boolean isOffRoute; private boolean isConfigurationChange; @@ -142,23 +138,19 @@ void initialize(@NonNull Context context, @NonNull String accessToken, updateLocationEngine(locationEngine); validateAccessToken(accessToken); + NavigationMetricsWrapper.init(context, accessToken, BuildConfig.MAPBOX_NAVIGATION_EVENTS_USER_AGENT); MapboxNavigationOptions options = navigation.options(); // Set sdkIdentifier based on if from UI or not String sdkIdentifier = updateSdkIdentifier(options); // Enable extra logging in debug mode - MapboxTelemetry.getInstance().setDebugLoggingEnabled(options.isDebugLoggingEnabled()); - - updateUserAgent(context, accessToken, sdkIdentifier); - - // Get the current vendorId - vendorId = obtainVendorId(context); + NavigationMetricsWrapper.enableLogging(); NavigationMetricsWrapper.sdkIdentifier = sdkIdentifier; - NavigationMetricsWrapper.turnstileEvent(); - // TODO This should be removed when we figure out a solution in NavigationTelemetry - // Force pushing a TYPE_MAP_LOAD event to ensure that the Nav turnstile event is sent - MapboxTelemetry.getInstance().pushEvent(MapboxEvent.buildMapLoadEvent()); + Event navTurnstileEvent = NavigationMetricsWrapper.turnstileEvent(); + // TODO Check if we are sending two turnstile events (Maps and Nav) and if so, do we want to track them + // separately? + NavigationMetricsWrapper.push(navTurnstileEvent); isInitialized = true; } @@ -187,7 +179,7 @@ void initializeLifecycleMonitor(Application application) { void startSession(DirectionsRoute directionsRoute) { if (!isConfigurationChange) { navigationSessionState = navigationSessionState.toBuilder() - .sessionIdentifier(TelemetryUtils.buildUUID()) + .sessionIdentifier(TelemetryUtils.obtainUniversalUniqueIdentifier()) .originalDirectionRoute(directionsRoute) .originalRequestIdentifier(directionsRoute.routeOptions().requestUuid()) .requestIdentifier(directionsRoute.routeOptions().requestUuid()) @@ -213,6 +205,7 @@ void endSession(boolean isConfigurationChange) { NavigationMetricsWrapper.cancelEvent(navigationSessionState, metricProgress, metricLocation.getLocation()); } lifecycleMonitor = null; + NavigationMetricsWrapper.disable(); isInitialized = false; } } @@ -346,13 +339,6 @@ private String updateSdkIdentifier(MapboxNavigationOptions options) { return sdkIdentifier; } - private void updateUserAgent(@NonNull Context context, @NonNull String accessToken, String sdkIdentifier) { - String userAgent = String.format("%s/%s", sdkIdentifier, BuildConfig.MAPBOX_NAVIGATION_VERSION_NAME); - MapboxTelemetry.getInstance().initialize(context, accessToken, userAgent, sdkIdentifier, - BuildConfig.MAPBOX_NAVIGATION_VERSION_NAME); - MapboxTelemetry.getInstance().newUserAgent(userAgent); - } - private void flushEventQueues() { for (FeedbackEvent feedbackEvent : queuedFeedbackEvents) { sendFeedbackEvent(feedbackEvent); @@ -362,11 +348,6 @@ private void flushEventQueues() { } } - private String obtainVendorId(Context context) { - SharedPreferences prefs = TelemetryUtils.getSharedPreferences(context.getApplicationContext()); - return prefs.getString(TelemetryConstants.MAPBOX_SHARED_PREFERENCE_KEY_VENDOR_ID, ""); - } - private void updateCurrentLocation(Location rawLocation) { metricLocation = new MetricsLocation(rawLocation); locationBuffer.addLast(rawLocation); @@ -521,7 +502,7 @@ private void sendFeedbackEvent(FeedbackEvent feedbackEvent) { NavigationMetricsWrapper.feedbackEvent(feedbackSessionState, metricProgress, feedbackEvent.getSessionState().eventLocation(), feedbackEvent.getDescription(), - feedbackEvent.getFeedbackType(), feedbackEvent.getScreenshot(), feedbackEvent.getEventId(), vendorId); + feedbackEvent.getFeedbackType(), feedbackEvent.getScreenshot(), feedbackEvent.getFeedbackSource()); } private TelemetryEvent findQueuedTelemetryEvent(String eventId) { diff --git a/libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/navigation/metrics/FeedbackEvent.java b/libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/navigation/metrics/FeedbackEvent.java index 01835efee82..9191cb21a4c 100644 --- a/libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/navigation/metrics/FeedbackEvent.java +++ b/libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/navigation/metrics/FeedbackEvent.java @@ -2,7 +2,7 @@ import android.support.annotation.StringDef; -import com.mapbox.services.android.telemetry.utils.TelemetryUtils; +import com.mapbox.android.telemetry.TelemetryUtils; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -10,7 +10,7 @@ public class FeedbackEvent implements TelemetryEvent { @Retention(RetentionPolicy.SOURCE) - @StringDef({ + @StringDef( { FEEDBACK_TYPE_GENERAL_ISSUE, FEEDBACK_TYPE_OTHER_MAP_ISSUE, FEEDBACK_TYPE_ACCIDENT, @@ -28,7 +28,7 @@ public class FeedbackEvent implements TelemetryEvent { } @Retention(RetentionPolicy.SOURCE) - @StringDef({ + @StringDef( { FEEDBACK_SOURCE_REROUTE, FEEDBACK_SOURCE_UI }) @@ -62,7 +62,7 @@ public FeedbackEvent(SessionState sessionState, @FeedbackSource String feedbackS this.feedbackSessionState = sessionState; this.feedbackSource = feedbackSource; this.feedbackType = FEEDBACK_TYPE_GENERAL_ISSUE; // Default until updated - this.eventId = TelemetryUtils.buildUUID(); + this.eventId = TelemetryUtils.obtainUniversalUniqueIdentifier(); this.screenshot = ""; } diff --git a/libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/navigation/metrics/RerouteEvent.java b/libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/navigation/metrics/RerouteEvent.java index 22273ad8490..27e205ffc21 100644 --- a/libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/navigation/metrics/RerouteEvent.java +++ b/libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/navigation/metrics/RerouteEvent.java @@ -2,7 +2,7 @@ import android.support.annotation.NonNull; -import com.mapbox.services.android.telemetry.utils.TelemetryUtils; +import com.mapbox.android.telemetry.TelemetryUtils; public class RerouteEvent implements TelemetryEvent { @@ -14,7 +14,7 @@ public class RerouteEvent implements TelemetryEvent { public RerouteEvent(SessionState rerouteSessionState) { this.rerouteSessionState = rerouteSessionState; - this.eventId = TelemetryUtils.buildUUID(); + this.eventId = TelemetryUtils.obtainUniversalUniqueIdentifier(); } @Override 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 25897a4310d..21469a701f9 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 @@ -14,7 +14,8 @@ import java.util.List; -import static com.mapbox.services.android.navigation.v5.navigation.NavigationConstants.MINIMUM_BACKUP_DISTANCE_FOR_OFF_ROUTE; +import static com.mapbox.services.android.navigation.v5.navigation.NavigationConstants + .MINIMUM_BACKUP_DISTANCE_FOR_OFF_ROUTE; import static com.mapbox.services.android.navigation.v5.utils.MeasurementUtils.userTrueDistanceFromStep; import static com.mapbox.services.android.navigation.v5.utils.ToleranceUtils.dynamicRerouteDistanceTolerance; 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 7899f2d0e64..bacab9682f7 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 @@ -10,7 +10,7 @@ import com.mapbox.services.android.navigation.v5.routeprogress.RouteLegProgress; import com.mapbox.services.android.navigation.v5.routeprogress.RouteProgress; import com.mapbox.services.android.navigation.v5.routeprogress.RouteStepProgress; -import com.mapbox.services.android.telemetry.utils.MathUtils; +import com.mapbox.services.android.navigation.v5.utils.MathUtils; import com.mapbox.turf.TurfConstants; import com.mapbox.turf.TurfMeasurement; import com.mapbox.turf.TurfMisc; diff --git a/libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/utils/DistanceUtils.java b/libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/utils/DistanceUtils.java index bfac11c6df5..09c5f74282e 100644 --- a/libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/utils/DistanceUtils.java +++ b/libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/utils/DistanceUtils.java @@ -37,8 +37,9 @@ public class DistanceUtils { /** * Creates a DistanceUtils object with information about how to format distances - * @param context from which to get localized strings from - * @param locale for which language and country + * + * @param context from which to get localized strings from + * @param locale for which language and country * @param unitType to use, or NONE_SPECIFIED to use default for locale country */ public DistanceUtils(Context context, @NonNull Locale locale, @NavigationUnitType.UnitType int unitType) { @@ -61,6 +62,7 @@ public DistanceUtils(Context context, @NonNull Locale locale, @NavigationUnitTyp /** * Returns a formatted SpannableString with bold and size formatting. I.e., "10 mi", "350 m" + * * @param distance in meters * @return SpannableString representation which has a bolded number and units which have a * relative size of .65 times the size of the number @@ -83,6 +85,7 @@ public SpannableString formatDistance(double distance) { /** * Returns number rounded to closest fifty, unless the number is less than fifty, then fifty is returned + * * @param distance to round to closest fifty * @return number rounded to closest fifty, or fifty if distance is less than fifty */ @@ -94,7 +97,8 @@ private String roundToClosestFifty(double distance) { /** * Rounds given number to the given decimal place - * @param distance to round + * + * @param distance to round * @param decimalPlace number of decimal places to round * @return distance rounded to given decimal places */ @@ -107,15 +111,16 @@ private String roundToDecimalPlace(double distance, int decimalPlace) { /** * Takes in a distance and units and returns a formatted SpannableString where the number is bold * and the unit is shrunked to .65 times the size + * * @param distance formatted with appropriate decimal places - * @param unit string from TurfConstants. This will be converted to the abbreviated form. + * @param unit string from TurfConstants. This will be converted to the abbreviated form. * @return String with bolded distance and shrunken units */ private SpannableString getDistanceString(String distance, String unit) { SpannableString spannableString = new SpannableString(String.format("%s %s", distance, unitStrings.get(unit))); spannableString.setSpan(new StyleSpan(Typeface.BOLD), 0, distance.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); - spannableString.setSpan(new RelativeSizeSpan(0.65f),distance.length() + 1, + spannableString.setSpan(new RelativeSizeSpan(0.65f), distance.length() + 1, spannableString.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); return spannableString; diff --git a/libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/utils/MathUtils.java b/libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/utils/MathUtils.java new file mode 100644 index 00000000000..4a76cfe5355 --- /dev/null +++ b/libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/utils/MathUtils.java @@ -0,0 +1,80 @@ +package com.mapbox.services.android.navigation.v5.utils; + + +// TODO Check and remove if not necessary +public class MathUtils { + + /** + * Test a value in specified range, returning minimum if it's below, and maximum if it's above + * + * @param value Value to test + * @param min Minimum value of range + * @param max Maximum value of range + * @return value if it's between min and max, min if it's below, max if it's above + */ + public static double clamp(double value, double min, double max) { + return Math.max(min, Math.min(max, value)); + } + + /** + * Test a value in specified range, returning minimum if it's below, and maximum if it's above + * + * @param value Value to test + * @param min Minimum value of range + * @param max Maximum value of range + * @return value if it's between min and max, min if it's below, max if it's above + */ + public static float clamp(float value, float min, float max) { + return Math.max(min, Math.min(max, value)); + } + + /** + * Constrains value to the given range (including min, excluding max) via modular arithmetic. + *

+ * Same formula as used in Core GL (wrap.hpp) + * std::fmod((std::fmod((value - min), d) + d), d) + min; + * + * @param value Value to wrap + * @param min Minimum value + * @param max Maximum value + * @return Wrapped value + */ + public static double wrap(double value, double min, double max) { + double delta = max - min; + + double firstMod = (value - min) % delta; + double secondMod = (firstMod + delta) % delta; + + return secondMod + min; + } + + /** + * Convert bearing from core to match Android SDK value. + * + * @param nativeBearing bearing value coming from core + * @return bearing in degrees starting from 0 rotating clockwise + */ + public static double convertNativeBearing(double nativeBearing) { + double direction = -nativeBearing; + + while (direction > 360) { + direction -= 360; + } + while (direction < 0) { + direction += 360; + } + return direction; + } + + /** + * Returns the smallest angle between two angles. + * + * @param alpha First angle in degrees + * @param beta Second angle in degrees + * @return Smallest angle between two angles. + */ + public static double differenceBetweenAngles(double alpha, double beta) { + double phi = Math.abs(beta - alpha) % 360; + return phi > 180 ? 360 - phi : phi; + } +} diff --git a/libandroid-navigation/src/test/java/com/mapbox/services/android/navigation/v5/navigation/FasterRouteDetectorTest.java b/libandroid-navigation/src/test/java/com/mapbox/services/android/navigation/v5/navigation/FasterRouteDetectorTest.java index eaaa21eac32..b10781d2216 100644 --- a/libandroid-navigation/src/test/java/com/mapbox/services/android/navigation/v5/navigation/FasterRouteDetectorTest.java +++ b/libandroid-navigation/src/test/java/com/mapbox/services/android/navigation/v5/navigation/FasterRouteDetectorTest.java @@ -5,6 +5,7 @@ import com.google.gson.Gson; import com.google.gson.GsonBuilder; +import com.mapbox.android.core.location.LocationEngine; import com.mapbox.api.directions.v5.DirectionsAdapterFactory; import com.mapbox.api.directions.v5.models.DirectionsResponse; import com.mapbox.api.directions.v5.models.DirectionsRoute; @@ -12,7 +13,6 @@ 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.telemetry.location.LocationEngine; import org.junit.Test; diff --git a/libandroid-navigation/src/test/java/com/mapbox/services/android/navigation/v5/navigation/MapboxNavigationTest.java b/libandroid-navigation/src/test/java/com/mapbox/services/android/navigation/v5/navigation/MapboxNavigationTest.java index ec172a64692..65a0bbca3de 100644 --- a/libandroid-navigation/src/test/java/com/mapbox/services/android/navigation/v5/navigation/MapboxNavigationTest.java +++ b/libandroid-navigation/src/test/java/com/mapbox/services/android/navigation/v5/navigation/MapboxNavigationTest.java @@ -2,6 +2,7 @@ import android.content.Context; +import com.mapbox.android.core.location.LocationEngine; import com.mapbox.api.directions.v5.models.DirectionsRoute; import com.mapbox.services.android.navigation.v5.BaseTest; import com.mapbox.services.android.navigation.v5.milestone.Milestone; @@ -11,7 +12,6 @@ import com.mapbox.services.android.navigation.v5.offroute.OffRouteDetector; import com.mapbox.services.android.navigation.v5.snap.Snap; import com.mapbox.services.android.navigation.v5.snap.SnapToRoute; -import com.mapbox.services.android.telemetry.location.LocationEngine; import org.junit.Test; diff --git a/libandroid-navigation/src/test/java/com/mapbox/services/android/navigation/v5/navigation/NavigationEventDispatcherTest.java b/libandroid-navigation/src/test/java/com/mapbox/services/android/navigation/v5/navigation/NavigationEventDispatcherTest.java index 44076a72545..f8568f76ebc 100644 --- a/libandroid-navigation/src/test/java/com/mapbox/services/android/navigation/v5/navigation/NavigationEventDispatcherTest.java +++ b/libandroid-navigation/src/test/java/com/mapbox/services/android/navigation/v5/navigation/NavigationEventDispatcherTest.java @@ -5,6 +5,7 @@ import com.google.gson.Gson; import com.google.gson.GsonBuilder; +import com.mapbox.android.core.location.LocationEngine; import com.mapbox.api.directions.v5.DirectionsAdapterFactory; import com.mapbox.api.directions.v5.models.DirectionsResponse; import com.mapbox.api.directions.v5.models.DirectionsRoute; @@ -18,7 +19,6 @@ import com.mapbox.services.android.navigation.v5.route.FasterRouteListener; import com.mapbox.services.android.navigation.v5.routeprogress.ProgressChangeListener; import com.mapbox.services.android.navigation.v5.routeprogress.RouteProgress; -import com.mapbox.services.android.telemetry.location.LocationEngine; import org.junit.Before; import org.junit.Test; diff --git a/libandroid-navigation/src/test/java/com/mapbox/services/android/navigation/v5/navigation/NavigationHelperTest.java b/libandroid-navigation/src/test/java/com/mapbox/services/android/navigation/v5/navigation/NavigationHelperTest.java index 61b12cfab97..05367d7caa0 100644 --- a/libandroid-navigation/src/test/java/com/mapbox/services/android/navigation/v5/navigation/NavigationHelperTest.java +++ b/libandroid-navigation/src/test/java/com/mapbox/services/android/navigation/v5/navigation/NavigationHelperTest.java @@ -6,6 +6,7 @@ import com.google.gson.Gson; import com.google.gson.GsonBuilder; +import com.mapbox.android.core.location.LocationEngine; import com.mapbox.api.directions.v5.DirectionsAdapterFactory; import com.mapbox.api.directions.v5.models.DirectionsResponse; import com.mapbox.api.directions.v5.models.DirectionsRoute; @@ -27,7 +28,6 @@ import com.mapbox.services.android.navigation.v5.routeprogress.RouteLegProgress; import com.mapbox.services.android.navigation.v5.routeprogress.RouteProgress; import com.mapbox.services.android.navigation.v5.routeprogress.RouteStepProgress; -import com.mapbox.services.android.telemetry.location.LocationEngine; import org.junit.Test; import org.junit.runner.RunWith; 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 ee85676d16e..f576ce5a2ab 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 @@ -3,10 +3,10 @@ import android.content.Context; import android.location.Location; +import com.mapbox.android.core.location.LocationEngine; import com.mapbox.geojson.Point; import com.mapbox.services.android.navigation.v5.BaseTest; import com.mapbox.services.android.navigation.v5.routeprogress.RouteProgress; -import com.mapbox.services.android.telemetry.location.LocationEngine; import org.junit.Before; import org.junit.Test;