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