Commit Graph

16303 Commits

Author SHA1 Message Date
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
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
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
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
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 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
Benoit Marty 54b1a909bc Display an error in the room select screen if the selected account has an invalid token
All the accounts are proposed in the account switch, even the ones with an
invalid token, so that the user can still see them. If the selected account
has an invalid token, or is invalidated while the screen is displayed (for
instance signed out from another device), the error is displayed instead of
the room list, the selected rooms are cleared, and the client of this account
is not used anymore.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-07 16:01:14 +02:00
Benoit Marty 3c4632ee9d Render an error in the room select screen if the rooms cannot be loaded
If the client of the selected account cannot be restored, the room list was
never loaded and there was no feedback to the user.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-07 15:50:11 +02:00
Benoit Marty 6f1033ee67 RoomSelectView: improve scroll behavior
Ref: https://www.figma.com/design/kEAcfun9iSpszeUDvdKZ6b/ER-351--Multi-account-in-EX?node-id=195-40292
2026-10-07 15:50:10 +02:00
Benoit Marty 30b71cf90b Use derivedStateOf for selectedAccount too 2026-10-07 15:50:09 +02:00
Benoit Marty 3c212ae9a3 Move SessionGraphFactory back to the appnav module
The share feature does not need it anymore, so there is no reason to expose it
in the matrix api module.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-07 15:50:09 +02:00
Benoit Marty 72e3a7d92b Introduce ShareDataSender so that SharePresenter is not session scoped
Instead of creating a SharePresenter from the graph of another session, the
SharePresenter now gets the client of the selected session from the
MatrixClientProvider and uses an AppScope ShareDataSender to send the data.

To be able to send media from AppScope, MediaSenderRoomFactory is now bound in
AppScope and takes the MatrixClient as a parameter, and a new
MediaOptimizationConfigProviderFactory provides the media optimization config
of any session.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-07 15:50:08 +02:00
Benoit Marty ed2a553736 Fix flaky test. 2026-10-07 15:50:07 +02:00
ElementBot 15f7afc7c5 Update screenshots 2026-10-07 15:50:07 +02:00
Benoit Marty 792e0adde3 Let the user switch account from the room select screen when sharing
When several accounts are signed in, sharing into the app no longer goes through the account selection screen. The room select screen (Share mode) now displays the selected account and an account switch on top of the room list, with a design similar to the multi account section of the settings.

Selecting another account displays the rooms of this account in place, scrolled to the top, without recreating the screen. The content is then shared from the room select screen using the selected account, with the same progress and error dialogs as when sharing with the current account. The current account is switched only once the share has succeeded, then the room is opened if the content has been shared to a single room.

Implementation:
- RoomSelectNode is now in the AppScope and uses MatrixClientProvider to get the room list of the selected session.
- ShareNode gets the SharePresenter of the selected session from its session graph, using the new ShareBindings.
- SessionGraphFactory is moved to the matrix api module so that it can be used by features.

The account selection screen is still used for permalinks.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-07 15:50:06 +02:00
Benoit Marty dc031dd0e6 Move SessionData.toMatrixUser() extension to a common place, then use it across the codebase. 2026-10-07 15:50:05 +02:00
Benoit Marty def8f7f348 Merge pull request #7877 from element-hq/bugfix/bma/sessionDelegatePerClient
Fix the wrong account being signed out when the session of another account is revoked
2026-10-07 15:29:35 +02:00
Jorge Martin Espinosa a9d7e7e5ab Fix multi-line split inline code background drawing (#7875)
In the new timeline renderer, the line end position is sometimes incorrectly returned when you pass the offset of the last character in the line, returning `0.0f`.

This caused the shape to draw for the line to be reversed, where the start was `0.0f` and the end was the actual start.

When we detect a `0.0f` returned value for this,  just get the coordinates for the end of the line instead.
2026-10-07 15:10:19 +02:00
Benoit Marty 6e810f2ffd Use one RustClientSessionDelegate per client, so that an auth error only affects the session it belongs to
The RustMatrixClientFactory was using a single RustClientSessionDelegate for
all the clients. The delegate keeps a reference to the last bound client only,
and didReceiveAuthError does not tell which session is concerned. With several
accounts, when the session of one account was revoked, the session of the last
restored account was invalidated and its local data deleted instead, while the
revoked session kept on syncing with an invalid token. Also the isLoggingOut
flag was never reset, so any later auth error was ignored.

The clients which are not associated to a stored session (temporary clients
and clients used to perform a login) now use a NoOpClientSessionDelegate.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-07 14:26:47 +02:00
Jorge Martin Espinosa 3fe0e09e3c Add global search backfill worker (#7860)
* Add search backfill worker

This will run on background at most once an hour while the device has internet connectivity and the device is charging and start back-paginating through the user's rooms to make sure the search results are populated.

It'll run for the maximum time the default workers allow, 10 minutes.

* Create `RustMatrixClient.Factory` AssistedFactory to help with DI and add `SearchBackfillService`

* Start search backfill when entering the search screen, just once. This should help getting initial search results if none or few are found at first
2026-10-07 10:41:19 +00:00
ganfra 5631a91e28 Update the multi-select feature flag description 2026-10-07 12:25:43 +02:00
ElementBot 9805422a8a Update Matrix Rust SDK to 26.10.05-nightly (#7844)
* Update Matrix Rust SDK to 26.10.01-nightly

* Add ivy repository for nightly SDK binding versions

* Fix API breaks

* Make sure we can't release a version with a `-nightly` SDK version

* Fix typo

Co-authored-by: Benoit Marty <benoitm@element.io>

* Update Matrix Rust SDK to 26.10.05-nightly

---------

Co-authored-by: github-actions <github-actions@github.com>
Co-authored-by: Jorge Martín <jorgem@element.io>
Co-authored-by: Benoit Marty <benoitm@element.io>
2026-10-07 11:13:36 +02:00
Jorge Martin Espinosa 3944cb3bfc Fix toggling 'show all activity in room list' not working (#7871)
Toggling this value had no effect because the feature was marked as finished so it wouldn't be displayed in the developer settings, which makes our code ignore any user-set value for it.

Instead, just create a `Feature` outside the `FeatureFlags` enum.
2026-10-07 10:09:25 +02:00
renovate[bot] 03ea0ecc27 Update dependency com.google.guava:guava to v33.7.2-android (#7873)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-10-07 08:47:00 +02:00
renovate[bot] add7099e44 Update dependency net.zetetic:sqlcipher-android to v4.19.1 2026-10-07 00:30:51 +00:00
ganfra f10d0caad3 Merge pull request #7804 from element-hq/renovate/com.github.matrix-org-matrix-analytics-events-0.x
Update dependency com.github.matrix-org:matrix-analytics-events to v0.38.0
2026-10-06 18:35:36 +02:00
ganfra 7a6aef11ad Merge branch 'develop' into renovate/com.github.matrix-org-matrix-analytics-events-0.x 2026-10-06 17:34:34 +02:00
ganfra 47d9791a81 Merge pull request #7833 from element-hq/renovate/androidx.webkit-webkit-1.x
Update dependency androidx.webkit:webkit to v1.17.1
2026-10-06 17:30:32 +02:00
ganfra c7f5024729 Merge pull request #7868 from element-hq/renovate/gradle-actions-6.x
Update gradle/actions action to v6.4.0
2026-10-06 17:29:18 +02:00
ganfra 996e778222 Merge pull request #7845 from element-hq/renovate/maplibre.compose
Update maplibre.compose to v0.18.0
2026-10-06 16:23:45 +02:00
ganfra 604c5438c6 Adapt location feature to maplibre.compose 0.18.0 API 2026-10-06 15:45:40 +02:00
ganfra 2cda8a0315 Merge pull request #7851 from element-hq/sync-localazy
Sync Strings
2026-10-06 13:30:00 +02:00
Benoit Marty ac2b76de61 Merge pull request #7859 from element-hq/feature/bma/fixPackageNames2
Fix remaining package names and namespaces not matching their module
2026-10-06 13:13:39 +02:00
Benoit Marty 08a0885cfc Merge pull request #7821 from element-hq/bma/removeUnusedDependencies
Remove unused Gradle dependencies
2026-10-06 12:23:32 +02:00