From b2f8dad805ed328934c5e2b196a67bf75f6a68e9 Mon Sep 17 00:00:00 2001 From: andrekir Date: Sat, 15 Jul 2023 09:14:43 -0300 Subject: [PATCH] feat: add preferred `LocationManager` providers --- .../location/SharedLocationManager.kt | 30 +++++++++++++------ 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/app/src/fdroid/java/com/geeksville/mesh/repository/location/SharedLocationManager.kt b/app/src/fdroid/java/com/geeksville/mesh/repository/location/SharedLocationManager.kt index 35d3ae31b..cfa34871d 100644 --- a/app/src/fdroid/java/com/geeksville/mesh/repository/location/SharedLocationManager.kt +++ b/app/src/fdroid/java/com/geeksville/mesh/repository/location/SharedLocationManager.kt @@ -33,7 +33,7 @@ class SharedLocationManager constructor( // Defaults from device positionBroadcastSmart private val timeTravelMinimum = 30 * 1000L // 30 seconds - private val distanceTravelMinimum = 30F // 30 meters + private val distanceTravelMinimum = 0f @SuppressLint("MissingPermission") private val _locationUpdates = callbackFlow { @@ -45,18 +45,30 @@ class SharedLocationManager constructor( if (!context.hasBackgroundPermission()) close() - info("Starting location updates with minTimeMs=${timeTravelMinimum}ms and minDistanceM=${distanceTravelMinimum}m") + val providerList = buildList { + val providers = locationManager.allProviders + if (android.os.Build.VERSION.SDK_INT >= 31 && LocationManager.FUSED_PROVIDER in providers) { + add(LocationManager.FUSED_PROVIDER) + } else { + if (LocationManager.NETWORK_PROVIDER in providers) add(LocationManager.NETWORK_PROVIDER) + if (LocationManager.GPS_PROVIDER in providers) add(LocationManager.GPS_PROVIDER) + } + } + + info("Starting location updates with $providerList minTimeMs=${timeTravelMinimum}ms and minDistanceM=${distanceTravelMinimum}m") _receivingLocationUpdates.value = true GeeksvilleApplication.analytics.track("location_start") // Figure out how many users needed to use the phone GPS try { - locationManager.requestLocationUpdates( - LocationManager.GPS_PROVIDER, - timeTravelMinimum, - distanceTravelMinimum, - callback, - context.mainLooper - ) + providerList.forEach { provider -> + locationManager.requestLocationUpdates( + provider, + timeTravelMinimum, + distanceTravelMinimum, + callback, + context.mainLooper + ) + } } catch (e: Exception) { close(e) // in case of exception, close the Flow }