Commit Graph

56 Commits

Author SHA1 Message Date
Mauro 831234865b Fix Swift 6.4 warnings (#6240) 2026-10-01 10:55:19 +02:00
Mauro b1ed870474 Support for Xcode 27 on CI (#6217)
* Run the tests on iOS 27.0

Bump the required simulator OS in the preview, UI and Compound tests, and the CI tool's default OS, from 26.5 to 27.0. Test devices stay the same.

iOS 27 writes transcoded videos 146 bytes larger, so update the expected sizes in MediaUploadingPreprocessorTests.

* Build and test on CI with Xcode 27

Select Xcode 27 in ci_common.sh and move every macOS workflow to the xcode-27 runner image, as macos-26 doesn't include Xcode 27. The Compound workflow now also creates its simulator on the iOS 27.0 runtime.

The xcode-27 runners are slower, so give the unit, Enterprise, Compound and snapshot recording jobs longer timeouts.

* Fix the preview snapshot layout on iOS 27

On iOS 27 the hosting controller applies the window's safe area when rendering, but the snapshot size comes from sizeThatFits, which ignores it. Component previews were shifted down and clipped at the bottom. Disable the hosting controller's safe area regions for these snapshots so the measured and rendered layouts match.

swift-snapshot-testing also renders into a window without a scene, and on iOS 27 a navigation stack in such a window reserves space for a large title it never shows, leaving a gap below the navigation bar. Attach the render window to the app's scene until swift-snapshot-testing handles it.

The invite users and add rooms screens sized their selected items row from a measured width stored in state, which is zero on the first layout pass, so snapshots could draw the row empty. Use containerRelativeFrame instead. The add rooms search previews now also wait for their results, and the search previews that show a clear button get a small precision tolerance, as it renders inconsistently in snapshots.

* Re-record the preview snapshots on iOS 27.0

Recorded on an iPhone SE (3rd generation) simulator running iOS 27.0 with Xcode 27.0 (27A266a). The changes come from iOS 27 rendering: text anti-aliasing, hyphenation and line breaking, navigation bars and toggles that now render in snapshots, lazy stacks that were blank on iOS 26, and pseudo-language locale formatting.

* Fix the UI tests on iOS 27

iOS 27 no longer exposes accessibility identifiers on SwiftUI menu items, so the space exploration test now finds them by label within the menu. On iPad, the start chat search field keeps focus after submitting and can swallow the next tap, so retry the tap if the create room screen doesn't appear.

* Re-record the UI test snapshots on iOS 27.0

Recorded on iPhone 17 and iPad (A16) simulators running iOS 27.0 with Xcode 27.0. The changes come from iOS 27 styling, like the keyboard height and glass borders. This also removes the iPad app lock setup snapshots, which have been orphaned since those tests stopped running on iPad.

* Fix the accessibility tests crashing on iOS 27

The accessibility tests' previews wrapper kept its ImageRenderer alive across the awaits that follow the render. On iOS 27, releasing it at that point tears down its view graph outside of a SwiftUI update, which hits an assertion and crashes the app. Release the renderer as soon as the image has been rendered.

* Keep the accessibility tests' image renderers alive on iOS 27

Releasing the ImageRenderer straight away wasn't enough: on iOS 27, releasing one that rendered a preview crashes SwiftUI whichever context it happens in. Keep the renderers alive instead. Each test launches a fresh app, so they only live for the one test.

* Share the UI tests' app settings with their mock user session

Since the user session flow reads its settings from UserSettings, the UI tests' mock user session was wrapping a fresh volatile AppSettings instead of the one the tests configure. The flags that skip onboarding weren't picked up, so every user session UI test got stuck on the notifications permission screen.

* Re-record the Compound snapshots on iOS 27.0

Apply the same safe area fix as the app's preview tests, so size-that-fits snapshots aren't clipped on iOS 27, and re-record the snapshots on an iPhone SE (3rd generation) simulator running iOS 27.0 in English (US).

* Fix a race reading the keyboard in the accessibility tests

On iOS 27 the QR code login screen's keyboard can be dismissing between checking that it exists and reading its frame, which fails the test. Snapshot it in a single query instead.
2026-09-29 17:02:48 +02:00
Mauro 9093631f8b Periphery cleanup (#5893) 2026-07-20 11:16:11 +02:00
Mauro 0a77ba6c90 Swift format enforce isEmpty rule (#5843)
* swift format enforce isEmpty rule

* revert scheme

* use trailing closure
2026-07-06 15:39:16 +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
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
Doug fa67713726 Run SwiftFormat. 2026-05-27 17:11:42 +01:00
Stefan Ceriu da9eda80cd Use Compound icons within the user indicators. 2026-05-27 14:30:11 +03:00
Mauro Romito 51030efa73 remove appSettings from SpaceScreen 2026-02-26 16:29:52 +01:00
Mauro Romito ce97fec477 remove space FFs 2026-02-26 16:29:52 +01:00
Mauro 0e40cc7008 Fix A11y tests (#5104)
* replace NavigationStack with ElementNavigationStack to allow the content to be rendered without a NavigationStack in a11y tests

* fix a11y tests

* update xcodeproject

* swiftformat fix

* use iOS 26.1 for CI

* use a wrapper to solve the issue for a11y tests

* ElementNavigationStack only uses the trick in DEBUG mode, and added a swiftlint rule to prevent the usage of NavigationStack
2026-02-13 16:45:58 +01:00
Doug b34832f7f8 Re-write the space flow state machine configuration and cover it more in UI tests. (#5098)
* Use the old state machine configuration style.

* Test starting the space settings flow in UI tests.

* Test starting the create space room flow in UI tests.
2026-02-12 13:19:20 +00:00
Mauro Romito db3a6239e1 renamed function to resetRoomList 2026-02-09 18:22:41 +01:00
Mauro Romito c9cd4cb1dd 1. Updated the space selection UI 2. Paginate spaces after room creation 3. Pre-selected space creation defaults to space members access. 2026-02-09 18:22:41 +01:00
Doug 4b4b060bff Space tweaks. (#5068) 2026-02-09 11:54:41 +00:00
Doug bff328554a Use our own JoinRule type which doesn't include the reserved .private case. (#5056)
* Stop using Rust's JoinRule.private in mocks.

It isn't used anywhere else (see MSC4413 for more context).

* Use our own JoinRule (and AllowRule) types.

* Update ElementX/Sources/Services/Room/JoinRule.swift

Co-authored-by: Stefan Ceriu <stefan.ceriu@gmail.com>

---------

Co-authored-by: Stefan Ceriu <stefan.ceriu@gmail.com>
2026-02-06 13:54:53 +00:00
Mauro Romito 8f6506ced0 refactored the flows to use a state and an event for the transfer ownership screen 2026-01-28 15:42:17 +01:00
Mauro Romito 9de49bad9e implemented the logic to transfer ownership from a space 2026-01-28 15:42:17 +01:00
Stefan Ceriu 23062901c0 Update files following swiftformat upgrade 2026-01-27 12:50:57 +02:00
Doug 06f37dacae Remove the protocol for SpaceServiceRoom given its a struct type. (#5000)
* Remove the protocol for SpaceServiceRoom given its a struct type.

* Fix a few missed mocks in the unit tests.
2026-01-26 09:45:46 +00:00
Doug 3b231339cd Make sure the selected/available rooms are updated when adding space children fails part way through. (#4997)
* Make sure the available rooms are updated if adding space children fails part way through.

* Additionally handle the case where removing rooms fails part way through.
2026-01-23 17:36:26 +00:00
Mauro Romito ab1ed9e671 added the create button in the empty state of the space screen and refactored some code 2026-01-23 15:18:55 +01:00
Mauro Romito d012380b01 implemented the flow to create room in a selected space 2026-01-23 15:18:55 +01:00
Doug cea365ac97 Add the empty state to SpaceScreen. (#4985)
* Rename PaginationState.timelineEndReached to PaginationState.endReached.

* Rename PaginationState to TimelinePaginationState.

Also renames PaginationStatus to PaginationState so that a TimelinePaginationState consists of the forward and backward pagination states.

* Add the empty state to SpaceScreen.

Only has 1 of the 2 buttons for now.
2026-01-22 12:37:34 +00:00
Doug 43770ab480 Replace a debugging visibility check with the real condition. (#4982) 2026-01-21 17:16:23 +00:00
Doug 6e2ff7ae56 Include the Members and Add Rooms screens in the spaces UI tests. (#4981)
* Expand the space flow UI tests to include the add rooms screen.

Also fixes some failures in these tests due to the room/space title now being a button.

* Expand the space flow UI tests to include the space members screen.

* Reset AppSettings before running preview tests.
2026-01-21 15:24:54 +00:00
Doug 3dccdf6685 Add space management to the flows. (#4978)
* Add the menu entries to add/remove rooms to/from a space.

* Add a user indicator to SpaceAddRoomsScreen.

* Reset the SpaceRoomListProxy after adding/removing any children.

* Calm the animations down a bit when entering EditMode on the SpaceScreen.
2026-01-21 12:46:02 +00:00
Doug c5b1c5d1bd Use more Liquid Glass in the room/space screen toolbars (#4965)
* Add a glass style to the Room/Space header view on iOS 26.

* Update snapshots and fix the join call button.
2026-01-16 19:29:27 +00:00
Doug 6a75d80081 Add the initial implementation for managing spaces. (#4963)
This isn't hooked up into the flows yet.
2026-01-16 15:29:27 +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 Romito f2fc164e2b tapping on the space title will open the settings (if permissions are available) 2025-12-19 11:20:06 +01:00
Mauro 096e2d1713 Space Settings: Leave Room (#4700)
* Implementation for all navigations inside the space settings aside the left space action

# Conflicts:
#	ElementX/Sources/FlowCoordinators/SpaceSettingsFlowCoordinator.swift

* refactored the leave space view to use its own view model

# Conflicts:
#	ElementX.xcodeproj/project.pbxproj

* implemented the leave space view model also in the settings screen, and corrected some tests

* reusing the details coordinator for the space settings screen

* leave space from settings implemented

* fix project

* minor pr fixes

* code improvements
2025-11-07 12:11:21 +01:00
Mauro dc9ab56972 Space Settings UI tweaks (#4678)
* design tweaks for the space settings flow

* pr suggestions

* update proj
2025-10-31 12:52:56 +01:00
Mauro Romito 401ff49882 pr suggestions 2025-10-30 15:23:03 +01:00
Mauro Romito b4f3e0c860 Basic implementation of the UI, navigation wil be implemented in the next PR 2025-10-30 15:23:03 +01:00
Mauro Romito dfd757f2b6 implemented the basics of the flow coordinator, the logic and the navigation flow to get to the space settings view 2025-10-30 15:23:03 +01:00
Mauro 0bc832f8a6 Display members of a space (#4629)
* Present members of a space

* present the members modally from the space

* Implemented a room members flow coordinator to make such flow more modular and reusable

this is required since we will need to reuse this module also in the space settings, and later we could also replace it in the RoomFlowCoordinator.

* the implementation to support at least the SpaceFlowCoordinator is done a follow UP should do the refactor.

* remove modal usage from the flow, we want to always be a navigation flow

* Improved and implemented the room navigation in the members flow coordinator

* pr suggestions and refactored the start chat flow and the invite screen

* updated copies for managing room members

* Update ElementX/Sources/Screens/Spaces/SpaceScreen/SpaceScreenViewModel.swift

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

---------

Co-authored-by: Doug <6060466+pixlwave@users.noreply.github.com>
2025-10-27 13:17:50 +01:00
Doug a9796cce68 Use the editor toolbar role on iOS 26 instead of left aligning the header by frame. (#4647)
The weird back button animation doesn't happen anymore 🥳
2025-10-22 11:36:14 +01: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 f01f31954d Make the SpaceRoomListProxy publish its SpaceRoomProxy updates. (#4607)
Also removes an unused `parent` parameter that was missed when removing the parent name and includes some regenerated snapshots that were missed in the last PR.
2025-10-09 17:22:43 +01:00
Doug b496955f6b The space tweaks continue! (#4606)
* Update a string on the space announcement sheet.

* Don't show space rooms after using the join button in the space room list.

* Allow the Deselect All button to Select (almost) All as well.

* Fix the cells in the leave space sheet when there are only admin rooms.
2025-10-09 16:56:54 +01:00
Doug 27f7085dc1 Even more space tweaks (#4588)
* Bring back the button to share a space on iOS 26.

* Remove the setting and disable the space tab on iOS 17.

(The tab bar is broken on iPadOS 17).
2025-10-07 14:34:10 +01:00
Doug cf19e30429 Use the space room name computed by the SDK. (#4589) 2025-10-07 14:33:37 +01:00
Doug c03ed528ba More space tweaks (#4584)
* Remove the room count everywhere.

* Remove the parent name from restricted spaces.
2025-10-07 10:57:53 +01:00
Doug 0f38f303ab Minor space tweaks (#4577)
* Hide the space ShareLink on iOS 26 for now.

* Don't allow the last admin to leave a space.
2025-10-07 08:16:48 +01:00
Doug a226c99492 Implement the flow for leaving a space. (#4568) 2025-10-03 16:37:09 +01:00
Doug 621b72f162 Joining a space from the room flow. (#4563)
* Add the More menu to SpaceScreen.

And a simple way to leave a space for testing.

* Start a space flow when accepting a space invite from the room flow.

* Minimise the tab bar on iOS 26 when scrolling down.

* Enable spaces by default!
2025-10-02 10:58:38 +01:00
Doug 12dc6f42ba Add some new space properties. (#4544)
* Use the via property on SpaceRoom.

* Fall back to the canonical alias as a space room name if needs be.

* Use SpaceRoom.isDirect for computing the name/avatar.

* Pass in the parent space as a workaround for no restricted join rules.
2025-09-26 10:03:11 +01:00
Doug 27f4c25194 Add the JoinRoomScreen into the SpaceFlowCoordinator. (#4513)
* Add the JoinRoomScreen into the SpaceFlowCoordinator.

The screen needs further work to make the join work.

* Fix the tests completing the join flow with the right action.
2025-09-17 15:12:45 +01: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