From ef469fb97740c83d6e7a8c33819feea6b2af4072 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joris=20Pelgr=C3=B6m?= Date: Fri, 7 Jul 2023 17:43:36 +0200 Subject: [PATCH] Only invalidate vehicle template UI when contents change (#3641) * Don't invalidate Auto main screen if domains don't change * Don't invalidate Auto domain/map screen if contents don't change --- .../vehicle/EntityGridVehicleScreen.kt | 3 +- .../android/vehicle/MainVehicleScreen.kt | 15 ++++--- .../android/vehicle/MapVehicleScreen.kt | 39 +++++++++++-------- 3 files changed, 34 insertions(+), 23 deletions(-) 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 4656ca09c..127ca28c4 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 @@ -49,8 +49,9 @@ class EntityGridVehicleScreen( lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) { entitiesFlow.collect { loading = false + val hasChanged = entities.size != it.size || entities.toSet() != it.toSet() entities = it - invalidate() + if (hasChanged) invalidate() } } } 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 4f2cc933a..14acb1d7d 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 @@ -103,13 +103,16 @@ class MainVehicleScreen( invalidate() } allEntities.collect { entities -> - domains.clear() - entities.values.forEach { - if (it.domain in SUPPORTED_DOMAINS) { - domains.add(it.domain) - } + val newDomains = entities.values + .map { it.domain } + .distinct() + .filter { it in SUPPORTED_DOMAINS } + .toSet() + if (newDomains.size != domains.size || newDomains != domains) { + domains.clear() + domains.addAll(newDomains) + invalidate() } - invalidate() } } } diff --git a/app/src/main/java/io/homeassistant/companion/android/vehicle/MapVehicleScreen.kt b/app/src/main/java/io/homeassistant/companion/android/vehicle/MapVehicleScreen.kt index 116a57dc4..dd318313d 100644 --- a/app/src/main/java/io/homeassistant/companion/android/vehicle/MapVehicleScreen.kt +++ b/app/src/main/java/io/homeassistant/companion/android/vehicle/MapVehicleScreen.kt @@ -43,15 +43,30 @@ class MapVehicleScreen( } var loading = true - var entities: List> = listOf() + var entities: Set> = setOf() init { lifecycleScope.launch { lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) { entitiesFlow.collect { loading = false - entities = it - invalidate() + val newSet = it + .filter { entity -> + if (entity.domain == "device_tracker" && entity.state == "home") { + return@filter false + } + val attrs = entity.attributes as? Map<*, *> + if (attrs != null) { + val lat = attrs["latitude"] as? Double + val lon = attrs["longitude"] as? Double + return@filter lat != null && lon != null + } + return@filter false + } + .toSet() + val hasChanged = entities.size != newSet.size || entities != newSet + entities = newSet + if (hasChanged) invalidate() } } } @@ -60,19 +75,11 @@ class MapVehicleScreen( override fun onGetTemplate(): Template { val listBuilder = ItemList.Builder() entities - .mapNotNull { - val attrs = it.attributes as? Map<*, *> - if (it.domain == "device_tracker" && it.state == "home") { - return@mapNotNull null - } - if (attrs != null) { - val lat = attrs["latitude"] as? Double - val lon = attrs["longitude"] as? Double - if (lat != null && lon != null) { - return@mapNotNull Pair(it, listOf(lat, lon)) - } - } - return@mapNotNull null + .map { // Null checks handled during collection + val attrs = it.attributes as Map<*, *> + val lat = attrs["latitude"] as Double + val lon = attrs["longitude"] as Double + Pair(it, listOf(lat, lon)) } .sortedBy { it.first.friendlyName } .forEach { (entity, location) ->