mirror of
https://github.com/atsunatsu/Look4Sat.git
synced 2026-10-02 03:15:37 +00:00
Now properly handling the state of location updates
This commit is contained in:
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) {
|
||||||
|
|||||||
+3
@@ -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>()
|
||||||
}
|
}
|
||||||
Reference in new issue
Block a user