mirror of
https://github.com/hmalik144/Weather-apps.git
synced 2026-03-17 23:16:01 +00:00
- change location retrieval accuracy
- change location retrieval caching from location provider
This commit is contained in:
@@ -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(
|
||||||
override fun isCancellationRequested(): Boolean = false
|
Priority.PRIORITY_HIGH_ACCURACY,
|
||||||
override fun onCanceledRequested(p0: OnTokenCanceledListener): CancellationToken = this
|
object : CancellationToken() {
|
||||||
}).await()
|
override fun isCancellationRequested(): Boolean = false
|
||||||
|
override fun onCanceledRequested(p0: OnTokenCanceledListener): CancellationToken =
|
||||||
|
this
|
||||||
|
}).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)
|
|
||||||
}
|
}
|
||||||
@@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user