Commit Graph

1552 Commits

Author SHA1 Message Date
Doug 33f8ce2759 Fix a couple of missing UserStatus values. (#5944)
* Fix the missing UserStatus in RoomMemberProxy.

* Use the hero's status for a room's AvatarHeaderView.
2026-07-30 10:33:11 +01:00
Mauro Romito 55bbc301ef update sdk to 26-7-28 2026-07-28 19:40:53 +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 4d7d61dae7 Render galleries with non-visual attachments as a list (#5932)
* Render galleries with non-visual attachments as a list

Adds GalleryListView (with GalleryDivider) for galleries containing a file or audio item, extracting the shared FileTypeIconView from FileRoomTimelineView. GalleryRoomTimelineView picks the list vs the grid via usesListLayout. Tapping to open the preview lands in a follow-up.

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

* pr suggestions

---------

Co-authored-by: svetoslav.mitov <svetoslav.mitov@sportinno.com>
2026-07-27 18:46:15 +02:00
Mauro 274da99787 Render image and video in galleries as a grid (#5929) 2026-07-24 18:47:39 +02:00
Doug 5d0343c480 Gate user status behind server support as well as the feature flag. (#5920) 2026-07-24 12:23:54 +00:00
Mauro Romito 4a9cd02fbc Add the gallery timeline item rendered as a placeholder
Introduces the GalleryRoomTimelineItem and its typed GalleryItem model (reusing the existing per-message content types), builds it in the RoomTimelineItemFactory and routes it through RoomTimelineItemView. For now it renders as a placeholder; the grid/list media views and the full-screen preview land in follow-up PRs.

Co-authored-by: svetoslav.mitov <svetoslav.mitov@sportinno.com>
2026-07-24 11:51:00 +02:00
Doug bf498a5d18 Small tweaks to the Presence feature. (#5918) 2026-07-23 08:40:48 +01:00
Mauro 6967f99626 Content scanner also checks for thumbnails (#5911)
* scan also thumbnails for medias

* pr suggestion
2026-07-22 16:43:08 +02:00
Jared L cff46137b9 Report user presence on app lifecycle transitions (#5838)
* Report user presence on app lifecycle transitions

Adds a PresenceReporter driven by the app lifecycle handlers and the sharePresence setting: online when foreground-active and sharing, unavailable when backgrounded and sharing, offline when not sharing. Sends are immediate, deduped, and serialized latest-wins. Background app refresh and the NSE seed the process presence to offline so their sync requests carry no presence side effect. Presence rides on the SDK's process-global state, so every sync path is covered without touching sync lifecycle.

Signed-off-by: Jared L <48422312+lhjt@users.noreply.github.com>

* Add presence reporter tests

Pins the presence reporter invariants: the never-online sweep with sharing off, an immediate online send on foreground-active, dedupe of repeated states, latest-wins ordering of serialized sends, and the NSE offline seed.

Signed-off-by: Jared L <48422312+lhjt@users.noreply.github.com>

* wip: address review comments

Signed-off-by: Jared L <48422312+lhjt@users.noreply.github.com>

* refactor: remove obsolete presence heartbeat

Remove the shared activity snapshot, heartbeat refresh, and notification-extension freshness policy while retaining the session-scoped presence service and its serialized lifecycle reporting. Restore the NSE's intermediate one-time offline seed so the cleanup remains buildable ahead of the final sync-presence correction.

Signed-off-by: Jared L <48422312+lhjt@users.noreply.github.com>

* fix: make notification extension presence-neutral

Configure the built NSE client with offline sync presence without sending an immediate presence update. Keep notification setup non-fatal when presence configuration fails and remove the temporary production test seam.

Signed-off-by: Jared L <48422312+lhjt@users.noreply.github.com>

* chore: restore application lifecycle logging

Restore the pre-existing foreground lifecycle diagnostics that were removed during the presence refactor. Keep presence reporting session-scoped and clarify that background refresh configures the client's sync presence without an immediate update.

Signed-off-by: Jared L <48422312+lhjt@users.noreply.github.com>

---------

Signed-off-by: Jared L <48422312+lhjt@users.noreply.github.com>
2026-07-22 15:23:36 +01:00
Valere Fedronic 0f72fe3511 Add support for active call item rendering in timeline (#5775)
* feat(timeline): Add support for active call item rendering in timeline

* Update active call as per design (show raw count of members)

* fixup project files

* revert unexpected generated mocks change

* code review

* Record preview snapshots

* revert changes on project.yml

* post rebase fix
2026-07-22 15:13:46 +01:00
Doug a6466e80e0 Update the SDK and use RoomHero.status and subscribeToOwnProfile. (#5905)
* Update the SDK and hook up the status from Room Heroes.

Also start requesting profiles via sss when the feature flag is enabled.

* Add support for subscribing to your own profile.
2026-07-22 12:18:02 +01: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
Doug 85f28d017d Update the SDK and handle API breaks. (#5871)
* Update the SDK and handle API breaks.

* Rename sdkUserThing to rustUserThing for consistency.

* Add user status ClientProxy methods.

* Rename UserStatus.UserSet to UserStatus.Raw.
2026-07-14 16:35:37 +01:00
Doug f776ea7133 Fix a bug where rooms couldn't be opened when returning to the foreground whilst offline. (#5867)
The stores weren't being resumed.
2026-07-14 15:32:19 +01:00
Mauro Romito b730815842 disable creation and enabling of e2ee if remote preference for disabling it is true 2026-07-13 15:51:13 +02:00
Timo 3ba5c08c13 Use dark theme for Element Call (#5860)
* Use dark theme for element Call

* Make sure only the call screen is shown in dark mode.

Otherwise when you go into PiP the entire app has become dark.

---------

Co-authored-by: Doug <douglase@element.io>
2026-07-13 13:28:28 +01:00
Doug 23b3fc62cb Show user statuses in the rooms list. 2026-07-10 17:59:42 +01:00
Doug 64908ae642 Show user statuses in the timeline. 2026-07-10 17:59:42 +01:00
Doug 2c4775f357 Add the UserStatus and a status field on UserProfile/RoomMember/TimelineItemSender. 2026-07-10 17:59:42 +01:00
Doug 5915713a02 Introduce a build setting to detect Nightly builds. (#5852)
* Allow the AppIconBanner tool to be called with purely the build number.

And use that for the Element Pro Nightly.

* Use a build setting to determine Nightly builds.
2026-07-09 13:56:26 +01:00
Matthew Hodgson 834938f585 don't keep re-prompting the user to migrate if they get spontaneously logged out. (#5844) 2026-07-07 15:28:40 +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
Stefan Ceriu dd6f8bc281 Group RoomTimelineItemFactory public methods under Public/Private marks
Move the protocol methods to the top under a Public mark and gather the
helpers beneath a Private mark.
2026-07-03 13:39:45 +03:00
Stefan Ceriu 02d9ed1f0e Address search PR review comments
- Drop the redundant searchService coordinator/view model parameter; derive it from the client proxy.
- Rename the globalSearch avatar size to search.
- Lift the query observation streams out of their tasks.
- Restore the appeared and updateVisibleRange comments.
- Use CompoundIcon defaults and a scaledFrame for media previews.
- Simplify the result mapping with compactMap(makeResult) and drop unsupported events by returning nil.
- Move the preview helpers beneath the previews.
2026-07-03 13:39:45 +03:00
Stefan Ceriu 9457f2c5fc Index polls, stickers and more event types in search results
The SDK now surfaces polls, stickers, redactions and live location shares
alongside plain messages. Map them to their preview content instead of
dropping them as unsupported events.
2026-07-03 13:39:45 +03:00
Stefan Ceriu 4fbfc87551 Add a Messages tab to global search
Split global search into Rooms and Messages tabs. The Messages tab lists
matching events with the room's name and avatar, a sender-prefixed preview,
rich media (image/video/audio/file) previews, and a loading indicator, then
paginates as you scroll. Queries are debounced and the previous one is
superseded so late results can't clobber a newer search.
2026-07-03 13:39:45 +03:00
Stefan Ceriu 5851100f07 Expose a global search service from the client
Wrap the SDK's SearchService in a SearchServiceProxy that publishes typed
message results and paginates on demand, expose it on the ClientProxy, and
enable the search index store on the session. Also opens up the timeline item
factory's message content builder so the proxy can reuse it.
2026-07-03 13:39:45 +03:00
Mauro 5ea4b46604 Content Scanner Service (#5826)
* implemented the content scanner service with caching and a way to use in the state store context

* fix swiftformat comment enforcing

* pr suggestions
2026-07-02 17:12:39 +02:00
Doug f2d08c23a3 Run swiftformat. 2026-07-02 13:09:34 +01:00
Doug ace05b97d0 Combine the user's own display name/avatar into a single profile.
This is in preparation for adding the user status fields into the profile.
2026-07-02 13:09:34 +01:00
Doug b8860baf49 Rename SearchUsersResultsProxy to SearchUsersResults. It also proxies nothing. 2026-07-02 13:09:34 +01:00
Doug 3ef66cdd05 Rename UserProfileProxy to UserProfile. It's a pure struct and proxies nothing.
Also remove the redundant `userID` property given `id` already exists (for Identifiable conformance).
2026-07-02 13:09:34 +01:00
Doug 123661537a Make LinkNewDeviceScreen fall back to the App Lock PIN code when there's no passcode. (#5794)
* Fall back to the AppLock PIN code when there's no passcode.

* Add extra tests on the LinkNewDeviceFlowCoordinator.

* Misc tweaks for clarification.

* Regenerate snapshots.
2026-07-01 10:13:18 +01:00
Stefan Ceriu 7097ceb910 Fix voice message recording crashes caused by an isolation assertion failure 2026-07-01 10:35:41 +03:00
Stefan Ceriu 89de0f3f2b Use PostHogConfig(projectToken:host:) instead of the deprecated init
PostHog deprecated `init(apiKey:host:)` in favour of `init(projectToken:host:)`.
The project token is the same value as the old API key, so this is a label-only
swap with no behaviour change.
2026-06-29 18:10:30 +03:00
Stefan Ceriu 95319d13b7 Make the zip and file attaching bug report service steps concurrent 2026-06-29 18:01:57 +03:00
Stefan Ceriu ad8d70ebe0 Fix MediaLoader EXC_BAD_ACCESS ongoingRequests crashes 2026-06-29 16:06:54 +03:00
Doug f05fd41c36 Replace the UserPreference property wrapper with the new macro version. 2026-06-29 10:34:32 +01:00
Doug f3da459d16 Ensure that the current user is the device owner before linking a new device. (#5773) 2026-06-26 16:24:18 +01:00
Stefan Ceriu 0bd32d24fd Switch to a custom HomeserverReachability instead of different publishers 2026-06-24 20:49:49 +03:00
Stefan Ceriu 3ccaa04554 Don't show the server unreachable banner while the client is suspended
homeserverReachabilityPublisher now reports unreachable while suspended so media loading parks instead of failing against a closed store. The reachability banner was keyed off the same publisher, so pausing the client would surface a spurious "Server unreachable" message.

Expose a separate homeserverConnectivityPublisher derived from the sync service state alone (it stays reachable while suspended) and key the banner off that, keeping the suspend-aware publisher for gating work that needs an open store.
2026-06-24 20:49:49 +03:00
Stefan Ceriu 05922f1bc7 Fix media loading failures when retrying with a closed store
`homeserverReachabilityPublisher` was driven directly by the sync service state so stopping sync on pause still reported .reachable. MediaProvider.loadImageRetryingOnReconnection would then retry against a closed store, fail, and bail out permanently because it treated the reachable state as a non-recoverable error.

Make reachability a function of both the desired service state and the latest sync state, computed in one place: store the sync state in the listener and recompute reachability from it, reporting unreachable whenever the client isn't meant to be running. Recompute on suspend and on resume.
2026-06-24 20:49:49 +03:00
Stefan Ceriu 0a3944deaa Don't crash when recording starts with an invalid input format
AudioRecorder.startRecording crashed AVAudioEngine
(IsFormatSampleRateAndChannelCountValid) when the input node reported an
invalid format - e.g. a zero sample rate when no input route is
available. Bail out with an error before connecting nodes or installing
the tap.
2026-06-22 16:54:52 +03:00
Stefan Ceriu b4fe69a0c9 Don't crash when the tone manager directories can't be created
NotificationToneManager.init force-crashed (fatalError) when
createDirectory failed, e.g. a sandbox permission error (NSCocoaError
513). Log the error instead of killing the app. The underlying cause is
acknowledged and will be treated separately.
2026-06-22 16:54:52 +03:00