Auto: reload entity registry, show loading when changing servers (#3769)

* Reload entity registry, show loading when changing servers

* Don't block collecting server IDs by using a Job
This commit is contained in:
Joris Pelgröm 2023-08-08 22:05:33 +02:00 committed by GitHub
parent 6a8fd5989a
commit f90d80638e
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -24,6 +24,7 @@ import io.homeassistant.companion.android.util.vehicle.getChangeServerGridItem
import io.homeassistant.companion.android.util.vehicle.getDomainList
import io.homeassistant.companion.android.util.vehicle.getNavigationGridItem
import io.homeassistant.companion.android.util.vehicle.nativeModeActionStrip
import kotlinx.coroutines.Job
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.StateFlow
@ -50,7 +51,9 @@ class MainVehicleScreen(
private var favoritesList = emptyList<String>()
private var isLoggedIn: Boolean? = null
private val domains = mutableSetOf<String>()
private var domainsJob: Job? = null
private var domainsAdded = false
private var domainsAddedFor: Int? = null
private val isAutomotive get() = carContext.packageManager.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE)
@ -69,23 +72,34 @@ class MainVehicleScreen(
.getSessionState() == SessionState.CONNECTED
invalidate()
}
entityRegistry = serverManager.webSocketRepository(serverId.value).getEntityRegistry()
allEntities.collect { entities ->
val newDomains = entities.values
.map { it.domain }
.distinct()
.filter { it in SUPPORTED_DOMAINS }
.toSet()
var invalidate = newDomains.size != domains.size || newDomains != domains || !domainsAdded
domains.clear()
domains.addAll(newDomains)
domainsAdded = true
serverId.collect { server ->
if (domainsAddedFor != server) {
domainsAdded = false
domainsAddedFor = server
invalidate() // Show loading state
entityRegistry = serverManager.webSocketRepository(server).getEntityRegistry()
}
val newFavorites = getFavoritesList(entities)
invalidate = invalidate || (newFavorites.size != favoritesEntities.size || newFavorites.toSet() != favoritesEntities.toSet())
favoritesEntities = newFavorites
if (domainsJob?.isActive == true) domainsJob?.cancel()
domainsJob = launch {
allEntities.collect { entities ->
val newDomains = entities.values
.map { it.domain }
.distinct()
.filter { it in SUPPORTED_DOMAINS }
.toSet()
var invalidate = newDomains.size != domains.size || newDomains != domains || !domainsAdded
domains.clear()
domains.addAll(newDomains)
domainsAdded = true
if (invalidate) invalidate()
val newFavorites = getFavoritesList(entities)
invalidate = invalidate || newFavorites.size != favoritesEntities.size || newFavorites.toSet() != favoritesEntities.toSet()
favoritesEntities = newFavorites
if (invalidate) invalidate()
}
}
}
}
}