diff --git a/libnavigation-core/src/main/java/com/mapbox/navigation/core/MapboxNavigation.kt b/libnavigation-core/src/main/java/com/mapbox/navigation/core/MapboxNavigation.kt index 4e8592ed3ec..db2371b6993 100644 --- a/libnavigation-core/src/main/java/com/mapbox/navigation/core/MapboxNavigation.kt +++ b/libnavigation-core/src/main/java/com/mapbox/navigation/core/MapboxNavigation.kt @@ -650,7 +650,7 @@ class MapboxNavigation @VisibleForTesting internal constructor( fun stopTripSession() { runIfNotDestroyed { latestLegIndex = tripSession.getRouteProgress()?.currentLegProgress?.legIndex - tripSession.stop() + tripSession.stop(true) } } @@ -1216,7 +1216,7 @@ class MapboxNavigation @VisibleForTesting internal constructor( billingController.onDestroy() directionsSession.shutdown() directionsSession.unregisterAllRoutesObservers() - tripSession.stop() + tripSession.stop(true) tripSession.unregisterAllLocationObservers() tripSession.unregisterAllRouteProgressObservers() tripSession.unregisterAllOffRouteObservers() @@ -2010,7 +2010,7 @@ class MapboxNavigation @VisibleForTesting internal constructor( channel, { notificationAction -> when (notificationAction) { - NotificationAction.END_NAVIGATION -> tripSession.stop() + NotificationAction.END_NAVIGATION -> tripSession.stop(true) } } ) diff --git a/libnavigation-core/src/main/java/com/mapbox/navigation/core/trip/session/MapboxTripSession.kt b/libnavigation-core/src/main/java/com/mapbox/navigation/core/trip/session/MapboxTripSession.kt index 30f62c9e4d2..7bb6160089e 100644 --- a/libnavigation-core/src/main/java/com/mapbox/navigation/core/trip/session/MapboxTripSession.kt +++ b/libnavigation-core/src/main/java/com/mapbox/navigation/core/trip/session/MapboxTripSession.kt @@ -324,6 +324,7 @@ internal class MapboxTripSession( override fun start(withTripService: Boolean, withReplayEnabled: Boolean) { if (state != TripSessionState.STARTED) { navigator.addNavigatorObserver(navigatorObserver) + navigator.startTripSession() if (withTripService) { tripService.startService() } @@ -359,10 +360,11 @@ internal class MapboxTripSession( /** * Stop MapboxTripSession */ - override fun stop() { + override fun stop(canceled: Boolean) { if (state == TripSessionState.STOPPED) { return } + navigator.stopTripSession(canceled) navigator.removeNavigatorObserver(navigatorObserver) tripService.stopService() tripSessionLocationEngine.stopLocationUpdates() diff --git a/libnavigation-core/src/main/java/com/mapbox/navigation/core/trip/session/TripSession.kt b/libnavigation-core/src/main/java/com/mapbox/navigation/core/trip/session/TripSession.kt index 4600fb7f36e..0898040fcc4 100644 --- a/libnavigation-core/src/main/java/com/mapbox/navigation/core/trip/session/TripSession.kt +++ b/libnavigation-core/src/main/java/com/mapbox/navigation/core/trip/session/TripSession.kt @@ -23,7 +23,7 @@ internal interface TripSession { fun getState(): TripSessionState fun start(withTripService: Boolean, withReplayEnabled: Boolean = false) - fun stop() + fun stop(canceled: Boolean) fun isRunningWithForegroundService(): Boolean fun registerLocationObserver(locationObserver: LocationObserver) diff --git a/libnavigation-core/src/test/java/com/mapbox/navigation/core/MapboxNavigationTest.kt b/libnavigation-core/src/test/java/com/mapbox/navigation/core/MapboxNavigationTest.kt index c0730acc237..ca0c8bb2cf6 100644 --- a/libnavigation-core/src/test/java/com/mapbox/navigation/core/MapboxNavigationTest.kt +++ b/libnavigation-core/src/test/java/com/mapbox/navigation/core/MapboxNavigationTest.kt @@ -332,7 +332,7 @@ internal class MapboxNavigationTest : MapboxNavigationBaseTest() { createMapboxNavigation() mapboxNavigation.onDestroy() - verify(exactly = 1) { tripSession.stop() } + verify(exactly = 1) { tripSession.stop(true) } } @Test @@ -425,7 +425,7 @@ internal class MapboxNavigationTest : MapboxNavigationBaseTest() { mapboxNavigation.onDestroy() verifyOrder { - tripSession.stop() + tripSession.stop(true) MapboxNavigationTelemetry.destroy(mapboxNavigation) } } @@ -1289,7 +1289,7 @@ internal class MapboxNavigationTest : MapboxNavigationBaseTest() { withTripService = true, withReplayEnabled = false ) - tripSession.stop() + tripSession.stop(true) tripSession.unregisterAllStateObservers() } } diff --git a/libnavigation-core/src/test/java/com/mapbox/navigation/core/trip/session/MapboxTripSessionNoSetupTest.kt b/libnavigation-core/src/test/java/com/mapbox/navigation/core/trip/session/MapboxTripSessionNoSetupTest.kt index 5f103b64948..76b965ec808 100644 --- a/libnavigation-core/src/test/java/com/mapbox/navigation/core/trip/session/MapboxTripSessionNoSetupTest.kt +++ b/libnavigation-core/src/test/java/com/mapbox/navigation/core/trip/session/MapboxTripSessionNoSetupTest.kt @@ -350,7 +350,7 @@ class MapboxTripSessionNoSetupTest { ) tripSession.start(false) - tripSession.stop() + tripSession.stop(true) testLocationEngine.updateLocation(createLocation()) assertNull(tripSession.getRawLocation()) diff --git a/libnavigation-core/src/test/java/com/mapbox/navigation/core/trip/session/MapboxTripSessionTest.kt b/libnavigation-core/src/test/java/com/mapbox/navigation/core/trip/session/MapboxTripSessionTest.kt index f246a33084a..c75ebd94c9f 100644 --- a/libnavigation-core/src/test/java/com/mapbox/navigation/core/trip/session/MapboxTripSessionTest.kt +++ b/libnavigation-core/src/test/java/com/mapbox/navigation/core/trip/session/MapboxTripSessionTest.kt @@ -219,7 +219,7 @@ class MapboxTripSessionTest { verify { tripService.startService() } verify { tripSessionLocationEngine.startLocationUpdates(any(), any()) } - tripSession.stop() + tripSession.stop(true) } @Test @@ -232,7 +232,7 @@ class MapboxTripSessionTest { verify(exactly = 0) { tripService.startService() } verify { tripSessionLocationEngine.startLocationUpdates(any(), any()) } - tripSession.stop() + tripSession.stop(true) } @Test @@ -241,15 +241,17 @@ class MapboxTripSessionTest { tripSession.start(false) every { tripService.hasServiceStarted() } returns true assertTrue(tripSession.isRunningWithForegroundService()) - tripSession.stop() + tripSession.stop(true) verifyOrder { navigator.addNavigatorObserver(any()) + navigator.startTripSession() tripService.startService() tripSessionLocationEngine.startLocationUpdates(any(), any()) tripSessionLocationEngine.startLocationUpdates(any(), any()) + navigator.stopTripSession(true) navigator.removeNavigatorObserver(any()) - tripSession.stop() + tripSession.stop(true) tripSessionLocationEngine.stopLocationUpdates() } } @@ -259,7 +261,7 @@ class MapboxTripSessionTest { tripSession.start(true, withReplayEnabled = false) tripSession.start(true, withReplayEnabled = true) tripSession.start(true, withReplayEnabled = false) - tripSession.stop() + tripSession.stop(true) verifyOrder { navigator.addNavigatorObserver(any()) @@ -268,7 +270,7 @@ class MapboxTripSessionTest { tripSessionLocationEngine.startLocationUpdates(true, any()) tripSessionLocationEngine.startLocationUpdates(false, any()) navigator.removeNavigatorObserver(any()) - tripSession.stop() + tripSession.stop(true) tripSessionLocationEngine.stopLocationUpdates() } } @@ -277,7 +279,7 @@ class MapboxTripSessionTest { fun stopSessionCallsTripServiceStopService() { tripSession.start(true) - tripSession.stop() + tripSession.stop(true) verify { tripService.stopService() } } @@ -287,7 +289,7 @@ class MapboxTripSessionTest { tripSession.start(true) locationUpdateAnswers.invoke(location) - tripSession.stop() + tripSession.stop(true) verify { tripSessionLocationEngine.stopLocationUpdates() } } @@ -297,7 +299,7 @@ class MapboxTripSessionTest { tripSession.setRoutes(routes, setRoutesInfo) tripSession.start(true) - tripSession.stop() + tripSession.stop(true) assertEquals(routes.first(), tripSession.primaryRoute) } @@ -310,7 +312,7 @@ class MapboxTripSessionTest { emptyList(), SetRoutes.CleanUp ) - tripSession.stop() + tripSession.stop(true) coVerify(exactly = 1) { navigator.removeNavigatorObserver(navigatorObserverImplSlot.captured) @@ -328,7 +330,7 @@ class MapboxTripSessionTest { verify { observer.onNewRawLocation(location) } assertEquals(location, tripSession.getRawLocation()) - tripSession.stop() + tripSession.stop(true) } @Test @@ -341,7 +343,7 @@ class MapboxTripSessionTest { verify { observer.onNewRawLocation(location) } assertEquals(location, tripSession.getRawLocation()) - tripSession.stop() + tripSession.stop(true) } @Test @@ -354,7 +356,7 @@ class MapboxTripSessionTest { verify { observer.onNewRawLocation(location) } - tripSession.stop() + tripSession.stop(true) } @Test @@ -369,7 +371,7 @@ class MapboxTripSessionTest { observer.onNewLocationMatcherResult(any()) } - tripSession.stop() + tripSession.stop(true) } @Test @@ -377,7 +379,7 @@ class MapboxTripSessionTest { tripSession.start(true) updateLocationAndJoin() coVerify { navigator.updateLocation(fixLocation) } - tripSession.stop() + tripSession.stop(true) } @Test @@ -387,7 +389,7 @@ class MapboxTripSessionTest { locationUpdateAnswers.invoke(mockLocation()) updateLocationAndJoin() coVerify { navigator.updateLocation(fixLocation) } - tripSession.stop() + tripSession.stop(true) } @Test @@ -401,7 +403,7 @@ class MapboxTripSessionTest { verify { observer.onRouteProgressChanged(routeProgress) } assertEquals(routeProgress, tripSession.getRouteProgress()) - tripSession.stop() + tripSession.stop(true) } @Test @@ -415,7 +417,7 @@ class MapboxTripSessionTest { verify(exactly = 0) { observer.onRouteProgressChanged(routeProgress) } assertNull(tripSession.getRouteProgress()) - tripSession.stop() + tripSession.stop(true) } @Test @@ -428,7 +430,7 @@ class MapboxTripSessionTest { verify(exactly = 1) { observer.onRouteProgressChanged(routeProgress) } assertEquals(routeProgress, tripSession.getRouteProgress()) - tripSession.stop() + tripSession.stop(true) } @Test @@ -446,7 +448,7 @@ class MapboxTripSessionTest { verify(exactly = 0) { observer.onRouteProgressChanged(routeProgress) } assertEquals(null, tripSession.getRouteProgress()) - tripSession.stop() + tripSession.stop(true) } @Test @@ -459,7 +461,7 @@ class MapboxTripSessionTest { updateLocationAndJoin() verify(exactly = 0) { observer.onRouteProgressChanged(routeProgress) } - tripSession.stop() + tripSession.stop(true) } @Test @@ -474,7 +476,7 @@ class MapboxTripSessionTest { tripSession.registerRouteProgressObserver(observer) verify(exactly = 2) { observer.onRouteProgressChanged(routeProgress) } - tripSession.stop() + tripSession.stop(true) } @Test @@ -494,7 +496,7 @@ class MapboxTripSessionTest { offRouteObserver.onOffRouteStateChanged(false) offRouteObserver.onOffRouteStateChanged(true) } - tripSession.stop() + tripSession.stop(true) } @Test @@ -508,7 +510,7 @@ class MapboxTripSessionTest { verify(exactly = 1) { offRouteObserver.onOffRouteStateChanged(false) } verify(exactly = 0) { offRouteObserver.onOffRouteStateChanged(true) } - tripSession.stop() + tripSession.stop(true) } @Test @@ -537,7 +539,7 @@ class MapboxTripSessionTest { offRouteObserver.onOffRouteStateChanged(true) offRouteObserver.onOffRouteStateChanged(false) } - tripSession.stop() + tripSession.stop(true) } @Test @@ -566,7 +568,7 @@ class MapboxTripSessionTest { offRouteObserver.onOffRouteStateChanged(true) offRouteObserver.onOffRouteStateChanged(false) } - tripSession.stop() + tripSession.stop(true) } @Test @@ -584,7 +586,7 @@ class MapboxTripSessionTest { updateLocationAndJoin() - tripSession.stop() + tripSession.stop(true) verify(exactly = 0) { bannerInstructionsObserver.onNewBannerInstructions(any()) } } @@ -908,7 +910,7 @@ class MapboxTripSessionTest { fun stateObserverStop() { tripSession.start(true) tripSession.registerStateObserver(stateObserver) - tripSession.stop() + tripSession.stop(true) verify(exactly = 1) { stateObserver.onSessionStateChanged(TripSessionState.STOPPED) } } @@ -924,8 +926,8 @@ class MapboxTripSessionTest { fun stateObserverDoubleStop() { tripSession.start(true) tripSession.registerStateObserver(stateObserver) - tripSession.stop() - tripSession.stop() + tripSession.stop(true) + tripSession.stop(true) verify(exactly = 1) { stateObserver.onSessionStateChanged(TripSessionState.STOPPED) } } @@ -935,7 +937,7 @@ class MapboxTripSessionTest { clearMocks(stateObserver) tripSession.unregisterStateObserver(stateObserver) tripSession.start(true) - tripSession.stop() + tripSession.stop(true) verify(exactly = 0) { stateObserver.onSessionStateChanged(any()) } } @@ -957,7 +959,7 @@ class MapboxTripSessionTest { } assertEquals(location, tripSession.getRawLocation()) - tripSession.stop() + tripSession.stop(true) } @Test @@ -971,7 +973,7 @@ class MapboxTripSessionTest { verify(exactly = 0) { routeProgressObserver.onRouteProgressChanged(any()) } - tripSession.stop() + tripSession.stop(true) } @Test @@ -992,7 +994,7 @@ class MapboxTripSessionTest { // of offRouteObservers should be empty. verify(exactly = 1) { offRouteObserver.onOffRouteStateChanged(false) } - tripSession.stop() + tripSession.stop(true) } @Test @@ -1001,7 +1003,7 @@ class MapboxTripSessionTest { clearMocks(stateObserver) tripSession.unregisterAllStateObservers() - tripSession.stop() + tripSession.stop(true) verify(exactly = 0) { stateObserver.onSessionStateChanged(any()) } } @@ -1017,7 +1019,7 @@ class MapboxTripSessionTest { tripSession.registerBannerInstructionsObserver(bannerInstructionsObserver) tripSession.unregisterAllBannerInstructionsObservers() updateLocationAndJoin() - tripSession.stop() + tripSession.stop(true) verify(exactly = 0) { bannerInstructionsObserver.onNewBannerInstructions(any()) } } @@ -1036,7 +1038,7 @@ class MapboxTripSessionTest { updateLocationAndJoin() - tripSession.stop() + tripSession.stop(true) tripSession.start(true) tripSession.unregisterAllVoiceInstructionsObservers() @@ -1045,7 +1047,7 @@ class MapboxTripSessionTest { verify(exactly = 1) { voiceInstructionsObserver.onNewVoiceInstructions(any()) } - tripSession.stop() + tripSession.stop(true) } @Test @@ -1191,7 +1193,7 @@ class MapboxTripSessionTest { verify(exactly = 1) { observer.onNewLocationMatcherResult(locationMatcherResult) } assertEquals(location, tripSession.locationMatcherResult?.enhancedLocation) - tripSession.stop() + tripSession.stop(true) } @Test @@ -1204,7 +1206,7 @@ class MapboxTripSessionTest { verify(exactly = 1) { observer.onNewLocationMatcherResult(locationMatcherResult) } assertEquals(location, tripSession.locationMatcherResult?.enhancedLocation) - tripSession.stop() + tripSession.stop(true) } @Test @@ -1212,7 +1214,7 @@ class MapboxTripSessionTest { tripSession = buildTripSession() tripSession.start(true) updateLocationAndJoin() - tripSession.stop() + tripSession.stop(true) val observer: LocationObserver = mockk(relaxUnitFun = true) tripSession.registerLocationObserver(observer) @@ -1228,7 +1230,7 @@ class MapboxTripSessionTest { tripSession.registerEHorizonObserver(observer) verify(exactly = 1) { eHorizonSubscriptionManager.registerObserver(observer) } - tripSession.stop() + tripSession.stop(true) } @Test @@ -1240,7 +1242,7 @@ class MapboxTripSessionTest { tripSession.unregisterEHorizonObserver(observer) verify(exactly = 1) { eHorizonSubscriptionManager.unregisterObserver(observer) } - tripSession.stop() + tripSession.stop(true) } @Test @@ -1251,7 +1253,7 @@ class MapboxTripSessionTest { tripSession.unregisterAllEHorizonObservers() verify(exactly = 1) { eHorizonSubscriptionManager.unregisterAllObservers() } - tripSession.stop() + tripSession.stop(true) } @Test @@ -1262,7 +1264,7 @@ class MapboxTripSessionTest { navigatorRecreationObserverImplSlot.captured.onNativeNavigatorRecreated() verify(exactly = 2) { navigator.addNavigatorObserver(any()) } - tripSession.stop() + tripSession.stop(true) } @Test @@ -1612,7 +1614,7 @@ class MapboxTripSessionTest { tripSession.start(withTripService = true) every { navigationStatus.layer } returns 3 navigatorObserverImplSlot.captured.onStatus(navigationStatusOrigin, navigationStatus) - tripSession.stop() + tripSession.stop(true) assertNull(tripSession.zLevel) } diff --git a/libnavigator/src/main/java/com/mapbox/navigation/navigator/internal/MapboxNativeNavigator.kt b/libnavigator/src/main/java/com/mapbox/navigation/navigator/internal/MapboxNativeNavigator.kt index f18b74fbeb8..e7544423b3f 100644 --- a/libnavigator/src/main/java/com/mapbox/navigation/navigator/internal/MapboxNativeNavigator.kt +++ b/libnavigator/src/main/java/com/mapbox/navigation/navigator/internal/MapboxNativeNavigator.kt @@ -28,6 +28,7 @@ import com.mapbox.navigator.RouterInterface import com.mapbox.navigator.SetRoutesReason import com.mapbox.navigator.SetRoutesResult import com.mapbox.navigator.TilesConfig +import com.mapbox.navigator.TripSessionState /** * Provides API to work with native Navigator class. Exposed for internal usage only. @@ -73,6 +74,14 @@ interface MapboxNativeNavigator { fun removeNavigatorObserver(navigatorObserver: NavigatorObserver) + fun startTripSession() + + fun stopTripSession(canceled: Boolean) + + fun storeTripSession(): TripSessionState + + fun restoreTripSession(tripSessionState: TripSessionState) + // Routing suspend fun setRoutes( primaryRoute: NavigationRoute?, diff --git a/libnavigator/src/main/java/com/mapbox/navigation/navigator/internal/MapboxNativeNavigatorImpl.kt b/libnavigator/src/main/java/com/mapbox/navigation/navigator/internal/MapboxNativeNavigatorImpl.kt index 31e79d29c65..44bd2eff957 100644 --- a/libnavigator/src/main/java/com/mapbox/navigation/navigator/internal/MapboxNativeNavigatorImpl.kt +++ b/libnavigator/src/main/java/com/mapbox/navigation/navigator/internal/MapboxNativeNavigatorImpl.kt @@ -44,6 +44,7 @@ import com.mapbox.navigator.SetRoutesParams import com.mapbox.navigator.SetRoutesReason import com.mapbox.navigator.SetRoutesResult import com.mapbox.navigator.TilesConfig +import com.mapbox.navigator.TripSessionState import kotlinx.coroutines.suspendCancellableCoroutine import kotlinx.coroutines.withContext import java.util.concurrent.CopyOnWriteArraySet @@ -115,7 +116,9 @@ object MapboxNativeNavigatorImpl : MapboxNativeNavigator { accessToken: String, router: RouterInterface, ) { + val storedSessionState = navigator!!.storeTripSession() create(config, historyRecorderComposite, tilesConfig, accessToken, router) + navigator!!.restoreTripSession(storedSessionState) nativeNavigatorRecreationObservers.forEach { it.onNativeNavigatorRecreated() } @@ -147,6 +150,23 @@ object MapboxNativeNavigatorImpl : MapboxNativeNavigator { override fun removeNavigatorObserver(navigatorObserver: NavigatorObserver) = navigator!!.removeObserver(navigatorObserver) + // Session + + override fun startTripSession() { + navigator!!.startTripSession() + } + + override fun stopTripSession(canceled: Boolean) { + navigator!!.stopTripSession(canceled) + } + + override fun storeTripSession(): TripSessionState = + navigator!!.storeTripSession() + + override fun restoreTripSession(tripSessionState: TripSessionState) { + navigator!!.restoreTripSession(tripSessionState) + } + // Routing override suspend fun setRoutes(