diff --git a/app/src/main/java/io/homeassistant/companion/android/sensors/DynamicColorSensorManager.kt b/app/src/main/java/io/homeassistant/companion/android/sensors/DynamicColorSensorManager.kt new file mode 100755 index 000000000..10ef97aaf --- /dev/null +++ b/app/src/main/java/io/homeassistant/companion/android/sensors/DynamicColorSensorManager.kt @@ -0,0 +1,73 @@ +package io.homeassistant.companion.android.sensors + +import android.content.Context +import androidx.core.graphics.blue +import androidx.core.graphics.green +import androidx.core.graphics.red +import com.google.android.material.color.DynamicColors +import io.homeassistant.companion.android.common.sensors.SensorManager +import io.homeassistant.companion.android.common.R as commonR + +class DynamicColorSensorManager : SensorManager { + companion object { + private const val TAG = "DynamicColor" + + val accentColorSensor = SensorManager.BasicSensor( + "accent_color", + "sensor", + commonR.string.sensor_name_accent_color_sensor, + commonR.string.sensor_description_accent_color_sensor, + "mdi:palette", + entityCategory = SensorManager.ENTITY_CATEGORY_DIAGNOSTIC + ) + } + + override fun docsLink(): String { + return "https://companion.home-assistant.io/docs/core/sensors#dynamic-color-sensor" + } + override val enabledByDefault: Boolean + get() = false + override val name: Int + get() = commonR.string.sensor_name_dynamic_color + + override fun getAvailableSensors(context: Context): List { + return listOf(accentColorSensor) + } + + override fun requiredPermissions(sensorId: String): Array { + return emptyArray() + } + + override fun requestSensorUpdate(context: Context) { + updateAccentColor(context) + } + + override fun hasSensor(context: Context): Boolean { + return DynamicColors.isDynamicColorAvailable() + } + + private fun updateAccentColor(context: Context) { + + if (!isEnabled(context, accentColorSensor.id)) + return + + val dynamicColorContext = DynamicColors.wrapContextIfAvailable(context) + val attrsToResolve = intArrayOf( + android.R.attr.colorAccent, // 0 + ) + val test = dynamicColorContext.obtainStyledAttributes(attrsToResolve) + val accent = test.getColor(0, 0) + val accentHex = java.lang.String.format("#%06X", 0xFFFFFF and accent) + test.recycle() + + onSensorUpdated( + context, + accentColorSensor, + accentHex, + accentColorSensor.statelessIcon, + mapOf( + "rgb_color" to listOf(accent.red, accent.green, accent.blue) + ) + ) + } +} diff --git a/app/src/main/java/io/homeassistant/companion/android/sensors/SensorReceiver.kt b/app/src/main/java/io/homeassistant/companion/android/sensors/SensorReceiver.kt index 241f81b9c..daa434587 100644 --- a/app/src/main/java/io/homeassistant/companion/android/sensors/SensorReceiver.kt +++ b/app/src/main/java/io/homeassistant/companion/android/sensors/SensorReceiver.kt @@ -38,6 +38,7 @@ class SensorReceiver : SensorReceiverBase() { BatterySensorManager(), BluetoothSensorManager(), DNDSensorManager(), + DynamicColorSensorManager(), DevicePolicyManager(), GeocodeSensorManager(), KeyguardSensorManager(), diff --git a/common/src/main/res/values/strings.xml b/common/src/main/res/values/strings.xml index bec59ad71..8dfd925fc 100644 --- a/common/src/main/res/values/strings.xml +++ b/common/src/main/res/values/strings.xml @@ -922,4 +922,7 @@ Require Authentication Error authenticating - is an authentication method configured? The current wattage of the device. To get the most out of this sensor consider using the \"Fast while charging\" sensor update frequency setting. If your values are not as expected you may need to adjust the \"Battery Current Divisor\" setting to get a proper unit of amperes for the \"current\" attribute. Android is supposed to report microamperes however, some devices may report a different unit. The default will convert microamperes to amperes. + Accent Color + A hexadecimal color value for the dynamic accent color used in the device theme + Dynamic Color