From 31ed6230bac023331328a531e325cb2f778c38f3 Mon Sep 17 00:00:00 2001 From: Arty Bishop Date: Wed, 17 Mar 2021 20:47:24 +0000 Subject: [PATCH] Swapped Entries StateFlow for SharedFlow --- .../rtbishop/look4sat/ui/SharedViewModel.kt | 34 +++++++------------ .../ui/entriesScreen/EntriesFragment.kt | 18 ++++++---- 2 files changed, 24 insertions(+), 28 deletions(-) diff --git a/app/src/main/java/com/rtbishop/look4sat/ui/SharedViewModel.kt b/app/src/main/java/com/rtbishop/look4sat/ui/SharedViewModel.kt index fa3c076a..8d44adb9 100644 --- a/app/src/main/java/com/rtbishop/look4sat/ui/SharedViewModel.kt +++ b/app/src/main/java/com/rtbishop/look4sat/ui/SharedViewModel.kt @@ -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.InProgress) + private val satDataState = MutableSharedFlow>>(replay = 0) + private val satDataFlow = satelliteRepo.satDataFlow.map { Result.Success(it) } + val satData = flowOf(satDataState, satDataFlow).flattenMerge().asLiveData() + private val _passes = MutableStateFlow>>(Result.InProgress) val passes: LiveData>> = _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 = 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") } diff --git a/app/src/main/java/com/rtbishop/look4sat/ui/entriesScreen/EntriesFragment.kt b/app/src/main/java/com/rtbishop/look4sat/ui/entriesScreen/EntriesFragment.kt index 89cdae8b..5f3bc20e 100644 --- a/app/src/main/java/com/rtbishop/look4sat/ui/entriesScreen/EntriesFragment.kt +++ b/app/src/main/java/com/rtbishop/look4sat/ui/entriesScreen/EntriesFragment.kt @@ -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 } }