From 9386da95a46eaf7c89fa6316a2e84ed13d4f2843 Mon Sep 17 00:00:00 2001 From: blackredit <134921424+blackredit@users.noreply.github.com> Date: Thu, 2 Jul 2026 19:45:56 +0200 Subject: [PATCH 1/5] Refactor TodoWidgetConfigureActivity to use Material3 components and improve layout --- .../todo/TodoWidgetConfigureActivity.kt | 69 +++++++------------ 1 file changed, 26 insertions(+), 43 deletions(-) diff --git a/app/src/main/kotlin/io/homeassistant/companion/android/widgets/todo/TodoWidgetConfigureActivity.kt b/app/src/main/kotlin/io/homeassistant/companion/android/widgets/todo/TodoWidgetConfigureActivity.kt index 13703805438..b7256e3c4cd 100644 --- a/app/src/main/kotlin/io/homeassistant/companion/android/widgets/todo/TodoWidgetConfigureActivity.kt +++ b/app/src/main/kotlin/io/homeassistant/companion/android/widgets/todo/TodoWidgetConfigureActivity.kt @@ -12,23 +12,18 @@ import androidx.annotation.RequiresApi import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.windowInsetsPadding import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll -import androidx.compose.material.Button -import androidx.compose.material.Scaffold -import androidx.compose.material.Switch -import androidx.compose.material.SwitchDefaults -import androidx.compose.material.Text -import androidx.compose.material.TopAppBar +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.res.colorResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp @@ -38,6 +33,9 @@ import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.lifecycle.withCreationCallback import io.homeassistant.companion.android.BaseActivity import io.homeassistant.companion.android.common.R as commonR +import io.homeassistant.companion.android.common.compose.composable.HAAccentButton +import io.homeassistant.companion.android.common.compose.composable.HASwitch +import io.homeassistant.companion.android.common.compose.composable.HATopBar import io.homeassistant.companion.android.common.compose.theme.HATheme import io.homeassistant.companion.android.common.data.integration.Entity import io.homeassistant.companion.android.common.data.websocket.impl.entities.AreaRegistryResponse @@ -48,7 +46,6 @@ import io.homeassistant.companion.android.database.server.Server import io.homeassistant.companion.android.database.widget.WidgetBackgroundType import io.homeassistant.companion.android.settings.widgets.ManageWidgetsViewModel import io.homeassistant.companion.android.util.compose.ExposedDropdownMenu -import io.homeassistant.companion.android.util.compose.HomeAssistantAppTheme import io.homeassistant.companion.android.util.compose.ServerExposedDropdownMenu import io.homeassistant.companion.android.util.compose.WidgetBackgroundTypeExposedDropdownMenu import io.homeassistant.companion.android.util.compose.entity.EntityPicker @@ -58,8 +55,6 @@ import io.homeassistant.companion.android.util.previewEntity1 import io.homeassistant.companion.android.util.previewEntity2 import io.homeassistant.companion.android.util.previewServer1 import io.homeassistant.companion.android.util.previewServer2 -import io.homeassistant.companion.android.util.safeBottomWindowInsets -import io.homeassistant.companion.android.util.safeTopWindowInsets import kotlinx.coroutines.launch @AndroidEntryPoint @@ -105,7 +100,7 @@ class TodoWidgetConfigureActivity : BaseActivity() { viewModel.onSetup(widgetId, supportedTextColors) setContent { - HomeAssistantAppTheme { + HATheme { TodoWidgetConfigureScreen( viewModel = viewModel, onActionClick = { onActionClick() }, @@ -210,22 +205,17 @@ private fun TodoWidgetConfigureView( areaRegistry: List? = null, ) { Scaffold( + contentWindowInsets = WindowInsets.safeDrawing, topBar = { - TopAppBar( - title = { Text(stringResource(commonR.string.widget_todo_label)) }, - windowInsets = safeTopWindowInsets(), - backgroundColor = colorResource(commonR.color.colorBackground), - contentColor = colorResource(commonR.color.colorOnBackground), - ) + HATopBar(title = { Text(stringResource(commonR.string.widget_todo_label)) }) }, ) { padding -> Column( modifier = Modifier .verticalScroll(rememberScrollState()) - .windowInsetsPadding(safeBottomWindowInsets()) .padding(padding) .padding(all = 16.dp), - verticalArrangement = Arrangement.spacedBy(8.dp), + verticalArrangement = Arrangement.spacedBy(16.dp), ) { if (servers.size > 1) { ServerExposedDropdownMenu( @@ -236,19 +226,16 @@ private fun TodoWidgetConfigureView( ) } - // TODO use new theme for Material3 components https://github.com/home-assistant/android/issues/6303 - HATheme { - EntityPicker( - entities = entities, - selectedEntityId = selectedEntityId, - onEntitySelectedId = { onEntitySelected(it) }, - onEntityCleared = { onEntitySelected(null) }, - entityRegistry = entityRegistry, - deviceRegistry = deviceRegistry, - areaRegistry = areaRegistry, - addButtonText = stringResource(commonR.string.todo_widget_select_list), - ) - } + EntityPicker( + entities = entities, + selectedEntityId = selectedEntityId, + onEntitySelectedId = { onEntitySelected(it) }, + onEntityCleared = { onEntitySelected(null) }, + entityRegistry = entityRegistry, + deviceRegistry = deviceRegistry, + areaRegistry = areaRegistry, + addButtonText = stringResource(commonR.string.todo_widget_select_list), + ) Row( modifier = Modifier.clickable { onShowCompletedChanged(!showCompleted) }, @@ -260,12 +247,9 @@ private fun TodoWidgetConfigureView( .weight(1f), ) - Switch( + HASwitch( checked = showCompleted, onCheckedChange = { onShowCompletedChanged(it) }, - colors = SwitchDefaults.colors( - uncheckedThumbColor = colorResource(commonR.color.colorSwitchUncheckedThumb), - ), ) } @@ -288,12 +272,11 @@ private fun TodoWidgetConfigureView( ) } - Button( + HAAccentButton( + text = stringResource(if (isUpdateWidget) commonR.string.update_widget else commonR.string.add_widget), modifier = Modifier.fillMaxWidth(), - onClick = { onActionClick() }, - ) { - Text(stringResource(if (isUpdateWidget) commonR.string.update_widget else commonR.string.add_widget)) - } + onClick = onActionClick, + ) } } } @@ -301,7 +284,7 @@ private fun TodoWidgetConfigureView( @Preview @Composable private fun TodoWidgetConfigureViewPreview() { - HomeAssistantAppTheme { + HATheme { TodoWidgetConfigureView( servers = listOf( previewServer1, From 95a1a5096620d839dec3a3fbff166bd9f134868f Mon Sep 17 00:00:00 2001 From: blackredit <134921424+blackredit@users.noreply.github.com> Date: Thu, 2 Jul 2026 19:59:16 +0200 Subject: [PATCH 2/5] Import fix --- .../android/widgets/todo/TodoWidgetConfigureActivity.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/kotlin/io/homeassistant/companion/android/widgets/todo/TodoWidgetConfigureActivity.kt b/app/src/main/kotlin/io/homeassistant/companion/android/widgets/todo/TodoWidgetConfigureActivity.kt index b7256e3c4cd..4e0d9e15ddf 100644 --- a/app/src/main/kotlin/io/homeassistant/companion/android/widgets/todo/TodoWidgetConfigureActivity.kt +++ b/app/src/main/kotlin/io/homeassistant/companion/android/widgets/todo/TodoWidgetConfigureActivity.kt @@ -12,8 +12,9 @@ import androidx.annotation.RequiresApi import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.WindowInsets +import androidx.compose.foundation.layout.safeDrawing import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.rememberScrollState From 9e6ee4e5461f4c5352fcaa98685f4ae0205ecd1a Mon Sep 17 00:00:00 2001 From: blackredit <134921424+blackredit@users.noreply.github.com> Date: Thu, 2 Jul 2026 20:52:30 +0200 Subject: [PATCH 3/5] Refactor TodoWidgetConfigureActivity to replace ExposedDropdownMenu with HADropdownMenu and improve text color selection --- .../todo/TodoWidgetConfigureActivity.kt | 23 ++++++++++++------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/app/src/main/kotlin/io/homeassistant/companion/android/widgets/todo/TodoWidgetConfigureActivity.kt b/app/src/main/kotlin/io/homeassistant/companion/android/widgets/todo/TodoWidgetConfigureActivity.kt index 4e0d9e15ddf..f78d4d49055 100644 --- a/app/src/main/kotlin/io/homeassistant/companion/android/widgets/todo/TodoWidgetConfigureActivity.kt +++ b/app/src/main/kotlin/io/homeassistant/companion/android/widgets/todo/TodoWidgetConfigureActivity.kt @@ -35,6 +35,8 @@ import dagger.hilt.android.lifecycle.withCreationCallback import io.homeassistant.companion.android.BaseActivity import io.homeassistant.companion.android.common.R as commonR import io.homeassistant.companion.android.common.compose.composable.HAAccentButton +import io.homeassistant.companion.android.common.compose.composable.HADropdownItem +import io.homeassistant.companion.android.common.compose.composable.HADropdownMenu import io.homeassistant.companion.android.common.compose.composable.HASwitch import io.homeassistant.companion.android.common.compose.composable.HATopBar import io.homeassistant.companion.android.common.compose.theme.HATheme @@ -46,7 +48,6 @@ import io.homeassistant.companion.android.common.util.SdkVersion import io.homeassistant.companion.android.database.server.Server import io.homeassistant.companion.android.database.widget.WidgetBackgroundType import io.homeassistant.companion.android.settings.widgets.ManageWidgetsViewModel -import io.homeassistant.companion.android.util.compose.ExposedDropdownMenu import io.homeassistant.companion.android.util.compose.ServerExposedDropdownMenu import io.homeassistant.companion.android.util.compose.WidgetBackgroundTypeExposedDropdownMenu import io.homeassistant.companion.android.util.compose.entity.EntityPicker @@ -261,14 +262,20 @@ private fun TodoWidgetConfigureView( ) if (selectedBackgroundType == WidgetBackgroundType.TRANSPARENT) { - ExposedDropdownMenu( - label = stringResource(commonR.string.widget_text_color_title), - keys = listOf( - stringResource(commonR.string.widget_text_color_black), - stringResource(commonR.string.widget_text_color_white), + HADropdownMenu( + items = listOf( + HADropdownItem( + key = 0, + label = stringResource(commonR.string.widget_text_color_black), + ), + HADropdownItem( + key = 1, + label = stringResource(commonR.string.widget_text_color_white), + ), ), - currentIndex = textColorIndex, - onSelected = { onTextColorSelected(it) }, + selectedKey = textColorIndex, + onItemSelected = onTextColorSelected, + label = stringResource(commonR.string.widget_text_color_title), modifier = Modifier.padding(bottom = 16.dp), ) } From d56154db52f7969ad6957baadcf5f83e1025cb83 Mon Sep 17 00:00:00 2001 From: blackredit <134921424+blackredit@users.noreply.github.com> Date: Thu, 2 Jul 2026 23:08:37 +0200 Subject: [PATCH 4/5] Correct the import order in TodoWidgetConfigureActivity --- .../android/widgets/todo/TodoWidgetConfigureActivity.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/kotlin/io/homeassistant/companion/android/widgets/todo/TodoWidgetConfigureActivity.kt b/app/src/main/kotlin/io/homeassistant/companion/android/widgets/todo/TodoWidgetConfigureActivity.kt index f78d4d49055..9e1b1543968 100644 --- a/app/src/main/kotlin/io/homeassistant/companion/android/widgets/todo/TodoWidgetConfigureActivity.kt +++ b/app/src/main/kotlin/io/homeassistant/companion/android/widgets/todo/TodoWidgetConfigureActivity.kt @@ -14,9 +14,9 @@ import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.WindowInsets -import androidx.compose.foundation.layout.safeDrawing import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.safeDrawing import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll import androidx.compose.material3.Scaffold From ae9b78d1ae277b49814b8ba2ee6bc597486e0c3d Mon Sep 17 00:00:00 2001 From: blackredit <134921424+blackredit@users.noreply.github.com> Date: Fri, 3 Jul 2026 01:24:41 +0200 Subject: [PATCH 5/5] Refactor TodoWidgetConfigureActivity to replace ExposedDropdownMenu with custom dropdown menus and improve layout styling --- .../todo/TodoWidgetConfigureActivity.kt | 56 +++++++++++++++++-- 1 file changed, 51 insertions(+), 5 deletions(-) diff --git a/app/src/main/kotlin/io/homeassistant/companion/android/widgets/todo/TodoWidgetConfigureActivity.kt b/app/src/main/kotlin/io/homeassistant/companion/android/widgets/todo/TodoWidgetConfigureActivity.kt index 9e1b1543968..27e84f6fecc 100644 --- a/app/src/main/kotlin/io/homeassistant/companion/android/widgets/todo/TodoWidgetConfigureActivity.kt +++ b/app/src/main/kotlin/io/homeassistant/companion/android/widgets/todo/TodoWidgetConfigureActivity.kt @@ -23,9 +23,12 @@ import androidx.compose.material3.Scaffold import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.lifecycle.compose.collectAsStateWithLifecycle @@ -39,7 +42,9 @@ import io.homeassistant.companion.android.common.compose.composable.HADropdownIt import io.homeassistant.companion.android.common.compose.composable.HADropdownMenu import io.homeassistant.companion.android.common.compose.composable.HASwitch import io.homeassistant.companion.android.common.compose.composable.HATopBar +import io.homeassistant.companion.android.common.compose.theme.HATextStyle import io.homeassistant.companion.android.common.compose.theme.HATheme +import io.homeassistant.companion.android.common.compose.theme.LocalHAColorScheme import io.homeassistant.companion.android.common.data.integration.Entity import io.homeassistant.companion.android.common.data.websocket.impl.entities.AreaRegistryResponse import io.homeassistant.companion.android.common.data.websocket.impl.entities.DeviceRegistryResponse @@ -48,8 +53,6 @@ import io.homeassistant.companion.android.common.util.SdkVersion import io.homeassistant.companion.android.database.server.Server import io.homeassistant.companion.android.database.widget.WidgetBackgroundType import io.homeassistant.companion.android.settings.widgets.ManageWidgetsViewModel -import io.homeassistant.companion.android.util.compose.ServerExposedDropdownMenu -import io.homeassistant.companion.android.util.compose.WidgetBackgroundTypeExposedDropdownMenu import io.homeassistant.companion.android.util.compose.entity.EntityPicker import io.homeassistant.companion.android.util.enableEdgeToEdgeCompat import io.homeassistant.companion.android.util.getHexForColor @@ -57,6 +60,7 @@ import io.homeassistant.companion.android.util.previewEntity1 import io.homeassistant.companion.android.util.previewEntity2 import io.homeassistant.companion.android.util.previewServer1 import io.homeassistant.companion.android.util.previewServer2 +import io.homeassistant.companion.android.widgets.common.WidgetUtils import kotlinx.coroutines.launch @AndroidEntryPoint @@ -220,7 +224,7 @@ private fun TodoWidgetConfigureView( verticalArrangement = Arrangement.spacedBy(16.dp), ) { if (servers.size > 1) { - ServerExposedDropdownMenu( + ServerDropdownMenu( servers = servers, current = selectedServerId, onSelected = { onServerSelected(it) }, @@ -239,11 +243,16 @@ private fun TodoWidgetConfigureView( addButtonText = stringResource(commonR.string.todo_widget_select_list), ) + val colorScheme = LocalHAColorScheme.current Row( - modifier = Modifier.clickable { onShowCompletedChanged(!showCompleted) }, + modifier = Modifier + .fillMaxWidth() + .clickable { onShowCompletedChanged(!showCompleted) }, ) { Text( text = stringResource(commonR.string.widget_todo_show_completed), + style = HATextStyle.Body.copy(textAlign = TextAlign.Start), + color = colorScheme.colorTextPrimary, modifier = Modifier .align(Alignment.CenterVertically) .weight(1f), @@ -255,7 +264,7 @@ private fun TodoWidgetConfigureView( ) } - WidgetBackgroundTypeExposedDropdownMenu( + WidgetBackgroundTypeDropdownMenu( current = selectedBackgroundType, onSelected = { onBackgroundTypeSelected(it) }, modifier = Modifier.padding(bottom = 16.dp), @@ -289,6 +298,43 @@ private fun TodoWidgetConfigureView( } } +@Composable +private fun ServerDropdownMenu( + servers: List, + current: Int?, + onSelected: (Int) -> Unit, + modifier: Modifier = Modifier, +) { + HADropdownMenu( + items = servers.map { HADropdownItem(key = it.id, label = it.friendlyName) }, + selectedKey = current, + onItemSelected = onSelected, + label = stringResource(commonR.string.server_select), + modifier = modifier, + ) +} + +@Composable +private fun WidgetBackgroundTypeDropdownMenu( + current: WidgetBackgroundType?, + onSelected: (WidgetBackgroundType) -> Unit, + modifier: Modifier = Modifier, +) { + val context = LocalContext.current + val options = remember { WidgetUtils.getBackgroundOptionList(context) } + val selectedKey = remember(current, options) { + current?.let { WidgetUtils.getSelectedBackgroundOption(context, it, options) } + } + + HADropdownMenu( + items = options.mapIndexed { index, label -> HADropdownItem(key = index, label = label) }, + selectedKey = selectedKey, + onItemSelected = { index -> onSelected(WidgetUtils.getWidgetBackgroundType(context, options[index])) }, + label = stringResource(commonR.string.widget_background_type_title), + modifier = modifier, + ) +} + @Preview @Composable private fun TodoWidgetConfigureViewPreview() {