From 9dd0f46926ae2c1f4091b3ba0878bd61223acdd7 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 13 Jun 2025 09:47:44 +0200 Subject: [PATCH] Improve accessibility of Poll answers. --- .../poll/api/pollcontent/PollAnswerView.kt | 41 +++++++++++++++---- .../poll/api/src/main/res/values/localazy.xml | 5 +++ .../src/main/res/values/localazy.xml | 1 + tools/localazy/config.json | 6 +++ 4 files changed, 45 insertions(+), 8 deletions(-) create mode 100644 features/poll/api/src/main/res/values/localazy.xml diff --git a/features/poll/api/src/main/kotlin/io/element/android/features/poll/api/pollcontent/PollAnswerView.kt b/features/poll/api/src/main/kotlin/io/element/android/features/poll/api/pollcontent/PollAnswerView.kt index 6243bd38d9..0c0cebca72 100644 --- a/features/poll/api/src/main/kotlin/io/element/android/features/poll/api/pollcontent/PollAnswerView.kt +++ b/features/poll/api/src/main/kotlin/io/element/android/features/poll/api/pollcontent/PollAnswerView.kt @@ -20,9 +20,13 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.StrokeCap import androidx.compose.ui.res.pluralStringResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.semantics.clearAndSetSemantics +import androidx.compose.ui.semantics.contentDescription import androidx.compose.ui.unit.dp import io.element.android.compound.theme.ElementTheme import io.element.android.compound.tokens.generated.CompoundIcons +import io.element.android.features.poll.api.R import io.element.android.libraries.designsystem.preview.ElementPreview import io.element.android.libraries.designsystem.preview.PreviewsDayNight import io.element.android.libraries.designsystem.theme.components.Icon @@ -32,14 +36,40 @@ import io.element.android.libraries.designsystem.theme.progressIndicatorTrackCol import io.element.android.libraries.designsystem.toEnabledColor import io.element.android.libraries.designsystem.utils.CommonDrawables import io.element.android.libraries.ui.strings.CommonPlurals +import io.element.android.libraries.ui.strings.CommonStrings @Composable internal fun PollAnswerView( answerItem: PollAnswerItem, modifier: Modifier = Modifier, ) { + val nbVotesText = pluralStringResource( + id = CommonPlurals.common_poll_votes_count, + count = answerItem.votesCount, + answerItem.votesCount, + ) + val a11yText = buildString { + val sentenceDelimiter = stringResource(CommonStrings.common_sentence_delimiter) + append(answerItem.answer.text.removeSuffix(".")) + if (answerItem.showVotes) { + append(sentenceDelimiter) + append(nbVotesText) + if (answerItem.votesCount != 0) { + append(sentenceDelimiter) + append(stringResource(R.string.a11y_polls_percent_of_total, (answerItem.percentage * 100).toInt())) + } + if (answerItem.isWinner) { + append(sentenceDelimiter) + append(stringResource(R.string.a11y_polls_winning_answer)) + } + } + } Row( - modifier = modifier.fillMaxWidth(), + modifier = modifier + .fillMaxWidth() + .clearAndSetSemantics { + contentDescription = a11yText + }, ) { Icon( imageVector = if (answerItem.isSelected) { @@ -70,11 +100,6 @@ internal fun PollAnswerView( style = if (answerItem.isWinner) ElementTheme.typography.fontBodyLgMedium else ElementTheme.typography.fontBodyLgRegular, ) if (answerItem.showVotes) { - val text = pluralStringResource( - id = CommonPlurals.common_poll_votes_count, - count = answerItem.votesCount, - answerItem.votesCount - ) Row( modifier = Modifier.align(Alignment.Bottom), verticalAlignment = Alignment.CenterVertically, @@ -87,13 +112,13 @@ internal fun PollAnswerView( ) Spacer(modifier = Modifier.width(2.dp)) Text( - text = text, + text = nbVotesText, style = ElementTheme.typography.fontBodySmMedium, color = ElementTheme.colors.textPrimary, ) } else { Text( - text = text, + text = nbVotesText, style = ElementTheme.typography.fontBodySmRegular, color = ElementTheme.colors.textSecondary, ) diff --git a/features/poll/api/src/main/res/values/localazy.xml b/features/poll/api/src/main/res/values/localazy.xml new file mode 100644 index 0000000000..2c90549056 --- /dev/null +++ b/features/poll/api/src/main/res/values/localazy.xml @@ -0,0 +1,5 @@ + + + "%1$d percent of total votes" + "This is the winning answer" + diff --git a/libraries/ui-strings/src/main/res/values/localazy.xml b/libraries/ui-strings/src/main/res/values/localazy.xml index d2cbee9a19..21004580f1 100644 --- a/libraries/ui-strings/src/main/res/values/localazy.xml +++ b/libraries/ui-strings/src/main/res/values/localazy.xml @@ -259,6 +259,7 @@ Reason: %1$s." "Sending…" "Sending failed" "Sent" + ". " "Server not supported" "Server URL" "Settings" diff --git a/tools/localazy/config.json b/tools/localazy/config.json index b299c39ef7..5c70f3fe50 100644 --- a/tools/localazy/config.json +++ b/tools/localazy/config.json @@ -242,6 +242,12 @@ "screen_polls_history_.*" ] }, + { + "name" : ":features:poll:api", + "includeRegex" : [ + "a11y\\.polls\\..*" + ] + }, { "name" : ":features:securebackup:impl", "includeRegex" : [