From 7a27aa1f13f48d4b4e45d58488dcdae506d962e0 Mon Sep 17 00:00:00 2001 From: Michelle Linington Date: Mon, 26 Jul 2021 20:20:25 -0700 Subject: [PATCH] Delivery issue sheet --- .../delivery-issue.imageset/Contents.json | 12 +++++++++ .../delivery-issue.svg | 13 ++++++++++ .../CV/CVComponentDelegate.swift | 8 +++--- .../CVComponentSystemMessage.swift | 2 +- ...onViewController+CVComponentDelegate.swift | 8 ++++-- .../ConversationViewController+OWS.swift | 26 +++++++++++++++++-- .../MessageDetailViewController.swift | 2 +- Signal/src/views/MockConversationView.swift | 2 +- .../translations/en.lproj/Localizable.strings | 8 +++++- .../Messages/Interactions/TSErrorMessage.m | 2 +- .../OWSRecoverableDecryptionPlaceholder.m | 2 +- 11 files changed, 71 insertions(+), 14 deletions(-) create mode 100644 Signal/Images.xcassets/delivery-issue.imageset/Contents.json create mode 100644 Signal/Images.xcassets/delivery-issue.imageset/delivery-issue.svg diff --git a/Signal/Images.xcassets/delivery-issue.imageset/Contents.json b/Signal/Images.xcassets/delivery-issue.imageset/Contents.json new file mode 100644 index 0000000000..49f11617d4 --- /dev/null +++ b/Signal/Images.xcassets/delivery-issue.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "delivery-issue.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Signal/Images.xcassets/delivery-issue.imageset/delivery-issue.svg b/Signal/Images.xcassets/delivery-issue.imageset/delivery-issue.svg new file mode 100644 index 0000000000..64edbf0904 --- /dev/null +++ b/Signal/Images.xcassets/delivery-issue.imageset/delivery-issue.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/Signal/src/ViewControllers/ConversationView/CV/CVComponentDelegate.swift b/Signal/src/ViewControllers/ConversationView/CV/CVComponentDelegate.swift index d3cef271e9..12f9eca50a 100644 --- a/Signal/src/ViewControllers/ConversationView/CV/CVComponentDelegate.swift +++ b/Signal/src/ViewControllers/ConversationView/CV/CVComponentDelegate.swift @@ -159,7 +159,7 @@ public protocol CVComponentDelegate { func cvc_didTapUnknownThreadWarningGroup() func cvc_didTapUnknownThreadWarningContact() - func cvc_didTapDeliveryIssueWarning() + func cvc_didTapDeliveryIssueWarning(_ message: TSErrorMessage) } // MARK: - @@ -197,7 +197,7 @@ struct CVMessageAction: Equatable { case cvc_didTapAddToContacts(contactShare: ContactShareViewModel) case cvc_didTapUnknownThreadWarningGroup case cvc_didTapUnknownThreadWarningContact - case cvc_didTapDeliveryIssueWarning + case cvc_didTapDeliveryIssueWarning(errorMessage: TSErrorMessage) func perform(delegate: CVComponentDelegate) { switch self { @@ -245,8 +245,8 @@ struct CVMessageAction: Equatable { delegate.cvc_didTapUnknownThreadWarningGroup() case .cvc_didTapUnknownThreadWarningContact: delegate.cvc_didTapUnknownThreadWarningContact() - case .cvc_didTapDeliveryIssueWarning: - delegate.cvc_didTapDeliveryIssueWarning() + case .cvc_didTapDeliveryIssueWarning(let errorMessage): + delegate.cvc_didTapDeliveryIssueWarning(errorMessage) } } } diff --git a/Signal/src/ViewControllers/ConversationView/CV/CVComponents/CVComponentSystemMessage.swift b/Signal/src/ViewControllers/ConversationView/CV/CVComponents/CVComponentSystemMessage.swift index 57caaa2593..11de6d31a3 100644 --- a/Signal/src/ViewControllers/ConversationView/CV/CVComponents/CVComponentSystemMessage.swift +++ b/Signal/src/ViewControllers/ConversationView/CV/CVComponents/CVComponentSystemMessage.swift @@ -948,7 +948,7 @@ extension CVComponentSystemMessage { case .decryptionFailure: return Action(title: CommonStrings.learnMore, accessibilityIdentifier: "learn_more", - action: .cvc_didTapDeliveryIssueWarning) + action: .cvc_didTapDeliveryIssueWarning(errorMessage: message)) case .duplicateMessage, .invalidVersion: return nil diff --git a/Signal/src/ViewControllers/ConversationView/ConversationViewController+CVComponentDelegate.swift b/Signal/src/ViewControllers/ConversationView/ConversationViewController+CVComponentDelegate.swift index 0cb7402c85..b9b77a767c 100644 --- a/Signal/src/ViewControllers/ConversationView/ConversationViewController+CVComponentDelegate.swift +++ b/Signal/src/ViewControllers/ConversationView/ConversationViewController+CVComponentDelegate.swift @@ -707,9 +707,13 @@ extension ConversationViewController: CVComponentDelegate { showUnknownThreadWarningAlert() } - public func cvc_didTapDeliveryIssueWarning() { + public func cvc_didTapDeliveryIssueWarning(_ message: TSErrorMessage) { AssertIsOnMainThread() + guard let senderAddress = message.sender else { + owsFailDebug("Expected a sender address") + return + } - showDeliveryIssueWarningAlert() + showDeliveryIssueWarningAlert(from: senderAddress) } } diff --git a/Signal/src/ViewControllers/ConversationView/ConversationViewController+OWS.swift b/Signal/src/ViewControllers/ConversationView/ConversationViewController+OWS.swift index 5317c35cfa..171f812a2c 100644 --- a/Signal/src/ViewControllers/ConversationView/ConversationViewController+OWS.swift +++ b/Signal/src/ViewControllers/ConversationView/ConversationViewController+OWS.swift @@ -171,8 +171,30 @@ extension ConversationViewController { presentActionSheet(actionSheet) } - public func showDeliveryIssueWarningAlert() { - // TODO + public func showDeliveryIssueWarningAlert(from senderAddress: SignalServiceAddress) { + let senderName = databaseStorage.read { transaction in + Self.contactsManager.displayName(for: senderAddress, transaction: transaction) + } + let alertTitle = NSLocalizedString("ALERT_DELIVERY_ISSUE_TITLE", comment: "Title for delivery issue sheet") + let alertMessageFormat = NSLocalizedString("ALERT_DELIVERY_ISSUE_MESSAGE_FORMAT", comment: "Format string for delivery issue sheet message. Embeds {{ sender name }}.") + let alertMessage = String(format: alertMessageFormat, senderName) + + let headerImageView = UIImageView(image: .init(named: "delivery-issue")) + headerImageView.autoSetDimension(.height, toSize: 110) + headerImageView.autoSetDimension(.width, toSize: 200) + + let headerView = UIView() + headerView.addSubview(headerImageView) + headerImageView.autoPinEdge(toSuperviewEdge: .top, withInset: 22) + headerImageView.autoPinEdge(toSuperviewEdge: .bottom) + headerImageView.autoHCenterInSuperview() + + let actionSheet = ActionSheetController( + title: alertTitle, + message: alertMessage) + actionSheet.customHeader = headerView + actionSheet.addAction(OWSActionSheets.okayAction) + presentActionSheet(actionSheet) } } diff --git a/Signal/src/ViewControllers/MessageDetailViewController.swift b/Signal/src/ViewControllers/MessageDetailViewController.swift index 9af95bcdfd..780f599bdb 100644 --- a/Signal/src/ViewControllers/MessageDetailViewController.swift +++ b/Signal/src/ViewControllers/MessageDetailViewController.swift @@ -1035,7 +1035,7 @@ extension MessageDetailViewController: CVComponentDelegate { func cvc_didTapUnknownThreadWarningGroup() {} // TODO: func cvc_didTapUnknownThreadWarningContact() {} - func cvc_didTapDeliveryIssueWarning() {} + func cvc_didTapDeliveryIssueWarning(_ message: TSErrorMessage) {} } extension MessageDetailViewController: UINavigationControllerDelegate { diff --git a/Signal/src/views/MockConversationView.swift b/Signal/src/views/MockConversationView.swift index 0fcc5b822e..943748bd0c 100644 --- a/Signal/src/views/MockConversationView.swift +++ b/Signal/src/views/MockConversationView.swift @@ -412,5 +412,5 @@ extension MockConversationView: CVComponentDelegate { func cvc_didTapUnknownThreadWarningGroup() {} func cvc_didTapUnknownThreadWarningContact() {} - func cvc_didTapDeliveryIssueWarning() {} + func cvc_didTapDeliveryIssueWarning(_ message: TSErrorMessage) {} } diff --git a/Signal/translations/en.lproj/Localizable.strings b/Signal/translations/en.lproj/Localizable.strings index 3ce87e23a8..54514c5bea 100644 --- a/Signal/translations/en.lproj/Localizable.strings +++ b/Signal/translations/en.lproj/Localizable.strings @@ -112,6 +112,12 @@ /* generic button text to acknowledge that the corresponding text was read. */ "ALERT_ACTION_ACKNOWLEDGE" = "Got it"; +/* Format string for delivery issue sheet message. Embeds {{ sender name }}. */ +"ALERT_DELIVERY_ISSUE_MESSAGE_FORMAT" = "A message, sticker, reaction, read receipt or media couldn’t be delivered to you from %@. They may have tried sending it to you directly, or in a group."; + +/* Title for delivery issue sheet */ +"ALERT_DELIVERY_ISSUE_TITLE" = "Delivery Issue"; + /* The label for the 'discard' button in alerts and action sheets. */ "ALERT_DISCARD_BUTTON" = "Discard"; @@ -1618,7 +1624,7 @@ /* Error message indicating that attachment download(s) failed. */ "ERROR_MESSAGE_ATTACHMENT_DOWNLOAD_FAILED" = "Attachment download failed."; -/* Error message for a decryption failure. Embeds {{senders name}}. */ +/* Error message for a decryption failure. Embeds {{sender short name}}. */ "ERROR_MESSAGE_DECRYPTION_FAILURE" = "A message from %@ could not be delivered"; /* No comment provided by engineer. */ diff --git a/SignalServiceKit/src/Messages/Interactions/TSErrorMessage.m b/SignalServiceKit/src/Messages/Interactions/TSErrorMessage.m index aa25f6cb43..d80d1a31fd 100644 --- a/SignalServiceKit/src/Messages/Interactions/TSErrorMessage.m +++ b/SignalServiceKit/src/Messages/Interactions/TSErrorMessage.m @@ -233,7 +233,7 @@ NSUInteger TSErrorMessageSchemaVersion = 2; @"ERROR_MESSAGE_SESSION_REFRESH", @"Text notifying the user that their secure session has been reset"); case TSErrorMessageDecryptionFailure: { NSString *formatString = NSLocalizedString(@"ERROR_MESSAGE_DECRYPTION_FAILURE", - @"Error message for a decryption failure. Embeds {{senders name}}."); + @"Error message for a decryption failure. Embeds {{sender short name}}."); NSString *senderName = [self.contactsManager shortDisplayNameForAddress:self.sender transaction:transaction]; return [[NSString alloc] initWithFormat:formatString, senderName]; diff --git a/SignalServiceKit/src/Messages/OWSRecoverableDecryptionPlaceholder.m b/SignalServiceKit/src/Messages/OWSRecoverableDecryptionPlaceholder.m index cc063f0411..2f82cba0f0 100644 --- a/SignalServiceKit/src/Messages/OWSRecoverableDecryptionPlaceholder.m +++ b/SignalServiceKit/src/Messages/OWSRecoverableDecryptionPlaceholder.m @@ -82,7 +82,7 @@ NS_ASSUME_NONNULL_BEGIN - (NSString *)previewTextWithTransaction:(SDSAnyReadTransaction *)transaction { NSString *formatString = NSLocalizedString( - @"ERROR_MESSAGE_DECRYPTION_FAILURE", @"Error message for a decryption failure. Embeds {{senders name}}."); + @"ERROR_MESSAGE_DECRYPTION_FAILURE", @"Error message for a decryption failure. Embeds {{sender short name}}."); NSString *senderName = [self.contactsManager shortDisplayNameForAddress:self.sender transaction:transaction]; return [[NSString alloc] initWithFormat:formatString, senderName]; }