feat(folio): add screen root contentDescription for scoped ax selection

Each screen root gets semantics { contentDescription = "ScreenName" } so
sanderling specs can scope element lookups through the screen: desc:LoginScreen > desc:login_submit.
This commit is contained in:
pj committed 2026-04-25 19:50:19 +07:00
1 parent 3feb7b2d7f
commit cd11faf1fa
5 files changed
+11 -5

No files matched your search

@@ -14,6 +14,8 @@ import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.testTag import androidx.compose.ui.platform.testTag
import androidx.compose.ui.semantics.contentDescription
import androidx.compose.ui.semantics.semantics
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import app.folio.data.Repository import app.folio.data.Repository
import app.folio.navigation.Navigator import app.folio.navigation.Navigator
@@ -60,7 +62,7 @@ fun AddAccountScreen() {
} }
Screen( Screen(
modifier = Modifier.testTag("AddAccountScreen"), modifier = Modifier.testTag("AddAccountScreen").semantics { contentDescription = "AddAccountScreen" },
header = { header = {
Header(title = "New account", left = { BackButton(onClick = { Navigator.back(Route.Home) }) }) Header(title = "New account", left = { BackButton(onClick = { Navigator.back(Route.Home) }) })
}, },
@@ -16,6 +16,8 @@ import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.testTag import androidx.compose.ui.platform.testTag
import androidx.compose.ui.semantics.contentDescription
import androidx.compose.ui.semantics.semantics
import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import app.folio.data.Repository import app.folio.data.Repository
@@ -60,7 +62,7 @@ fun LoginScreen(onLoggedIn: (String) -> Unit) {
onLoggedIn(user) onLoggedIn(user)
} }
Screen(modifier = Modifier.testTag("LoginScreen")) { Screen(modifier = Modifier.testTag("LoginScreen").semantics { contentDescription = "LoginScreen" }) {
Spacer(Modifier.height(16.dp)) Spacer(Modifier.height(16.dp))
Column( Column(
modifier = Modifier.fillMaxWidth().padding(vertical = 8.dp), modifier = Modifier.fillMaxWidth().padding(vertical = 8.dp),
@@ -50,7 +50,7 @@ fun HomeScreen(user: String, onLogout: () -> Unit) {
val total = balanceOf(txns) val total = balanceOf(txns)
Screen( Screen(
modifier = Modifier.testTag("HomeScreen"), modifier = Modifier.testTag("HomeScreen").semantics { contentDescription = "HomeScreen" },
header = { header = {
Header( Header(
title = "Accounts", title = "Accounts",
@@ -13,6 +13,8 @@ import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.testTag import androidx.compose.ui.platform.testTag
import androidx.compose.ui.semantics.contentDescription
import androidx.compose.ui.semantics.semantics
import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
@@ -91,7 +93,7 @@ fun AddTransactionScreen(accountId: String) {
} }
Screen( Screen(
modifier = Modifier.testTag("AddTransactionScreen"), modifier = Modifier.testTag("AddTransactionScreen").semantics { contentDescription = "AddTransactionScreen" },
header = { header = {
Header( Header(
title = "Add transaction", title = "Add transaction",
@@ -75,7 +75,7 @@ fun LedgerScreen(accountId: String) {
val balance = balanceOf(txns) val balance = balanceOf(txns)
Screen( Screen(
modifier = Modifier.testTag("LedgerScreen"), modifier = Modifier.testTag("LedgerScreen").semantics { contentDescription = "LedgerScreen" },
header = { header = {
Header( Header(
title = account.name, title = account.name,