Swapped Entries StateFlow for SharedFlow

This commit is contained in:
Arty Bishop committed 2021-03-17 20:47:24 +00:00
1 parent c981f0900a
commit 31ed6230ba
2 files changed
+24 -28

No files matched your search

@@ -29,68 +29,58 @@ import com.rtbishop.look4sat.repository.SatelliteRepo
import com.rtbishop.look4sat.utility.getPredictor
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.FlowPreview
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.*
import kotlinx.coroutines.launch
import timber.log.Timber
import java.util.*
import javax.inject.Inject
import kotlin.system.measureTimeMillis
@FlowPreview
@HiltViewModel
class SharedViewModel @Inject constructor(
private val prefsRepo: PrefsRepo,
private val satelliteRepo: SatelliteRepo,
) : ViewModel() {
private val _satData = MutableStateFlow<Result<List<SatItem>>>(Result.InProgress)
private val satDataState = MutableSharedFlow<Result<List<SatItem>>>(replay = 0)
private val satDataFlow = satelliteRepo.satDataFlow.map { Result.Success(it) }
val satData = flowOf(satDataState, satDataFlow).flattenMerge().asLiveData()
private val _passes = MutableStateFlow<Result<MutableList<SatPass>>>(Result.InProgress)
val passes: LiveData<Result<MutableList<SatPass>>> = _passes.asLiveData()
val satData = _satData.asLiveData(viewModelScope.coroutineContext)
init {
if (prefsRepo.isFirstLaunch()) {
updateSatDataFromSources()
prefsRepo.setFirstLaunchDone()
}
loadSatData()
calculatePasses()
}
private fun loadSatData() {
viewModelScope.launch {
delay(8)
satelliteRepo.satDataFlow.map { Result.Success(it) }.collect {
_satData.value = it
}
}
}
fun updateSatDataFromFile(uri: Uri) {
_satData.value = Result.InProgress
viewModelScope.launch {
satDataState.emit(Result.InProgress)
try {
satelliteRepo.updateSatDataFromFile(uri)
} catch (exception: Exception) {
_satData.value = Result.Error(exception)
satDataState.emit(Result.Error(exception))
}
loadSatData()
}
}
fun updateSatDataFromSources(sources: List<TleSource> = prefsRepo.loadTleSources()) {
_satData.value = Result.InProgress
viewModelScope.launch {
satDataState.emit(Result.InProgress)
val updateMillis = measureTimeMillis {
try {
prefsRepo.saveTleSources(sources)
satelliteRepo.updateSatDataFromWeb(sources)
prefsRepo.saveTleSources(sources)
} catch (exception: Exception) {
_satData.value = Result.Error(exception)
satDataState.emit(Result.Error(exception))
}
loadSatData()
}
Timber.d("Update from WEB took $updateMillis ms")
}
@@ -34,7 +34,9 @@ import com.rtbishop.look4sat.utility.RecyclerDivider
import com.rtbishop.look4sat.utility.navigateSafe
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.FlowPreview
@FlowPreview
@AndroidEntryPoint
class EntriesFragment : Fragment(R.layout.fragment_entries) {
@@ -77,8 +79,12 @@ class EntriesFragment : Fragment(R.layout.fragment_entries) {
viewModel.satData.observe(viewLifecycleOwner, { result ->
when (result) {
is Result.Success -> {
entriesAdapter?.setItems(result.data)
setLoaded()
if (result.data.isEmpty()) {
setEmpty()
} else {
entriesAdapter?.setItems(result.data)
setLoaded()
}
}
is Result.InProgress -> {
setLoading()
@@ -88,7 +94,7 @@ class EntriesFragment : Fragment(R.layout.fragment_entries) {
Snackbar.make(requireView(), errorMsg, Snackbar.LENGTH_SHORT).show()
entriesAdapter?.let { adapter ->
if (adapter.getItems().isEmpty()) {
setError()
setEmpty()
} else {
setLoaded()
}
@@ -109,16 +115,16 @@ class EntriesFragment : Fragment(R.layout.fragment_entries) {
private fun setLoading() {
binding?.apply {
entriesError.visibility = View.INVISIBLE
entriesRecycler.visibility = View.INVISIBLE
entriesProgress.visibility = View.VISIBLE
entriesRecycler.visibility = View.INVISIBLE
}
}
private fun setError() {
private fun setEmpty() {
binding?.apply {
entriesError.visibility = View.VISIBLE
entriesProgress.visibility = View.INVISIBLE
entriesRecycler.visibility = View.INVISIBLE
entriesError.visibility = View.VISIBLE
}
}