Debouncing location updates

This commit is contained in:
Maxime NATUREL 2022-05-03 16:55:14 +02:00
parent 7860173fa2
commit c61412520d

View file

@ -44,6 +44,8 @@ class LocationTracker @Inject constructor(
private var hasGpsProviderLiveLocation = false
private var lastLocationUpdateMillis: Long? = null
private var lastLocation: LocationData? = null
@RequiresPermission(anyOf = [Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION])
@ -84,7 +86,7 @@ class LocationTracker @Inject constructor(
} else {
Timber.d("## LocationTracker. lastKnownLocation: ${latestKnownLocation.provider}")
}
notifyLocation(latestKnownLocation, isLive = false)
notifyLocation(latestKnownLocation)
}
}
}
@ -123,14 +125,10 @@ class LocationTracker @Inject constructor(
} else {
Timber.d("## LocationTracker. onLocationChanged: ${location.provider}")
}
notifyLocation(location, isLive = true)
}
private fun notifyLocation(location: Location, isLive: Boolean) {
Timber.d("## LocationTracker. notify location")
when (location.provider) {
LocationManager.GPS_PROVIDER -> {
hasGpsProviderLiveLocation = isLive
hasGpsProviderLiveLocation = true
}
else -> {
if (hasGpsProviderLiveLocation) {
@ -140,9 +138,22 @@ class LocationTracker @Inject constructor(
}
}
}
val nowMillis = System.currentTimeMillis()
val elapsedMillis = nowMillis - (lastLocationUpdateMillis ?: 0)
if (elapsedMillis >= MIN_TIME_TO_UPDATE_LOCATION_MILLIS) {
lastLocationUpdateMillis = nowMillis
notifyLocation(location)
} else {
Timber.d("## LocationTracker. ignoring location: update is too fast")
}
}
private fun notifyLocation(location: Location) {
Timber.d("## LocationTracker. notify location")
val locationData = location.toLocationData()
lastLocation = locationData
callbacks.forEach { it.onLocationUpdate(locationData) }
callbacks.forEach { it.onLocationUpdate(location.toLocationData()) }
}
override fun onProviderDisabled(provider: String) {