mirror of
https://github.com/home-assistant/android
synced 2024-07-24 03:44:23 +00:00
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:
parent
6a8fd5989a
commit
f90d80638e
|
@ -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()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue