From 95d53f1edf837af0a3538ca0d68db332418b8f66 Mon Sep 17 00:00:00 2001 From: Doug <6060466+pixlwave@users.noreply.github.com> Date: Wed, 17 Jul 2024 15:48:32 +0100 Subject: [PATCH] Update the SDK fixing a few room list bugs. (#3054) * Update the SDK. * Handle API break for editing timeline items. * Handle API break for Element Call --- ElementX.xcodeproj/project.pbxproj | 2 +- .../xcshareddata/swiftpm/Package.resolved | 4 +- .../Mocks/Generated/GeneratedMocks.swift | 46 ++--- .../Mocks/Generated/SDKGeneratedMocks.swift | 165 +++++++++++++----- ElementX/Sources/Mocks/RoomProxyMock.swift | 2 +- .../CallScreen/CallScreenViewModel.swift | 4 +- .../Screens/CallScreen/View/CallScreen.swift | 2 +- .../ElementCall/ElementCallWidgetDriver.swift | 6 +- .../Sources/Services/Room/RoomProxy.swift | 4 +- .../Services/Room/RoomProxyProtocol.swift | 2 +- .../Services/Timeline/TimelineProxy.swift | 24 +-- project.yml | 2 +- 12 files changed, 163 insertions(+), 100 deletions(-) diff --git a/ElementX.xcodeproj/project.pbxproj b/ElementX.xcodeproj/project.pbxproj index 27f2d4c64..dd570d44d 100644 --- a/ElementX.xcodeproj/project.pbxproj +++ b/ElementX.xcodeproj/project.pbxproj @@ -7447,7 +7447,7 @@ repositoryURL = "https://github.com/element-hq/matrix-rust-components-swift"; requirement = { kind = exactVersion; - version = 1.0.24; + version = 1.0.25; }; }; 701C7BEF8F70F7A83E852DCC /* XCRemoteSwiftPackageReference "GZIP" */ = { diff --git a/ElementX.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/ElementX.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index 8ff5ec6b3..56c0d2321 100644 --- a/ElementX.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/ElementX.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -149,8 +149,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/element-hq/matrix-rust-components-swift", "state" : { - "revision" : "dc2d7ac4b7293a0dce1d37c3dea8da52be5d6932", - "version" : "1.0.24" + "revision" : "dd9e0d89d65be16c3db1a14a121543e0af326536", + "version" : "1.0.25" } }, { diff --git a/ElementX/Sources/Mocks/Generated/GeneratedMocks.swift b/ElementX/Sources/Mocks/Generated/GeneratedMocks.swift index 16adb7c27..fbf14a2a1 100644 --- a/ElementX/Sources/Mocks/Generated/GeneratedMocks.swift +++ b/ElementX/Sources/Mocks/Generated/GeneratedMocks.swift @@ -10618,15 +10618,15 @@ class RoomProxyMock: RoomProxyProtocol { } //MARK: - elementCallWidgetDriver - var elementCallWidgetDriverUnderlyingCallsCount = 0 - var elementCallWidgetDriverCallsCount: Int { + var elementCallWidgetDriverDeviceIDUnderlyingCallsCount = 0 + var elementCallWidgetDriverDeviceIDCallsCount: Int { get { if Thread.isMainThread { - return elementCallWidgetDriverUnderlyingCallsCount + return elementCallWidgetDriverDeviceIDUnderlyingCallsCount } else { var returnValue: Int? = nil DispatchQueue.main.sync { - returnValue = elementCallWidgetDriverUnderlyingCallsCount + returnValue = elementCallWidgetDriverDeviceIDUnderlyingCallsCount } return returnValue! @@ -10634,27 +10634,29 @@ class RoomProxyMock: RoomProxyProtocol { } set { if Thread.isMainThread { - elementCallWidgetDriverUnderlyingCallsCount = newValue + elementCallWidgetDriverDeviceIDUnderlyingCallsCount = newValue } else { DispatchQueue.main.sync { - elementCallWidgetDriverUnderlyingCallsCount = newValue + elementCallWidgetDriverDeviceIDUnderlyingCallsCount = newValue } } } } - var elementCallWidgetDriverCalled: Bool { - return elementCallWidgetDriverCallsCount > 0 + var elementCallWidgetDriverDeviceIDCalled: Bool { + return elementCallWidgetDriverDeviceIDCallsCount > 0 } + var elementCallWidgetDriverDeviceIDReceivedDeviceID: String? + var elementCallWidgetDriverDeviceIDReceivedInvocations: [String] = [] - var elementCallWidgetDriverUnderlyingReturnValue: ElementCallWidgetDriverProtocol! - var elementCallWidgetDriverReturnValue: ElementCallWidgetDriverProtocol! { + var elementCallWidgetDriverDeviceIDUnderlyingReturnValue: ElementCallWidgetDriverProtocol! + var elementCallWidgetDriverDeviceIDReturnValue: ElementCallWidgetDriverProtocol! { get { if Thread.isMainThread { - return elementCallWidgetDriverUnderlyingReturnValue + return elementCallWidgetDriverDeviceIDUnderlyingReturnValue } else { var returnValue: ElementCallWidgetDriverProtocol? = nil DispatchQueue.main.sync { - returnValue = elementCallWidgetDriverUnderlyingReturnValue + returnValue = elementCallWidgetDriverDeviceIDUnderlyingReturnValue } return returnValue! @@ -10662,22 +10664,26 @@ class RoomProxyMock: RoomProxyProtocol { } set { if Thread.isMainThread { - elementCallWidgetDriverUnderlyingReturnValue = newValue + elementCallWidgetDriverDeviceIDUnderlyingReturnValue = newValue } else { DispatchQueue.main.sync { - elementCallWidgetDriverUnderlyingReturnValue = newValue + elementCallWidgetDriverDeviceIDUnderlyingReturnValue = newValue } } } } - var elementCallWidgetDriverClosure: (() -> ElementCallWidgetDriverProtocol)? + var elementCallWidgetDriverDeviceIDClosure: ((String) -> ElementCallWidgetDriverProtocol)? - func elementCallWidgetDriver() -> ElementCallWidgetDriverProtocol { - elementCallWidgetDriverCallsCount += 1 - if let elementCallWidgetDriverClosure = elementCallWidgetDriverClosure { - return elementCallWidgetDriverClosure() + func elementCallWidgetDriver(deviceID: String) -> ElementCallWidgetDriverProtocol { + elementCallWidgetDriverDeviceIDCallsCount += 1 + elementCallWidgetDriverDeviceIDReceivedDeviceID = deviceID + DispatchQueue.main.async { + self.elementCallWidgetDriverDeviceIDReceivedInvocations.append(deviceID) + } + if let elementCallWidgetDriverDeviceIDClosure = elementCallWidgetDriverDeviceIDClosure { + return elementCallWidgetDriverDeviceIDClosure(deviceID) } else { - return elementCallWidgetDriverReturnValue + return elementCallWidgetDriverDeviceIDReturnValue } } //MARK: - sendCallNotificationIfNeeeded diff --git a/ElementX/Sources/Mocks/Generated/SDKGeneratedMocks.swift b/ElementX/Sources/Mocks/Generated/SDKGeneratedMocks.swift index 24ba212f7..1800eb743 100644 --- a/ElementX/Sources/Mocks/Generated/SDKGeneratedMocks.swift +++ b/ElementX/Sources/Mocks/Generated/SDKGeneratedMocks.swift @@ -1,4 +1,4 @@ -// Generated using Sourcery 2.2.4 — https://github.com/krzysztofzablocki/Sourcery +// Generated using Sourcery 2.2.5 — https://github.com/krzysztofzablocki/Sourcery // DO NOT EDIT // swiftlint:disable all @@ -6337,6 +6337,77 @@ open class EventTimelineItemSDKMock: MatrixRustSDK.EventTimelineItem { } } + //MARK: - getShield + + var getShieldStrictUnderlyingCallsCount = 0 + open var getShieldStrictCallsCount: Int { + get { + if Thread.isMainThread { + return getShieldStrictUnderlyingCallsCount + } else { + var returnValue: Int? = nil + DispatchQueue.main.sync { + returnValue = getShieldStrictUnderlyingCallsCount + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + getShieldStrictUnderlyingCallsCount = newValue + } else { + DispatchQueue.main.sync { + getShieldStrictUnderlyingCallsCount = newValue + } + } + } + } + open var getShieldStrictCalled: Bool { + return getShieldStrictCallsCount > 0 + } + open var getShieldStrictReceivedStrict: Bool? + open var getShieldStrictReceivedInvocations: [Bool] = [] + + var getShieldStrictUnderlyingReturnValue: ShieldState? + open var getShieldStrictReturnValue: ShieldState? { + get { + if Thread.isMainThread { + return getShieldStrictUnderlyingReturnValue + } else { + var returnValue: ShieldState?? = nil + DispatchQueue.main.sync { + returnValue = getShieldStrictUnderlyingReturnValue + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + getShieldStrictUnderlyingReturnValue = newValue + } else { + DispatchQueue.main.sync { + getShieldStrictUnderlyingReturnValue = newValue + } + } + } + } + open var getShieldStrictClosure: ((Bool) -> ShieldState?)? + + open override func getShield(strict: Bool) -> ShieldState? { + getShieldStrictCallsCount += 1 + getShieldStrictReceivedStrict = strict + DispatchQueue.main.async { + self.getShieldStrictReceivedInvocations.append(strict) + } + if let getShieldStrictClosure = getShieldStrictClosure { + return getShieldStrictClosure(strict) + } else { + return getShieldStrictReturnValue + } + } + //MARK: - isEditable var isEditableUnderlyingCallsCount = 0 @@ -10545,6 +10616,52 @@ open class RoomSDKMock: MatrixRustSDK.Room { } } + //MARK: - edit + + open var editEventIdNewContentThrowableError: Error? + var editEventIdNewContentUnderlyingCallsCount = 0 + open var editEventIdNewContentCallsCount: Int { + get { + if Thread.isMainThread { + return editEventIdNewContentUnderlyingCallsCount + } else { + var returnValue: Int? = nil + DispatchQueue.main.sync { + returnValue = editEventIdNewContentUnderlyingCallsCount + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + editEventIdNewContentUnderlyingCallsCount = newValue + } else { + DispatchQueue.main.sync { + editEventIdNewContentUnderlyingCallsCount = newValue + } + } + } + } + open var editEventIdNewContentCalled: Bool { + return editEventIdNewContentCallsCount > 0 + } + open var editEventIdNewContentReceivedArguments: (eventId: String, newContent: RoomMessageEventContentWithoutRelation)? + open var editEventIdNewContentReceivedInvocations: [(eventId: String, newContent: RoomMessageEventContentWithoutRelation)] = [] + open var editEventIdNewContentClosure: ((String, RoomMessageEventContentWithoutRelation) async throws -> Void)? + + open override func edit(eventId: String, newContent: RoomMessageEventContentWithoutRelation) async throws { + if let error = editEventIdNewContentThrowableError { + throw error + } + editEventIdNewContentCallsCount += 1 + editEventIdNewContentReceivedArguments = (eventId: eventId, newContent: newContent) + DispatchQueue.main.async { + self.editEventIdNewContentReceivedInvocations.append((eventId: eventId, newContent: newContent)) + } + try await editEventIdNewContentClosure?(eventId, newContent) + } + //MARK: - enableSendQueue var enableSendQueueEnableUnderlyingCallsCount = 0 @@ -17603,52 +17720,6 @@ open class TimelineSDKMock: MatrixRustSDK.Timeline { } } - //MARK: - editByEventId - - open var editByEventIdEventIdNewContentThrowableError: Error? - var editByEventIdEventIdNewContentUnderlyingCallsCount = 0 - open var editByEventIdEventIdNewContentCallsCount: Int { - get { - if Thread.isMainThread { - return editByEventIdEventIdNewContentUnderlyingCallsCount - } else { - var returnValue: Int? = nil - DispatchQueue.main.sync { - returnValue = editByEventIdEventIdNewContentUnderlyingCallsCount - } - - return returnValue! - } - } - set { - if Thread.isMainThread { - editByEventIdEventIdNewContentUnderlyingCallsCount = newValue - } else { - DispatchQueue.main.sync { - editByEventIdEventIdNewContentUnderlyingCallsCount = newValue - } - } - } - } - open var editByEventIdEventIdNewContentCalled: Bool { - return editByEventIdEventIdNewContentCallsCount > 0 - } - open var editByEventIdEventIdNewContentReceivedArguments: (eventId: String, newContent: RoomMessageEventContentWithoutRelation)? - open var editByEventIdEventIdNewContentReceivedInvocations: [(eventId: String, newContent: RoomMessageEventContentWithoutRelation)] = [] - open var editByEventIdEventIdNewContentClosure: ((String, RoomMessageEventContentWithoutRelation) async throws -> Void)? - - open override func editByEventId(eventId: String, newContent: RoomMessageEventContentWithoutRelation) async throws { - if let error = editByEventIdEventIdNewContentThrowableError { - throw error - } - editByEventIdEventIdNewContentCallsCount += 1 - editByEventIdEventIdNewContentReceivedArguments = (eventId: eventId, newContent: newContent) - DispatchQueue.main.async { - self.editByEventIdEventIdNewContentReceivedInvocations.append((eventId: eventId, newContent: newContent)) - } - try await editByEventIdEventIdNewContentClosure?(eventId, newContent) - } - //MARK: - editPoll open var editPollQuestionAnswersMaxSelectionsPollKindEditItemThrowableError: Error? diff --git a/ElementX/Sources/Mocks/RoomProxyMock.swift b/ElementX/Sources/Mocks/RoomProxyMock.swift index 27341e269..30e755def 100644 --- a/ElementX/Sources/Mocks/RoomProxyMock.swift +++ b/ElementX/Sources/Mocks/RoomProxyMock.swift @@ -145,7 +145,7 @@ extension RoomProxyMock { widgetDriver.startBaseURLClientIDColorSchemeReturnValue = .success(url) - elementCallWidgetDriverReturnValue = widgetDriver + elementCallWidgetDriverDeviceIDReturnValue = widgetDriver sendCallNotificationIfNeeededReturnValue = .success(()) matrixToPermalinkReturnValue = .success(.homeDirectory) diff --git a/ElementX/Sources/Screens/CallScreen/CallScreenViewModel.swift b/ElementX/Sources/Screens/CallScreen/CallScreenViewModel.swift index 1ca32e37c..d74e467ad 100644 --- a/ElementX/Sources/Screens/CallScreen/CallScreenViewModel.swift +++ b/ElementX/Sources/Screens/CallScreen/CallScreenViewModel.swift @@ -44,10 +44,12 @@ class CallScreenViewModel: CallScreenViewModelType, CallScreenViewModelProtocol elementCallBaseURL: URL, elementCallBaseURLOverride: URL?, colorScheme: ColorScheme) { + guard let deviceID = clientProxy.deviceID else { fatalError("Missing device ID for the call.") } + self.elementCallService = elementCallService self.roomProxy = roomProxy - widgetDriver = roomProxy.elementCallWidgetDriver() + widgetDriver = roomProxy.elementCallWidgetDriver(deviceID: deviceID) super.init(initialViewState: CallScreenViewState(messageHandler: Self.eventHandlerName, script: Self.eventHandlerInjectionScript)) diff --git a/ElementX/Sources/Screens/CallScreen/View/CallScreen.swift b/ElementX/Sources/Screens/CallScreen/View/CallScreen.swift index ab0209cff..1204edc5b 100644 --- a/ElementX/Sources/Screens/CallScreen/View/CallScreen.swift +++ b/ElementX/Sources/Screens/CallScreen/View/CallScreen.swift @@ -185,7 +185,7 @@ struct CallScreen_Previews: PreviewProvider { widgetDriver.underlyingActions = PassthroughSubject().eraseToAnyPublisher() widgetDriver.startBaseURLClientIDColorSchemeReturnValue = .success(URL.userDirectory) - roomProxy.elementCallWidgetDriverReturnValue = widgetDriver + roomProxy.elementCallWidgetDriverDeviceIDReturnValue = widgetDriver return CallScreenViewModel(elementCallService: ElementCallServiceMock(.init()), clientProxy: clientProxy, diff --git a/ElementX/Sources/Services/ElementCall/ElementCallWidgetDriver.swift b/ElementX/Sources/Services/ElementCall/ElementCallWidgetDriver.swift index c596f5fd7..32ff78338 100644 --- a/ElementX/Sources/Services/ElementCall/ElementCallWidgetDriver.swift +++ b/ElementX/Sources/Services/ElementCall/ElementCallWidgetDriver.swift @@ -39,6 +39,7 @@ private struct ElementCallWidgetMessage: Codable { class ElementCallWidgetDriver: WidgetCapabilitiesProvider, ElementCallWidgetDriverProtocol { private let room: RoomProtocol + private let deviceID: String private var widgetDriver: WidgetDriverAndHandle? let widgetID = UUID().uuidString @@ -49,8 +50,9 @@ class ElementCallWidgetDriver: WidgetCapabilitiesProvider, ElementCallWidgetDriv actionsSubject.eraseToAnyPublisher() } - init(room: RoomProtocol) { + init(room: RoomProtocol, deviceID: String) { self.room = room + self.deviceID = deviceID } func start(baseURL: URL, clientID: String, colorScheme: ColorScheme) async -> Result { @@ -143,7 +145,7 @@ class ElementCallWidgetDriver: WidgetCapabilitiesProvider, ElementCallWidgetDriv // MARK: - WidgetCapabilitiesProvider func acquireCapabilities(capabilities: WidgetCapabilities) -> WidgetCapabilities { - getElementCallRequiredPermissions(ownUserId: room.ownUserId()) + getElementCallRequiredPermissions(ownUserId: room.ownUserId(), ownDeviceId: deviceID) } // MARK: - Private diff --git a/ElementX/Sources/Services/Room/RoomProxy.swift b/ElementX/Sources/Services/Room/RoomProxy.swift index efd25c2a4..3c9224e69 100644 --- a/ElementX/Sources/Services/Room/RoomProxy.swift +++ b/ElementX/Sources/Services/Room/RoomProxy.swift @@ -526,8 +526,8 @@ class RoomProxy: RoomProxyProtocol { } } - func elementCallWidgetDriver() -> ElementCallWidgetDriverProtocol { - ElementCallWidgetDriver(room: room) + func elementCallWidgetDriver(deviceID: String) -> ElementCallWidgetDriverProtocol { + ElementCallWidgetDriver(room: room, deviceID: deviceID) } func sendCallNotificationIfNeeeded() async -> Result { diff --git a/ElementX/Sources/Services/Room/RoomProxyProtocol.swift b/ElementX/Sources/Services/Room/RoomProxyProtocol.swift index e79f68775..7223711c5 100644 --- a/ElementX/Sources/Services/Room/RoomProxyProtocol.swift +++ b/ElementX/Sources/Services/Room/RoomProxyProtocol.swift @@ -129,7 +129,7 @@ protocol RoomProxyProtocol { // MARK: - Element Call func canUserJoinCall(userID: String) async -> Result - func elementCallWidgetDriver() -> ElementCallWidgetDriverProtocol + func elementCallWidgetDriver(deviceID: String) -> ElementCallWidgetDriverProtocol func sendCallNotificationIfNeeeded() async -> Result diff --git a/ElementX/Sources/Services/Timeline/TimelineProxy.swift b/ElementX/Sources/Services/Timeline/TimelineProxy.swift index a554b1e7e..d83d37709 100644 --- a/ElementX/Sources/Services/Timeline/TimelineProxy.swift +++ b/ElementX/Sources/Services/Timeline/TimelineProxy.swift @@ -158,12 +158,7 @@ final class TimelineProxy: TimelineProxyProtocol { intentionalMentions: IntentionalMentions) async -> Result { MXLog.info("Editing timeline item: \(timelineItemID)") - let editMode: EditMode - if let eventID = timelineItemID.eventID { - editMode = .remote(eventID: eventID) - } else if let eventTimelineItem = await timelineProvider.itemProxies.firstEventTimelineItemUsingID(timelineItemID) { - editMode = .local(item: eventTimelineItem) - } else { + guard let timelineItem = await timelineProvider.itemProxies.firstEventTimelineItemUsingID(timelineItemID) else { MXLog.error("Unknown timeline item: \(timelineItemID)") return .failure(.failedEditing) } @@ -173,13 +168,8 @@ final class TimelineProxy: TimelineProxyProtocol { intentionalMentions: intentionalMentions.toRustMentions()) do { - switch editMode { - case let .local(item): - guard try await timeline.edit(item: item, newContent: messageContent) == true else { - return .failure(.failedEditing) - } - case let .remote(eventID): - try await timeline.editByEventId(eventId: eventID, newContent: messageContent) + guard try await timeline.edit(item: timelineItem, newContent: messageContent) == true else { + return .failure(.failedEditing) } MXLog.info("Finished editing timeline item: \(timelineItemID)") @@ -625,11 +615,3 @@ extension Array where Element == TimelineItemProxy { return eventTimelineItemProxy?.item } } - -private enum EditMode { - /// edit for a message that is also found locally as a timeline item - case local(item: EventTimelineItem) - - /// edit for a message that was not found locally - case remote(eventID: String) -} diff --git a/project.yml b/project.yml index a662a1cbb..52a083d5a 100644 --- a/project.yml +++ b/project.yml @@ -60,7 +60,7 @@ packages: # Element/Matrix dependencies MatrixRustSDK: url: https://github.com/element-hq/matrix-rust-components-swift - exactVersion: 1.0.24 + exactVersion: 1.0.25 # path: ../matrix-rust-sdk Compound: url: https://github.com/element-hq/compound-ios