Skip to content

Commit 0755105

Browse files
committed
Fix ReplayRouteSession route state
1 parent cc729c4 commit 0755105

File tree

4 files changed

+211
-50
lines changed

4 files changed

+211
-50
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ Mapbox welcomes participation and contributions from everyone.
99
- Fixed an issue where `RouteProgress#VoiceInstructions` could've become `null` when `MapboxNavigation#updateLegIndex` was called. [#6689](https://github.com/mapbox/mapbox-navigation-android/pull/6689)
1010
- Fixed `BannerInstructions` issue where the banner instruction might have been removed from `RouteProgress` at some point around a edge's leg. [#6684](https://github.com/mapbox/mapbox-navigation-android/pull/6684)
1111
- Added `MapboxNavigation#resetTripSession(callback)` and deprecated the counterpart without a callback. [#6685](https://github.com/mapbox/mapbox-navigation-android/pull/6685)
12+
- Fixed issues in `ReplayRouteSession`. The routes observer was never unregistered. Alternative route selection resets replay to the beginning. DropInUi changing portrait and landscape modes resets replay to the beginning. [#6675](https://github.com/mapbox/mapbox-navigation-android/pull/6675)
1213

1314
## Mapbox Navigation SDK 2.10.0-beta.2 - 01 December, 2022
1415
### Changelog

libnavigation-core/src/main/java/com/mapbox/navigation/core/replay/route/ReplayPolylineDecodeStream.kt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,4 +94,15 @@ class ReplayPolylineDecodeStream(
9494
}
9595
return points
9696
}
97+
98+
/**
99+
* Skip the next [count] points of the geometry. Less points are skipped if there are less than
100+
* [count] points left in the iterator.
101+
*
102+
* @param count the number of points to skip.
103+
*/
104+
fun skip(count: Int) {
105+
var skipped = 0
106+
while (skipped++ <= count && hasNext()) { next() }
107+
}
97108
}

libnavigation-core/src/main/java/com/mapbox/navigation/core/replay/route/ReplayRouteSession.kt

Lines changed: 31 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import com.mapbox.android.core.permissions.PermissionsManager
99
import com.mapbox.api.directions.v5.DirectionsCriteria
1010
import com.mapbox.navigation.base.ExperimentalPreviewMapboxNavigationAPI
1111
import com.mapbox.navigation.base.route.NavigationRoute
12+
import com.mapbox.navigation.base.trip.model.RouteProgress
1213
import com.mapbox.navigation.core.MapboxNavigation
1314
import com.mapbox.navigation.core.directions.session.RoutesObserver
1415
import com.mapbox.navigation.core.lifecycle.MapboxNavigationApp
@@ -17,6 +18,7 @@ import com.mapbox.navigation.core.replay.MapboxReplayer
1718
import com.mapbox.navigation.core.replay.history.ReplayEventBase
1819
import com.mapbox.navigation.core.replay.history.ReplayEventUpdateLocation
1920
import com.mapbox.navigation.core.replay.history.ReplayEventsObserver
21+
import com.mapbox.navigation.core.trip.session.RouteProgressObserver
2022
import com.mapbox.navigation.utils.internal.logW
2123
import java.util.Collections
2224

@@ -58,11 +60,23 @@ class ReplayRouteSession : MapboxNavigationObserver {
5860
private lateinit var replayRouteMapper: ReplayRouteMapper
5961
private var mapboxNavigation: MapboxNavigation? = null
6062
private var lastLocationEvent: ReplayEventUpdateLocation? = null
61-
private var routesObserver: RoutesObserver? = null
62-
private var currentRouteId: String? = null
63+
private var currentRoute: NavigationRoute? = null
64+
65+
private val routeProgressObserver = RouteProgressObserver { routeProgress ->
66+
if (currentRoute?.id != routeProgress.navigationRoute.id) {
67+
currentRoute = routeProgress.navigationRoute
68+
onRouteChanged(routeProgress)
69+
}
70+
}
71+
72+
private val routesObserver = RoutesObserver { result ->
73+
if (result.navigationRoutes.isEmpty()) {
74+
mapboxNavigation?.resetReplayLocation()
75+
}
76+
}
6377

6478
private val replayEventsObserver = ReplayEventsObserver { events ->
65-
if (isLastEventPlayed(events)) {
79+
if (currentRoute != null && isLastEventPlayed(events)) {
6680
pushMorePoints()
6781
}
6882
}
@@ -92,17 +106,10 @@ class ReplayRouteSession : MapboxNavigationObserver {
92106
this.mapboxNavigation = mapboxNavigation
93107
mapboxNavigation.stopTripSession()
94108
mapboxNavigation.startReplayTripSession()
95-
96-
routesObserver = RoutesObserver { result ->
97-
if (result.navigationRoutes.isEmpty()) {
98-
currentRouteId = null
99-
mapboxNavigation.resetReplayLocation()
100-
} else if (result.navigationRoutes.first().id != currentRouteId) {
101-
onRouteChanged(result.navigationRoutes.first())
102-
}
103-
}.also { mapboxNavigation.registerRoutesObserver(it) }
109+
mapboxNavigation.registerRouteProgressObserver(routeProgressObserver)
110+
mapboxNavigation.registerRoutesObserver(routesObserver)
104111
mapboxNavigation.mapboxReplayer.registerObserver(replayEventsObserver)
105-
mapboxNavigation.resetReplayLocation()
112+
mapboxNavigation.mapboxReplayer.play()
106113
}
107114

108115
private fun MapboxNavigation.resetReplayLocation() {
@@ -123,14 +130,18 @@ class ReplayRouteSession : MapboxNavigationObserver {
123130
}
124131

125132
override fun onDetached(mapboxNavigation: MapboxNavigation) {
126-
this.mapboxNavigation = null
133+
mapboxNavigation.unregisterRoutesObserver(routesObserver)
134+
mapboxNavigation.unregisterRouteProgressObserver(routeProgressObserver)
127135
mapboxNavigation.mapboxReplayer.unregisterObserver(replayEventsObserver)
128136
mapboxNavigation.mapboxReplayer.stop()
129137
mapboxNavigation.mapboxReplayer.clearEvents()
130138
mapboxNavigation.stopTripSession()
139+
this.mapboxNavigation = null
140+
this.currentRoute = null
131141
}
132142

133-
private fun onRouteChanged(navigationRoute: NavigationRoute) {
143+
private fun onRouteChanged(routeProgress: RouteProgress) {
144+
val navigationRoute = routeProgress.navigationRoute
134145
val mapboxReplayer = mapboxNavigation?.mapboxReplayer ?: return
135146
mapboxReplayer.clearEvents()
136147
mapboxReplayer.play()
@@ -144,9 +155,12 @@ class ReplayRouteSession : MapboxNavigationObserver {
144155
}
145156
return
146157
}
147-
currentRouteId = navigationRoute.id
148158
polylineDecodeStream = ReplayPolylineDecodeStream(geometry, 6)
149-
mapboxNavigation?.resetTripSession()
159+
160+
// Skip up to the current geometry index. There is some imprecision here because the
161+
// distance traveled is not equal to a route index.
162+
polylineDecodeStream.skip(routeProgress.currentRouteGeometryIndex)
163+
150164
pushMorePoints()
151165
}
152166

0 commit comments

Comments
 (0)