From 8721d4e2a591ed5ceede26aab2eaffeb20240001 Mon Sep 17 00:00:00 2001 From: Evan Hahn Date: Thu, 12 May 2022 17:34:43 -0500 Subject: [PATCH] Skeleton "choose gift badge" screen It doesn't do anything yet, but an image and some text is there. This is all behind a feature flag, so this should have no user impact. --- Signal.xcodeproj/project.pbxproj | 30 ++++--- .../Contents.json | 12 +++ .../badge-gifting-promo-image-dark.pdf | Bin 0 -> 28663 bytes .../Contents.json | 12 +++ .../badge-gifting-promo-image-light.pdf | Bin 0 -> 28653 bytes .../{ => Donations}/BadgeDetailsSheet.swift | 0 .../BadgeExpirationSheet.swift | 0 ...adgeGiftingChooseBadgeViewController.swift | 73 ++++++++++++++++++ .../{ => Donations}/BadgeThanksSheet.swift | 0 .../{ => Donations}/BoostViewController.swift | 0 .../DonationReceiptViewController.swift | 0 .../DonationReceiptsViewController.swift | 0 .../DonationViewController.swift | 18 ++++- .../{ => Donations}/DonationViewsUtil.swift | 0 .../SubscriptionViewController.swift | 0 .../translations/en.lproj/Localizable.strings | 6 ++ .../Subscriptions/DonationUtilities.swift | 6 +- 17 files changed, 145 insertions(+), 12 deletions(-) create mode 100644 Signal/Images.xcassets/badge-gifting-promo-image-dark.imageset/Contents.json create mode 100644 Signal/Images.xcassets/badge-gifting-promo-image-dark.imageset/badge-gifting-promo-image-dark.pdf create mode 100644 Signal/Images.xcassets/badge-gifting-promo-image-light.imageset/Contents.json create mode 100644 Signal/Images.xcassets/badge-gifting-promo-image-light.imageset/badge-gifting-promo-image-light.pdf rename Signal/src/ViewControllers/AppSettings/{ => Donations}/BadgeDetailsSheet.swift (100%) rename Signal/src/ViewControllers/AppSettings/{ => Donations}/BadgeExpirationSheet.swift (100%) create mode 100644 Signal/src/ViewControllers/AppSettings/Donations/BadgeGiftingChooseBadgeViewController.swift rename Signal/src/ViewControllers/AppSettings/{ => Donations}/BadgeThanksSheet.swift (100%) rename Signal/src/ViewControllers/AppSettings/{ => Donations}/BoostViewController.swift (100%) rename Signal/src/ViewControllers/AppSettings/{ => Donations}/DonationReceiptViewController.swift (100%) rename Signal/src/ViewControllers/AppSettings/{ => Donations}/DonationReceiptsViewController.swift (100%) rename Signal/src/ViewControllers/AppSettings/{ => Donations}/DonationViewController.swift (96%) rename Signal/src/ViewControllers/AppSettings/{ => Donations}/DonationViewsUtil.swift (100%) rename Signal/src/ViewControllers/AppSettings/{ => Donations}/SubscriptionViewController.swift (100%) diff --git a/Signal.xcodeproj/project.pbxproj b/Signal.xcodeproj/project.pbxproj index 0cfa396e35..09938979c3 100644 --- a/Signal.xcodeproj/project.pbxproj +++ b/Signal.xcodeproj/project.pbxproj @@ -1039,6 +1039,7 @@ F97A2EEA282578C000610669 /* BadgeExpirationSheetStateTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = F97A2EE828247C1300610669 /* BadgeExpirationSheetStateTest.swift */; }; F9A8ACC7280A175E00AFC6A7 /* DonationViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9A8ACC6280A175E00AFC6A7 /* DonationViewController.swift */; }; F9BC0A2527FB8E730085B23D /* AppSettingsViewsUtil.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9BC0A2427FB8E730085B23D /* AppSettingsViewsUtil.swift */; }; + F9D83012282DBB1500399363 /* BadgeGiftingChooseBadgeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9D83011282DBB1500399363 /* BadgeGiftingChooseBadgeViewController.swift */; }; F9DD70B92811AF82000C5960 /* DonationViewsUtil.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9DD70B82811AF82000C5960 /* DonationViewsUtil.swift */; }; FCB11D8C1A129A76002F93FB /* CoreMedia.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FCB11D8B1A129A76002F93FB /* CoreMedia.framework */; }; /* End PBXBuildFile section */ @@ -2425,6 +2426,7 @@ F97A2EE828247C1300610669 /* BadgeExpirationSheetStateTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BadgeExpirationSheetStateTest.swift; sourceTree = ""; }; F9A8ACC6280A175E00AFC6A7 /* DonationViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DonationViewController.swift; sourceTree = ""; }; F9BC0A2427FB8E730085B23D /* AppSettingsViewsUtil.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppSettingsViewsUtil.swift; sourceTree = ""; }; + F9D83011282DBB1500399363 /* BadgeGiftingChooseBadgeViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BadgeGiftingChooseBadgeViewController.swift; sourceTree = ""; }; F9DD70B82811AF82000C5960 /* DonationViewsUtil.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DonationViewsUtil.swift; sourceTree = ""; }; FC3BD9871A30A790005B96BB /* Social.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Social.framework; path = System/Library/Frameworks/Social.framework; sourceTree = SDKROOT; }; FCB11D8B1A129A76002F93FB /* CoreMedia.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMedia.framework; path = System/Library/Frameworks/CoreMedia.framework; sourceTree = SDKROOT; }; @@ -2678,22 +2680,14 @@ 340FC87A204DAC8C007AEB0F /* AppSettings */ = { isa = PBXGroup; children = ( + F9C5BC5F282E98D4001EB3BF /* Donations */, F9BC0A2427FB8E730085B23D /* AppSettingsViewsUtil.swift */, - F900F2DC27F25AB300431E09 /* DonationReceiptViewController.swift */, - F9066F0627ECE41B008C9530 /* DonationReceiptsViewController.swift */, 88F58A1625EEE5B9008CDA24 /* AppSettingsViewController.swift */, 887B6DCA25F6C3F500E677D4 /* Account */, 887B6DCB25F6C40500E677D4 /* Appearance */, - 888017912741F33B00346E9A /* BoostViewController.swift */, - 8880179327430DDB00346E9A /* BadgeThanksSheet.swift */, - 881BB2892743531D00B609B8 /* BadgeDetailsSheet.swift */, - F02564D7274EDF4600D7B48A /* BadgeExpirationSheet.swift */, 887B380725F0355700685845 /* ChatsSettingsViewController.swift */, 3414896825C9B6490098E3ED /* CurrencyPickerViewController.swift */, 887B6DCC25F6C41500E677D4 /* Data Usage */, - F0CA67F92728A89A002B9DFE /* SubscriptionViewController.swift */, - F9A8ACC6280A175E00AFC6A7 /* DonationViewController.swift */, - F9DD70B82811AF82000C5960 /* DonationViewsUtil.swift */, 32ECD08624BFBF5C00EDDED0 /* Help */, 887B6DCE25F6C45B00E677D4 /* Internal */, 887B6DCD25F6C44800E677D4 /* Linked Devices */, @@ -4775,6 +4769,23 @@ path = "Context Menus"; sourceTree = ""; }; + F9C5BC5F282E98D4001EB3BF /* Donations */ = { + isa = PBXGroup; + children = ( + F900F2DC27F25AB300431E09 /* DonationReceiptViewController.swift */, + F9066F0627ECE41B008C9530 /* DonationReceiptsViewController.swift */, + 888017912741F33B00346E9A /* BoostViewController.swift */, + 8880179327430DDB00346E9A /* BadgeThanksSheet.swift */, + 881BB2892743531D00B609B8 /* BadgeDetailsSheet.swift */, + F02564D7274EDF4600D7B48A /* BadgeExpirationSheet.swift */, + F0CA67F92728A89A002B9DFE /* SubscriptionViewController.swift */, + F9A8ACC6280A175E00AFC6A7 /* DonationViewController.swift */, + F9DD70B82811AF82000C5960 /* DonationViewsUtil.swift */, + F9D83011282DBB1500399363 /* BadgeGiftingChooseBadgeViewController.swift */, + ); + path = Donations; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ @@ -6412,6 +6423,7 @@ 34B3F8801E8DF1700035BE1A /* InviteFlow.swift in Sources */, 88535064240829950011D318 /* DateHeaderInteraction.swift in Sources */, 88588D26252E59CE00405414 /* CallService.swift in Sources */, + F9D83012282DBB1500399363 /* BadgeGiftingChooseBadgeViewController.swift in Sources */, 8822558D26B9D1D7001A33C4 /* SignalMe.swift in Sources */, 457C87B82032645C008D52D6 /* DebugUINotifications.swift in Sources */, 34848D6325D44EBD00E5034B /* PaymentsTransferInViewController.swift in Sources */, diff --git a/Signal/Images.xcassets/badge-gifting-promo-image-dark.imageset/Contents.json b/Signal/Images.xcassets/badge-gifting-promo-image-dark.imageset/Contents.json new file mode 100644 index 0000000000..13af250cdd --- /dev/null +++ b/Signal/Images.xcassets/badge-gifting-promo-image-dark.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "badge-gifting-promo-image-dark.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Signal/Images.xcassets/badge-gifting-promo-image-dark.imageset/badge-gifting-promo-image-dark.pdf b/Signal/Images.xcassets/badge-gifting-promo-image-dark.imageset/badge-gifting-promo-image-dark.pdf new file mode 100644 index 0000000000000000000000000000000000000000..0d9a0c3c9f213c1ef72907ad7f319df4b5a3107b GIT binary patch literal 28663 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 literal 0 HcmV?d00001 diff --git a/Signal/Images.xcassets/badge-gifting-promo-image-light.imageset/Contents.json b/Signal/Images.xcassets/badge-gifting-promo-image-light.imageset/Contents.json new file mode 100644 index 0000000000..dec69853e5 --- /dev/null +++ b/Signal/Images.xcassets/badge-gifting-promo-image-light.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "badge-gifting-promo-image-light.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Signal/Images.xcassets/badge-gifting-promo-image-light.imageset/badge-gifting-promo-image-light.pdf b/Signal/Images.xcassets/badge-gifting-promo-image-light.imageset/badge-gifting-promo-image-light.pdf new file mode 100644 index 0000000000000000000000000000000000000000..3fe870dd1aab1ac64620979653ae468658798389 GIT binary patch literal 28653 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 [OWSTableSection] { + let introSection: OWSTableSection = { + let section = OWSTableSection() + section.hasBackground = false + section.customHeaderView = { + let introStack = UIStackView() + introStack.axis = .vertical + introStack.spacing = 12 + + let imageName = Theme.isDarkThemeEnabled ? "badge-gifting-promo-image-dark" : "badge-gifting-promo-image-light" + let imageView = UIImageView(image: UIImage(named: imageName)) + introStack.addArrangedSubview(imageView) + imageView.contentMode = .scaleAspectFit + + let titleLabel = UILabel() + introStack.addArrangedSubview(titleLabel) + titleLabel.text = NSLocalizedString("BADGE_GIFTING_CHOOSE_BADGE_TITLE", + comment: "Title on the screen where you choose a gift badge") + titleLabel.textAlignment = .center + titleLabel.font = UIFont.ows_dynamicTypeTitle2.ows_semibold + titleLabel.numberOfLines = 0 + titleLabel.lineBreakMode = .byWordWrapping + titleLabel.autoPinWidthToSuperview(withMargin: 26) + + let paragraphLabel = UILabel() + introStack.addArrangedSubview(paragraphLabel) + paragraphLabel.text = NSLocalizedString("BADGE_GIFTING_CHOOSE_BADGE_DESCRIPTION", + comment: "Short paragraph on the screen where you choose a gift badge") + paragraphLabel.textAlignment = .center + paragraphLabel.font = UIFont.ows_dynamicTypeBody + paragraphLabel.numberOfLines = 0 + paragraphLabel.lineBreakMode = .byWordWrapping + paragraphLabel.autoPinWidthToSuperview(withMargin: 26) + + return introStack + }() + return section + }() + + let result: [OWSTableSection] = [introSection] + + // TODO(evanhahn): Add additional sections. + + return result + } +} diff --git a/Signal/src/ViewControllers/AppSettings/BadgeThanksSheet.swift b/Signal/src/ViewControllers/AppSettings/Donations/BadgeThanksSheet.swift similarity index 100% rename from Signal/src/ViewControllers/AppSettings/BadgeThanksSheet.swift rename to Signal/src/ViewControllers/AppSettings/Donations/BadgeThanksSheet.swift diff --git a/Signal/src/ViewControllers/AppSettings/BoostViewController.swift b/Signal/src/ViewControllers/AppSettings/Donations/BoostViewController.swift similarity index 100% rename from Signal/src/ViewControllers/AppSettings/BoostViewController.swift rename to Signal/src/ViewControllers/AppSettings/Donations/BoostViewController.swift diff --git a/Signal/src/ViewControllers/AppSettings/DonationReceiptViewController.swift b/Signal/src/ViewControllers/AppSettings/Donations/DonationReceiptViewController.swift similarity index 100% rename from Signal/src/ViewControllers/AppSettings/DonationReceiptViewController.swift rename to Signal/src/ViewControllers/AppSettings/Donations/DonationReceiptViewController.swift diff --git a/Signal/src/ViewControllers/AppSettings/DonationReceiptsViewController.swift b/Signal/src/ViewControllers/AppSettings/Donations/DonationReceiptsViewController.swift similarity index 100% rename from Signal/src/ViewControllers/AppSettings/DonationReceiptsViewController.swift rename to Signal/src/ViewControllers/AppSettings/Donations/DonationReceiptsViewController.swift diff --git a/Signal/src/ViewControllers/AppSettings/DonationViewController.swift b/Signal/src/ViewControllers/AppSettings/Donations/DonationViewController.swift similarity index 96% rename from Signal/src/ViewControllers/AppSettings/DonationViewController.swift rename to Signal/src/ViewControllers/AppSettings/Donations/DonationViewController.swift index eba5ce499c..d93b075a44 100644 --- a/Signal/src/ViewControllers/AppSettings/DonationViewController.swift +++ b/Signal/src/ViewControllers/AppSettings/Donations/DonationViewController.swift @@ -398,12 +398,26 @@ class DonationViewController: OWSTableViewController2 { } )) - if DonationUtilities.isApplePayAvailable && FeatureFlags.giftBadgeSending { + if DonationUtilities.canSendGiftBadges { section.add(.disclosureItem( icon: .settingsGift, name: NSLocalizedString("DONATION_VIEW_GIFT", comment: "Title for the 'Gift a Badge' link in the donation view"), accessibilityIdentifier: UIView.accessibilityIdentifier(in: self, name: "giftBadge"), - actionBlock: {} + actionBlock: { [weak self] in + guard let self = self else { return } + + // It's possible (but unlikely) to lose the ability to send gifts while this button is + // visible. For example, Apple Pay could be disabled in parental controls after this + // screen is opened. + guard DonationUtilities.canSendGiftBadges else { + // We might want to show a better UI here, but making the button a no-op is + // preferable to launching the view controller. + return + } + + let vc = BadgeGiftingChooseBadgeViewController() + self.navigationController?.pushViewController(vc, animated: true) + } )) } diff --git a/Signal/src/ViewControllers/AppSettings/DonationViewsUtil.swift b/Signal/src/ViewControllers/AppSettings/Donations/DonationViewsUtil.swift similarity index 100% rename from Signal/src/ViewControllers/AppSettings/DonationViewsUtil.swift rename to Signal/src/ViewControllers/AppSettings/Donations/DonationViewsUtil.swift diff --git a/Signal/src/ViewControllers/AppSettings/SubscriptionViewController.swift b/Signal/src/ViewControllers/AppSettings/Donations/SubscriptionViewController.swift similarity index 100% rename from Signal/src/ViewControllers/AppSettings/SubscriptionViewController.swift rename to Signal/src/ViewControllers/AppSettings/Donations/SubscriptionViewController.swift diff --git a/Signal/translations/en.lproj/Localizable.strings b/Signal/translations/en.lproj/Localizable.strings index 07bc5e06e6..15c62ae4e0 100644 --- a/Signal/translations/en.lproj/Localizable.strings +++ b/Signal/translations/en.lproj/Localizable.strings @@ -391,6 +391,12 @@ /* Title for subscription on the badge expiration sheet. */ "BADGE_EXPIRED_SUBSCRIPTION_TITLE" = "Monthly Donation Cancelled"; +/* Short paragraph on the screen where you choose a gift badge */ +"BADGE_GIFTING_CHOOSE_BADGE_DESCRIPTION" = "Gift someone a badge by making a donation to Signal in their name. They’ll get a badge to display on their profile photo."; + +/* Title on the screen where you choose a gift badge */ +"BADGE_GIFTING_CHOOSE_BADGE_TITLE" = "Gift a Badge"; + /* String explaing to the user that their subscription badge has expired on the badge expiry sheetsheet. Embed {badge name}. */ "BADGE_SUBSCRIPTION_EXPIRED_BECAUSE_OF_CHARGE_FAILURE_BODY_FORMAT" = "Your recurring monthly donation was automatically cancelled because we couldn’t process your payment. Your badge is no longer visible on your profile.\n\nTo continue supporting Signal and to reactivate your badge, update your payment method in Apple Pay and subscribe again."; diff --git a/SignalMessaging/Subscriptions/DonationUtilities.swift b/SignalMessaging/Subscriptions/DonationUtilities.swift index f77a3fe4c1..bf990df280 100644 --- a/SignalMessaging/Subscriptions/DonationUtilities.swift +++ b/SignalMessaging/Subscriptions/DonationUtilities.swift @@ -1,5 +1,5 @@ // -// Copyright (c) 2021 Open Whisper Systems. All rights reserved. +// Copyright (c) 2022 Open Whisper Systems. All rights reserved. // import Foundation @@ -11,6 +11,10 @@ public class DonationUtilities: NSObject { PKPaymentAuthorizationController.canMakePayments() } + public static var canSendGiftBadges: Bool { + isApplePayAvailable && FeatureFlags.giftBadgeSending + } + public static var supportedNetworks: [PKPaymentNetwork] { return [ .visa,