From 8ad340200ad9089dd0cf43d569d4d8c9512a183f Mon Sep 17 00:00:00 2001 From: Aisha Yahya Date: Tue, 28 Jul 2026 14:41:51 -0400 Subject: [PATCH 1/5] Migrate SettingsWearTopAppBar to Material3 HATopBar --- .idea/markdown.xml | 8 ++++ .../wear/views/SettingsWearHomeView.kt | 41 ++++--------------- gradle.properties | 3 ++ 3 files changed, 20 insertions(+), 32 deletions(-) create mode 100644 .idea/markdown.xml diff --git a/.idea/markdown.xml b/.idea/markdown.xml new file mode 100644 index 00000000000..c61ea3346e8 --- /dev/null +++ b/.idea/markdown.xml @@ -0,0 +1,8 @@ + + + + + + \ No newline at end of file diff --git a/app/src/full/kotlin/io/homeassistant/companion/android/settings/wear/views/SettingsWearHomeView.kt b/app/src/full/kotlin/io/homeassistant/companion/android/settings/wear/views/SettingsWearHomeView.kt index 512e524945e..a31ecea9b2d 100644 --- a/app/src/full/kotlin/io/homeassistant/companion/android/settings/wear/views/SettingsWearHomeView.kt +++ b/app/src/full/kotlin/io/homeassistant/companion/android/settings/wear/views/SettingsWearHomeView.kt @@ -2,25 +2,19 @@ package io.homeassistant.companion.android.settings.wear.views import android.content.Intent import androidx.compose.foundation.layout.windowInsetsPadding -import androidx.compose.material.IconButton -import androidx.compose.material.TopAppBar import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.ColorFilter import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.res.colorResource -import androidx.compose.ui.res.stringResource import androidx.core.net.toUri import androidx.navigation.NavType import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable import androidx.navigation.compose.rememberNavController import androidx.navigation.navArgument -import com.mikepenz.iconics.compose.Image -import com.mikepenz.iconics.typeface.library.community.material.CommunityMaterial import io.homeassistant.companion.android.common.R as commonR +import io.homeassistant.companion.android.common.compose.composable.HATopBar import io.homeassistant.companion.android.settings.wear.SettingsWearViewModel import io.homeassistant.companion.android.util.compose.HomeAssistantAppTheme import io.homeassistant.companion.android.util.safeTopWindowInsets @@ -114,34 +108,17 @@ fun SettingsWearTopAppBar( docsLink: String? = null, ) { val context = LocalContext.current - TopAppBar( + HATopBar( title = title, modifier = modifier.windowInsetsPadding(safeTopWindowInsets()), - navigationIcon = { - IconButton(onClick = onBackClicked) { - Image( - asset = CommunityMaterial.Icon.cmd_arrow_left, - colorFilter = ColorFilter.tint(colorResource(commonR.color.colorOnBackground)), - ) - } - }, - actions = { - if (!docsLink.isNullOrBlank()) { - IconButton( - onClick = { - val intent = Intent(Intent.ACTION_VIEW, docsLink.toUri()) - context.startActivity(intent) - }, - ) { - Image( - asset = CommunityMaterial.Icon2.cmd_help_circle_outline, - contentDescription = stringResource(commonR.string.help), - colorFilter = ColorFilter.tint(colorResource(commonR.color.colorOnBackground)), - ) - } + onBackClick = onBackClicked, + onHelpClick = if (!docsLink.isNullOrBlank()) { + { + val intent = Intent(Intent.ACTION_VIEW, docsLink.toUri()) + context.startActivity(intent) } + } else { + null }, - backgroundColor = colorResource(id = commonR.color.colorBackground), - contentColor = colorResource(id = commonR.color.colorOnBackground), ) } diff --git a/gradle.properties b/gradle.properties index 3b0b7238a2b..e7e0e54a307 100644 --- a/gradle.properties +++ b/gradle.properties @@ -37,3 +37,6 @@ android.experimental.enableScreenshotTest=true # Uncomment to disable Strict Mode #noStrictMode=true + +# Enabled parallel sync for Gradle 9.4+ +org.gradle.tooling.parallel=true From cdf9dcac77747e72539bdb28b0e4dc90eda1dc69 Mon Sep 17 00:00:00 2001 From: Aisha Yahya Date: Wed, 5 Aug 2026 20:23:59 -0400 Subject: [PATCH 2/5] Add unit tests for SettingsWearTopAppBar HATopBar migration --- .../wear/views/SettingsWearTopAppBarTest.kt | 80 +++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 wear/src/test/kotlin/io/homeassistant/companion/android/settings/wear/views/SettingsWearTopAppBarTest.kt diff --git a/wear/src/test/kotlin/io/homeassistant/companion/android/settings/wear/views/SettingsWearTopAppBarTest.kt b/wear/src/test/kotlin/io/homeassistant/companion/android/settings/wear/views/SettingsWearTopAppBarTest.kt new file mode 100644 index 00000000000..867ed43fd18 --- /dev/null +++ b/wear/src/test/kotlin/io/homeassistant/companion/android/settings/wear/views/SettingsWearTopAppBarTest.kt @@ -0,0 +1,80 @@ +package io.homeassistant.companion.android.settings.wear.views + +import androidx.compose.material3.Text +import androidx.compose.ui.test.junit4.createComposeRule +import androidx.compose.ui.test.onNodeWithContentDescription +import androidx.compose.ui.test.onNodeWithText +import androidx.compose.ui.test.performClick +import io.homeassistant.companion.android.util.compose.HomeAssistantAppTheme +import org.junit.Rule +import org.junit.Test + +class SettingsWearTopAppBarTest { + + @get:Rule + val composeTestRule = createComposeRule() + + @Test + fun `Given a wear settings screen when it renders without a docs link then no help icon is shown`() { + composeTestRule.setContent { + HomeAssistantAppTheme { + SettingsWearTopAppBar( + title = { Text("Favorites") }, + onBackClicked = {}, + docsLink = null, + ) + } + } + + composeTestRule.onNodeWithContentDescription("Get help").assertDoesNotExist() + } + + @Test + fun `Given a wear settings screen when it renders with a docs link then a help icon is shown`() { + composeTestRule.setContent { + HomeAssistantAppTheme { + SettingsWearTopAppBar( + title = { Text("Favorites") }, + onBackClicked = {}, + docsLink = WEAR_DOCS_LINK, + ) + } + } + + composeTestRule.onNodeWithContentDescription("Get help").assertExists() + } + + @Test + fun `Given a wear settings screen when the back icon is tapped then onBackClicked is invoked`() { + var backClicked = false + + composeTestRule.setContent { + HomeAssistantAppTheme { + SettingsWearTopAppBar( + title = { Text("Favorites") }, + onBackClicked = { backClicked = true }, + docsLink = null, + ) + } + } + + composeTestRule.onNodeWithContentDescription("Navigate up").performClick() + + assert(backClicked) { "Expected onBackClicked to be invoked after tapping the back icon" } + } + + @Test + fun `Given a wear settings screen when it renders then the title is displayed`() { + composeTestRule.setContent { + HomeAssistantAppTheme { + SettingsWearTopAppBar( + title = { Text("Favorites") }, + onBackClicked = {}, + docsLink = null, + ) + } + } + + composeTestRule.onNodeWithText("Favorites").assertExists() + } +} From ca0874d77f96a001f6fee54ad5a1bf435281e062 Mon Sep 17 00:00:00 2001 From: aishsidya0402-netizen Date: Sat, 8 Aug 2026 12:48:39 -0400 Subject: [PATCH 3/5] Remove duplicate gradle.tooling.parallel entry Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- gradle.properties | 2 -- 1 file changed, 2 deletions(-) diff --git a/gradle.properties b/gradle.properties index e7e0e54a307..5024684f806 100644 --- a/gradle.properties +++ b/gradle.properties @@ -38,5 +38,3 @@ android.experimental.enableScreenshotTest=true # Uncomment to disable Strict Mode #noStrictMode=true -# Enabled parallel sync for Gradle 9.4+ -org.gradle.tooling.parallel=true From 7b3fd72c96572f6a9ded4781e6bd9b44bc9321cc Mon Sep 17 00:00:00 2001 From: Aisha Yahya Date: Sat, 8 Aug 2026 12:57:30 -0400 Subject: [PATCH 4/5] Remove IDE-specific markdown settings file --- .idea/markdown.xml | 8 -------- 1 file changed, 8 deletions(-) delete mode 100644 .idea/markdown.xml diff --git a/.idea/markdown.xml b/.idea/markdown.xml deleted file mode 100644 index c61ea3346e8..00000000000 --- a/.idea/markdown.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - \ No newline at end of file From 04d8c9fbc623e684c6b3fb3523cf8417463ff10f Mon Sep 17 00:00:00 2001 From: Aisha Yahya Date: Sun, 9 Aug 2026 15:02:04 -0400 Subject: [PATCH 5/5] Move SettingsWearTopAppBarTest to app/testFull to match production module --- .../android/settings/wear/views/SettingsWearTopAppBarTest.kt | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {wear/src/test => app/src/testFull}/kotlin/io/homeassistant/companion/android/settings/wear/views/SettingsWearTopAppBarTest.kt (100%) diff --git a/wear/src/test/kotlin/io/homeassistant/companion/android/settings/wear/views/SettingsWearTopAppBarTest.kt b/app/src/testFull/kotlin/io/homeassistant/companion/android/settings/wear/views/SettingsWearTopAppBarTest.kt similarity index 100% rename from wear/src/test/kotlin/io/homeassistant/companion/android/settings/wear/views/SettingsWearTopAppBarTest.kt rename to app/src/testFull/kotlin/io/homeassistant/companion/android/settings/wear/views/SettingsWearTopAppBarTest.kt