Switch from viewModelScope to lifecycleScope for external collections (#3045)

* Switch from viewmodelscope to lifecyclescope for external collections

* Check loading state before collecting

* Revert previous changes for checking loading state

* Skip collection if not connected

* Simplify launching collections
This commit is contained in:
Daniel Shokouhi 2022-11-12 05:23:44 -08:00 committed by GitHub
parent 5bac66c0c7
commit 33d1e30cb1
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 55 additions and 32 deletions

View file

@ -6,11 +6,15 @@ import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.viewModels
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle
import dagger.hilt.android.AndroidEntryPoint
import io.homeassistant.companion.android.home.views.LoadHomePage
import io.homeassistant.companion.android.onboarding.OnboardingActivity
import io.homeassistant.companion.android.onboarding.integration.MobileAppIntegrationActivity
import io.homeassistant.companion.android.sensors.SensorWorker
import kotlinx.coroutines.launch
import javax.inject.Inject
@AndroidEntryPoint
@ -40,6 +44,15 @@ class HomeActivity : ComponentActivity(), HomeView {
}
mainViewModel.init(presenter)
lifecycleScope.launch {
lifecycle.repeatOnLifecycle(Lifecycle.State.RESUMED) {
launch { mainViewModel.entityUpdates() }
launch { mainViewModel.areaUpdates() }
launch { mainViewModel.deviceUpdates() }
launch { mainViewModel.entityRegistryUpdates() }
}
}
}
override fun onResume() {

View file

@ -167,38 +167,6 @@ class MainViewModel @Inject constructor(
} else {
LoadingState.ERROR
}
// Listen for updates
viewModelScope.launch {
homePresenter.getEntityUpdates()?.collect {
if (supportedDomains().contains(it.domain)) {
entities[it.entityId] = it
updateEntityDomains()
}
}
}
viewModelScope.launch {
homePresenter.getAreaRegistryUpdates()?.collect {
areaRegistry = homePresenter.getAreaRegistry()
areas.clear()
areaRegistry?.let {
areas.addAll(it)
}
updateEntityDomains()
}
}
viewModelScope.launch {
homePresenter.getDeviceRegistryUpdates()?.collect {
deviceRegistry = homePresenter.getDeviceRegistry()
updateEntityDomains()
}
}
viewModelScope.launch {
homePresenter.getEntityRegistryUpdates()?.collect {
entityRegistry = homePresenter.getEntityRegistry()
updateEntityDomains()
}
}
} catch (e: Exception) {
Log.e(TAG, "Exception while loading entities", e)
loadingState.value = LoadingState.ERROR
@ -206,6 +174,48 @@ class MainViewModel @Inject constructor(
}
}
suspend fun entityUpdates() {
if (!homePresenter.isConnected())
return
homePresenter.getEntityUpdates()?.collect {
if (supportedDomains().contains(it.domain)) {
entities[it.entityId] = it
updateEntityDomains()
}
}
}
suspend fun areaUpdates() {
if (!homePresenter.isConnected())
return
homePresenter.getAreaRegistryUpdates()?.collect {
areaRegistry = homePresenter.getAreaRegistry()
areas.clear()
areaRegistry?.let {
areas.addAll(it)
}
updateEntityDomains()
}
}
suspend fun deviceUpdates() {
if (!homePresenter.isConnected())
return
homePresenter.getDeviceRegistryUpdates()?.collect {
deviceRegistry = homePresenter.getDeviceRegistry()
updateEntityDomains()
}
}
suspend fun entityRegistryUpdates() {
if (!homePresenter.isConnected())
return
homePresenter.getEntityRegistryUpdates()?.collect {
entityRegistry = homePresenter.getEntityRegistry()
updateEntityDomains()
}
}
fun updateEntityDomains() {
val entitiesList = entities.values.toList().sortedBy { it.entityId }
val areasList = areaRegistry.orEmpty().sortedBy { it.name }