70 Commits

Author SHA1 Message Date
Doug e3ac4a0b6c Fix preview tests/snapshots. 2026-07-02 13:09:34 +01:00
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
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
Mauro a520d94760 Swift 6 Migration (#5733)
* Enable Swift 6.2 with default main actor isolation for the app target

Turn on SWIFT_VERSION 6.2, SWIFT_APPROACHABLE_CONCURRENCY and SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor for the ElementX target, matching the NSE and Share Extension (which already use 6.2 without the main actor default).

# Conflicts:
#	ElementX.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved

* Update the code generation templates for Swift 6

Emit nonisolated/@unchecked Sendable mocks and nonisolated string enums, and mark async mock methods @concurrent so they keep suspending like the real implementations (otherwise intermediate states are unobservable in tests). Includes the regenerated mocks and strings.

# Conflicts:
#	ElementX/Sources/Mocks/Generated/GeneratedMocks.swift

* Make the data layer and services nonisolated and Sendable

Annotate the value-type models, Rust SDK proxy wrappers, timeline item graph, settings, logging and NSE-shared types as nonisolated, and conform the service protocols to Sendable so their existentials can cross isolation boundaries. These types run off the main actor and no longer inherit the target's default main actor isolation.

* Adopt the new isolation across call sites, mocks and signatures

Update call sites, closure signatures and mock configuration helpers to match the nonisolated/Sendable data layer, including the main actor isolated mock inits and the @Sendable filter on recentlyVisitedRooms.

^ Conflicts:
^	ElementX/Sources/Services/SecureBackup/SecureBackupController.swift

* Remove redundant @MainActor annotations

With the app target defaulting to main actor isolation, the explicit @MainActor on view models, coordinators, views and their protocols is no longer required.

* Fix concurrency hotspots surfaced by the migration

Resolve the room summary main-thread deadlock by moving diff processing onto AsyncStreams, add the SDKListener.onMainActor FIFO bridge for SDK callbacks, hop KVO/timer/UIKit callbacks to the main actor via assumeIsolated, add isolated deinits, and apply the few justified nonisolated(unsafe) escapes for queue-confined Apple APIs.

* Fix the unit tests for Swift 6 concurrency

Hop the waitForConfirmation body onto the caller's actor (Swift Testing runs confirmation closures off-actor), and adjust the affected suites and async signatures.

* offload diffs on concurrent threads instead of main actor

* make room info protocols sendable

* use a task group for fetching data so that everything runs concurrently in the TextRoomTimelineView when getting the preview.

* use the generic onMainActor implementation, which already makes a stream and send the continuation on the main actor.

* small pr comments issues being addressed

* update enterprise

* Update StaticCode to 1.1.0 and specify the required Swift isolation.

* fix ElementCallServiceTests

* update enterprise

* re-generate mocks

* update enterprise

* enterprise new code conformed to swift 6

---------

Co-authored-by: Doug <douglase@element.io>
2026-06-18 17:55:31 +02:00
Stefan Ceriu a6cad41b12 Remove all underlyingFoo mock property usage (unnecessary) 2026-06-03 08:57:04 +03:00
Doug fa67713726 Run SwiftFormat. 2026-05-27 17:11:42 +01:00
Doug 08d02001bf Tidy up mock creation. (#5627)
* Use our standard XYZMock(.init()) pattern everywhere instead of XYZMock.default.

* Remove the configuration parameter label on mock convenience inits.

* Update the enterprise submodule.
2026-05-22 17:34:35 +01:00
Mauro 76f744b9c4 Live Location Sharing - handle server echoes (#5514)
* Track active live location sessions by ID instead of timeout.

# Conflicts:
#	ElementX/Sources/Services/Location/LiveLocationManager.swift

* implemented a system to promote starting session to active sesessions to send locations at the right time, and a system to remove a local session if it's handled by an external device.

* pr suggestions

---------

Co-authored-by: Doug <douglase@element.io>
2026-04-30 13:18:36 +00:00
Doug eef4a2497a Add support for homeserver capabilities to disable the UserDetailsEditScreen UI. (#5421)
Add support for homeserver capabilities to disable editing your user profile.

Also updates editable avatar size/formatting to match the latest Figma at the same time.
2026-04-17 11:52:46 +01:00
Doug 43770ab480 Replace a debugging visibility check with the real condition. (#4982) 2026-01-21 17:16:23 +00:00
Doug cde9714a83 Implement the SpaceAddRoomsScreen. (#4951)
* Update proxies ready for adding rooms to a space.

- ClientProxy.recentlyVisitedRooms to take a filter and to return room proxies.
- Expose SpaceServiceProxy.addChildToSpace.

* Implement the SpaceAddRoomsScreen.

* Fix the designs of the selected carousels.

Add more snapshot tests for inviting users.

* Fix for screen using wrong avatar size.
2026-01-14 12:07:57 +00:00
Doug 334df3f5cd Rename SpaceRoomProxy to SpaceServiceRoom and stop proxying the struct. (#4952)
* Rename SpaceRoomProxy to SpaceServiceRoom.

The underlying type is a struct, we don't need to proxy it.

* Actually stop proxying the SpaceRoom.
2026-01-13 12:00:20 +00:00
Mauro 4cfedefcca Create room redesign and refactor (#4942) 2026-01-12 17:49:31 +00:00
Doug 7cb472a4f7 Add tests for linking a new device. (#4934)
* Replace GrantLoginWithQrCodeHandlerSDKMock with LinkNewDeviceServiceMock.

Add tests for all initial states on the QRCodeLoginScreen.

* Add tests for linking both mobile and desktop devices.

* Add UI tests for linking a new device.

* Don't show the Link Desktop Computer button when running on macOS.

This mirrors the decision to hide the Sign In With QR Code button on the start screen.
2026-01-09 13:10:14 +00:00
Doug a53b9137ef Add a dedicated target for SDK mocks to avoid type name conflicts on the generated code. 2026-01-06 10:57:37 +00:00
Doug 44f88adfb0 Refactor SpaceServiceProxy.joinedSpaces to topLevelSpaces. 2026-01-06 10:57:37 +00:00
Stefan Ceriu 53a20f2a89 Display the store sizes under the developer options menu 2025-12-19 11:12:36 +02:00
Doug 4ea1aaecdd Add a Link New Device screen (behind a feature flag). (#4811) 2025-12-11 11:45:23 +00:00
Doug 7496f30966 Add the same unsaved changes alerts that Android has. (#4803)
* Add an alert to Discard or Save when there are unsaved changes on the RoomDetailsEditScreen.

* Add an alert to Discard or Save when there are unsaved changes on the UserDetailsEditScreen.

* Add an alert to Discard or Save when there are unsaved changes on the SecurityAndPrivacyScreen.

* Update strings.
2025-12-01 13:02:50 +00:00
Doug f2607affd2 Adopt the new latest event API. (#4779) 2025-11-25 11:52:48 +00:00
Doug 51a9d8b56b Only offer to verify if a cross-signed device is available and improve the UX whilst waiting. (#4710)
* Only offer to verify if a cross-signed device is available

* Wait until we know which verification options are available before showing them.

---------

Co-authored-by: Hubert Chathi <hubertc@matrix.org>
2025-11-07 12:10:12 +00:00
Mauro f7dd9cdcf8 Update copyright holding and dates (#4640)
* Update copyright holding and dates

* compound IDE Macros updated

* update copyright

* update copyrights done

* update templates and README
2025-10-21 14:34:56 +02:00
Doug c572a1a431 Add UI tests for accepting space invites. (#4602)
* Fix the space visibility icon size in the join room screen.

* Add a UI test for accepting space invites.
2025-10-09 10:11:02 +01:00
Stefan Ceriu 92227060ad Add unit test for the in-timeline space permalink handling 2025-10-08 14:04:42 +03:00
Mauro Romito c4aebc47ee pr suggestions and some code improvements 2025-10-03 10:55:27 +02:00
Mauro Romito 8f31671e10 fixed existing tests and added tests for all the threaded flows 2025-10-03 10:55:27 +02:00
Doug c2ac60f1e6 Add support for joining rooms from a space. (#4501)
* Add support for joining rooms from a space.

Doesn't yet handle the Join button 🤔

* Handle the join button for both rooms and spaces.

Also refactor more instances of spaceRoom to spaceRoomProxy.
2025-09-11 16:41:19 +01:00
Doug 2f2e6f6226 Revert weak media provider (#4483)
* Revert "Address the real lifetime issue of the SDK's `Client` by making `Context.mediaProvider` weak. (#4466)"

This reverts commit c794144ef1.

* Better docs.
2025-09-08 17:48:58 +01:00
Doug 90504d89c8 Use the SDK's offline detection everywhere (except for restarting the sync loop). (#4472)
* Use the SDK's offline state to drive the offline indicator.

* Only use network reachability for restarting the sync loop, use the homeserver reachability for requests.

* Add a separate indicator to distinguish when the server is unreachable but the device is online.
2025-09-08 12:18:02 +00:00
Doug c794144ef1 Address the real lifetime issue of the SDK's Client by making Context.mediaProvider weak. (#4466)
This reverts commit 927aea4bfe.
2025-09-05 17:18:14 +00:00
Doug 53eb1c1718 Allow joined rooms to be pushed within a space. (#4460)
* Allow joined rooms to be pushed within a space.

* Push a room in the space flow tests.

Also fixes some snapshots stale snapshots.

* Show the selected space/room within a space and set a custom title view.
2025-09-03 17:48:49 +01:00
Doug 927aea4bfe Workaround: Hold a weak reference to the SDK's Client in MediaLoader so it can be released when clearing the cache. 2025-09-03 17:39:16 +01:00
Doug dfb2425240 Introduce flow parameters to simplify dependencies for child flows. (#4448) 2025-08-27 12:56:06 +00:00
Doug d119964d50 Space flow improvements. (#4430)
* Space flow improvements

- Use a state machine to select a space.
- Add a SpaceFlowCoordinator for recursively presenting subspaces.
- Get the spaceRoomListProxy when tapping on the space so we can indicate failures.
- Fix the total room count in SpaceListScreen.

* Refactor spaceRoom → spaceRoomProxy.

* Add a UI test for the Spaces flow.
2025-08-22 15:49:47 +01:00
Doug 4d365e3fd7 Remove unnecessary slidingSyncVersion calls.
It's all native now :D
2025-07-30 14:42:59 +01:00
Doug 5762e1c537 Stop showing the sliding sync proxy alert to any remaining users.
The session will simply fail to restore and the restoration token deleted.
2025-07-30 14:42:59 +01:00
Doug 75bc26d20b Use the maxUploadSize in the media upload screen. (#4359)
* Fix a bug where some files sizes were sent as 0.

* Make FileManger.sizeForItem(at:) a UInt.

The docs specifically say that FileAttributeKey.size returns an unsigned long long so I have no idea why we were returning a Double here…

* Add the maxMediaUploadSize property on ClientProxy.

* Use the maxUploadSize to set a target video size and to show a file too big error.

* Refactor media upload parameter order.
2025-07-29 12:18:53 +01:00
Doug 5b3e045e3c Expose isLiveKitRTCSupported on the ClientProxy. (#4238) 2025-06-23 11:21:36 +01:00
Mauro aef91b5bc9 Handle media previews and invite avatars through the account data (#4142)
* added account data media display policy handling to NSE

* pr suggestions

* update compound

* code improvement
2025-05-28 19:51:34 +02:00
Mauro Romito 0f53ad6724 updated SDK and improved report flow
the report flow is now based on the matrix version and the new one will only be used if the SDK checks if the server supports it.
2025-04-30 11:41:19 +02:00
Doug 1557054753 Simplify authentication logic
matrix.org now supports MAS so we don't need the web registration helper anymore.
2025-04-11 11:22:39 +01:00
Mauro Romito 7373eabffb refactored the ClientProxy to:
- throw an error during the init
- to have its init directly instantiate the sync service and the providers

Update ElementX/Sources/Services/UserSession/UserSessionStore.swift

Co-authored-by: Doug <6060466+pixlwave@users.noreply.github.com>

renamed
2025-03-06 14:13:55 +01:00
Mauro 319441d527 Use a static room summary provider to resolve room summaries through id and aliases (#3863)
* trying to debug why sometimes the value

is missing even if it appears in the room list

* static room provider implementation

* set the page size through the init

* removed reset filters on .cancel

since using the sop function is safer
2025-03-04 14:08:15 +01:00
Stefan Ceriu 5e90f67a91 Bump the RustSDK to v25.2.25, address breaking changes from matrix-org/matrix-rust-sdk/pull/4674 2025-02-25 12:40:56 +02:00
Doug 8c07ee35c4 Update the SDK.
Handles changes that removed support for the sliding sync proxy.
2025-02-18 11:55:20 +00:00
Stefan Ceriu f77faee981 User verification state indicators (#3793)
* Introduce a `UserIdentityProxy` and have it combine upstream methods into an easy to digest  `UserIdentityVerificationState`. Use it in a dedicated `VerificationBadge` UI component

* Show a DMs counterpart verification state in the room header

* Show a warning on the room details `People` entry when there are identity verification state violations on any of the members.

* Show verification badges in the room member list

* Show a withdraw verification section on the room member details for users that have pinning violations.

* Remove the verification section from the profile screen as there's no reliable way to keep it up to date
- the underlying Rust SDK Olm Machine can be rebuilt without notice which would break any existing user identity change streams.

* Update preview test snapshots
2025-02-18 08:37:34 +02:00
manuroe 3950cac085 Dual licensing: AGPL + Element Commercial (#3657)
* New LICENSE-COMMERCIAL file

* Apply dual licenses: AGPL + Element Commercial to file headers

* Update README with dual licensing
2025-01-06 11:27:37 +01:00
Mauro e7d4ea0d35 Add alias to public room creation (#3450)
* added the address section

* updated code and strings

* syncing name and address

* improved code

* added a way to reset the state

* better documentation

* update strings

* handling the alias

* alias error state

* update strings

* error handling

* improved the error handling

* new preview tests, even if they do not work well

* improved tests

* unit tests

* pr comments and using the correct value

* fix

* pr comments

* to improve safety and control of the FF

* fixed a test

* updated tests

* update SDK
2024-11-08 15:49:20 +01:00
Doug 8e26718d0b Encryption Flow Coordinators. (#3471)
* Manage the secure backup screens with flow coordinators.

* Add UI tests for the EncryptionSettingsFlowCoordinator.

* Realise that the settings flow can't reset anymore and remove the sub-flow 🤦‍♂️

* Add UI tests for the EncryptionResetFlowCoordinator.
2024-11-04 14:22:50 +00:00