@@ -4,6 +4,7 @@ import android.annotation.SuppressLint
44import android.location.Location
55import android.os.Looper
66import android.os.SystemClock
7+ import androidx.annotation.VisibleForTesting
78import com.mapbox.android.core.location.LocationEngine
89import com.mapbox.android.core.location.LocationEngineCallback
910import com.mapbox.android.core.location.LocationEngineResult
@@ -24,55 +25,61 @@ import java.util.concurrent.TimeUnit
2425 * trip session is not using replay, use the [NavigationOptions.locationEngine].
2526 */
2627internal class TripSessionLocationEngine constructor(
27- val navigationOptions : NavigationOptions
28+ private val navigationOptions : NavigationOptions ,
29+ @VisibleForTesting
30+ private val replayLocationEngineProvider : (MapboxReplayer ) -> LocationEngine = {
31+ ReplayLocationEngine (it)
32+ }
2833) {
2934
3035 val mapboxReplayer: MapboxReplayer by lazy { MapboxReplayer () }
3136
32- private val replayLocationEngine: ReplayLocationEngine by lazy {
33- ReplayLocationEngine (mapboxReplayer)
37+ private val replayLocationEngine: LocationEngine by lazy {
38+ replayLocationEngineProvider.invoke (mapboxReplayer)
3439 }
35- private var locationEngine : LocationEngine = navigationOptions.locationEngine
40+ private var activeLocationEngine : LocationEngine ? = null
3641 private var onRawLocationUpdate: (Location ) -> Unit = { }
3742
43+ private val locationEngineCallback = object : LocationEngineCallback <LocationEngineResult > {
44+ override fun onSuccess (result : LocationEngineResult ? ) {
45+ logD(LOG_CATEGORY ) {
46+ " successful location engine callback $result "
47+ }
48+ result?.locations?.lastOrNull()?.let {
49+ logIfLocationIsNotFreshEnough(it)
50+ onRawLocationUpdate(it)
51+ }
52+ }
53+
54+ override fun onFailure (exception : Exception ) {
55+ logD(" location on failure exception=$exception " , LOG_CATEGORY )
56+ }
57+ }
58+
3859 @SuppressLint(" MissingPermission" )
3960 fun startLocationUpdates (isReplayEnabled : Boolean , onRawLocationUpdate : (Location ) -> Unit ) {
4061 logD(LOG_CATEGORY ) {
4162 " starting location updates for ${if (isReplayEnabled) " replay " else " " } location engine"
4263 }
64+ stopLocationUpdates()
4365 this .onRawLocationUpdate = onRawLocationUpdate
44- val locationEngine = if (isReplayEnabled) {
66+ activeLocationEngine = if (isReplayEnabled) {
4567 replayLocationEngine
4668 } else {
4769 navigationOptions.locationEngine
4870 }
49- locationEngine .requestLocationUpdates(
71+ activeLocationEngine? .requestLocationUpdates(
5072 navigationOptions.locationEngineRequest,
5173 locationEngineCallback,
5274 Looper .getMainLooper()
5375 )
54- locationEngine .getLastLocation(locationEngineCallback)
76+ activeLocationEngine? .getLastLocation(locationEngineCallback)
5577 }
5678
5779 fun stopLocationUpdates () {
5880 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- }
81+ activeLocationEngine?.removeLocationUpdates(locationEngineCallback)
82+ activeLocationEngine = null
7683 }
7784
7885 private fun logIfLocationIsNotFreshEnough (location : Location ) {
@@ -88,7 +95,6 @@ internal class TripSessionLocationEngine constructor(
8895 }
8996
9097 private companion object {
91-
9298 private const val DELAYED_LOCATION_WARNING_THRESHOLD_MS = 500 // 0.5s
9399 private const val LOG_CATEGORY = " TripSessionLocationEngine"
94100 }
0 commit comments