From 60aadc906a139bf2a2771735a24ab578460033bf Mon Sep 17 00:00:00 2001 From: Daniel Shokouhi Date: Sat, 1 Oct 2022 13:10:52 -0700 Subject: [PATCH] Show custom icon if set for the entity in device controls (#2922) * Add support for showing custom icons in device controls * Clean up and set color based on state * Set icon size and adjust colors based on domain * Move color values to resources and add more color options from source * Review comments * Only set the icon if it exists in the library --- .../companion/android/controls/HaControl.kt | 32 +++++++++++++++++++ common/src/main/res/values/colors.xml | 5 +++ 2 files changed, 37 insertions(+) diff --git a/app/src/main/java/io/homeassistant/companion/android/controls/HaControl.kt b/app/src/main/java/io/homeassistant/companion/android/controls/HaControl.kt index 5b921c9cf..cf89a508f 100644 --- a/app/src/main/java/io/homeassistant/companion/android/controls/HaControl.kt +++ b/app/src/main/java/io/homeassistant/companion/android/controls/HaControl.kt @@ -1,5 +1,6 @@ package io.homeassistant.companion.android.controls +import android.annotation.SuppressLint import android.app.PendingIntent import android.content.Context import android.content.Intent @@ -7,15 +8,21 @@ import android.os.Build import android.service.controls.Control import android.service.controls.actions.ControlAction import androidx.annotation.RequiresApi +import androidx.core.content.ContextCompat +import com.mikepenz.iconics.IconicsDrawable +import com.mikepenz.iconics.utils.sizeDp +import com.mikepenz.iconics.utils.toAndroidIconCompat import io.homeassistant.companion.android.common.R import io.homeassistant.companion.android.common.data.integration.Entity import io.homeassistant.companion.android.common.data.integration.IntegrationRepository +import io.homeassistant.companion.android.common.data.integration.domain import io.homeassistant.companion.android.common.data.websocket.impl.entities.AreaRegistryResponse import io.homeassistant.companion.android.webview.WebViewActivity @RequiresApi(Build.VERSION_CODES.R) interface HaControl { + @SuppressLint("ResourceType") fun createControl( context: Context, entity: Entity>, @@ -49,6 +56,31 @@ interface HaControl { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { control.setAuthRequired(authRequired) } + if (entity.attributes["icon"]?.toString()?.startsWith("mdi:") == true && + !entity.attributes["icon"]?.toString()?.substringAfter(":").isNullOrBlank() + ) { + val iconName = entity.attributes["icon"]!!.toString().split(':')[1] + val iconDrawable = + IconicsDrawable(context, "cmd-$iconName").apply { + sizeDp = 48 + } + if (iconDrawable.icon != null) { + val colorTint = when { + entity.domain == "light" && entity.state == "on" -> R.color.colorDeviceControlsLightOn + entity.domain == "camera" -> R.color.colorDeviceControlsCamera + entity.domain == "climate" && entity.state == "heat" -> R.color.colorDeviceControlsThermostatHeat + entity.state in listOf( + "off", + "unavailable", + "unknown" + ) -> R.color.colorDeviceControlsOff + else -> R.color.colorDeviceControlsDefaultOn + } + + iconDrawable.setTint(ContextCompat.getColor(context, colorTint)) + control.setCustomIcon(iconDrawable.toAndroidIconCompat().toIcon(context)) + } + } return provideControlFeatures(context, control, entity, area, baseUrl).build() } diff --git a/common/src/main/res/values/colors.xml b/common/src/main/res/values/colors.xml index e7ce6c81a..36ef0c8c8 100644 --- a/common/src/main/res/values/colors.xml +++ b/common/src/main/res/values/colors.xml @@ -27,4 +27,9 @@ #f5f5f5 #1fffa600 #ffa600 + #FDD663 + #9AA0A6 + #8AB4F8 + #FF8B66 + #F1F3F4