@@ -24,55 +24,60 @@ import java.util.concurrent.TimeUnit
2424 * trip session is not using replay, use the [NavigationOptions.locationEngine].
2525 */
2626internal class TripSessionLocationEngine constructor(
27- val navigationOptions : NavigationOptions
27+ private val navigationOptions : NavigationOptions ,
28+ private val replayLocationEngineProvider : (MapboxReplayer ) -> LocationEngine = {
29+ ReplayLocationEngine (it)
30+ }
2831) {
2932
3033 val mapboxReplayer: MapboxReplayer by lazy { MapboxReplayer () }
3134
32- private val replayLocationEngine: ReplayLocationEngine by lazy {
33- ReplayLocationEngine (mapboxReplayer)
35+ private val replayLocationEngine: LocationEngine by lazy {
36+ replayLocationEngineProvider.invoke (mapboxReplayer)
3437 }
35- private var locationEngine : LocationEngine = navigationOptions.locationEngine
38+ private var activeLocationEngine : LocationEngine ? = null
3639 private var onRawLocationUpdate: (Location ) -> Unit = { }
3740
41+ private val locationEngineCallback = object : LocationEngineCallback <LocationEngineResult > {
42+ override fun onSuccess (result : LocationEngineResult ? ) {
43+ logD(LOG_CATEGORY ) {
44+ " successful location engine callback $result "
45+ }
46+ result?.locations?.lastOrNull()?.let {
47+ logIfLocationIsNotFreshEnough(it)
48+ onRawLocationUpdate(it)
49+ }
50+ }
51+
52+ override fun onFailure (exception : Exception ) {
53+ logD(" location on failure exception=$exception " , LOG_CATEGORY )
54+ }
55+ }
56+
3857 @SuppressLint(" MissingPermission" )
3958 fun startLocationUpdates (isReplayEnabled : Boolean , onRawLocationUpdate : (Location ) -> Unit ) {
4059 logD(LOG_CATEGORY ) {
4160 " starting location updates for ${if (isReplayEnabled) " replay " else " " } location engine"
4261 }
62+ stopLocationUpdates()
4363 this .onRawLocationUpdate = onRawLocationUpdate
44- val locationEngine = if (isReplayEnabled) {
64+ activeLocationEngine = if (isReplayEnabled) {
4565 replayLocationEngine
4666 } else {
4767 navigationOptions.locationEngine
4868 }
49- locationEngine .requestLocationUpdates(
69+ activeLocationEngine? .requestLocationUpdates(
5070 navigationOptions.locationEngineRequest,
5171 locationEngineCallback,
5272 Looper .getMainLooper()
5373 )
54- locationEngine .getLastLocation(locationEngineCallback)
74+ activeLocationEngine? .getLastLocation(locationEngineCallback)
5575 }
5676
5777 fun stopLocationUpdates () {
5878 onRawLocationUpdate = { }
59- locationEngine.removeLocationUpdates(locationEngineCallback)
60- }
61-
62- private var locationEngineCallback = object : LocationEngineCallback <LocationEngineResult > {
63- override fun onSuccess (result : LocationEngineResult ? ) {
64- logD(LOG_CATEGORY ) {
65- " successful location engine callback $result "
66- }
67- result?.locations?.lastOrNull()?.let {
68- logIfLocationIsNotFreshEnough(it)
69- onRawLocationUpdate(it)
70- }
71- }
72-
73- override fun onFailure (exception : Exception ) {
74- logD(" location on failure exception=$exception " , LOG_CATEGORY )
75- }
79+ activeLocationEngine?.removeLocationUpdates(locationEngineCallback)
80+ activeLocationEngine = null
7681 }
7782
7883 private fun logIfLocationIsNotFreshEnough (location : Location ) {
@@ -88,7 +93,6 @@ internal class TripSessionLocationEngine constructor(
8893 }
8994
9095 private companion object {
91-
9296 private const val DELAYED_LOCATION_WARNING_THRESHOLD_MS = 500 // 0.5s
9397 private const val LOG_CATEGORY = " TripSessionLocationEngine"
9498 }
0 commit comments