Picking an attachment reset the composer to Normal, which dropped an
in-progress edit: the attachment went out as a new message and the
leftover edit text then created another one instead of editing the
original.
Route every attach path through a single resetComposerModeAfterAttaching()
helper that clears Reply/Normal but keeps an edit pending, so the typed
text still edits the original on the next send. This also covers the
multi-item gallery picker added in #6519, which reset the mode
unconditionally.
Reply is still cleared (the attachment becomes the reply).
Fixes#7083.
* Create a `ContentScanner` component:
- Add `:features:contentscanner:api` module with the interface.
- Implement the concrete component using the Rust SDK in `:libraries:matrix:impl`.
This can be used to both set up the content scanner media fetching in the SDK Client and manually scanning media sources from the Android side
* Create `ContentScannerUrlProvider` in a new `:features:contentscaner:api` module as a noop implementation
Use it as a placeholder for the code to instantiate a `RustContentScanner` with the fetched URL and set it as part of the SDK client.
* Expose the optional `ContentScanner` in the `@SessionScope`
* Split the storage part of the Element well-known retriever so it can be reused for the non-session bound retriever.
Also add the new `content_scanner_url` field to it.
This will be used by the enterprise code to fetch the actual content scanner url.
* Bump enterprise commit to have access to the actual content scanner url provider implementation
* Fix tests and lint issues
* Use the right namespace for `:features:contentscanner:api`, also use the right namespace for `impl`
---------
Co-authored-by: Benoit Marty <benoitm@element.io>
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>