The call-from-Recents handling was wired entirely to the deprecated
INStartVideoCallIntent (the activity-type registration and the cast), which
also meant the app never handled the modern INStartCallIntent that superseded
it in iOS 13. Switch both to INStartCallIntent and derive isVoiceCall from its
callCapability. Clears the deprecation warning.
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.
`NSMutableAttributedString.enumerateAttribute(_:in:options:using:)` runs its
closure synchronously on the calling thread and its `using:` parameter isn't
`@Sendable`. The explicit `@Sendable` on the closure literals was therefore
unnecessary and was the only thing triggering the "capture of non-Sendable
NSMutableAttributedString" and "mutation of captured var in concurrently-
executing code" warnings. Removing it clears all six with no behaviour change.
The explicit SDK usage means macros fail to compile for macOS. The SDK will be inferred by the destination platform.
Note: We no longer use a plugin so I've remove that argument too.
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.
`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.
* Update AGENTS.md concurrency section for Swift 6.2 migration
* Add a caveman update line to AGENTS.md.
---------
Co-authored-by: Doug <douglase@element.io>
The field relied on its placeholder for a label, which VoiceOver only reads
while empty. Set a persistent accessibility label so it's always announced.
Addresses #5256.
The address field already had an accessibility label, but the section's
helper text and validation error were only shown in a separate footer and
weren't conveyed to VoiceOver when focusing the field. Compose them into the
field's accessibility hint.
Addresses #5258.
scrollToOldestItem targeted (timelineItemsIDs.count - 1, section: 1) even
when the table's data source hadn't applied that section yet, raising an
out-of-bounds NSRangeException. Scroll against the table's actual section
and row counts instead.
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.
Both PhotoLibraryPicker and DocumentPicker reported failures via .error
but still emitted .selectedMediaAtURLs([]) when every selected item
failed to load or export (e.g. an iCloud photo that isn't downloaded, or
a document that fails the security-scoped temp copy) - an empty "success"
that consumers had to defend against. Skip that emission in both, and
report .error for PhotoLibraryPicker's previously silent
missing-content-type case so the user gets feedback.
LoadableImageContent.data(handler:) used MainActor.assumeIsolated to read
the loader's content, which crashes (libdispatch precondition) when
Kingfisher invokes the provider off the main thread, and fatalError'd
when the content wasn't GIF data. Hop onto the main actor and return a
failure instead. The handler is @Sendable per Kingfisher's protocol.
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.
cmd+k jumps to the search tab but left users with no way back. Pressing
escape in the search field now returns to the tab they came from (never
into search itself).
Escape is handled at the search field's pressesBegan, alongside the
existing arrow-key navigation, since the focused UIKit field swallows
SwiftUI keyboard shortcuts.
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.
The address field already had an accessibility label, but the section's
helper text and validation error were only shown in a separate footer and
weren't conveyed to VoiceOver when focusing the field. Compose them into the
field's accessibility hint.
Addresses #5258.
* Added a chevron to collapsed call buttons in the DM
This makes the context menu more intuitive and easy to find. Inspired by the collapsed state of call buttons in Whatsapp that I saw recently
* Shortening video/voice call button strings
Currently the text is unnecessarily long, I have reduced to button text
# Conflicts:
# ElementX/Sources/Generated/Strings+Untranslated.swift
* Move translations to localazy
---------
Co-authored-by: Stefan Ceriu <stefan.ceriu@gmail.com>