From 2d98857d94a5354eb57cf36aaec0427f6c0137d9 Mon Sep 17 00:00:00 2001 From: Yuki Date: Thu, 19 Dec 2024 16:12:17 -0800 Subject: [PATCH 1/3] Default Embedded formSheetAction property as `.continue` (#4416) https://stripe.slack.com/archives/C0353FPANQ0/p1734643574432679?thread_ts=1727303418.476899&cid=C0353FPANQ0 ## Testing Relying on existing tests ## Changelog Feature not yet released --- ...mbeddedElementCheckoutViewController.swift | 9 ++- .../PlaygroundController.swift | 3 +- .../EmbeddedPaymentElementConfiguration.swift | 8 +-- ...eddedFormViewControllerSnapshotTests.swift | 55 ++++++------------- .../FormMandateProviderTests.swift | 2 +- .../PaymentSheetAnalyticsHelperTest.swift | 4 +- .../STPFixtures+PaymentSheet.swift | 2 +- 7 files changed, 29 insertions(+), 54 deletions(-) diff --git a/Example/PaymentSheet Example/PaymentSheet Example/ExampleEmbeddedElementCheckoutViewController.swift b/Example/PaymentSheet Example/PaymentSheet Example/ExampleEmbeddedElementCheckoutViewController.swift index 4d082f9af4a..71a8ad70d01 100644 --- a/Example/PaymentSheet Example/PaymentSheet Example/ExampleEmbeddedElementCheckoutViewController.swift +++ b/Example/PaymentSheet Example/PaymentSheet Example/ExampleEmbeddedElementCheckoutViewController.swift @@ -260,11 +260,10 @@ class ExampleEmbeddedElementCheckoutViewController: UIViewController { self.computedTotals = ComputedTotals(subtotal: subtotal, tax: tax, total: total) // MARK: - Create a EmbeddedPaymentElement instance - var configuration = EmbeddedPaymentElement.Configuration( - formSheetAction: .confirm(completion: { [weak self] result in - self?.handlePaymentResult(result) - }) - ) + var configuration = EmbeddedPaymentElement.Configuration() + configuration.formSheetAction = .confirm(completion: { [weak self] result in + self?.handlePaymentResult(result) + }) // This example displays the buy button in a screen that is separate from screen that displays the embedded view, so we disable the mandate text in the embedded view and show it near our buy button. configuration.embeddedViewDisplaysMandateText = false configuration.merchantDisplayName = "Example, Inc." diff --git a/Example/PaymentSheet Example/PaymentSheet Example/PlaygroundController.swift b/Example/PaymentSheet Example/PaymentSheet Example/PlaygroundController.swift index 9f781b3d29d..a04bd74622b 100644 --- a/Example/PaymentSheet Example/PaymentSheet Example/PlaygroundController.swift +++ b/Example/PaymentSheet Example/PaymentSheet Example/PlaygroundController.swift @@ -200,7 +200,8 @@ class PlaygroundController: ObservableObject { } }() - var configuration = EmbeddedPaymentElement.Configuration(formSheetAction: formSheetAction) + var configuration = EmbeddedPaymentElement.Configuration() + configuration.formSheetAction = formSheetAction configuration.embeddedViewDisplaysMandateText = settings.embeddedViewDisplaysMandateText == .on configuration.externalPaymentMethodConfiguration = externalPaymentMethodConfiguration switch settings.externalPaymentMethods { diff --git a/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Embedded/EmbeddedPaymentElementConfiguration.swift b/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Embedded/EmbeddedPaymentElementConfiguration.swift index 5dce6c217bf..9560558b933 100644 --- a/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Embedded/EmbeddedPaymentElementConfiguration.swift +++ b/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Embedded/EmbeddedPaymentElementConfiguration.swift @@ -144,12 +144,12 @@ extension EmbeddedPaymentElement { completion: (EmbeddedPaymentElementResult) -> Void ) - /// The button says “Continue”. When tapped, the form sheet closes. + /// The button says “Continue”. When tapped, the form sheet closes. The customer can confirm payment or setup back in your app. case `continue` } /// The view can display payment methods like “Card” that, when tapped, open a sheet where customers enter their payment method details. The sheet has a button at the bottom. `formSheetAction` controls the action the button performs. - public var formSheetAction: FormSheetAction + public var formSheetAction: FormSheetAction = .continue /// Controls whether the view displays mandate text at the bottom for payment methods that require it. If set to `false`, your integration must display `PaymentOptionDisplayData.mandateText` to the customer near your “Buy” button to comply with regulations. /// - Note: This doesn't affect mandates displayed in the form sheet. @@ -161,8 +161,6 @@ extension EmbeddedPaymentElement { internal var linkPaymentMethodsOnly: Bool = false /// Initializes a Configuration with default values - public init(formSheetAction: FormSheetAction) { - self.formSheetAction = formSheetAction - } + public init() {} } } diff --git a/StripePaymentSheet/StripePaymentSheetTests/PaymentSheet/EmbeddedFormViewControllerSnapshotTests.swift b/StripePaymentSheet/StripePaymentSheetTests/PaymentSheet/EmbeddedFormViewControllerSnapshotTests.swift index 4bec12faf54..05c6e0aae72 100644 --- a/StripePaymentSheet/StripePaymentSheetTests/PaymentSheet/EmbeddedFormViewControllerSnapshotTests.swift +++ b/StripePaymentSheet/StripePaymentSheetTests/PaymentSheet/EmbeddedFormViewControllerSnapshotTests.swift @@ -73,11 +73,8 @@ final class EmbeddedFormViewControllerSnapshotTests: STPSnapshotTestCase { // MARK: - Tests func testDisplayCard_confirmFormSheetAction() { - let configuration = EmbeddedPaymentElement.Configuration( - formSheetAction: .confirm(completion: { _ in - // no-op - }) - ) + var configuration = EmbeddedPaymentElement.Configuration() + configuration.formSheetAction = .confirm(completion: { _ in }) let sut = makeEmbeddedFormViewController( configuration: configuration, paymentMethodType: .card @@ -86,9 +83,7 @@ final class EmbeddedFormViewControllerSnapshotTests: STPSnapshotTestCase { } func testDisplayCard_continueFormSheetAction() { - let configuration = EmbeddedPaymentElement.Configuration( - formSheetAction: .continue - ) + var configuration = EmbeddedPaymentElement.Configuration() let sut = makeEmbeddedFormViewController( configuration: configuration, paymentMethodType: .card @@ -102,11 +97,8 @@ final class EmbeddedFormViewControllerSnapshotTests: STPSnapshotTestCase { return "Mock error description" } } - let configuration = EmbeddedPaymentElement.Configuration( - formSheetAction: .confirm(completion: { _ in - // no-op - }) - ) + var configuration = EmbeddedPaymentElement.Configuration() + configuration.formSheetAction = .confirm(completion: { _ in }) let sut = makeEmbeddedFormViewController( configuration: configuration, paymentMethodType: .card @@ -116,11 +108,8 @@ final class EmbeddedFormViewControllerSnapshotTests: STPSnapshotTestCase { } func testRestoresPreviousCustomerInput() { - let configuration = EmbeddedPaymentElement.Configuration( - formSheetAction: .confirm(completion: { _ in - // no-op - }) - ) + var configuration = EmbeddedPaymentElement.Configuration() + configuration.formSheetAction = .confirm(completion: { _ in }) let previousPaymentOption = PaymentOption.new( confirmParams: IntentConfirmParams( params: ._testValidCardValue(), @@ -136,11 +125,8 @@ final class EmbeddedFormViewControllerSnapshotTests: STPSnapshotTestCase { } func testDisabledState() { - let configuration = EmbeddedPaymentElement.Configuration( - formSheetAction: .confirm(completion: { _ in - // no-op - }) - ) + var configuration = EmbeddedPaymentElement.Configuration() + configuration.formSheetAction = .confirm(completion: { _ in }) let sut = makeEmbeddedFormViewController( configuration: configuration, paymentMethodType: .card @@ -150,11 +136,8 @@ final class EmbeddedFormViewControllerSnapshotTests: STPSnapshotTestCase { } func testBillingCollectionConfiguration() { - var configuration = EmbeddedPaymentElement.Configuration( - formSheetAction: .confirm(completion: { _ in - // no-op - }) - ) + var configuration = EmbeddedPaymentElement.Configuration() + configuration.formSheetAction = .confirm(completion: { _ in }) configuration.billingDetailsCollectionConfiguration = .init(name: .always, phone: .always) let sut = makeEmbeddedFormViewController( configuration: configuration, @@ -164,11 +147,8 @@ final class EmbeddedFormViewControllerSnapshotTests: STPSnapshotTestCase { } func testMandateView() { - let configuration = EmbeddedPaymentElement.Configuration( - formSheetAction: .confirm(completion: { _ in - // no-op - }) - ) + var configuration = EmbeddedPaymentElement.Configuration() + configuration.formSheetAction = .confirm(completion: { _ in }) let sut = makeEmbeddedFormViewController( configuration: configuration, paymentMethodType: .SEPADebit @@ -177,18 +157,15 @@ final class EmbeddedFormViewControllerSnapshotTests: STPSnapshotTestCase { sut.updateMandate() verify(sut) } - + func testDisplaysErrorAndMandate() { struct MockError: LocalizedError { var errorDescription: String? { return "Mock error description" } } - let configuration = EmbeddedPaymentElement.Configuration( - formSheetAction: .confirm(completion: { _ in - // no-op - }) - ) + var configuration = EmbeddedPaymentElement.Configuration() + configuration.formSheetAction = .confirm(completion: { _ in }) let sut = makeEmbeddedFormViewController( configuration: configuration, paymentMethodType: .SEPADebit diff --git a/StripePaymentSheet/StripePaymentSheetTests/PaymentSheet/FormMandateProviderTests.swift b/StripePaymentSheet/StripePaymentSheetTests/PaymentSheet/FormMandateProviderTests.swift index 7735141401f..3d722aea946 100644 --- a/StripePaymentSheet/StripePaymentSheetTests/PaymentSheet/FormMandateProviderTests.swift +++ b/StripePaymentSheet/StripePaymentSheetTests/PaymentSheet/FormMandateProviderTests.swift @@ -18,7 +18,7 @@ class FormMandateProviderTests: XCTestCase { } func testFormMandateProvider_WhenConfigurationHidesMandateText_ShouldReturnNil() { - var embeddedConfiguration = EmbeddedPaymentElement.Configuration(formSheetAction: .continue) + var embeddedConfiguration = EmbeddedPaymentElement.Configuration() embeddedConfiguration.embeddedViewDisplaysMandateText = false embeddedConfiguration.merchantDisplayName = "Test Merchant" diff --git a/StripePaymentSheet/StripePaymentSheetTests/PaymentSheet/PaymentSheetAnalyticsHelperTest.swift b/StripePaymentSheet/StripePaymentSheetTests/PaymentSheet/PaymentSheetAnalyticsHelperTest.swift index b0fc1f76e58..ae4d20921d3 100644 --- a/StripePaymentSheet/StripePaymentSheetTests/PaymentSheet/PaymentSheetAnalyticsHelperTest.swift +++ b/StripePaymentSheet/StripePaymentSheetTests/PaymentSheet/PaymentSheetAnalyticsHelperTest.swift @@ -35,7 +35,7 @@ final class PaymentSheetAnalyticsHelperTest: XCTestCase { STPAnalyticsClient.sharedClient.productUsage = Set() XCTAssertTrue(STPAnalyticsClient.sharedClient.productUsage.isEmpty) let e = expectation(description: "callback") - EmbeddedPaymentElement.create(intentConfiguration: intentConfig, configuration: EmbeddedPaymentElement.Configuration(formSheetAction: .continue)) { _ in + EmbeddedPaymentElement.create(intentConfiguration: intentConfig, configuration: EmbeddedPaymentElement.Configuration()) { _ in e.fulfill() } wait(for: [e], timeout: 1.0) @@ -377,7 +377,7 @@ final class PaymentSheetAnalyticsHelperTest: XCTestCase { config.customer = customer return config case .embedded: - var config = EmbeddedPaymentElement.Configuration(formSheetAction: .continue) + var config = EmbeddedPaymentElement.Configuration() config.applePay = applePay config.customer = customer return config diff --git a/StripePaymentSheet/StripePaymentSheetTests/PaymentSheet/STPFixtures+PaymentSheet.swift b/StripePaymentSheet/StripePaymentSheetTests/PaymentSheet/STPFixtures+PaymentSheet.swift index dc8c87d6978..a4bd81ff237 100644 --- a/StripePaymentSheet/StripePaymentSheetTests/PaymentSheet/STPFixtures+PaymentSheet.swift +++ b/StripePaymentSheet/StripePaymentSheetTests/PaymentSheet/STPFixtures+PaymentSheet.swift @@ -29,7 +29,7 @@ public extension PaymentSheet.Configuration { public extension EmbeddedPaymentElement.Configuration { /// Provides a Configuration that allows all pm types available static func _testValue_MostPermissive(isApplePayEnabled: Bool = true) -> Self { - var configuration = EmbeddedPaymentElement.Configuration(formSheetAction: .continue) + var configuration = EmbeddedPaymentElement.Configuration() configuration.returnURL = "https://foo.com" configuration.allowsDelayedPaymentMethods = true configuration.allowsPaymentMethodsRequiringShippingAddress = true From a052ae0e60fe032e91e23b56b73940e81493e295 Mon Sep 17 00:00:00 2001 From: joyceqin-stripe Date: Thu, 19 Dec 2024 20:42:16 -0800 Subject: [PATCH 2/3] =?UTF-8?q?Display=20a=20=E2=80=9Cdefault=E2=80=9D=20b?= =?UTF-8?q?adge=20for=20the=20default=20PM=20(#4333)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary Display a "default" badge for the default PM in vertical and horizontal mode across all UI shapes (payment sheet, flow controller, embedded) ## Motivation [MOBILESDK-2800](https://jira.corp.stripe.com/browse/MOBILESDK-2800) ## Testing https://github.com/user-attachments/assets/e2dd8f48-e23c-4e4a-8732-bb55a98efa80 https://github.com/user-attachments/assets/8a0c25a5-7384-483d-9814-d8f8c70d898f ![test_all_saved_pms_and_apple_pay_and_link_default_badge@3x](https://github.com/user-attachments/assets/a32965f4-4b0f-4b07-a0e9-ce3d078f5e6b) ![test_VerticalSavedPaymentOptionsViewControllerSnapshotTestsDefaultBadge@3x](https://github.com/user-attachments/assets/01605dc3-b2a0-465f-a0a4-cfe641a1b860) ## Changelog --- .../Source/Categories/String+Localized.swift | 7 ++ .../ElementsCustomer.swift | 10 +-- .../LinkPaymentMethodPicker-Cell.swift | 2 +- .../SavedPaymentMethodCollectionView.swift | 84 ++++++++++++++++-- .../SavedPaymentOptionsViewController.swift | 18 +++- .../SavedPaymentMethodRowButton.swift | 12 ++- ...calSavedPaymentMethodsViewController.swift | 15 +++- .../Vertical Main Screen/RowButton.swift | 40 ++++++++- ...ntOptionsViewControllerSnapshotTests.swift | 59 +++++++++++- ...ntMethodsViewControllerSnapshotTests.swift | 31 ++++++- ...nd_apple_pay_and_link_default_badge@3x.png | Bin 0 -> 90723 bytes ...ControllerSnapshotTestsDefaultBadge@3x.png | Bin 0 -> 103781 bytes 12 files changed, 245 insertions(+), 33 deletions(-) create mode 100644 Tests/ReferenceImages_64/StripePaymentSheetTests.SavedPaymentOptionsViewControllerSnapshotTests/test_all_saved_pms_and_apple_pay_and_link_default_badge@3x.png create mode 100644 Tests/ReferenceImages_64/StripePaymentSheetTests.VerticalSavedPaymentMethodsViewControllerSnapshotTests/test_VerticalSavedPaymentOptionsViewControllerSnapshotTestsDefaultBadge@3x.png diff --git a/StripePaymentSheet/StripePaymentSheet/Source/Categories/String+Localized.swift b/StripePaymentSheet/StripePaymentSheet/Source/Categories/String+Localized.swift index 1c235fd0a7b..2a26833dc1d 100644 --- a/StripePaymentSheet/StripePaymentSheet/Source/Categories/String+Localized.swift +++ b/StripePaymentSheet/StripePaymentSheet/Source/Categories/String+Localized.swift @@ -437,4 +437,11 @@ extension String.Localized { "Promotional text for Affirm, displayed in a button that lets the customer pay with Affirm" ) } + + static var default_text: String { + STPLocalizedString( + "Default", + "Label for identifying the default payment method." + ) + } } diff --git a/StripePaymentSheet/StripePaymentSheet/Source/Internal/API Bindings/v1-elements-sessions/ElementsCustomer.swift b/StripePaymentSheet/StripePaymentSheet/Source/Internal/API Bindings/v1-elements-sessions/ElementsCustomer.swift index 76ab7b66b6b..3419430cb97 100644 --- a/StripePaymentSheet/StripePaymentSheet/Source/Internal/API Bindings/v1-elements-sessions/ElementsCustomer.swift +++ b/StripePaymentSheet/StripePaymentSheet/Source/Internal/API Bindings/v1-elements-sessions/ElementsCustomer.swift @@ -40,13 +40,13 @@ struct ElementsCustomer: Equatable, Hashable { return ElementsCustomer(paymentMethods: paymentMethods, defaultPaymentMethod: defaultPaymentMethod, customerSession: customerSession) } + func getDefaultPaymentMethod() -> STPPaymentMethod? { + return paymentMethods.first { $0.stripeId == defaultPaymentMethod } + } + func getDefaultOrFirstPaymentMethod() -> STPPaymentMethod? { // if customer has a default payment method from the elements session, return the default payment method - let defaultSavedPaymentMethod = paymentMethods.first { $0.stripeId == defaultPaymentMethod } - if let defaultSavedPaymentMethod = defaultSavedPaymentMethod { - return defaultSavedPaymentMethod - } // otherwise, return the first payment method from the customer's list of saved payment methods - return paymentMethods.first + return getDefaultPaymentMethod() ?? paymentMethods.first } } diff --git a/StripePaymentSheet/StripePaymentSheet/Source/Internal/Link/Components/PaymentMethodPicker/LinkPaymentMethodPicker-Cell.swift b/StripePaymentSheet/StripePaymentSheet/Source/Internal/Link/Components/PaymentMethodPicker/LinkPaymentMethodPicker-Cell.swift index b5efa868962..3f90eecd2af 100644 --- a/StripePaymentSheet/StripePaymentSheet/Source/Internal/Link/Components/PaymentMethodPicker/LinkPaymentMethodPicker-Cell.swift +++ b/StripePaymentSheet/StripePaymentSheet/Source/Internal/Link/Components/PaymentMethodPicker/LinkPaymentMethodPicker-Cell.swift @@ -73,7 +73,7 @@ extension LinkPaymentMethodPicker { private let defaultBadge = LinkBadgeView( type: .neutral, - text: STPLocalizedString("Default", "Label for identifying the default payment method.") + text: String.Localized.default_text ) private let alertIconView: UIImageView = { diff --git a/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Saved Payment Method Screen/SavedPaymentMethodCollectionView.swift b/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Saved Payment Method Screen/SavedPaymentMethodCollectionView.swift index f02ead84014..1b531c5d527 100644 --- a/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Saved Payment Method Screen/SavedPaymentMethodCollectionView.swift +++ b/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Saved Payment Method Screen/SavedPaymentMethodCollectionView.swift @@ -16,6 +16,7 @@ import UIKit // MARK: - Constants /// Entire cell size private let cellSize: CGSize = CGSize(width: 106, height: 94) +private let cellSizeWithDefaultBadge: CGSize = CGSize(width: 106, height: 112) /// Size of the rounded rectangle that contains the PM logo let roundedRectangleSize = CGSize(width: 100, height: 64) private let paymentMethodLogoSize: CGSize = CGSize(width: 54, height: 40) @@ -24,12 +25,13 @@ private let paymentMethodLogoSize: CGSize = CGSize(width: 54, height: 40) /// For internal SDK use only @objc(STP_Internal_SavedPaymentMethodCollectionView) class SavedPaymentMethodCollectionView: UICollectionView { - init(appearance: PaymentSheet.Appearance) { + init(appearance: PaymentSheet.Appearance, needsVerticalPaddingForBadge: Bool = false) { let layout = UICollectionViewFlowLayout() layout.scrollDirection = .horizontal layout.sectionInset = UIEdgeInsets( top: -6, left: PaymentSheetUI.defaultPadding, bottom: 0, right: PaymentSheetUI.defaultPadding) + self.needsVerticalPaddingForBadge = needsVerticalPaddingForBadge layout.itemSize = cellSize layout.minimumInteritemSpacing = 12 layout.minimumLineSpacing = 4 @@ -43,13 +45,23 @@ class SavedPaymentMethodCollectionView: UICollectionView { } var isRemovingPaymentMethods: Bool = false + let needsVerticalPaddingForBadge: Bool required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } override var intrinsicContentSize: CGSize { - return CGSize(width: UIView.noIntrinsicMetric, height: 100) + return needsVerticalPaddingForBadge && isRemovingPaymentMethods ? CGSize(width: UIView.noIntrinsicMetric, height: 118) : CGSize(width: UIView.noIntrinsicMetric, height: 100) + } + + func updateLayout() { + guard let layout = collectionViewLayout as? UICollectionViewFlowLayout else { return } + let newCellSize = needsVerticalPaddingForBadge && isRemovingPaymentMethods ? cellSizeWithDefaultBadge : cellSize + guard newCellSize != layout.itemSize else { return } + layout.itemSize = newCellSize + collectionViewLayout.invalidateLayout() + invalidateIntrinsicContentSize() } } @@ -91,15 +103,38 @@ extension SavedPaymentMethodCollectionView { button.accessibilityLabel = String.Localized.edit return button }() + lazy var defaultBadge: UILabel = { + let label = UILabel() + label.font = appearance.scaledFont(for: appearance.font.base.medium, style: .caption1, maximumPointSize: 20) + label.textColor = appearance.colors.textSecondary + label.adjustsFontForContentSizeCategory = true + label.text = String.Localized.default_text + label.isHidden = true + return label + }() fileprivate var viewModel: SavedPaymentOptionsViewController.Selection? var isRemovingPaymentMethods: Bool = false { didSet { + updateVerticalConstraintsIfNeeded() update() } } + func updateVerticalConstraintsIfNeeded() { + guard needsVerticalPaddingForBadge else { + return + } + if isRemovingPaymentMethods { + activateDefaultBadgeConstraints() + defaultBadge.setHiddenIfNecessary(!showDefaultPMBadge) + } else { + deactivateDefaultBadgeConstraints() + defaultBadge.setHiddenIfNecessary(true) + } + } + weak var delegate: PaymentOptionCellDelegate? var appearance = PaymentSheet.Appearance.default { didSet { @@ -110,14 +145,17 @@ extension SavedPaymentMethodCollectionView { var cbcEligible: Bool = false var allowsPaymentMethodRemoval: Bool = true + var allowsSetAsDefaultPM: Bool = false + var needsVerticalPaddingForBadge: Bool = false + var showDefaultPMBadge: Bool = false /// Indicates whether the cell for a saved payment method should display the edit icon. - /// True if payment methods can be removed or edited (will update this to include allowing set as default) + /// True if payment methods can be removed or edited var showEditIcon: Bool { guard UpdatePaymentMethodViewModel.supportedPaymentMethods.contains(where: { viewModel?.savedPaymentMethod?.type == $0 }) else { fatalError("Payment method does not match supported saved payment methods.") } - return allowsPaymentMethodRemoval || (viewModel?.savedPaymentMethod?.isCoBrandedCard ?? false && cbcEligible) + return allowsSetAsDefaultPM || allowsPaymentMethodRemoval || (viewModel?.savedPaymentMethod?.isCoBrandedCard ?? false && cbcEligible) } // MARK: - UICollectionViewCell @@ -142,7 +180,7 @@ extension SavedPaymentMethodCollectionView { paymentMethodLogo.contentMode = .scaleAspectFit accessoryButton.addTarget(self, action: #selector(didSelectAccessory), for: .touchUpInside) let views = [ - label, shadowRoundedRectangle, paymentMethodLogo, plus, selectedIcon, accessoryButton, + label, shadowRoundedRectangle, paymentMethodLogo, plus, selectedIcon, accessoryButton, defaultBadge ] views.forEach { $0.translatesAutoresizingMaskIntoConstraints = false @@ -159,7 +197,7 @@ extension SavedPaymentMethodCollectionView { label.topAnchor.constraint( equalTo: shadowRoundedRectangle.bottomAnchor, constant: 4), - label.bottomAnchor.constraint(equalTo: contentView.bottomAnchor), + labelBottomConstraint, label.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 2), label.trailingAnchor.constraint(equalTo: contentView.trailingAnchor), @@ -188,6 +226,7 @@ extension SavedPaymentMethodCollectionView { equalTo: contentView.trailingAnchor, constant: 0), accessoryButton.topAnchor.constraint( equalTo: contentView.topAnchor, constant: 0), + ]) } @@ -208,15 +247,33 @@ extension SavedPaymentMethodCollectionView { } } - // MARK: - Internal Methods + private lazy var labelBottomConstraint: NSLayoutConstraint = { + return label.bottomAnchor.constraint(equalTo: contentView.bottomAnchor) + }() + private lazy var labelHeightConstraint: NSLayoutConstraint = { + return label.heightAnchor.constraint(equalToConstant: 20) + }() + private lazy var defaultBadgeConstraints: [NSLayoutConstraint] = { + return [ + defaultBadge.topAnchor.constraint( + equalTo: label.bottomAnchor, constant: 4), + defaultBadge.bottomAnchor.constraint(equalTo: contentView.bottomAnchor), + defaultBadge.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 2), + defaultBadge.trailingAnchor.constraint(equalTo: contentView.trailingAnchor) + ] + }() - func setViewModel(_ viewModel: SavedPaymentOptionsViewController.Selection, cbcEligible: Bool, allowsPaymentMethodRemoval: Bool) { + // MARK: - Internal Methods + func setViewModel(_ viewModel: SavedPaymentOptionsViewController.Selection, cbcEligible: Bool, allowsPaymentMethodRemoval: Bool, allowsSetAsDefaultPM: Bool = false, needsVerticalPaddingForBadge: Bool = false, showDefaultPMBadge: Bool = false) { paymentMethodLogo.isHidden = false plus.isHidden = true shadowRoundedRectangle.isHidden = false self.viewModel = viewModel self.cbcEligible = cbcEligible self.allowsPaymentMethodRemoval = allowsPaymentMethodRemoval + self.allowsSetAsDefaultPM = allowsSetAsDefaultPM + self.needsVerticalPaddingForBadge = needsVerticalPaddingForBadge + self.showDefaultPMBadge = showDefaultPMBadge update() } @@ -372,6 +429,17 @@ extension SavedPaymentMethodCollectionView { }() } } + + private func activateDefaultBadgeConstraints() { + NSLayoutConstraint.deactivate([labelBottomConstraint]) + NSLayoutConstraint.activate([labelHeightConstraint] + defaultBadgeConstraints) + } + + private func deactivateDefaultBadgeConstraints() { + NSLayoutConstraint.deactivate(defaultBadgeConstraints + [labelHeightConstraint]) + NSLayoutConstraint.activate([labelBottomConstraint]) + } + } // A circle with an image in the middle diff --git a/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Saved Payment Method Screen/SavedPaymentOptionsViewController.swift b/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Saved Payment Method Screen/SavedPaymentOptionsViewController.swift index 07f58ae49c0..b9254d80d95 100644 --- a/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Saved Payment Method Screen/SavedPaymentOptionsViewController.swift +++ b/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Saved Payment Method Screen/SavedPaymentOptionsViewController.swift @@ -131,6 +131,10 @@ class SavedPaymentOptionsViewController: UIViewController { } set { collectionView.isRemovingPaymentMethods = newValue + collectionView.performBatchUpdates({ + collectionView.reloadSections(IndexSet(integer: 0)) + animateHeightChange{self.collectionView.updateLayout()} + }) UIView.transition(with: collectionView, duration: 0.3, options: .transitionCrossDissolve, @@ -147,6 +151,11 @@ class SavedPaymentOptionsViewController: UIViewController { } } } + + var hasDefault: Bool { + return viewModels.contains(where: { isDefaultPaymentMethod(savedPaymentMethodId: $0.savedPaymentMethod?.stripeId) }) + } + var bottomNoticeAttributedString: NSAttributedString? { if case .saved(let paymentMethod, _) = selectedPaymentOption { if paymentMethod.usBankAccount != nil { @@ -267,7 +276,7 @@ class SavedPaymentOptionsViewController: UIViewController { // MARK: - Views private lazy var collectionView: SavedPaymentMethodCollectionView = { - let collectionView = SavedPaymentMethodCollectionView(appearance: appearance) + let collectionView = SavedPaymentMethodCollectionView(appearance: appearance, needsVerticalPaddingForBadge: hasDefault) collectionView.delegate = self collectionView.dataSource = self return collectionView @@ -439,6 +448,11 @@ class SavedPaymentOptionsViewController: UIViewController { collectionView.reloadItems(at: [selectedIndexPath]) } + private func isDefaultPaymentMethod(savedPaymentMethodId: String?) -> Bool { + guard configuration.allowsSetAsDefaultPM, let savedPaymentMethodId, let defaultPaymentMethod = elementsSession.customer?.getDefaultPaymentMethod() else { return false } + return savedPaymentMethodId == defaultPaymentMethod.stripeId + } + // MARK: - Helpers /// Creates the list of viewmodels to display in the "saved payment methods" carousel e.g. `["+ Add", "Apple Pay", "Link", "Visa 4242"]` @@ -508,7 +522,7 @@ extension SavedPaymentOptionsViewController: UICollectionViewDataSource, UIColle stpAssertionFailure() return UICollectionViewCell() } - cell.setViewModel(viewModel, cbcEligible: cbcEligible, allowsPaymentMethodRemoval: self.configuration.allowsRemovalOfPaymentMethods) + cell.setViewModel(viewModel, cbcEligible: cbcEligible, allowsPaymentMethodRemoval: self.configuration.allowsRemovalOfPaymentMethods, allowsSetAsDefaultPM: configuration.allowsSetAsDefaultPM, needsVerticalPaddingForBadge: hasDefault, showDefaultPMBadge: isDefaultPaymentMethod(savedPaymentMethodId: viewModel.savedPaymentMethod?.stripeId)) cell.delegate = self cell.isRemovingPaymentMethods = self.collectionView.isRemovingPaymentMethods cell.appearance = appearance diff --git a/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Saved Payment Method Screen/Vertical Saved Payment Method Screen/SavedPaymentMethodRowButton.swift b/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Saved Payment Method Screen/Vertical Saved Payment Method Screen/SavedPaymentMethodRowButton.swift index c8dc6068aa8..695cbdc5728 100644 --- a/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Saved Payment Method Screen/Vertical Saved Payment Method Screen/SavedPaymentMethodRowButton.swift +++ b/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Saved Payment Method Screen/Vertical Saved Payment Method Screen/SavedPaymentMethodRowButton.swift @@ -47,6 +47,8 @@ final class SavedPaymentMethodRowButton: UIView { } } + let showDefaultPMBadge: Bool + private var isEditing: Bool { switch state { case .selected, .unselected: @@ -90,15 +92,21 @@ final class SavedPaymentMethodRowButton: UIView { }() private lazy var rowButton: RowButton = { - let button: RowButton = .makeForSavedPaymentMethod(paymentMethod: paymentMethod, appearance: appearance, rightAccessoryView: chevronButton, didTap: handleRowButtonTapped) + let button: RowButton = .makeForSavedPaymentMethod(paymentMethod: paymentMethod, appearance: appearance, badgeText: badgeText, rightAccessoryView: chevronButton, didTap: handleRowButtonTapped) return button }() + private lazy var badgeText: String? = { + return showDefaultPMBadge ? String.Localized.default_text : nil + }() + init(paymentMethod: STPPaymentMethod, - appearance: PaymentSheet.Appearance) { + appearance: PaymentSheet.Appearance, + showDefaultPMBadge: Bool = false) { self.paymentMethod = paymentMethod self.appearance = appearance + self.showDefaultPMBadge = showDefaultPMBadge super.init(frame: .zero) addAndPinSubview(rowButton) diff --git a/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Saved Payment Method Screen/Vertical Saved Payment Method Screen/VerticalSavedPaymentMethodsViewController.swift b/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Saved Payment Method Screen/Vertical Saved Payment Method Screen/VerticalSavedPaymentMethodsViewController.swift index 335a3dea8a8..14ba5ee3327 100644 --- a/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Saved Payment Method Screen/Vertical Saved Payment Method Screen/VerticalSavedPaymentMethodsViewController.swift +++ b/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Saved Payment Method Screen/Vertical Saved Payment Method Screen/VerticalSavedPaymentMethodsViewController.swift @@ -88,13 +88,13 @@ class VerticalSavedPaymentMethodsViewController: UIViewController { } /// Indicates whether the chevron should be shown - /// True if any saved payment methods can be removed or edited (will update this to include allowing set as default) + /// True if any saved payment methods can be removed or edited var canRemoveOrEdit: Bool { let hasSupportedSavedPaymentMethods = paymentMethods.allSatisfy{ UpdatePaymentMethodViewModel.supportedPaymentMethods.contains($0.type) } guard hasSupportedSavedPaymentMethods else { fatalError("Saved payment methods contain unsupported payment methods.") } - return canRemovePaymentMethods || canEditPaymentMethods + return configuration.allowsSetAsDefaultPM || canRemovePaymentMethods || canEditPaymentMethods } private var selectedPaymentMethod: STPPaymentMethod? { @@ -174,10 +174,16 @@ class VerticalSavedPaymentMethodsViewController: UIViewController { setInitialState(selectedPaymentMethod: selectedPaymentMethod) } + private func isDefaultPaymentMethod(paymentMethodId: String) -> Bool { + guard configuration.allowsSetAsDefaultPM, let defaultPaymentMethod = elementsSession.customer?.getDefaultPaymentMethod() else { return false } + return configuration.allowsSetAsDefaultPM && paymentMethodId == defaultPaymentMethod.stripeId + } + private func buildPaymentMethodRows(paymentMethods: [STPPaymentMethod]) -> [SavedPaymentMethodRowButton] { return paymentMethods.map { paymentMethod in let button = SavedPaymentMethodRowButton(paymentMethod: paymentMethod, - appearance: configuration.appearance) + appearance: configuration.appearance, + showDefaultPMBadge: isDefaultPaymentMethod(paymentMethodId: paymentMethod.stripeId)) button.delegate = self return button } @@ -363,7 +369,8 @@ extension VerticalSavedPaymentMethodsViewController: UpdatePaymentMethodViewCont } // Create the new button - let newButton = SavedPaymentMethodRowButton(paymentMethod: updatedPaymentMethod, appearance: configuration.appearance) + let newButton = SavedPaymentMethodRowButton(paymentMethod: updatedPaymentMethod, appearance: configuration.appearance, showDefaultPMBadge: isDefaultPaymentMethod(paymentMethodId: updatedPaymentMethod.stripeId)) + newButton.delegate = self newButton.previousSelectedState = oldButton.previousSelectedState newButton.state = oldButton.state diff --git a/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Vertical Main Screen/RowButton.swift b/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Vertical Main Screen/RowButton.swift index 0632ac92994..1ad36304c9c 100644 --- a/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Vertical Main Screen/RowButton.swift +++ b/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Vertical Main Screen/RowButton.swift @@ -32,6 +32,7 @@ class RowButton: UIView { let imageView: UIImageView let label: UILabel let sublabel: UILabel? + let defaultBadge: UILabel? let rightAccessoryView: UIView? let promoBadge: PromoBadgeView? private var promoBadgeConstraintToCheckmark: NSLayoutConstraint? @@ -47,6 +48,7 @@ class RowButton: UIView { radioButton?.isOn = isSelected checkmarkImageView?.isHidden = !isSelected updateAccessibilityTraits() + updateDefaultBadgeFont() if isFlatWithCheckmarkStyle { alignBadgeAndCheckmark() } @@ -63,12 +65,22 @@ class RowButton: UIView { } var heightConstraint: NSLayoutConstraint? + + private var selectedDefaultBadgeFont: UIFont { + return appearance.scaledFont(for: appearance.font.base.medium, style: .caption1, maximumPointSize: 20) + } + + private var defaultBadgeFont: UIFont { + return appearance.scaledFont(for: appearance.font.base.regular, style: .caption1, maximumPointSize: 20) + } + init( appearance: PaymentSheet.Appearance, originalCornerRadius: CGFloat? = nil, imageView: UIImageView, text: String, subtext: String? = nil, + badgeText: String? = nil, promoText: String? = nil, rightAccessoryView: UIView? = nil, shouldAnimateOnPress: Bool = false, @@ -95,6 +107,16 @@ class RowButton: UIView { } else { self.sublabel = nil } + if let badgeText { + let defaultBadge = UILabel() + defaultBadge.font = appearance.scaledFont(for: appearance.font.base.medium, style: .caption1, maximumPointSize: 20) + defaultBadge.textColor = appearance.colors.textSecondary + defaultBadge.adjustsFontForContentSizeCategory = true + defaultBadge.text = badgeText + self.defaultBadge = defaultBadge + } else { + self.defaultBadge = nil + } if let promoText { self.promoBadge = PromoBadgeView( appearance: appearance, @@ -175,7 +197,7 @@ class RowButton: UIView { } } - for view in [radioButton, imageView, labelsStackView].compactMap({ $0 }) { + for view in [radioButton, imageView, labelsStackView, defaultBadge].compactMap({ $0 }) { view.translatesAutoresizingMaskIntoConstraints = false view.isUserInteractionEnabled = false view.isAccessibilityElement = false @@ -231,6 +253,9 @@ class RowButton: UIView { labelsStackView.topAnchor.constraint(greaterThanOrEqualTo: topAnchor, constant: insets), labelsStackView.bottomAnchor.constraint(lessThanOrEqualTo: bottomAnchor, constant: -insets), + defaultBadge?.leadingAnchor.constraint(equalTo: label.trailingAnchor, constant: 8), + defaultBadge?.centerYAnchor.constraint(equalTo: centerYAnchor), + imageViewBottomConstraint, imageViewTopConstraint, ].compactMap({ $0 })) @@ -271,6 +296,13 @@ class RowButton: UIView { promoBadgeConstraintToCheckmark?.isActive = isSelected } + private func updateDefaultBadgeFont() { + guard let defaultBadge else { + return + } + defaultBadge.font = isSelected ? selectedDefaultBadgeFont : defaultBadgeFont + } + required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } @@ -314,7 +346,7 @@ class RowButton: UIView { /// Sets icon, text, and sublabel alpha func setContentViewAlpha(_ alpha: CGFloat) { - [imageView, label, sublabel, promoBadge].compactMap { $0 }.forEach { + [imageView, label, sublabel, defaultBadge, promoBadge].compactMap { $0 }.forEach { $0.alpha = alpha } } @@ -435,10 +467,10 @@ extension RowButton { return button } - static func makeForSavedPaymentMethod(paymentMethod: STPPaymentMethod, appearance: PaymentSheet.Appearance, rightAccessoryView: UIView? = nil, isEmbedded: Bool = false, didTap: @escaping DidTapClosure) -> RowButton { + static func makeForSavedPaymentMethod(paymentMethod: STPPaymentMethod, appearance: PaymentSheet.Appearance, subtext: String? = nil, badgeText: String? = nil, rightAccessoryView: UIView? = nil, isEmbedded: Bool = false, didTap: @escaping DidTapClosure) -> RowButton { let imageView = UIImageView(image: paymentMethod.makeSavedPaymentMethodRowImage()) imageView.contentMode = .scaleAspectFit - let button = RowButton(appearance: appearance, imageView: imageView, text: paymentMethod.paymentSheetLabel, rightAccessoryView: rightAccessoryView, isEmbedded: isEmbedded, didTap: didTap) + let button = RowButton(appearance: appearance, imageView: imageView, text: paymentMethod.paymentSheetLabel, subtext: subtext, badgeText: badgeText, rightAccessoryView: rightAccessoryView, isEmbedded: isEmbedded, didTap: didTap) button.shadowRoundedRect.accessibilityLabel = paymentMethod.paymentSheetAccessibilityLabel return button } diff --git a/StripePaymentSheet/StripePaymentSheetTests/PaymentSheet/SavedPaymentOptionsViewControllerSnapshotTests.swift b/StripePaymentSheet/StripePaymentSheetTests/PaymentSheet/SavedPaymentOptionsViewControllerSnapshotTests.swift index 08ece3c4cf9..547f39f2627 100644 --- a/StripePaymentSheet/StripePaymentSheetTests/PaymentSheet/SavedPaymentOptionsViewControllerSnapshotTests.swift +++ b/StripePaymentSheet/StripePaymentSheetTests/PaymentSheet/SavedPaymentOptionsViewControllerSnapshotTests.swift @@ -26,20 +26,24 @@ final class SavedPaymentOptionsViewControllerSnapshotTests: STPSnapshotTestCase _test_all_saved_pms_and_apple_pay_and_link(darkMode: false, appearance: ._testMSPaintTheme) } - func _test_all_saved_pms_and_apple_pay_and_link(darkMode: Bool, appearance: PaymentSheet.Appearance = .default) { + func test_all_saved_pms_and_apple_pay_and_link_default_badge() { + _test_all_saved_pms_and_apple_pay_and_link(darkMode: false, showDefaultPMBadge: true) + } + + func _test_all_saved_pms_and_apple_pay_and_link(darkMode: Bool, appearance: PaymentSheet.Appearance = .default, showDefaultPMBadge: Bool = false) { let paymentMethods = [ STPPaymentMethod._testCard(), STPPaymentMethod._testUSBankAccount(), STPPaymentMethod._testSEPA(), ] - let config = SavedPaymentOptionsViewController.Configuration(customerID: "cus_123", showApplePay: true, showLink: true, removeSavedPaymentMethodMessage: nil, merchantDisplayName: "Test Merchant", isCVCRecollectionEnabled: false, isTestMode: false, allowsRemovalOfLastSavedPaymentMethod: false, allowsRemovalOfPaymentMethods: true, allowsSetAsDefaultPM: false) + let config = SavedPaymentOptionsViewController.Configuration(customerID: "cus_123", showApplePay: true, showLink: true, removeSavedPaymentMethodMessage: nil, merchantDisplayName: "Test Merchant", isCVCRecollectionEnabled: false, isTestMode: false, allowsRemovalOfLastSavedPaymentMethod: false, allowsRemovalOfPaymentMethods: true, allowsSetAsDefaultPM: showDefaultPMBadge) let intent = Intent.deferredIntent(intentConfig: .init(mode: .payment(amount: 0, currency: "USD", setupFutureUsage: nil, captureMethod: .automatic), confirmHandler: { _, _, _ in })) let sut = SavedPaymentOptionsViewController(savedPaymentMethods: paymentMethods, configuration: config, paymentSheetConfiguration: PaymentSheet.Configuration(), intent: intent, appearance: appearance, - elementsSession: .emptyElementsSession, + elementsSession: showDefaultPMBadge ? ._testDefaultCardValue(defaultPaymentMethod: paymentMethods.first?.stripeId ?? STPPaymentMethod._testCard().stripeId, paymentMethods: [testCardJSON, testUSBankAccountJSON, testSEPAJSON]) : .emptyElementsSession, analyticsHelper: ._testValue()) let testWindow = UIWindow() testWindow.isHidden = false @@ -50,10 +54,59 @@ final class SavedPaymentOptionsViewControllerSnapshotTests: STPSnapshotTestCase // Adding sut.view as the subview should be implied by the above line, but Autolayout can't lay out the view correctly on this pass of the runloop unless we explicitly addSubview. Maybe there are side effects that happen one turn of the runloop after setting the rootViewController. testWindow.addSubview(sut.view) sut.view.autosizeHeight(width: 1000) + if showDefaultPMBadge { + sut.isRemovingPaymentMethods = true + } NSLayoutConstraint.activate([ sut.view.topAnchor.constraint(equalTo: testWindow.topAnchor), sut.view.leftAnchor.constraint(equalTo: testWindow.leftAnchor), ]) STPSnapshotVerifyView(sut.view) } + + private let testCardJSON = [ + "id": "pm_123card", + "type": "card", + "card": [ + "last4": "4242", + "brand": "visa", + "fingerprint": "B8XXs2y2JsVBtB9f", + "networks": ["available": ["visa"]], + "exp_month": "01", + "exp_year": Calendar.current.component(.year, from: Date()) + 1 + ] + ] as [AnyHashable : Any] + private let testUSBankAccountJSON = [ + "id": "pm_123bank", + "type": "us_bank_account", + "us_bank_account": [ + "account_holder_type": "individual", + "account_type": "checking", + "bank_name": "STRIPE TEST BANK", + "fingerprint": "ickfX9sbxIyAlbuh", + "last4": "6789", + "networks": [ + "preferred": "ach", + "supported": [ + "ach", + ], + ] as [String: Any], + "routing_number": "110000000", + ] as [String: Any], + "billing_details": [ + "name": "Sam Stripe", + "email": "sam@stripe.com", + ] as [String: Any], + ] as [AnyHashable : Any] + private let testSEPAJSON = [ + "id": "pm_123sepa", + "type": "sepa_debit", + "sepa_debit": [ + "last4": "1234", + ], + "billing_details": [ + "name": "Sam Stripe", + "email": "sam@stripe.com", + ] as [String: Any], + ] as [AnyHashable : Any] } diff --git a/StripePaymentSheet/StripePaymentSheetTests/PaymentSheet/VerticalSavedPaymentMethodsViewControllerSnapshotTests.swift b/StripePaymentSheet/StripePaymentSheetTests/PaymentSheet/VerticalSavedPaymentMethodsViewControllerSnapshotTests.swift index 4e80480fdb0..5f5ac32cc9a 100644 --- a/StripePaymentSheet/StripePaymentSheetTests/PaymentSheet/VerticalSavedPaymentMethodsViewControllerSnapshotTests.swift +++ b/StripePaymentSheet/StripePaymentSheetTests/PaymentSheet/VerticalSavedPaymentMethodsViewControllerSnapshotTests.swift @@ -36,15 +36,24 @@ final class VerticalSavedPaymentMethodsViewControllerSnapshotTests: STPSnapshotT _test_VerticalSavedPaymentMethodsViewControllerSnapshotTests(darkMode: false, appearance: ._testMSPaintTheme, isEmbedded: true) } - func _test_VerticalSavedPaymentMethodsViewControllerSnapshotTests(darkMode: Bool, appearance: PaymentSheet.Appearance = .default, isEmbedded: Bool = false) { + func test_VerticalSavedPaymentOptionsViewControllerSnapshotTestsDefaultBadge() { + _test_VerticalSavedPaymentMethodsViewControllerSnapshotTests(darkMode: false, showDefaultPMBadge: true) + } + + func _test_VerticalSavedPaymentMethodsViewControllerSnapshotTests(darkMode: Bool, appearance: PaymentSheet.Appearance = .default, isEmbedded: Bool = false, showDefaultPMBadge: Bool = false) { var configuration = PaymentSheet.Configuration() configuration.appearance = appearance - let paymentMethods = generatePaymentMethods() + var paymentMethods = generatePaymentMethods() + if showDefaultPMBadge { + configuration.allowsSetAsDefaultPM = true + let card = STPPaymentMethod._testCard() + paymentMethods.insert(card, at: 0) + } let sut = VerticalSavedPaymentMethodsViewController(configuration: configuration, selectedPaymentMethod: paymentMethods.first, paymentMethods: paymentMethods, - elementsSession: ._testCardValue(), + elementsSession: showDefaultPMBadge ? ._testDefaultCardValue(defaultPaymentMethod: paymentMethods.first?.stripeId ?? STPPaymentMethod._testCard().stripeId, paymentMethods: [testCardJSON]) : ._testCardValue(), analyticsHelper: ._testValue() ) let bottomSheet: BottomSheetViewController @@ -73,12 +82,26 @@ final class VerticalSavedPaymentMethodsViewControllerSnapshotTests: STPSnapshotT } private func generatePaymentMethods() -> [STPPaymentMethod] { - return [STPFixtures.paymentMethod(), + return [ + STPFixtures.paymentMethod(), STPFixtures.usBankAccountPaymentMethod(), STPFixtures.usBankAccountPaymentMethod(bankName: "BANK OF AMERICA"), STPFixtures.usBankAccountPaymentMethod(bankName: "STRIPE"), STPFixtures.sepaDebitPaymentMethod(), ] } + + private let testCardJSON = [ + "id": "pm_123card", + "type": "card", + "card": [ + "last4": "4242", + "brand": "visa", + "fingerprint": "B8XXs2y2JsVBtB9f", + "networks": ["available": ["visa"]], + "exp_month": "01", + "exp_year": Calendar.current.component(.year, from: Date()) + 1 + ] + ] as [AnyHashable : Any] } final class StubBottomSheetContentViewController: UIViewController, BottomSheetContentViewController { diff --git a/Tests/ReferenceImages_64/StripePaymentSheetTests.SavedPaymentOptionsViewControllerSnapshotTests/test_all_saved_pms_and_apple_pay_and_link_default_badge@3x.png b/Tests/ReferenceImages_64/StripePaymentSheetTests.SavedPaymentOptionsViewControllerSnapshotTests/test_all_saved_pms_and_apple_pay_and_link_default_badge@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..544ef3c282dac1ba768ed3f9793a7dcb9c4a62da GIT binary patch literal 90723 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%0AXAmiz;4fK8%ee%) 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%0Aw3+n}8fIl|F!kEC{M6#5tN!q+`CrM8$l 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 KxvX$y;s>gWOU4I4oBG>n?oGq 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 b#2i%ZX!EtF_b9nS;E$=1#epaLPG0&CFAFSu literal 0 HcmV?d00001 From a42bcff2f5ef3ae1eefad66a1eef0f38041b6a3e Mon Sep 17 00:00:00 2001 From: davidme-stripe <52758633+davidme-stripe@users.noreply.github.com> Date: Fri, 20 Dec 2024 08:14:04 -0800 Subject: [PATCH 3/3] Fix issues with concurrent attestations (#4382) ## Summary I realized that some of this code is unsafe if run concurrently, so I: * Adopted actors to protect stored properties in StripeAttest and the MockAppAttestService * Used a stored `Task` to only allow one simultaneous attestation to occur Now we can kick off as many simultaneous `assert()` requests as we'd like, and they all seem to complete without issues. Note that I marked the appAttestService as `nonisolated` in order to access the `isSupported` boolean synchronously. I _think_ this is fine (DCAppAttestService appears to be set up to handle this correctly), but this is our first use of actors in the SDK, so let me know if it seems odd! ## Motivation Fixing concurrency-related crashes and unexpected behavior ## Testing Added a test, tested attestation on device ## Changelog None --- .../Source/Attestation/AppAttestService.swift | 2 +- .../Source/Attestation/StripeAttest.swift | 39 ++++++++++++------- .../Attestation/MockAppAttestService.swift | 22 +++++++++-- .../Attestation/StripeAttestTest.swift | 39 +++++++++++++------ .../API Bindings/Link/STPAPIClient+Link.swift | 30 +++++++------- 5 files changed, 91 insertions(+), 41 deletions(-) diff --git a/StripeCore/StripeCore/Source/Attestation/AppAttestService.swift b/StripeCore/StripeCore/Source/Attestation/AppAttestService.swift index 251d7f85ea4..095de224f8b 100644 --- a/StripeCore/StripeCore/Source/Attestation/AppAttestService.swift +++ b/StripeCore/StripeCore/Source/Attestation/AppAttestService.swift @@ -7,7 +7,7 @@ import DeviceCheck import Foundation @_spi(STP) public protocol AppAttestService { - var isSupported: Bool { get } + nonisolated var isSupported: Bool { get } func generateKey() async throws -> String func generateAssertion(_ keyId: String, clientDataHash: Data) async throws -> Data func attestKey(_ keyId: String, clientDataHash: Data) async throws -> Data diff --git a/StripeCore/StripeCore/Source/Attestation/StripeAttest.swift b/StripeCore/StripeCore/Source/Attestation/StripeAttest.swift index f809fc6d637..da6c4a4275f 100644 --- a/StripeCore/StripeCore/Source/Attestation/StripeAttest.swift +++ b/StripeCore/StripeCore/Source/Attestation/StripeAttest.swift @@ -8,9 +8,9 @@ import DeviceCheck import Foundation import UIKit -@_spi(STP) public class StripeAttest { +@_spi(STP) public actor StripeAttest { /// Initialize a new StripeAttest object with the specified STPAPIClient. - @_spi(STP) public convenience init(apiClient: STPAPIClient = .shared) { + @_spi(STP) public init(apiClient: STPAPIClient = .shared) { self.init(appAttestService: AppleAppAttestService.shared, appAttestBackend: StripeAPIAttestationBackend(apiClient: apiClient), apiClient: apiClient) @@ -29,7 +29,7 @@ import UIKit STPAnalyticsClient.sharedClient.log(analytic: errorAnalytic, apiClient: apiClient) if apiClient.isTestmode { // In testmode, we can provide a test assertion even if the real assertion fails - return testmodeAssertion + return await testmodeAssertion() } else { throw error } @@ -61,7 +61,7 @@ import UIKit } /// Returns whether the device is capable of performing attestation. - @_spi(STP) public var isSupported: Bool { + @_spi(STP) nonisolated public var isSupported: Bool { return appAttestService.isSupported } @@ -163,9 +163,12 @@ import UIKit } /// A wrapper for the DCAppAttestService service. - var appAttestService: AppAttestService + /// Marked as nonisolated as it can not be reassigned during the lifetime + /// of StripeAttest, and isolation is handled by the AppAttestService itself + /// (Either DCAppAttestService or our MockAppAttestService) + nonisolated let appAttestService: AppAttestService /// A network backend for the /challenge and /attest endpoints. - var appAttestBackend: StripeAttestBackend + let appAttestBackend: StripeAttestBackend /// The API client to use for network requests var apiClient: STPAPIClient @@ -180,16 +183,26 @@ import UIKit /// You should not call this directly, it'll be called automatically during assert. /// Returns nothing on success, throws on failure. func attest() async throws { - do { + if let existingTask = attestationTask { + return try await existingTask.value + } + + let task = Task { try await _attest() let successAnalytic = GenericAnalytic(event: .attestationSucceeded, params: [:]) STPAnalyticsClient.sharedClient.log(analytic: successAnalytic, apiClient: apiClient) + } + attestationTask = task + defer { attestationTask = nil } // Clear the task after it's done + do { + try await task.value } catch { let errorAnalytic = ErrorAnalytic(event: .attestationFailed, error: error) STPAnalyticsClient.sharedClient.log(analytic: errorAnalytic, apiClient: apiClient) throw error } } + private var attestationTask: Task? func _assert() async throws -> Assertion { let keyId = try await self.getOrCreateKeyID() @@ -209,7 +222,7 @@ import UIKit throw AttestationError.shouldAttestButKeyIsAlreadyAttested } - let deviceId = try getDeviceID() + let deviceId = try await getDeviceID() let appId = try getAppID() let assertion = try await generateAssertion(keyId: keyId, challenge: challenge.challenge) @@ -238,7 +251,7 @@ import UIKit } let hash = Data(SHA256.hash(data: challengeData)) - let deviceId = try getDeviceID() + let deviceId = try await getDeviceID() let appId = try getAppID() do { @@ -303,8 +316,8 @@ import UIKit throw AttestationError.noAppID } - func getDeviceID() throws -> String { - if let deviceID = UIDevice.current.identifierForVendor?.uuidString { + func getDeviceID() async throws -> String { + if let deviceID = await UIDevice.current.identifierForVendor?.uuidString { return deviceID } throw AttestationError.noDeviceID @@ -352,9 +365,9 @@ import UIKit } } - private var testmodeAssertion: Assertion { + private func testmodeAssertion() async -> Assertion { Assertion(assertionData: Data(bytes: [0x01, 0x02, 0x03], count: 3), - deviceID: (try? getDeviceID()) ?? "test-device-id", + deviceID: (try? await getDeviceID()) ?? "test-device-id", appID: (try? getAppID()) ?? "com.example.test", keyID: "TestKeyID") } diff --git a/StripeCore/StripeCoreTests/Attestation/MockAppAttestService.swift b/StripeCore/StripeCoreTests/Attestation/MockAppAttestService.swift index 995f70e067e..51935353839 100644 --- a/StripeCore/StripeCoreTests/Attestation/MockAppAttestService.swift +++ b/StripeCore/StripeCoreTests/Attestation/MockAppAttestService.swift @@ -10,10 +10,10 @@ import DeviceCheck @testable @_spi(STP) import StripeCore import UIKit -class MockAppAttestService: AppAttestService { +actor MockAppAttestService: AppAttestService { @_spi(STP) public static var shared = MockAppAttestService() - @_spi(STP) public var isSupported: Bool { + @_spi(STP) public nonisolated var isSupported: Bool { if #available(iOS 14.0, *) { return true } else { @@ -26,6 +26,22 @@ class MockAppAttestService: AppAttestService { var shouldFailAttestationWithError: Error? var attestationUsingDevelopmentEnvironment: Bool = false + func setShouldFailKeygenWithError(_ error: Error?) async { + shouldFailKeygenWithError = error + } + + func setShouldFailAssertionWithError(_ error: Error?) async { + shouldFailAssertionWithError = error + } + + func setShouldFailAttestationWithError(_ error: Error?) async { + shouldFailAttestationWithError = error + } + + func setAttestationUsingDevelopmentEnvironment(_ value: Bool) async { + attestationUsingDevelopmentEnvironment = value + } + var keys: [String: FakeKey] = [:] struct FakeKey: Codable { @@ -71,7 +87,7 @@ class MockAppAttestService: AppAttestService { return try JSONSerialization.data(withJSONObject: attestation) } - @_spi(STP) public func attestationDataIsDevelopmentEnvironment(_ data: Data) -> Bool { + @_spi(STP) public nonisolated func attestationDataIsDevelopmentEnvironment(_ data: Data) -> Bool { let decodedKey = try! JSONSerialization.jsonObject(with: data) as! [String: Any] return decodedKey["isDevelopmentEnvironment"] as! Bool } diff --git a/StripeCore/StripeCoreTests/Attestation/StripeAttestTest.swift b/StripeCore/StripeCoreTests/Attestation/StripeAttestTest.swift index ec2ed31eb1a..5b930fc7303 100644 --- a/StripeCore/StripeCoreTests/Attestation/StripeAttestTest.swift +++ b/StripeCore/StripeCoreTests/Attestation/StripeAttestTest.swift @@ -18,9 +18,14 @@ class StripeAttestTest: XCTestCase { self.mockAttestService = MockAppAttestService() self.stripeAttest = StripeAttest(appAttestService: mockAttestService, appAttestBackend: mockAttestBackend, apiClient: apiClient) + let expectation = self.expectation(description: "Wait for setup") // Reset storage - UserDefaults.standard.removeObject(forKey: self.stripeAttest.defaultsKeyForSetting(.lastAttestedDate)) - stripeAttest.resetKey() + Task { @MainActor in + await UserDefaults.standard.removeObject(forKey: self.stripeAttest.defaultsKeyForSetting(.lastAttestedDate)) + await stripeAttest.resetKey() + expectation.fulfill() + } + waitForExpectations(timeout: 5) } func testAppAttestService() async { @@ -39,7 +44,7 @@ class StripeAttestTest: XCTestCase { try! await stripeAttest.attest() let invalidKeyError = NSError(domain: DCErrorDomain, code: DCError.invalidKey.rawValue, userInfo: nil) // But fail the assertion, causing the key to be reset - mockAttestService.shouldFailAssertionWithError = invalidKeyError + await mockAttestService.setShouldFailAssertionWithError(invalidKeyError) do { _ = try await stripeAttest.assert() XCTFail("Should not succeed") @@ -51,11 +56,11 @@ class StripeAttestTest: XCTestCase { func testCanAttestAsMuchAsNeededInDev() async { // Create and attest a key in the dev environment - mockAttestService.attestationUsingDevelopmentEnvironment = true + await mockAttestService.setAttestationUsingDevelopmentEnvironment(true) try! await stripeAttest.attest() let invalidKeyError = NSError(domain: DCErrorDomain, code: DCError.invalidKey.rawValue, userInfo: nil) // But fail the assertion, which will cause us to try to re-attest the key - mockAttestService.shouldFailAssertionWithError = invalidKeyError + await mockAttestService.setShouldFailAssertionWithError(invalidKeyError) do { _ = try await stripeAttest.assert() XCTFail("Should not succeed") @@ -74,10 +79,10 @@ class StripeAttestTest: XCTestCase { // Create and attest a key try! await stripeAttest.attest() // But it's an old key, so we'll be allowed to attest a new one - UserDefaults.standard.set(Date.distantPast, forKey: self.stripeAttest.defaultsKeyForSetting(.lastAttestedDate)) + await UserDefaults.standard.set(Date.distantPast, forKey: self.stripeAttest.defaultsKeyForSetting(.lastAttestedDate)) // Always fail the assertions and don't remember attestations: let invalidKeyError = NSError(domain: DCErrorDomain, code: DCError.invalidKey.rawValue, userInfo: nil) - mockAttestService.shouldFailAssertionWithError = invalidKeyError + await mockAttestService.setShouldFailAssertionWithError(invalidKeyError) _ = try await stripeAttest.assert() XCTFail("Should not succeed") @@ -87,7 +92,7 @@ class StripeAttestTest: XCTestCase { } func testNoPublishableKey() async { - stripeAttest.apiClient.publishableKey = nil + await stripeAttest.apiClient.publishableKey = nil do { // Create and attest a key try await stripeAttest.attest() @@ -99,14 +104,26 @@ class StripeAttestTest: XCTestCase { func testAssertionsNotRequiredInTestMode() async { // Configure a test merchant PK: - stripeAttest.apiClient.publishableKey = "pk_test_abc123" + await stripeAttest.apiClient.publishableKey = "pk_test_abc123" // And reset the last attestation date: - UserDefaults.standard.removeObject(forKey: self.stripeAttest.defaultsKeyForSetting(.lastAttestedDate)) + await UserDefaults.standard.removeObject(forKey: self.stripeAttest.defaultsKeyForSetting(.lastAttestedDate)) // Fail the assertion, which will cause us to try to re-attest the key, but then the // assertions still won't work, so we'll send the testmode data instead. let invalidKeyError = NSError(domain: DCErrorDomain, code: DCError.invalidKey.rawValue, userInfo: nil) - mockAttestService.shouldFailAssertionWithError = invalidKeyError + await mockAttestService.setShouldFailAssertionWithError(invalidKeyError) let assertion = try! await stripeAttest.assert() XCTAssertEqual(assertion.keyID, "TestKeyID") } + + func testConcurrentAssertionsAndAttestations() async { + let iterations = 500 + try! await withThrowingTaskGroup(of: Void.self) { group in + for _ in 0..) in - // If there's an assertion error, send it to StripeAttest - if useMobileEndpoints, - case .failure(let error) = result, - Self.isLinkAssertionError(error: error) { - StripeAttest(apiClient: self).receivedAssertionError(error) + Task { @MainActor in + // If there's an assertion error, send it to StripeAttest + if useMobileEndpoints, + case .failure(let error) = result, + Self.isLinkAssertionError(error: error) { + await StripeAttest(apiClient: self).receivedAssertionError(error) + } + completion(result) } - completion(result) } } } @@ -115,14 +117,16 @@ extension STPAPIClient { resource: useMobileEndpoints ? modernEndpoint : legacyEndpoint, parameters: parameters ) { (result: Result) in - // If there's an assertion error, send it to StripeAttest - if useMobileEndpoints, - case .failure(let error) = result, - Self.isLinkAssertionError(error: error) { - StripeAttest(apiClient: self).receivedAssertionError(error) + Task { @MainActor in + // If there's an assertion error, send it to StripeAttest + if useMobileEndpoints, + case .failure(let error) = result, + Self.isLinkAssertionError(error: error) { + await StripeAttest(apiClient: self).receivedAssertionError(error) + } + + completion(result) } - - completion(result) } } }