Commit Graph

3625 Commits

Author SHA1 Message Date
Mauro 8874ee112c Allow copying blocked user id (#6071) 2026-08-26 14:06:11 +02:00
Mauro Romito 142529ad69 Revert "allow copying blocked user id"
This reverts commit f6f6538bd6.
2026-08-26 13:44:15 +02:00
Mauro Romito f6f6538bd6 allow copying blocked user id 2026-08-26 13:43:14 +02:00
Element CI a139257967 Run XcodeGen, update Package.resolved and Settings.bundle 2026-08-26 10:49:48 +02:00
Element CI ca1d44a53d Run XcodeGen, update Package.resolved and Settings.bundle 2026-08-26 10:49:48 +02:00
Doug fbb5632896 Add some tests.
# Conflicts:
#	ElementX.xcodeproj/project.pbxproj
2026-08-26 08:17:00 +03:00
Matthew Hodgson c812b723dc Advance the join room screen when the server joins us to the room
The homeserver can join a user without a join request from their client,
auto-accepting a knock (element-hq/synapse#16307) or an invite
accepted on another device. The join room screen only navigated on a
user-initiated join and only observed membership changes while knocked,
so a server-side join left it sitting on a stale invited state.
2026-08-26 08:17:00 +03:00
Doug c8b12d9496 Add tests for the UserSessionStore. (#6065)
* Add enough mock configurations to test the UserSessionStore.

* Add tests for the UserSessionStore.
2026-08-25 16:41:43 +01:00
Doug 353233672a Fix settings screen snapshots. 2026-08-25 16:40:21 +01:00
Doug 9c65d36101 Use the ClientFactory pattern everywhere replacing raw ClientBuilders.
# Conflicts:
#	ElementX/Sources/Services/UserSession/UserSessionStore.swift
#	NSE/Sources/NSEUserSession.swift
2026-08-25 16:40:21 +01:00
Mauro Romito 7ecb7f89e6 removed no op line for client builder 2026-08-25 15:04:10 +02:00
Mauro Romito d611bad03b update sdk to 26.08.25 2026-08-25 15:04:10 +02:00
Element CI b864918686 Translations update 2026-08-24 14:49:17 +02:00
Stefan Ceriu 925e61e40c Preserve the blank lines typed after a list
The newline to break replacement only matched paragraph to paragraph, so a blank
line after a list was dropped and the text following it glued to the last item.
Only a following paragraph is matched, because without a blank line its text
would have continued the last item instead of starting a paragraph of its own.
2026-08-24 15:45:19 +03:00
Doug 84556c0672 Enable the User Status feature on supported homeservers. (#6059)
* Remove the user status feature flag.

* Handle User Status in tests.
2026-08-24 11:00:31 +01:00
Stefan Ceriu 1ba090b914 Fix missing back pagination attempt
Avoiding not populating past the initial events
2026-08-21 17:38:49 +03:00
Stefan Ceriu c65147678a Add support for the <strike> tag in the attributed string builder 2026-08-21 17:01:54 +03:00
Stefan Ceriu d360d59b0b Fix indentation for various nested nodes and in particular lists
Fixes #5179. Best see the updated preview snapshots
2026-08-21 17:01:54 +03:00
Doug 0d222e8ac0 More tweaks for User Status. (#6051)
* Make sure user profiles are up to date when mentioning.

* Automatically focus the custom status text field.

* Make sure to clear the previous custom status text before input.

* Attempt to fix the user status sheet sometimes disappearing.
2026-08-21 11:23:33 +01:00
Stefan Ceriu 8a3468658b Address PR comments 2026-08-21 12:26:02 +03:00
Stefan Ceriu 0eea289b89 Fix test fixture copy paste error 2026-08-21 12:26:02 +03:00
Stefan Ceriu 9dd9fd9176 Prefetch the next room list page before reaching the bottom
Growing the list only once the last row was already visible, on top of the half a
second visible range throttle, meant hitting and bouncing off the end of the list
while the next page loaded. Ask for the next page half a page early instead, so
the growth happens while the user is still scrolling towards the boundary.

The threshold is clamped so that it stays positive for accounts with fewer rooms
than half a page, where it would otherwise always match and leave the list unable
to shrink back to a single page.
2026-08-21 12:26:02 +03:00
Stefan Ceriu e7787f4c3f Set the room list mode synchronously on a warm launch
The room summary provider subscription only delivers its current state through an
async main queue hop, which can end up queued behind the first render. On a warm
launch, where the cached rooms have already been published before the home screen
exists, that leaves the skeletons up for the whole duration.

Read the current state at the end of init instead, alongside the rooms which were
already being read there.
2026-08-21 12:26:02 +03:00
Stefan Ceriu 8c9edd5ea9 Fix the room list flashing empty on launch
The room summary provider publishes its loading state and its rooms through two
independent streams, so the state can report loaded before the first summaries
have been applied. Flipping the room list mode to .rooms at that point renders
an empty list until the summaries arrive.

Combine the two publishers into a single subscription so that the mode and the
rooms are always updated from the same pair of values, and keep the skeletons up
until the rooms have published. Only the initial transition is held back, an
empty list later on is a filter or a search result and must not send the mode
back to the skeletons.
2026-08-21 12:26:02 +03:00
Stefan Ceriu bb0e80ba16 Remove unnecessary updateBackupStateFromRemote call
This is a remote check fired on every startup and the `backupStateListenerTaskHandle`'s
unknown state already handles it.
2026-08-21 12:26:02 +03:00
Doug 864d022f45 Allow the Chats title to shrink when filtering on a space with a long name. 2026-08-18 17:59:06 +01:00
Doug b27a549ef8 Update the toolbars in the Chats/Spaces screens. (#6043)
* Fix an issue with macro compilation when using Xcode previews.

* Update the Chats/Spaces toolbars to match the Figma.

Fixes a bug with the status emoji in the liquid glass button.
2026-08-18 17:50:15 +01:00
Stefan Ceriu bf2561f937 Delay secondary room summary provider setup (#6038)
To avoid creating room summaries for them on startup, especially as the static one uses a page size as big as the whole account.
2026-08-18 12:52:47 +03:00
Stefan Ceriu fa2b13864a Use normal path for error toast display 2026-08-18 11:55:32 +03:00
Stefan Ceriu 7ce16c5b2d Rework accessibility identifier comment 2026-08-18 11:55:32 +03:00
Stefan Ceriu 64076c6cf9 Show the failure alert even when no send handle is available 2026-08-18 11:55:32 +03:00
Matthew Hodgson 8bc7e7c281 Address review feedback on the send-failure dialog
- Resolve the send handle at tap time and pass it through the alert,
  removing the duplicated lookup and the stale-itemID window between
  tapping the indicator and pressing Retry.
- Route 'Remove message' through the existing timeline item menu redact
  action instead of a bespoke redact path with a fatalError.
- Surface a retry failure to the user with an indicator toast rather
  than only logging it.
- Only set the send-info accessibility identifier when the label has a
  tappable status, so plain timestamps don't create ambiguous matches.
2026-08-18 11:55:32 +03:00
Matthew Hodgson 404410b8a2 Add an accessibility identifier to the timeline item send info
Lets UI tests (and accessibility tooling) target the tappable send-info
label (timestamp / Sending failed) directly.
2026-08-18 11:55:32 +03:00
Matthew Hodgson 1aa9b29eb5 Offer Retry and Remove actions with a reason when tapping a failed message
Tapping the red (!) on a message that failed to send used to show a bare
"Sending failed" alert with only an OK button. Now the alert includes the
failure reason from the SDK (e.g. the HTTP error that caused it) and offers
Retry sending, Remove message and Cancel actions, wired to the send handle's
resend and to redacting the local echo respectively.
2026-08-18 11:55:32 +03:00
Doug d3b068cbad Fix the emoji picker's title when setting a custom status. (#6039) 2026-08-18 08:12:56 +01:00
ElementRobot f090f30e7e Translations update (#6036)
* Translations update

* Update snapshots.
2026-08-17 14:17:05 +00:00
Doug 224edafabd Update the SDK fixing some user status bugs. (#6037)
- Room heroes weren't being updated when their status changed.
- A user's own profile would go missing after removing their avatar (or setting any field to null).
2026-08-17 14:17:11 +01:00
Doug 809965f693 Update the SDK. (#6030)
Use the new Profiles sync extension check for more reactive user profiles.
2026-08-14 16:34:08 +01:00
Stefan Ceriu 5f236c577f Implement TimelineItemProvider diff truncate mechanism 2026-08-14 18:30:26 +03:00
Stefan Ceriu c62aed4e0c Detach the Client's cacheAccountURL call
So it doesn't block service state transitions while hitting the network.
2026-08-13 18:16:07 +03:00
Stefan Ceriu df6b7d0d21 Avoid re-applying identical room list filters
The home screen's filter observation fires on every view state change, so setFilter was repeatedly pushing the same filter down into the SDK. Cache the last applied filter and skip the SDK call when it hasn't changed.
2026-08-13 17:24:11 +03:00
Stefan Ceriu 5cb4a2fe5a Add CustomStringConvertible conformances to timeline item contents 2026-08-13 16:25:18 +03:00
Stefan Ceriu b41d801cab Prevent invalid composer mode crashes
Cause by voice recording racing against the send action.
2026-08-13 16:25:18 +03:00
Stefan Ceriu d4d74dd8f8 Avoid race conditions between the home screen's crash alert and Sentry's onLastRunStatusDetermined
By converting the `lastCrashEventID` to a publisher that the VM can just listen to instead of relying on start to match a pre-set event
2026-08-13 16:17:21 +03:00
Stefan Ceriu d595e4fd83 Move MapLibre into the Components folder
Continue grouping the standalone modules under Components. The MapLibre
frameworks were nested inside the app folder even though they are separate
targets, so move them alongside the other components and update the
XcodeGen includes.
2026-08-12 16:52:26 +03:00
Stefan Ceriu f73285db3e Move DevelopmentAssets into the Components folder
Continue grouping the standalone modules under Components. Updates the
preview asset paths and the media resource references in the app and unit
test targets.
2026-08-12 16:52:26 +03:00
Stefan Ceriu cbe17409bb Move Secrets into the Components folder
Continue grouping the standalone modules under Components. Updates the
Secrets.swift references in the app, NSE and Share Extension targets along
with the SwiftLint, SwiftFormat, gitignore, post-checkout hook and forking
documentation paths.
2026-08-12 16:52:26 +03:00
renovate[bot] 9c0d17c79c Update Project Dependencies (#6011)
* Update Project Dependencies

* Run XcodeGen, update Package.resolved and Settings.bundle

* Run XcodeGen, update Package.resolved and Settings.bundle

* Opt out of PostHog's ridiculous new notification tracking.

Shouldn't be necessary given we have swizzling disabled, but just to be safe.

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Element CI <ci@element.io>
Co-authored-by: Doug <douglase@element.io>
2026-08-12 13:29:38 +01:00
Stefan Ceriu 4de42be688 Load the map framework on demand instead of at launch
MapLibre ships as a dynamic framework, so being named in the app's load
commands means dyld loads it before main runs on every launch: 7.3 MB paged in,
133 C++ static initialisers run and its classes registered, all for a map that
only appears once a location screen is opened.

Measured on an iPhone 17 Pro with two otherwise identical probe apps launched
alternately, linking MapLibre takes pre-main from 11.1 ms to 23.2 ms, and on a
cold launch from 32.9 ms to 60.7 ms. Loading it on demand brings pre-main back
to the 11.1 ms baseline and moves the roughly 11 ms it costs to dlopen to the
moment the map first appears.

MapLibreShim is now embedded but not linked, and the app resolves the shim
through the ObjC runtime after dlopen-ing it. MapLibre stays in the bundle as
an embed-only framework reference so the shim's load command can resolve
against it, expressed as an implicit framework because xcodegen can't describe
embed-without-link for a package product.

Timeline location messages already use the static tile view, which never
touched MapLibre, so the shim only loads for interactive maps.
2026-08-12 15:04:24 +03:00
Stefan Ceriu 8753fe3980 Move the interactive map into a new MapLibreShim framework
Second step towards loading MapLibre on demand: everything that touches it now
lives in one framework, so that framework can later be left unlinked.

The interactive map view, its annotation view and the coordinate animator move
into MapLibreShim, which reaches the app through MapLibreShimProtocol. The app
side keeps its MapLibreMapView call site and becomes a thin wrapper that builds
a MapViewConfiguration, passing the app-only pieces (map style URLs, marker
views, tint colour) across as closures so the shim needs nothing from the app.

LocationAnnotation loses its MapLibre conformance and becomes a plain struct,
with the shim mapping it onto its own annotation type. MapLibre's log
forwarding moves into the shim as well, since TargetConfiguration can no longer
reach it.
2026-08-12 15:04:24 +03:00