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