From 5a490ca7b65df1f129fe83b23c4b44ba8636fef8 Mon Sep 17 00:00:00 2001 From: Sasha Weiss Date: Wed, 1 May 2024 13:18:37 -0700 Subject: [PATCH] Avoid message backup upload on main thread --- .../InternalSettingsViewController.swift | 50 ++++++++++++------- 1 file changed, 33 insertions(+), 17 deletions(-) diff --git a/Signal/src/ViewControllers/AppSettings/Internal/InternalSettingsViewController.swift b/Signal/src/ViewControllers/AppSettings/Internal/InternalSettingsViewController.swift index 26b9b56acb..b93058ec6d 100644 --- a/Signal/src/ViewControllers/AppSettings/Internal/InternalSettingsViewController.swift +++ b/Signal/src/ViewControllers/AppSettings/Internal/InternalSettingsViewController.swift @@ -192,8 +192,11 @@ class InternalSettingsViewController: OWSTableViewController2 { private extension InternalSettingsViewController { func exportMessageBackupProto() { + let messageBackupManager = DependenciesBridge.shared.messageBackupManager + let tsAccountManager = DependenciesBridge.shared.tsAccountManager + guard let localIdentifiers = databaseStorage.read(block: {tx in - return DependenciesBridge.shared.tsAccountManager.localIdentifiers(tx: tx.asV2Read) + return tsAccountManager.localIdentifiers(tx: tx.asV2Read) }) else { return } @@ -202,9 +205,15 @@ private extension InternalSettingsViewController { fromViewController: self, canCancel: false ) { modal in + func dismissModalAndToast(_ message: String) { + modal.dismiss { + self.presentToast(text: message) + } + } + Task { do { - let metadata = try await DependenciesBridge.shared.messageBackupManager.createBackup(localIdentifiers: localIdentifiers) + let metadata = try await messageBackupManager.createBackup(localIdentifiers: localIdentifiers) await MainActor.run { let actionSheet = ActionSheetController(title: "Choose backup destination:") @@ -213,40 +222,47 @@ private extension InternalSettingsViewController { activityItems: [metadata.fileUrl], applicationActivities: nil ) - let vc = UIApplication.shared.frontmostViewController! - activityVC.popoverPresentationController?.sourceView = vc.view + activityVC.popoverPresentationController?.sourceView = self.view activityVC.completionWithItemsHandler = { _, _, _, _ in modal.dismiss() } - vc.present(activityVC, animated: true) + modal.present(activityVC, animated: true) } - actionSheet.addAction(localFileAction) let remoteFileAction = ActionSheetAction(title: "Remote server") { _ in - Task { @MainActor in - let vc = UIApplication.shared.frontmostViewController! + Task { + let uploadError: Error? do { - _ = try await DependenciesBridge.shared.messageBackupManager.uploadBackup( + _ = try await messageBackupManager.uploadBackup( metadata: metadata, localIdentifiers: localIdentifiers, auth: .implicit() ) - vc.presentToast(text: "Success!") - } catch { - vc.presentToast(text: "Failed! \(error.localizedDescription)") + uploadError = nil + } catch let error { + uploadError = error + } + + await MainActor.run { + dismissModalAndToast({ + if let uploadError { + return "Failed! \(uploadError.localizedDescription)" + } + + return "Success!" + }()) } - modal.dismiss() } } - actionSheet.addAction(remoteFileAction) - let vc = UIApplication.shared.frontmostViewController! - vc.presentActionSheet(actionSheet) + actionSheet.addAction(localFileAction) + actionSheet.addAction(remoteFileAction) + modal.presentActionSheet(actionSheet) } } catch { owsFailDebug("Failed to create backup!") await MainActor.run { - modal.dismiss() + dismissModalAndToast("Failed to create backup!") } } }