From 28e924779342dc88ff07b3d08c02b6543be9f602 Mon Sep 17 00:00:00 2001 From: Sasha Weiss Date: Mon, 1 Jun 2026 12:56:00 -0700 Subject: [PATCH] Split Megaphone, MegaphoneView --- Signal.xcodeproj/project.pbxproj | 8 +- .../Megaphones/ExperienceUpgradeManager.swift | 25 +-- .../BackupEnablementMegaphone.swift | 4 +- .../BackupsEnabledNotificationMegaphone.swift | 6 +- .../ContactPermissionReminderMegaphone.swift | 4 +- .../CreateUsernameMegaphone.swift | 2 +- ...nactiveLinkedDeviceReminderMegaphone.swift | 2 +- ...activePrimaryDeviceReminderMegaphone.swift | 2 +- ...s.swift => IntroducingPINsMegaphone.swift} | 20 +-- .../UserInterface/MegaphoneView.swift | 144 ++++++++++++------ ...NewLinkedDeviceNotificationMegaphone.swift | 2 +- ...ificationPermissionReminderMegaphone.swift | 4 +- .../UserInterface/PinReminderMegaphone.swift | 6 +- .../RecoveryKeyReminderMegaphone.swift | 10 +- .../UserInterface/RemoteMegaphone.swift | 6 +- 15 files changed, 148 insertions(+), 97 deletions(-) rename Signal/Megaphones/UserInterface/{IntroducingPINs.swift => IntroducingPINsMegaphone.swift} (72%) diff --git a/Signal.xcodeproj/project.pbxproj b/Signal.xcodeproj/project.pbxproj index 9977ac18fa..0096a48ba2 100644 --- a/Signal.xcodeproj/project.pbxproj +++ b/Signal.xcodeproj/project.pbxproj @@ -1675,7 +1675,7 @@ 88A357B923639384009D6B9A /* MemberActionSheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88A357B823639384009D6B9A /* MemberActionSheet.swift */; }; 88A4CC10246CE2760082211F /* TransferProgressView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88A4CC0F246CE2760082211F /* TransferProgressView.swift */; }; 88A505F423DA16E10005C012 /* ExperienceUpgradeManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88A505F323DA16E10005C012 /* ExperienceUpgradeManager.swift */; }; - 88A505FA23DBA1360005C012 /* IntroducingPINs.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88A505F923DBA1360005C012 /* IntroducingPINs.swift */; }; + 88A505FA23DBA1360005C012 /* IntroducingPINsMegaphone.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88A505F923DBA1360005C012 /* IntroducingPINsMegaphone.swift */; }; 88A941992409A391000E9700 /* LottieToggleButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88A941982409A391000E9700 /* LottieToggleButton.swift */; }; 88A9729222FA5D4B004B4FBF /* AttachmentFormatPickerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88A9729122FA5D4B004B4FBF /* AttachmentFormatPickerView.swift */; }; 88A9729422FB4D02004B4FBF /* LocationPicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88A9729322FB4D02004B4FBF /* LocationPicker.swift */; }; @@ -5922,7 +5922,7 @@ 88A4717228664DE3001A3065 /* BaseMemberViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseMemberViewController.swift; sourceTree = ""; }; 88A4CC0F246CE2760082211F /* TransferProgressView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransferProgressView.swift; sourceTree = ""; }; 88A505F323DA16E10005C012 /* ExperienceUpgradeManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExperienceUpgradeManager.swift; sourceTree = ""; }; - 88A505F923DBA1360005C012 /* IntroducingPINs.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IntroducingPINs.swift; sourceTree = ""; }; + 88A505F923DBA1360005C012 /* IntroducingPINsMegaphone.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IntroducingPINsMegaphone.swift; sourceTree = ""; }; 88A695BC232C18DF002F7B9B /* AudioWaveformProgressView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AudioWaveformProgressView.swift; sourceTree = ""; }; 88A941982409A391000E9700 /* LottieToggleButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LottieToggleButton.swift; sourceTree = ""; }; 88A9729122FA5D4B004B4FBF /* AttachmentFormatPickerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AttachmentFormatPickerView.swift; sourceTree = ""; }; @@ -11438,7 +11438,7 @@ D9C2D77F299EC11400D79715 /* CreateUsernameMegaphone.swift */, D9C0AE682BD82DBC00FCB05E /* InactiveLinkedDeviceReminderMegaphone.swift */, 04BBBE8F2E259A5F00E914B1 /* InactivePrimaryDeviceReminderMegaphone.swift */, - 88A505F923DBA1360005C012 /* IntroducingPINs.swift */, + 88A505F923DBA1360005C012 /* IntroducingPINsMegaphone.swift */, 8837F74023DA0B0F00772A32 /* MegaphoneView.swift */, B9B7BC642D41C61500C26E42 /* NewLinkedDeviceNotificationMegaphone.swift */, 8806EF18248DBD7200E764C7 /* NotificationPermissionReminderMegaphone.swift */, @@ -18433,7 +18433,7 @@ 66D31F972E5E685300A1C82D /* InternalListMediaViewController.swift in Sources */, 8862A55925F090C5005D65DB /* InternalSettingsViewController.swift in Sources */, 663883572D4C0360008EA898 /* InternalSQLClientViewController.swift in Sources */, - 88A505FA23DBA1360005C012 /* IntroducingPINs.swift in Sources */, + 88A505FA23DBA1360005C012 /* IntroducingPINsMegaphone.swift in Sources */, 32AC5CE7255B51E900829BD8 /* JoinGroupCallPill.swift in Sources */, 45C845AD291466C0005F6EA5 /* JournalingOrderedDictionary.swift in Sources */, 5045F44229E0DB7100058E5F /* LaunchJobs.swift in Sources */, diff --git a/Signal/Megaphones/ExperienceUpgradeManager.swift b/Signal/Megaphones/ExperienceUpgradeManager.swift index a5f9a7f627..837c4de135 100644 --- a/Signal/Megaphones/ExperienceUpgradeManager.swift +++ b/Signal/Megaphones/ExperienceUpgradeManager.swift @@ -12,7 +12,9 @@ class ExperienceUpgradeManager { static let lastExperienceUpgradeDismissDate = "lastExperienceUpgradeDismissDate" } - private weak static var lastPresented: MegaphoneView? + // The Megaphone is retained for the lifetime of the MegaphoneView. + private weak static var lastPresentedMegaphone: Megaphone? + private weak static var lastPresentedMegaphoneView: MegaphoneView? private static let backupSettingsStore = BackupSettingsStore() private static var db: DB { DependenciesBridge.shared.db } @@ -152,8 +154,8 @@ class ExperienceUpgradeManager { } if - let lastPresented, - lastPresented.experienceUpgrade.manifest == nextExperienceUpgrade.manifest + let lastPresentedMegaphone, + lastPresentedMegaphone.experienceUpgrade.manifest == nextExperienceUpgrade.manifest { return } @@ -170,8 +172,12 @@ class ExperienceUpgradeManager { fromViewController: fromViewController, ) { - megaphone.present(fromViewController: fromViewController) - lastPresented = megaphone + let megaphoneView = megaphone.buildView() + ObjectRetainer.retainObject(megaphone, forLifetimeOf: megaphoneView) + + megaphoneView.present(fromViewController: fromViewController) + lastPresentedMegaphone = megaphone + lastPresentedMegaphoneView = megaphoneView db.write { tx in experienceUpgradeStore.markAsViewed( @@ -219,7 +225,7 @@ class ExperienceUpgradeManager { /// - Returns /// Whether or not we dismissed a megaphone. private static func dismissLastPresented(now: Date) -> Bool { - guard let lastPresented else { + guard lastPresentedMegaphone != nil, let lastPresentedMegaphoneView else { return false } @@ -231,8 +237,9 @@ class ExperienceUpgradeManager { ) } - lastPresented.dismiss(animated: false, completion: nil) - self.lastPresented = nil + lastPresentedMegaphoneView.dismiss(animated: false, completion: nil) + self.lastPresentedMegaphone = nil + self.lastPresentedMegaphoneView = nil return true } @@ -263,7 +270,7 @@ class ExperienceUpgradeManager { } } - private static func megaphone(forExperienceUpgrade experienceUpgrade: ExperienceUpgrade, fromViewController: UIViewController) -> MegaphoneView? { + private static func megaphone(forExperienceUpgrade experienceUpgrade: ExperienceUpgrade, fromViewController: UIViewController) -> Megaphone? { let db = DependenciesBridge.shared.db let deviceStore = DependenciesBridge.shared.deviceStore let localUsernameManager = DependenciesBridge.shared.localUsernameManager diff --git a/Signal/Megaphones/UserInterface/BackupEnablementMegaphone.swift b/Signal/Megaphones/UserInterface/BackupEnablementMegaphone.swift index 3fb85139ea..e2e0dd847f 100644 --- a/Signal/Megaphones/UserInterface/BackupEnablementMegaphone.swift +++ b/Signal/Megaphones/UserInterface/BackupEnablementMegaphone.swift @@ -7,7 +7,7 @@ import Foundation import SignalServiceKit import UIKit -class BackupEnablementMegaphone: MegaphoneView { +class BackupEnablementMegaphone: Megaphone { init( experienceUpgrade: ExperienceUpgrade, fromViewController: UIViewController, @@ -33,7 +33,7 @@ class BackupEnablementMegaphone: MegaphoneView { comment: "Snooze text for Backup enablement reminder megaphone", ) - let primaryButton = MegaphoneView.Button(title: primaryButtonTitle) { [weak self] in + let primaryButton = Button(title: primaryButtonTitle) { [weak self] in SignalApp.shared.showAppSettings(mode: .backups()) self?.markAsSnoozedWithSneakyTransaction() } diff --git a/Signal/Megaphones/UserInterface/BackupsEnabledNotificationMegaphone.swift b/Signal/Megaphones/UserInterface/BackupsEnabledNotificationMegaphone.swift index 0f2e4d0f68..ff674f0e97 100644 --- a/Signal/Megaphones/UserInterface/BackupsEnabledNotificationMegaphone.swift +++ b/Signal/Megaphones/UserInterface/BackupsEnabledNotificationMegaphone.swift @@ -7,7 +7,7 @@ import Foundation import SignalServiceKit import UIKit -class BackupsEnabledNotificationMegaphone: MegaphoneView { +class BackupsEnabledNotificationMegaphone: Megaphone { private let db: DB private let backupSettingsStore: BackupSettingsStore init( @@ -40,12 +40,12 @@ class BackupsEnabledNotificationMegaphone: MegaphoneView { "BACKUPS_VIEW_SETTINGS_BUTTON", comment: "Action text for backups enabled megaphone taking user to backup settings", ) - let primaryButton = MegaphoneView.Button(title: primaryButtonTitle) { [weak self] in + let primaryButton = Button(title: primaryButtonTitle) { [weak self] in SignalApp.shared.showAppSettings(mode: .backups()) self?.stopShowing() } - let secondaryButton = MegaphoneView.Button(title: CommonStrings.okButton) { [weak self] in + let secondaryButton = Button(title: CommonStrings.okButton) { [weak self] in self?.stopShowing() } diff --git a/Signal/Megaphones/UserInterface/ContactPermissionReminderMegaphone.swift b/Signal/Megaphones/UserInterface/ContactPermissionReminderMegaphone.swift index 7fcf869106..98916a7e73 100644 --- a/Signal/Megaphones/UserInterface/ContactPermissionReminderMegaphone.swift +++ b/Signal/Megaphones/UserInterface/ContactPermissionReminderMegaphone.swift @@ -6,7 +6,7 @@ import SignalServiceKit import SignalUI -class ContactPermissionReminderMegaphone: MegaphoneView { +class ContactPermissionReminderMegaphone: Megaphone { init(experienceUpgrade: ExperienceUpgrade, fromViewController: UIViewController) { super.init(experienceUpgrade: experienceUpgrade) @@ -25,7 +25,7 @@ class ContactPermissionReminderMegaphone: MegaphoneView { comment: "Action text for contact permission reminder megaphone", ) - let primaryButton = MegaphoneView.Button(title: primaryButtonTitle) { + let primaryButton = Button(title: primaryButtonTitle) { let actionSheetController = ActionSheetController() actionSheetController.isCancelable = true diff --git a/Signal/Megaphones/UserInterface/CreateUsernameMegaphone.swift b/Signal/Megaphones/UserInterface/CreateUsernameMegaphone.swift index 5c43588d83..c8e1ef8cce 100644 --- a/Signal/Megaphones/UserInterface/CreateUsernameMegaphone.swift +++ b/Signal/Megaphones/UserInterface/CreateUsernameMegaphone.swift @@ -7,7 +7,7 @@ import Foundation import SignalServiceKit import UIKit -class CreateUsernameMegaphone: MegaphoneView { +class CreateUsernameMegaphone: Megaphone { private let usernameSelectionCoordinator: UsernameSelectionCoordinator init( diff --git a/Signal/Megaphones/UserInterface/InactiveLinkedDeviceReminderMegaphone.swift b/Signal/Megaphones/UserInterface/InactiveLinkedDeviceReminderMegaphone.swift index ef12634894..c391a936ff 100644 --- a/Signal/Megaphones/UserInterface/InactiveLinkedDeviceReminderMegaphone.swift +++ b/Signal/Megaphones/UserInterface/InactiveLinkedDeviceReminderMegaphone.swift @@ -6,7 +6,7 @@ import SignalServiceKit import UIKit -final class InactiveLinkedDeviceReminderMegaphone: MegaphoneView { +final class InactiveLinkedDeviceReminderMegaphone: Megaphone { private let inactiveLinkedDevice: InactiveLinkedDevice /// The number of days until the linked device represented by this megaphone diff --git a/Signal/Megaphones/UserInterface/InactivePrimaryDeviceReminderMegaphone.swift b/Signal/Megaphones/UserInterface/InactivePrimaryDeviceReminderMegaphone.swift index e029be4633..087e5e6842 100644 --- a/Signal/Megaphones/UserInterface/InactivePrimaryDeviceReminderMegaphone.swift +++ b/Signal/Megaphones/UserInterface/InactivePrimaryDeviceReminderMegaphone.swift @@ -6,7 +6,7 @@ import SafariServices import SignalServiceKit -final class InactivePrimaryDeviceReminderMegaphone: MegaphoneView { +final class InactivePrimaryDeviceReminderMegaphone: Megaphone { init( fromViewController: UIViewController, experienceUpgrade: ExperienceUpgrade, diff --git a/Signal/Megaphones/UserInterface/IntroducingPINs.swift b/Signal/Megaphones/UserInterface/IntroducingPINsMegaphone.swift similarity index 72% rename from Signal/Megaphones/UserInterface/IntroducingPINs.swift rename to Signal/Megaphones/UserInterface/IntroducingPINsMegaphone.swift index 0fdc109dab..fda70c4177 100644 --- a/Signal/Megaphones/UserInterface/IntroducingPINs.swift +++ b/Signal/Megaphones/UserInterface/IntroducingPINsMegaphone.swift @@ -7,7 +7,7 @@ import SafariServices import SignalServiceKit import SignalUI -class IntroducingPinsMegaphone: MegaphoneView { +class IntroducingPinsMegaphone: Megaphone { init(experienceUpgrade: ExperienceUpgrade, fromViewController: UIViewController) { super.init(experienceUpgrade: experienceUpgrade) @@ -17,7 +17,7 @@ class IntroducingPinsMegaphone: MegaphoneView { let primaryButtonTitle = OWSLocalizedString("PINS_MEGAPHONE_ACTION", comment: "Action text for PIN megaphone when user doesn't have a PIN") - let primaryButton = MegaphoneView.Button(title: primaryButtonTitle) { [weak self] in + let primaryButton = Button(title: primaryButtonTitle) { [weak self] in let viewController = PinSetupViewController( mode: .creating, showCancelButton: true, @@ -27,20 +27,20 @@ class IntroducingPinsMegaphone: MegaphoneView { markAsCompleteWithSneakyTransaction() - presentToast( - text: OWSLocalizedString( - "PINS_MEGAPHONE_TOAST", - comment: "Toast indicating that a PIN has been created.", - ), - fromViewController: fromViewController, - ) + fromViewController.presentToast(text: OWSLocalizedString( + "PINS_MEGAPHONE_TOAST", + comment: "Toast indicating that a PIN has been created.", + )) } }, ) fromViewController.present(OWSNavigationController(rootViewController: viewController), animated: true) } - let secondaryButton = snoozeButton(fromViewController: fromViewController) + let secondaryButton = snoozeButton( + fromViewController: fromViewController, + snoozeTitle: MegaphoneStrings.remindMeLater, + ) buttons = [primaryButton, secondaryButton] } diff --git a/Signal/Megaphones/UserInterface/MegaphoneView.swift b/Signal/Megaphones/UserInterface/MegaphoneView.swift index d0cd3e6b2d..2fb65e14b6 100644 --- a/Signal/Megaphones/UserInterface/MegaphoneView.swift +++ b/Signal/Megaphones/UserInterface/MegaphoneView.swift @@ -7,7 +7,7 @@ import Lottie import SignalServiceKit import SignalUI -class MegaphoneView: UIView { +class Megaphone { struct Button { let title: String let action: () -> Void @@ -20,11 +20,94 @@ class MegaphoneView: UIView { var bodyText: String? var buttons: [Button] = [] + init(experienceUpgrade: ExperienceUpgrade) { + self.experienceUpgrade = experienceUpgrade + } + + func buildView() -> MegaphoneView { + guard let titleText, let bodyText else { + owsFail("Megaphone missing title or body text!") + } + guard (1...2).contains(buttons.count) else { + owsFail("Megaphone must have 1 or 2 buttons!") + } + + return MegaphoneView( + image: image, + imageContentMode: imageContentMode, + titleText: titleText, + bodyText: bodyText, + buttons: buttons, + ) + } + + func snoozeButton( + fromViewController: UIViewController, + snoozeTitle: String, + ) -> Button { + return Button(title: snoozeTitle) { [weak self, weak fromViewController] in + guard let self, let fromViewController else { return } + + markAsSnoozedWithSneakyTransaction() + fromViewController.presentToast(text: MegaphoneStrings.weWillRemindYouLater) + } + } + + // MARK: - + + func markAsSnoozedWithSneakyTransaction() { + let db = DependenciesBridge.shared.db + let experienceUpgradeStore = ExperienceUpgradeStore() + + db.write { tx in + experienceUpgradeStore.markAsSnoozed( + experienceUpgrade: experienceUpgrade, + tx: tx, + ) + } + + NotificationCenter.default.post(name: .megaphoneStateDidChange, object: nil) + } + + func markAsCompleteWithSneakyTransaction() { + let db = DependenciesBridge.shared.db + let experienceUpgradeStore = ExperienceUpgradeStore() + + db.write { tx in + experienceUpgradeStore.markAsComplete( + experienceUpgrade: experienceUpgrade, + tx: tx, + ) + } + + NotificationCenter.default.post(name: .megaphoneStateDidChange, object: nil) + } +} + +// MARK: - + +class MegaphoneView: UIView { + private let image: UIImage? + private let imageContentMode: UIView.ContentMode + private let titleText: String + private let bodyText: String + private let buttons: [Megaphone.Button] + private let darkThemeBackgroundOverlay = UIView() private let stackView = UIStackView() - init(experienceUpgrade: ExperienceUpgrade) { - self.experienceUpgrade = experienceUpgrade + init( + image: UIImage?, + imageContentMode: UIView.ContentMode, + titleText: String, + bodyText: String, + buttons: [Megaphone.Button], + ) { + self.image = image + self.imageContentMode = imageContentMode + self.titleText = titleText + self.bodyText = bodyText + self.buttons = buttons super.init(frame: .zero) @@ -60,10 +143,6 @@ class MegaphoneView: UIView { guard !hasPresented else { return owsFailDebug("can only present once") } - guard titleText != nil, bodyText != nil, !buttons.isEmpty else { - owsFail("Megaphone missing required properties!") - } - let labelStack = createLabelStack() let topStackSubviews: [UIView] @@ -153,7 +232,10 @@ class MegaphoneView: UIView { return container } - private func createButtonView(_ button: Button, font: UIFont = .regularFont(ofSize: 15)) -> OWSFlatButton { + private func createButtonView( + _ button: Megaphone.Button, + font: UIFont = .regularFont(ofSize: 15), + ) -> OWSFlatButton { let buttonView = OWSFlatButton() buttonView.setTitle(title: button.title, font: font, titleColor: Theme.darkThemePrimaryColor) @@ -170,13 +252,16 @@ class MegaphoneView: UIView { switch buttons.count { case 1: - buttonsStack.addArrangedSubview(createButtonView(buttons[0])) + buttonsStack.addArrangedSubview(createButtonView( + buttons[0], + font: .regularFont(ofSize: 15), + )) case 2: var previousButton: UIView? for button in buttons { let buttonView = createButtonView( button, - font: previousButton == nil ? UIFont.semiboldFont(ofSize: 15) : .regularFont(ofSize: 15), + font: previousButton == nil ? .semiboldFont(ofSize: 15) : .regularFont(ofSize: 15), ) buttonsStack.insertArrangedSubview(buttonView, at: 0) @@ -199,43 +284,4 @@ class MegaphoneView: UIView { return buttonsStack } - - func snoozeButton(fromViewController: UIViewController, snoozeTitle: String = MegaphoneStrings.remindMeLater) -> Button { - return Button(title: snoozeTitle) { [weak self, weak fromViewController] in - guard let self, let fromViewController else { return } - - markAsSnoozedWithSneakyTransaction() - presentToast(text: MegaphoneStrings.weWillRemindYouLater, fromViewController: fromViewController) - } - } - - // MARK: - - - func markAsSnoozedWithSneakyTransaction() { - let db = DependenciesBridge.shared.db - let experienceUpgradeStore = ExperienceUpgradeStore() - - db.write { tx in - experienceUpgradeStore.markAsSnoozed( - experienceUpgrade: experienceUpgrade, - tx: tx, - ) - } - - NotificationCenter.default.post(name: .megaphoneStateDidChange, object: nil) - } - - func markAsCompleteWithSneakyTransaction() { - let db = DependenciesBridge.shared.db - let experienceUpgradeStore = ExperienceUpgradeStore() - - db.write { tx in - experienceUpgradeStore.markAsComplete( - experienceUpgrade: experienceUpgrade, - tx: tx, - ) - } - - NotificationCenter.default.post(name: .megaphoneStateDidChange, object: nil) - } } diff --git a/Signal/Megaphones/UserInterface/NewLinkedDeviceNotificationMegaphone.swift b/Signal/Megaphones/UserInterface/NewLinkedDeviceNotificationMegaphone.swift index 746d1130f1..20436473fe 100644 --- a/Signal/Megaphones/UserInterface/NewLinkedDeviceNotificationMegaphone.swift +++ b/Signal/Megaphones/UserInterface/NewLinkedDeviceNotificationMegaphone.swift @@ -5,7 +5,7 @@ import SignalServiceKit -final class NewLinkedDeviceNotificationMegaphone: MegaphoneView { +final class NewLinkedDeviceNotificationMegaphone: Megaphone { private let db: DB private let deviceStore: OWSDeviceStore diff --git a/Signal/Megaphones/UserInterface/NotificationPermissionReminderMegaphone.swift b/Signal/Megaphones/UserInterface/NotificationPermissionReminderMegaphone.swift index 7cfc358b3c..324ce66a70 100644 --- a/Signal/Megaphones/UserInterface/NotificationPermissionReminderMegaphone.swift +++ b/Signal/Megaphones/UserInterface/NotificationPermissionReminderMegaphone.swift @@ -6,7 +6,7 @@ import SignalServiceKit import SignalUI -class NotificationPermissionReminderMegaphone: MegaphoneView { +class NotificationPermissionReminderMegaphone: Megaphone { init(experienceUpgrade: ExperienceUpgrade, fromViewController: UIViewController) { super.init(experienceUpgrade: experienceUpgrade) @@ -25,7 +25,7 @@ class NotificationPermissionReminderMegaphone: MegaphoneView { comment: "Action text for notification permission reminder megaphone", ) - let primaryButton = MegaphoneView.Button(title: primaryButtonTitle) { + let primaryButton = Button(title: primaryButtonTitle) { let actionSheetController = ActionSheetController() actionSheetController.isCancelable = true diff --git a/Signal/Megaphones/UserInterface/PinReminderMegaphone.swift b/Signal/Megaphones/UserInterface/PinReminderMegaphone.swift index 06b28c799d..02c6791def 100644 --- a/Signal/Megaphones/UserInterface/PinReminderMegaphone.swift +++ b/Signal/Megaphones/UserInterface/PinReminderMegaphone.swift @@ -7,7 +7,7 @@ import Foundation import SignalServiceKit import UIKit -class PinReminderMegaphone: MegaphoneView { +class PinReminderMegaphone: Megaphone { init(experienceUpgrade: ExperienceUpgrade, fromViewController: UIViewController) { super.init(experienceUpgrade: experienceUpgrade) @@ -17,7 +17,7 @@ class PinReminderMegaphone: MegaphoneView { let primaryButtonTitle = OWSLocalizedString("PIN_REMINDER_MEGAPHONE_ACTION", comment: "Action text for PIN reminder megaphone") - let primaryButton = MegaphoneView.Button(title: primaryButtonTitle) { [weak fromViewController] in + let primaryButton = Button(title: primaryButtonTitle) { [weak fromViewController] in guard let fromViewController else { return } let vc = PinReminderViewController { [weak self] pinReminderViewController, result in @@ -104,6 +104,6 @@ class PinReminderMegaphone: MegaphoneView { toastText = MegaphoneStrings.weWillRemindYouLater } - presentToast(text: toastText, fromViewController: fromViewController) + fromViewController.presentToast(text: toastText) } } diff --git a/Signal/Megaphones/UserInterface/RecoveryKeyReminderMegaphone.swift b/Signal/Megaphones/UserInterface/RecoveryKeyReminderMegaphone.swift index 61d87d6b30..942b47f3b3 100644 --- a/Signal/Megaphones/UserInterface/RecoveryKeyReminderMegaphone.swift +++ b/Signal/Megaphones/UserInterface/RecoveryKeyReminderMegaphone.swift @@ -7,7 +7,7 @@ import Foundation import SignalServiceKit import UIKit -class RecoveryKeyReminderMegaphone: MegaphoneView { +class RecoveryKeyReminderMegaphone: Megaphone { init( experienceUpgrade: ExperienceUpgrade, fromViewController: UIViewController, @@ -33,7 +33,7 @@ class RecoveryKeyReminderMegaphone: MegaphoneView { comment: "Snooze text for Recovery Key reminder megaphone", ) - let primaryButton = MegaphoneView.Button(title: primaryButtonTitle) { + let primaryButton = Button(title: primaryButtonTitle) { let accountKeyStore = DependenciesBridge.shared.accountKeyStore let backupSettingsStore = BackupSettingsStore() let db = DependenciesBridge.shared.db @@ -45,9 +45,7 @@ class RecoveryKeyReminderMegaphone: MegaphoneView { BackupRecoveryKeyReminderCoordinator( aep: aep, fromViewController: fromViewController, - onSuccess: { [weak self] in - guard let self else { return } - + onSuccess: { db.write { tx in backupSettingsStore.setLastRecoveryKeyReminderDate(Date(), tx: tx) } @@ -56,7 +54,7 @@ class RecoveryKeyReminderMegaphone: MegaphoneView { "BACKUP_KEY_REMINDER_SUCCESSFUL_TOAST", comment: "Toast indicating that the Recovery Key was correct.", ) - presentToast(text: toastText, fromViewController: fromViewController) + fromViewController.presentToast(text: toastText) NotificationCenter.default.post(name: .megaphoneStateDidChange, object: nil) }, diff --git a/Signal/Megaphones/UserInterface/RemoteMegaphone.swift b/Signal/Megaphones/UserInterface/RemoteMegaphone.swift index 9dd9b2e0e9..ac132a9855 100644 --- a/Signal/Megaphones/UserInterface/RemoteMegaphone.swift +++ b/Signal/Megaphones/UserInterface/RemoteMegaphone.swift @@ -6,7 +6,7 @@ import SignalServiceKit import SignalUI -class RemoteMegaphone: MegaphoneView { +class RemoteMegaphone: Megaphone { private let megaphoneModel: RemoteMegaphoneModel init( @@ -31,7 +31,7 @@ class RemoteMegaphone: MegaphoneView { } if let primary = megaphoneModel.presentablePrimaryAction { - let primaryButton = MegaphoneView.Button(title: primary.presentableText) { [weak self, weak fromViewController] in + let primaryButton = Button(title: primary.presentableText) { [weak self, weak fromViewController] in guard let self, let fromViewController @@ -45,7 +45,7 @@ class RemoteMegaphone: MegaphoneView { } if let secondary = megaphoneModel.presentableSecondaryAction { - let secondaryButton = MegaphoneView.Button(title: secondary.presentableText) { [weak self, weak fromViewController] in + let secondaryButton = Button(title: secondary.presentableText) { [weak self, weak fromViewController] in guard let self, let fromViewController