Commit Graph

5944 Commits

Author SHA1 Message Date
ganfra 4563a30795 Merge branch 'develop' into feature/fga/timeline-multi-forward 2026-09-29 20:57:37 +02:00
ganfra 62f9b7f0b4 Use "Forward to" as forward screen title 2026-09-29 20:53:51 +02:00
Valere 43a1364671 Give the native call component its view of Matrix
The factory lives in libraries/matrix/impl because that is the only module compiled against the Rust SDK, and is app-scoped because a call is started for whichever account it belongs to rather than the one on screen.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-29 18:44:49 +02:00
Valere 66d6d365d7 Route calls through an entry point the native stack can implement
Adds the seam a native MatrixRTC call stack plugs into, with nothing behind it
yet, so that the stack itself lands as a self-contained change.

`FeatureFlags.NativeCall` is off by default and unfinished.
`features/callnative/api` declares `NativeCallEntryPoint`, and
`features/callnative/impl` provides a default that logs and does nothing:
turning the flag on today gets no call and a line in the log. That is the
honest outcome, where falling back to the WebView would make the flag look
broken rather than unimplemented.

`DefaultElementCallEntryPoint` forks on the flag. The read is asynchronous
because the flag is storage-backed, and caching it in an eagerly started
StateFlow would race a call placed just after app start onto the default
value.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-29 18:44:49 +02:00
Jorge Martín 6c9d501009 Merge branch 'hotfix/26.09.4' into develop 2026-09-29 18:31:14 +02:00
ganfra 193a5b1dbc Merge branch 'develop' into feature/fga/timeline-multi-forward 2026-09-29 17:15:40 +02:00
Jorge Martín a30730462b Revert "Fix unread notification count in room list (#7749)"
This reverts commit b80a24e0aa.
2026-09-29 16:31:01 +02:00
Jorge Martin Espinosa 03fd288c47 Upgrade to rustls-platform-verifier:0.2.0 (#7791)
* Upgrade to `rustls-platform-verifier:0.2.0`.

This re-enables certificate revocation checks, but v0.2.0 contains a list of CRL servers that can be accessed using clear text requests to check the validity of certain certificates, which should fix the issue that prevented us from using certificate revocation and at the same time strengthening the security of the client app.

Since we already had some network configuration in Element X, and `network_security_config.xml` files can't be merged, what we can do is manually download and merge the XML contents using `tools/dependencies/update_rustls_platform_verifier.py` like this:

```sh
./update_rustls_platform_verifier.py 0.2.0
```

It will automatically bump the Gradle dependency and merge the security config entries.

* Bump SDK bindings to `v26.09.28`, containing the rustls bump on the SDK side

* Fix unused resources caused by `app/src/main/res/xml/network_security_config_element.xml`
2026-09-28 15:35:33 +00:00
Jorge Martin Espinosa 0f98c5c0e0 Migrate SqliteStoreBuilder.passphrase usage to use highEntropyPassphrase (#7802)
* Migrate `SqliteStoreBuilder.passphrase` usage to use `highEntropyPassphrase`

This is the first step in migrating existing sessions from using a passphrase that needs key derivation, slowing down opening SDK DBs to just a raw key using the already random keys of the 'passphrase'

* Remove no longer necessary `keyOfSize` extension function
2026-09-28 17:32:42 +02:00
Benoit Marty 6d717ff745 Merge pull request #7793 from element-hq/feature/bma/storeUserAvatar
Display the avatar of other accounts even if it cannot be loaded from the current account
2026-09-28 12:43:03 +02:00
Benoit Marty c2a2e16f46 Use the stored avatar thumbnail as a fallback for other accounts
Add an optional thumbnail to `MatrixUser` and `AvatarData`, filled from the session
database for the other accounts in the room list header, the settings and the account
selection screen. `ImageAvatar` renders this thumbnail instead of the initial letter while
the avatar is loading or when it fails to load, for instance when the homeserver of the
current account is not federated with the one of the other account.

Fixes #5571

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-28 11:38:45 +02:00
ElementBot c8c242476b Sync Strings (#7787)
* Sync Strings from Localazy

* Update screenshots

---------

Co-authored-by: bmarty <3940906+bmarty@users.noreply.github.com>
2026-09-28 11:32:40 +02:00
Benoit Marty db23023eda Store the user avatar thumbnail in the session database
Add a `userAvatarData` column to the session database, containing the base64 encoded
thumbnail of the user avatar. It will allow rendering the avatar of an account without
having to use its Matrix client, for instance on the signed out screen, or for other
accounts when the homeservers are not federated.

The thumbnail is downloaded when the user profile is retrieved or updated, and only if
the avatar URL has changed. The profile is now also persisted when received from the
own profile subscription.

Part of #5571

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-28 11:12:47 +02:00
Jorge Martin Espinosa 4bf2a094c7 Fix some issues in the new timeline renderer (#7751)
* Don't show fading edge if the code block can't scroll. Use `canScrollForward || canScrollBackwards` for displaying the fading edges in the code blocks

* Don't add extra vertical padding to the mention pills. This should make them look like they did in the previous renderer

* Allow passing through touch events in `Modifier.linkTapHandler` if no url annotation is clicked or long clicked

`detectTapGestures` always consumes the touch events, no matter if they are handled or not, blocking these events from reaching parent components. Should fix the issue of `ParagraphView` blocking the long press action in the message bubbles

* Update screenshots

---------

Co-authored-by: ElementBot <android@element.io>
2026-09-26 13:02:56 +02:00
ganfra 93831ffcbc Forward several events at once 2026-09-25 18:47:17 +02:00
Jorge Martin Espinosa 306e1cb950 Upgrade SDK bindings to v26.09.26 (#7780)
* Bump SDK bindings to `v26.09.26`

This version contains a fix for issues in `v26.09.25` related to certificate verification.

* Fix breaking API changes in the latest bindings

* Unify `FeatureFlags.RoomThreadList` with `FeatureFlags.Threads`
2026-09-25 16:08:19 +02:00
Benoit Marty 7e5866a2b7 Merge branch 'develop' into bma/settingsIterationStep2Bis 2026-09-25 09:36:00 +02:00
Jorge Martin Espinosa b80a24e0aa Fix unread notification count in room list (#7749)
* Display the unread notification count only when needed

* Adjust `CounterAtom` and `UnreadIndicatorAtom` to use the official M3's `Badge` component, with a few tweaks to ensure single digit items are always displayed as a circle

* +99 is now 99+

* Update screenshots

---------

Co-authored-by: ElementBot <android@element.io>
2026-09-24 18:01:12 +02:00
Benoit Marty c612c80b1d Merge account settings into the root preference view. 2026-09-23 16:03:15 +02:00
Jorge Martin Espinosa b6cf293e2a Add headers (h1-h6) tag support for the new timeline renderer (#7754)
* Add headers (`h1-h6`) tag support for the new timeline renderer

* Make H1 and H2 use the same (smaller) style

* Update screenshots

---------

Co-authored-by: ElementBot <android@element.io>
2026-09-23 12:35:05 +00:00
Benoit Marty 60000bfa58 Merge pull request #7692 from element-hq/bma/fix7689
Fix blank screen at launch when the homeserver expires the sliding sync session
2026-09-23 12:32:00 +02:00
Jorge Martin Espinosa 8b1b5560d9 Add recent search results to global search (#7742)
* Add global search results history: keep the latest 25 items used in the global search, save them to an encrypted file store.

* Integrate the search history in the global search feature

* Add `MatrixClient.getRoomInfo` and use it in `GlobalSearchPresenter`

---------

Co-authored-by: ElementBot <android@element.io>
2026-09-22 15:17:57 +00:00
Benoit Marty ac54596ca3 Update Maestro tests 2026-09-22 16:43:58 +02:00
Jorge Martin Espinosa 51fe66cd88 Add linkification to the new timeline renderer (#7731)
* Add linkification to the new timeline renderer

Reuse `AnnotatedString.linkify` for now, even though it creates `Spannable` instances for that: it's the closest one to what we already had.

Also, make sure we use the same URL annotation identifier in the renderer and the linkificator.

* Update screenshots

---------

Co-authored-by: ElementBot <android@element.io>
2026-09-22 15:29:20 +02:00
Benoit Marty e688b174fa Merge branch 'develop' into bma/settingsIterationStep2Bis 2026-09-22 14:47:40 +02:00
Benoit Marty 9b3d4c7c27 Merge pull request #7736 from element-hq/sync-localazy
Sync Strings
2026-09-22 14:45:58 +02:00
Benoit Marty 9b2577f1dd Split settings: app settings / account settings 2026-09-22 13:17:16 +02:00
Jorge Martin Espinosa 4e47c6170e Integrate the new timeline renderer behind a feature flag (#7722)
* Integrate the new renderer with the timeline UI

* Composable functions are now in `:libraries:htmlrenderer:api` so we don't need to add `impl` to other modules.

* Improve inline code span

* Return both the text and URL in `onLinkClick` and `onLinkLongClick` so we can check the URL is not misleading

* Remove `SelectionContainer` for now - it creates issues when long pressing

* Make `LocalComposeTimelineEventRenderer` contain a `ComposeLocalTimelineEventRendererData` instance. This checks if the new rendering is enabled and what is the current user id so it can be used for styling mention pills

* Add fading edges to code block to indicate scrolling is possible

* Long pressing in a code block copies its contents to the clipboard

* Fix alignment of ordered list item prefixes

* Don't use default values in State data classes

---------

Co-authored-by: ElementBot <android@element.io>
2026-09-22 10:26:35 +02:00
Benoit Marty 0ea76ecebf Merge pull request #7741 from element-hq/bma/settingsIterationStep1
Settings iteration: move user status and update multi-account section
2026-09-21 15:54:11 +02:00
Jorge Martin Espinosa 3c3e8f8f6f Start sync manually after completing the auth flow (#7734)
Do it before we wait for the known verification state so we can receive updates from the encryption sliding sync flow.
2026-09-21 14:34:34 +02:00
Jorge Martin Espinosa c4529b87b4 Remove Roborazzi, use Paparazzi for Compound (#7735)
* Remove Roborazzi, use Paparazzi for Compound

The new screenshots will be recorded with the rest of the Paparazzi ones. Note the names changed, since Paparazzi enforces a `$packagename.$testname.$name.$extension` format

* Set a max width value for color previews

* Merge the `verifyPaparazziDebug` CI steps

* Update screenshots

---------

Co-authored-by: ElementBot <android@element.io>
2026-09-21 12:27:56 +02:00
Benoit Marty 95d734efc9 Merge pull request #7705 from element-hq/bma/fixLeak
Close the threaded timelines created to create a poll, share a location or send media
2026-09-21 10:18:37 +02:00
bmarty d1e0544102 Sync Strings from Localazy 2026-09-21 00:54:07 +00:00
Benoit Marty ae36cc3b1e Move user status next to the current account header.
Also make the other account section collapsable
2026-09-18 17:48:19 +02:00
ganfra b54937793f Merge branch 'develop' into sync-localazy 2026-09-18 10:39:43 +02:00
bxdxnn 5cac4767f1 Add smooth animation to voice messages play progress (#7698)
* Add linear animation to voice message playback progress

Instead of animating the small `progress` value changes, calculate an animation for the range `maxProgress - progress`, with a linear interpolator so it's completely smooth. Previously, the progress was updated in 'steps' that were quite noticeable.
2026-09-18 09:39:15 +02:00
Jorge Martin Espinosa c0bb68c872 New timeline event renderer: add new modules (#7721)
* Added HTML parser to abstract tree nodes

* Add HTML renderer using `HtmlMessageContent`

* Add custom rendering for inline code nodes besides the monospace font

* Support `<s>` and `<strike>` too

* Add `ContentAvoidingLayoutData` support

* Improve the last block node behaviour and its integration with `ContentAvoidingLayout`

* Move `ContentAvoidingLayout` to `:libraries:ui-common` so it can be shared

* Add missing `:libraries:htmlrenderer:impl` entry in `DependencyHandlerScope.allLibrariesImpl`

* Update screenshots

---------

Co-authored-by: ElementBot <android@element.io>
2026-09-17 19:08:32 +02:00
Johannes Marbach 97d9707d6a Make NotificationResultProcessor.emit wait until the batch is processed (#7640)
Signed-off-by: Johannes Marbach <n0-0ne+github@mailbox.org>
2026-09-17 16:13:06 +02:00
ganfra 51c06b4bec Timeline : initial multi-select state 2026-09-17 14:49:03 +02:00
Benoit Marty 58a00fd4e5 Merge pull request #7679 from element-hq/feature/bma/messageDeletionConfirmation
Let the user give an optional reason when removing a message
2026-09-16 16:37:51 +02:00
Benoit Marty ba2e2a02d1 Merge branch 'develop' into bma/fixLeak 2026-09-16 09:42:36 +02:00
Benoit Marty 3e861cc646 Do not report detekt LargeClass issues on test classes (#7713)
detekt's default configuration excludes test source sets from
`TooManyFunctions` and `StringLiteralDuplication`, but not from
`LargeClass`, so large test classes were reported and had to carry a
`@Suppress("LargeClass")` annotation.

Add the same kind of exclusion to the `LargeClass` rule in
`tools/detekt/detekt.yml` and remove the 24 now-redundant suppressions
from test files. The two remaining suppressions are in production code,
where the rule still applies.

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-15 13:56:33 +02:00
Benoit Marty c512e3f299 Introduce an EmptyState, so that screenshot filename stays consistent. 2026-09-15 10:52:45 +02:00
Benoit Marty c92bf4bc43 Sealed interface must be immutable when uses in Composable function parameters. 2026-09-15 09:11:40 +02:00
Benoit Marty 5b0d7bf5a7 Log errors and fix quality issues 2026-09-14 18:30:29 +02:00
Benoit Marty ed250320b3 Close the threaded timelines created by ShareLocationPresenter and DefaultMediaSender
Both created a dedicated timeline for each operation performed in a thread, and
never closed it, leaking SDK resources. Apply the same treatment as PollRepository:
replace getTimeline() with a scoped withTimeline() helper, which closes the created
timeline once the operation completes, whether it succeeds, fails or gets cancelled.

In DefaultMediaSender.sendGallery(), waiting for the upload handler is now done
inside the block, so that the timeline stays open until the upload completes.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-14 15:21:14 +02:00
Benoit Marty 6887092ce4 Replace String by AccountProvider to be able to get baseUrl and serverName. 2026-09-14 09:56:16 +02:00
bmarty 5102f6b0fa Sync Strings from Localazy 2026-09-14 00:54:38 +00:00
Jorge Martin Espinosa 8cd3750cde Make global search use a Joined filter for room results (#7695)
Before this, global search returned also invites, which wasn't planned.
2026-09-11 17:36:38 +02:00
Benoit Marty e7372c7f49 Use PreviewParameterProvider 2026-09-11 16:45:21 +02:00