Now properly handling the state of location updates

This commit is contained in:
Arty Bishop committed 2022-01-24 17:56:57 +00:00
1 parent b0b2283ca5
commit 608b7e9311
4 files changed
+26 -15

No files matched your search

@@ -32,9 +32,8 @@ import com.rtbishop.look4sat.domain.model.DataState
import com.rtbishop.look4sat.domain.predict.GeoPos import com.rtbishop.look4sat.domain.predict.GeoPos
import com.rtbishop.look4sat.presentation.round import com.rtbishop.look4sat.presentation.round
import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.android.qualifiers.ApplicationContext
import kotlinx.coroutines.channels.BufferOverflow import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.SharedFlow
import javax.inject.Inject import javax.inject.Inject
import javax.inject.Singleton import javax.inject.Singleton
@@ -50,12 +49,10 @@ class LocationProvider @Inject constructor(
private val providerGps = LocationManager.GPS_PROVIDER private val providerGps = LocationManager.GPS_PROVIDER
private val locationCoarse = Manifest.permission.ACCESS_COARSE_LOCATION private val locationCoarse = Manifest.permission.ACCESS_COARSE_LOCATION
private val locationFine = Manifest.permission.ACCESS_FINE_LOCATION private val locationFine = Manifest.permission.ACCESS_FINE_LOCATION
private val _stationPosition = MutableSharedFlow<DataState<GeoPos>>( private val _stationPosition = MutableStateFlow<DataState<GeoPos>>(DataState.Handled)
extraBufferCapacity = 1,
onBufferOverflow = BufferOverflow.DROP_OLDEST
)
private var currentPosition = settingsProvider.loadStationPosition() private var currentPosition = settingsProvider.loadStationPosition()
override val stationPosition: SharedFlow<DataState<GeoPos>> = _stationPosition
override val stationPosition: StateFlow<DataState<GeoPos>> = _stationPosition
override fun getStationPosition(): GeoPos = currentPosition override fun getStationPosition(): GeoPos = currentPosition
@@ -65,8 +62,9 @@ class LocationProvider @Inject constructor(
val newLon = longitude.round(4) val newLon = longitude.round(4)
currentPosition = GeoPos(newLat, newLon) currentPosition = GeoPos(newLat, newLon)
settingsProvider.saveStationPosition(newLat, newLon) settingsProvider.saveStationPosition(newLat, newLon)
_stationPosition.tryEmit(DataState.Success(currentPosition)) _stationPosition.value = DataState.Success(currentPosition)
} else _stationPosition.tryEmit(DataState.Error(context.getString(R.string.pref_pos_gps_null))) } else _stationPosition.value =
DataState.Error(context.getString(R.string.pref_pos_gps_null))
} }
override fun setPositionFromGps() { override fun setPositionFromGps() {
@@ -76,10 +74,11 @@ class LocationProvider @Inject constructor(
if (location != null) { if (location != null) {
setStationPosition(location.latitude, location.longitude) setStationPosition(location.latitude, location.longitude)
} else { } else {
_stationPosition.tryEmit(DataState.Loading) _stationPosition.value = DataState.Loading
manager.requestLocationUpdates(providerGps, 0L, 0f, this) manager.requestLocationUpdates(providerGps, 0L, 0f, this)
} }
} else _stationPosition.tryEmit(DataState.Error(context.getString(R.string.pref_pos_gps_null))) } else _stationPosition.value =
DataState.Error(context.getString(R.string.pref_pos_gps_null))
} }
override fun setPositionFromNet() { override fun setPositionFromNet() {
@@ -89,17 +88,23 @@ class LocationProvider @Inject constructor(
if (location != null) { if (location != null) {
setStationPosition(location.latitude, location.longitude) setStationPosition(location.latitude, location.longitude)
} else { } else {
_stationPosition.tryEmit(DataState.Loading) _stationPosition.value = DataState.Loading
manager.requestLocationUpdates(providerNet, 0L, 0f, this) manager.requestLocationUpdates(providerNet, 0L, 0f, this)
} }
} else _stationPosition.tryEmit(DataState.Error(context.getString(R.string.pref_pos_gps_null))) } else _stationPosition.value =
DataState.Error(context.getString(R.string.pref_pos_gps_null))
} }
override fun setPositionFromQth(qthString: String) { override fun setPositionFromQth(qthString: String) {
val position = QthConverter.qthToPosition(qthString) val position = QthConverter.qthToPosition(qthString)
if (position != null) { if (position != null) {
setStationPosition(position.latitude, position.longitude) setStationPosition(position.latitude, position.longitude)
} else _stationPosition.tryEmit(DataState.Error(context.getString(R.string.pref_pos_qth_error))) } else _stationPosition.value =
DataState.Error(context.getString(R.string.pref_pos_qth_error))
}
override fun setPositionHandled() {
_stationPosition.value = DataState.Handled
} }
override fun onLocationChanged(location: Location) { override fun onLocationChanged(location: Location) {
@@ -191,14 +191,17 @@ class SettingsFragment : Fragment(R.layout.fragment_settings) {
setPositionText(pos.data, binding) setPositionText(pos.data, binding)
binding.prefsLocation.locationProgress.isIndeterminate = false binding.prefsLocation.locationProgress.isIndeterminate = false
showToast(getString(R.string.pref_pos_success)) showToast(getString(R.string.pref_pos_success))
locationHandler.setPositionHandled()
} }
is DataState.Error -> { is DataState.Error -> {
binding.prefsLocation.locationProgress.isIndeterminate = false binding.prefsLocation.locationProgress.isIndeterminate = false
showToast(pos.message.toString()) showToast(pos.message.toString())
locationHandler.setPositionHandled()
} }
DataState.Loading -> { DataState.Loading -> {
binding.prefsLocation.locationProgress.isIndeterminate = true binding.prefsLocation.locationProgress.isIndeterminate = true
} }
DataState.Handled -> {}
} }
} }
@@ -17,4 +17,6 @@ interface LocationHandler {
fun setPositionFromNet() fun setPositionFromNet()
fun setPositionFromQth(qthString: String) fun setPositionFromQth(qthString: String)
fun setPositionHandled()
} }
@@ -20,5 +20,6 @@ package com.rtbishop.look4sat.domain.model
sealed class DataState<out T> { sealed class DataState<out T> {
data class Success<out T>(val data: T) : DataState<T>() data class Success<out T>(val data: T) : DataState<T>()
data class Error(val message: String?) : DataState<Nothing>() data class Error(val message: String?) : DataState<Nothing>()
object Handled : DataState<Nothing>()
object Loading : DataState<Nothing>() object Loading : DataState<Nothing>()
} }