Commit Graph

261 Commits

Author SHA1 Message Date
Stefan Ceriu 4355307ba0 Add support for <details> and <summary> tags (#6077) 2026-09-03 11:47:12 +03:00
Mauro 86bc4d54b6 Autoplay the next voice message if it is the next timeline item. (#6089) 2026-09-01 18:00:14 +02:00
Doug 9c65d36101 Use the ClientFactory pattern everywhere replacing raw ClientBuilders.
# Conflicts:
#	ElementX/Sources/Services/UserSession/UserSessionStore.swift
#	NSE/Sources/NSEUserSession.swift
2026-08-25 16:40:21 +01:00
Stefan Ceriu 925e61e40c Preserve the blank lines typed after a list
The newline to break replacement only matched paragraph to paragraph, so a blank
line after a list was dropped and the text following it glued to the last item.
Only a following paragraph is matched, because without a blank line its text
would have continued the last item instead of starting a paragraph of its own.
2026-08-24 15:45:19 +03:00
Stefan Ceriu d3b12561b3 Fix XCUITest text entry on all paths 2026-08-11 14:42:48 +03:00
Stefan Ceriu d57c376b21 Reinforce text typing within XCUITests 2026-08-11 12:52:00 +03:00
Stefan Ceriu 66f68093f0 Remove the createSpan method entirely
As it's easier to live without it than to deal with the API redesign or or misuse
panics.
2026-08-10 13:23:17 +03:00
Mauro 9093631f8b Periphery cleanup (#5893) 2026-07-20 11:16:11 +02:00
Doug 80ad39e877 Fix UI tests (#5862)
* Fix UI tests compilation error.

* Update UI Snapshots.
2026-07-10 18:12:05 +01:00
Mauro 5fd4551099 Scanning states for the media events timeline screen (#5847)
* implemented the scanning states for the media events timeline screen

* add mock urls to the URL.mock...
2026-07-08 11:51:56 +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
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
Mauro Romito 3aedd0ccff swiftformat now enforces newlines for ifs 2026-06-19 15:28:27 +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
Stefan Ceriu 0ce7a5ea13 Log Sentry crash events through MXLog
Mirror crashes into our own logs via Sentry's beforeSend hook so the full crash
log ships with rageshakes. Adds a SentryEvent extension to extract the formatted
crash log from the event.
2026-06-16 12:13:10 +03:00
Mauro Romito c2909aa9b8 bump rte to 2.42.0 2026-06-11 11:42:40 +02:00
Mauro Romito 44284de1e7 migrate the share extension to swift 6 2026-06-08 16:01:54 +02:00
Doug fa67713726 Run SwiftFormat. 2026-05-27 17:11:42 +01: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
Quentin Gliech 2082e71888 Recognise dragged iOS screenshots as images instead of raw data
When dragging the floating screenshot preview into a room, iOS hands us
a provider whose `suggestedName` is e.g. `Screenshot 2026-05-22 at
14.49.40`. `NSString.pathExtension` returns `"40"`, so the previous
`!pathExtension.isEmpty` check treated the timestamp's trailing segment
as a real extension. The file got written without `.jpg`/`.png`, and the
`MediaUploadingPreprocessor` then fell back to `application/octet-stream`
which is why screenshots showed up as a "data" tile.
2026-05-25 11:01:28 +03: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
Mauro 2462ddea85 Swift 6 migration for NSE (#5608)
* swift 6 support for NSE and concurrency safe implementations for it

* enforcing required Sendable conformance for swift 6 migration in NSE

* use Mutex to access the string builder cache

* use an async stream to update timeline items diffs

* fix for Sendable appHooks
2026-05-21 20:21:57 +02:00
Mauro Romito a4a857003c use isDM from the SDK to determine if a spaceRoom, a joinedRoom or a notificationItem are from a dm room. 2026-05-14 13:47:44 +02:00
Mauro Romito 686753721e new implementation based on the usage of NSTextAttachment to allocate space for the timestamp 2026-05-12 14:46:18 +02:00
Mauro Romito deac31e48d remove code related to the previous bidi usage implementation of whitespaces for the timestamp label 2026-05-12 14:46:18 +02:00
Mauro Romito d5170ae4cc Revert "use isDm from the SDK to determine if a room is a direct one to one room."
This reverts commit 58d0841bedb9cc40bd5880a76f3cc1f56c3b8bdb.
2026-05-06 13:04:11 +02:00
Mauro Romito b5d9f03ad0 use isDm from the SDK to determine if a room is a direct one to one room. 2026-05-06 13:04:11 +02:00
Richard van der Hoff 9a2a852af3 Promote "history sharing on invite" out of developer options (#5480)
* Enable key-share-on-invite irrespective of feature flag

* Remove feature-flag dep: warning on starting chat with new people

* Remove feature-flag dep: invite from room member details

* Remove feature-flag dep: warning on new users in invite screen

* Remove feature-flag dep: from room details screen

* Remove feature-flag dep: starting chat from user profile screen

* Remove feature-flag dep: timeline info on forwarded keys

* Remove feature-flag dep: RoomScreenModel

* Remove `enableKeyShareOnInvite` from AppSettings

* Remove `enableKeyShareOnInvite` feature flag

* Remove outdated comments

* Update preview test room snapshots as their header now includes the history sharing icon
2026-04-27 14:43:18 +03:00
Mauro bfb1036aa0 LLS Sheet implementation (#5420)
* Add LiveLocationSheet and refactor existing views to share code

* Implement logic for highlighting a specific LLS from a user once selected in the sheet

* Updated tests, project and added new previews for the LLS sheet.

# Conflicts:
#	PreviewTests/Sources/__Snapshots__/PreviewTests/liveLocationRoomTimelineView.Bubbles-iPad-pseudo.png
#	PreviewTests/Sources/__Snapshots__/PreviewTests/liveLocationRoomTimelineView.Bubbles-iPhone-pseudo.png

* add Equatable conformance to CLLocationCoordinate2D
2026-04-17 11:13:16 +00:00
Mauro Romito d7f8d6d890 reactively determine with a timer if the lls timeline item has expired or not.
Move mockToday410/420/430 to private Date extension in LiveLocationRoomTimelineView

Agent-Logs-Url: https://github.com/element-hq/element-x-ios/sessions/d2136882-1acc-455d-a363-815e0fb73e89

Co-authored-by: Velin92 <34335419+Velin92@users.noreply.github.com>

fix
2026-03-31 14:29:04 +02:00
manuroe 3d58aa0afb Use single typeText call to speed up tests execution 2026-03-30 10:11:49 +02:00
Mauro b8d337e4ce Render the live location timeline item (#5209)
* created the data for the timeline item

# Conflicts:
#	ElementX/Sources/Other/Logging/Tracing.swift
#	ElementX/Sources/Services/Authentication/AuthenticationService.swift
#	ElementX/Sources/Services/Authentication/LinkNewDeviceService.swift

* Implemented the LLS timeline item

* updated preview tests

* pr and design suggestions

* previewscrollview is debug only
2026-03-24 10:34:00 +01:00
Mauro dfee18e511 Rename Sign Out to Remove Device + Update SDK 26.03.18 (#5280)
* update the sdk

* updated preview tests

# Conflicts:
#	ElementX/Sources/Screens/Timeline/View/Style/TimelineItemSendInfoLabel.swift
#	ElementX/Sources/Screens/Timeline/View/TimelineItemViews/LiveLocationRoomTimelineView.swift

* update sdk to 26.03.18 + regenerated preview tests after sign out copy change

* updated UI tests

* pr suggestions
2026-03-18 17:34:45 +01:00
Stefan Ceriu ca00a7a9d7 Update the RustSDK to v26.03.02 2026-03-02 18:14:21 +02:00
Doug 11f9162e0a Update the SDK. (#5141) 2026-02-24 16:29:30 +00:00
Doug 7532a792b7 Add boot detection in the NSE and use this to inform the user that there may be more notifications. (#5054)
* Add an initial implementation of the receivedWhileOfflineNotification.

* Only deliver a single receivedWhileOffline notification per boot and clarify the API.

* Add a 15-minute threshold for the receiveWhileOfflineNotification.
2026-02-06 15:18:09 +00:00
Doug 1c738c4457 Fix a bug where the app wouldn't retry when the server rate-limits its requests. (#5022)
Change the retry limit to 3.

Without this the SDK immediately fails when rate-limited instead of waiting and trying again.
2026-01-30 10:37:23 +00:00
Stefan Ceriu 23062901c0 Update files following swiftformat upgrade 2026-01-27 12:50:57 +02:00
Stefan Ceriu cf79cb9b01 Horizontally scrollable code blocks (#5001)
* Remove attributed string backed codeblock background color

* Add code block support to attributed string componentization

* Render code blocks within their own custom horizontal scroll view within the timeline

* Update preview test snapshots

* Introduce a attributed string component type instead of a 2 different booleans.
2026-01-26 12:39:55 +02:00
Stefan Ceriu 29dfba140d Fix #4946 - Linkification strips trailing brackets from URLs 2026-01-12 20:49:31 +02:00
Doug c1bb838517 Add support for linking new devices in the QRCodeLoginScreen. (#4891)
* Adds the remaining parts for showing/scanning a QR code to link a new device.

* Refactor the QRCodeLoginService to work the same way as the LinkNewDeviceService.
2026-01-07 12:18:39 +00:00
Doug dc29b5bc7e Add a Log Files entry to the Usage sizes. (#4921) 2026-01-06 21:39:39 +00:00
Doug d130dffaf3 Remove eraseToStream now that any AsyncSequence is available to us. (#4836)
* Remove `eraseToStream` now that `any AsyncSequence` is available to us.

* Remove the now unnecessary backport of Mutex.

* Silence a couple more deprecation warnings.
2025-12-10 18:33:15 +00:00
Skye Elliot af2985c8ad Set trust requirement even if setEncryption is false. (#4823)
* fix: Set trust requirement even if `setEncryption` is `false`.

- Calls `builder.decryptionSettings` with sender trust requirement,
  even if `setEncryption` is false`.
- Fixes https://github.com/element-hq/element-x-ios/issues/4702

* docs: Add doc comment explaining necessity of fix.

* feat: Set `roomKeyRecipientStrategy` alongside trust requirement.
2025-12-09 09:17:50 +00:00
Doug d907ca7a79 Update the date separators to use "Today", "Yesterday" etc for messages in the past 7 days. (#4785)
* Update the date separators to use "Today", "Yesterday" etc for messages in the past 7 days.

* Fix the observation tests.
2025-11-26 10:47:29 +00:00
Mauro 7a1d4a08fb Threaded notifications (#4644)
* implemented grouping

* implemented presenting the thread

* improved the implementation by reusing the presentation action

* add Thread group to DMs to differentiate from non threaded messages of the same DM

* name for a threaded notification in group room

* focus event when tapping on a notification

* pr suggestions

* document
2025-10-23 15:28:45 +02: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
Mauro Romito 94c42c81cc revert observable to a pre ios 26 implementation 2025-09-30 12:26:43 +02:00
Mauro Romito 78c3ea9696 more fixes and preview tests updated 2025-09-26 16:38:55 +03:00