DevicePoseProvider: be picky about locations (#1344)
* Only take updated location when it is of better quality * Rename to AndroidLocation for clarification * be pedantic about licenses
This commit is contained in:
@@ -18,6 +18,8 @@ import kotlinx.coroutines.channels.awaitClose
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import kotlinx.coroutines.flow.callbackFlow
|
||||
import kotlinx.coroutines.flow.channelFlow
|
||||
import de.mm20.launcher2.ktx.foldOrNull
|
||||
import de.mm20.launcher2.ktx.isBetterThan
|
||||
import kotlinx.coroutines.flow.combine
|
||||
|
||||
class DevicePoseProvider internal constructor(
|
||||
@@ -37,10 +39,16 @@ class DevicePoseProvider internal constructor(
|
||||
}
|
||||
|
||||
fun getLocation(minTimeMs: Long = 1000, minDistanceM: Float = 1f) = channelFlow {
|
||||
fun updateLocation(update: Location?) {
|
||||
if (update == null) return
|
||||
if (!update.isBetterThan(lastLocation)) return
|
||||
lastLocation = update
|
||||
updateDeclination(update)
|
||||
trySend(update)
|
||||
}
|
||||
|
||||
val locationCallback = LocationListenerCompat {
|
||||
lastLocation = it
|
||||
updateDeclination(it)
|
||||
trySend(it)
|
||||
updateLocation(it)
|
||||
}
|
||||
|
||||
context.getSystemService<LocationManager>()
|
||||
@@ -50,20 +58,14 @@ class DevicePoseProvider internal constructor(
|
||||
val hasCoarseAccess =
|
||||
context.checkPermission(Manifest.permission.ACCESS_COARSE_LOCATION)
|
||||
|
||||
val location =
|
||||
(if (hasFineAccess) this@runCatching.getLastKnownLocation(LocationManager.GPS_PROVIDER) else null)
|
||||
?: if (hasCoarseAccess) this@runCatching.getLastKnownLocation(
|
||||
LocationManager.NETWORK_PROVIDER
|
||||
) else null
|
||||
val previousLocation =
|
||||
hasFineAccess.foldOrNull { getLastKnownLocation(LocationManager.GPS_PROVIDER) } ?:
|
||||
hasCoarseAccess.foldOrNull { getLastKnownLocation(LocationManager.NETWORK_PROVIDER) }
|
||||
|
||||
if (location != null) {
|
||||
lastLocation = location
|
||||
updateDeclination(location)
|
||||
trySend(location)
|
||||
}
|
||||
updateLocation(previousLocation)
|
||||
|
||||
if (hasFineAccess) {
|
||||
this@runCatching.requestLocationUpdates(
|
||||
requestLocationUpdates(
|
||||
LocationManager.GPS_PROVIDER,
|
||||
minTimeMs,
|
||||
minDistanceM,
|
||||
@@ -71,7 +73,7 @@ class DevicePoseProvider internal constructor(
|
||||
)
|
||||
}
|
||||
if (hasCoarseAccess) {
|
||||
this@runCatching.requestLocationUpdates(
|
||||
requestLocationUpdates(
|
||||
LocationManager.NETWORK_PROVIDER,
|
||||
minTimeMs,
|
||||
minDistanceM,
|
||||
|
||||
Reference in New Issue
Block a user