Cleanup with using flow instead of LiveData

This commit is contained in:
Iamlooker 2022-06-30 19:50:13 +05:30
parent dfa7d6ffbd
commit 2f76f124d7
No known key found for this signature in database
GPG Key ID: 16F53B972BAECA48
3 changed files with 29 additions and 27 deletions

View File

@ -23,7 +23,7 @@ fun RepositoryPage(viewModel: RepositoriesViewModelX) {
Scaffold( Scaffold(
modifier = Modifier.fillMaxSize(), modifier = Modifier.fillMaxSize(),
floatingActionButton = { floatingActionButton = {
ExtendedFloatingActionButton(onClick = { viewModel.addRepository() }) { ExtendedFloatingActionButton(onClick = { viewModel.showRepositorySheet(editMode = true) }) {
Icon(imageVector = Icons.Rounded.Add, contentDescription = "Add Repository") Icon(imageVector = Icons.Rounded.Add, contentDescription = "Add Repository")
Text(text = "Add Repository") Text(text = "Add Repository")
} }

View File

@ -34,7 +34,17 @@ class PrefsRepositoriesFragment : BaseNavFragment() {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
lifecycleScope.launchWhenStarted { lifecycleScope.launchWhenStarted {
viewModel.showSheet.collectLatest { viewModel.showSheet.collectLatest {
RepositorySheetX(it).showNow(childFragmentManager, "Repository $it") if (it.editMode) {
EditRepositorySheetX(it.repositoryId).showNow(
childFragmentManager,
"Repository ${it.repositoryId}"
)
} else {
RepositorySheetX(it.repositoryId).showNow(
childFragmentManager,
"Repository $it"
)
}
} }
} }
return ComposeView(requireContext()).apply { return ComposeView(requireContext()).apply {
@ -44,13 +54,6 @@ class PrefsRepositoriesFragment : BaseNavFragment() {
override fun setupLayout() { override fun setupLayout() {
viewModel.bindConnection(requireContext()) viewModel.bindConnection(requireContext())
viewModel.toLaunch.observe(viewLifecycleOwner) {
if (it?.first == true) {
EditRepositorySheetX(it.second)
.showNow(parentFragmentManager, "Repository ${it.second}")
viewModel.emptyToLaunch()
}
}
} }
override fun onDestroyView() { override fun onDestroyView() {

View File

@ -1,7 +1,6 @@
package com.looker.droidify.ui.viewmodels package com.looker.droidify.ui.viewmodels
import android.content.Context import android.content.Context
import androidx.lifecycle.MediatorLiveData
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
@ -21,12 +20,10 @@ import kotlinx.coroutines.withContext
class RepositoriesViewModelX(val repositoryDao: RepositoryDao) : ViewModel() { class RepositoriesViewModelX(val repositoryDao: RepositoryDao) : ViewModel() {
val toLaunch: MediatorLiveData<Pair<Boolean, Long>?> = MediatorLiveData()
val syncConnection = Connection(SyncService::class.java) val syncConnection = Connection(SyncService::class.java)
private val _showSheet = MutableSharedFlow<Long>() private val _showSheet = MutableSharedFlow<SheetNavigationData>()
val showSheet: SharedFlow<Long> = _showSheet val showSheet: SharedFlow<SheetNavigationData> = _showSheet
private val _repositories = MutableStateFlow<List<Repository>>(emptyList()) private val _repositories = MutableStateFlow<List<Repository>>(emptyList())
val repositories = _repositories.asStateFlow() val repositories = _repositories.asStateFlow()
@ -37,15 +34,22 @@ class RepositoriesViewModelX(val repositoryDao: RepositoryDao) : ViewModel() {
_repositories.emit(it) _repositories.emit(it)
} }
} }
toLaunch.value = null
} }
fun bindConnection(context: Context) { fun bindConnection(context: Context) {
viewModelScope.launch { syncConnection.bind(context) } viewModelScope.launch { syncConnection.bind(context) }
} }
fun showRepositorySheet(repositoryId: Long) { fun showRepositorySheet(repositoryId: Long = 0L, editMode: Boolean = false) {
viewModelScope.launch { _showSheet.emit(repositoryId) } viewModelScope.launch {
_showSheet.emit(
if (editMode) {
SheetNavigationData(repositoryId, editMode)
} else {
SheetNavigationData(addNewRepository(), editMode)
}
)
}
} }
fun toggleRepository(repository: Repository, isEnabled: Boolean) { fun toggleRepository(repository: Repository, isEnabled: Boolean) {
@ -54,21 +58,11 @@ class RepositoriesViewModelX(val repositoryDao: RepositoryDao) : ViewModel() {
} }
} }
fun addRepository() {
viewModelScope.launch {
toLaunch.value = Pair(true, addNewRepository())
}
}
private suspend fun addNewRepository(): Long = withContext(Dispatchers.IO) { private suspend fun addNewRepository(): Long = withContext(Dispatchers.IO) {
repositoryDao.insert(newRepository()) repositoryDao.insert(newRepository())
repositoryDao.latestAddedId() repositoryDao.latestAddedId()
} }
fun emptyToLaunch() {
toLaunch.value = null
}
class Factory(private val repoDao: RepositoryDao) : ViewModelProvider.Factory { class Factory(private val repoDao: RepositoryDao) : ViewModelProvider.Factory {
@Suppress("unchecked_cast") @Suppress("unchecked_cast")
override fun <T : ViewModel> create(modelClass: Class<T>): T { override fun <T : ViewModel> create(modelClass: Class<T>): T {
@ -79,3 +73,8 @@ class RepositoriesViewModelX(val repositoryDao: RepositoryDao) : ViewModel() {
} }
} }
} }
data class SheetNavigationData(
val repositoryId: Long = 0L,
val editMode: Boolean = false
)