Add contentDescriptions

This commit is contained in:
Andrew 2024-06-06 11:00:51 +09:30
parent 50addd644c
commit c489765a50
8 changed files with 33 additions and 16 deletions

View File

@ -103,15 +103,15 @@ class InviteFriendFragment : Fragment() {
Text(stringResource(R.string.share)) Text(stringResource(R.string.share))
} }
TemporaryStateButton { source, temporary -> TemporaryStateButton { source, isTemporary ->
OutlineButton( OutlineButton(
modifier = Modifier.weight(1f) modifier = Modifier.weight(1f)
.contentDescription("Copy button"), .contentDescription("Copy button"),
interactionSource = source, interactionSource = source,
onClick = { requireContext().copyPublicKey() }, onClick = { requireContext().copyPublicKey() },
) { ) {
AnimatedVisibility(temporary) { Text(stringResource(R.string.copied)) } AnimatedVisibility(isTemporary) { Text(stringResource(R.string.copied)) }
AnimatedVisibility(!temporary) { Text(stringResource(R.string.copy)) } AnimatedVisibility(!isTemporary) { Text(stringResource(R.string.copy)) }
} }
} }
} }

View File

@ -103,6 +103,7 @@ import org.thoughtcrime.securesms.ui.SessionShieldIcon
import org.thoughtcrime.securesms.ui.ThemeResPreviewParameterProvider import org.thoughtcrime.securesms.ui.ThemeResPreviewParameterProvider
import org.thoughtcrime.securesms.ui.components.OutlineButton import org.thoughtcrime.securesms.ui.components.OutlineButton
import org.thoughtcrime.securesms.ui.contentDescription import org.thoughtcrime.securesms.ui.contentDescription
import org.thoughtcrime.securesms.ui.contentDescription
import org.thoughtcrime.securesms.ui.h8 import org.thoughtcrime.securesms.ui.h8
import org.thoughtcrime.securesms.ui.small import org.thoughtcrime.securesms.ui.small
import org.thoughtcrime.securesms.util.ConfigurationMessageUtilities import org.thoughtcrime.securesms.util.ConfigurationMessageUtilities
@ -393,7 +394,7 @@ class HomeActivity : PassphraseRequiredActionBarActivity(),
Spacer(Modifier.width(12.dp)) Spacer(Modifier.width(12.dp))
OutlineButton( OutlineButton(
textId = R.string.continue_2, textId = R.string.continue_2,
Modifier modifier = Modifier
.align(Alignment.CenterVertically) .align(Alignment.CenterVertically)
.contentDescription(R.string.AccessibilityId_reveal_recovery_phrase_button), .contentDescription(R.string.AccessibilityId_reveal_recovery_phrase_button),
onClick = { start<RecoveryPasswordActivity>() } onClick = { start<RecoveryPasswordActivity>() }

View File

@ -185,11 +185,11 @@ class LandingActivity : BaseActionBarActivity() {
showOpenUrlDialog { showOpenUrlDialog {
button( button(
R.string.activity_landing_terms_of_service, R.string.activity_landing_terms_of_service,
contentDescriptionRes = R.string.AccessibilityId_terms_of_service_link contentDescriptionRes = R.string.AccessibilityId_terms_of_service_button
) { open("https://getsession.org/terms-of-service") } ) { open("https://getsession.org/terms-of-service") }
button( button(
R.string.activity_landing_privacy_policy, R.string.activity_landing_privacy_policy,
contentDescriptionRes = R.string.AccessibilityId_privacy_policy_link contentDescriptionRes = R.string.AccessibilityId_privacy_policy_button
) { open("https://getsession.org/privacy-policy") } ) { open("https://getsession.org/privacy-policy") }
} }
} }

View File

@ -128,6 +128,7 @@ fun MessageNotificationsScreen(
OutlineButton( OutlineButton(
textId = R.string.continue_2, textId = R.string.continue_2,
modifier = Modifier modifier = Modifier
.contentDescription(R.string.AccessibilityId_continue)
.align(Alignment.CenterHorizontally) .align(Alignment.CenterHorizontally)
.width(262.dp), .width(262.dp),
onClick = onContinue onClick = onContinue

View File

@ -124,7 +124,12 @@ class PickDisplayNameActivity : BaseActionBarActivity() {
) )
state.error?.let { state.error?.let {
Text(stringResource(it), style = MaterialTheme.typography.baseBold, color = MaterialTheme.colors.error) Text(
stringResource(it),
modifier = Modifier.contentDescription(R.string.AccessibilityId_error_message),
style = MaterialTheme.typography.baseBold,
color = MaterialTheme.colors.error
)
} }
Spacer(modifier = Modifier.weight(2f)) Spacer(modifier = Modifier.weight(2f))
@ -132,6 +137,7 @@ class PickDisplayNameActivity : BaseActionBarActivity() {
OutlineButton( OutlineButton(
textId = R.string.continue_2, textId = R.string.continue_2,
modifier = Modifier modifier = Modifier
.contentDescription(R.string.AccessibilityId_continue)
.align(Alignment.CenterHorizontally) .align(Alignment.CenterHorizontally)
.width(262.dp), .width(262.dp),
onClick = onContinue, onClick = onContinue,

View File

@ -24,13 +24,16 @@ import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.ComposeView import androidx.compose.ui.platform.ComposeView
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.text.font.FontFamily
import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.tooling.preview.PreviewParameter
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.core.content.ContentProviderCompat.requireContext
import network.loki.messenger.R import network.loki.messenger.R
import org.thoughtcrime.securesms.BaseActionBarActivity import org.thoughtcrime.securesms.BaseActionBarActivity
import org.thoughtcrime.securesms.preferences.copyPublicKey
import org.thoughtcrime.securesms.showSessionDialog import org.thoughtcrime.securesms.showSessionDialog
import org.thoughtcrime.securesms.ui.AppTheme import org.thoughtcrime.securesms.ui.AppTheme
import org.thoughtcrime.securesms.ui.CellWithPaddingAndMargin import org.thoughtcrime.securesms.ui.CellWithPaddingAndMargin
@ -69,7 +72,7 @@ class RecoveryPasswordActivity : BaseActionBarActivity() {
showSessionDialog { showSessionDialog {
title(R.string.recoveryPasswordHidePermanently) title(R.string.recoveryPasswordHidePermanently)
htmlText(R.string.recoveryPasswordHidePermanentlyDescription1) htmlText(R.string.recoveryPasswordHidePermanentlyDescription1)
destructiveButton(R.string.continue_2) { onHideConfirm() } destructiveButton(R.string.continue_2, R.string.AccessibilityId_continue) { onHideConfirm() }
cancelButton() cancelButton()
} }
} }
@ -110,6 +113,7 @@ fun RecoveryPassword(
Column( Column(
verticalArrangement = Arrangement.spacedBy(16.dp), verticalArrangement = Arrangement.spacedBy(16.dp),
modifier = Modifier modifier = Modifier
.contentDescription(R.string.AccessibilityId_recovery_password)
.verticalScroll(rememberScrollState()) .verticalScroll(rememberScrollState())
.padding(bottom = 16.dp) .padding(bottom = 16.dp)
) { ) {
@ -141,6 +145,7 @@ fun RecoveryPasswordCell(seed: String, copySeed:() -> Unit = {}) {
Text( Text(
seed, seed,
modifier = Modifier modifier = Modifier
.contentDescription(R.string.AccessibilityId_hide_recovery_password_button)
.padding(vertical = 24.dp) .padding(vertical = 24.dp)
.border( .border(
width = 1.dp, width = 1.dp,
@ -167,14 +172,15 @@ fun RecoveryPasswordCell(seed: String, copySeed:() -> Unit = {}) {
AnimatedVisibility(!showQr) { AnimatedVisibility(!showQr) {
Row(horizontalArrangement = Arrangement.spacedBy(32.dp)) { Row(horizontalArrangement = Arrangement.spacedBy(32.dp)) {
TemporaryStateButton { source, temporary -> TemporaryStateButton { source, isTemporary ->
OutlineButton( OutlineButton(
modifier = Modifier.weight(1f), modifier = Modifier.weight(1f)
.contentDescription(R.string.AccessibilityId_copy_button),
interactionSource = source, interactionSource = source,
onClick = { copySeed() }, onClick = copySeed,
) { ) {
AnimatedVisibility(temporary) { Text(stringResource(R.string.copied)) } AnimatedVisibility(isTemporary) { Text(stringResource(R.string.copied)) }
AnimatedVisibility(!temporary) { Text(stringResource(R.string.copy)) } AnimatedVisibility(!isTemporary) { Text(stringResource(R.string.copy)) }
} }
} }
OutlineButton(textId = R.string.qrView, modifier = Modifier.weight(1f), onClick = { showQr = !showQr }) OutlineButton(textId = R.string.qrView, modifier = Modifier.weight(1f), onClick = { showQr = !showQr })

View File

@ -283,7 +283,7 @@ fun Modifier.contentDescription(text: GetString?): Modifier {
} }
@Composable @Composable
fun Modifier.contentDescription(id: Int?): Modifier { fun Modifier.contentDescription(@StringRes id: Int?): Modifier {
val context = LocalContext.current val context = LocalContext.current
return id?.let { semantics { contentDescription = context.getString(it) } } ?: this return id?.let { semantics { contentDescription = context.getString(it) } } ?: this
} }

View File

@ -134,6 +134,7 @@
<string name="AccessibilityId_username">Username</string> <string name="AccessibilityId_username">Username</string>
<string name="AccessibilityId_privacy">Privacy</string> <string name="AccessibilityId_privacy">Privacy</string>
<string name="AccessibilityId_recovery_password_menu_item">Recovery password menu item</string> <string name="AccessibilityId_recovery_password_menu_item">Recovery password menu item</string>
<string name="AccessibilityId_recovery_password">Recovery password</string>
<string name="AccessibilityId_edit_user_nickname">Edit user nickname</string> <string name="AccessibilityId_edit_user_nickname">Edit user nickname</string>
<string name="AccessibilityId_apply">Apply</string> <string name="AccessibilityId_apply">Apply</string>
<string name="AccessibilityId_cancel">Cancel</string> <string name="AccessibilityId_cancel">Cancel</string>
@ -1111,7 +1112,8 @@
<string name="AccessibilityId_create_account_button">Create account button</string> <string name="AccessibilityId_create_account_button">Create account button</string>
<string name="AccessibilityId_restore_account_button">Restore your session button</string> <string name="AccessibilityId_restore_account_button">Restore your session button</string>
<string name="AccessibilityId_privacy_policy_link">Privacy policy link</string> <string name="AccessibilityId_privacy_policy_link">Privacy policy link</string>
<string name="AccessibilityId_terms_of_service_link">Terms of service link</string> <string name="AccessibilityId_terms_of_service_button">Terms of service button</string>
<string name="AccessibilityId_privacy_policy_button">Privacy policy button</string>
<string name="AccessibilityId_loading_animation">Loading animation</string> <string name="AccessibilityId_loading_animation">Loading animation</string>
<string name="AccessibilityId_recovery_phrase_input">Recovery phrase input</string> <string name="AccessibilityId_recovery_phrase_input">Recovery phrase input</string>
<string name="AccessibilityId_error_message">Error message</string> <string name="AccessibilityId_error_message">Error message</string>
@ -1136,4 +1138,5 @@
<string name="this_qr_code_does_not_contain_an_account_id">This QR code does not contain an Account ID.</string> <string name="this_qr_code_does_not_contain_an_account_id">This QR code does not contain an Account ID.</string>
<string name="AccessibilityId_invite_friend_button">Invite friend button</string> <string name="AccessibilityId_invite_friend_button">Invite friend button</string>
<string name="AccessibilityId_help_desk_link">Help desk link</string> <string name="AccessibilityId_help_desk_link">Help desk link</string>
<string name="AccessibilityId_copy_button">Copy button</string>
</resources> </resources>