diff --git a/app/src/main/java/com/mapquest/navigation/sampleapp/activity/NavigationActivity.java b/app/src/main/java/com/mapquest/navigation/sampleapp/activity/NavigationActivity.java index 0f1d61d..e83b16c 100644 --- a/app/src/main/java/com/mapquest/navigation/sampleapp/activity/NavigationActivity.java +++ b/app/src/main/java/com/mapquest/navigation/sampleapp/activity/NavigationActivity.java @@ -40,6 +40,7 @@ import com.mapquest.navigation.NavigationManager; import com.mapquest.navigation.dataclient.listener.TrafficResponseListener; import com.mapquest.navigation.internal.collection.CollectionsUtil; +import com.mapquest.navigation.internal.heading.HeadingManager; import com.mapquest.navigation.internal.logging.AccumulatingLogger; import com.mapquest.navigation.internal.unit.Duration; import com.mapquest.navigation.internal.unit.Speed; @@ -58,6 +59,7 @@ import com.mapquest.navigation.model.Maneuver; import com.mapquest.navigation.model.Route; import com.mapquest.navigation.model.RouteLeg; +import com.mapquest.navigation.model.RouteOptionsBase; import com.mapquest.navigation.model.RouteStoppedReason; import com.mapquest.navigation.model.SpeedLimit; import com.mapquest.navigation.model.SpeedLimitSpan; @@ -127,8 +129,7 @@ public class NavigationActivity extends AppCompatActivity implements LifecycleRe private Marker mClosestRoutePointMarker; private Marker mUserLocationMarker; protected List mGuidancePromptMarkers = new ArrayList<>(); - @Nullable - protected Route mInitialRoute; + protected float mCurrentHeading = -1; private NavigationProgressListener mMapCenteringNavigationProgressListener = new MapCenteringNavigationProgressListener(); protected NavigationStateListener mNavigationStateListener = new UiUpdatingNavigationStateListener(); @@ -137,6 +138,7 @@ public class NavigationActivity extends AppCompatActivity implements LifecycleRe protected TrafficResponseListener mTrafficResponseListener = new UiUpdatingTrafficResponseListener(); protected SpeedLimitSpanListener mSpeedLimitSpanListener = new UiUpdatingSpeedLimitSpanListener(); protected EtaResponseListener mEtaResponseListener = new UiEtaResponseListener(); + private HeadingManager.HeadingListener mHeadingListener = new UiHeadingListener(); @BindView(R.id.map) protected MapView mMap; @@ -209,9 +211,11 @@ protected void centerOnUserLocation() { Log.d(TAG, "centerOnUserLocation() mLastLocationObservation: " + mLastLocationObservation); if (mLastLocationObservation != null) { + double lat = isWalking()? mLastLocationObservation.getRawGpsLocation().getLatitude() : mLastLocationObservation.getSnappedLocation().getLatitude(); + double lng = isWalking()? mLastLocationObservation.getRawGpsLocation().getLatitude() : mLastLocationObservation.getSnappedLocation().getLatitude(); + mMapController.moveCamera(CameraUpdateFactory.newLatLngZoom( - new LatLng(mLastLocationObservation.getSnappedLocation().getLatitude(), - mLastLocationObservation.getSnappedLocation().getLongitude()), + new LatLng(lat,lng), CENTER_ON_USER_ZOOM_LEVEL)); enterFollowMode(); @@ -238,7 +242,7 @@ void handleSkipToNextLegClick() { @BindView(R.id.follow) protected TextView mFollowButton; - private boolean mFollowing; + protected boolean mFollowing; private ProgressDialog mProgressDialog; @@ -273,10 +277,9 @@ public void onMapReady(final MapboxMap mapController) { mMap.setOnTouchListener(new FollowModeExitingMapTouchListener()); setZoomLevel(16); - if (mInitialRoute != null) { - mapRoute(mInitialRoute); + if (mRoute != null) { + mapRoute(mRoute); } - mInitialRoute = null; // bind to our Navigation Service (which provides and manages a NavigationManager instance) mServiceConnection = initializeNavigationService(mRoute); @@ -332,6 +335,14 @@ protected void setZoomLevel(int level) { createUpdatedCameraPositionFromCurrent(level))); } + public boolean isWalking() { + if(mRoute != null){ + return mRoute.getRouteOptions().getRouteType() == RouteOptionsBase.RouteType.PEDESTRIAN; + } + + return false; + } + @Override protected void onStart() { super.onStart(); @@ -479,6 +490,7 @@ private void addNavigationListeners(final NavigationManager manager) { manager.addTrafficResponseListener(mTrafficResponseListener); manager.addAndNotifySpeedLimitSpanListener(mSpeedLimitSpanListener); manager.addEtaResponseListener(mEtaResponseListener); + manager.addHeadingListener(mHeadingListener); } private void removeNavigationListeners() { @@ -488,6 +500,7 @@ private void removeNavigationListeners() { mNavigationManager.removeTrafficResponseListener(mTrafficResponseListener); mNavigationManager.removeSpeedLimitSpanListener(mSpeedLimitSpanListener); mNavigationManager.removeEtaResponseListener(mEtaResponseListener); + mNavigationManager.removeHeadingListener(mHeadingListener); } private String formatTimestampForLocalTimezone(long timestamp) { @@ -578,11 +591,10 @@ protected synchronized void enterFollowMode() { public void run() { Log.d(TAG, "enterFollowMode() delayed runnable; mMapController: " + mMapController + " mLastLocationObservation: " + mLastLocationObservation); if((mMapController != null) && (mLastLocationObservation != null)) { - moveZoomAndTiltMap( - mLastLocationObservation.getSnappedLocation().getLatitude(), - mLastLocationObservation.getSnappedLocation().getLongitude(), - CENTER_ON_USER_ZOOM_LEVEL, FOLLOW_MODE_TILT_VALUE_DEGREES - ); + double lat = isWalking()? mLastLocationObservation.getRawGpsLocation().getLatitude() : mLastLocationObservation.getSnappedLocation().getLatitude(); + double lng = isWalking()? mLastLocationObservation.getRawGpsLocation().getLatitude() : mLastLocationObservation.getSnappedLocation().getLatitude(); + + moveZoomAndTiltMap(lat, lng, CENTER_ON_USER_ZOOM_LEVEL, FOLLOW_MODE_TILT_VALUE_DEGREES); } } }, 600); // do this 600ms later so that mapController and last-location will be non-null @@ -598,11 +610,10 @@ private synchronized void exitFollowMode() { if(mFollowing) { mNavigationManager.removeProgressListener(mMapCenteringNavigationProgressListener); if (mLastLocationObservation != null) { - moveZoomAndTiltMap( - mLastLocationObservation.getSnappedLocation().getLatitude(), - mLastLocationObservation.getSnappedLocation().getLongitude(), - CENTER_ON_USER_ZOOM_LEVEL, 0 - ); + double lat = isWalking()? mLastLocationObservation.getRawGpsLocation().getLatitude() : mLastLocationObservation.getSnappedLocation().getLatitude(); + double lng = isWalking()? mLastLocationObservation.getRawGpsLocation().getLatitude() : mLastLocationObservation.getSnappedLocation().getLatitude(); + + moveZoomAndTiltMap(lat, lng, CENTER_ON_USER_ZOOM_LEVEL, 0); } mFollowButton.setVisibility(View.VISIBLE); mFollowing = false; @@ -620,10 +631,12 @@ protected void clearMarkup() { protected void mapRoute(Route route) { clearMarkup(); if(mMapController == null) { - mInitialRoute = route; return; } + // Update the stored route to the latest route object we map + mRoute = route; + // map all route-leg segments (with path colors based on traffic-conditions) clearRoutePath(); List routeLegs = route.getLegs(); @@ -770,7 +783,7 @@ private void moveZoomAndTiltMap(double latitude, double longitude, double zoom, mMapController.animateCamera(CameraUpdateFactory.newCameraPosition(position)); } - private void animateCamera(double latitude, double longitude, double bearing, double zoom, double tilt) { + protected void animateCamera(double latitude, double longitude, double bearing, double zoom, double tilt) { if(mMapController == null) { return; } @@ -851,7 +864,7 @@ public void onLocationObservationReceived(LocationObservation locationObservatio animateCamera( locationObservation.getRawGpsLocation().getLatitude(), locationObservation.getRawGpsLocation().getLongitude(), - locationObservation.getRawGpsLocation().getBearing(), + (isWalking() && mCurrentHeading != -1)? mCurrentHeading : locationObservation.getRawGpsLocation().getBearing(), CENTER_ON_USER_ZOOM_LEVEL, FOLLOW_MODE_TILT_VALUE_DEGREES); } @@ -933,7 +946,9 @@ private class UiUpdatingNavigationProgressListener implements NavigationProgress public void onLocationObservationReceived(LocationObservation locationObservation) { mLastLocationObservation = locationObservation; updateUserLocationMarker(locationObservation.getRawGpsLocation()); - updateClosestRoutePoint(locationObservation.getSnappedLocation()); + if(!isWalking()){ + updateClosestRoutePoint(locationObservation.getSnappedLocation()); + } updateNextManeuverDistanceLabel( locationObservation.getDistanceToUpcomingManeuver(), mRoute.getRouteOptions().getSystemOfMeasurementForDisplayText(), @@ -1142,4 +1157,17 @@ public boolean onTouch(View view, MotionEvent event) { return false; } } + + public class UiHeadingListener implements HeadingManager.HeadingListener { + + @Override + public void onHeadingChanged(float heading) { + Log.v("Compass", String.format(Locale.getDefault(), "Heading was updated to: %.2f", heading)); + mCurrentHeading = heading; + if(isWalking() && mFollowing){ + animateCamera(mMapController.getCameraPosition().target.getLatitude(), mMapController.getCameraPosition().target.getLongitude(), + heading, mMapController.getCameraPosition().zoom, mMapController.getCameraPosition().tilt); + } + } + } }