Update the SDK and enable event permalinks. (#2748)

This commit is contained in:
Doug
2024-04-26 09:59:01 +01:00
committed by GitHub
parent 008088ab06
commit df6cf25524
17 changed files with 71 additions and 63 deletions
+1 -1
View File
@@ -7332,7 +7332,7 @@
repositoryURL = "https://github.com/matrix-org/matrix-rust-components-swift"; repositoryURL = "https://github.com/matrix-org/matrix-rust-components-swift";
requirement = { requirement = {
kind = exactVersion; kind = exactVersion;
version = 1.1.60; version = 1.1.61;
}; };
}; };
821C67C9A7F8CC3FD41B28B4 /* XCRemoteSwiftPackageReference "emojibase-bindings" */ = { 821C67C9A7F8CC3FD41B28B4 /* XCRemoteSwiftPackageReference "emojibase-bindings" */ = {
@@ -139,8 +139,8 @@
"kind" : "remoteSourceControl", "kind" : "remoteSourceControl",
"location" : "https://github.com/matrix-org/matrix-rust-components-swift", "location" : "https://github.com/matrix-org/matrix-rust-components-swift",
"state" : { "state" : {
"revision" : "33cad4cb0c95a39bacdd8845d81da17e8a221481", "revision" : "8def4c4c5cc5a95699431a509f1dcd55ec9b59d2",
"version" : "1.1.60" "version" : "1.1.61"
} }
}, },
{ {
@@ -142,11 +142,9 @@ struct MatrixPermalinkParser: URLParser {
case .user(let id): case .user(let id):
return .userProfile(userID: id) return .userProfile(userID: id)
case .eventOnRoomId(let roomID, let eventID): case .eventOnRoomId(let roomID, let eventID):
// return .event(roomID: roomID, eventID: eventID) return .event(roomID: roomID, eventID: eventID)
return nil
case .eventOnRoomAlias(let alias, let eventID): case .eventOnRoomAlias(let alias, let eventID):
// return .eventOnRoomAlias(alias: alias, eventID: eventID) return .eventOnRoomAlias(alias: alias, eventID: eventID)
return nil
default: default:
return nil return nil
} }
+1 -1
View File
@@ -44,7 +44,7 @@ struct RoomProxyMockConfiguration {
mock.underlyingActions = Empty(completeImmediately: false).eraseToAnyPublisher() mock.underlyingActions = Empty(completeImmediately: false).eraseToAnyPublisher()
let timelineProvider = RoomTimelineProviderMock() let timelineProvider = RoomTimelineProviderMock()
timelineProvider.paginationState = .init(backward: timelineStartReached ? .timelineStartReached : .idle, forward: .timelineStartReached) timelineProvider.paginationState = .init(backward: timelineStartReached ? .timelineEndReached : .idle, forward: .timelineEndReached)
timelineProvider.underlyingMembershipChangePublisher = PassthroughSubject().eraseToAnyPublisher() timelineProvider.underlyingMembershipChangePublisher = PassthroughSubject().eraseToAnyPublisher()
mock.underlyingTimelineProvider = timelineProvider mock.underlyingTimelineProvider = timelineProvider
return mock return mock
@@ -83,7 +83,7 @@ class RoomPollsHistoryScreenViewModel: RoomPollsHistoryScreenViewModelType, Room
case .updatedTimelineItems: case .updatedTimelineItems:
self.updatePollsList(filter: state.bindings.filter) self.updatePollsList(filter: state.bindings.filter)
case .paginationState(let paginationState): case .paginationState(let paginationState):
let canBackPaginate = paginationState.backward != .timelineStartReached let canBackPaginate = paginationState.backward != .timelineEndReached
if self.state.canBackPaginate != canBackPaginate { if self.state.canBackPaginate != canBackPaginate {
self.state.canBackPaginate = canBackPaginate self.state.canBackPaginate = canBackPaginate
} }
@@ -130,7 +130,7 @@ class RoomScreenInteractionHandler {
if let encryptedItem = timelineItem as? EncryptedRoomTimelineItem { if let encryptedItem = timelineItem as? EncryptedRoomTimelineItem {
switch encryptedItem.encryptionType { switch encryptedItem.encryptionType {
case .megolmV1AesSha2(let sessionID): case .megolmV1AesSha2(let sessionID, _):
debugActions.append(.retryDecryption(sessionID: sessionID)) debugActions.append(.retryDecryption(sessionID: sessionID))
default: default:
break break
@@ -234,7 +234,7 @@ class RoomScreenViewModel: RoomScreenViewModelType, RoomScreenViewModelProtocol
switch await timelineController.focusOnEvent(eventID, timelineSize: Constants.detachedTimelineSize) { switch await timelineController.focusOnEvent(eventID, timelineSize: Constants.detachedTimelineSize) {
case .success: case .success:
state.timelineViewState.focussedEventID = eventID state.timelineViewState.focussedEventID = eventID
case .failure(let error): case .failure:
MXLog.error("Failed to focus on event \(eventID)") MXLog.error("Failed to focus on event \(eventID)")
displayError(.toast(L10n.commonFailed)) displayError(.toast(L10n.commonFailed))
} }
@@ -475,7 +475,7 @@ class RoomScreenViewModel: RoomScreenViewModelType, RoomScreenViewModelProtocol
break break
} }
if state.timelineViewState.paginationState.forward == .timelineStartReached { if state.timelineViewState.paginationState.forward == .timelineEndReached {
focusLive() focusLive()
} }
@@ -47,6 +47,7 @@ private struct HighlightedTimelineItemModifier: ViewModifier {
} }
} }
// swiftlint:disable line_length
struct HighlightedTimelineItemModifier_Previews: PreviewProvider, TestablePreview { struct HighlightedTimelineItemModifier_Previews: PreviewProvider, TestablePreview {
static var previews: some View { static var previews: some View {
ScrollView { ScrollView {
@@ -83,3 +84,5 @@ struct HighlightedTimelineItemModifier_Previews: PreviewProvider, TestablePrevie
} }
} }
} }
// swiftlint:enable line_length
@@ -817,7 +817,7 @@ class ClientProxy: ClientProxyProtocol {
do { do {
let roomListItem = try roomListService?.room(roomId: identifier) let roomListItem = try roomListService?.room(roomId: identifier)
if roomListItem?.isTimelineInitialized() == false { if roomListItem?.isTimelineInitialized() == false {
try await roomListItem?.initTimeline(eventTypeFilter: eventFilters) try await roomListItem?.initTimeline(eventTypeFilter: eventFilters, internalIdPrefix: nil)
} }
let fullRoom = try await roomListItem?.fullRoom() let fullRoom = try await roomListItem?.fullRoom()
@@ -160,14 +160,13 @@ class RoomProxy: RoomProxyProtocol {
} }
func timelineFocusedOnEvent(eventID: String, numberOfEvents: UInt16) async -> Result<TimelineProxyProtocol, RoomProxyError> { func timelineFocusedOnEvent(eventID: String, numberOfEvents: UInt16) async -> Result<TimelineProxyProtocol, RoomProxyError> {
.failure(.sdkError(RoomProxyMockError.generic)) do {
// do { let timeline = try await room.timelineFocusedOnEvent(eventId: eventID, numContextEvents: numberOfEvents, internalIdPrefix: UUID().uuidString)
// let timeline = try await room.timelineFocusedOnEvent(eventId: eventID, numContextEvents: numberOfEvents, internalIdPrefix: UUID().uuidString) return .success(TimelineProxy(timeline: timeline, isLive: false))
// return .success(TimelineProxy(timeline: timeline, isLive: false)) } catch {
// } catch { MXLog.error("Failed to create a timeline focussed on: \(eventID) with error: \(error)")
// MXLog.error("Failed to create a timeline focussed on: \(eventID) with error: \(error)") return .failure(.sdkError(error))
// return .failure(.sdkError(error)) }
// }
} }
func redact(_ eventID: String) async -> Result<Void, RoomProxyError> { func redact(_ eventID: String) async -> Result<Void, RoomProxyError> {
@@ -19,9 +19,9 @@ import Foundation
import MatrixRustSDK import MatrixRustSDK
struct PaginationState: Equatable { struct PaginationState: Equatable {
static var `default` = PaginationState(backward: .idle, forward: .timelineStartReached) static var `default` = PaginationState(backward: .idle, forward: .timelineEndReached)
let backward: BackPaginationStatus let backward: PaginationStatus
let forward: BackPaginationStatus let forward: PaginationStatus
} }
@MainActor @MainActor
@@ -36,7 +36,7 @@ class MockRoomTimelineController: RoomTimelineControllerProtocol {
private var client: UITestsSignalling.Client? private var client: UITestsSignalling.Client?
init(listenForSignals: Bool = false) { init(listenForSignals: Bool = false) {
callbacks.send(.paginationState(PaginationState(backward: .idle, forward: .timelineStartReached))) callbacks.send(.paginationState(PaginationState(backward: .idle, forward: .timelineEndReached)))
callbacks.send(.isLive(true)) callbacks.send(.isLive(true))
guard listenForSignals else { return } guard listenForSignals else { return }
@@ -62,7 +62,7 @@ class MockRoomTimelineController: RoomTimelineControllerProtocol {
} }
func paginateBackwards(requestSize: UInt16) async -> Result<Void, RoomTimelineControllerError> { func paginateBackwards(requestSize: UInt16) async -> Result<Void, RoomTimelineControllerError> {
callbacks.send(.paginationState(PaginationState(backward: .paginating, forward: .timelineStartReached))) callbacks.send(.paginationState(PaginationState(backward: .paginating, forward: .timelineEndReached)))
if client == nil { if client == nil {
try? await simulateBackPagination() try? await simulateBackPagination()
@@ -173,8 +173,8 @@ class MockRoomTimelineController: RoomTimelineControllerProtocol {
/// Prepends the next chunk of items to the `timelineItems` array. /// Prepends the next chunk of items to the `timelineItems` array.
private func simulateBackPagination() async throws { private func simulateBackPagination() async throws {
defer { defer {
callbacks.send(.paginationState(PaginationState(backward: backPaginationResponses.isEmpty ? .timelineStartReached : .idle, callbacks.send(.paginationState(PaginationState(backward: backPaginationResponses.isEmpty ? .timelineEndReached : .idle,
forward: .timelineStartReached))) forward: .timelineEndReached)))
} }
guard !backPaginationResponses.isEmpty else { return } guard !backPaginationResponses.isEmpty else { return }
@@ -321,7 +321,7 @@ class RoomTimelineController: RoomTimelineControllerProtocol {
// Check if we need to add anything to the top of the timeline. // Check if we need to add anything to the top of the timeline.
switch paginationState.backward { switch paginationState.backward {
case .timelineStartReached: case .timelineEndReached:
if !roomProxy.isEncryptedOneToOneRoom { if !roomProxy.isEncryptedOneToOneRoom {
let timelineStart = TimelineStartRoomTimelineItem(name: roomProxy.name) let timelineStart = TimelineStartRoomTimelineItem(name: roomProxy.name)
newTimelineItems.insert(timelineStart, at: 0) newTimelineItems.insert(timelineStart, at: 0)
@@ -335,7 +335,7 @@ class RoomTimelineController: RoomTimelineControllerProtocol {
switch paginationState.forward { switch paginationState.forward {
case .paginating: case .paginating:
newTimelineItems.insert(PaginationIndicatorRoomTimelineItem(position: .end), at: newTimelineItems.count) newTimelineItems.insert(PaginationIndicatorRoomTimelineItem(position: .end), at: newTimelineItems.count)
case .idle, .timelineStartReached: case .idle, .timelineEndReached:
break break
} }
@@ -18,11 +18,16 @@ import UIKit
struct EncryptedRoomTimelineItem: EventBasedTimelineItemProtocol, Equatable { struct EncryptedRoomTimelineItem: EventBasedTimelineItemProtocol, Equatable {
enum EncryptionType: Hashable { enum EncryptionType: Hashable {
case megolmV1AesSha2(sessionId: String) case megolmV1AesSha2(sessionID: String, cause: UTDCause)
case olmV1Curve25519AesSha2(senderKey: String) case olmV1Curve25519AesSha2(senderKey: String)
case unknown case unknown
} }
enum UTDCause: Hashable {
case membership
case unknown
}
let id: TimelineItemIdentifier let id: TimelineItemIdentifier
let body: String let body: String
let encryptionType: EncryptionType let encryptionType: EncryptionType
@@ -162,11 +162,15 @@ struct RoomTimelineItemFactory: RoomTimelineItemFactoryProtocol {
_ isOutgoing: Bool) -> RoomTimelineItemProtocol { _ isOutgoing: Bool) -> RoomTimelineItemProtocol {
var encryptionType = EncryptedRoomTimelineItem.EncryptionType.unknown var encryptionType = EncryptedRoomTimelineItem.EncryptionType.unknown
switch encryptedMessage { switch encryptedMessage {
case .megolmV1AesSha2(let sessionId): case .megolmV1AesSha2(let sessionID, let cause):
encryptionType = .megolmV1AesSha2(sessionId: sessionId) let cause: EncryptedRoomTimelineItem.UTDCause = switch cause {
case .unknown: .unknown
case .membership: .membership
}
encryptionType = .megolmV1AesSha2(sessionID: sessionID, cause: cause)
case .olmV1Curve25519AesSha2(let senderKey): case .olmV1Curve25519AesSha2(let senderKey):
encryptionType = .olmV1Curve25519AesSha2(senderKey: senderKey) encryptionType = .olmV1Curve25519AesSha2(senderKey: senderKey)
default: case .unknown:
break break
} }
@@ -31,8 +31,8 @@ final class TimelineProxy: TimelineProxyProtocol {
// periphery:ignore - retaining purpose // periphery:ignore - retaining purpose
private var timelineListener: RoomTimelineListener? private var timelineListener: RoomTimelineListener?
private let backPaginationStatusSubject = CurrentValueSubject<BackPaginationStatus, Never>(.idle) private let backPaginationStatusSubject = CurrentValueSubject<PaginationStatus, Never>(.idle)
private let forwardPaginationStatusSubject = CurrentValueSubject<BackPaginationStatus, Never>(.timelineStartReached) private let forwardPaginationStatusSubject = CurrentValueSubject<PaginationStatus, Never>(.timelineEndReached)
private let timelineUpdatesSubject = PassthroughSubject<[TimelineDiff], Never>() private let timelineUpdatesSubject = PassthroughSubject<[TimelineDiff], Never>()
private let actionsSubject = PassthroughSubject<TimelineProxyAction, Never>() private let actionsSubject = PassthroughSubject<TimelineProxyAction, Never>()
@@ -150,7 +150,7 @@ final class TimelineProxy: TimelineProxyProtocol {
MXLog.info("Paginating backwards") MXLog.info("Paginating backwards")
do { do {
_ = try timeline.paginateBackwards(opts: .simpleRequest(eventLimit: requestSize, waitForToken: true)) _ = try await timeline.paginateBackwards(numEvents: requestSize)
MXLog.info("Finished paginating backwards") MXLog.info("Finished paginating backwards")
return .success(()) return .success(())
@@ -161,28 +161,27 @@ final class TimelineProxy: TimelineProxyProtocol {
} }
func paginateForwards(requestSize: UInt16) async -> Result<Void, TimelineProxyError> { func paginateForwards(requestSize: UInt16) async -> Result<Void, TimelineProxyError> {
.failure(.failedPaginatingBackwards)
// This extra check is necessary as forwards pagination status doesn't support subscribing. // This extra check is necessary as forwards pagination status doesn't support subscribing.
// We need it to make sure we send a valid status after a failure. // We need it to make sure we send a valid status after a failure.
// guard forwardPaginationStatusSubject.value == .idle else { guard forwardPaginationStatusSubject.value == .idle else {
// MXLog.error("Attempting to paginate forwards when already at the end.") MXLog.error("Attempting to paginate forwards when already at the end.")
// return .failure(.failedPaginatingBackwards) return .failure(.failedPaginatingBackwards)
// } }
//
// MXLog.info("Paginating forwards") MXLog.info("Paginating forwards")
// forwardPaginationStatusSubject.send(.paginating) forwardPaginationStatusSubject.send(.paginating)
//
// do { do {
// let timelineEndReached = try await timeline.paginateForwards(numEvents: requestSize) let timelineEndReached = try await timeline.focusedPaginateForwards(numEvents: 16)
// MXLog.info("Finished paginating forwards") MXLog.info("Finished paginating forwards")
//
// forwardPaginationStatusSubject.send(timelineEndReached ? .timelineEndReached : .idle) forwardPaginationStatusSubject.send(timelineEndReached ? .timelineEndReached : .idle)
// return .success(()) return .success(())
// } catch { } catch {
// MXLog.error("Failed paginating forwards with error: \(error)") MXLog.error("Failed paginating forwards with error: \(error)")
// forwardPaginationStatusSubject.send(.idle) forwardPaginationStatusSubject.send(.idle)
// return .failure(.failedPaginatingBackwards) return .failure(.failedPaginatingBackwards)
// } }
} }
func retryDecryption(for sessionID: String) async { func retryDecryption(for sessionID: String) async {
@@ -560,7 +559,7 @@ final class TimelineProxy: TimelineProxyProtocol {
} }
// Forward pagination doesn't support observation, set the initial state ourself. // Forward pagination doesn't support observation, set the initial state ourself.
forwardPaginationStatusSubject.send(isLive ? .timelineStartReached : .idle) forwardPaginationStatusSubject.send(isLive ? .timelineEndReached : .idle)
} }
} }
@@ -576,14 +575,14 @@ private final class RoomTimelineListener: TimelineListener {
} }
} }
private final class RoomPaginationStatusListener: BackPaginationStatusListener { private final class RoomPaginationStatusListener: PaginationStatusListener {
private let onUpdateClosure: (BackPaginationStatus) -> Void private let onUpdateClosure: (PaginationStatus) -> Void
init(_ onUpdateClosure: @escaping (BackPaginationStatus) -> Void) { init(_ onUpdateClosure: @escaping (PaginationStatus) -> Void) {
self.onUpdateClosure = onUpdateClosure self.onUpdateClosure = onUpdateClosure
} }
func onUpdate(status: BackPaginationStatus) { func onUpdate(status: PaginationStatus) {
onUpdateClosure(status) onUpdateClosure(status)
} }
} }
+1 -1
View File
@@ -49,7 +49,7 @@ packages:
# Element/Matrix dependencies # Element/Matrix dependencies
MatrixRustSDK: MatrixRustSDK:
url: https://github.com/matrix-org/matrix-rust-components-swift url: https://github.com/matrix-org/matrix-rust-components-swift
exactVersion: 1.1.60 exactVersion: 1.1.61
# path: ../matrix-rust-sdk # path: ../matrix-rust-sdk
Compound: Compound:
url: https://github.com/element-hq/compound-ios url: https://github.com/element-hq/compound-ios