diff --git a/app/src/main/java/org/thoughtcrime/securesms/preferences/prosettings/BaseProSettingsScreens.kt b/app/src/main/java/org/thoughtcrime/securesms/preferences/prosettings/BaseProSettingsScreens.kt index fd56b19de8..3712528add 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/preferences/prosettings/BaseProSettingsScreens.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/preferences/prosettings/BaseProSettingsScreens.kt @@ -200,6 +200,7 @@ fun BaseCellButtonProSettingsScreen( .widthIn(max = LocalDimensions.current.maxContentWidth) .qaTag(R.string.qa_pro_screen_action), text = buttonText, + textQaTag = R.string.qa_pro_screen_action_label, onClick = onButtonClick ) } else { @@ -208,6 +209,7 @@ fun BaseCellButtonProSettingsScreen( .widthIn(max = LocalDimensions.current.maxContentWidth) .qaTag(R.string.qa_pro_screen_action), text = buttonText, + textQaTag = R.string.qa_pro_screen_action_label, onClick = onButtonClick ) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/ui/components/Button.kt b/app/src/main/java/org/thoughtcrime/securesms/ui/components/Button.kt index d54ceceb30..fda859b6d0 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/ui/components/Button.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/ui/components/Button.kt @@ -39,6 +39,7 @@ import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.filter import network.loki.messenger.R import org.thoughtcrime.securesms.ui.LaunchedEffectAsync +import androidx.annotation.StringRes import org.thoughtcrime.securesms.ui.qaTag import org.thoughtcrime.securesms.ui.theme.LocalColors import org.thoughtcrime.securesms.ui.theme.LocalDimensions @@ -106,9 +107,13 @@ fun Button( shape: Shape = buttonShape, minWidth: Dp = LocalDimensions.current.minButtonWidth, interactionSource: MutableInteractionSource = remember { MutableInteractionSource() }, + /// Tags the label rather than the button. A `qaTag` on the button covers a node whose own `text` is + /// empty - the copy sits on this child - so a UI test that filters a button by its text matches + /// nothing. Null leaves the label untagged, which is every existing caller. + @StringRes textQaTag: Int? = null, ) { Button(onClick, type, modifier, enabled, style, shape, minWidth = minWidth, interactionSource = interactionSource) { - Text(text) + Text(text, modifier = Modifier.qaTag(textQaTag)) } } @@ -128,11 +133,12 @@ fun Button( ) } -@Composable fun AccentFillButtonRect(text: String, modifier: Modifier = Modifier, enabled: Boolean = true, onClick: () -> Unit) { +@Composable fun AccentFillButtonRect(text: String, modifier: Modifier = Modifier, enabled: Boolean = true, @StringRes textQaTag: Int? = null, onClick: () -> Unit) { Button( text, onClick, ButtonType.AccentFill, modifier, enabled, style = ButtonStyle.XLarge, - shape = sessionShapes().extraSmall + shape = sessionShapes().extraSmall, + textQaTag = textQaTag ) } @@ -144,11 +150,12 @@ fun Button( ) } -@Composable fun DangerFillButtonRect(text: String, modifier: Modifier = Modifier, enabled: Boolean = true, onClick: () -> Unit) { +@Composable fun DangerFillButtonRect(text: String, modifier: Modifier = Modifier, enabled: Boolean = true, @StringRes textQaTag: Int? = null, onClick: () -> Unit) { Button( text, onClick, ButtonType.DangerFill, modifier, enabled, style = ButtonStyle.XLarge, - shape = sessionShapes().extraSmall + shape = sessionShapes().extraSmall, + textQaTag = textQaTag ) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/ui/dialog/AlertDialog.kt b/app/src/main/java/org/thoughtcrime/securesms/ui/dialog/AlertDialog.kt index f8fcd2032d..248801a01f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/ui/dialog/AlertDialog.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/ui/dialog/AlertDialog.kt @@ -1,6 +1,7 @@ package org.thoughtcrime.securesms.ui.dialog import android.widget.Toast +import androidx.annotation.StringRes import androidx.compose.foundation.background import androidx.compose.foundation.border import androidx.compose.foundation.layout.Box @@ -97,6 +98,7 @@ fun AlertDialog( title: String? = null, text: String? = null, maxLines: Int? = null, + @StringRes textQaTag: Int? = null, buttons: List? = null, showCloseButton: Boolean = false, content: @Composable () -> Unit = {} @@ -107,6 +109,7 @@ fun AlertDialog( title = if(title != null) AnnotatedString(title) else null, text = if(text != null) AnnotatedString(text) else null, maxLines = maxLines, + textQaTag = textQaTag, buttons = buttons, showCloseButton = showCloseButton, content = content @@ -121,6 +124,7 @@ fun AlertDialog( title: AnnotatedString? = null, text: AnnotatedString? = null, maxLines: Int? = null, + @StringRes textQaTag: Int? = null, buttons: List? = null, showCloseButton: Boolean = false, content: @Composable () -> Unit = {} @@ -134,6 +138,7 @@ fun AlertDialog( title = title, text = text, maxLines = maxLines, + textQaTag = textQaTag, buttons = buttons, showCloseButton = showCloseButton, content = content @@ -178,6 +183,7 @@ fun AlertDialogContent( title: AnnotatedString? = null, text: AnnotatedString? = null, maxLines: Int? = null, + @StringRes textQaTag: Int? = null, buttons: List? = null, showCloseButton: Boolean = false, content: @Composable () -> Unit = {} @@ -235,7 +241,7 @@ fun AlertDialogContent( textAlign = TextAlign.Center, style = textStyle, modifier = textModifier - .qaTag(R.string.AccessibilityId_modalMessage) + .qaTag(textQaTag ?: R.string.AccessibilityId_modalMessage) ) } content() diff --git a/app/src/main/java/org/thoughtcrime/securesms/ui/dialog/LinkDialog.kt b/app/src/main/java/org/thoughtcrime/securesms/ui/dialog/LinkDialog.kt index 437a5c8a26..97f9392263 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/ui/dialog/LinkDialog.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/ui/dialog/LinkDialog.kt @@ -17,6 +17,7 @@ import org.thoughtcrime.securesms.links.LinkType.CommunityLink.DisplayType.* import org.thoughtcrime.securesms.ui.GetString import org.thoughtcrime.securesms.ui.components.annotatedStringResource import org.thoughtcrime.securesms.ui.openUrl +import org.thoughtcrime.securesms.ui.qaTag import org.thoughtcrime.securesms.ui.theme.LocalColors import org.thoughtcrime.securesms.ui.theme.PreviewTheme @@ -67,14 +68,16 @@ fun OpenURLAlertDialog( AlertDialog( - modifier = modifier, + modifier = modifier.qaTag(R.string.qa_open_url_dialog), title = AnnotatedString(stringResource(R.string.urlOpen)), text = annotatedStringResource(text = unformattedText), + textQaTag = R.string.qa_open_url_description, maxLines = 5, showCloseButton = true, // display the 'x' button buttons = listOf( DialogButtonData( text = GetString(R.string.open), + qaTag = stringResource(R.string.qa_open_url_confirm_button), color = LocalColors.current.danger, dismissOnClick = false, onClick = { diff --git a/content-descriptions/src/main/res/values/strings.xml b/content-descriptions/src/main/res/values/strings.xml index c2f9b88846..5d64208b91 100644 --- a/content-descriptions/src/main/res/values/strings.xml +++ b/content-descriptions/src/main/res/values/strings.xml @@ -411,6 +411,10 @@ pro-screen-title pro-screen-description pro-screen-action + + pro-screen-action-label pro-link-cell-device @@ -440,4 +444,14 @@ equivalent control there is not reachable, and its specs locate the affordance differently. --> message-read-more + + open-url-dialog + open-url-description + open-url-confirm-button + \ No newline at end of file