Add a dynamic color sensor for accent color (#2884)

* Add a dynamic color sensor for accent color

* Update colors to color to match material design label
This commit is contained in:
Daniel Shokouhi 2022-09-24 12:56:10 -07:00 committed by GitHub
parent 80816df6f5
commit 763819746a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 77 additions and 0 deletions

View file

@ -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<SensorManager.BasicSensor> {
return listOf(accentColorSensor)
}
override fun requiredPermissions(sensorId: String): Array<String> {
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)
)
)
}
}

View file

@ -38,6 +38,7 @@ class SensorReceiver : SensorReceiverBase() {
BatterySensorManager(),
BluetoothSensorManager(),
DNDSensorManager(),
DynamicColorSensorManager(),
DevicePolicyManager(),
GeocodeSensorManager(),
KeyguardSensorManager(),

View file

@ -922,4 +922,7 @@
<string name="widget_checkbox_require_authentication">Require Authentication</string>
<string name="widget_error_authenticating">Error authenticating - is an authentication method configured?</string>
<string name="sensor_description_battery_power">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.</string>
<string name="sensor_name_accent_color_sensor">Accent Color</string>
<string name="sensor_description_accent_color_sensor">A hexadecimal color value for the dynamic accent color used in the device theme</string>
<string name="sensor_name_dynamic_color">Dynamic Color</string>
</resources>