Skip to content

Commit 269f7b5

Browse files
committed
moved mapper away
1 parent ce46fff commit 269f7b5

4 files changed

Lines changed: 132 additions & 58 deletions

File tree

libnavigation-core/src/androidTest/java/com/mapbox/navigation/core/trip/service/ArtificialDriverTest.kt

Lines changed: 32 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import com.mapbox.navigation.core.MapboxNavigation
99
import com.mapbox.navigation.core.MapboxNavigationProvider
1010
import com.mapbox.navigation.core.navigator.toFixLocation
1111
import com.mapbox.navigation.core.replay.history.ReplayEventUpdateLocation
12-
import com.mapbox.navigation.core.replay.mapToLocation
12+
import com.mapbox.navigation.core.replay.history.mapToLocation
1313
import com.mapbox.navigation.core.replay.route.ReplayRouteMapper
1414
import com.mapbox.navigation.core.test.R
1515
import com.mapbox.navigation.navigator.internal.MapboxNativeNavigator
@@ -39,37 +39,42 @@ import kotlin.coroutines.suspendCoroutine
3939
class ArtificialDriverTest {
4040

4141
@Test
42-
fun testFollowingRoute() = runBlocking<Unit>(Dispatchers.Main) {
43-
withNavigators { mapboxNavigation, nativeNavigator ->
44-
mapboxNavigation.historyRecorder.startRecording()
45-
val testRoute = getTestRoute()
46-
val replayRouteMapper = ReplayRouteMapper()
47-
val events = replayRouteMapper.mapDirectionsRouteGeometry(testRoute.directionsRoute)
48-
.filterIsInstance<ReplayEventUpdateLocation>()
49-
val setRoutesResult =
50-
nativeNavigator.setRoutes(testRoute, reason = SetRoutesReason.NEW_ROUTE)
51-
assertTrue("result is $setRoutesResult", setRoutesResult.isValue)
52-
val statusesTracking = async<List<NavigationStatus>> {
53-
nativeNavigator.collectStatuses(untilRouteState = RouteState.COMPLETE)
54-
}
42+
fun nativeNavigatorFollowsArtificialDriverWithoutReroutes() =
43+
runBlocking<Unit>(Dispatchers.Main) {
44+
withNavigators { mapboxNavigation, nativeNavigator ->
45+
mapboxNavigation.historyRecorder.startRecording()
46+
val testRoute = getTestRoute()
47+
val events = createArtificialLocationUpdates(testRoute)
48+
val setRoutesResult =
49+
nativeNavigator.setRoutes(testRoute, reason = SetRoutesReason.NEW_ROUTE)
50+
assertTrue("result is $setRoutesResult", setRoutesResult.isValue)
51+
val statusesTracking = async<List<NavigationStatus>> {
52+
nativeNavigator.collectStatuses(untilRouteState = RouteState.COMPLETE)
53+
}
5554

56-
for (event in events) {
57-
val location = event.location.mapToLocation(event.eventTimestamp)
58-
assertTrue(nativeNavigator.updateLocation(location.toFixLocation()))
59-
}
55+
for (location in events.map { it.location.mapToLocation() }) {
56+
assertTrue(nativeNavigator.updateLocation(location.toFixLocation()))
57+
}
6058

61-
val states = statusesTracking.await()
62-
val historyFile = suspendCoroutine<String> { continuation ->
63-
mapboxNavigation.historyRecorder.stopRecording {
64-
continuation.resume(it ?: "null")
59+
val states = statusesTracking.await()
60+
val historyFile = suspendCoroutine<String> { continuation ->
61+
mapboxNavigation.historyRecorder.stopRecording {
62+
continuation.resume(it ?: "null")
63+
}
6564
}
65+
val notTrackingStates = states.filter { it.routeState != RouteState.TRACKING }
66+
assertTrue(
67+
"not all states are tracking, see history file $historyFile: $notTrackingStates",
68+
notTrackingStates.isEmpty()
69+
)
6670
}
67-
val notTrackingStates = states.filter { it.routeState != RouteState.TRACKING }
68-
assertTrue(
69-
"not all states are tracking, see history file $historyFile: $notTrackingStates",
70-
notTrackingStates.isEmpty()
71-
)
7271
}
72+
73+
private fun createArtificialLocationUpdates(testRoute: NavigationRoute): List<ReplayEventUpdateLocation> {
74+
val replayRouteMapper = ReplayRouteMapper()
75+
return replayRouteMapper
76+
.mapDirectionsRouteGeometry(testRoute.directionsRoute)
77+
.filterIsInstance<ReplayEventUpdateLocation>()
7378
}
7479
}
7580

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

Lines changed: 4 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,16 @@
11
package com.mapbox.navigation.core.replay
22

33
import android.app.PendingIntent
4-
import android.location.Location
54
import android.os.Looper
6-
import android.os.SystemClock
75
import androidx.annotation.UiThread
86
import com.mapbox.android.core.location.LocationEngine
97
import com.mapbox.android.core.location.LocationEngineCallback
108
import com.mapbox.android.core.location.LocationEngineRequest
119
import com.mapbox.android.core.location.LocationEngineResult
1210
import com.mapbox.navigation.core.replay.history.ReplayEventBase
13-
import com.mapbox.navigation.core.replay.history.ReplayEventLocation
1411
import com.mapbox.navigation.core.replay.history.ReplayEventUpdateLocation
1512
import com.mapbox.navigation.core.replay.history.ReplayEventsObserver
16-
import java.util.Date
13+
import com.mapbox.navigation.core.replay.history.mapToLocation
1714
import java.util.concurrent.CopyOnWriteArrayList
1815

1916
private typealias EngineCallback = LocationEngineCallback<LocationEngineResult>
@@ -97,39 +94,15 @@ class ReplayLocationEngine(
9794
}
9895

9996
private fun replayLocation(event: ReplayEventUpdateLocation) {
100-
val timeOffset = mapboxReplayer.eventRealtimeOffset(event.eventTimestamp)
10197
val eventLocation = event.location
102-
val location = eventLocation.mapToLocation(timeOffset)
98+
val location = eventLocation.mapToLocation(
99+
eventTimeOffset = mapboxReplayer.eventRealtimeOffset(event.eventTimestamp)
100+
)
103101
val locationEngineResult = LocationEngineResult.create(location)
104102
lastLocationEngineResult = locationEngineResult
105103

106104
registeredCallbacks.forEach { it.onSuccess(locationEngineResult) }
107105
lastLocationCallbacks.forEach { it.onSuccess(locationEngineResult) }
108106
lastLocationCallbacks.clear()
109107
}
110-
111-
private companion object {
112-
113-
114-
}
115-
}
116-
117-
private const val MILLIS_PER_SECOND = 1000.0
118-
private const val NANOS_PER_SECOND = 1e+9
119-
private fun Double.secToMillis(): Long = (this * MILLIS_PER_SECOND).toLong()
120-
private fun Double.secToNanos(): Long = (this * NANOS_PER_SECOND).toLong()
121-
122-
internal fun ReplayEventLocation.mapToLocation(
123-
timeOffset: Double
124-
): Location {
125-
val location = Location(provider)
126-
location.longitude = lon
127-
location.latitude = lat
128-
location.time = Date().time + timeOffset.secToMillis()
129-
location.elapsedRealtimeNanos = SystemClock.elapsedRealtimeNanos() + timeOffset.secToNanos()
130-
accuracyHorizontal?.toFloat()?.let { location.accuracy = it }
131-
bearing?.toFloat()?.let { location.bearing = it }
132-
altitude?.let { location.altitude = it }
133-
speed?.toFloat()?.let { location.speed = it }
134-
return location
135108
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package com.mapbox.navigation.core.replay.history
2+
3+
import android.location.Location
4+
import android.os.SystemClock
5+
import androidx.annotation.VisibleForTesting
6+
import java.util.Date
7+
8+
private const val MILLIS_PER_SECOND = 1000.0
9+
private const val NANOS_PER_SECOND = 1e+9
10+
private fun Double.secToMillis(): Long = (this * MILLIS_PER_SECOND).toLong()
11+
private fun Double.secToNanos(): Long = (this * NANOS_PER_SECOND).toLong()
12+
13+
internal fun ReplayEventLocation.mapToLocation(
14+
eventTimeOffset: Double = time ?: 0.0,
15+
@VisibleForTesting currentTimeMilliseconds: Long = Date().time,
16+
@VisibleForTesting elapsedTimeNano: Long = SystemClock.elapsedRealtimeNanos()
17+
): Location {
18+
val location = Location(provider)
19+
location.longitude = lon
20+
location.latitude = lat
21+
location.time = currentTimeMilliseconds + eventTimeOffset.secToMillis()
22+
location.elapsedRealtimeNanos = elapsedTimeNano + eventTimeOffset.secToNanos()
23+
accuracyHorizontal?.toFloat()?.let { location.accuracy = it }
24+
bearing?.toFloat()?.let { location.bearing = it }
25+
altitude?.let { location.altitude = it }
26+
speed?.toFloat()?.let { location.speed = it }
27+
return location
28+
}
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
package com.mapbox.navigation.core.replay.history
2+
3+
import junit.framework.TestCase.assertEquals
4+
import org.junit.Test
5+
import org.junit.runner.RunWith
6+
import org.robolectric.RobolectricTestRunner
7+
8+
@RunWith(RobolectricTestRunner::class)
9+
class ReplayEventLocationMapperTest {
10+
@Test
11+
fun `map fields as they are`() {
12+
val eventsLocation = createTestEventLocation()
13+
14+
val androidLocation = eventsLocation.mapToLocation(eventsLocation.time!!)
15+
16+
assertEquals(eventsLocation.lon, androidLocation.longitude)
17+
assertEquals(eventsLocation.lat, androidLocation.latitude)
18+
assertEquals(eventsLocation.provider, androidLocation.provider)
19+
assertEquals(eventsLocation.altitude, androidLocation.altitude)
20+
assertEquals(
21+
eventsLocation.accuracyHorizontal!!.toFloat(),
22+
androidLocation.accuracy,
23+
0.0001f
24+
)
25+
assertEquals(
26+
eventsLocation.bearing!!.toFloat(),
27+
androidLocation.bearing,
28+
0.0001f
29+
)
30+
assertEquals(
31+
eventsLocation.speed!!.toFloat(),
32+
androidLocation.speed,
33+
0.0001f
34+
)
35+
}
36+
37+
@Test
38+
fun `add timestamp to current time`() {
39+
val eventsLocation = createTestEventLocation(
40+
locationOffsetInSeconds = 2.0
41+
)
42+
43+
val androidLocation = eventsLocation.mapToLocation(
44+
eventsLocation.time!!,
45+
currentTimeMilliseconds = 1_000,
46+
elapsedTimeNano = 1_000_000_000
47+
)
48+
49+
assertEquals(3000, androidLocation.time)
50+
assertEquals(3000000000, androidLocation.elapsedRealtimeNanos)
51+
52+
}
53+
54+
55+
}
56+
57+
private fun createTestEventLocation(
58+
locationOffsetInSeconds: Double = 1580777612.892,
59+
): ReplayEventLocation = ReplayEventLocation(
60+
lat = 49.2492411,
61+
lon = 8.8512315,
62+
provider = "fused",
63+
time = locationOffsetInSeconds,
64+
altitude = 212.4732666015625,
65+
accuracyHorizontal = 4.288000106811523,
66+
bearing = 243.31265258789063,
67+
speed = 0.5585000514984131
68+
)

0 commit comments

Comments
 (0)