Commit Graph

4915 Commits

Author SHA1 Message Date
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 f3c8438bd8 Add send alert tests 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
Stefan Ceriu 28966c8397 Update PostHog 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
Stefan Ceriu 033cb2e038 Fail fast on the integration tests when encountering the first failed assert 2026-08-18 10:41: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 55a1a21f08 Re-run XcodeGen. (#6040) 2026-08-18 08:12:28 +01:00
Stefan Ceriu 360d6d0ee1 Attempt another kind of fix for the encryption settings UI test 2026-08-18 08:27:57 +03: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 f7f55024ab Fix the flaky ElementCallServiceTests by replacing TestClock
The suite intermittently hung on CI, most recently for the full 2 minute time
limit on lifetimeIsCapped(). A spindump from a failed run shows the process
suspended rather than spinning (0.247s of CPU over 190s) with a background
priority worker thread sitting runnable for roughly 145 seconds without ever
being scheduled.

That band is exactly what swift-clocks' TestClock depends on to make progress:
both advance() and checkSuspension() await Task.megaYield(), which serially
awaits 20 detached tasks at background priority. On an oversubscribed runner
those never run, so the test waits forever instead of failing. The same
mechanism, less starved, is why two of the passing tests took 1.0s and 0.77s
for what is otherwise pure logic. checkSuspension() made it worse, since
asking whether a timer was armed cost a megaYield per poll.

ManualClock replaces it. It holds a single pending sleep, since that is all a
test needs to step through: the sleep registers a continuation, advance(by:)
resumes it synchronously once its deadline passes, and waitForScheduledSleep()
suspends until the timer is armed instead of polling for it. Nothing in the
path touches background priority and no loop's iteration count depends on the
scheduler. The suite now runs in 0.019s, and under a locally saturated CPU the
old version took 1.005s against the new one's 0.037s.

Also drops the now unused Clocks package, removes the 2 minute time limit that
was papering over the starvation, re-enables callIsTimingOut() which the same
flakiness had disabled, and has lifetimeIsCapped() assert the 90 second cap
directly rather than inferring it from when the timer fires.
2026-08-14 16:16:53 +03:00
Doug 1db7a9b07c Update the Enterprise submodule. (#6023) 2026-08-14 13:52:53 +01: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
Element CI 9f648803f9 Run XcodeGen, update Package.resolved and Settings.bundle 2026-08-13 09:47:03 +03:00
renovate[bot] b6239bd53c Update dependency PostHog to v3.69.1 2026-08-13 09:47:03 +03:00
Stefan Ceriu 99f03221c9 Sort the new component paths better. 2026-08-12 16:52:26 +03:00
Stefan Ceriu 78563ef09e Update the enterprise submodule 2026-08-12 16:52:26 +03:00
Stefan Ceriu c0e19454e3 Move BuildExtensions into the Components folder
Complete grouping the standalone modules under Components. Updates the local
Swift package path in project.yml.
2026-08-12 16:52:26 +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
Stefan Ceriu e302b37b6a Move Variants into the Components folder
Continue grouping the standalone modules under Components. Updates the
nightly.yml include path and the app icon banner path used by the
configure-nightly CI command.
2026-08-12 16:52:26 +03:00
Stefan Ceriu 5866c4340a Move SDKMocks into the Components folder
Group the standalone modules that live outside of the app targets under a
single Components folder. Updates the XcodeGen include, the Codecov ignore
path and the Sourcery output path used by the generate-sdk-mocks tool.
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 37c78bf6b1 Add a test covering the map framework being loadable
The shim is embedded but not linked, so nothing at build time proves it is
still there. If it stops being copied into the bundle, or the class is renamed,
dlopen simply fails at runtime and the user gets a blank map behind an error
alert. Nothing in CI would notice.

The test asserts the framework loads and the shim resolves, which is exactly
the pair that breaks if either side of the arrangement is disturbed.
2026-08-12 15:04:24 +03: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
Stefan Ceriu 5724e65d8e Move the shared map types into a new MapLibreInterface framework
Groundwork for loading MapLibre on demand. The map view is about to move into
its own framework, and both sides need to agree on the types that cross the
boundary, so ShowUserLocationMode and MapLibreError move out of the app into a
small framework that the app links.
2026-08-12 15:04:24 +03:00
Stefan Ceriu 1febb3ef91 Retry failed XCUITests 2026-08-11 19:51:33 +03:00
Element CI 10867d1246 Prepare next release 2026-08-11 06:32:01 -07:00
Doug 0b0b8a96ff Update the SDK. (#6010) 2026-08-11 12:46:15 +00:00
Doug 947a47943b Set Element Call's user-agent back to the default but include the bundle name.
Apparently livekit-js-sdk does feature detection based on UA sniffing.
2026-08-11 13:11:26 +01:00
Stefan Ceriu d3b12561b3 Fix XCUITest text entry on all paths 2026-08-11 14:42:48 +03:00
Doug 2228da3eb9 Make sure the Tab Rail's background matches the split view's detail background. (#6003) 2026-08-11 11:07:24 +01:00
Stefan Ceriu d57c376b21 Reinforce text typing within XCUITests 2026-08-11 12:52:00 +03:00
Stefan Ceriu 3f6347b6c9 Drop the addressSanitizer and undefinedBehaviorSanitizer from the Accessibility and UI tests
They cost a lot of extra memory to enable and cause problems on constrained CIs
2026-08-11 11:58:18 +03:00
ElementRobot 189a04b94b Run XcodeGen (#6006) 2026-08-11 08:43:16 +01:00
Michael 6efa8743ff Combine the Server Selection screen into the Server Confirmation screen and add autocompletion when entering an account provider. (#5949)
* Adjust login flow to exclusively use the ServerSelectionScreen

* Move async code to server selection vm

* ServerSelection supports pro picker options

* Use homeserver address for both confirmation and picker modes

* rename ServerSelectionScreenMode

* remove ServerConfirmationScreen

It's been superseded by the ServerSelectionScreen

* rename userInput

* Update strings with latest design strings

* Add server input autocompletion

* Store previous servers in AppSettings and autofill on server signin

* Audit changes for logging

* Enforce lowercase server history storage

* Update tests

* Update Xcode project

* PR review fixups

* Add HomeserverHistoryManager

* Review fixups 2

* Review fixups 3
2026-08-10 18:38:37 +01:00
Stefan Ceriu 42a7b6e8ee Annotate failures for Github Actions so they're easier to spot. 2026-08-10 20:33:43 +03:00
Stefan Ceriu b829c6a06f Prevent invalid snapshots on timeline replies by waiting for the keyboard to appear for longer 2026-08-10 14:49:09 +03:00