From 4af881a20f196d6f528df59e4cbc85cbc46c23a7 Mon Sep 17 00:00:00 2001 From: Doug <6060466+pixlwave@users.noreply.github.com> Date: Tue, 31 Oct 2023 14:56:23 +0000 Subject: [PATCH] Update the SDK, minor version, handle API breaks (#1994) --- ElementX.xcodeproj/project.pbxproj | 6 +++--- .../xcshareddata/swiftpm/Package.resolved | 6 +++--- .../Mocks/Generated/GeneratedMocks.swift | 21 ++++++++++++------- ...BackupLogoutConfirmationScreenModels.swift | 9 ++++++++ ...kupLogoutConfirmationScreenViewModel.swift | 13 +++++++++++- ...SecureBackupLogoutConfirmationScreen.swift | 1 + .../SecureBackup/SecureBackupController.swift | 19 +++++++++++++++-- .../SecureBackupControllerProtocol.swift | 4 +++- project.yml | 4 ++-- 9 files changed, 63 insertions(+), 20 deletions(-) diff --git a/ElementX.xcodeproj/project.pbxproj b/ElementX.xcodeproj/project.pbxproj index bc467537d..e4bbe017f 100644 --- a/ElementX.xcodeproj/project.pbxproj +++ b/ElementX.xcodeproj/project.pbxproj @@ -6247,7 +6247,7 @@ IPHONEOS_DEPLOYMENT_TARGET = 16.4; KEYCHAIN_ACCESS_GROUP_IDENTIFIER = "$(AppIdentifierPrefix)$(BASE_BUNDLE_IDENTIFIER)"; MACOSX_DEPLOYMENT_TARGET = 13.3; - MARKETING_VERSION = 1.3.4; + MARKETING_VERSION = 1.4.0; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -6322,7 +6322,7 @@ IPHONEOS_DEPLOYMENT_TARGET = 16.4; KEYCHAIN_ACCESS_GROUP_IDENTIFIER = "$(AppIdentifierPrefix)$(BASE_BUNDLE_IDENTIFIER)"; MACOSX_DEPLOYMENT_TARGET = 13.3; - MARKETING_VERSION = 1.3.4; + MARKETING_VERSION = 1.4.0; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; @@ -6596,7 +6596,7 @@ repositoryURL = "https://github.com/matrix-org/matrix-rust-components-swift"; requirement = { kind = exactVersion; - version = "0.0.1-october23"; + version = "0.0.2-october23"; }; }; 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 22f5227ce..6879f47cf 100644 --- a/ElementX.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/ElementX.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -129,8 +129,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/matrix-org/matrix-rust-components-swift", "state" : { - "revision" : "f53f5302ddcd81e4134fa7437fedd5c33cd7c1bf", - "version" : "0.0.1-october23" + "revision" : "48f7062bd94debe766820a28c77f40a6e51900c3", + "version" : "0.0.2-october23" } }, { @@ -262,7 +262,7 @@ { "identity" : "swiftui-introspect", "kind" : "remoteSourceControl", - "location" : "https://github.com/siteline/SwiftUI-Introspect.git", + "location" : "https://github.com/siteline/SwiftUI-Introspect", "state" : { "revision" : "b94da693e57eaf79d16464b8b7c90d09cba4e290", "version" : "0.9.2" diff --git a/ElementX/Sources/Mocks/Generated/GeneratedMocks.swift b/ElementX/Sources/Mocks/Generated/GeneratedMocks.swift index ab618e842..1a49de306 100644 --- a/ElementX/Sources/Mocks/Generated/GeneratedMocks.swift +++ b/ElementX/Sources/Mocks/Generated/GeneratedMocks.swift @@ -2697,17 +2697,22 @@ class SecureBackupControllerMock: SecureBackupControllerProtocol { return isLastSessionReturnValue } } - //MARK: - waitForKeyBackup + //MARK: - waitForKeyBackupUpload - var waitForKeyBackupCallsCount = 0 - var waitForKeyBackupCalled: Bool { - return waitForKeyBackupCallsCount > 0 + var waitForKeyBackupUploadCallsCount = 0 + var waitForKeyBackupUploadCalled: Bool { + return waitForKeyBackupUploadCallsCount > 0 } - var waitForKeyBackupClosure: (() async -> Void)? + var waitForKeyBackupUploadReturnValue: Result! + var waitForKeyBackupUploadClosure: (() async -> Result)? - func waitForKeyBackup() async { - waitForKeyBackupCallsCount += 1 - await waitForKeyBackupClosure?() + func waitForKeyBackupUpload() async -> Result { + waitForKeyBackupUploadCallsCount += 1 + if let waitForKeyBackupUploadClosure = waitForKeyBackupUploadClosure { + return await waitForKeyBackupUploadClosure() + } else { + return waitForKeyBackupUploadReturnValue + } } } class SessionVerificationControllerProxyMock: SessionVerificationControllerProxyProtocol { diff --git a/ElementX/Sources/Screens/SecureBackup/SecureBackupLogoutConfirmationScreen/SecureBackupLogoutConfirmationScreenModels.swift b/ElementX/Sources/Screens/SecureBackup/SecureBackupLogoutConfirmationScreen/SecureBackupLogoutConfirmationScreenModels.swift index 07949ad2a..1901e9676 100644 --- a/ElementX/Sources/Screens/SecureBackup/SecureBackupLogoutConfirmationScreen/SecureBackupLogoutConfirmationScreenModels.swift +++ b/ElementX/Sources/Screens/SecureBackup/SecureBackupLogoutConfirmationScreen/SecureBackupLogoutConfirmationScreenModels.swift @@ -30,6 +30,15 @@ enum SecureBackupLogoutConfirmationScreenViewMode { struct SecureBackupLogoutConfirmationScreenViewState: BindableState { var mode: SecureBackupLogoutConfirmationScreenViewMode + var bindings = SecureBackupLogoutConfirmationScreenBindings() +} + +struct SecureBackupLogoutConfirmationScreenBindings { + var alertInfo: AlertInfo? +} + +enum SecureBackupLogoutConfirmationScreenAlertType { + case backupUploadFailed } enum SecureBackupLogoutConfirmationScreenViewAction { diff --git a/ElementX/Sources/Screens/SecureBackup/SecureBackupLogoutConfirmationScreen/SecureBackupLogoutConfirmationScreenViewModel.swift b/ElementX/Sources/Screens/SecureBackup/SecureBackupLogoutConfirmationScreen/SecureBackupLogoutConfirmationScreenViewModel.swift index e561e425b..835dd6925 100644 --- a/ElementX/Sources/Screens/SecureBackup/SecureBackupLogoutConfirmationScreen/SecureBackupLogoutConfirmationScreenViewModel.swift +++ b/ElementX/Sources/Screens/SecureBackup/SecureBackupLogoutConfirmationScreen/SecureBackupLogoutConfirmationScreenViewModel.swift @@ -77,7 +77,18 @@ class SecureBackupLogoutConfirmationScreenViewModel: SecureBackupLogoutConfirmat state.mode = networkMonitor.reachabilityPublisher.value == .reachable ? .backupOngoing : .offline keyUploadWaitingTask = Task { - await secureBackupController.waitForKeyBackup() + var result = await secureBackupController.waitForKeyBackupUpload() + + if case .failure = result { + // Retry the upload first, conditions might have changed. + result = await secureBackupController.waitForKeyBackupUpload() + } + + guard case .success = result else { + MXLog.error("Aborting logout due to failure waiting for backup upload.") + state.bindings.alertInfo = .init(id: .backupUploadFailed) + return + } guard !Task.isCancelled else { return } diff --git a/ElementX/Sources/Screens/SecureBackup/SecureBackupLogoutConfirmationScreen/View/SecureBackupLogoutConfirmationScreen.swift b/ElementX/Sources/Screens/SecureBackup/SecureBackupLogoutConfirmationScreen/View/SecureBackupLogoutConfirmationScreen.swift index 0fb4ba9a5..7c5dbb638 100644 --- a/ElementX/Sources/Screens/SecureBackup/SecureBackupLogoutConfirmationScreen/View/SecureBackupLogoutConfirmationScreen.swift +++ b/ElementX/Sources/Screens/SecureBackup/SecureBackupLogoutConfirmationScreen/View/SecureBackupLogoutConfirmationScreen.swift @@ -33,6 +33,7 @@ struct SecureBackupLogoutConfirmationScreen: View { .toolbar { toolbar } .background(Color.compound.bgCanvasDefault.ignoresSafeArea()) .safeAreaInset(edge: .bottom) { footer.padding() } + .alert(item: $context.alertInfo) } } diff --git a/ElementX/Sources/Services/SecureBackup/SecureBackupController.swift b/ElementX/Sources/Services/SecureBackup/SecureBackupController.swift index 2c9389ccb..bae72b8d2 100644 --- a/ElementX/Sources/Services/SecureBackup/SecureBackupController.swift +++ b/ElementX/Sources/Services/SecureBackup/SecureBackupController.swift @@ -122,8 +122,23 @@ class SecureBackupController: SecureBackupControllerProtocol { } } - func waitForKeyBackup() async { - await encryption.waitForBackupUploadSteadyState(progressListener: nil) + func waitForKeyBackupUpload() async -> Result { + do { + try await encryption.waitForBackupUploadSteadyState(progressListener: nil) + return .success(()) + } catch let error as SteadyStateError { + switch error { + case .BackupDisabled: + MXLog.error("Key backup disabled, continuing logout.") + return .success(()) + case .Connection, .Laged: + MXLog.error("Key backup upload failure: \(error)") + return .failure(.failedUploadingForBackup) + } + } catch { + MXLog.error("Unknown key backup upload failure") + return .failure(.failedUploadingForBackup) + } } } diff --git a/ElementX/Sources/Services/SecureBackup/SecureBackupControllerProtocol.swift b/ElementX/Sources/Services/SecureBackup/SecureBackupControllerProtocol.swift index fff182a2f..0311b5254 100644 --- a/ElementX/Sources/Services/SecureBackup/SecureBackupControllerProtocol.swift +++ b/ElementX/Sources/Services/SecureBackup/SecureBackupControllerProtocol.swift @@ -45,6 +45,8 @@ enum SecureBackupControllerError: Error { case failedConfirmingRecoveryKey case failedFetchingSessionState + + case failedUploadingForBackup } // sourcery: AutoMockable @@ -61,7 +63,7 @@ protocol SecureBackupControllerProtocol { func isLastSession() async -> Result - func waitForKeyBackup() async + func waitForKeyBackupUpload() async -> Result } extension SecureBackupControllerMock { diff --git a/project.yml b/project.yml index b4c8af2f5..7d468223c 100644 --- a/project.yml +++ b/project.yml @@ -29,7 +29,7 @@ settings: APP_NAME: ElementX APP_DISPLAY_NAME: Element X KEYCHAIN_ACCESS_GROUP_IDENTIFIER: $(AppIdentifierPrefix)$(BASE_BUNDLE_IDENTIFIER) - MARKETING_VERSION: 1.3.4 + MARKETING_VERSION: 1.4.0 CURRENT_PROJECT_VERSION: 1 DEVELOPMENT_TEAM: 7J4U792NQT @@ -45,7 +45,7 @@ packages: # Element/Matrix dependencies MatrixRustSDK: url: https://github.com/matrix-org/matrix-rust-components-swift - exactVersion: 0.0.1-october23 + exactVersion: 0.0.2-october23 # path: ../matrix-rust-sdk Compound: url: https://github.com/vector-im/compound-ios