Skip to content

Commit 2f58fdb

Browse files
authored
Allow NavigationView to start navigation during existing session (#1655)
1 parent 09eb43a commit 2f58fdb

File tree

4 files changed

+55
-47
lines changed

4 files changed

+55
-47
lines changed

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

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,17 @@ public NavigationViewModel(Application application) {
108108
this.navigation = navigation;
109109
}
110110

111+
// Package private (no modifier) for testing purposes
112+
NavigationViewModel(Application application, MapboxNavigation navigation,
113+
LocationEngineConductor conductor, NavigationViewEventDispatcher dispatcher,
114+
VoiceInstructionCache cache) {
115+
super(application);
116+
this.navigation = navigation;
117+
this.locationEngineConductor = conductor;
118+
this.navigationViewEventDispatcher = dispatcher;
119+
this.voiceInstructionCache = cache;
120+
}
121+
111122
public void onCreate() {
112123
if (!isRunning()) {
113124
locationEngineConductor.onCreate();
@@ -236,11 +247,13 @@ boolean isOffRoute() {
236247

237248
void updateRoute(DirectionsRoute route) {
238249
this.route.setValue(route);
239-
startNavigation(route);
240-
updateSimulatedRoute(route);
250+
if (!isChangingConfigurations) {
251+
startNavigation(route);
252+
locationEngineConductor.updateSimulatedRoute(route);
253+
sendEventOnRerouteAlong(route);
254+
isOffRoute.setValue(false);
255+
}
241256
resetConfigurationFlag();
242-
sendEventOnRerouteAlong(route);
243-
isOffRoute.setValue(false);
244257
}
245258

246259
void sendEventFailedReroute(String errorMessage) {
@@ -497,9 +510,9 @@ private void sendNavigationStatusEvent(boolean isRunning) {
497510
}
498511
}
499512

500-
private void updateSimulatedRoute(DirectionsRoute route) {
501-
if (!isChangingConfigurations) {
502-
locationEngineConductor.updateSimulatedRoute(route);
513+
private void sendEventOnRerouteAlong(DirectionsRoute route) {
514+
if (navigationViewEventDispatcher != null && isOffRoute()) {
515+
navigationViewEventDispatcher.onRerouteAlong(route);
503516
}
504517
}
505518

@@ -509,12 +522,6 @@ private void resetConfigurationFlag() {
509522
}
510523
}
511524

512-
private void sendEventOnRerouteAlong(DirectionsRoute route) {
513-
if (navigationViewEventDispatcher != null && isOffRoute()) {
514-
navigationViewEventDispatcher.onRerouteAlong(route);
515-
}
516-
}
517-
518525
private SpeechAnnouncement retrieveAnnouncementFromSpeechEvent(SpeechAnnouncement announcement) {
519526
if (navigationViewEventDispatcher != null) {
520527
announcement = navigationViewEventDispatcher.onAnnouncement(announcement);
@@ -528,4 +535,4 @@ private BannerInstructions retrieveInstructionsFromBannerEvent(BannerInstruction
528535
}
529536
return instructions;
530537
}
531-
}
538+
}

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

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,7 @@ class NavigationViewRouteEngineListener implements ViewRouteListener {
1515

1616
@Override
1717
public void onRouteUpdate(DirectionsRoute directionsRoute) {
18-
if (!navigationViewModel.isRunning() || navigationViewModel.isOffRoute()) {
19-
navigationViewModel.updateRoute(directionsRoute);
20-
}
18+
navigationViewModel.updateRoute(directionsRoute);
2119
}
2220

2321
@Override

libandroid-navigation-ui/src/test/java/com/mapbox/services/android/navigation/ui/v5/NavigationViewModelTest.java

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,16 @@
22

33
import android.app.Application;
44

5+
import com.mapbox.api.directions.v5.models.DirectionsRoute;
6+
import com.mapbox.services.android.navigation.ui.v5.location.LocationEngineConductor;
57
import com.mapbox.services.android.navigation.v5.navigation.MapboxNavigation;
68

79
import org.junit.Test;
810
import org.junit.runner.RunWith;
911
import org.robolectric.RobolectricTestRunner;
1012

1113
import static org.mockito.Mockito.mock;
14+
import static org.mockito.Mockito.times;
1215
import static org.mockito.Mockito.verify;
1316

1417
@RunWith(RobolectricTestRunner.class)
@@ -35,4 +38,33 @@ public void stopNavigation_milestoneListenersAreRemoved() {
3538

3639
verify(navigation).removeMilestoneEventListener(null);
3740
}
41+
42+
@Test
43+
public void updateRoute_navigationIsNotUpdatedWhenChangingConfigurations() {
44+
Application application = mock(Application.class);
45+
MapboxNavigation navigation = mock(MapboxNavigation.class);
46+
DirectionsRoute route = mock(DirectionsRoute.class);
47+
NavigationViewModel viewModel = new NavigationViewModel(application, navigation);
48+
viewModel.onDestroy(true);
49+
50+
viewModel.updateRoute(route);
51+
52+
verify(navigation, times(0)).startNavigation(route);
53+
}
54+
55+
@Test
56+
public void updateRoute_navigationIsUpdated() {
57+
Application application = mock(Application.class);
58+
MapboxNavigation navigation = mock(MapboxNavigation.class);
59+
LocationEngineConductor conductor = mock(LocationEngineConductor.class);
60+
NavigationViewEventDispatcher dispatcher = mock(NavigationViewEventDispatcher.class);
61+
VoiceInstructionCache cache = mock(VoiceInstructionCache.class);
62+
DirectionsRoute route = mock(DirectionsRoute.class);
63+
NavigationViewModel viewModel = new NavigationViewModel(application, navigation, conductor, dispatcher, cache);
64+
viewModel.isOffRoute.postValue(true);
65+
66+
viewModel.updateRoute(route);
67+
68+
verify(navigation).startNavigation(route);
69+
}
3870
}

libandroid-navigation-ui/src/test/java/com/mapbox/services/android/navigation/ui/v5/NavigationViewRouteEngineListenerTest.java

Lines changed: 1 addition & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,8 @@
1616
public class NavigationViewRouteEngineListenerTest {
1717

1818
@Test
19-
public void checksUpdateRouteCalledIfNavigationIsNotRunning() {
19+
public void onRouteUpdate_checksUpdateRouteCalled() {
2020
NavigationViewModel mockedNavigationViewModel = mock(NavigationViewModel.class);
21-
when(mockedNavigationViewModel.isRunning()).thenReturn(false);
2221
DirectionsRoute aDirectionsRoute = mock(DirectionsRoute.class);
2322
NavigationViewRouteEngineListener theRouteEngineListener
2423
= new NavigationViewRouteEngineListener(mockedNavigationViewModel);
@@ -28,34 +27,6 @@ public void checksUpdateRouteCalledIfNavigationIsNotRunning() {
2827
verify(mockedNavigationViewModel).updateRoute(eq(aDirectionsRoute));
2928
}
3029

31-
@Test
32-
public void checksUpdateRouteCalledIfNavigationIsOffRoute() {
33-
NavigationViewModel mockedNavigationViewModel = mock(NavigationViewModel.class);
34-
when(mockedNavigationViewModel.isRunning()).thenReturn(true);
35-
when(mockedNavigationViewModel.isOffRoute()).thenReturn(true);
36-
DirectionsRoute aDirectionsRoute = mock(DirectionsRoute.class);
37-
NavigationViewRouteEngineListener theRouteEngineListener
38-
= new NavigationViewRouteEngineListener(mockedNavigationViewModel);
39-
40-
theRouteEngineListener.onRouteUpdate(aDirectionsRoute);
41-
42-
verify(mockedNavigationViewModel).updateRoute(eq(aDirectionsRoute));
43-
}
44-
45-
@Test
46-
public void checksUpdateRouteNotCalledIfNavigationIsRunningAndIsNotOffRoute() {
47-
NavigationViewModel mockedNavigationViewModel = mock(NavigationViewModel.class);
48-
when(mockedNavigationViewModel.isRunning()).thenReturn(true);
49-
when(mockedNavigationViewModel.isOffRoute()).thenReturn(false);
50-
DirectionsRoute aDirectionsRoute = mock(DirectionsRoute.class);
51-
NavigationViewRouteEngineListener theRouteEngineListener
52-
= new NavigationViewRouteEngineListener(mockedNavigationViewModel);
53-
54-
theRouteEngineListener.onRouteUpdate(aDirectionsRoute);
55-
56-
verify(mockedNavigationViewModel, times(0)).updateRoute(eq(aDirectionsRoute));
57-
}
58-
5930
@Test
6031
public void checksSendEventFailedRerouteCalledIfNavigationIsOffRoute() {
6132
NavigationViewModel mockedNavigationViewModel = mock(NavigationViewModel.class);

0 commit comments

Comments
 (0)