The LazyColumn was using reverseLayout=false when TalkBack was active to work
around a Compose accessibility traversal bug. This placed new messages at the
top of the screen, distorting the reading order for TalkBack users.
With Compose BOM 2026.06.00, reverseLayout=true now works correctly with
TalkBack traversal, so remove both workarounds:
- Always use reverseLayout=true in TimelineView
- Remove the .reversed() for expanded groups in TimelineItemGroupedEventsRow
Note: this change should be manually tested with TalkBack to verify correct
traversal order (oldest messages first, newest last).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Set contentDescription on the ExoPlayer PlayerView so TalkBack announces
the video preview to screen reader users instead of treating it as
decorative/invisible content.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- MarkdownTextInput: set contentDescription on MarkdownEditText so TalkBack
announces a persistent label even when the field has content (fixes#6390)
- TimelineItemReadReceiptView: remove hideFromAccessibility() so the 'Seen by'
button is exposed to TalkBack; use semantics (not clearAndSetSemantics) to
preserve click action, and add Role.Button (fixes#6393)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* Add read all messages feature: read all messages using Client.markAllRoomsAsRead() method
* Move the 'mark all rooms as read' footer as part of the list item
* Replace `showMarkAllRoomsAsReadConfirmation` and its associated event with `MarkAllRoomsAsRead(val needsConfirmation: Boolean)` and a `AsyncAction.Confirming` state
---------
Co-authored-by: Jorge Martín <jorgem@element.io>
* Add `TextDirection.detect` to check the overall LTR or RTL direction of texts
* Calculate if the contents of events have a different direction than the layout to reverse the layout direction if needed.
LTR content, RTL text -> mismatched direction, reverse.
RTL content, LTR text -> also mismatched, reversed too.
* Measure text in `measureLastTextLine` based on its direction, not the layout's,
to avoid some issues with incorrectly calculated free space.
* Tweak the paddings in `TimelineEventTimestampView` a bit if the layout and text directions don't match
* Update screenshots
---------
Co-authored-by: ElementBot <android@element.io>
Changing the SDK version using `@Config` to one supported by `ShadowNativeHardwareRenderer` (it has a `maxSdk` of `UPSIDE_DOWN_CAKE`) seems like fixed the issue.
- Use `uniffi.ruma_events` types for `MessageLikeEventType` and `StateEventType`.
- Fix tests: using those 2 classes can sometimes call the SDK under the hood, trying to load the native library. We ignore the tests that cause it for now.
* Update dependency com.google.firebase:firebase-bom to v34.15.0
* Replace deprecated FCM `token` usages with `installationId`
Renamed a few components, changed the behaviour of `FirebaseTokenRotator` so it doesn't save the new token, `FirebaseMessagingService` will do it in its `onRegistered` method
* Enable firebase messaging installation_id
* Make sure we delete the FID when unregistering the app from Firebase
* Add `runFirebaseTask` util to convert `Task<T>` into a `Result<T>` returned from a suspending function
Also, rename the use cases and make them use the `invoke` pattern
---------
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Jorge Martín <jorgem@element.io>
Co-authored-by: Benoit Marty <benoit@matrix.org>
This operation is not done by Android by default and doesn't properly support CRLs (Certificate Revocation Lists) which can be a problem with CAs like Let's Encrypt.
`rustls-platform-verifier` automatically checks the user certs too, so there's no need to provide them separately.
This should also improve start times since we don't need to load the user certs when starting the app, which was a really slow operation.