From 608b7e93116173d38416fa5b06346868309b3a49 Mon Sep 17 00:00:00 2001 From: Arty Bishop Date: Mon, 24 Jan 2022 17:56:57 +0000 Subject: [PATCH] Now properly handling the state of location updates --- .../look4sat/framework/LocationProvider.kt | 35 +++++++++++-------- .../settingsScreen/SettingsFragment.kt | 3 ++ .../look4sat/domain/LocationHandler.kt | 2 ++ .../look4sat/domain/model/DataState.kt | 1 + 4 files changed, 26 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/com/rtbishop/look4sat/framework/LocationProvider.kt b/app/src/main/java/com/rtbishop/look4sat/framework/LocationProvider.kt index f166eade..122411d2 100644 --- a/app/src/main/java/com/rtbishop/look4sat/framework/LocationProvider.kt +++ b/app/src/main/java/com/rtbishop/look4sat/framework/LocationProvider.kt @@ -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>( - extraBufferCapacity = 1, - onBufferOverflow = BufferOverflow.DROP_OLDEST - ) + private val _stationPosition = MutableStateFlow>(DataState.Handled) private var currentPosition = settingsProvider.loadStationPosition() - override val stationPosition: SharedFlow> = _stationPosition + + override val stationPosition: StateFlow> = _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) { diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/settingsScreen/SettingsFragment.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/settingsScreen/SettingsFragment.kt index cf1c3a5b..76f3e6a9 100644 --- a/app/src/main/java/com/rtbishop/look4sat/presentation/settingsScreen/SettingsFragment.kt +++ b/app/src/main/java/com/rtbishop/look4sat/presentation/settingsScreen/SettingsFragment.kt @@ -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 -> {} } } diff --git a/core/src/main/java/com/rtbishop/look4sat/domain/LocationHandler.kt b/core/src/main/java/com/rtbishop/look4sat/domain/LocationHandler.kt index 2a2c41ed..edfac04a 100644 --- a/core/src/main/java/com/rtbishop/look4sat/domain/LocationHandler.kt +++ b/core/src/main/java/com/rtbishop/look4sat/domain/LocationHandler.kt @@ -17,4 +17,6 @@ interface LocationHandler { fun setPositionFromNet() fun setPositionFromQth(qthString: String) + + fun setPositionHandled() } diff --git a/core/src/main/java/com/rtbishop/look4sat/domain/model/DataState.kt b/core/src/main/java/com/rtbishop/look4sat/domain/model/DataState.kt index 8430df72..f654dd86 100644 --- a/core/src/main/java/com/rtbishop/look4sat/domain/model/DataState.kt +++ b/core/src/main/java/com/rtbishop/look4sat/domain/model/DataState.kt @@ -20,5 +20,6 @@ package com.rtbishop.look4sat.domain.model sealed class DataState { data class Success(val data: T) : DataState() data class Error(val message: String?) : DataState() + object Handled : DataState() object Loading : DataState() }