@@ -27,6 +27,7 @@ import androidx.compose.foundation.lazy.items
27
27
import androidx.compose.foundation.lazy.rememberLazyListState
28
28
import androidx.compose.foundation.pager.HorizontalPager
29
29
import androidx.compose.foundation.pager.rememberPagerState
30
+ import androidx.compose.foundation.selection.selectable
30
31
import androidx.compose.foundation.shape.CornerSize
31
32
import androidx.compose.foundation.shape.RoundedCornerShape
32
33
import androidx.compose.material3.ExperimentalMaterial3Api
@@ -45,12 +46,17 @@ import androidx.compose.ui.Alignment
45
46
import androidx.compose.ui.Modifier
46
47
import androidx.compose.ui.draw.clip
47
48
import androidx.compose.ui.graphics.Color
49
+ import androidx.compose.ui.semantics.Role
50
+ import androidx.compose.ui.semantics.clearAndSetSemantics
51
+ import androidx.compose.ui.semantics.contentDescription
52
+ import androidx.compose.ui.semantics.semantics
48
53
import androidx.compose.ui.text.style.TextOverflow
49
54
import androidx.compose.ui.tooling.preview.PreviewParameter
50
55
import androidx.compose.ui.unit.dp
51
56
import androidx.compose.ui.unit.sp
52
57
import coil3.compose.AsyncImage
53
58
import io.element.android.compound.theme.ElementTheme
59
+ import io.element.android.features.messages.impl.timeline.a11y.a11yReactionDetails
54
60
import io.element.android.features.messages.impl.timeline.components.REACTION_IMAGE_ASPECT_RATIO
55
61
import io.element.android.features.messages.impl.timeline.model.AggregatedReaction
56
62
import io.element.android.libraries.designsystem.components.avatar.Avatar
@@ -140,9 +146,7 @@ private fun ReactionSummaryViewContent(
140
146
HorizontalPager (state = pagerState) { page ->
141
147
LazyColumn (modifier = Modifier .fillMaxHeight()) {
142
148
items(summary.reactions[page].senders) { sender ->
143
-
144
149
val user = sender.user ? : MatrixUser (userId = sender.senderId)
145
-
146
150
SenderRow (
147
151
avatarData = user.getAvatarData(AvatarSize .UserListItem ),
148
152
name = user.displayName ? : user.userId.value,
@@ -166,21 +170,32 @@ private fun AggregatedReactionButton(
166
170
} else {
167
171
Color .Transparent
168
172
}
169
-
170
173
val textColor = if (isHighlighted) {
171
174
MaterialTheme .colorScheme.inversePrimary
172
175
} else {
173
176
ElementTheme .colors.textPrimary
174
177
}
175
-
176
178
val roundedCornerShape = RoundedCornerShape (corner = CornerSize (percent = 50 ))
179
+ val a11yText = a11yReactionDetails(
180
+ emoji = reaction.key,
181
+ userAlreadyReacted = reaction.isHighlighted,
182
+ reactionCount = reaction.count,
183
+ )
177
184
Surface (
178
185
modifier = Modifier
179
186
.background(buttonColor, roundedCornerShape)
180
187
.clip(roundedCornerShape)
181
188
.clickable(onClick = onClick)
182
- .padding(vertical = 8 .dp, horizontal = 12 .dp),
183
- color = buttonColor
189
+ .padding(vertical = 8 .dp, horizontal = 12 .dp)
190
+ .selectable(
191
+ selected = isHighlighted,
192
+ role = Role .Tab ,
193
+ onClick = onClick,
194
+ )
195
+ .clearAndSetSemantics {
196
+ contentDescription = a11yText
197
+ },
198
+ color = buttonColor,
184
199
) {
185
200
Row (
186
201
verticalAlignment = Alignment .CenterVertically ,
@@ -230,7 +245,8 @@ private fun SenderRow(
230
245
modifier = Modifier
231
246
.fillMaxWidth()
232
247
.heightIn(min = 56 .dp)
233
- .padding(start = 16 .dp, top = 4 .dp, end = 16 .dp, bottom = 4 .dp),
248
+ .padding(start = 16 .dp, top = 4 .dp, end = 16 .dp, bottom = 4 .dp)
249
+ .semantics(mergeDescendants = true ) {},
234
250
verticalAlignment = Alignment .CenterVertically
235
251
) {
236
252
Avatar (avatarData)
0 commit comments