Commit Graph

16332 Commits

Author SHA1 Message Date
Benoit Marty 149dedcc03 Store the user profile off the main thread when it is updated by the SDK
Same issue as when refreshing the profile manually: the profile listener stored the profile (Base64 encoding and session database access) from the session coroutine scope, which runs on the main thread.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-12 14:33:16 +02:00
Benoit Marty 404c26c62e Fetch and map the thread list items off the main thread
The thread list subscription was launched in the room coroutine scope, which runs on the main thread, so the initial sync FFI call and the mapping of all the items and diffs were done on the main thread every time a room was opened.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-12 14:33:15 +02:00
Benoit Marty 23a79ad987 Merge pull request #7896 from element-hq/sync-localazy
Sync Strings
2026-10-12 13:56:43 +02:00
Benoit Marty 80578d799f Merge pull request #7882 from element-hq/feature/bma/multiAccountShareAtRoot
Keep the incoming share displayed when the current account is signed out
2026-10-12 11:19:49 +02:00
ElementBot 9beef99760 Update screenshots 2026-10-12 09:07:31 +00:00
bmarty 8100fa6555 Sync Strings from Localazy 2026-10-12 00:37:35 +00:00
Jorge Martin Espinosa f12b9c77d5 Enable global search feature flag (#7890)
Enable the global search feature by default for all variants of the app
2026-10-09 15:24:29 +00:00
Benoit Marty d29e4e5f0c Merge remote-tracking branch 'origin/develop' into feature/bma/multiAccountShareAtRoot
# Conflicts:
#	libraries/roomselect/impl/src/test/kotlin/io/element/android/libraries/roomselect/impl/RoomSelectPresenterTest.kt
2026-10-09 17:11:58 +02:00
Benoit Marty 00dab131dd Ask for session verification before sharing with an unverified account
The incoming share is now displayed on top of the root, so the FTUE, and the session verification in particular, could be bypassed.

- When the current account is not verified, wait for the FTUE to be complete before displaying the incoming share, as before.
- When the user selects another account which is not verified in the room select screen, display the session verification flow of
  the FTUE for this account on top of the share. As in the FTUE, the user has to verify the session or to sign out.
- Expose the FTUE session verification flow with a new SessionVerificationEntryPoint, displayed by OtherSessionVerificationNode
  which sets up the session graph of the account to verify.
- Introduce RoomSelectNavigator so that RoomSelectPresenter can request the verification of the selected session.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-09 17:00:48 +02:00
Benoit Marty 5d498ee37b Merge pull request #7883 from element-hq/feature/bma/roomSelectSearchField
Use a search field to filter the rooms in the room select screen
2026-10-09 15:09:50 +02:00
Benoit Marty 135c10b37f Merge pull request #7886 from element-hq/feature/valere/element_call_rc7
Update element-call-android to 0.1.0-rc.7
2026-10-09 14:45:39 +02:00
Benoit Marty 3ae227946b Merge pull request #7798 from element-hq/renovate/io.element.android-element-call-embedded-0.x
Update dependency io.element.android:element-call-embedded to v0.27.0
2026-10-09 14:39:16 +02:00
Benoit Marty 3b5696d37d Merge pull request #7843 from element-hq/renovate/io.sentry-sentry-android-8.x
Update dependency io.sentry:sentry-android to v8.59.0
2026-10-09 14:38:34 +02:00
Benoit Marty 85224988af Room select: address review remarks
- Scroll the list to the top using a LaunchedEffect instead of recreating the LazyListState on each search query change.
- Use isBlank to check the search query, to match the logic of RoomSelectSearchDataSource.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-09 14:34:45 +02:00
Benoit Marty 10afe7c18c Release room list entries resources even if onControllerCreated is cancelled
Use try/finally instead of the awaitClose block, so that the entries stream, the controller and the
dynamic adapters are destroyed even if the suspending onControllerCreated callback is cancelled or
throws before awaitClose is reached.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-09 14:28:17 +02:00
Benoit Marty 9bb03f7cc4 Merge pull request #7885 from element-hq/feature/bma/selectedItemFocus
Draw the keyboard focus indicator around the whole selected item
2026-10-09 11:44:48 +02:00
Benoit Marty 30a6818b7e Merge pull request #7888 from element-hq/sync-enterprise-submodule
Update enterprise submodule to latest main
2026-10-09 10:59:53 +02:00
Benoit Marty dc8d8c10b9 Merge pull request #7889 from element-hq/feature/bma/syncEnterpriseSubmoduleNoLeak
Do not list private enterprise commit messages in the submodule update PR
2026-10-09 10:47:34 +02:00
Benoit Marty dfccc42326 Do not list enterprise commit messages in the submodule update PR
The enterprise repository is private, so only mention the number of new
commits in the generated PR description.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-09 10:33:22 +02:00
Jorge Martin Espinosa d8a072755f Add edit and redaction send state support (#7840)
* Expose edit/redaction send states and retry/abort send from the Rust SDK

Pending edits and redactions have their own send queue entries, separate
from the original event. Surface them so the UI can reflect and act on them:

- Add `SendTarget` (Event, Edit, Redaction, Reaction) to the matrix API,
  with a mapper to the Rust SDK type.
- Add `editSendState` and `redactionSendState` to `EventTimelineItem` and
  map them from the SDK item.
- Add `Timeline.retrySend` / `Timeline.abortSend`, which take a `SendTarget`
  so the right queued request is retried or removed. Implement them in
  `RustTimeline` and in `FakeTimeline`.

* Track edit and redaction send states on timeline events

`TimelineItem.Event` now carries `editSendState` and `redactionSendState`
next to `localSendState`.

- `failedToSend` is true when any of the three states is failed, so a
  failed edit or redaction is shown like a failed message.
- `pendingSend()` returns the first pending state together with its
  `SendTarget`; the read receipt row, the send failure dialog and the
  timeline presenter use it instead of reading `localSendState` directly.
- `TimelineItemReadReceiptView` is restructured so the row is only
  rendered when there is something to show, and the send state takes
  precedence over read receipts.
- Update the previews provider and test fixtures for the new fields, and
  make `aMessageEvent`'s send state nullable.

* Retry and remove failed sends through the timeline

Retrying or removing a failed message used the event's `SendHandle`, which
only knows about the original send. Route both through the timeline with
the `SendTarget` of the pending request instead:

- `TimelineController` gains `retrySend` (which also re-enables the send
  queue) and `abortSend`, acting on the current timeline.
- `MessagesPresenter` retries via `retrySend`, and does nothing when the
  event has no pending send state.
- Redacting something that was never sent (no event ID) or a pending
  edit/redaction now aborts the queued request rather than sending a
  redaction, and no confirmation is asked for.
- Update the presenter tests accordingly.

* Log send queue errors

Log when the SDK reports a send queue error for a room, and when the
send queue is disabled, to help diagnose messages stuck in the queue.

* Make sure we display send queue errors before verification states

* Fix logic for displaying read receipts and add more screenshot tests

* Only use states with read receipts in `ReadReceiptBottomSheetStatePreviewParam`

* Handle `LocalEventSendState = null` state just like `LocalEventSendState.Sent`

* Add `TimelineItemAction.AbortSend` and use it for both:
  1. Aborting sending a message/edit/redaction from the 'sending failed' dialog.
  2. Abort sending a local message when selected from the timeline -> redact action.

* Update screenshots

---------

Co-authored-by: ElementBot <android@element.io>
2026-10-09 10:30:52 +02:00
github-actions[bot] 90d5e3b617 Update enterprise submodule to latest main
Update to 5c06c0f1e4fa12bf36f73cb8b4ea9018a4dece20
2026-10-09 08:30:21 +00:00
Benoit Marty 748669eaff Merge pull request #7887 from element-hq/feature/bma/syncEnterpriseSubmodule
Add a workflow to keep the enterprise submodule on the latest main commit
2026-10-09 10:29:35 +02:00
Benoit Marty 76c1d9a4d2 Add workflow to keep the enterprise submodule on the latest main
When a PR is merged on develop with the enterprise submodule targeting a commit
which is not on the enterprise main branch, open a PR to update it to the latest
commit of main. The workflow also runs daily and manually to keep the submodule
up to date.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-09 09:54:54 +02:00
Valere 1c6d9971f5 Update element-call-android to 0.1.0-rc.7 2026-10-09 09:45:57 +02:00
Benoit Marty a7ed73c225 Merge pull request #7853 from element-hq/mxandreas/disable-public-rooms
Add ability to disable public rooms/spaces when necessary
2026-10-09 09:40:18 +02:00
Benoit Marty 5cfbfc4746 Merge pull request #7874 from element-hq/renovate/net.zetetic-sqlcipher-android-4.x
Update dependency net.zetetic:sqlcipher-android to v4.19.1
2026-10-09 09:35:09 +02:00
Benoit Marty b62999d4c0 Draw the focus indicator around the whole SelectedItem
Previously, only the small remove button could get the keyboard focus, and the
focus ring was barely visible. Now the whole item is focusable, the focus ring is
drawn around it, and pressing an activation key (Enter, Space, D-pad center)
removes the item. Touch behavior is unchanged: only the remove button is clickable.

Also add a shared `activationKeys` set in the designsystem module.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-09 09:31:15 +02:00
ElementBot 2f7e2316e1 Update screenshots 2026-10-09 07:23:33 +00:00
Benoit Marty 9429bd9420 Clean up 2026-10-09 09:04:41 +02:00
Benoit Marty 2177a62ff1 Apply the room list filter requested before the controller is created
The dynamic entries controller of a room list is created asynchronously, once
the entries are observed. Filters set before that were silently dropped, so for
instance the search query was not applied to the rooms of a newly selected
account in the room select screen.

RustDynamicRoomList now owns the controller, remembers the last requested filter,
and applies it when the controller is created if it differs from the initial one.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-09 09:00:48 +02:00
Benoit Marty 0c6da39acb Room select: update empty search UI and behavior. 2026-10-09 09:00:47 +02:00
Benoit Marty 59bc387c7d Replace the SearchBar by a SearchField in the room select screen
The room select screen was using a SearchBar, with an active mode displaying the search results instead of the room
list. Use a SearchField instead, displayed above the room list, which filters the rooms directly. The account switch
section and the selected rooms are now also displayed while searching.

- Remove isSearchActive from the state, and the ToggleSearchActive event.
- The "No results" message is displayed when the query is not blank and no room matches it.
- The back button now always closes the screen.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-09 09:00:46 +02:00
mxandreas 13a5c5ce1d Merge remote-tracking branch 'origin/develop' into mxandreas/disable-public-rooms
# Conflicts:
#	enterprise
2026-10-09 09:58:27 +03:00
mxandreas 118b5448ac Revert to the SessionEnterpriseService approach 2026-10-09 09:50:14 +03:00
renovate[bot] 6cb8a85539 Update maplibre.compose to v0.19.0 (#7884)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-10-09 08:43:49 +02:00
Jorge Martin Espinosa 1564de9b6e Iterate on unread counts again (#7869)
* Fix timestamp color to match the designs.

* Don't limit the call and unread row height to 16dp: the font size is not fixed and it might display components in a broken state

* Ensure the alignment works

* Remove `SemanticColors.unreadIndicator` and use `.iconAccentPrimary` and `.textActionAccent` instead

* Simplify and document `UnreadIndicatorAtom`

* Use `fontBodySmMedium` for the font size in the unread indicator

* Update screenshots

---------

Co-authored-by: ElementBot <android@element.io>
2026-10-09 08:30:43 +02:00
ganfra 367cea0213 Merge pull request #7864 from element-hq/feature/fga/timeline-multi-forward
Initial implementation of timeline multi forward
2026-10-08 18:45:35 +02:00
ElementBot a53bf586e9 Update screenshots 2026-10-08 16:04:27 +00:00
renovate[bot] fe419890a5 Update dependency io.sentry:sentry-android to v8.59.0 2026-10-08 15:45:14 +00:00
ganfra c4173ae185 Fix the row selection documentation about sliding content 2026-10-08 17:42:08 +02:00
ganfra 512bab05a6 Merge branch 'develop' into feature/fga/timeline-multi-forward 2026-10-08 17:38:14 +02:00
ganfra d8c8384c26 Merge pull request #7879 from element-hq/gradlew-update-9.8.1
Update Gradle Wrapper from 9.8.0 to 9.8.1
2026-10-08 12:19:11 +02:00
Benoit Marty 51515a8fac Merge pull request #7881 from element-hq/feature/bma/fixRoomSelectScroll
Fix room list not scrollable in the room select screen when there is a single account
2026-10-08 10:20:43 +02:00
Benoit Marty 9bc7e751c4 Keep the incoming share displayed when the current account is signed out
The incoming share was displayed in the logged in flow of the current
session, so it was destroyed when the current session was signed out, for
instance from another device. When another session was signed out, the room
select screen was kept and displayed an error if this session was selected.

To make the behavior consistent:
- The incoming share is now displayed by the RootFlowNode, on top of the
  logged in flow, and does not depend on a session anymore. The latest used
  session is passed from the RootFlowNode to the room select screen, through the
  share flow, and is used as its initial session.
- When the root of the RootFlowNode backstack changes while an incoming share
  is displayed, the new root is set below the incoming share, using the new
  replaceRoot backstack operation, instead of removing all the elements.
- The room select screen handles the invalidation of the current session like
  for any other session.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-08 09:45:57 +02:00
Benoit Marty 920e37d097 Scroll the rooms header with the search results in room select screen
Move the "Rooms" section header inside the LazyColumn of the search results, so that it scrolls with the list
instead of staying fixed above it, as it is done for the room list when the search is not active.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-08 09:41:05 +02:00
Benoit Marty 7ad1277faf Fix room list not scrollable in room select screen when the account switch is hidden
The nested scroll connection of the account switch section was always attached. When the section is not displayed
(single account, Forward mode, or search active), its height offset limit is never set and stays at -Float.MAX_VALUE,
so the connection consumed all the scroll events and the room list could not be scrolled.

Only attach the connection when the account switch section is displayed.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-08 09:32:39 +02:00
gradle-update-robot c793735511 Update Gradle Wrapper from 9.8.0 to 9.8.1
Signed-off-by: gradle-update-robot <gradle-update-robot@regolo.cc>
2026-10-08 00:48:16 +00:00
Benoit Marty 48fc09a7c3 Merge pull request #7839 from element-hq/feature/bma/multiAccountShare
Multi account: switch account from the room select screen when sharing
2026-10-07 18:01:48 +02:00
Benoit Marty 3a93e8089e Get the media optimization config only once when sharing media
The config is the same for all the files and all the rooms, so there is no need to read it for each file.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-07 17:06:42 +02:00
ElementBot 4dfb35206e Update screenshots 2026-10-07 16:05:23 +02:00