Skip to content

Commit 1628b4b

Browse files
authored
Add missing supported domains in the wear for tiles (#6587)
* Add missing supported domains in the wear for tiles * Use CLIMATE_DOMAIN const * Make dedicated list for camera and climate
1 parent aeba374 commit 1628b4b

8 files changed

Lines changed: 58 additions & 15 deletions

File tree

app/src/main/kotlin/io/homeassistant/companion/android/controls/HaControl.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import com.mikepenz.iconics.utils.toAndroidIconCompat
1515
import io.homeassistant.companion.android.common.R
1616
import io.homeassistant.companion.android.common.data.integration.Entity
1717
import io.homeassistant.companion.android.common.data.integration.IntegrationDomains.CAMERA_DOMAIN
18+
import io.homeassistant.companion.android.common.data.integration.IntegrationDomains.CLIMATE_DOMAIN
1819
import io.homeassistant.companion.android.common.data.integration.IntegrationDomains.MEDIA_PLAYER_DOMAIN
1920
import io.homeassistant.companion.android.common.data.integration.IntegrationRepository
2021
import io.homeassistant.companion.android.common.data.integration.friendlyState
@@ -71,12 +72,15 @@ interface HaControl {
7172
val colorTint = when {
7273
entity.domain == "light" && entity.state == "on" -> R.color.colorDeviceControlsLightOn
7374
entity.domain == CAMERA_DOMAIN -> R.color.colorDeviceControlsCamera
74-
entity.domain == "climate" && entity.state == "heat" -> R.color.colorDeviceControlsThermostatHeat
75+
entity.domain == CLIMATE_DOMAIN && entity.state == "heat"
76+
-> R.color.colorDeviceControlsThermostatHeat
77+
7578
entity.state in listOf(
7679
"off",
7780
"unavailable",
7881
"unknown",
7982
) -> R.color.colorDeviceControlsOff
83+
8084
else -> R.color.colorDeviceControlsDefaultOn
8185
}
8286

app/src/main/kotlin/io/homeassistant/companion/android/controls/HaControlsProviderService.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import dagger.hilt.android.AndroidEntryPoint
99
import io.homeassistant.companion.android.common.data.integration.ControlsAuthRequiredSetting
1010
import io.homeassistant.companion.android.common.data.integration.Entity
1111
import io.homeassistant.companion.android.common.data.integration.IntegrationDomains.CAMERA_DOMAIN
12+
import io.homeassistant.companion.android.common.data.integration.IntegrationDomains.CLIMATE_DOMAIN
1213
import io.homeassistant.companion.android.common.data.integration.IntegrationDomains.MEDIA_PLAYER_DOMAIN
1314
import io.homeassistant.companion.android.common.data.integration.applyCompressedStateDiff
1415
import io.homeassistant.companion.android.common.data.prefs.PrefsRepository
@@ -44,7 +45,7 @@ class HaControlsProviderService : ControlsProviderService() {
4445
"automation" to DefaultSwitchControl,
4546
"button" to DefaultButtonControl,
4647
CAMERA_DOMAIN to CameraControl,
47-
"climate" to ClimateControl,
48+
CLIMATE_DOMAIN to ClimateControl,
4849
"cover" to CoverControl,
4950
"fan" to FanControl,
5051
"ha_failed" to HaFailedControl,

app/src/main/kotlin/io/homeassistant/companion/android/util/compose/EntityInfo.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,15 @@ import androidx.compose.runtime.Composable
44
import androidx.compose.ui.res.stringResource
55
import io.homeassistant.companion.android.common.R as commonR
66
import io.homeassistant.companion.android.common.data.integration.IntegrationDomains.CAMERA_DOMAIN
7+
import io.homeassistant.companion.android.common.data.integration.IntegrationDomains.CLIMATE_DOMAIN
78

89
@Composable
910
fun getEntityDomainString(domain: String): String {
1011
return when (domain) {
1112
"automation" -> stringResource(commonR.string.domain_automation)
1213
"button" -> stringResource(commonR.string.domain_button)
1314
CAMERA_DOMAIN -> stringResource(commonR.string.domain_camera)
14-
"climate" -> stringResource(commonR.string.domain_climate)
15+
CLIMATE_DOMAIN -> stringResource(commonR.string.domain_climate)
1516
"cover" -> stringResource(commonR.string.domain_cover)
1617
"fan" -> stringResource(commonR.string.domain_fan)
1718
"input_boolean" -> stringResource(commonR.string.domain_input_boolean)

app/src/screenshotTest/kotlin/io/homeassistant/companion/android/util/compose/entity/EntityPickerScreenshotTest.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import com.android.tools.screenshot.PreviewTest
1212
import com.mikepenz.iconics.typeface.library.community.material.CommunityMaterial
1313
import io.homeassistant.companion.android.common.compose.theme.HADimens
1414
import io.homeassistant.companion.android.common.compose.theme.HAThemeForPreview
15+
import io.homeassistant.companion.android.common.data.integration.IntegrationDomains.CLIMATE_DOMAIN
1516

1617
@Preview(name = "phoneLTR", device = "spec:width=411.4dp,height=923.4dp", group = "phone") // Pixel 9 LTR
1718
@Preview(name = "phoneRLT", device = "spec:width=411.4dp,height=923.4dp", group = "phone", locale = "ar") // Pixel 9 RTL
@@ -198,7 +199,7 @@ class EntityPickerScreenshotTest {
198199
),
199200
EntityPickerItem(
200201
entityId = "climate.thermostat",
201-
domain = "climate",
202+
domain = CLIMATE_DOMAIN,
202203
friendlyName = "Thermostat",
203204
icon = CommunityMaterial.Icon3.cmd_thermostat,
204205
areaName = "Hallway",

common/src/main/kotlin/io/homeassistant/companion/android/common/data/integration/Entity.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import com.mikepenz.iconics.typeface.library.community.material.CommunityMateria
1111
import com.mikepenz.iconics.typeface.library.community.material.CommunityMaterial.Icon3
1212
import io.homeassistant.companion.android.common.R as commonR
1313
import io.homeassistant.companion.android.common.data.integration.IntegrationDomains.CAMERA_DOMAIN
14+
import io.homeassistant.companion.android.common.data.integration.IntegrationDomains.CLIMATE_DOMAIN
1415
import io.homeassistant.companion.android.common.data.integration.IntegrationDomains.MEDIA_PLAYER_DOMAIN
1516
import io.homeassistant.companion.android.common.data.websocket.impl.entities.CompressedStateDiff
1617
import io.homeassistant.companion.android.common.data.websocket.impl.entities.EntityRegistryOptions
@@ -159,7 +160,7 @@ object EntityExt {
159160
"binary_sensor",
160161
"calendar",
161162
CAMERA_DOMAIN,
162-
"climate",
163+
CLIMATE_DOMAIN,
163164
"cover",
164165
"device_tracker",
165166
"fan",
@@ -519,7 +520,7 @@ fun Entity.getIcon(context: Context): IIcon {
519520
Icon3.cmd_video
520521
}
521522

522-
"climate" -> Icon3.cmd_thermostat
523+
CLIMATE_DOMAIN -> Icon3.cmd_thermostat
523524
"configurator" -> Icon.cmd_cog
524525
"conversation" -> Icon3.cmd_microphone_message
525526
"cover" -> coverIcon(compareState, this)

common/src/main/kotlin/io/homeassistant/companion/android/common/data/integration/IntegrationDomains.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package io.homeassistant.companion.android.common.data.integration
22

33
object IntegrationDomains {
44
const val CAMERA_DOMAIN = "camera"
5+
const val CLIMATE_DOMAIN = "climate"
56
const val MEDIA_PLAYER_DOMAIN = "media_player"
67
const val IMAGE_DOMAIN = "image"
78
const val TODO_DOMAIN = "todo"

wear/src/main/kotlin/io/homeassistant/companion/android/home/MainViewModel.kt

Lines changed: 37 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ import dagger.hilt.android.lifecycle.HiltViewModel
1313
import io.homeassistant.companion.android.BuildConfig
1414
import io.homeassistant.companion.android.HomeAssistantApplication
1515
import io.homeassistant.companion.android.common.data.integration.Entity
16+
import io.homeassistant.companion.android.common.data.integration.IntegrationDomains.CAMERA_DOMAIN
17+
import io.homeassistant.companion.android.common.data.integration.IntegrationDomains.CLIMATE_DOMAIN
1618
import io.homeassistant.companion.android.common.data.prefs.impl.entities.TemplateTileConfig
1719
import io.homeassistant.companion.android.common.data.websocket.WebSocketState
1820
import io.homeassistant.companion.android.common.data.websocket.impl.entities.AreaRegistryResponse
@@ -89,6 +91,8 @@ class MainViewModel @Inject constructor(
8991
@Immutable
9092
data class MainViewUiState(
9193
val entities: Map<String, Entity> = emptyMap(),
94+
val cameraEntities: List<Entity> = emptyList(),
95+
val climateEntities: List<Entity> = emptyList(),
9296
val favoriteCaches: List<FavoriteCaches> = emptyList(),
9397
val isFavoritesOnly: Boolean = false,
9498
val isHapticEnabled: Boolean = false,
@@ -308,21 +312,50 @@ class MainViewModel @Inject constructor(
308312
*/
309313
private fun updateEntityStates(entities: List<Entity>, replaceAll: Boolean = false) {
310314
val supportedDomains = supportedDomains()
311-
val supported = entities
312-
.filter { it.domain in supportedDomains }
313-
.associateBy { it.entityId }
315+
val supportedIds = mutableSetOf<String>()
314316
updateUiState { uiState ->
317+
val supported = mutableMapOf<String, Entity>()
318+
val cameraEntities = if (replaceAll) {
319+
mutableMapOf()
320+
} else {
321+
uiState.cameraEntities.associateByTo(
322+
mutableMapOf(),
323+
) {
324+
it.entityId
325+
}
326+
}
327+
val climateEntities = if (replaceAll) {
328+
mutableMapOf()
329+
} else {
330+
uiState.climateEntities.associateByTo(
331+
mutableMapOf(),
332+
) {
333+
it.entityId
334+
}
335+
}
336+
for (entity in entities) {
337+
when (entity.domain) {
338+
CAMERA_DOMAIN -> cameraEntities[entity.entityId] = entity
339+
CLIMATE_DOMAIN -> climateEntities[entity.entityId] = entity
340+
}
341+
if (entity.domain in supportedDomains) {
342+
supported[entity.entityId] = entity
343+
}
344+
}
345+
supportedIds.addAll(supported.keys)
315346
val updatedEntities = if (replaceAll) supported else uiState.entities + supported
316347
uiState.copy(
317348
entities = updatedEntities,
349+
cameraEntities = cameraEntities.values.toList(),
350+
climateEntities = climateEntities.values.toList(),
318351
allEntitiesByDomain = updatedEntities.values.groupBy { it.domain },
319352
entityListNavigation = uiState.entityListNavigation.copy(
320353
entityLists = uiState.entityListNavigation.entityListIds.resolveEntities(updatedEntities),
321354
),
322355
)
323356
}
324357
val favoriteIds = mainViewUiState.value.favoriteEntityIds
325-
supported.keys
358+
supportedIds
326359
.filter { it in favoriteIds }
327360
.forEach { addCachedFavorite(it) }
328361
}

wear/src/main/kotlin/io/homeassistant/companion/android/home/views/HomeView.kt

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import androidx.wear.compose.navigation.composable
1616
import androidx.wear.compose.navigation.rememberSwipeDismissableNavController
1717
import androidx.wear.tiles.TileService
1818
import io.homeassistant.companion.android.common.data.integration.IntegrationDomains.CAMERA_DOMAIN
19+
import io.homeassistant.companion.android.common.data.integration.IntegrationDomains.CLIMATE_DOMAIN
1920
import io.homeassistant.companion.android.common.sensors.id
2021
import io.homeassistant.companion.android.home.MainViewModel
2122
import io.homeassistant.companion.android.theme.WearAppTheme
@@ -231,7 +232,7 @@ fun LoadHomePage(mainViewModel: MainViewModel) {
231232
val tileId = backStackEntry.arguments?.getInt(ARG_SCREEN_CAMERA_TILE_ID)
232233
SetCameraTileView(
233234
tile = mainViewModel.cameraTiles.value.firstOrNull { it.id == tileId },
234-
entities = uiState.allEntitiesByDomain[CAMERA_DOMAIN].orEmpty(),
235+
entities = uiState.cameraEntities,
235236
onSelectEntity = {
236237
swipeDismissableNavController.navigate(
237238
"$ROUTE_CAMERA_TILE/$tileId/$SCREEN_SET_CAMERA_TILE_ENTITY",
@@ -255,7 +256,7 @@ fun LoadHomePage(mainViewModel: MainViewModel) {
255256
val tileId = backStackEntry.arguments?.getInt(ARG_SCREEN_CAMERA_TILE_ID)
256257
ChooseEntityView(
257258
entitiesByDomainOrder = listOf(CAMERA_DOMAIN),
258-
entitiesByDomain = mapOf(CAMERA_DOMAIN to uiState.allEntitiesByDomain[CAMERA_DOMAIN].orEmpty()),
259+
entitiesByDomain = mapOf(CAMERA_DOMAIN to uiState.cameraEntities),
259260
favoriteEntityIds = emptyList(),
260261
onNoneClicked = {},
261262
onEntitySelected = { entity ->
@@ -316,7 +317,7 @@ fun LoadHomePage(mainViewModel: MainViewModel) {
316317
val tileId = backStackEntry.arguments?.getInt(ARG_SCREEN_THERMOSTAT_TILE_ID)
317318
SetThermostatTileView(
318319
tile = mainViewModel.thermostatTiles.value.firstOrNull { it.id == tileId },
319-
entities = uiState.allEntitiesByDomain["climate"].orEmpty(),
320+
entities = uiState.climateEntities,
320321
onSelectEntity = {
321322
swipeDismissableNavController.navigate(
322323
"$ROUTE_THERMOSTAT_TILE/$tileId/$SCREEN_SET_THERMOSTAT_TILE_ENTITY",
@@ -342,8 +343,8 @@ fun LoadHomePage(mainViewModel: MainViewModel) {
342343
) { backStackEntry ->
343344
val tileId = backStackEntry.arguments?.getInt(ARG_SCREEN_THERMOSTAT_TILE_ID)
344345
ChooseEntityView(
345-
entitiesByDomainOrder = listOf("climate"),
346-
entitiesByDomain = mapOf("climate" to uiState.allEntitiesByDomain["climate"].orEmpty()),
346+
entitiesByDomainOrder = listOf(CLIMATE_DOMAIN),
347+
entitiesByDomain = mapOf(CLIMATE_DOMAIN to uiState.climateEntities),
347348
favoriteEntityIds = emptyList(),
348349
onNoneClicked = {},
349350
onEntitySelected = { entity ->

0 commit comments

Comments
 (0)