* 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>
* Simplify QR errors even more and use the correct error state for deviceAlreadySignedIn.
* Remove the pre-defined padding on TitleAndIcon and use it in the QRCodeLoginScreen too.
* Update FullscreenDialog to allow different horizontal padding in each section.
* Add timeline item action for copying a media caption.
* Fix the action colours when long pressing a timeline item.
Nice side effect: Reasonable sized buttons when button shapes are enabled.
* Re-arrange the Timeline Item Menu.
* Add timeline item menu snapshots for media items.
- Move button styles to Compound
- Rename text style to AuthenticationTextStyle as its only in the auth flow.
- Add the brand colour locally for now until its included in Compound.
* Update snapshots.
---------
Co-authored-by: Stefan Ceriu <stefan.ceriu@gmail.com>
* Fixes#1727 - Layout issues caused by the new timelineMediaFrame
* Better handle small media thumbnails
* fixed an issue where sometimes the reply gets greedier than the content
---------
Co-authored-by: Mauro Romito <mauro.romito@element.io>
* just added the isThreaded property to message based events
* done but I should add a bunch of tests for images and videos and locations
* handling for image and videos, but locations might need to be double checked
* code improvement
* better tests and removed code that is not used, we need to fix first the appearence of replies
* bubble style is solved, we now need plain style
* also added plain style
* better handling for bubble style
* rounded corner only for bubbles in location
* fix for wrong aspect ratio in replies
* all changes done
* better testing
* swift format
* changelog
* PR comments and rebase.
* Simplify corner radius on location timeline view.
---------
Co-authored-by: Doug <douglase@element.io>
* Add expand/collapse UI for reactions
- Adds a CollapsibleFlowLayout for controlling the layout
- Adds tests for this layout and some mocks for testing layouts generally
- Improves the rendering of the reaction buttons which were not pixel perfect
- Adds the UI for the expand collapse buttons including the count of hidden items in the collapsed state.
* Add comment for reactionsCollapsed binding.
* Remove Flow and simplify implementation
- Remove SwiftUI-Flow
- Add strings by importing from Localyse
- Remove count on expand button as requires GeometryReader and can cause loops
- Don't use GeometryReader for hiding reactions with opacity(just put them way off screen for now)
- Fix unit and UI tests
* Address PR comments
- use synthesized inits
- use rows rather than lines for naming flow layout
- other naming improvements
- reactions were already rendered in another ui test, removing my test on favour of those and updating the screenshots for those.
* App polish
- Skeleton avatar colour on app switching.
- Bug report icon and string.
- Semi-bold font on room list timestamps.
- Room attachments button spacing and alignment.
- Replace link tint with semi-bold font in AnalyticsSettingsScreen.
- Semi-bold font on Invites button.
- Add padding to media attachment sheet.
- Message composer header layout tweaks.
- Remove indicator after changing homeserver with an MXID.
- Change copy permalink string.
- Formatting of link in Analytics Prompt.
- Remove indicator after changing homeserver with an MXID.
- Change copy permalink string.
- Formatting of link in Analytics Prompt.
- Only semi-bold the room timestamp when unread.
- Tweak the colour of the date separator.
- Add activity indicator to toast style user indicator.
* Delete deprecated font tokens.
* Migrate from primaryContent to textPrimary/iconPrimary.
* Migrate from links to textLinkExternal.
* Migrate from secondaryContent to textSecondary/iconSecondary.
* Migrate from accent to textActionPrimary.
- Some uses changed to textPrimary or iconPrimary as necessary.
- Some manual tints removed now that that Sentry is fixed.
* Migrate alert to textCriticalPrimary/iconCriticalPrimary.
* Migrate from brand to textActionAccent/iconAccentTertiary.
* Migrate from background to bgCanvasDefault or text/iconOnSolidPrimary
* Migrate system to bgSubtleSecondary.
* Remove ElementUIColors and obsolete migrated colours.
* Migrate tertiaryContent/quaternaryContent/quinaryContent to Compound.
* Migrate bubblesYou/bubblesNotYou to use Compound.
* Update Compound.
(+10 squashed commits)
[ba1d3160] Update timeline item action menu reaction UI
[410315ac] Move away from item bound action meus plus various tweaks following code review
[c25cd998] Add emoji reactions to the new timeline item action menu
[57001f49] Prevent timeline view layouts from dismissing the action menu
[d1e70538] Various UI tweaks
[652f4143] Switch to a long press gesture, move the header outside of the scroll view
[569a485c] Workaround timeline item action menu presentation state not being stored
[80c29567] Add currently selected item information in the TimelineItemMenu
[ff7790ec] Fixes#974 - Replace the timeline item contex menu with a bottom sheet
[ba1d3160] Rename TimelineItemContextMenu to TimelineIteMenu so that git correctly interprets it
* Remove unused code in OnboardingScreen.
* Add FullscreenDialog layout and use in auth flow.
Bump minimum OS to 16.4/13.3.
* Add dynamic layout based on dynamic type size.