Commit Graph

3287 Commits

Author SHA1 Message Date
Doug ace05b97d0 Combine the user's own display name/avatar into a single profile.
This is in preparation for adding the user status fields into the profile.
2026-07-02 13:09:34 +01:00
Doug b8860baf49 Rename SearchUsersResultsProxy to SearchUsersResults. It also proxies nothing. 2026-07-02 13:09:34 +01:00
Doug 3ef66cdd05 Rename UserProfileProxy to UserProfile. It's a pure struct and proxies nothing.
Also remove the redundant `userID` property given `id` already exists (for Identifiable conformance).
2026-07-02 13:09:34 +01:00
Doug bdf53b64a8 Add a feature flag for User Status. 2026-07-02 13:09:34 +01:00
Mauro Romito 153c258f78 add the content scanner URL to the app settings 2026-07-01 16:24:03 +02:00
Stefan Ceriu f7a4f8a2b4 Fix AccessibilityTests hang on previews expecting expired transient state
The Observation migration (2d486ece3) ported the preview fulfillment loop
from Combine publishers to async sequences but didn't carry over the
publisher path's 1s timeout. Without it, a preview whose expected state never
arrives loops forever.
2026-07-01 16:44:08 +03:00
Doug 036c9ce248 Stop reserving space for the non-existant icon background in ListRowLabel on iOS 26. (#5822)
* Stop reserving space for the non-existant icon background in ListRowLabel on iOS 26.

* Use the .avatar label style for NotificationSettingsEditScreenRoomCell.
2026-07-01 12:58:33 +01:00
Doug 123661537a Make LinkNewDeviceScreen fall back to the App Lock PIN code when there's no passcode. (#5794)
* Fall back to the AppLock PIN code when there's no passcode.

* Add extra tests on the LinkNewDeviceFlowCoordinator.

* Misc tweaks for clarification.

* Regenerate snapshots.
2026-07-01 10:13:18 +01:00
Stefan Ceriu 7097ceb910 Fix voice message recording crashes caused by an isolation assertion failure 2026-07-01 10:35:41 +03:00
Michael ff9c260674 Limit conversations a message can be forwarded to (#5793)
* Limit conversations a message can be forwarded to

* Review fixups

* fix: remove the unused constant argument

---------

Co-authored-by: Mauro Romito <mauro.romito@element.io>
2026-06-30 14:01:49 +02:00
Mauro 2d486ece33 Use iOS 26 Observation for Unit and Preview tests. (#5797)
* use observation in unit and preview tests instead of the async stream

* use a parsing approach that is independent of the sourcery annotation

* Fix observation deferred fulfillments not receiving the initial value

Observation's observe only emits transitions, not the value present at subscription time. Drop the leading initial value from the affected transitionValues sequences and assert it directly with #expect instead.

* improved docs
2026-06-30 14:01:08 +02:00
Stefan Ceriu 2777075655 Handle the non-deprecated INStartCallIntent for calls from Recents
The call-from-Recents handling was wired entirely to the deprecated
INStartVideoCallIntent (the activity-type registration and the cast), which
also meant the app never handled the modern INStartCallIntent that superseded
it in iOS 13. Switch both to INStartCallIntent and derive isVoiceCall from its
callCapability. Clears the deprecation warning.
2026-06-29 18:10:30 +03:00
Stefan Ceriu 89de0f3f2b Use PostHogConfig(projectToken:host:) instead of the deprecated init
PostHog deprecated `init(apiKey:host:)` in favour of `init(projectToken:host:)`.
The project token is the same value as the old API key, so this is a label-only
swap with no behaviour change.
2026-06-29 18:10:30 +03:00
Stefan Ceriu 122a0052ae Drop the unnecessary @Sendable from the composer attribute enumeration
`NSMutableAttributedString.enumerateAttribute(_:in:options:using:)` runs its
closure synchronously on the calling thread and its `using:` parameter isn't
`@Sendable`. The explicit `@Sendable` on the closure literals was therefore
unnecessary and was the only thing triggering the "capture of non-Sendable
NSMutableAttributedString" and "mutation of captured var in concurrently-
executing code" warnings. Removing it clears all six with no behaviour change.
2026-06-29 18:10:30 +03:00
Stefan Ceriu 95319d13b7 Make the zip and file attaching bug report service steps concurrent 2026-06-29 18:01:57 +03:00
Doug 566d8edeab Fix a bug where scanning a universal link as a QR code would open the app without handling the link. (#5804) 2026-06-29 15:11:15 +01:00
Stefan Ceriu ad8d70ebe0 Fix MediaLoader EXC_BAD_ACCESS ongoingRequests crashes 2026-06-29 16:06:54 +03:00
ElementRobot bfd3756671 Translations update (#5802)
Co-authored-by: Element CI <ci@element.io>
2026-06-29 11:12:13 +01:00
Doug 66de86b5d2 Merge the UserDefaultsStorage helpers into UserDefaultsProtocol. 2026-06-29 10:34:32 +01:00
Doug f05fd41c36 Replace the UserPreference property wrapper with the new macro version. 2026-06-29 10:34:32 +01:00
Doug c53e0c1466 Add a new BuildExtensions package that contains a UserPreference macro.
The build extensions package can be used for both macros and plugins.
2026-06-29 10:34:32 +01:00
Doug f3da459d16 Ensure that the current user is the device owner before linking a new device. (#5773) 2026-06-26 16:24:18 +01:00
Stefan Ceriu 2f6a295486 Fix search screen keyboard navigation 2026-06-25 13:11:28 +03:00
Stefan Ceriu 0bd32d24fd Switch to a custom HomeserverReachability instead of different publishers 2026-06-24 20:49:49 +03:00
Stefan Ceriu 3ccaa04554 Don't show the server unreachable banner while the client is suspended
homeserverReachabilityPublisher now reports unreachable while suspended so media loading parks instead of failing against a closed store. The reachability banner was keyed off the same publisher, so pausing the client would surface a spurious "Server unreachable" message.

Expose a separate homeserverConnectivityPublisher derived from the sync service state alone (it stays reachable while suspended) and key the banner off that, keeping the suspend-aware publisher for gating work that needs an open store.
2026-06-24 20:49:49 +03:00
Stefan Ceriu 05922f1bc7 Fix media loading failures when retrying with a closed store
`homeserverReachabilityPublisher` was driven directly by the sync service state so stopping sync on pause still reported .reachable. MediaProvider.loadImageRetryingOnReconnection would then retry against a closed store, fail, and bail out permanently because it treated the reachable state as a non-recoverable error.

Make reachability a function of both the desired service state and the latest sync state, computed in one place: store the sync state in the listener and recompute reachability from it, reporting unreachable whenever the client isn't meant to be running. Recompute on suspend and on resume.
2026-06-24 20:49:49 +03:00
Doug 605ccc6be7 Fix a crash on macOS when using QuickLook. (#5790)
Introduced by the default @MainActor isolation and macOS being weird with threads.
2026-06-24 18:34:45 +01:00
Mauro Romito 31a9f2c961 migrating ui tests using swift 6.2 2026-06-24 17:31:40 +02:00
Stefan Ceriu 057b8728d3 Stop selecting search results automatically when dismissing the keyboard 2026-06-24 16:58:40 +03:00
Michael 80f747985f Remove custom tones menu on macOS (#5776)
* Remove custom tones menu on macos

* Moved property to allotted location
2026-06-24 12:24:20 +01:00
Mauro c93d6e3265 Unit Tests migration to swift 6.2 (#5781) 2026-06-24 12:39:35 +02:00
Stefan Ceriu c5cf9e2fac Fix queue assertion crashes on accessibility testing 2026-06-24 12:31:20 +03:00
Mauro Romito 24af5804d6 use … in place of ... 2026-06-23 15:38:41 +02:00
Mauro Romito 2dc4a24333 update preview tests 2026-06-23 15:38:41 +02:00
Mauro Romito d60b41a05f Add a programmatic label to the join room by address field
The field relied on its placeholder for a label, which VoiceOver only reads
while empty. Set a persistent accessibility label so it's always announced.

Addresses #5256.
2026-06-23 15:38:41 +02:00
Mauro Romito ed58120fd3 Associate the room address field helper text and error with the field
The address field already had an accessibility label, but the section's
helper text and validation error were only shown in a separate footer and
weren't conveyed to VoiceOver when focusing the field. Compose them into the
field's accessibility hint.

Addresses #5258.
2026-06-23 13:06:36 +02:00
Mauro Romito 87d18fe8e3 migrated the max answers poll feature strings to localazy 2026-06-23 13:05:48 +02:00
Stefan Ceriu d40d775717 Don't crash when scrolling to the oldest item before the data is applied
scrollToOldestItem targeted (timelineItemsIDs.count - 1, section: 1) even
when the table's data source hadn't applied that section yet, raising an
out-of-bounds NSRangeException. Scroll against the table's actual section
and row counts instead.
2026-06-22 16:54:52 +03:00
Stefan Ceriu 0a3944deaa Don't crash when recording starts with an invalid input format
AudioRecorder.startRecording crashed AVAudioEngine
(IsFormatSampleRateAndChannelCountValid) when the input node reported an
invalid format - e.g. a zero sample rate when no input route is
available. Bail out with an error before connecting nodes or installing
the tap.
2026-06-22 16:54:52 +03:00
Stefan Ceriu 1e7a9a5ae5 Don't report an empty media selection as a successful pick
Both PhotoLibraryPicker and DocumentPicker reported failures via .error
but still emitted .selectedMediaAtURLs([]) when every selected item
failed to load or export (e.g. an iCloud photo that isn't downloaded, or
a document that fails the security-scoped temp copy) - an empty "success"
that consumers had to defend against. Skip that emission in both, and
report .error for PhotoLibraryPicker's previously silent
missing-content-type case so the user gets feedback.
2026-06-22 16:54:52 +03:00
Stefan Ceriu 101fc7573b Don't crash when the GIF data provider is invoked off the main thread
LoadableImageContent.data(handler:) used MainActor.assumeIsolated to read
the loader's content, which crashes (libdispatch precondition) when
Kingfisher invokes the provider off the main thread, and fatalError'd
when the content wasn't GIF data. Hop onto the main actor and return a
failure instead. The handler is @Sendable per Kingfisher's protocol.
2026-06-22 16:54:52 +03:00
Stefan Ceriu b4fe69a0c9 Don't crash when the tone manager directories can't be created
NotificationToneManager.init force-crashed (fatalError) when
createDirectory failed, e.g. a sandbox permission error (NSCocoaError
513). Log the error instead of killing the app. The underlying cause is
acknowledged and will be treated separately.
2026-06-22 16:54:52 +03:00
Stefan Ceriu c5653c2208 Allow returning from global search with the escape key
cmd+k jumps to the search tab but left users with no way back. Pressing
escape in the search field now returns to the tab they came from (never
into search itself).

Escape is handled at the search field's pressesBegan, alongside the
existing arrow-key navigation, since the focused UIKit field swallows
SwiftUI keyboard shortcuts.
2026-06-22 16:54:30 +03:00
ElementRobot 9bfa18f791 Translations update (#5767)
Co-authored-by: Element CI <ci@element.io>
2026-06-22 13:05:18 +01:00
Stefan Ceriu 10017714e5 Fix libdispatch main-thread trap when logging Sentry crash events
Sentry's beforeSend runs on a background queue, but Event.crashLog read
UIDevice.current there, which carries a main-thread dispatch assertion and
trapped libdispatch. Read the device values on the main thread at setup and
pass them into the now-nonisolated crashLog.
2026-06-22 14:45:50 +03:00
svetoslav-sportinno 30e4e6339d Add max selections support for polls (#5726) 2026-06-22 13:39:12 +02:00
Mauro Romito 173a927bf8 Revert "Associate the room address field helper text and error with the field"
This reverts commit d4e7cbfdbe.
2026-06-22 13:17:23 +02:00
Mauro Romito d4e7cbfdbe Associate the room address field helper text and error with the field
The address field already had an accessibility label, but the section's
helper text and validation error were only shown in a separate footer and
weren't conveyed to VoiceOver when focusing the field. Compose them into the
field's accessibility hint.

Addresses #5258.
2026-06-22 12:57:49 +02:00
amshak 9f92e181b0 Added a chevron to collapsed call buttons in the DM (#5755)
* Added a chevron to collapsed call buttons in the DM

This makes the context menu more intuitive and easy to find. Inspired by the collapsed state of call buttons in Whatsapp that I saw recently

* Shortening video/voice call button strings

Currently the text is unnecessarily long, I have reduced to button text

# Conflicts:
#	ElementX/Sources/Generated/Strings+Untranslated.swift

* Move translations to localazy

---------

Co-authored-by: Stefan Ceriu <stefan.ceriu@gmail.com>
2026-06-22 13:23:37 +03:00
Mauro Romito 3aedd0ccff swiftformat now enforces newlines for ifs 2026-06-19 15:28:27 +02:00