diff --git a/Signal.xcodeproj/project.pbxproj b/Signal.xcodeproj/project.pbxproj index 147afcfdb3..da35cb9e6c 100644 --- a/Signal.xcodeproj/project.pbxproj +++ b/Signal.xcodeproj/project.pbxproj @@ -13,6 +13,7 @@ 1466AB282817F7E7003B3D9F /* PluralAware.stringsdict in Resources */ = {isa = PBXBuildFile; fileRef = 1466AB262817F7E7003B3D9F /* PluralAware.stringsdict */; }; 1477630B275E20D700D1067E /* ThreadSwipeHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1477630A275E20D700D1067E /* ThreadSwipeHandler.swift */; }; 1489ED0227A3D70200C7043A /* ArchivedConversationsCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1489ED0127A3D70200C7043A /* ArchivedConversationsCell.swift */; }; + 14DB56A62829310B00E01AC9 /* DonationMegaphone.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14DB56A52829310B00E01AC9 /* DonationMegaphone.swift */; }; 14E4A340278EE999008408FD /* BlurredToolbarContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14E4A33F278EE999008408FD /* BlurredToolbarContainer.swift */; }; 1704690A25D4C326000793D8 /* SignalAttachmentTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1704690925D4C2E6000793D8 /* SignalAttachmentTest.swift */; }; 1704690C25D4C92B000793D8 /* test-jpg-rotated.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 1704690B25D4C92B000793D8 /* test-jpg-rotated.jpg */; }; @@ -1198,6 +1199,7 @@ 146FFAA027A7FE87004A2A64 /* Signalyzer.instrdst */ = {isa = PBXFileReference; explicitFileType = com.apple.instruments.instrdst; includeInIndex = 0; path = Signalyzer.instrdst; sourceTree = BUILT_PRODUCTS_DIR; }; 1477630A275E20D700D1067E /* ThreadSwipeHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThreadSwipeHandler.swift; sourceTree = ""; }; 1489ED0127A3D70200C7043A /* ArchivedConversationsCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ArchivedConversationsCell.swift; sourceTree = ""; }; + 14DB56A52829310B00E01AC9 /* DonationMegaphone.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DonationMegaphone.swift; sourceTree = ""; }; 14E4A33F278EE999008408FD /* BlurredToolbarContainer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlurredToolbarContainer.swift; sourceTree = ""; }; 14FD26DD3B40616C54CDBF1A /* Pods-SignalShareExtension.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SignalShareExtension.debug.xcconfig"; path = "Pods/Target Support Files/Pods-SignalShareExtension/Pods-SignalShareExtension.debug.xcconfig"; sourceTree = ""; }; 1704690925D4C2E6000793D8 /* SignalAttachmentTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignalAttachmentTest.swift; sourceTree = ""; }; @@ -4344,6 +4346,7 @@ 88A505FE23DBAE640005C012 /* Upgrade Views */ = { isa = PBXGroup; children = ( + 14DB56A52829310B00E01AC9 /* DonationMegaphone.swift */, 8806EF1A248DBFC100E764C7 /* ContactPermissionReminderMegaphone.swift */, 88FBE953264B6848005F6C80 /* SubscriptionMegaphone.swift */, 88A505F923DBA1360005C012 /* IntroducingPINs.swift */, @@ -6207,6 +6210,7 @@ 3405C06E25435048008B24EF /* ConversationViewController+Banners.swift in Sources */, 881D85B822D92C2B00E118DF /* OWSPinSetupViewController.swift in Sources */, 340FC8BA204DAC8D007AEB0F /* FingerprintViewScanController.m in Sources */, + 14DB56A62829310B00E01AC9 /* DonationMegaphone.swift in Sources */, 17ACF11E267D71E0009BE867 /* OWSAudioSession+WebRTC.swift in Sources */, 34ACA7E92733159600E47AD4 /* ChangePhoneNumberSplashViewController.swift in Sources */, 34ACA7E22733159600E47AD4 /* OnboardingPhoneNumberViewController.swift in Sources */, diff --git a/Signal/src/Experience Upgrades/ExperienceUpgradeManager.swift b/Signal/src/Experience Upgrades/ExperienceUpgradeManager.swift index 0faa379a8e..448ac7f65b 100644 --- a/Signal/src/Experience Upgrades/ExperienceUpgradeManager.swift +++ b/Signal/src/Experience Upgrades/ExperienceUpgradeManager.swift @@ -188,7 +188,7 @@ class ExperienceUpgradeManager: NSObject { case .contactPermissionReminder: return ContactPermissionReminderMegaphone(experienceUpgrade: experienceUpgrade, fromViewController: fromViewController) case .subscriptionMegaphone: - return SubscriptionMegaphone(experienceUpgrade: experienceUpgrade, fromViewController: fromViewController) + return DonationMegaphone(experienceUpgrade: experienceUpgrade, fromViewController: fromViewController) default: return nil } diff --git a/Signal/src/Experience Upgrades/Upgrade Views/DonationMegaphone.swift b/Signal/src/Experience Upgrades/Upgrade Views/DonationMegaphone.swift new file mode 100644 index 0000000000..d802337228 --- /dev/null +++ b/Signal/src/Experience Upgrades/Upgrade Views/DonationMegaphone.swift @@ -0,0 +1,36 @@ +// +// Copyright (c) 2022 Open Whisper Systems. All rights reserved. +// + +import Foundation + +class DonationMegaphone: MegaphoneView { + init(experienceUpgrade: ExperienceUpgrade, fromViewController: UIViewController) { + super.init(experienceUpgrade: experienceUpgrade) + + titleText = NSLocalizedString("DONATE_MEGAPHONE_TITLE", comment: "Title for donate megaphone") + bodyText = NSLocalizedString("DONATE_MEGAPHONE_BODY", comment: "Body for donate megaphone") + imageName = "donate-megaphone" + + setButtons( + primary: Button(title: NSLocalizedString( + "DONATE_MEGAPHONE_ACTION", + comment: "Action text for donate megaphone" + )) { + let vc = OWSNavigationController(rootViewController: DonationViewController()) + fromViewController.present(vc, animated: true) + }, + secondary: Button(title: NSLocalizedString( + "DONATE_MEGAPHONE_CANCEL", + comment: "Cancel text for donate megaphone" + )) { [weak self] in + self?.markAsSnoozed() + self?.dismiss() + } + ) + } + + required init(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + } diff --git a/Signal/src/ViewControllers/AppSettings/BoostViewController.swift b/Signal/src/ViewControllers/AppSettings/BoostViewController.swift index 9326609e99..cb7b0418a0 100644 --- a/Signal/src/ViewControllers/AppSettings/BoostViewController.swift +++ b/Signal/src/ViewControllers/AppSettings/BoostViewController.swift @@ -658,6 +658,13 @@ extension BoostViewController: PKPaymentAuthorizationControllerDelegate { self.state = .donatedSuccessfully + self.databaseStorage.write { transaction in + ExperienceUpgradeManager.snoozeExperienceUpgrade( + ExperienceUpgradeId.subscriptionMegaphone, + transaction: transaction.unwrapGrdbWrite + ) + } + guard let boostBadge = self.boostBadge else { return owsFailDebug("Missing boost badge!") } diff --git a/SignalServiceKit/src/Util/RemoteConfigManager.swift b/SignalServiceKit/src/Util/RemoteConfigManager.swift index 69cb255f75..5031e23e61 100644 --- a/SignalServiceKit/src/Util/RemoteConfigManager.swift +++ b/SignalServiceKit/src/Util/RemoteConfigManager.swift @@ -20,7 +20,7 @@ public class RemoteConfig: BaseFlags { valueFlags: [String: AnyObject]) { self.isEnabledFlags = isEnabledFlags self.valueFlags = valueFlags - self.subscriptionMegaphone = Self.isCountryCodeBucketEnabled(.subscriptionMegaphone2, valueFlags: valueFlags) + self.subscriptionMegaphone = Self.isCountryCodeBucketEnabled(.donationMegaphone, valueFlags: valueFlags) self.standardMediaQualityLevel = Self.determineStandardMediaQualityLevel(valueFlags: valueFlags) self.paymentsDisabledRegions = Self.parsePaymentsDisabledRegions(valueFlags: valueFlags) } @@ -121,7 +121,7 @@ public class RemoteConfig: BaseFlags { @objc public static var subscriptionMegaphoneSnoozeInterval: TimeInterval { - interval(.subscriptionMegaphoneSnoozeInterval, defaultInterval: kMonthInterval * 6) + interval(.donationMegaphoneSnoozeInterval, defaultInterval: kMonthInterval * 6) } @objc @@ -415,8 +415,8 @@ private struct Flags { case automaticSessionResetAttemptInterval case reactiveProfileKeyAttemptInterval case paymentsDisabledRegions - case subscriptionMegaphone2 - case subscriptionMegaphoneSnoozeInterval + case donationMegaphone + case donationMegaphoneSnoozeInterval } // We filter the received config down to just the supported values. @@ -434,8 +434,8 @@ private struct Flags { case replaceableInteractionExpiration case messageSendLogEntryLifetime case paymentsDisabledRegions - case subscriptionMegaphone2 - case subscriptionMegaphoneSnoozeInterval + case donationMegaphone + case donationMegaphoneSnoozeInterval } }