diff --git a/app/src/main/java/io/homeassistant/companion/android/widgets/button/ButtonWidget.kt b/app/src/main/java/io/homeassistant/companion/android/widgets/button/ButtonWidget.kt
index 64d4b9a76a0..f3684310a98 100644
--- a/app/src/main/java/io/homeassistant/companion/android/widgets/button/ButtonWidget.kt
+++ b/app/src/main/java/io/homeassistant/companion/android/widgets/button/ButtonWidget.kt
@@ -61,12 +61,14 @@ class ButtonWidget : AppWidgetProvider() {
internal const val EXTRA_ACTION_DATA = "EXTRA_SERVICE_DATA"
internal const val EXTRA_LABEL = "EXTRA_LABEL"
internal const val EXTRA_ICON_NAME = "EXTRA_ICON_NAME"
+ internal const val EXTRA_ICON_COLOR = "EXTRA_ICON_COLOR"
internal const val EXTRA_BACKGROUND_TYPE = "EXTRA_BACKGROUND_TYPE"
internal const val EXTRA_TEXT_COLOR = "EXTRA_TEXT_COLOR"
internal const val EXTRA_REQUIRE_AUTHENTICATION = "EXTRA_REQUIRE_AUTHENTICATION"
// Vector icon rendering resolution fallback (if we can't infer via AppWidgetManager for some reason)
private const val DEFAULT_MAX_ICON_SIZE = 512
+ private const val SMALL_MAX_ICON_SIZE = 80
}
@Inject
@@ -200,8 +202,11 @@ class ButtonWidget : AppWidgetProvider() {
size = IconicsSize.dp(24)
}
val icon = DrawableCompat.wrap(iconDrawable)
+ widget?.iconColor?.let {
+ setCustomColorToIcon(it, this)
+ }
if (widget?.backgroundType == WidgetBackgroundType.TRANSPARENT) {
- setInt(R.id.widgetImageButton, "setColorFilter", textColor)
+ setInt(R.id.widgetImageButton, "setBackgroundColor", Color.TRANSPARENT)
}
// Determine reasonable dimensions for drawing vector icon as a bitmap
@@ -210,11 +215,11 @@ class ButtonWidget : AppWidgetProvider() {
val maxWidth = (
awo?.getInt(AppWidgetManager.OPTION_APPWIDGET_MAX_WIDTH, DEFAULT_MAX_ICON_SIZE)
?: DEFAULT_MAX_ICON_SIZE
- ).coerceAtLeast(16)
+ ).coerceAtLeast(16).coerceAtMost(SMALL_MAX_ICON_SIZE)
val maxHeight = (
awo?.getInt(AppWidgetManager.OPTION_APPWIDGET_MAX_HEIGHT, DEFAULT_MAX_ICON_SIZE)
?: DEFAULT_MAX_ICON_SIZE
- ).coerceAtLeast(16)
+ ).coerceAtLeast(16).coerceAtMost(SMALL_MAX_ICON_SIZE)
val width: Int
val height: Int
if (maxWidth > maxHeight) {
@@ -363,6 +368,7 @@ class ButtonWidget : AppWidgetProvider() {
val label: String? = extras.getString(EXTRA_LABEL)
val requireAuthentication: Boolean = extras.getBoolean(EXTRA_REQUIRE_AUTHENTICATION)
val icon: String = extras.getString(EXTRA_ICON_NAME) ?: "mdi:flash"
+ val iconColor: String? = extras.getString(EXTRA_ICON_COLOR)
val backgroundType = BundleCompat.getSerializable(extras, EXTRA_BACKGROUND_TYPE, WidgetBackgroundType::class.java)
?: WidgetBackgroundType.DAYNIGHT
val textColor: String? = extras.getString(EXTRA_TEXT_COLOR)
@@ -383,7 +389,7 @@ class ButtonWidget : AppWidgetProvider() {
"label: " + label
)
- val widget = ButtonWidgetEntity(appWidgetId, serverId, icon, domain, action, actionData, label, backgroundType, textColor, requireAuthentication)
+ val widget = ButtonWidgetEntity(appWidgetId, serverId, icon, domain, action, actionData, label, iconColor, backgroundType, textColor, requireAuthentication)
buttonWidgetDao.add(widget)
// It is the responsibility of the configuration activity to update the app widget
@@ -393,4 +399,14 @@ class ButtonWidget : AppWidgetProvider() {
onUpdate(context, AppWidgetManager.getInstance(context), intArrayOf(appWidgetId))
}
}
+
+ private fun setCustomColorToIcon(colorString: String, remoteViews: RemoteViews) {
+ val validColor = try {
+ Color.parseColor(colorString)
+ } catch (e: Exception) {
+ null
+ }
+ remoteViews.setInt(R.id.widgetImageButton, "setColorFilter", validColor ?: Color.TRANSPARENT)
+ remoteViews.setInt(R.id.widgetImageButtonBackground, "setColorFilter", validColor ?: Color.TRANSPARENT)
+ }
}
diff --git a/app/src/main/java/io/homeassistant/companion/android/widgets/button/ButtonWidgetConfigureActivity.kt b/app/src/main/java/io/homeassistant/companion/android/widgets/button/ButtonWidgetConfigureActivity.kt
index f3a6bff9202..1f9e4f762ea 100644
--- a/app/src/main/java/io/homeassistant/companion/android/widgets/button/ButtonWidgetConfigureActivity.kt
+++ b/app/src/main/java/io/homeassistant/companion/android/widgets/button/ButtonWidgetConfigureActivity.kt
@@ -5,6 +5,7 @@ import android.app.PendingIntent
import android.appwidget.AppWidgetManager
import android.content.ComponentName
import android.content.Intent
+import android.graphics.Color
import android.graphics.PorterDuff
import android.graphics.PorterDuffColorFilter
import android.os.Build
@@ -239,6 +240,7 @@ class ButtonWidgetConfigureActivity : BaseWidgetConfigureActivity() {
val actionText = "${buttonWidget.domain}.${buttonWidget.service}"
binding.widgetTextConfigService.setText(actionText)
binding.label.setText(buttonWidget.label)
+ binding.iconColor.setText(buttonWidget.iconColor)
binding.backgroundType.setSelection(
when {
@@ -436,6 +438,7 @@ class ButtonWidgetConfigureActivity : BaseWidgetConfigureActivity() {
val actions = actions[selectedServerId].orEmpty()
val domain = actions[actionText]?.domain ?: actionText.split(".", limit = 2)[0]
val action = actions[actionText]?.action ?: actionText.split(".", limit = 2)[1]
+ val iconColorText = validateIconColorText(binding.iconColor.text.toString())
intent.putExtra(
ButtonWidget.EXTRA_DOMAIN,
domain
@@ -444,6 +447,10 @@ class ButtonWidgetConfigureActivity : BaseWidgetConfigureActivity() {
ButtonWidget.EXTRA_ACTION,
action
)
+ intent.putExtra(
+ ButtonWidget.EXTRA_ICON_COLOR,
+ iconColorText
+ )
// Fetch and send label and icon
intent.putExtra(
@@ -507,4 +514,17 @@ class ButtonWidgetConfigureActivity : BaseWidgetConfigureActivity() {
showAddWidgetError()
}
}
+
+ private fun validateIconColorText(input: String): String {
+ return if (input.isEmpty()) {
+ input
+ } else {
+ try {
+ Color.parseColor(input)
+ input
+ } catch (e: Exception) {
+ ""
+ }
+ }
+ }
}
diff --git a/app/src/main/res/drawable/rounded_image_background.xml b/app/src/main/res/drawable/rounded_image_background.xml
new file mode 100644
index 00000000000..c2fc4aced4f
--- /dev/null
+++ b/app/src/main/res/drawable/rounded_image_background.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/widget_button.xml b/app/src/main/res/layout/widget_button.xml
index 9eceab3128b..692c415be38 100644
--- a/app/src/main/res/layout/widget_button.xml
+++ b/app/src/main/res/layout/widget_button.xml
@@ -1,53 +1,58 @@
+ android:padding="8dp">
-
+
+
+ android:src="@drawable/ic_flash_on_24dp"/>
+ android:layout_alignParentBottom="true"
+ android:layout_below="@id/widgetImageButtonBackground"
+ android:padding="2dp"
+ android:gravity="bottom">
+ android:textSize="16sp"
+ android:textStyle="bold" />
-
+
+
+
+
+
+
+
+
Entity ID:
Entity ID(s):
Icon:
+ Icon color:
Label:
Action:
Label
@@ -1025,6 +1026,7 @@
Tap action:
Toggle
Unable to render the template
+ Color in hex format (eg. #FF0000)
Label
Entity ID
Domain