Merge pull request #5007 from element-hq/feature/bma/a11y/reportRoom
[a11y] Fix several issues around accessibility
This commit is contained in:
commit
f39304d9d2
10 changed files with 57 additions and 50 deletions
|
|
@ -176,7 +176,6 @@ private fun RoomListModalBottomSheetContent(
|
|||
leadingContent = ListItemContent.Icon(
|
||||
iconSource = IconSource.Vector(
|
||||
CompoundIcons.ChatProblem(),
|
||||
contentDescription = stringResource(CommonStrings.action_report_room),
|
||||
)
|
||||
),
|
||||
style = ListItemStyle.Destructive,
|
||||
|
|
|
|||
|
|
@ -18,8 +18,6 @@ import androidx.compose.runtime.Composable
|
|||
import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.res.stringResource
|
||||
import androidx.compose.ui.semantics.hideFromAccessibility
|
||||
import androidx.compose.ui.semantics.semantics
|
||||
import androidx.compose.ui.tooling.preview.PreviewParameter
|
||||
import androidx.compose.ui.unit.dp
|
||||
import io.element.android.compound.theme.ElementTheme
|
||||
|
|
@ -44,15 +42,15 @@ fun TimelineEventTimestampView(
|
|||
modifier: Modifier = Modifier,
|
||||
) {
|
||||
val formattedTime = event.sentTime
|
||||
val hasError = event.localSendState is LocalEventSendState.Failed
|
||||
val hasError = event.failedToSend
|
||||
val hasEncryptionCritical = event.messageShield?.isCritical.orFalse()
|
||||
val isMessageEdited = event.content.isEdited()
|
||||
val isMessageRedacted = event.content.isRedacted()
|
||||
val tint = if (hasError || hasEncryptionCritical && !isMessageRedacted) ElementTheme.colors.textCriticalPrimary else ElementTheme.colors.textSecondary
|
||||
Row(
|
||||
modifier = Modifier
|
||||
.padding(PaddingValues(start = TimelineEventTimestampViewDefaults.spacing))
|
||||
.then(modifier),
|
||||
.padding(PaddingValues(start = TimelineEventTimestampViewDefaults.spacing))
|
||||
.then(modifier),
|
||||
verticalAlignment = Alignment.CenterVertically,
|
||||
) {
|
||||
if (isMessageEdited) {
|
||||
|
|
@ -76,11 +74,13 @@ fun TimelineEventTimestampView(
|
|||
contentDescription = stringResource(id = CommonStrings.common_sending_failed),
|
||||
tint = tint,
|
||||
modifier = Modifier
|
||||
.size(15.dp, 18.dp)
|
||||
.clickable(isVerifiedUserSendFailure) {
|
||||
eventSink(TimelineEvents.ComputeVerifiedUserSendFailure(event))
|
||||
}
|
||||
.semantics { hideFromAccessibility() }
|
||||
.size(15.dp, 18.dp)
|
||||
.clickable(
|
||||
enabled = isVerifiedUserSendFailure,
|
||||
onClickLabel = stringResource(CommonStrings.action_open_context_menu),
|
||||
) {
|
||||
eventSink(TimelineEvents.ComputeVerifiedUserSendFailure(event))
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
|
|
@ -89,13 +89,14 @@ fun TimelineEventTimestampView(
|
|||
Spacer(modifier = Modifier.width(2.dp))
|
||||
Icon(
|
||||
imageVector = shield.toIcon(),
|
||||
contentDescription = shield.toText(),
|
||||
contentDescription = stringResource(id = CommonStrings.a11y_encryption_details),
|
||||
modifier = Modifier
|
||||
.size(15.dp)
|
||||
.clickable {
|
||||
.clickable(
|
||||
onClickLabel = stringResource(CommonStrings.a11y_view_details),
|
||||
) {
|
||||
eventSink(TimelineEvents.ShowShieldDialog(shield))
|
||||
}
|
||||
.semantics { hideFromAccessibility() },
|
||||
},
|
||||
tint = shield.toIconColor(),
|
||||
)
|
||||
Spacer(modifier = Modifier.width(4.dp))
|
||||
|
|
|
|||
|
|
@ -140,7 +140,10 @@ internal fun TimelineItemRow(
|
|||
timelineItem.safeSenderName
|
||||
}
|
||||
// For Polls, allow the answers to be traversed by Talkback
|
||||
isTraversalGroup = timelineItem.content is TimelineItemPollContent
|
||||
isTraversalGroup = timelineItem.content is TimelineItemPollContent ||
|
||||
timelineItem.failedToSend ||
|
||||
timelineItem.messageShield != null
|
||||
// TODO Also set to true when the event has link(s)
|
||||
}
|
||||
// Custom clickable that applies over the whole item for accessibility
|
||||
.then(
|
||||
|
|
|
|||
|
|
@ -116,7 +116,7 @@ class TimelineViewTest {
|
|||
eventSink = eventsRecorder,
|
||||
),
|
||||
)
|
||||
val contentDescription = rule.activity.getString(CommonStrings.event_shield_reason_unverified_identity)
|
||||
val contentDescription = rule.activity.getString(CommonStrings.a11y_encryption_details)
|
||||
rule.onNodeWithContentDescription(contentDescription).performClick()
|
||||
eventsRecorder.assertList(
|
||||
listOf(
|
||||
|
|
|
|||
|
|
@ -4,5 +4,6 @@
|
|||
<item quantity="one">"%1$d percent of total votes"</item>
|
||||
<item quantity="other">"%1$d percents of total votes"</item>
|
||||
</plurals>
|
||||
<string name="a11y_polls_will_remove_selection">"Will remove previous selection"</string>
|
||||
<string name="a11y_polls_winning_answer">"This is the winning answer"</string>
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -225,7 +225,10 @@ class ChangeRolesViewTest {
|
|||
)
|
||||
// Unselect the user from the row list
|
||||
val contentDescription = rule.activity.getString(CommonStrings.action_remove)
|
||||
rule.onNodeWithContentDescription(contentDescription).performClick()
|
||||
rule.onNodeWithContentDescription(
|
||||
label = contentDescription,
|
||||
useUnmergedTree = true,
|
||||
).performClick()
|
||||
eventsRecorder.assertList(
|
||||
listOf(
|
||||
ChangeRolesEvent.QueryChanged(""),
|
||||
|
|
@ -248,7 +251,7 @@ class ChangeRolesViewTest {
|
|||
rule.setChangeRolesContent(
|
||||
state = state,
|
||||
)
|
||||
// Select the user from the row list
|
||||
// Select the user from the user list
|
||||
rule.onNodeWithText("Carol").performClick()
|
||||
eventsRecorder.assertList(
|
||||
listOf(
|
||||
|
|
@ -271,8 +274,11 @@ class ChangeRolesViewTest {
|
|||
rule.setChangeRolesContent(
|
||||
state = state,
|
||||
)
|
||||
// Select the user from the rom list
|
||||
rule.onAllNodesWithText("Bob")[1].performClick()
|
||||
// Unselect the user from the user list
|
||||
rule.onAllNodesWithText(
|
||||
text = "Bob",
|
||||
useUnmergedTree = true,
|
||||
)[1].performClick()
|
||||
eventsRecorder.assertList(
|
||||
listOf(
|
||||
ChangeRolesEvent.QueryChanged(""),
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue