- change location retrieval accuracy

- change location retrieval caching from location provider
This commit is contained in:
2023-11-07 19:18:29 +00:00
parent 5cf4b312dc
commit 65d0c17b00
3 changed files with 17 additions and 63 deletions

View File

@@ -6,12 +6,8 @@ import android.content.Context
import android.location.Geocoder import android.location.Geocoder
import android.location.Location import android.location.Location
import android.location.LocationManager import android.location.LocationManager
import android.os.HandlerThread
import androidx.annotation.RequiresPermission import androidx.annotation.RequiresPermission
import com.appttude.h_mal.atlas_weather.model.types.LocationType import com.appttude.h_mal.atlas_weather.model.types.LocationType
import com.google.android.gms.location.LocationCallback
import com.google.android.gms.location.LocationRequest
import com.google.android.gms.location.LocationResult
import com.google.android.gms.location.LocationServices import com.google.android.gms.location.LocationServices
import com.google.android.gms.location.Priority import com.google.android.gms.location.Priority
import com.google.android.gms.tasks.CancellationToken import com.google.android.gms.tasks.CancellationToken
@@ -19,8 +15,6 @@ import com.google.android.gms.tasks.OnTokenCanceledListener
import kotlinx.coroutines.tasks.await import kotlinx.coroutines.tasks.await
import java.io.IOException import java.io.IOException
import java.util.* import java.util.*
import kotlin.coroutines.resume
import kotlin.coroutines.suspendCoroutine
class LocationProviderImpl( class LocationProviderImpl(
@@ -33,7 +27,13 @@ class LocationProviderImpl(
@RequiresPermission(value = ACCESS_COARSE_LOCATION) @RequiresPermission(value = ACCESS_COARSE_LOCATION)
override suspend fun getCurrentLatLong(): Pair<Double, Double> { override suspend fun getCurrentLatLong(): Pair<Double, Double> {
val location = client.lastLocation.await() ?: getAFreshLocation() val lastLocation = client.lastLocation.await()
lastLocation?.let {
val delta = it.time - System.currentTimeMillis()
if (delta < 300000) return it.getLatLonPair()
}
val location = getAFreshLocation()
return location?.getLatLonPair() ?: throw IOException("Unable to get location") return location?.getLatLonPair() ?: throw IOException("Unable to get location")
} }
@@ -68,57 +68,13 @@ class LocationProviderImpl(
@SuppressLint("MissingPermission") @SuppressLint("MissingPermission")
private suspend fun getAFreshLocation(): Location? { private suspend fun getAFreshLocation(): Location? {
return client.getCurrentLocation(Priority.PRIORITY_LOW_POWER, object : CancellationToken() { return client.getCurrentLocation(
Priority.PRIORITY_HIGH_ACCURACY,
object : CancellationToken() {
override fun isCancellationRequested(): Boolean = false override fun isCancellationRequested(): Boolean = false
override fun onCanceledRequested(p0: OnTokenCanceledListener): CancellationToken = this override fun onCanceledRequested(p0: OnTokenCanceledListener): CancellationToken =
this
}).await() }).await()
} }
@SuppressLint("MissingPermission")
private suspend fun requestFreshLocation(): Location? {
val handlerThread = HandlerThread("MyHandlerThread")
handlerThread.start()
// Now get the Looper from the HandlerThread
// NOTE: This call will block until the HandlerThread gets control and initializes its Looper
val looper = handlerThread.looper
return suspendCoroutine { cont ->
val callback = object : LocationCallback() {
override fun onLocationResult(p0: LocationResult) {
client.removeLocationUpdates(this)
cont.resume(p0.lastLocation)
}
}
with(locationManager!!) {
when {
isProviderEnabled(LocationManager.GPS_PROVIDER) -> {
client.requestLocationUpdates(
createLocationRequest(Priority.PRIORITY_HIGH_ACCURACY),
callback,
looper
)
}
isProviderEnabled(LocationManager.NETWORK_PROVIDER) -> {
client.requestLocationUpdates(
createLocationRequest(Priority.PRIORITY_LOW_POWER),
callback,
looper
)
}
else -> {
cont.resume(null)
}
}
}
}
}
private fun createLocationRequest(priority: Int) = LocationRequest.create()
.setPriority(priority)
.setNumUpdates(1)
.setExpirationDuration(1000)
} }

View File

@@ -22,7 +22,7 @@ abstract class BaseWidgetServiceIntentClass<T : AppWidgetProvider> : JobIntentSe
lateinit var appWidgetManager: AppWidgetManager lateinit var appWidgetManager: AppWidgetManager
lateinit var appWidgetIds: IntArray lateinit var appWidgetIds: IntArray
fun initBaseWidget(componentName: ComponentName) { fun initiallizeWidgetData(componentName: ComponentName) {
appWidgetManager = AppWidgetManager.getInstance(baseContext) appWidgetManager = AppWidgetManager.getInstance(baseContext)
appWidgetIds = appWidgetManager.getAppWidgetIds(componentName) appWidgetIds = appWidgetManager.getAppWidgetIds(componentName)
} }

View File

@@ -48,7 +48,7 @@ class WidgetJobServiceIntent : BaseWidgetServiceIntentClass<NewAppWidget>() {
private fun executeWidgetUpdate() { private fun executeWidgetUpdate() {
val componentName = ComponentName(this, NewAppWidget::class.java) val componentName = ComponentName(this, NewAppWidget::class.java)
initBaseWidget(componentName) initiallizeWidgetData(componentName)
initiateWidgetUpdate(getCurrentWidgetState()) initiateWidgetUpdate(getCurrentWidgetState())
} }
@@ -56,9 +56,7 @@ class WidgetJobServiceIntent : BaseWidgetServiceIntentClass<NewAppWidget>() {
private fun initiateWidgetUpdate(state: WidgetState) { private fun initiateWidgetUpdate(state: WidgetState) {
when (state) { when (state) {
NO_LOCATION, SCREEN_ON_CONNECTION_UNAVAILABLE -> updateErrorWidget(state) NO_LOCATION, SCREEN_ON_CONNECTION_UNAVAILABLE -> updateErrorWidget(state)
SCREEN_ON_CONNECTION_AVAILABLE -> updateWidget(false) else -> updateWidget(false)
SCREEN_OFF_CONNECTION_AVAILABLE -> updateWidget(true)
SCREEN_OFF_CONNECTION_UNAVAILABLE -> return
} }
} }