Commit Graph

182 Commits

Author SHA1 Message Date
Mauro 346a1e8ebb Redaction reason (#6098) 2026-09-07 18:57:05 +02:00
Mauro Romito 668fbe1827 pr suggestions 2026-08-07 12:35:57 +02:00
Matthew Hodgson 58e1a0212d Indent blank lines and address avatar crop review feedback
Indent the new method's blank lines to satisfy SwiftFormat's
indent-blank-lines rule, which failed the Tests CI jobs.

Also address review findings on the crop itself:
- Request a 256pt thumbnail box at both donation sites so cropping a
  scaled (aspect-fit) thumbnail to its minor axis keeps enough
  resolution for the share sheet's circle.
- Round the draw offsets to whole pixels so odd-sized crops blit
  instead of resampling.
- Log when fetched avatar data can't be decoded rather than silently
  swapping in the placeholder, and document the non-obvious
  format.scale pinning.
2026-08-07 12:35:57 +02:00
Matthew Hodgson 39805d080e Fix broken avatar aspect ratio in the share sheet and notifications
The media repo serves thumbnails with the scale method, so avatars keep
their source aspect ratio. The system stretches whatever INImage we
donate to fill a circle, distorting any non-square avatar in the share
sheet's conversation suggestions (and notifications, which are donated
the same image).

Centre-crop donated avatars to a square before handing them to the
system, in both the timeline's send message intent donation and the
NSE's communication context.
2026-08-07 12:35:57 +02:00
Mauro ae795df530 Allow previews in the timeline to include filtered galleries (#5943)
* remove the usage of the timeline kind override in favour of getting it properly from the timeline view model

* allow the previews to include gallery items filtered by the allowed types when started outside the gallery

sss

asa

* fix for actions not being forwarded to the timeline right

* pr suggestions
2026-07-30 13:49:22 +02:00
Mauro Romito 7ea9aeb174 Open a full-screen preview when tapping a gallery item
Tapping a gallery tile/row opens the existing media preview scoped to that gallery's attachments, paging between them. Introduces a typed MediaPreviewItemID (replacing the stringly-typed preview identifier) and a gallery-scoped TimelineMediaPreviewDataSource; the tap routes through TimelineInteractionHandler/TimelineViewModel. Non-previewable (.other) items are skipped without shifting the tapped index.

Co-authored-by: svetoslav.mitov <svetoslav.mitov@sportinno.com>

just use id instead of previewID

removed horrible multiline ternary

pr suggestions

remove redundant code

remove empty caption display + gallery uses the appropriate media timeline actions
2026-07-28 16:49:08 +02:00
Mauro b5b28b9986 Support sending gallery messages behind a feature flag (#5909)
dds sending of multi-media "gallery" messages, gated behind the new galleryEnabled developer option (Developer Options → Room, off by default). Rendering of received galleries ships in a separate PR.

Wires sendGallery through TimelineProxy/TimelineController onto the SDK's Timeline.sendGallery.
MediaUploadPreviewScreen sends selected items as one gallery when the flag is on.
Co-authored with the original author of #5601.

NOTE: This PR allows to send gallery messages, but they won't be rendered without the gallery timeline item PR.
2026-07-21 17:25:30 +02:00
Mauro Romito 5d1e15f308 Revert "Support sending gallery messages behind a feature flag"
This reverts commit 6a2ed331fa.
2026-07-21 12:44:03 +02:00
Mauro Romito 6a2ed331fa Support sending gallery messages behind a feature flag
Adds the ability to send a gallery message (multiple attachments in one message)
via the media upload preview, wired through the timeline controller/proxy to the
SDK's sendGallery. Gated by a `galleryEnabled` developer flag (default off),
matching Element X Android — with the flag off, attachments are sent as
individual messages as before.

Extends the community PR #5601, rebased onto develop. Tracking:
element-hq/element-meta#3201

Co-authored-by: svetoslav.mitov <svetoslav.mitov@sportinno.com>
2026-07-21 12:09:07 +02:00
Mauro Romito 762e5ad0ff Revert "Support sending gallery messages behind a feature flag"
This reverts commit 9a61d870d6.
2026-07-21 12:00:03 +02:00
Mauro Romito 9a61d870d6 Support sending gallery messages behind a feature flag
Adds the ability to send a gallery message (multiple attachments in one message)
via the media upload preview, wired through the timeline controller/proxy to the
SDK's sendGallery. Gated by a `galleryEnabled` developer flag (default off),
matching Element X Android — with the flag off, attachments are sent as
individual messages as before.

Extends the community PR #5601, rebased onto develop. Tracking:
element-hq/element-meta#3201

Co-authored-by: svetoslav.mitov <svetoslav.mitov@sportinno.com>
2026-07-21 11:34:44 +02:00
Mauro 9093631f8b Periphery cleanup (#5893) 2026-07-20 11:16:11 +02:00
svetoslav-sportinno 30e4e6339d Add max selections support for polls (#5726) 2026-06-22 13:39:12 +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 dc91a0d5e9 Move the old MockTimelineController to the mocks folder and TimelineControllerMock 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
Stefan Ceriu 423bd8073f Move more MockTimelineController configuration to the constructor 2026-05-29 17:48:00 +03:00
Stefan Ceriu 4830424427 Move MockTimelineController signalling to a new SignallingTimelineItemProviderMock
This allows for testing more of a flows and using a real TimelineController in
a lot of the UI tests
2026-05-29 17:48:00 +03:00
Stefan Ceriu bb2cbb6592 Generate a mock for the TimelineControllerProtocol 2026-05-29 17:48:00 +03: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
Stefan Ceriu a89445edae Fix #5636 - Clear the composer after editing a message or caption 2026-05-26 13:20:57 +03:00
Stefan Ceriu a8cff4ded2 Improve how the composer is cleared after sending a message. 2026-05-22 16:46:42 +03:00
Michael dfebb4719c Compiler Warning Reductions (#5609)
* Reduce warnings in AttributedStringBuilderTests

(cherry picked from commit e1f32b2b1df147c93207e01df5c8fec4046b0f48)

* Fixed Sentry warning

(cherry picked from commit e45c3002b2331a6f2d363de61a12377316078602)

* JoinRule and AllowRule conform to Sendable

(cherry picked from commit 27c67c27b944df11adc17bdd405e442e8c50b0d6)

* AudioConverterProtocol conform to Sendable

(cherry picked from commit 352bdab15db424c632538eb3140858eae9fdfb15)

* TimelineControllerProtocol conform to Sendable

(cherry picked from commit 07a927745624db4bab3cf68842027e12177be70b)

* Resolved some AI review notes

(cherry picked from commit 8d3ac820754a6126785e639a98c8c1fcf86ef77f)

# Conflicts:
#	ElementX/Sources/Other/SendableConformance/SendableBox.swift
#	ElementX/Sources/Other/SendableConformance/WeakSendableBox.swift
2026-05-22 10:56:30 +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
Michael ff5dcb040d Replace the ServiceLocator with direct dependency injection (#5548)
Removes the ServiceLocator singleton and instead directly injects the dependencies it was holding for more control over instantiation of the various component subtrees and better visibility over how they're being used.
2026-05-14 09:45:49 +03:00
Mauro 602d779e3a Render LiveLocations in the map (#5394) 2026-04-14 18:27:34 +02:00
Mauro Romito 9e68da4ff0 implementing static location sheet 2026-03-09 18:14:41 +01:00
Mauro bbbb2e9dee Refactor and redesign Location Sharing Screen (#5155)
* refactored the static location screen to the location sharing screen

# Conflicts:
#	UnitTests/Sources/LocationSharingScreenViewModelTests.swift

# Conflicts:
#	ElementX.xcodeproj/project.pbxproj

* implemented a custom pin with an overlayable view

* implemented the render of the user when the location is sender instead of the pin type

* removed description and body they are not used at all.

* reimplemented single button for sharing this or user location + implemented an experimental way to update annotations

* removed unnecessary @Suite description

* implemented a way to display the alert on top of the sheet and added a spinner to the center user location button

* fixed alerts strings

* fixed a failing test

* improved preview tests
2026-03-06 12:51:16 +01:00
Stefan Ceriu 25d5a70b00 Try to prevent timelineProvider timing crashes on update listeners. 2026-02-05 09:22:56 +02:00
Stefan Ceriu 23062901c0 Update files following swiftformat upgrade 2026-01-27 12:50:57 +02: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 419c18cabb Fix a potential bug where the token couldn't be refreshed when the cached server /versions had expired. (#4687)
* Update SDK mocks for UniFFI 0.30.0

* Update the SDK.

* Update the SDK again

Includes a temporary workaround that patches the SDK's generated Swift files so that our tests don't crash:
https://github.com/element-hq/matrix-rust-components-swift/commit/3f0075fb8acaf202755512dfbafc28024e5125b2
2025-11-03 19:09:31 +00:00
Mauro 17c2dc96d0 Update SDK to 25.10.21 (#4642)
* update sdk

* fix normalized waveform

* added a comment on normalization

* running on MacOS-26

* Revert "running on MacOS-26"

This reverts commit 1c8ececf0b84200193eaa2ab205094215b168060.
2025-10-22 11:27:26 +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 40367eeec9 fixed an issue where threads would not do the initial focus and an issue where the timeline did throw an error by mistake 2025-10-09 11:15:37 +02:00
Doug eda37eb626 Use the Emoji/Map/Poll view models. (#4458)
* Toggle emojis in the EmojiPickerScreenViewModel.

* Send locations in the StaticLocationScreen.

* Send polls in the PollFormScreen.
2025-09-03 16:52:28 +01:00
Doug 01033cf53e Add support for Space avatars. (#4362) 2025-07-29 12:20:13 +01:00
Stefan Ceriu 128f4f2110 Improve attachment sending methods signatures 2025-07-24 14:55:34 +03:00
Stefan Ceriu ffe2f726e7 Interact with polls through the TimelineController as well (creation still disabled on threaded timeline as it's not yet supported by the SDK) 2025-07-24 14:55:34 +03:00
Stefan Ceriu 35195abc35 Add message sending methods to the TimelineController that will automatically use the correct timeline proxy instance internally. 2025-07-24 14:55:34 +03:00
Stefan Ceriu a4c0b7f91c Reorder the TimelineController send methods 2025-07-24 14:55:34 +03:00
Stefan Ceriu 1fc15a220d Remove the threadRootEventID associated value from all the RoomFlowCoordinatorStateMachine states and replace them with a UserInfo passed TimelineController. 2025-07-24 14:55:34 +03:00
Stefan Ceriu 3fcbc8c60a Transition voice messages to the new in thread sending mechanism 2025-07-24 14:55:34 +03:00
Stefan Ceriu d32be1f728 Send all receipts through the active timeline and remove unecessary making of a room as read (already handled) 2025-07-04 16:04:46 +03:00
Stefan Ceriu 21e07e164c Setup composer actions within threaded timelines. 2025-06-10 08:57:08 +03:00
Mauro Romito 26a7d5ac82 pr suggestions 2025-06-06 10:49:29 +02:00
Mauro Romito 155b47e849 tombstoned and upgraded rooms implementation
added tests

tombstoned room avatar
2025-06-06 10:49:29 +02:00
Stefan Ceriu 29cfcb0b85 Better document the various protocols and classes involved in dealing with room timelines. 2025-05-23 16:08:18 +03:00
Stefan Ceriu 972084aaf7 Rename the TimelineProvider to TimelineItemProvider 2025-05-23 16:08:18 +03:00