Skip to content

Commit 26cb478

Browse files
dzinadgithub-actions[bot]
authored andcommitted
NAVAND-5544: add an ability to overview alternatives
GitOrigin-RevId: 85762b3989ea7f864ab3a58e5ca7ebdf6db7e1c7
1 parent 3b75fc2 commit 26cb478

10 files changed

Lines changed: 713 additions & 159 deletions

File tree

base/src/main/java/com/mapbox/navigation/base/internal/utils/DirectionsRouteEx.kt

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,14 @@
22

33
package com.mapbox.navigation.base.internal.utils
44

5+
import androidx.annotation.RestrictTo
56
import com.google.gson.JsonElement
67
import com.google.gson.JsonParser
78
import com.mapbox.api.directions.v5.models.DirectionsRoute
89
import com.mapbox.api.directions.v5.models.LegStep
910
import com.mapbox.navigation.base.internal.route.TimeZone
1011
import com.mapbox.navigation.base.internal.route.Waypoint
12+
import com.mapbox.navigation.base.route.NavigationRoute
1113
import com.mapbox.navigation.base.utils.ifNonNull
1214
import com.mapbox.navigation.utils.internal.logE
1315

@@ -36,6 +38,19 @@ fun DirectionsRoute.isSameRoute(compare: DirectionsRoute?): Boolean {
3638
return false
3739
}
3840

41+
@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
42+
fun areSameRoutes(routes1: List<NavigationRoute>, routes2: List<NavigationRoute>): Boolean {
43+
if (routes1.size != routes2.size) {
44+
return false
45+
}
46+
for (i in routes1.indices) {
47+
if (!routes1[i].directionsRoute.isSameRoute(routes2[i].directionsRoute)) {
48+
return false
49+
}
50+
}
51+
return true
52+
}
53+
3954
private fun DirectionsRoute.stepsNamesAsString(): String? =
4055
this.legs()
4156
?.joinToString { leg ->

base/src/test/java/com/mapbox/navigation/base/internal/utils/DirectionsRouteExTest.kt

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import com.google.gson.JsonPrimitive
77
import com.mapbox.api.directions.v5.models.DirectionsRoute
88
import com.mapbox.api.directions.v5.models.LegStep
99
import com.mapbox.api.directions.v5.models.RouteLeg
10+
import com.mapbox.navigation.base.route.NavigationRoute
1011
import com.mapbox.navigation.testing.LoggingFrontendTestRule
1112
import com.mapbox.navigator.Waypoint
1213
import com.mapbox.navigator.WaypointType
@@ -96,6 +97,91 @@ class DirectionsRouteExTest {
9697
}
9798
}
9899

100+
@Test
101+
fun areSameRoutes() {
102+
val geometry1 = "aaabbb"
103+
val geometry2 = "cccddd"
104+
val directionsRoute1 = mockk<DirectionsRoute>(relaxed = true) {
105+
every { geometry() } returns geometry1
106+
}
107+
val directionsRoute2 = mockk<DirectionsRoute>(relaxed = true) {
108+
every { geometry() } returns geometry2
109+
}
110+
val directionsRoute1Same = mockk<DirectionsRoute>(relaxed = true) {
111+
every { geometry() } returns geometry1
112+
}
113+
val directionsRoute2Same = mockk<DirectionsRoute>(relaxed = true) {
114+
every { geometry() } returns geometry2
115+
}
116+
val directionsRoute3 = mockk<DirectionsRoute>(relaxed = true)
117+
val directionsRoute4 = mockk<DirectionsRoute>(relaxed = true)
118+
119+
val navigationRoute1 = mockk<NavigationRoute>() {
120+
every { directionsRoute } returns directionsRoute1
121+
}
122+
val navigationRoute2 = mockk<NavigationRoute>() {
123+
every { directionsRoute } returns directionsRoute2
124+
}
125+
val navigationRoute1Same = mockk<NavigationRoute>() {
126+
every { directionsRoute } returns directionsRoute1Same
127+
}
128+
val navigationRoute2Same = mockk<NavigationRoute>() {
129+
every { directionsRoute } returns directionsRoute2Same
130+
}
131+
val navigationRoute3 = mockk<NavigationRoute>() {
132+
every { directionsRoute } returns directionsRoute3
133+
}
134+
val navigationRoute4 = mockk<NavigationRoute>() {
135+
every { directionsRoute } returns directionsRoute4
136+
}
137+
val items = listOf(
138+
Triple(
139+
emptyList<NavigationRoute>(),
140+
emptyList<NavigationRoute>(),
141+
true,
142+
),
143+
Triple(
144+
emptyList<NavigationRoute>(),
145+
listOf(navigationRoute1),
146+
false,
147+
),
148+
Triple(
149+
listOf(navigationRoute1),
150+
emptyList<NavigationRoute>(),
151+
false,
152+
),
153+
Triple(
154+
listOf(navigationRoute1, navigationRoute2),
155+
listOf(navigationRoute1),
156+
false,
157+
),
158+
Triple(
159+
listOf(navigationRoute1, navigationRoute2),
160+
listOf(navigationRoute1, navigationRoute2),
161+
true,
162+
),
163+
Triple(
164+
listOf(navigationRoute1, navigationRoute2),
165+
listOf(navigationRoute1Same, navigationRoute2Same),
166+
true,
167+
),
168+
Triple(
169+
listOf(navigationRoute1, navigationRoute2),
170+
listOf(navigationRoute3, navigationRoute4),
171+
false,
172+
),
173+
Triple(
174+
listOf(navigationRoute1, navigationRoute2),
175+
listOf(navigationRoute2, navigationRoute1),
176+
false,
177+
),
178+
)
179+
180+
items.forEach { (list1, list2, expected) ->
181+
assertEquals(expected, areSameRoutes(list1, list2))
182+
}
183+
}
184+
99185
@Test
100186
fun waypointsMapToSdk_type() {
101187
val nativeWaypoints = listOf(

ui-maps/src/main/java/com/mapbox/navigation/ui/maps/camera/data/MapboxNavigationViewportDataSource.kt

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import com.mapbox.maps.ScreenBox
1717
import com.mapbox.maps.toCameraOptions
1818
import com.mapbox.maps.util.isEmpty
1919
import com.mapbox.navigation.base.ExperimentalPreviewMapboxNavigationAPI
20+
import com.mapbox.navigation.base.internal.utils.areSameRoutes
2021
import com.mapbox.navigation.base.internal.utils.isSameRoute
2122
import com.mapbox.navigation.base.route.NavigationRoute
2223
import com.mapbox.navigation.base.trip.model.RouteProgress
@@ -227,6 +228,7 @@ class MapboxNavigationViewportDataSource private constructor(
227228
InternalViewportDataSourceOptions(
228229
ignoreMinZoomWhenFramingManeuver = false,
229230
overviewMode = OverviewMode.ACTIVE_LEG,
231+
overviewAlternatives = false,
230232
),
231233
),
232234
)
@@ -266,7 +268,9 @@ class MapboxNavigationViewportDataSource private constructor(
266268
overviewViewportDataSource.debugger = value
267269
}
268270

269-
private var navigationRoute: NavigationRoute? = null
271+
private var navigationRoutes: List<NavigationRoute> = emptyList()
272+
private val navigationRoute: NavigationRoute?
273+
get() = navigationRoutes.firstOrNull()
270274
private var routeProgress: RouteProgress? = null
271275
private var postManeuverFramingPoints: List<List<List<Point>>> = emptyList()
272276
private var pointsToFrameOnCurrentStep: List<Point> = emptyList()
@@ -413,10 +417,16 @@ class MapboxNavigationViewportDataSource private constructor(
413417
* @see [evaluate]
414418
*/
415419
fun onRouteChanged(route: NavigationRoute) {
416-
if (!route.directionsRoute.isSameRoute(navigationRoute?.directionsRoute)) {
420+
onRoutesChanged(listOf(route))
421+
}
422+
423+
internal fun onRoutesChanged(routes: List<NavigationRoute>) {
424+
if (routes.isEmpty()) {
425+
clearRouteData()
426+
} else if (!areSameRoutes(routes, navigationRoutes)) {
417427
clearRouteData()
418-
this.navigationRoute = route
419-
calculateRouteData(route)
428+
this.navigationRoutes = routes
429+
calculateRouteData(routes)
420430
}
421431
}
422432

@@ -518,16 +528,19 @@ class MapboxNavigationViewportDataSource private constructor(
518528
mapsSizeReadyCancellable?.cancel()
519529
mapsSizeReadyCancellable = null
520530

521-
navigationRoute = null
531+
navigationRoutes = emptyList()
522532
postManeuverFramingPoints = emptyList()
523533
averageIntersectionDistancesOnRoute = emptyList()
524534
overviewViewportDataSource.clearRouteData()
525535
clearProgressData()
526536
}
527537

528-
private fun calculateRouteData(route: NavigationRoute) {
538+
// non-empty routes
539+
private fun calculateRouteData(routes: List<NavigationRoute>) {
540+
overviewViewportDataSource.onRoutesChanged(routes)
541+
542+
val route = routes.firstOrNull() ?: return
529543
val completeRoutePoints = processRoutePoints(route.directionsRoute)
530-
overviewViewportDataSource.onRouteChanged(route)
531544

532545
options.followingFrameOptions.intersectionDensityCalculation.run {
533546
averageIntersectionDistancesOnRoute = processRouteIntersections(
@@ -550,8 +563,10 @@ class MapboxNavigationViewportDataSource private constructor(
550563
}
551564

552565
internal fun reevaluateRoute() {
553-
val route = navigationRoute ?: return
554-
calculateRouteData(route)
566+
if (navigationRoutes.isEmpty()) {
567+
return
568+
}
569+
calculateRouteData(navigationRoutes)
555570
routeProgress?.let { onRouteProgressChanged(it) }
556571
evaluate()
557572
}

ui-maps/src/main/java/com/mapbox/navigation/ui/maps/camera/data/ViewportDataSourceProcessor.kt

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,7 @@ import com.mapbox.maps.EdgeInsets
77
import com.mapbox.maps.ScreenBox
88
import com.mapbox.maps.ScreenCoordinate
99
import com.mapbox.maps.Size
10-
import com.mapbox.navigation.base.trip.model.RouteLegProgress
1110
import com.mapbox.navigation.base.trip.model.RouteProgress
12-
import com.mapbox.navigation.base.trip.model.RouteStepProgress
1311
import com.mapbox.navigation.base.utils.DecodeUtils.stepsGeometryToPoints
1412
import com.mapbox.navigation.ui.maps.internal.camera.OverviewMode
1513
import com.mapbox.navigation.utils.internal.logE
@@ -212,18 +210,18 @@ internal object ViewportDataSourceProcessor {
212210
simplifiedCompleteRoutePoints: List<List<List<Point>>>,
213211
pointsToFrameOnCurrentStep: List<Point>,
214212
overviewMode: OverviewMode,
215-
currentLegProgress: RouteLegProgress,
216-
currentStepProgress: RouteStepProgress,
213+
legIndex: Int,
214+
stepIndex: Int,
217215
): List<Point> {
218216
val currentLegPoints = if (simplifiedCompleteRoutePoints.isNotEmpty()) {
219-
simplifiedCompleteRoutePoints[currentLegProgress.legIndex]
217+
simplifiedCompleteRoutePoints[legIndex]
220218
} else {
221219
emptyList()
222220
}
223221
val remainingStepsAfterCurrentStep =
224-
if (currentStepProgress.stepIndex < currentLegPoints.size) {
222+
if (stepIndex < currentLegPoints.size) {
225223
currentLegPoints.slice(
226-
currentStepProgress.stepIndex + 1 until currentLegPoints.size - 1,
224+
stepIndex + 1 until currentLegPoints.size - 1,
227225
)
228226
} else {
229227
emptyList()
@@ -232,7 +230,7 @@ internal object ViewportDataSourceProcessor {
232230
val remainingPointsAfterCurrentLeg = when (overviewMode) {
233231
OverviewMode.ACTIVE_LEG -> emptyList()
234232
OverviewMode.ENTIRE_ROUTE -> simplifiedCompleteRoutePoints.subList(
235-
currentLegProgress.legIndex + 1,
233+
legIndex + 1,
236234
simplifiedCompleteRoutePoints.size,
237235
).flatten().flatten()
238236
}

ui-maps/src/main/java/com/mapbox/navigation/ui/maps/internal/camera/InternalViewportDataSourceOptions.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,5 @@ import androidx.annotation.RestrictTo
66
data class InternalViewportDataSourceOptions(
77
val ignoreMinZoomWhenFramingManeuver: Boolean,
88
val overviewMode: OverviewMode,
9+
val overviewAlternatives: Boolean,
910
)

ui-maps/src/main/java/com/mapbox/navigation/ui/maps/internal/camera/MapboxNavigationViewportDataSourceEx.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,19 @@
11
package com.mapbox.navigation.ui.maps.internal.camera
22

33
import androidx.annotation.RestrictTo
4+
import com.mapbox.navigation.base.route.NavigationRoute
45
import com.mapbox.navigation.ui.maps.camera.data.MapboxNavigationViewportDataSource
56

67
@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
78
fun MapboxNavigationViewportDataSource.internalReevaluateRoute() {
89
reevaluateRoute()
910
}
1011

12+
@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
13+
fun MapboxNavigationViewportDataSource.onRoutesChanged(routes: List<NavigationRoute>) {
14+
onRoutesChanged(routes)
15+
}
16+
1117
var MapboxNavigationViewportDataSource.internalOptions
1218
@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
1319
get() = internalOptions

0 commit comments

Comments
 (0)