Skip to content

Commit b81251a

Browse files
committed
Add CameraPosition option for initializing NavigationView
1 parent 439c501 commit b81251a

File tree

7 files changed

+79
-5
lines changed

7 files changed

+79
-5
lines changed

app/src/main/java/com/mapbox/services/android/navigation/testapp/activity/navigationui/EmbeddedNavigationActivity.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424
import com.mapbox.api.directions.v5.models.DirectionsRoute;
2525
import com.mapbox.geojson.Point;
2626
import com.mapbox.mapboxsdk.Mapbox;
27+
import com.mapbox.mapboxsdk.camera.CameraPosition;
28+
import com.mapbox.mapboxsdk.geometry.LatLng;
2729
import com.mapbox.services.android.navigation.testapp.R;
2830
import com.mapbox.services.android.navigation.ui.v5.NavigationView;
2931
import com.mapbox.services.android.navigation.ui.v5.NavigationViewOptions;
@@ -46,6 +48,7 @@ public class EmbeddedNavigationActivity extends AppCompatActivity implements OnN
4648

4749
private static final Point ORIGIN = Point.fromLngLat(-77.03194990754128, 38.909664963450105);
4850
private static final Point DESTINATION = Point.fromLngLat(-77.0270025730133, 38.91057077063121);
51+
private static final int INITIAL_ZOOM = 16;
4952

5053
private NavigationView navigationView;
5154
private View spacer;
@@ -67,8 +70,12 @@ protected void onCreate(@Nullable Bundle savedInstanceState) {
6770
spacer = findViewById(R.id.spacer);
6871
setSpeedWidgetAnchor(R.id.summaryBottomSheet);
6972

73+
CameraPosition initialPosition = new CameraPosition.Builder()
74+
.target(new LatLng(ORIGIN.latitude(), ORIGIN.longitude()))
75+
.zoom(INITIAL_ZOOM)
76+
.build();
7077
navigationView.onCreate(savedInstanceState);
71-
navigationView.initialize(this);
78+
navigationView.initialize(this, initialPosition);
7279
}
7380

7481
@Override

app/src/main/java/com/mapbox/services/android/navigation/testapp/activity/navigationui/NavigationLauncherActivity.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ public class NavigationLauncherActivity extends AppCompatActivity implements OnM
6565
private static final int CAMERA_ANIMATION_DURATION = 1000;
6666
private static final int DEFAULT_CAMERA_ZOOM = 16;
6767
private static final int CHANGE_SETTING_REQUEST_CODE = 1;
68+
private static final int INITIAL_ZOOM = 16;
6869

6970
private LocationEngine locationEngine;
7071
private NavigationMapRoute mapRoute;
@@ -332,9 +333,12 @@ private void launchNavigationWithRoute() {
332333
NavigationLauncherOptions.Builder optionsBuilder = NavigationLauncherOptions.builder()
333334
.shouldSimulateRoute(getShouldSimulateRouteFromSharedPreferences())
334335
.directionsProfile(getRouteProfileFromSharedPreferences());
335-
336+
CameraPosition initialPosition = new CameraPosition.Builder()
337+
.target(new LatLng(currentLocation.latitude(), currentLocation.longitude()))
338+
.zoom(INITIAL_ZOOM)
339+
.build();
340+
optionsBuilder.initialMapCameraPosition(initialPosition);
336341
optionsBuilder.directionsRoute(route);
337-
338342
NavigationLauncher.startNavigation(this, optionsBuilder.build());
339343
}
340344

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

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,14 @@
22

33
import android.content.SharedPreferences;
44
import android.os.Bundle;
5+
import android.os.Parcelable;
56
import android.preference.PreferenceManager;
67
import android.support.annotation.Nullable;
78
import android.support.v7.app.AppCompatActivity;
89

910
import com.mapbox.api.directions.v5.DirectionsCriteria;
1011
import com.mapbox.api.directions.v5.models.DirectionsRoute;
12+
import com.mapbox.mapboxsdk.camera.CameraPosition;
1113
import com.mapbox.services.android.navigation.ui.v5.listeners.NavigationListener;
1214
import com.mapbox.services.android.navigation.v5.navigation.MapboxNavigationOptions;
1315
import com.mapbox.services.android.navigation.v5.navigation.NavigationConstants;
@@ -29,7 +31,7 @@ protected void onCreate(@Nullable Bundle savedInstanceState) {
2931
setContentView(R.layout.activity_navigation);
3032
navigationView = findViewById(R.id.navigationView);
3133
navigationView.onCreate(savedInstanceState);
32-
navigationView.initialize(this);
34+
initialize();
3335
}
3436

3537
@Override
@@ -116,6 +118,15 @@ public void onNavigationRunning() {
116118
// Intentionally empty
117119
}
118120

121+
private void initialize() {
122+
Parcelable position = getIntent().getParcelableExtra(NavigationConstants.NAVIGATION_VIEW_INITIAL_MAP_POSITION);
123+
if (position != null) {
124+
navigationView.initialize(this, (CameraPosition) position);
125+
} else {
126+
navigationView.initialize(this);
127+
}
128+
}
129+
119130
private void extractRoute(NavigationViewOptions.Builder options) {
120131
DirectionsRoute route = NavigationLauncher.extractRoute(this);
121132
options.directionsRoute(route);

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ public static void startNavigation(Activity activity, NavigationLauncherOptions
4444
editor.apply();
4545

4646
Intent navigationActivity = new Intent(activity, MapboxNavigationActivity.class);
47+
storeInitialMapPosition(options, navigationActivity);
4748
activity.startActivity(navigationActivity);
4849
}
4950

@@ -87,4 +88,12 @@ private static void storeThemePreferences(NavigationLauncherOptions options, Sha
8788
}
8889
}
8990
}
91+
92+
private static void storeInitialMapPosition(NavigationLauncherOptions options, Intent navigationActivity) {
93+
if (options.initialMapCameraPosition() != null) {
94+
navigationActivity.putExtra(
95+
NavigationConstants.NAVIGATION_VIEW_INITIAL_MAP_POSITION, options.initialMapCameraPosition()
96+
);
97+
}
98+
}
9099
}

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
package com.mapbox.services.android.navigation.ui.v5;
22

3+
import android.support.annotation.Nullable;
4+
35
import com.google.auto.value.AutoValue;
46
import com.mapbox.api.directions.v5.DirectionsCriteria;
57
import com.mapbox.api.directions.v5.models.DirectionsRoute;
8+
import com.mapbox.mapboxsdk.camera.CameraPosition;
69

710
@AutoValue
811
public abstract class NavigationLauncherOptions extends NavigationUiOptions {
@@ -11,6 +14,9 @@ public abstract class NavigationLauncherOptions extends NavigationUiOptions {
1114

1215
public abstract boolean snapToRoute();
1316

17+
@Nullable
18+
public abstract CameraPosition initialMapCameraPosition();
19+
1420
@AutoValue.Builder
1521
public abstract static class Builder {
1622

@@ -30,6 +36,8 @@ public abstract static class Builder {
3036

3137
public abstract Builder snapToRoute(boolean snapToRoute);
3238

39+
public abstract Builder initialMapCameraPosition(@Nullable CameraPosition initialMapCameraPosition);
40+
3341
public abstract NavigationLauncherOptions build();
3442
}
3543

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

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import android.content.res.Resources;
1010
import android.location.Location;
1111
import android.os.Bundle;
12+
import android.support.annotation.NonNull;
1213
import android.support.annotation.Nullable;
1314
import android.support.design.widget.BottomSheetBehavior;
1415
import android.support.design.widget.CoordinatorLayout;
@@ -20,6 +21,7 @@
2021
import com.mapbox.api.directions.v5.models.DirectionsRoute;
2122
import com.mapbox.api.directions.v5.models.RouteOptions;
2223
import com.mapbox.geojson.Point;
24+
import com.mapbox.mapboxsdk.camera.CameraPosition;
2325
import com.mapbox.mapboxsdk.constants.MapboxConstants;
2426
import com.mapbox.mapboxsdk.maps.MapView;
2527
import com.mapbox.mapboxsdk.maps.MapboxMap;
@@ -81,6 +83,7 @@ public class NavigationView extends CoordinatorLayout implements LifecycleObserv
8183
private OnNavigationReadyCallback onNavigationReadyCallback;
8284
private NavigationOnCameraTrackingChangedListener onTrackingChangedListener;
8385
private NavigationMapboxMapInstanceState mapInstanceState;
86+
private CameraPosition initialMapCameraPosition;
8487
private boolean isMapInitialized;
8588
private boolean isSubscribed;
8689

@@ -269,6 +272,10 @@ private void initializeNavigationMap(MapView mapView, MapboxMap map) {
269272
navigationMap = new NavigationMapboxMap(mapView, map);
270273
if (mapInstanceState != null) {
271274
navigationMap.restoreFrom(mapInstanceState);
275+
return;
276+
}
277+
if (initialMapCameraPosition != null) {
278+
map.setCameraPosition(initialMapCameraPosition);
272279
}
273280
}
274281

@@ -376,7 +383,7 @@ public void stopNavigation() {
376383
* Should be called after {@link NavigationView#onCreate(Bundle)}.
377384
* <p>
378385
* This method adds the {@link OnNavigationReadyCallback},
379-
* which will fire ready / cancel events for this view.
386+
* which will fire the ready events for this view.
380387
*
381388
* @param onNavigationReadyCallback to be set to this view
382389
*/
@@ -389,6 +396,29 @@ public void initialize(OnNavigationReadyCallback onNavigationReadyCallback) {
389396
}
390397
}
391398

399+
/**
400+
* Should be called after {@link NavigationView#onCreate(Bundle)}.
401+
* <p>
402+
* This method adds the {@link OnNavigationReadyCallback},
403+
* which will fire the ready events for this view.
404+
* <p>
405+
* This method also accepts a {@link CameraPosition} that will be set as soon as the map is
406+
* ready. Note, this position is ignored during rotation in favor of the last know map position.
407+
*
408+
* @param onNavigationReadyCallback to be set to this view
409+
* @param initialMapCameraPosition to be shown once the map is ready
410+
*/
411+
public void initialize(OnNavigationReadyCallback onNavigationReadyCallback,
412+
@NonNull CameraPosition initialMapCameraPosition) {
413+
this.onNavigationReadyCallback = onNavigationReadyCallback;
414+
this.initialMapCameraPosition = initialMapCameraPosition;
415+
if (!isMapInitialized) {
416+
mapView.getMapAsync(this);
417+
} else {
418+
onNavigationReadyCallback.onNavigationReady(navigationViewModel.isRunning());
419+
}
420+
}
421+
392422
/**
393423
* Gives the ability to manipulate the map directly for anything that might not currently be
394424
* supported. This returns null until the view is initialized.

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,11 @@ private NavigationConstants() {
142142
*/
143143
public static final String NAVIGATION_VIEW_DARK_THEME = "navigation_view_dark_theme";
144144

145+
/**
146+
* NavigationLauncher key for storing initial map position in Intent
147+
*/
148+
public static final String NAVIGATION_VIEW_INITIAL_MAP_POSITION = "navigation_view_initial_map_position";
149+
145150
/**
146151
* In seconds, how quickly {@link com.mapbox.services.android.navigation.v5.route.FasterRouteDetector}
147152
* will tell {@link RouteProcessorBackgroundThread} to check

0 commit comments

Comments
 (0)