diff --git a/ElementX.xcodeproj/project.pbxproj b/ElementX.xcodeproj/project.pbxproj index 8919f9e8b..fe8126f1c 100644 --- a/ElementX.xcodeproj/project.pbxproj +++ b/ElementX.xcodeproj/project.pbxproj @@ -9342,7 +9342,7 @@ repositoryURL = "https://github.com/element-hq/matrix-rust-components-swift"; requirement = { kind = exactVersion; - version = 25.09.18; + version = "25.09.19-2"; }; }; 701C7BEF8F70F7A83E852DCC /* XCRemoteSwiftPackageReference "GZIP" */ = { @@ -9358,7 +9358,7 @@ repositoryURL = "https://github.com/element-hq/element-call-swift"; requirement = { kind = exactVersion; - version = "0.16.0-rc.2"; + version = "0.16.0-rc.3"; }; }; 821C67C9A7F8CC3FD41B28B4 /* XCRemoteSwiftPackageReference "emojibase-bindings" */ = { diff --git a/ElementX.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/ElementX.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index 1ed6d68ae..3879da925 100644 --- a/ElementX.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/ElementX.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -59,8 +59,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/element-hq/element-call-swift", "state" : { - "revision" : "2bf81a3c0a4a0cf6347290f2476a30e0ed96eb47", - "version" : "0.16.0-rc.2" + "revision" : "48523e02e3ea1e9d1b8c1ca8652c37ff64299187", + "version" : "0.16.0-rc.3" } }, { @@ -158,8 +158,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/element-hq/matrix-rust-components-swift", "state" : { - "revision" : "859a9ae1428c0aae88588fd7b46e4bdc50dd7bee", - "version" : "25.9.18" + "revision" : "6da13e26194148a51ff21024df5946e1641be209", + "version" : "25.9.19-2" } }, { diff --git a/ElementX/Sources/Application/Settings/AppSettings.swift b/ElementX/Sources/Application/Settings/AppSettings.swift index 1ee1523a8..af82f8873 100644 --- a/ElementX/Sources/Application/Settings/AppSettings.swift +++ b/ElementX/Sources/Application/Settings/AppSettings.swift @@ -63,6 +63,7 @@ final class AppSettings { case developerOptionsEnabled case nextGenHTMLParserEnabled case linkPreviewsEnabled + case latestEventSorterEnabled // Doug's tweaks 🔧 case hideUnreadMessagesBadge @@ -389,6 +390,9 @@ final class AppSettings { @UserPreference(key: UserDefaultsKeys.linkPreviewsEnabled, defaultValue: false, storageType: .userDefaults(store)) var linkPreviewsEnabled + @UserPreference(key: UserDefaultsKeys.latestEventSorterEnabled, defaultValue: false, storageType: .userDefaults(store)) + var latestEventSorterEnabled + @UserPreference(key: UserDefaultsKeys.developerOptionsEnabled, defaultValue: isDevelopmentBuild, storageType: .userDefaults(store)) var developerOptionsEnabled } diff --git a/ElementX/Sources/Mocks/Generated/SDKGeneratedMocks.swift b/ElementX/Sources/Mocks/Generated/SDKGeneratedMocks.swift index b38245da5..751d34493 100644 --- a/ElementX/Sources/Mocks/Generated/SDKGeneratedMocks.swift +++ b/ElementX/Sources/Mocks/Generated/SDKGeneratedMocks.swift @@ -17941,6 +17941,77 @@ open class RoomListSDKMock: MatrixRustSDK.RoomList, @unchecked Sendable { } } + //MARK: - entriesWithDynamicAdaptersWith + + var entriesWithDynamicAdaptersWithPageSizeEnableLatestEventSorterListenerUnderlyingCallsCount = 0 + open var entriesWithDynamicAdaptersWithPageSizeEnableLatestEventSorterListenerCallsCount: Int { + get { + if Thread.isMainThread { + return entriesWithDynamicAdaptersWithPageSizeEnableLatestEventSorterListenerUnderlyingCallsCount + } else { + var returnValue: Int? = nil + DispatchQueue.main.sync { + returnValue = entriesWithDynamicAdaptersWithPageSizeEnableLatestEventSorterListenerUnderlyingCallsCount + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + entriesWithDynamicAdaptersWithPageSizeEnableLatestEventSorterListenerUnderlyingCallsCount = newValue + } else { + DispatchQueue.main.sync { + entriesWithDynamicAdaptersWithPageSizeEnableLatestEventSorterListenerUnderlyingCallsCount = newValue + } + } + } + } + open var entriesWithDynamicAdaptersWithPageSizeEnableLatestEventSorterListenerCalled: Bool { + return entriesWithDynamicAdaptersWithPageSizeEnableLatestEventSorterListenerCallsCount > 0 + } + open var entriesWithDynamicAdaptersWithPageSizeEnableLatestEventSorterListenerReceivedArguments: (pageSize: UInt32, enableLatestEventSorter: Bool, listener: RoomListEntriesListener)? + open var entriesWithDynamicAdaptersWithPageSizeEnableLatestEventSorterListenerReceivedInvocations: [(pageSize: UInt32, enableLatestEventSorter: Bool, listener: RoomListEntriesListener)] = [] + + var entriesWithDynamicAdaptersWithPageSizeEnableLatestEventSorterListenerUnderlyingReturnValue: RoomListEntriesWithDynamicAdaptersResult! + open var entriesWithDynamicAdaptersWithPageSizeEnableLatestEventSorterListenerReturnValue: RoomListEntriesWithDynamicAdaptersResult! { + get { + if Thread.isMainThread { + return entriesWithDynamicAdaptersWithPageSizeEnableLatestEventSorterListenerUnderlyingReturnValue + } else { + var returnValue: RoomListEntriesWithDynamicAdaptersResult? = nil + DispatchQueue.main.sync { + returnValue = entriesWithDynamicAdaptersWithPageSizeEnableLatestEventSorterListenerUnderlyingReturnValue + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + entriesWithDynamicAdaptersWithPageSizeEnableLatestEventSorterListenerUnderlyingReturnValue = newValue + } else { + DispatchQueue.main.sync { + entriesWithDynamicAdaptersWithPageSizeEnableLatestEventSorterListenerUnderlyingReturnValue = newValue + } + } + } + } + open var entriesWithDynamicAdaptersWithPageSizeEnableLatestEventSorterListenerClosure: ((UInt32, Bool, RoomListEntriesListener) -> RoomListEntriesWithDynamicAdaptersResult)? + + open override func entriesWithDynamicAdaptersWith(pageSize: UInt32, enableLatestEventSorter: Bool, listener: RoomListEntriesListener) -> RoomListEntriesWithDynamicAdaptersResult { + entriesWithDynamicAdaptersWithPageSizeEnableLatestEventSorterListenerCallsCount += 1 + entriesWithDynamicAdaptersWithPageSizeEnableLatestEventSorterListenerReceivedArguments = (pageSize: pageSize, enableLatestEventSorter: enableLatestEventSorter, listener: listener) + DispatchQueue.main.async { + self.entriesWithDynamicAdaptersWithPageSizeEnableLatestEventSorterListenerReceivedInvocations.append((pageSize: pageSize, enableLatestEventSorter: enableLatestEventSorter, listener: listener)) + } + if let entriesWithDynamicAdaptersWithPageSizeEnableLatestEventSorterListenerClosure = entriesWithDynamicAdaptersWithPageSizeEnableLatestEventSorterListenerClosure { + return entriesWithDynamicAdaptersWithPageSizeEnableLatestEventSorterListenerClosure(pageSize, enableLatestEventSorter, listener) + } else { + return entriesWithDynamicAdaptersWithPageSizeEnableLatestEventSorterListenerReturnValue + } + } + //MARK: - loadingState open var loadingStateListenerThrowableError: Error? diff --git a/ElementX/Sources/Screens/Settings/DeveloperOptionsScreen/DeveloperOptionsScreenModels.swift b/ElementX/Sources/Screens/Settings/DeveloperOptionsScreen/DeveloperOptionsScreenModels.swift index 64047363a..bdf91b26e 100644 --- a/ElementX/Sources/Screens/Settings/DeveloperOptionsScreen/DeveloperOptionsScreenModels.swift +++ b/ElementX/Sources/Screens/Settings/DeveloperOptionsScreen/DeveloperOptionsScreenModels.swift @@ -52,6 +52,7 @@ protocol DeveloperOptionsProtocol: AnyObject { var fuzzyRoomListSearchEnabled: Bool { get set } var lowPriorityFilterEnabled: Bool { get set } var knockingEnabled: Bool { get set } + var latestEventSorterEnabled: Bool { get set } var nextGenHTMLParserEnabled: Bool { get set } var linkPreviewsEnabled: Bool { get set } diff --git a/ElementX/Sources/Screens/Settings/DeveloperOptionsScreen/View/DeveloperOptionsScreen.swift b/ElementX/Sources/Screens/Settings/DeveloperOptionsScreen/View/DeveloperOptionsScreen.swift index 469fac597..3e1134da1 100644 --- a/ElementX/Sources/Screens/Settings/DeveloperOptionsScreen/View/DeveloperOptionsScreen.swift +++ b/ElementX/Sources/Screens/Settings/DeveloperOptionsScreen/View/DeveloperOptionsScreen.swift @@ -62,6 +62,11 @@ struct DeveloperOptionsScreen: View { Toggle(isOn: $context.lowPriorityFilterEnabled) { Text("Low priority filter") } + + Toggle(isOn: $context.latestEventSorterEnabled) { + Text("Latest event sorter") + Text("Requires app reboot") + } } Section("Timeline") { diff --git a/ElementX/Sources/Services/Room/RoomSummary/RoomSummaryProvider.swift b/ElementX/Sources/Services/Room/RoomSummary/RoomSummaryProvider.swift index 43c0caaaf..7ec694cd6 100644 --- a/ElementX/Sources/Services/Room/RoomSummary/RoomSummaryProvider.swift +++ b/ElementX/Sources/Services/Room/RoomSummary/RoomSummaryProvider.swift @@ -89,10 +89,12 @@ class RoomSummaryProvider: RoomSummaryProviderProtocol { self.roomList = roomList do { - listUpdatesSubscriptionResult = roomList.entriesWithDynamicAdapters(pageSize: UInt32(roomListPageSize), listener: SDKListener { [weak self] updates in - guard let self else { return } - diffsPublisher.send(updates) - }) + listUpdatesSubscriptionResult = roomList.entriesWithDynamicAdaptersWith(pageSize: UInt32(roomListPageSize), + enableLatestEventSorter: appSettings.lowPriorityFilterEnabled, + listener: SDKListener { [weak self] updates in + guard let self else { return } + diffsPublisher.send(updates) + }) // Forces the listener above to be called with the current state setFilter(.all(filters: [])) diff --git a/UnitTests/Sources/RoomSummaryProviderTests.swift b/UnitTests/Sources/RoomSummaryProviderTests.swift index bc8e96dc1..dbb46c9de 100644 --- a/UnitTests/Sources/RoomSummaryProviderTests.swift +++ b/UnitTests/Sources/RoomSummaryProviderTests.swift @@ -109,7 +109,7 @@ final class RoomSummaryProviderTests: XCTestCase { let dynamicAdaptersResult = RoomListEntriesWithDynamicAdaptersResultSDKMock() dynamicAdaptersResult.controllerReturnValue = dynamicEntriesController roomList = RoomListSDKMock() - roomList.entriesWithDynamicAdaptersPageSizeListenerReturnValue = dynamicAdaptersResult + roomList.entriesWithDynamicAdaptersWithPageSizeEnableLatestEventSorterListenerReturnValue = dynamicAdaptersResult roomList.loadingStateListenerReturnValue = .some(.init(state: .notLoaded, stateStream: .init(noPointer: .init()))) roomSummaryProvider.setRoomList(roomList) } diff --git a/project.yml b/project.yml index 5edbc851a..a760eb600 100644 --- a/project.yml +++ b/project.yml @@ -68,7 +68,7 @@ packages: # Element/Matrix dependencies MatrixRustSDK: url: https://github.com/element-hq/matrix-rust-components-swift - exactVersion: 25.09.18 + exactVersion: 25.09.19-2 # path: ../matrix-rust-sdk Compound: url: https://github.com/element-hq/compound-ios @@ -80,7 +80,7 @@ packages: # path: ../matrix-analytics-events EmbeddedElementCall: url: https://github.com/element-hq/element-call-swift - exactVersion: 0.16.0-rc.2 + exactVersion: 0.16.0-rc.3 Emojibase: url: https://github.com/matrix-org/emojibase-bindings minorVersion: 1.4.2