* Add a developer flag for the search tab
Introduces a globalSearchEnabled user preference (off by default) with a toggle in Developer Options, used to gate the new search experience.
* Support search role tabs in the tab coordinator
Migrates the NavigationTabCoordinator to SwiftUI's value-based Tab API and adds an isSearch option so a tab can adopt the iOS 26 .search role, which detaches it into the trailing search button in the tab bar.
* Moves room search to a new screen
Adds a new screen that filters the alternate room summary provider as you type, shows an empty state, and lists matching rooms with their matrix identifier. Supports hardware keyboard selection (arrow keys to move through results, return to open) by reaching into the system search field.
* Present search in a dedicated tab
Adds the search tab to the chats flow on iOS 26 when the flag is enabled, rendered as the detached .search role button. The Cmd+K shortcut now selects this tab, and the home screen's inline search is hidden while the tab is available.
* Remove the old global search screen
The dedicated search tab replaces the Cmd+K floating window, so the GlobalSearchScreen, its window plumbing in the WindowManager, and its presentation in the chats flow are all removed.
* Add a plain list modifier to Compound.
* Move ElementTextFieldStyle into Compound and support more styles from the Figma
- More accurately reflects our Liquid Glass updates.
- Adds support for the .raised style.
* Update Element X snapshots.
* Updates to File Info Bottom Sheet
Removing buttons, changing labels, adding a title
* Update the underlying actions rather than fixing it at the screen-level.
* Fix the media details sheet height now there's a navigation title.
* Record preview snapshots
---------
Co-authored-by: Doug <douglase@element.io>
Co-authored-by: Element CI <ci@element.io>
* create DependenciesProtocol and replace ServiceLocator registration with it
replace mocking calls for ServiceLocator to Dependencies
replace ServiceLocator with instance level calls
replace ServiceLocator configs with TestDependencies config in Tests
replace servicelocator usage in analytics service
replace remaining ServiceLocator calls in unit tests
that depended on the UnitTestAppCoordinator configuration with per suite dependencies instances
fix swiftlint warning
remove remaining references to ServiceLocator
make dependencies properties consistent in tests
delete Dependencies and DependenciesProtocol
fix whitespace modifications
updates from PR feedback
a pass over converting AppSettings and AnalyticsService test instance properties to per test instantiation
fix a missed PR feedback
Sync up after rebase
create DependenciesProtocol and replace ServiceLocator registration with it
replace mocking calls for ServiceLocator to Dependencies
replace ServiceLocator with instance level calls
replace ServiceLocator configs with TestDependencies config in Tests
replace servicelocator usage in analytics service
replace remaining ServiceLocator calls in unit tests
that depended on the UnitTestAppCoordinator configuration with per suite dependencies instances
fix swiftlint warning
remove remaining references to ServiceLocator
make dependencies properties consistent in tests
delete Dependencies and DependenciesProtocol
* AppSettings is instance level mockable now
* replace mocked and preview usages of reset + AppSettings global init with
AppSettings(store: UserDefaultsMock())
* AppSettings.UserDefaultsKeys is now a RawRep struct, making it extensible
* update tests with new AppSettings so it builds
* update remaining AppSettings test/mock inits
* AppSettings.UserDefaultsKey conformed to ExpressibleByStringLiteral
* addressed issues found in first pass ai review
* update AppSettings instantiations after rebase
* fix accessibility tests coordinator after rebase
* Rename to VolatileUserDefaults
* AppSettings init uses mandatory parameter
* Revert UserDefaultsKey to enum
* Add TrackedUserDefaults to be able to reset the defaults object
* Added volatile static func to AppSettings
* Use .volatile() static func instead of full init
* review fixups
* Resolve build issues after rebase
* updated enterprise module
* remove the static reset settings call from the preview tests
---------
Co-authored-by: Mauro Romito <mauro.romito@element.io>
* Timeline: add a Jump to Unread button and a new-message badge on the scroll-to-bottom button.
* Rename scrollToFirstUnread to scrollToReadMarker for consistency with isReadMarkerVisible.
* Cache readMarkerUniqueID and unreadMessageCount as stored properties on TimelineState.
* TimelineViewModel: rename newTimelineItems and drop redundant ordering comment.
* Use Compound chevron icons in TimelineScrollButton.
* Fix TimelineScrollButton layout at large dynamic type sizes.
* Add a trailingAccessory slot to topBanners and use it to dodge banners with the jump-to-read-marker button.
* Put jump-to-read-marker behind a developer-options feature flag.
* Fine-tune TimelineScrollButton sizing and badge colour.
* Remove TimelineScrollButton chevron offset that was compensating for SF Symbol centering.
* Drop the new-messages count, replace with a presence dot.
* Move both timeline scroll buttons to bottom-right and revert topBanners trailingAccessory slot.
* Position TimelineScrollButton badge above for up direction and below for down direction.
* Add long-press mark-as-read pill to the timeline scroll buttons
* Read isSwitchingTimelines from state in updateHasNewMessagesAtBottom.
* Use assertionFailure when scrollToReadMarker is called with no read marker.
* Add TimelineScrollButton preview snapshots.
* (fix) design and various self-review issues
* (fix) suppress scroll button tap after long-press
* (feat) fall back to RoomInfo.fullyReadEventID for jump-to-unread
* (fix) hide jump-to-unread immediately after mark-as-read
* (fix) align with newer matrix-rust-sdk surface
* Bump the RustSDK to v26.05.20
---------
Signed-off-by: Daniel Anderson <daniel.anderson@toptal.com>
Co-authored-by: Stefan Ceriu <stefan.ceriu@gmail.com>
* handle the details to invite users flow.
* implemented the room creation in the invite screen, and its dismissal + navigaton to the newly created room
* updated preview and unit tests
* pr suggestions
The automatically focused keyboard is creating false positives when running accessibility
tests and doesn't bring any value in the previews. Simplest solution is to remove it.
* Hook up Rust's InvalidCheckCode failure to the right state when linking a new device.
* Automatically regenerate a new QR code instead of ending the flow when it expires.
* feat: Render declined calls in DM timeline
* Record preview snapshots
* review: Use CallIntent constant
* review: clean-up
* Record preview snapshots
* review: Move private field to the bottom with MARK: - Private
* review: Male CallIntent a string enum to use rawValue
---------
Co-authored-by: Element CI <ci@element.io>
* 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
* Implemented opening the LLS on our own user when tapping on the banner
* added a test for moving the map as soon as the first update arrives.
* updated preview tests
1. I removed the grey dots for when there is activity in rooms set to mentions or mute.
2. For all unread rooms, I made the message preview text bold for better legibility
3. For rooms with no unreads, I made the font weight regular, again for legibility
We have also mergeg the new room list activity rendering with the existing feature hide unread badge feature flag and provide 3 variations: current production behavior, no badge but bolding, and no bolding and no badge
* Updated placement and type of button
Moved the "X"/Close button from the left to the right, and made it a primary action.
* Update snapshots.
---------
Co-authored-by: Doug <douglase@element.io>
* 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
Add support for homeserver capabilities to disable editing your user profile.
Also updates editable avatar size/formatting to match the latest Figma at the same time.
* SettingsScreen > Update the icon for "Remove this device"
Change the icon from "Sign Out" to "Close"
* Update snapshots.
---------
Co-authored-by: Doug <douglase@element.io>
If the user attempts to invite someone (to a room or creating a DM) whose identity is not cached, we prompt them to make sure this was their intention.