Commit Graph

15525 Commits

Author SHA1 Message Date
Jorge Martín 0a624c1550 Fix empty state for room search 2026-08-21 15:51:39 +02:00
Benoit Marty 9935f91bc7 Fix wrong binding 2026-08-21 15:42:20 +02:00
Jorge Martín c392737765 Try fixing the empty state for the room list search in global search 2026-08-21 15:16:26 +02:00
Jorge Martín 679d97cf4f Fix konsist issue about presenters not depending in other concrete presenter implementations 2026-08-21 15:15:48 +02:00
Jorge Martín e4891abf45 GlobalSearchPresenter doesn't need @ContributesBinding 2026-08-21 14:36:10 +02:00
Jorge Martín 76b6e5857f Fix lint issues 2026-08-21 13:03:21 +02:00
ElementBot d05978cc16 Update screenshots 2026-08-21 11:00:17 +00:00
Jorge Martín b29a4c06d7 Improve previews 2026-08-21 12:43:09 +02:00
Jorge Martín 3a946475f7 Fix search results never displaying an empty state
Use the pagination state to understand when a search finished with no results
2026-08-21 12:37:47 +02:00
Jorge Martín 9a2d23c8a1 Remove unnecessary GlobalSearchPresenter.Factory 2026-08-21 12:07:38 +02:00
ElementBot f854fbd70a Update screenshots 2026-08-20 14:18:15 +02:00
Jorge Martín 8bdce7cfd6 Add tests 2026-08-20 14:18:06 +02:00
Jorge Martín 3ca5081f33 Integrate the new screen with the existing home screen, display it only when the search feature flag is enabled 2026-08-20 13:56:29 +02:00
Jorge Martín be2909bca2 Add a global search screen, which reads from both the RoomListSearchDataSource for the rooms search and MessageSearchService for the message search
Note the designs and texts of this screen are temporary.
2026-08-20 13:55:45 +02:00
Jorge Martín 9d36c8c4ed Export missing MessageSearchService to SessionScope 2026-08-20 13:53:49 +02:00
Jorge Martin Espinosa f2883ef9df Fix flaky test in DefaultVoiceMessageComposerPresenterTest (#7487) 2026-08-20 11:49:59 +02:00
renovate[bot] ca86711ecb Update dependency io.sentry:sentry-android to v8.53.0 (#7481)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-20 11:49:21 +02:00
renovate[bot] e98d37cbcb Update dependency androidx.webkit:webkit to v1.17.0 (#7484)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-20 11:49:07 +02:00
renovate[bot] 85226228e9 Update dependency org.maplibre.gl:android-sdk to v13.5.0 (#7486)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-20 11:48:50 +02:00
ElementBot 4fa9576029 Update Gradle Wrapper from 9.7.0 to 9.7.1 (#7485)
Signed-off-by: gradle-update-robot <gradle-update-robot@regolo.cc>
Co-authored-by: gradle-update-robot <gradle-update-robot@regolo.cc>
2026-08-20 11:44:15 +02:00
hayyaksi 2525019ca1 Show the right image when opening one that has not finished sending (#7359)
* Show the right image when opening one that has not finished sending

* Reuse the timeline media gallery for events that have no event id
2026-08-20 11:16:13 +02:00
Benoit Marty 7ba29d8a5e Changelog for version 26.08.2 2026-08-20 10:40:43 +02:00
Benoit Marty 0d48b17363 Merge tag 'v26.08.2' into develop
tag
2026-08-20 10:13:06 +02:00
Benoit Marty 3ea7541628 Merge branch 'release/26.08.2' 2026-08-20 10:12:55 +02:00
Benoit Marty 9c867c9fc4 Adding fastlane file for version 26.08.2 2026-08-20 10:12:51 +02:00
Benoit Marty b774e6a280 Setting version for the release 26.08.2 2026-08-20 10:12:25 +02:00
hayyaksi 918015b8bb Stop waiting for a room alias that the remote server never resolves (#7446)
Tapping a room alias whose server is down left the resolver screen on a
spinner for as long as the screen stayed open, with no way forward other
than going back.

Bound the resolution with the ten second timeout already used when
joining a room by address, so the retry dialog is shown instead. The fake
client's resolve lambda becomes suspending so a server that never answers
can be simulated.
2026-08-20 09:34:15 +02:00
hayyaksi 48f26ae33e Do not open the room again when the app is resumed from the recents list (#7436)
MainActivity is a singleTask activity that declares the elementx://open deep
link, so tapping a notification makes that deep link the base intent of the
task. When the user later brings the app back from the recents list, the
system replays that base intent with FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY, the
resolver turns it into a navigation again and the user is pushed back into the
room they had already left.

Ignore any intent the system replayed from the history, the same way the
launcher intent is already ignored.
2026-08-20 09:31:25 +02:00
renovate[bot] b366515d11 Update dependency androidx.compose:compose-bom to v2026.08.00 (#7483)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-20 08:59:00 +02:00
hayyaksi c362bca527 Keep the send button when the composer is emptied while editing a message (#7456)
* Keep the send button when the composer is emptied while editing

rememberEndButtonParams checked whether the composer had sendable text
before it checked whether the user was editing a message, so clearing
the text of a message being edited replaced the send button with the
voice recorder button. Starting a recording from there abandons the
edit.

Check the editing branch first, as the formatting composer already does,
and let it render a disabled send button when there is nothing to send.

* Update screenshots
2026-08-20 08:55:50 +02:00
hayyaksi 2432b0ccc6 Keep playing a voice message when another app plays a short sound (#7454)
* Request media audio focus when playing a voice message

Voice message playback asked for audio focus with
USAGE_VOICE_COMMUNICATION, the same bucket as Element Call and voice
message recording, while the player itself renders on the media stream.
Audio policy layers act on the declared usage, so a car head unit
switches to its call audio context and routes the playback away while
the player keeps running.

Declare USAGE_MEDIA (and STREAM_MUSIC on the legacy path) for playback,
which is what the player actually renders. Recording and Element Call
keep asking for voice communication focus.

* Keep playing a voice message through a short sound from another app

A notification, a navigation prompt or any other app taking focus for a
moment sends AUDIOFOCUS_LOSS_TRANSIENT or AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK,
and DefaultMediaPlayer pauses on it. The voice message stops part way
through and the user has to find it again and restart it.

Recording already ignores those two, because the capture path is not
affected by focus. Give voice message playback the same treatment, moving
the requester test into a named function rather than growing the inline
condition. A permanent AUDIOFOCUS_LOSS, a real phone call, still pauses,
and the media viewer is untouched.
2026-08-20 08:55:03 +02:00
Benoit Marty 1c94e89ee8 Merge pull request #7394 from element-hq/feature/account-provider-selection
Simplify choosing the account provider during sign in, with autocomplete of previously used ones
2026-08-19 17:06:47 +02:00
Benoit Marty 92595e1532 Merge pull request #7427 from element-hq/renovate/media3
Update media3 to v1.11.0
2026-08-19 16:26:29 +02:00
ElementBot f2114d94f1 Update screenshots 2026-08-19 14:05:29 +00:00
Benoit Marty bbaea49114 Merge pull request #7479 from element-hq/renovate/org.matrix.rustcomponents-sdk-android-26.x
Update dependency org.matrix.rustcomponents:sdk-android to v26.08.19
2026-08-19 15:19:33 +02:00
Benoit Marty fb614cb90a Merge pull request #7478 from element-hq/feature/bma/configurePusherAppId
Make the PUSHER_APP_ID configurable at build time.
2026-08-19 15:07:19 +02:00
renovate[bot] a70cd18563 Update dependency org.matrix.rustcomponents:sdk-android to v26.08.19 2026-08-19 12:21:52 +00:00
Benoit Marty 7adbd3941a Make the PUSHER_APP_ID configurable at build time. 2026-08-19 14:20:31 +02:00
hayyaksi 7341feeed8 Model the fake voice recorder on a cancellable recording job (#7466)
* Model the fake voice recorder on a cancellable recording job

FakeVoiceRecorder pushed a whole recording synchronously from a single
suspending call, which made it both weaker and stricter than
DefaultVoiceRecorder.

Every level emission carried the same elapsed time and the emissions were
coalesced by Molecule, so no intermediate recording state was observable and
the level-limit test had to skip half the emissions to compensate. Each level
now advances the test time source and suspends for its share of the recording
duration, so the states arrive one at a time and that magic number is gone.

Call verification moved to the constructor lambdas the rest of the repo uses,
in place of hand-rolled counters and assertCalls. The counters discarded the
argument, so nothing pinned that cancelling a recording stops it with
cancelled = true; that is now asserted. Truth is no longer needed by the
fixture module.

A second startRecord() no longer raises an error where production only warns
and returns, and stopping or deleting terminates an in-flight emission loop
the way cancelling the real recording job does, so a stale recording state can
no longer arrive after the recording has finished.

* Keep each recording's level loop to its own recording

The level loop checked a single isRecording flag, which cannot tell "this
recording was cancelled" from "a later recording has started". After a cancel
followed by a new start, the first loop resumed, saw the flag set again, and
advanced the shared test time source, so the new recording reported the elapsed
time of both. Each recording now carries an id and its loop stops as soon as
that id is no longer the active one.
2026-08-19 13:44:11 +02:00
ganfra cf2ce2bd65 Use Profiles sliding sync extension check for own profile subscription (#7403)
* Use Profiles sliding sync extension check for own profile subscription

---------

Co-authored-by: Jorge Martin Espinosa <jorgem@element.io>
2026-08-19 13:00:27 +02:00
hayyaksi 6bd841d838 Close the invite screen once the invite has been declined (#7440)
Declining an invite from the full screen invite left the user on that
same screen, so they had to press back themselves to get to the room
list. Both decline paths are affected: the plain decline handled by
AcceptDeclineInviteView, and the decline and block sub screen, which
navigated up into the join room flow instead of out of it.

Navigate up from the join room flow on a successful decline, and give
DeclineInviteAndBlockEntryPoint a callback so the sub screen can report
a successful decline separately from a back press. The room list flow
supplies the same callback, popping the sub screen once the invite has
been declined.
2026-08-19 12:52:11 +02:00
Benoit Marty 03c69be722 Merge pull request #7477 from element-hq/feature/bma/normalizeUserAgent
Normalize the applicationName used in user agent
2026-08-19 12:35:56 +02:00
hayyaksi ee1348e19e Give the room name in the timeline top bar a 48dp tap target (#7450)
* Give the room name in the timeline top bar a 48dp tap target

The row carrying the room avatar and name is the control that opens the
room details, but it is only as tall as its content, which is under the
48dp minimum recommended for a touch target. Constrain it to a minimum
height of 48dp. The children stay centred inside the app bar, so nothing
moves visually.

* Update screenshots

The accessibility snapshot of the timeline is the only one the change
affects: the node which opens the room details now reports a 48dp tall
bounding box. The room name, the avatar and the icons stay where they
were.
2026-08-19 12:29:24 +02:00
Benoit Marty ff89302cf5 Normalize the applicationName used in user agent, as HTTP spec does not allow UTF-8 chars in headers. 2026-08-19 11:56:34 +02:00
Jorge Martin Espinosa a1e86ad499 Use the right base URL for the ESS config/well known endpoints (#7469)
* Rename `UrlContentFetcher` to `ClientUrlContentFetcher` and add missing base URL data (server name, homeserver URL)

* Avoid passing the `homeserverUrl/serverName` around.

Calculate the URL in `DefaultRemoteEnterpriseConfigRetriever` using the newly added `homserver` and `server` values as the possible base URLs, depending on the remote config source

* Make sure we don't perform blocking requests to fetch the remote config when restoring a session

Add a `needsRefresh` parameter to `RemoteEnterpriseConfigResult.NotFound` to handle this, and store a `no-config` value in the store to indicate an endpoint has been checked and no config was found

* Bump enterprise module
2026-08-19 09:24:22 +02:00
Jenna Vassar 891c077786 Merge remote-tracking branch 'origin/develop' into feature/account-provider-selection 2026-08-18 17:49:31 -07:00
Jenna Vassar 2e2bf71ad5 Make ensureProtocol case-insensitive 2026-08-18 17:03:40 -07:00
Jenna Vassar 1b2d5b9c92 Complete account providers without the https scheme and include the enterprise allow-list 2026-08-18 17:03:39 -07:00
Jorge Martin Espinosa c31d7e6cce Don't restart the sync service if the client is shutting down (#7472)
* Don't restart the sync service if the client is shutting down

This was causing issues when clearing the cache:

1. The client would ask the SDK to clear the caches.
2. The SDK would stop the sync service, clear the caches and set the `pos` value of sliding sync to 0 so the HS returns all the required state the next time the client is used.
3. However, between the sync service being stopped with the `pos=0` change and the client being destroyed, there was enough time for the `SyncOrchestrator` to decide the sync service was stopped for no good reason since there is network connectivity and the app is on foreground, so it restarted the sync, with `pos=0`.
4. This value was persisted, and the next time the new client did an 'initial sync' it had a `pos != 0`, which the HS uses to avoid returning some required state it already fetched.
5. The room list now lacks state events for lots of rooms and room names, avatars, members, etc. are now missing.

---------

Co-authored-by: Benoit Marty <benoitm@element.io>
2026-08-18 16:50:57 +00:00
Benoit Marty 32416581d4 Merge pull request #7473 from element-hq/feature/bma/improveBuildTimeConfig
Improve build time config and update the Firebase configuration
2026-08-18 18:21:57 +02:00