Skip to content

Commit 50859cd

Browse files
author
Łukasz Paczos
authored
[NN-383] - Update only distance value in existing upcoming road objects on each status (#6922)
1 parent f90a47b commit 50859cd

File tree

7 files changed

+99
-9
lines changed

7 files changed

+99
-9
lines changed
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Fixed "global reference table overflow" in case an application accumulates and keeps links to `RouteProgress#upcomingRoadObjects`

libnavigation-base/src/main/java/com/mapbox/navigation/base/internal/factory/RoadObjectFactory.kt

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import com.mapbox.navigation.base.trip.model.roadobject.UpcomingRoadObject
66
import com.mapbox.navigation.base.trip.model.roadobject.distanceinfo.RoadObjectDistanceInfo
77
import com.mapbox.navigation.base.trip.model.roadobject.mapToRoadObject
88
import com.mapbox.navigator.RoadObjectType
9+
import com.mapbox.navigator.UpcomingRouteAlert
910

1011
/**
1112
* Internal factory to build road objects
@@ -37,6 +38,27 @@ object RoadObjectFactory {
3738
}
3839
}
3940

41+
fun List<UpcomingRoadObject>.getUpdatedObjectsAhead(
42+
upcomingRouteAlerts: List<UpcomingRouteAlert>
43+
): List<UpcomingRoadObject> {
44+
val idToDistanceRemaining = upcomingRouteAlerts.associate {
45+
it.roadObject.id to it.distanceToStart
46+
}
47+
val updateObjects = mutableListOf<UpcomingRoadObject>()
48+
forEach {
49+
if (it.roadObject.id in idToDistanceRemaining.keys) {
50+
updateObjects.add(
51+
buildUpcomingRoadObject(
52+
roadObject = it.roadObject, // reusing the old road object reference
53+
distanceToStart = idToDistanceRemaining[it.roadObject.id],
54+
distanceInfo = null
55+
)
56+
)
57+
}
58+
}
59+
return updateObjects
60+
}
61+
4062
/**
4163
* Build road object from native object
4264
*/

libnavigation-base/src/test/java/com/mapbox/navigation/base/internal/factory/RoadObjectFactoryTest.kt

Lines changed: 52 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package com.mapbox.navigation.base.internal.factory
22

33
import com.mapbox.geojson.Geometry
44
import com.mapbox.geojson.Point
5+
import com.mapbox.navigation.base.internal.factory.RoadObjectFactory.getUpdatedObjectsAhead
56
import com.mapbox.navigation.base.internal.factory.RoadObjectFactory.toUpcomingRoadObjects
67
import com.mapbox.navigation.base.trip.model.roadobject.RoadObjectType
78
import com.mapbox.navigation.base.trip.model.roadobject.SDKAmenity
@@ -37,7 +38,7 @@ import org.junit.Assert.assertEquals
3738
import org.junit.Assert.assertNotNull
3839
import org.junit.Assert.assertTrue
3940
import org.junit.Test
40-
import java.util.*
41+
import java.util.Date
4142

4243
private typealias SDKRouteAlertLocation =
4344
com.mapbox.navigation.base.trip.model.roadobject.location.RouteAlertLocation
@@ -321,6 +322,54 @@ class RoadObjectFactoryTest {
321322
}
322323
}
323324

325+
@Test
326+
fun `create upcoming route objects reusing existing`() {
327+
val firstUpdate: List<UpcomingRouteAlert> = listOf(
328+
UpcomingRouteAlert(
329+
createRoadObject(
330+
type = com.mapbox.navigator.RoadObjectType.RESTRICTED_AREA,
331+
location = matchedRoadObjectLocation(location.shape),
332+
id = "0"
333+
),
334+
5.0
335+
),
336+
UpcomingRouteAlert(
337+
createRoadObject(
338+
type = com.mapbox.navigator.RoadObjectType.RESTRICTED_AREA,
339+
location = matchedRoadObjectLocation(location.shape),
340+
id = "1"
341+
),
342+
9.0
343+
),
344+
)
345+
val secondUpdate: List<UpcomingRouteAlert> = listOf(
346+
UpcomingRouteAlert(
347+
createRoadObject(
348+
type = com.mapbox.navigator.RoadObjectType.RESTRICTED_AREA,
349+
location = matchedRoadObjectLocation(location.shape),
350+
id = "0"
351+
),
352+
4.0
353+
),
354+
UpcomingRouteAlert(
355+
createRoadObject(
356+
type = com.mapbox.navigator.RoadObjectType.RESTRICTED_AREA,
357+
location = matchedRoadObjectLocation(location.shape),
358+
id = "1"
359+
),
360+
8.0
361+
),
362+
)
363+
val existingUpcomingRoadObjects = firstUpdate.toUpcomingRoadObjects()
364+
365+
val roadObjects = existingUpcomingRoadObjects.getUpdatedObjectsAhead(secondUpdate)
366+
367+
assertEquals(4.0, roadObjects[0].distanceToStart)
368+
assertEquals(8.0, roadObjects[1].distanceToStart)
369+
assertTrue(roadObjects[0].roadObject === existingUpcomingRoadObjects[0].roadObject)
370+
assertTrue(roadObjects[1].roadObject === existingUpcomingRoadObjects[1].roadObject)
371+
}
372+
324373
private fun matchedRoadObjectLocation(geometry: Geometry): MatchedRoadObjectLocation {
325374
return MatchedRoadObjectLocation.valueOf(object : RouteAlertLocation(1) {
326375
override fun getShape(): Geometry = geometry
@@ -435,6 +484,7 @@ class RoadObjectFactoryTest {
435484
tollCollectionInfo: com.mapbox.navigator.TollCollectionInfo? = null,
436485
serviceAreaInfo: com.mapbox.navigator.ServiceAreaInfo? = null,
437486
railwayCrossingInfo: com.mapbox.navigator.RailwayCrossingInfo? = null,
487+
id: String = ID
438488
): RoadObject {
439489
val metadata = when (type) {
440490
com.mapbox.navigator.RoadObjectType.INCIDENT ->
@@ -453,7 +503,7 @@ class RoadObjectFactoryTest {
453503
}
454504

455505
return RoadObject(
456-
ID,
506+
id,
457507
LENGTH,
458508
location,
459509
type,

libnavigation-core/src/main/java/com/mapbox/navigation/core/navigator/NavigatorMapper.kt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import com.mapbox.api.directions.v5.models.RouteLeg
99
import com.mapbox.api.directions.v5.models.VoiceInstructions
1010
import com.mapbox.geojson.Point
1111
import com.mapbox.navigation.base.ExperimentalMapboxNavigationAPI
12-
import com.mapbox.navigation.base.internal.factory.RoadObjectFactory.toUpcomingRoadObjects
1312
import com.mapbox.navigation.base.internal.factory.RouteLegProgressFactory.buildRouteLegProgressObject
1413
import com.mapbox.navigation.base.internal.factory.RouteProgressFactory.buildRouteProgressObject
1514
import com.mapbox.navigation.base.internal.factory.RouteStepProgressFactory.buildRouteStepProgressObject
@@ -18,6 +17,7 @@ import com.mapbox.navigation.base.route.NavigationRoute
1817
import com.mapbox.navigation.base.speed.model.SpeedLimit
1918
import com.mapbox.navigation.base.trip.model.RouteProgress
2019
import com.mapbox.navigation.base.trip.model.RouteProgressState
20+
import com.mapbox.navigation.base.trip.model.roadobject.UpcomingRoadObject
2121
import com.mapbox.navigation.base.utils.DecodeUtils.stepGeometryToPoints
2222
import com.mapbox.navigation.core.trip.session.LocationMatcherResult
2323
import com.mapbox.navigation.navigator.internal.TripStatus
@@ -44,13 +44,15 @@ internal fun getRouteProgressFrom(
4444
bannerInstructions: BannerInstructions?,
4545
instructionIndex: Int?,
4646
lastVoiceInstruction: VoiceInstructions?,
47+
upcomingRoadObjects: List<UpcomingRoadObject>,
4748
): RouteProgress? {
4849
return status.getRouteProgress(
4950
route,
5051
remainingWaypoints,
5152
bannerInstructions,
5253
instructionIndex,
5354
lastVoiceInstruction,
55+
upcomingRoadObjects,
5456
)
5557
}
5658

@@ -69,6 +71,7 @@ private fun NavigationStatus.getRouteProgress(
6971
bannerInstructions: BannerInstructions?,
7072
instructionIndex: Int?,
7173
lastVoiceInstruction: VoiceInstructions?,
74+
upcomingRoadObjects: List<UpcomingRoadObject>,
7275
): RouteProgress? {
7376
if (routeState == RouteState.INVALID) {
7477
return null
@@ -188,7 +191,7 @@ private fun NavigationStatus.getRouteProgress(
188191
routeProgressDurationRemaining,
189192
routeProgressFractionTraveled,
190193
remainingWaypoints,
191-
upcomingRouteAlerts.toUpcomingRoadObjects(),
194+
upcomingRoadObjects,
192195
stale,
193196
locatedAlternativeRouteId,
194197
geometryIndex,

libnavigation-core/src/main/java/com/mapbox/navigation/core/trip/session/MapboxTripSession.kt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import com.mapbox.api.directions.v5.models.VoiceInstructions
88
import com.mapbox.bindgen.Expected
99
import com.mapbox.navigation.base.ExperimentalMapboxNavigationAPI
1010
import com.mapbox.navigation.base.internal.factory.RoadFactory
11+
import com.mapbox.navigation.base.internal.factory.RoadObjectFactory.getUpdatedObjectsAhead
1112
import com.mapbox.navigation.base.internal.factory.TripNotificationStateFactory.buildTripNotificationState
1213
import com.mapbox.navigation.base.internal.route.refreshNativePeer
1314
import com.mapbox.navigation.base.route.NavigationRoute
@@ -378,13 +379,17 @@ internal class MapboxTripSession(
378379
}
379380
val remainingWaypoints = tripStatus.calculateRemainingWaypoints()
380381
val latestBannerInstructionsWrapper = bannerInstructionEvent.latestInstructionWrapper
382+
val upcomingRoadObjects = roadObjects.getUpdatedObjectsAhead(
383+
tripStatus.navigationStatus.upcomingRouteAlerts
384+
)
381385
val routeProgress = getRouteProgressFrom(
382386
tripStatus.route,
383387
tripStatus.navigationStatus,
384388
remainingWaypoints,
385389
latestBannerInstructionsWrapper?.latestBannerInstructions,
386390
latestBannerInstructionsWrapper?.latestInstructionIndex,
387-
lastVoiceInstruction
391+
lastVoiceInstruction,
392+
upcomingRoadObjects,
388393
).also {
389394
if (it == null) {
390395
logD(

libnavigation-core/src/test/java/com/mapbox/navigation/core/navigator/NavigatorMapperTest.kt

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import com.mapbox.navigation.base.internal.factory.RouteStepProgressFactory.buil
1111
import com.mapbox.navigation.base.road.model.Road
1212
import com.mapbox.navigation.base.route.NavigationRoute
1313
import com.mapbox.navigation.base.speed.model.SpeedLimit
14+
import com.mapbox.navigation.base.trip.model.roadobject.UpcomingRoadObject
1415
import com.mapbox.navigation.core.trip.session.LocationMatcherResult
1516
import com.mapbox.navigation.navigator.internal.TripStatus
1617
import com.mapbox.navigation.testing.FileUtils
@@ -54,6 +55,7 @@ class NavigatorMapperTest {
5455
@Test
5556
fun `route progress result sanity`() {
5657
val bannerInstructions = navigationStatus.getCurrentBannerInstructions(route)
58+
val upcomingRoadObjects = listOf<UpcomingRoadObject>(mockk())
5759
val expected = RouteProgressFactory.buildRouteProgressObject(
5860
route = route,
5961
bannerInstructions = bannerInstructions,
@@ -94,7 +96,7 @@ class NavigatorMapperTest {
9496
inTunnel = true,
9597
stale = true,
9698
remainingWaypoints = 1,
97-
upcomingRoadObjects = listOf(),
99+
upcomingRoadObjects = upcomingRoadObjects,
98100
alternativeRouteId = "alternative_id",
99101
currentRouteGeometryIndex = routeGeometryIndex
100102
)
@@ -106,6 +108,7 @@ class NavigatorMapperTest {
106108
bannerInstructions,
107109
instructionIndex = 1,
108110
lastVoiceInstruction = null,
111+
upcomingRoadObjects,
109112
)
110113

111114
assertEquals(expected, result)
@@ -443,6 +446,7 @@ class NavigatorMapperTest {
443446
mockk(relaxed = true),
444447
0,
445448
mockk(relaxed = true),
449+
emptyList(),
446450
)
447451

448452
assertNull(routeProgress)
@@ -459,6 +463,7 @@ class NavigatorMapperTest {
459463
mockk(relaxed = true),
460464
0,
461465
mockk(relaxed = true),
466+
emptyList(),
462467
)
463468

464469
assertNull(routeProgress)
@@ -473,6 +478,7 @@ class NavigatorMapperTest {
473478
mockk(relaxed = true),
474479
0,
475480
mockk(relaxed = true),
481+
emptyList(),
476482
)
477483

478484
assertNotNull(routeProgress)
@@ -488,6 +494,7 @@ class NavigatorMapperTest {
488494
mockk(relaxed = true),
489495
0,
490496
lastVoiceInstruction = mockk(relaxed = true),
497+
emptyList(),
491498
)
492499

493500
assertTrue(routeProgress!!.stale)
@@ -503,6 +510,7 @@ class NavigatorMapperTest {
503510
mockk(relaxed = true),
504511
0,
505512
lastVoiceInstruction = mockk(relaxed = true),
513+
emptyList(),
506514
)
507515

508516
assertFalse(routeProgress!!.stale)
@@ -525,6 +533,7 @@ class NavigatorMapperTest {
525533
mockk(relaxed = true),
526534
0,
527535
mockk(relaxed = true),
536+
emptyList(),
528537
)
529538
val upcomingRouteAlerts = routeProgress!!.upcomingRoadObjects
530539

libnavigation-core/src/test/java/com/mapbox/navigation/core/trip/session/MapboxTripSessionTest.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,7 @@ class MapboxTripSessionTest {
184184
every { routeProgress.voiceInstructions } returns null
185185
every { routeProgress.currentLegProgress } returns mockk(relaxed = true)
186186
every {
187-
getRouteProgressFrom(any(), any(), any(), any(), any(), any())
187+
getRouteProgressFrom(any(), any(), any(), any(), any(), any(), any())
188188
} returns routeProgress
189189
every { routeProgress.currentState } returns RouteProgressState.TRACKING
190190
every { routes[0].directionsResponse.uuid() } returns "uuid"
@@ -406,7 +406,7 @@ class MapboxTripSessionTest {
406406

407407
@Test
408408
fun routeProgressObserverNotCalledWhenInFreeDrive() = coroutineRule.runBlockingTest {
409-
every { getRouteProgressFrom(any(), any(), any(), any(), any(), any()) } returns null
409+
every { getRouteProgressFrom(any(), any(), any(), any(), any(), any(), any()) } returns null
410410
tripSession = buildTripSession()
411411
tripSession.start(true)
412412
val observer: RouteProgressObserver = mockk(relaxUnitFun = true)
@@ -1745,7 +1745,7 @@ class MapboxTripSessionTest {
17451745
}
17461746

17471747
private fun mockNavigationRoute(
1748-
roadObjects: List<UpcomingRoadObject> = listOf(mockk())
1748+
roadObjects: List<UpcomingRoadObject> = listOf(mockk(relaxed = true))
17491749
): NavigationRoute = mockk(relaxed = true) {
17501750
every { upcomingRoadObjects } returns roadObjects
17511751
}

0 commit comments

Comments
 (0)