Revert "DevicePoseProvider: be picky about locations (#1344)"
This reverts commit 4bb092d98bf3b5bc0e93076918a8d1e7a2b1fc4c.
This commit is contained in:
parent
db8dbf014c
commit
986cc2c16d
@ -18,8 +18,6 @@ import kotlinx.coroutines.channels.awaitClose
|
|||||||
import kotlinx.coroutines.flow.Flow
|
import kotlinx.coroutines.flow.Flow
|
||||||
import kotlinx.coroutines.flow.callbackFlow
|
import kotlinx.coroutines.flow.callbackFlow
|
||||||
import kotlinx.coroutines.flow.channelFlow
|
import kotlinx.coroutines.flow.channelFlow
|
||||||
import de.mm20.launcher2.ktx.foldOrNull
|
|
||||||
import de.mm20.launcher2.ktx.isBetterThan
|
|
||||||
import kotlinx.coroutines.flow.combine
|
import kotlinx.coroutines.flow.combine
|
||||||
|
|
||||||
class DevicePoseProvider internal constructor(
|
class DevicePoseProvider internal constructor(
|
||||||
@ -39,16 +37,10 @@ class DevicePoseProvider internal constructor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun getLocation(minTimeMs: Long = 1000, minDistanceM: Float = 1f) = channelFlow {
|
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 {
|
val locationCallback = LocationListenerCompat {
|
||||||
updateLocation(it)
|
lastLocation = it
|
||||||
|
updateDeclination(it)
|
||||||
|
trySend(it)
|
||||||
}
|
}
|
||||||
|
|
||||||
context.getSystemService<LocationManager>()
|
context.getSystemService<LocationManager>()
|
||||||
@ -58,14 +50,20 @@ class DevicePoseProvider internal constructor(
|
|||||||
val hasCoarseAccess =
|
val hasCoarseAccess =
|
||||||
context.checkPermission(Manifest.permission.ACCESS_COARSE_LOCATION)
|
context.checkPermission(Manifest.permission.ACCESS_COARSE_LOCATION)
|
||||||
|
|
||||||
val previousLocation =
|
val location =
|
||||||
hasFineAccess.foldOrNull { getLastKnownLocation(LocationManager.GPS_PROVIDER) } ?:
|
(if (hasFineAccess) this@runCatching.getLastKnownLocation(LocationManager.GPS_PROVIDER) else null)
|
||||||
hasCoarseAccess.foldOrNull { getLastKnownLocation(LocationManager.NETWORK_PROVIDER) }
|
?: if (hasCoarseAccess) this@runCatching.getLastKnownLocation(
|
||||||
|
LocationManager.NETWORK_PROVIDER
|
||||||
|
) else null
|
||||||
|
|
||||||
updateLocation(previousLocation)
|
if (location != null) {
|
||||||
|
lastLocation = location
|
||||||
|
updateDeclination(location)
|
||||||
|
trySend(location)
|
||||||
|
}
|
||||||
|
|
||||||
if (hasFineAccess) {
|
if (hasFineAccess) {
|
||||||
requestLocationUpdates(
|
this@runCatching.requestLocationUpdates(
|
||||||
LocationManager.GPS_PROVIDER,
|
LocationManager.GPS_PROVIDER,
|
||||||
minTimeMs,
|
minTimeMs,
|
||||||
minDistanceM,
|
minDistanceM,
|
||||||
@ -73,7 +71,7 @@ class DevicePoseProvider internal constructor(
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
if (hasCoarseAccess) {
|
if (hasCoarseAccess) {
|
||||||
requestLocationUpdates(
|
this@runCatching.requestLocationUpdates(
|
||||||
LocationManager.NETWORK_PROVIDER,
|
LocationManager.NETWORK_PROVIDER,
|
||||||
minTimeMs,
|
minTimeMs,
|
||||||
minDistanceM,
|
minDistanceM,
|
||||||
|
|||||||
@ -1,37 +0,0 @@
|
|||||||
package de.mm20.launcher2.ktx
|
|
||||||
|
|
||||||
import kotlin.time.Duration.Companion.minutes
|
|
||||||
import kotlin.time.Duration.Companion.nanoseconds
|
|
||||||
|
|
||||||
import android.location.Location as AndroidLocation
|
|
||||||
|
|
||||||
/* https://github.com/streetcomplete/StreetComplete/blob/master/app/src/main/java/de/westnordost/streetcomplete/util/location/LocationUtils.kt
|
|
||||||
* GPL-3.0-or-later
|
|
||||||
*/
|
|
||||||
fun AndroidLocation.isBetterThan(previous: AndroidLocation?): Boolean {
|
|
||||||
if (longitude.isNaN() || latitude.isNaN()) return false
|
|
||||||
if (previous == null) return true
|
|
||||||
|
|
||||||
val locationTimeDiff = elapsedRealtimeNanos.nanoseconds - previous.elapsedRealtimeNanos.nanoseconds
|
|
||||||
val isMuchNewer = locationTimeDiff > 2.minutes
|
|
||||||
val isMuchOlder = locationTimeDiff < (-2).minutes
|
|
||||||
val isNewer = locationTimeDiff.isPositive()
|
|
||||||
|
|
||||||
val accuracyDelta = accuracy - previous.accuracy
|
|
||||||
val isLessAccurate = accuracyDelta > 0f
|
|
||||||
val isMoreAccurate = accuracyDelta < 0f
|
|
||||||
val isMuchLessAccurate = accuracyDelta > 200f
|
|
||||||
|
|
||||||
val isFromSameProvider = provider == previous.provider
|
|
||||||
|
|
||||||
return when {
|
|
||||||
// the user has likely moved
|
|
||||||
isMuchNewer -> true
|
|
||||||
// If the new location is more than two minutes older, it must be worse
|
|
||||||
isMuchOlder -> false
|
|
||||||
isMoreAccurate -> true
|
|
||||||
isNewer && !isLessAccurate -> true
|
|
||||||
isNewer && !isMuchLessAccurate && isFromSameProvider -> true
|
|
||||||
else -> false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,14 +1,5 @@
|
|||||||
package de.mm20.launcher2.ktx
|
package de.mm20.launcher2.ktx
|
||||||
|
|
||||||
fun Boolean.toInt(): Int {
|
inline fun Boolean.toInt(): Int {
|
||||||
return if (this) 1 else 0
|
return if (this) 1 else 0
|
||||||
}
|
}
|
||||||
|
|
||||||
fun <T> Boolean.fold(
|
|
||||||
whenTrue: () -> T,
|
|
||||||
otherwise: () -> T
|
|
||||||
): T = if (this) whenTrue() else otherwise()
|
|
||||||
|
|
||||||
fun <T> Boolean.foldOrNull(
|
|
||||||
whenTrue: () -> T
|
|
||||||
): T? = fold(whenTrue) { null }
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user