From bb0c91ee5a0d47d97a13beb6b4bcbac8577455cb Mon Sep 17 00:00:00 2001 From: Joshua Queen <139182194+joshua-livefront@users.noreply.github.com> Date: Wed, 31 Jan 2024 13:23:27 -0500 Subject: [PATCH] BIT-1171: Element IDs for LoginApporvalScreen and Reset Password Screen (#901) --- .../resetpassword/ResetPasswordScreen.kt | 10 +++++++ .../loginapproval/LoginApprovalScreen.kt | 30 +++++++++++++++---- 2 files changed, 34 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/auth/feature/resetpassword/ResetPasswordScreen.kt b/app/src/main/java/com/x8bit/bitwarden/ui/auth/feature/resetpassword/ResetPasswordScreen.kt index 9b23636b0..4ae35b850 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/auth/feature/resetpassword/ResetPasswordScreen.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/auth/feature/resetpassword/ResetPasswordScreen.kt @@ -22,9 +22,13 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment +import androidx.compose.ui.ExperimentalComposeUiApi import androidx.compose.ui.Modifier import androidx.compose.ui.input.nestedscroll.nestedScroll import androidx.compose.ui.res.stringResource +import androidx.compose.ui.semantics.semantics +import androidx.compose.ui.semantics.testTag +import androidx.compose.ui.semantics.testTagsAsResourceId import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel @@ -141,6 +145,7 @@ fun ResetPasswordScreen( } } +@OptIn(ExperimentalComposeUiApi::class) @Composable @Suppress("LongMethod") private fun ResetPasswordScreeContent( @@ -154,6 +159,7 @@ private fun ResetPasswordScreeContent( Column( horizontalAlignment = Alignment.CenterHorizontally, modifier = modifier + .semantics { testTagsAsResourceId = true } .imePadding() .verticalScroll(rememberScrollState()), ) { @@ -204,6 +210,7 @@ private fun ResetPasswordScreeContent( value = state.currentPasswordInput, onValueChange = onCurrentPasswordInputChanged, modifier = Modifier + .semantics { testTag = "MasterPasswordField" } .padding(horizontal = 16.dp) .fillMaxWidth(), ) @@ -215,6 +222,7 @@ private fun ResetPasswordScreeContent( value = state.passwordInput, onValueChange = onPasswordInputChanged, modifier = Modifier + .semantics { testTag = "NewPasswordField" } .padding(horizontal = 16.dp) .fillMaxWidth(), ) @@ -226,6 +234,7 @@ private fun ResetPasswordScreeContent( value = state.retypePasswordInput, onValueChange = onRetypePasswordInputChanged, modifier = Modifier + .semantics { testTag = "RetypePasswordField" } .padding(horizontal = 16.dp) .fillMaxWidth(), ) @@ -238,6 +247,7 @@ private fun ResetPasswordScreeContent( onValueChange = onPasswordHintInputChanged, hint = stringResource(id = R.string.master_password_hint_description), modifier = Modifier + .semantics { testTag = "MasterPasswordHintLabel" } .fillMaxWidth() .padding(horizontal = 16.dp), ) diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/loginapproval/LoginApprovalScreen.kt b/app/src/main/java/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/loginapproval/LoginApprovalScreen.kt index ce055c597..546b14d3e 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/loginapproval/LoginApprovalScreen.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/loginapproval/LoginApprovalScreen.kt @@ -19,11 +19,15 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.remember +import androidx.compose.ui.ExperimentalComposeUiApi import androidx.compose.ui.Modifier import androidx.compose.ui.input.nestedscroll.nestedScroll import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource +import androidx.compose.ui.semantics.semantics +import androidx.compose.ui.semantics.testTag +import androidx.compose.ui.semantics.testTagsAsResourceId import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel @@ -131,6 +135,7 @@ fun LoginApprovalScreen( } } +@OptIn(ExperimentalComposeUiApi::class) @Suppress("LongMethod") @Composable private fun LoginApprovalContent( @@ -141,6 +146,7 @@ private fun LoginApprovalContent( ) { Column( modifier = modifier + .semantics { testTagsAsResourceId = true } .verticalScroll(state = rememberScrollState()), ) { Spacer(modifier = Modifier.height(8.dp)) @@ -163,7 +169,8 @@ private fun LoginApprovalContent( color = MaterialTheme.colorScheme.onSurfaceVariant, modifier = Modifier .fillMaxWidth() - .padding(horizontal = 16.dp), + .padding(horizontal = 16.dp) + .semantics { testTag = "LogInAttemptByLabel" }, ) Spacer(modifier = Modifier.height(24.dp)) @@ -173,7 +180,8 @@ private fun LoginApprovalContent( color = MaterialTheme.colorScheme.onSurfaceVariant, modifier = Modifier .fillMaxWidth() - .padding(horizontal = 16.dp), + .padding(horizontal = 16.dp) + .semantics { testTag = "FingerprintValueLabel" }, ) Spacer(modifier = Modifier.height(12.dp)) @@ -184,7 +192,8 @@ private fun LoginApprovalContent( style = LocalNonMaterialTypography.current.sensitiveInfoSmall, modifier = Modifier .fillMaxWidth() - .padding(horizontal = 16.dp), + .padding(horizontal = 16.dp) + .semantics { testTag = "FingerprintValue" }, ) Spacer(modifier = Modifier.height(16.dp)) @@ -192,6 +201,7 @@ private fun LoginApprovalContent( LoginApprovalInfoColumn( label = stringResource(id = R.string.device_type), value = state.deviceType, + valueTestTag = "DeviceTypeValueLabel", ) LoginApprovalInfoColumn( @@ -211,7 +221,8 @@ private fun LoginApprovalContent( onClick = onConfirmLoginClick, modifier = Modifier .fillMaxWidth() - .padding(horizontal = 16.dp), + .padding(horizontal = 16.dp) + .semantics { testTag = "ConfirmLoginButton" }, ) Spacer(modifier = Modifier.height(8.dp)) @@ -221,7 +232,8 @@ private fun LoginApprovalContent( onClick = onDeclineLoginClick, modifier = Modifier .fillMaxWidth() - .padding(horizontal = 16.dp), + .padding(horizontal = 16.dp) + .semantics { testTag = "DenyLoginButton" }, ) Spacer(modifier = Modifier.navigationBarsPadding()) @@ -235,6 +247,7 @@ private fun LoginApprovalContent( private fun LoginApprovalInfoColumn( label: String, value: String, + valueTestTag: String? = null, ) { Spacer(modifier = Modifier.height(8.dp)) @@ -255,7 +268,12 @@ private fun LoginApprovalInfoColumn( color = MaterialTheme.colorScheme.onSurfaceVariant, modifier = Modifier .fillMaxWidth() - .padding(horizontal = 16.dp), + .padding(horizontal = 16.dp) + .semantics { + if (valueTestTag != null) { + testTag = valueTestTag + } + }, ) Spacer(modifier = Modifier.height(8.dp))