diff --git a/Session.xcodeproj/project.pbxproj b/Session.xcodeproj/project.pbxproj index e59aa7179..d1f82c216 100644 --- a/Session.xcodeproj/project.pbxproj +++ b/Session.xcodeproj/project.pbxproj @@ -759,7 +759,7 @@ FDC4381527B329CE00C60D73 /* NonceGenerator.swift in Sources */ = {isa = PBXBuildFile; fileRef = FDC4381427B329CE00C60D73 /* NonceGenerator.swift */; }; FDC4381727B32EC700C60D73 /* Personalization.swift in Sources */ = {isa = PBXBuildFile; fileRef = FDC4381627B32EC700C60D73 /* Personalization.swift */; }; FDC4382027B36ADC00C60D73 /* SOGSEndpoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = FDC4381F27B36ADC00C60D73 /* SOGSEndpoint.swift */; }; - FDC4382F27B383AF00C60D73 /* UpdateRegistrationResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = FDC4382E27B383AF00C60D73 /* UpdateRegistrationResponse.swift */; }; + FDC4382F27B383AF00C60D73 /* PushServerResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = FDC4382E27B383AF00C60D73 /* PushServerResponse.swift */; }; FDC4383827B3863200C60D73 /* VersionResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = FDC4383727B3863200C60D73 /* VersionResponse.swift */; }; FDC4384F27B4804F00C60D73 /* Header.swift in Sources */ = {isa = PBXBuildFile; fileRef = FDC4384E27B4804F00C60D73 /* Header.swift */; }; FDC4385127B4807400C60D73 /* QueryParam.swift in Sources */ = {isa = PBXBuildFile; fileRef = FDC4385027B4807400C60D73 /* QueryParam.swift */; }; @@ -1810,7 +1810,7 @@ FDC4381427B329CE00C60D73 /* NonceGenerator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NonceGenerator.swift; sourceTree = ""; }; FDC4381627B32EC700C60D73 /* Personalization.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Personalization.swift; sourceTree = ""; }; FDC4381F27B36ADC00C60D73 /* SOGSEndpoint.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SOGSEndpoint.swift; sourceTree = ""; }; - FDC4382E27B383AF00C60D73 /* UpdateRegistrationResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpdateRegistrationResponse.swift; sourceTree = ""; }; + FDC4382E27B383AF00C60D73 /* PushServerResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PushServerResponse.swift; sourceTree = ""; }; FDC4383727B3863200C60D73 /* VersionResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VersionResponse.swift; sourceTree = ""; }; FDC4383D27B4708600C60D73 /* Atomic.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Atomic.swift; sourceTree = ""; }; FDC4384E27B4804F00C60D73 /* Header.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Header.swift; sourceTree = ""; }; @@ -3820,7 +3820,7 @@ FDC4382D27B383A600C60D73 /* Models */ = { isa = PBXGroup; children = ( - FDC4382E27B383AF00C60D73 /* UpdateRegistrationResponse.swift */, + FDC4382E27B383AF00C60D73 /* PushServerResponse.swift */, ); path = Models; sourceTree = ""; @@ -5232,7 +5232,7 @@ FD6A7A692818BE7300035AC1 /* RetrieveDefaultOpenGroupRoomsJob.swift in Sources */, FD09798D27FD1D8900936362 /* DisappearingMessageConfiguration.swift in Sources */, FDF0B75A2807F3A3004C14C5 /* MessageSenderError.swift in Sources */, - FDC4382F27B383AF00C60D73 /* UpdateRegistrationResponse.swift in Sources */, + FDC4382F27B383AF00C60D73 /* PushServerResponse.swift in Sources */, FDC4386327B4D94E00C60D73 /* SOGSMessage.swift in Sources */, FD245C692850666800B966DD /* ExpirationTimerUpdate.swift in Sources */, FD42F9A8285064B800A0C77D /* PushNotificationAPI.swift in Sources */, @@ -6897,7 +6897,7 @@ CODE_SIGN_ENTITLEMENTS = Session/Meta/Signal.entitlements; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - CURRENT_PROJECT_VERSION = 361; + CURRENT_PROJECT_VERSION = 363; DEVELOPMENT_TEAM = SUQ8J2PCT7; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", @@ -6969,7 +6969,7 @@ CODE_SIGN_ENTITLEMENTS = Session/Meta/Signal.entitlements; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - CURRENT_PROJECT_VERSION = 361; + CURRENT_PROJECT_VERSION = 363; DEVELOPMENT_TEAM = SUQ8J2PCT7; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", diff --git a/Session/Conversations/Message Cells/Content Views/MediaView.swift b/Session/Conversations/Message Cells/Content Views/MediaView.swift index 77f2183c1..255d65690 100644 --- a/Session/Conversations/Message Cells/Content Views/MediaView.swift +++ b/Session/Conversations/Message Cells/Content Views/MediaView.swift @@ -158,14 +158,12 @@ public class MediaView: UIView { loadBlock = { [weak self] in AssertIsOnMainThread() - - guard let strongSelf = self else { return } - + if animatedImageView.image != nil { owsFailDebug("Unexpectedly already loaded.") return } - strongSelf.tryToLoadMedia( + self?.tryToLoadMedia( loadMediaBlock: { applyMediaBlock in guard attachment.isValid else { self?.configure(forError: .invalid) @@ -328,6 +326,16 @@ public class MediaView: UIView { } private func configure(forError error: MediaError) { + // When there is a failure in the 'loadMediaBlock' closure this can be called + // on a background thread - rather than dispatching in every 'loadMediaBlock' + // usage we just do so here + guard Thread.isMainThread else { + DispatchQueue.main.async { + self.configure(forError: error) + } + return + } + let icon: UIImage switch error { diff --git a/SessionMessagingKit/Sending & Receiving/Notifications/Models/PushServerResponse.swift b/SessionMessagingKit/Sending & Receiving/Notifications/Models/PushServerResponse.swift new file mode 100644 index 000000000..eee22e266 --- /dev/null +++ b/SessionMessagingKit/Sending & Receiving/Notifications/Models/PushServerResponse.swift @@ -0,0 +1,10 @@ +// Copyright © 2022 Rangeproof Pty Ltd. All rights reserved. + +import Foundation + +extension PushNotificationAPI { + struct PushServerResponse: Codable { + let code: Int + let message: String? + } +} diff --git a/SessionMessagingKit/Sending & Receiving/Notifications/Models/UpdateRegistrationResponse.swift b/SessionMessagingKit/Sending & Receiving/Notifications/Models/UpdateRegistrationResponse.swift deleted file mode 100644 index aaf4ff484..000000000 --- a/SessionMessagingKit/Sending & Receiving/Notifications/Models/UpdateRegistrationResponse.swift +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright © 2022 Rangeproof Pty Ltd. All rights reserved. - -import Foundation - -extension PushNotificationAPI { - struct UpdateRegistrationResponse: Codable { - struct Body: Codable { - let code: Int - let message: String? - } - - let status: Int - let body: Body - } -} diff --git a/SessionMessagingKit/Sending & Receiving/Notifications/PushNotificationAPI.swift b/SessionMessagingKit/Sending & Receiving/Notifications/PushNotificationAPI.swift index a63af0b54..11499c28f 100644 --- a/SessionMessagingKit/Sending & Receiving/Notifications/PushNotificationAPI.swift +++ b/SessionMessagingKit/Sending & Receiving/Notifications/PushNotificationAPI.swift @@ -65,13 +65,13 @@ public final class PushNotificationAPI : NSObject { request.httpBody = body let promise: Promise = attempt(maxRetryCount: maxRetryCount, recoveringOn: DispatchQueue.global()) { - OnionRequestAPI.sendOnionRequest(request, to: server, using: .v2, with: serverPublicKey) - .map2 { _, response in - guard let response: UpdateRegistrationResponse = try? response?.decoded(as: UpdateRegistrationResponse.self) else { + OnionRequestAPI.sendOnionRequest(request, to: server, with: serverPublicKey) + .map2 { _, data in + guard let response: PushServerResponse = try? data?.decoded(as: PushServerResponse.self) else { return SNLog("Couldn't unregister from push notifications.") } - guard response.body.code != 0 else { - return SNLog("Couldn't unregister from push notifications due to error: \(response.body.message ?? "nil").") + guard response.code != 0 else { + return SNLog("Couldn't unregister from push notifications due to error: \(response.message ?? "nil").") } } } @@ -127,13 +127,13 @@ public final class PushNotificationAPI : NSObject { promises.append( attempt(maxRetryCount: maxRetryCount, recoveringOn: DispatchQueue.global()) { - OnionRequestAPI.sendOnionRequest(request, to: server, using: .v2, with: serverPublicKey) + OnionRequestAPI.sendOnionRequest(request, to: server, with: serverPublicKey) .map2 { _, data -> Void in - guard let response: UpdateRegistrationResponse = try? data?.decoded(as: UpdateRegistrationResponse.self) else { + guard let response: PushServerResponse = try? data?.decoded(as: PushServerResponse.self) else { return SNLog("Couldn't register device token.") } - guard response.body.code != 0 else { - return SNLog("Couldn't register device token due to error: \(response.body.message ?? "nil").") + guard response.code != 0 else { + return SNLog("Couldn't register device token due to error: \(response.message ?? "nil").") } userDefaults[.deviceToken] = hexEncodedToken @@ -193,13 +193,13 @@ public final class PushNotificationAPI : NSObject { request.httpBody = body let promise: Promise = attempt(maxRetryCount: maxRetryCount, recoveringOn: DispatchQueue.global()) { - OnionRequestAPI.sendOnionRequest(request, to: server, using: .v2, with: serverPublicKey) - .map2 { _, response in - guard let response: UpdateRegistrationResponse = try? response?.decoded(as: UpdateRegistrationResponse.self) else { + OnionRequestAPI.sendOnionRequest(request, to: server, with: serverPublicKey) + .map2 { _, data in + guard let response: PushServerResponse = try? data?.decoded(as: PushServerResponse.self) else { return SNLog("Couldn't subscribe/unsubscribe for closed group: \(closedGroupPublicKey).") } - guard response.body.code != 0 else { - return SNLog("Couldn't subscribe/unsubscribe for closed group: \(closedGroupPublicKey) due to error: \(response.body.message ?? "nil").") + guard response.code != 0 else { + return SNLog("Couldn't subscribe/unsubscribe for closed group: \(closedGroupPublicKey) due to error: \(response.message ?? "nil").") } } } @@ -236,8 +236,15 @@ public final class PushNotificationAPI : NSObject { let retryCount: UInt = (maxRetryCount ?? PushNotificationAPI.maxRetryCount) let promise: Promise = attempt(maxRetryCount: retryCount, recoveringOn: queue) { - OnionRequestAPI.sendOnionRequest(request, to: server, using: .v2, with: serverPublicKey) - .map { _ in } + OnionRequestAPI.sendOnionRequest(request, to: server, with: serverPublicKey) + .map2 { _, data in + guard let response: PushServerResponse = try? data?.decoded(as: PushServerResponse.self) else { + return SNLog("Couldn't send push notification.") + } + guard response.code != 0 else { + return SNLog("Couldn't send push notification due to error: \(response.message ?? "nil").") + } + } } return promise