diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelineView.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelineView.kt index f6166821b2..6c0dce8cca 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelineView.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelineView.kt @@ -103,7 +103,6 @@ import io.element.android.libraries.testtags.TestTag import io.element.android.libraries.testtags.TestTags import io.element.android.libraries.testtags.testTag import io.element.android.libraries.ui.strings.CommonStrings -import io.element.android.libraries.ui.utils.a11y.isTalkbackActive import io.element.android.wysiwyg.link.Link import kotlinx.collections.immutable.persistentListOf import kotlinx.coroutines.delay @@ -165,9 +164,6 @@ fun TimelineView( val context = LocalContext.current val toastMessage = stringResource(CommonStrings.common_copied_to_clipboard) val view = LocalView.current - // Disable reverse layout when TalkBack is enabled to avoid incorrect ordering issues seen in the current Compose UI version - val useReverseLayout = !isTalkbackActive() - fun inReplyToClick(eventId: EventId) { state.eventSink(TimelineEvent.FocusOnEvent(eventId)) } @@ -195,7 +191,7 @@ fun TimelineView( .nestedScroll(nestedScrollConnection) .testTag(TestTags.timeline), state = lazyListState, - reverseLayout = useReverseLayout, + reverseLayout = true, contentPadding = PaddingValues(top = 64.dp, bottom = 8.dp), ) { items( @@ -255,14 +251,12 @@ fun TimelineView( onFocusOnEvent = ::onFocusOnEvent, ) - if (useReverseLayout) { - FloatingDateBadgeOverlay( - lazyListState = lazyListState, - timelineItems = state.timelineItems, - isLive = state.isLive, - topOffset = floatingDateTopOffset, - ) - } + FloatingDateBadgeOverlay( + lazyListState = lazyListState, + timelineItems = state.timelineItems, + isLive = state.isLive, + topOffset = floatingDateTopOffset, + ) } } diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/FloatingDateBadge.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/FloatingDateBadge.kt index 996bb07b81..5946798a76 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/FloatingDateBadge.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/FloatingDateBadge.kt @@ -27,6 +27,8 @@ import androidx.compose.runtime.setValue import androidx.compose.runtime.snapshotFlow import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.semantics.clearAndSetSemantics +import androidx.compose.ui.semantics.hideFromAccessibility import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import io.element.android.compound.theme.ElementTheme @@ -102,7 +104,10 @@ internal fun BoxScope.FloatingDateBadgeOverlay( visible = showBadge, modifier = Modifier .align(Alignment.TopCenter) - .padding(top = 8.dp + topOffset), + .padding(top = 8.dp + topOffset) + .clearAndSetSemantics { + hideFromAccessibility() + }, enter = fadeIn(animationSpec = tween(150)), exit = fadeOut(animationSpec = tween(300)), ) { diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemGroupedEventsRow.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemGroupedEventsRow.kt index 461b29b472..ed927956df 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemGroupedEventsRow.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemGroupedEventsRow.kt @@ -34,7 +34,6 @@ import io.element.android.libraries.designsystem.preview.PreviewsDayNight import io.element.android.libraries.matrix.api.core.EventId import io.element.android.libraries.matrix.api.timeline.Timeline import io.element.android.libraries.matrix.api.user.MatrixUser -import io.element.android.libraries.ui.utils.a11y.isTalkbackActive import io.element.android.wysiwyg.link.Link @Composable @@ -160,13 +159,7 @@ private fun TimelineItemGroupedEventsRowContent( ) if (isExpanded) { Column { - timelineItem.events.let { - if (isTalkbackActive()) { - it.reversed() - } else { - it - } - }.forEach { subGroupEvent -> + timelineItem.events.forEach { subGroupEvent -> TimelineItemRow( timelineMode = timelineMode, timelineItem = subGroupEvent, diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/receipt/TimelineItemReadReceiptView.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/receipt/TimelineItemReadReceiptView.kt index 3ccf32d422..c9b712eba7 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/receipt/TimelineItemReadReceiptView.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/receipt/TimelineItemReadReceiptView.kt @@ -61,10 +61,7 @@ fun TimelineItemReadReceiptView( ReadReceiptsRow(modifier = modifier) { ReadReceiptsAvatars( receipts = state.receipts, - modifier = Modifier - .clip(RoundedCornerShape(4.dp)) - .clickable(onClick = onReadReceiptsClick) - .padding(2.dp) + onClick = onReadReceiptsClick, ) } } else { @@ -124,7 +121,8 @@ private fun ReadReceiptsRow( @Composable private fun ReadReceiptsAvatars( receipts: ImmutableList, - modifier: Modifier = Modifier + onClick: () -> Unit, + modifier: Modifier = Modifier, ) { val avatarSize = AvatarSize.TimelineReadReceipt.dp val avatarStrokeSize = 1.dp @@ -132,6 +130,12 @@ private fun ReadReceiptsAvatars( val receiptDescription = computeReceiptDescription(receipts) Row( modifier = modifier + .clip(RoundedCornerShape(4.dp)) + .clickable( + onClick = onClick, + onClickLabel = stringResource(id = CommonStrings.a11y_read_receipts_tap_to_show_all_android), + ) + .padding(2.dp) .clearAndSetSemantics { testTag = TestTags.messageReadReceipts.value contentDescription = receiptDescription diff --git a/libraries/ui-strings/src/main/res/values/localazy.xml b/libraries/ui-strings/src/main/res/values/localazy.xml index 4885c38ef3..82acfd14b3 100644 --- a/libraries/ui-strings/src/main/res/values/localazy.xml +++ b/libraries/ui-strings/src/main/res/values/localazy.xml @@ -44,13 +44,14 @@ "QR Code" "React with %1$s" "React with other emojis" - "Read by %1$s and %2$s" + "Previous message read by %1$s and %2$s" - "Read by %1$s and %2$d other" - "Read by %1$s and %2$d others" + "Previous message read by %1$s and %2$d other" + "Previous message read by %1$s and %2$d others" - "Read by %1$s" + "Previous message read by %1$s" "Tap to show all" + "show all read receipts" "Remove reaction: %1$s" "Remove reaction with %1$s" "Room avatar"