diff --git a/app/src/main/java/io/homeassistant/companion/android/util/vehicle/GridItems.kt b/app/src/main/java/io/homeassistant/companion/android/util/vehicle/GridItems.kt index 9a067f129..785f24b25 100755 --- a/app/src/main/java/io/homeassistant/companion/android/util/vehicle/GridItems.kt +++ b/app/src/main/java/io/homeassistant/companion/android/util/vehicle/GridItems.kt @@ -9,6 +9,7 @@ import androidx.car.app.model.CarColor import androidx.car.app.model.CarIcon import androidx.car.app.model.GridItem import androidx.car.app.model.ItemList +import androidx.lifecycle.LifecycleCoroutineScope import com.mikepenz.iconics.IconicsDrawable import com.mikepenz.iconics.typeface.library.community.material.CommunityMaterial import com.mikepenz.iconics.utils.sizeDp @@ -20,7 +21,9 @@ import io.homeassistant.companion.android.common.data.integration.domain import io.homeassistant.companion.android.common.data.integration.getIcon import io.homeassistant.companion.android.common.data.prefs.PrefsRepository import io.homeassistant.companion.android.common.data.servers.ServerManager +import io.homeassistant.companion.android.common.data.websocket.impl.entities.EntityRegistryResponse import io.homeassistant.companion.android.common.util.capitalize +import io.homeassistant.companion.android.util.RegistriesDataHandler import io.homeassistant.companion.android.vehicle.ChangeServerScreen import io.homeassistant.companion.android.vehicle.DomainListScreen import io.homeassistant.companion.android.vehicle.EntityGridVehicleScreen @@ -28,6 +31,7 @@ import io.homeassistant.companion.android.vehicle.MapVehicleScreen import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.map +import kotlinx.coroutines.launch import java.util.Calendar import java.util.Locale @@ -113,7 +117,9 @@ fun getDomainList( serverManager: ServerManager, serverId: StateFlow, prefsRepository: PrefsRepository, - allEntities: Flow>> + allEntities: Flow>>, + entityRegistry: List?, + lifecycleScope: LifecycleCoroutineScope ): ItemList.Builder { val listBuilder = ItemList.Builder() domains.forEach { domain -> @@ -131,40 +137,57 @@ fun getDomainList( null ).getIcon(carContext) - listBuilder.addItem( - GridItem.Builder().apply { - if (icon != null) { - setImage( - CarIcon.Builder( - IconicsDrawable(carContext, icon) - .apply { - sizeDp = 64 - }.toAndroidIconCompat() - ) - .setTint(CarColor.DEFAULT) - .build() - ) - } + val entityList = allEntities.map { + it.values.filter { entity -> + entity.domain == domain && RegistriesDataHandler.getHiddenByForEntity( + entity.entityId, + entityRegistry + ) == null } - .setTitle(friendlyDomain) - .setOnClickListener { - Log.i(TAG, "Domain:$domain clicked") - screenManager.push( - EntityGridVehicleScreen( - carContext, - serverManager, - serverId, - prefsRepository, - serverManager.integrationRepository(serverId.value), - friendlyDomain, - domains, - allEntities.map { it.values.filter { entity -> entity.domain == domain } }, - allEntities - ) { } - ) + } + var domainIsEmpty = false + lifecycleScope.launch { + entityList.collect { + domainIsEmpty = it.isEmpty() + } + } + if (!domainIsEmpty) { + listBuilder.addItem( + GridItem.Builder().apply { + if (icon != null) { + setImage( + CarIcon.Builder( + IconicsDrawable(carContext, icon) + .apply { + sizeDp = 64 + }.toAndroidIconCompat() + ) + .setTint(CarColor.DEFAULT) + .build() + ) + } } - .build() - ) + .setTitle(friendlyDomain) + .setOnClickListener { + Log.i(TAG, "Domain:$domain clicked") + screenManager.push( + EntityGridVehicleScreen( + carContext, + serverManager, + serverId, + prefsRepository, + serverManager.integrationRepository(serverId.value), + friendlyDomain, + entityRegistry, + domains, + entityList, + allEntities + ) { } + ) + } + .build() + ) + } } return listBuilder } @@ -177,7 +200,8 @@ fun getDomainsGridItem( integrationRepository: IntegrationRepository, serverId: StateFlow, allEntities: Flow>>, - prefsRepository: PrefsRepository + prefsRepository: PrefsRepository, + entityRegistry: List? ): GridItem.Builder { return GridItem.Builder().apply { setTitle(carContext.getString(R.string.all_entities)) @@ -202,7 +226,8 @@ fun getDomainsGridItem( integrationRepository, serverId, allEntities, - prefsRepository + prefsRepository, + entityRegistry ) ) } diff --git a/app/src/main/java/io/homeassistant/companion/android/vehicle/DomainListScreen.kt b/app/src/main/java/io/homeassistant/companion/android/vehicle/DomainListScreen.kt index 664080720..3e9ab7d8a 100755 --- a/app/src/main/java/io/homeassistant/companion/android/vehicle/DomainListScreen.kt +++ b/app/src/main/java/io/homeassistant/companion/android/vehicle/DomainListScreen.kt @@ -15,6 +15,7 @@ import io.homeassistant.companion.android.common.data.integration.IntegrationRep import io.homeassistant.companion.android.common.data.integration.domain import io.homeassistant.companion.android.common.data.prefs.PrefsRepository import io.homeassistant.companion.android.common.data.servers.ServerManager +import io.homeassistant.companion.android.common.data.websocket.impl.entities.EntityRegistryResponse import io.homeassistant.companion.android.util.vehicle.SUPPORTED_DOMAINS import io.homeassistant.companion.android.util.vehicle.getDomainList import io.homeassistant.companion.android.util.vehicle.nativeModeActionStrip @@ -29,7 +30,8 @@ class DomainListScreen( val integrationRepository: IntegrationRepository, private val serverId: StateFlow, private val allEntities: Flow>>, - private val prefsRepository: PrefsRepository + private val prefsRepository: PrefsRepository, + private val entityRegistry: List? ) : BaseVehicleScreen(carContext) { companion object { @@ -68,7 +70,9 @@ class DomainListScreen( serverManager, serverId, prefsRepository, - allEntities + allEntities, + entityRegistry, + lifecycleScope ) return GridTemplate.Builder().apply { diff --git a/app/src/main/java/io/homeassistant/companion/android/vehicle/EntityGridVehicleScreen.kt b/app/src/main/java/io/homeassistant/companion/android/vehicle/EntityGridVehicleScreen.kt index fa2e51dad..5ed27a05c 100644 --- a/app/src/main/java/io/homeassistant/companion/android/vehicle/EntityGridVehicleScreen.kt +++ b/app/src/main/java/io/homeassistant/companion/android/vehicle/EntityGridVehicleScreen.kt @@ -33,6 +33,7 @@ import io.homeassistant.companion.android.common.data.integration.isExecuting import io.homeassistant.companion.android.common.data.integration.onPressed import io.homeassistant.companion.android.common.data.prefs.PrefsRepository import io.homeassistant.companion.android.common.data.servers.ServerManager +import io.homeassistant.companion.android.common.data.websocket.impl.entities.EntityRegistryResponse import io.homeassistant.companion.android.util.vehicle.MAP_DOMAINS import io.homeassistant.companion.android.util.vehicle.NOT_ACTIONABLE_DOMAINS import io.homeassistant.companion.android.util.vehicle.SUPPORTED_DOMAINS @@ -53,6 +54,7 @@ class EntityGridVehicleScreen( val prefsRepository: PrefsRepository, val integrationRepository: IntegrationRepository, val title: String, + private val entityRegistry: List?, private val domains: MutableSet, private val entitiesFlow: Flow>>, private val allEntities: Flow>>, @@ -92,7 +94,9 @@ class EntityGridVehicleScreen( serverManager, serverId, prefsRepository, - allEntities + allEntities, + entityRegistry, + lifecycleScope ) } if (isFavorites) { @@ -112,7 +116,8 @@ class EntityGridVehicleScreen( integrationRepository, serverId, allEntities, - prefsRepository + prefsRepository, + entityRegistry ).build() ) if (shouldSwitchServers) { diff --git a/app/src/main/java/io/homeassistant/companion/android/vehicle/MainVehicleScreen.kt b/app/src/main/java/io/homeassistant/companion/android/vehicle/MainVehicleScreen.kt index dffb73cfe..50e2f8b69 100644 --- a/app/src/main/java/io/homeassistant/companion/android/vehicle/MainVehicleScreen.kt +++ b/app/src/main/java/io/homeassistant/companion/android/vehicle/MainVehicleScreen.kt @@ -17,6 +17,7 @@ import io.homeassistant.companion.android.common.data.integration.Entity import io.homeassistant.companion.android.common.data.integration.domain import io.homeassistant.companion.android.common.data.prefs.PrefsRepository import io.homeassistant.companion.android.common.data.servers.ServerManager +import io.homeassistant.companion.android.common.data.websocket.impl.entities.EntityRegistryResponse import io.homeassistant.companion.android.sensors.SensorReceiver import io.homeassistant.companion.android.util.vehicle.SUPPORTED_DOMAINS import io.homeassistant.companion.android.util.vehicle.getChangeServerGridItem @@ -45,6 +46,7 @@ class MainVehicleScreen( } private var favoritesEntities: List> = listOf() + private var entityRegistry: List? = null private var favoritesList = emptyList() private var isLoggedIn: Boolean? = null private val domains = mutableSetOf() @@ -66,6 +68,7 @@ class MainVehicleScreen( .getSessionState() == SessionState.CONNECTED invalidate() } + entityRegistry = serverManager.webSocketRepository(serverId.value).getEntityRegistry() allEntities.collect { entities -> val newDomains = entities.values .map { it.domain } @@ -112,6 +115,7 @@ class MainVehicleScreen( prefsRepository, serverManager.integrationRepository(serverId.value), carContext.getString(commonR.string.favorites), + entityRegistry, domains, flowOf(), allEntities @@ -126,7 +130,9 @@ class MainVehicleScreen( serverManager, serverId, prefsRepository, - allEntities + allEntities, + entityRegistry, + lifecycleScope ) }