1983 Commits

Author SHA1 Message Date
Mauro Romito 8a4e4d1903 Give the media upload preview a descriptive VoiceOver title
The QLPreviewItem used the media's file name as its title, which VoiceOver
read as cryptic alt text. Provide a descriptive "Photo preview" / "Video
preview" title based on the media type instead.

Addresses #5240, #5241.
2026-06-19 13:45:38 +02:00
Mauro Romito 17da5ff3b7 Keep hidden QuickLook chrome out of VoiceOver focus order
The media upload preview hides the QLPreviewController's navigation bar and
toolbar share button visually, but their buttons stayed in VoiceOver's focus
order. Mark the chrome as accessibility-hidden so it is no longer focusable.

Addresses #5266, #5267.
2026-06-19 13:45:38 +02:00
Stefan Ceriu 7f1b6086ae Search tab (#5754)
* Add a developer flag for the search tab
Introduces a globalSearchEnabled user preference (off by default) with a toggle in Developer Options, used to gate the new search experience.

* Support search role tabs in the tab coordinator
Migrates the NavigationTabCoordinator to SwiftUI's value-based Tab API and adds an isSearch option so a tab can adopt the iOS 26 .search role, which detaches it into the trailing search button in the tab bar.

* Moves room search to a new screen
Adds a new screen that filters the alternate room summary provider as you type, shows an empty state, and lists matching rooms with their matrix identifier. Supports hardware keyboard selection (arrow keys to move through results, return to open) by reaching into the system search field.

* Present search in a dedicated tab
Adds the search tab to the chats flow on iOS 26 when the flag is enabled, rendered as the detached .search role button. The Cmd+K shortcut now selects this tab, and the home screen's inline search is hidden while the tab is available.

* Remove the old global search screen
The dedicated search tab replaces the Cmd+K floating window, so the GlobalSearchScreen, its window plumbing in the WindowManager, and its presentation in the chats flow are all removed.
2026-06-19 13:50:17 +03:00
Mauro 6a381dcef0 Fix some issues with missing a11y labels (#5747)
* add a11y label to the bug report field

* include a11y label to the list row directly

* remove is header trait from poll form question header section

* a11y label added to the create room screen name textfield
2026-06-19 11:48:13 +02:00
Mauro Romito 4ab0f659b2 hide avatar in send invite confirmation view 2026-06-19 11:03:10 +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
Michael 7edca8b5a1 Add a recovery key screen hook. (#5684)
update generateRecoveryKey to take a passphrase option

Wire up AppHooks with recovery key hook

Update xcodeproj

Review fixups

Review fixups

Make the `SecureBackupRecoveryState.viewMode` extension private

Bump the enterprise submodule
2026-06-18 13:28:57 +01:00
Mauro Romito dc29be5898 voiceover reads add avatar when there is no avatar yet 2026-06-16 18:25:37 +02:00
Mauro Romito a87005fe5b add ishHeader trait were required 2026-06-16 17:34:13 +02:00
Mauro Romito 39be0dcfde Set pin a11y improvements 2026-06-16 16:58:44 +02:00
Mauro Romito 8bcc7efc49 Create new room - remove wrong header trait 2026-06-16 15:37:55 +02:00
Mauro Romito b3f0402a4d add a11y labels to media upload preview screen 2026-06-16 13:14:12 +02:00
Stefan Ceriu 3d90a43175 Wrap selected text in a markdown link when pasting a URL over it
Pasting a single link on top of a selection in the message composer now
produces a markdown link, e.g. selecting "Google" and pasting
"google.com" yields "[Google](google.com)". Non-link clipboard
contents and pastes without a selection keep their existing behaviour.
2026-06-16 13:15:04 +03:00
Mauro Romito d22caf1a13 fix preview tests broken by a swiftformat rule, 2026-06-08 13:36:03 +02:00
Mauro Romito 6ec1f0eb10 swiftformat 2026-06-08 13:36:03 +02:00
Doug 097d055dbe Some more tweaks to compound for User Status. (#5708)
* Add a plain list modifier to Compound.

* Move ElementTextFieldStyle into Compound and support more styles from the Figma

- More accurately reflects our Liquid Glass updates.
- Adds support for the .raised style.

* Update Element X snapshots.
2026-06-05 15:59:34 +01:00
Mauro da5360c8e8 Hide user dot and track own user marker in Live Location mode. (#5707)
* added a new tracking mode for following a marker and the logic for switching such tracking mode

* implemented the follow marker tracking mode

* improved and added new tests
2026-06-05 13:51:57 +02:00
Stefan Ceriu ee82ed976e Automatically adjust the ElementCall PiP when changing orientations 2026-06-05 11:05:53 +03:00
Stefan Ceriu 92086d66c3 Add flip options to the MediaUploadPreview image edit screen 2026-06-05 11:05:03 +03:00
Stefan Ceriu 56d5f72f01 Rename RoomTimelineItemFixtures to just TimelineFixtures 2026-06-04 09:14:58 +03:00
Stefan Ceriu 9615e184ad Switch to using proper SDK Mocks everywhere. 2026-06-04 09:14:58 +03:00
Doug 32ccb004d0 Re-order the call buttons to match the Figma and Element Web. (#5696) 2026-06-03 11:53:49 +01:00
Doug e9f66bda37 Use the new crop icon from Compound. (#5691) 2026-06-03 11:11:39 +01:00
Stefan Ceriu a6cad41b12 Remove all underlyingFoo mock property usage (unnecessary) 2026-06-03 08:57:04 +03:00
Stefan Ceriu 6ad1654d97 Convert the old MockTimelineController to the generated TimelineControllerMock 2026-06-03 08:57:04 +03:00
Aaron Thornburgh dc7454d161 Updates to File Info Bottom Sheet (#5667)
* Updates to File Info Bottom Sheet

Removing buttons, changing labels, adding a title

* Update the underlying actions rather than fixing it at the screen-level.

* Fix the media details sheet height now there's a navigation title.

* Record preview snapshots

---------

Co-authored-by: Doug <douglase@element.io>
Co-authored-by: Element CI <ci@element.io>
2026-06-01 14:00:55 +01:00
Mauro Romito 6b584ccf65 use readHeight instead on geometry change in the top section of the home screen 2026-05-29 17:17:31 +02:00
Mauro Romito 63d33efb5e fix the issue where the empty state overlaps the banner if present 2026-05-29 17:49:11 +03:00
Stefan Ceriu 423bd8073f Move more MockTimelineController configuration to the constructor 2026-05-29 17:48:00 +03:00
Doug 46373b1204 Use the same icon in the TimelineReplyView as shown in the File timeline view. (#5665) 2026-05-29 13:26:57 +00:00
Stefan Ceriu f040964d3f Allow the user to forward the same message to multiple rooms at once
This will send the item to the rooms in order they were chosen and only deep link
into the target room if single, otherwise it will just dismiss the forwarding screen
after sending.
2026-05-29 14:27:42 +03:00
Mauro 7093d966b4 Set map tiler URL from well known if available (#5633) 2026-05-28 15:24:58 +02:00
Doug 594d041128 Update the section order in RoomDetailsScreen to match the latest Figma. (#5653)
Also make sure we snapshot the entire thing.
2026-05-28 10:55:39 +01:00
Doug fa67713726 Run SwiftFormat. 2026-05-27 17:11:42 +01:00
Stefan Ceriu 0138fd2a5e Add message sending end editing steps to the user session flow UI test 2026-05-27 18:05:25 +03:00
Doug e0b7f1b3fa A couple of fixes to match the Figma more closely. 2026-05-27 14:30:11 +03:00
Stefan Ceriu da9eda80cd Use Compound icons within the user indicators. 2026-05-27 14:30:11 +03:00
Stefan Ceriu c9317547f8 Replace plain SF Symbols with Compound counterparts 2026-05-27 14:30:11 +03:00
Stefan Ceriu 15eb4a112e Use only compound icons in the TimelineReplyView 2026-05-27 14:30:11 +03:00
Mauro Romito 277f0cc5bc Fix for the content not updating after an edit, restore the usage of the content based identifier in the formatted body for components. 2026-05-26 15:54:07 +02:00
Stefan Ceriu a89445edae Fix #5636 - Clear the composer after editing a message or caption 2026-05-26 13:20:57 +03: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 edd7130a97 Fix for overlapping timestamp when last block is not plainText (#5629)
* fix for the overlapping timestamp when the last block is not plain text

* remove id and use offset as iterator in the foearch of the components
2026-05-22 17:56:32 +02:00
Doug 86b51fb104 Remove the CertificateValidatorHook. (#5624) 2026-05-22 15:26:54 +01:00
Stefan Ceriu 77c5aba326 Forward current composer text to the new poll form to serve as the question/topic 2026-05-22 16:46:42 +03:00
Stefan Ceriu ac20ff0fc3 Forward current composer text to the media upload preview screen as captions 2026-05-22 16:46:42 +03:00
Stefan Ceriu a8cff4ded2 Improve how the composer is cleared after sending a message. 2026-05-22 16:46:42 +03:00
Doug 1eb58a465e Revert "Fixing Room List in Spaces View Not Rendering Some Rooms (#5595)" (#5616)
This reverts commit 96230fcc36.

* Use the newer geometryGroup instead of drawingGroup.
2026-05-22 14:32:41 +01:00
Michael 22d14ff8e4 AppSettings are Mockable (#5589)
* create DependenciesProtocol and replace ServiceLocator registration with it

replace mocking calls for ServiceLocator to Dependencies

replace ServiceLocator with instance level calls

replace ServiceLocator configs with TestDependencies config in Tests

replace servicelocator usage in analytics service

replace remaining ServiceLocator calls in unit tests

that depended on the UnitTestAppCoordinator configuration with per suite dependencies instances

fix swiftlint warning

remove remaining references to ServiceLocator

make dependencies properties consistent in tests

delete Dependencies and DependenciesProtocol

fix whitespace modifications

updates from PR feedback

a pass over converting AppSettings and AnalyticsService test instance properties to per test instantiation

fix a missed PR feedback

Sync up after rebase

create DependenciesProtocol and replace ServiceLocator registration with it

replace mocking calls for ServiceLocator to Dependencies

replace ServiceLocator with instance level calls

replace ServiceLocator configs with TestDependencies config in Tests

replace servicelocator usage in analytics service

replace remaining ServiceLocator calls in unit tests

that depended on the UnitTestAppCoordinator configuration with per suite dependencies instances

fix swiftlint warning

remove remaining references to ServiceLocator

make dependencies properties consistent in tests

delete Dependencies and DependenciesProtocol

* AppSettings is instance level mockable now

* replace mocked and preview usages of reset + AppSettings global init with

AppSettings(store: UserDefaultsMock())

* AppSettings.UserDefaultsKeys is now a RawRep struct, making it extensible

* update tests with new AppSettings so it builds

* update remaining AppSettings test/mock inits

* AppSettings.UserDefaultsKey conformed to ExpressibleByStringLiteral

* addressed issues found in first pass ai review

* update AppSettings instantiations after rebase

* fix accessibility tests coordinator after rebase

* Rename to VolatileUserDefaults

* AppSettings init uses mandatory parameter

* Revert UserDefaultsKey to enum

* Add TrackedUserDefaults to be able to reset the defaults object

* Added volatile static func to AppSettings

* Use .volatile() static func instead of full init

* review fixups

* Resolve build issues after rebase

* updated enterprise module

* remove the static reset settings call from the preview tests

---------

Co-authored-by: Mauro Romito <mauro.romito@element.io>
2026-05-22 15:14:08 +02:00
Stefan Ceriu 14f7f4a6bb Fix small multiple_closures_with_trailing_closure warning 2026-05-21 17:59:04 +03:00