diff --git a/link/api/link.api b/link/api/link.api index 4d78b1c9b6e..f2f6f7065af 100644 --- a/link/api/link.api +++ b/link/api/link.api @@ -216,6 +216,13 @@ public final class com/stripe/android/link/ui/verification/ComposableSingletons$ public final fun getLambda-1$link_release ()Lkotlin/jvm/functions/Function3; } +public final class com/stripe/android/link/ui/wallet/ComposableSingletons$PaymentDetailsKt { + public static final field INSTANCE Lcom/stripe/android/link/ui/wallet/ComposableSingletons$PaymentDetailsKt; + public static field lambda-1 Lkotlin/jvm/functions/Function2; + public fun ()V + public final fun getLambda-1$link_release ()Lkotlin/jvm/functions/Function2; +} + public final class com/stripe/android/link/utils/ComposableSingletons$InlineContentTemplateBuilderKt { public static final field INSTANCE Lcom/stripe/android/link/utils/ComposableSingletons$InlineContentTemplateBuilderKt; public static field lambda-1 Lkotlin/jvm/functions/Function2; diff --git a/link/res/drawable/stripe_link_add_green.xml b/link/res/drawable/stripe_link_add_green.xml new file mode 100644 index 00000000000..743e3727e4c --- /dev/null +++ b/link/res/drawable/stripe_link_add_green.xml @@ -0,0 +1,16 @@ + + + + diff --git a/link/res/drawable/stripe_link_bank.xml b/link/res/drawable/stripe_link_bank.xml new file mode 100644 index 00000000000..bf2d04afc6b --- /dev/null +++ b/link/res/drawable/stripe_link_bank.xml @@ -0,0 +1,9 @@ + + + \ No newline at end of file diff --git a/link/res/drawable/stripe_link_chevron.xml b/link/res/drawable/stripe_link_chevron.xml new file mode 100644 index 00000000000..4a65ce35e5a --- /dev/null +++ b/link/res/drawable/stripe_link_chevron.xml @@ -0,0 +1,10 @@ + + + \ No newline at end of file diff --git a/link/res/values/strings.xml b/link/res/values/strings.xml index 014dd1275a0..080a144a768 100644 --- a/link/res/values/strings.xml +++ b/link/res/values/strings.xml @@ -50,6 +50,10 @@ Default Payment methods + + •••• + + Passthrough Pay another way diff --git a/link/src/main/java/com/stripe/android/link/theme/Color.kt b/link/src/main/java/com/stripe/android/link/theme/Color.kt index 7638131f9ca..ec6598e43cc 100644 --- a/link/src/main/java/com/stripe/android/link/theme/Color.kt +++ b/link/src/main/java/com/stripe/android/link/theme/Color.kt @@ -17,7 +17,9 @@ private val ButtonLabel = Color(0xFF011E0F) private val ErrorText = Color(0xFFFF2F4C) private val ErrorBackground = Color(0x2EFE87A1) +private val LightComponentBackground = Color.White private val LightComponentBorder = Color(0xFFE0E6EB) +private val LightComponentDivider = Color(0xFFEFF2F4) private val LightTextPrimary = Color(0xFF30313D) private val LightTextSecondary = Color(0xFF6A7383) private val LightTextDisabled = Color(0xFFA3ACBA) @@ -30,7 +32,9 @@ private val LightCloseButton = Color(0xFF30313D) private val LightLinkLogo = Color(0xFF1D3944) private val LightOtpPlaceholder = Color(0xFFEBEEF1) +private val DarkComponentBackground = Color(0x2E747480) private val DarkComponentBorder = Color(0x5C787880) +private val DarkComponentDivider = Color(0x33787880) private val DarkTextPrimary = Color.White private val DarkTextSecondary = Color(0x99EBEBF5) private val DarkTextDisabled = Color(0x61FFFFFF) @@ -42,7 +46,9 @@ private val DarkProgressIndicator = LinkTeal private val DarkOtpPlaceholder = Color(0x61FFFFFF) internal data class LinkColors( + val componentBackground: Color, val componentBorder: Color, + val componentDivider: Color, val actionLabel: Color, val buttonLabel: Color, val actionLabelLight: Color, @@ -64,7 +70,9 @@ internal object LinkThemeConfig { } private val colorsLight = LinkColors( + componentBackground = LightComponentBackground, componentBorder = LightComponentBorder, + componentDivider = LightComponentDivider, buttonLabel = ButtonLabel, actionLabelLight = ActionLightGreen, errorText = ErrorText, @@ -91,7 +99,9 @@ internal object LinkThemeConfig { ) private val colorsDark = colorsLight.copy( + componentBackground = DarkComponentBackground, componentBorder = DarkComponentBorder, + componentDivider = DarkComponentDivider, progressIndicator = DarkProgressIndicator, linkLogo = DarkLinkLogo, closeButton = DarkCloseButton, diff --git a/link/src/main/java/com/stripe/android/link/theme/Theme.kt b/link/src/main/java/com/stripe/android/link/theme/Theme.kt index 7f0ae205935..fe87730ac09 100644 --- a/link/src/main/java/com/stripe/android/link/theme/Theme.kt +++ b/link/src/main/java/com/stripe/android/link/theme/Theme.kt @@ -10,6 +10,7 @@ import androidx.compose.ui.unit.dp private val LocalColors = staticCompositionLocalOf { LinkThemeConfig.colors(false) } +internal val MinimumTouchTargetSize = 48.dp internal val PrimaryButtonHeight = 56.dp internal val AppBarHeight = 56.dp diff --git a/link/src/main/java/com/stripe/android/link/ui/wallet/PaymentDetails.kt b/link/src/main/java/com/stripe/android/link/ui/wallet/PaymentDetails.kt new file mode 100644 index 00000000000..e5281f76a40 --- /dev/null +++ b/link/src/main/java/com/stripe/android/link/ui/wallet/PaymentDetails.kt @@ -0,0 +1,250 @@ +package com.stripe.android.link.ui.wallet + +import androidx.compose.foundation.Image +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.RowScope +import androidx.compose.foundation.layout.defaultMinSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.material.CircularProgressIndicator +import androidx.compose.material.Icon +import androidx.compose.material.IconButton +import androidx.compose.material.MaterialTheme +import androidx.compose.material.RadioButton +import androidx.compose.material.RadioButtonDefaults +import androidx.compose.material.Text +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.MoreVert +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.ColorFilter +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import com.stripe.android.link.R +import com.stripe.android.link.theme.MinimumTouchTargetSize +import com.stripe.android.link.theme.linkColors +import com.stripe.android.link.theme.linkShapes +import com.stripe.android.model.ConsumerPaymentDetails +import com.stripe.android.model.ConsumerPaymentDetails.Card +import com.stripe.android.R as StripeR +import com.stripe.android.ui.core.R as StripeUiCoreR + +@Composable +internal fun PaymentDetailsListItem( + paymentDetails: ConsumerPaymentDetails.PaymentDetails, + enabled: Boolean, + isSelected: Boolean, + isUpdating: Boolean, + onClick: () -> Unit, + onMenuButtonClick: () -> Unit +) { + Row( + modifier = Modifier + .fillMaxWidth() + .defaultMinSize(minHeight = 56.dp) + .clickable(enabled = enabled, onClick = onClick), + verticalAlignment = Alignment.CenterVertically + ) { + RadioButton( + selected = isSelected, + onClick = null, + modifier = Modifier.padding(start = 20.dp, end = 6.dp), + colors = RadioButtonDefaults.colors( + selectedColor = MaterialTheme.linkColors.actionLabelLight, + unselectedColor = MaterialTheme.linkColors.disabledText + ) + ) + Column( + modifier = Modifier + .padding(vertical = 8.dp) + .weight(1f) + ) { + Row( + modifier = Modifier.fillMaxWidth(), + verticalAlignment = Alignment.CenterVertically + ) { + PaymentDetails(paymentDetails = paymentDetails) + + if (paymentDetails.isDefault) { + DefaultTag() + } + + val showWarning = (paymentDetails as? Card)?.isExpired ?: false + if (showWarning) { + Icon( + painter = painterResource(R.drawable.stripe_link_error), + contentDescription = null, + modifier = Modifier.size(20.dp), + tint = MaterialTheme.linkColors.errorText + ) + } + } + } + + MenuAndLoader( + enabled = enabled, + isUpdating = isUpdating, + onMenuButtonClick = onMenuButtonClick + ) + } +} + +@Composable +private fun MenuAndLoader( + enabled: Boolean, + isUpdating: Boolean, + onMenuButtonClick: () -> Unit +) { + Box( + contentAlignment = Alignment.Center, + modifier = Modifier + .size(MinimumTouchTargetSize) + .padding(end = 12.dp) + ) { + if (isUpdating) { + CircularProgressIndicator( + modifier = Modifier.size(24.dp), + strokeWidth = 2.dp + ) + } else { + IconButton( + onClick = onMenuButtonClick, + enabled = enabled + ) { + Icon( + imageVector = Icons.Filled.MoreVert, + contentDescription = stringResource(StripeR.string.stripe_edit), + tint = MaterialTheme.linkColors.actionLabelLight, + modifier = Modifier.size(24.dp) + ) + } + } + } +} + +@Composable +private fun DefaultTag() { + Box( + modifier = Modifier + .background( + color = MaterialTheme.colors.secondary, + shape = MaterialTheme.linkShapes.extraSmall + ), + contentAlignment = Alignment.Center + ) { + Text( + text = stringResource(id = R.string.stripe_wallet_default), + modifier = Modifier.padding(horizontal = 4.dp, vertical = 2.dp), + color = MaterialTheme.linkColors.disabledText, + fontSize = 12.sp, + fontWeight = FontWeight.Medium + ) + } +} + +@Composable +private fun RowScope.PaymentDetails( + paymentDetails: ConsumerPaymentDetails.PaymentDetails, +) { + when (paymentDetails) { + is Card -> { + CardInfo( + last4 = paymentDetails.last4, + icon = paymentDetails.brand.icon, + contentDescription = paymentDetails.brand.displayName + ) + } + is ConsumerPaymentDetails.BankAccount -> { + BankAccountInfo(bankAccount = paymentDetails) + } + is ConsumerPaymentDetails.Passthrough -> { + CardInfo( + last4 = paymentDetails.last4, + icon = R.drawable.stripe_link_bank, + contentDescription = stringResource(R.string.stripe_wallet_passthrough_description) + ) + } + } +} + +@Composable +private fun RowScope.CardInfo( + last4: String, + icon: Int, + contentDescription: String? = null +) { + Row( + modifier = Modifier.weight(1f), + verticalAlignment = Alignment.CenterVertically + ) { + Image( + painter = painterResource(id = icon), + contentDescription = contentDescription, + modifier = Modifier + .width(38.dp) + .padding(horizontal = 6.dp), + alignment = Alignment.Center, + ) + Text( + text = stringResource(R.string.stripe_wallet_last4_prefix), + color = MaterialTheme.colors.onPrimary, + ) + Text( + text = last4, + color = MaterialTheme.colors.onPrimary, + style = MaterialTheme.typography.h6 + ) + } +} + +@Composable +private fun RowScope.BankAccountInfo( + bankAccount: ConsumerPaymentDetails.BankAccount, +) { + Row( + modifier = Modifier.weight(1f), + verticalAlignment = Alignment.CenterVertically + ) { + Image( + painter = painterResource(R.drawable.stripe_link_bank), + contentDescription = null, + modifier = Modifier + .width(38.dp) + .padding(horizontal = 6.dp), + alignment = Alignment.Center, + colorFilter = ColorFilter.tint(MaterialTheme.linkColors.actionLabelLight) + ) + Column(horizontalAlignment = Alignment.Start) { + Text( + text = bankAccount.bankName ?: stringResource(StripeUiCoreR.string.stripe_payment_method_bank), + color = MaterialTheme.colors.onPrimary, + overflow = TextOverflow.Ellipsis, + maxLines = 1, + style = MaterialTheme.typography.h6 + ) + Row(verticalAlignment = Alignment.CenterVertically) { + Text( + text = stringResource(R.string.stripe_wallet_last4_prefix), + color = MaterialTheme.colors.onSecondary, + style = MaterialTheme.typography.body2 + ) + Text( + text = bankAccount.last4, + color = MaterialTheme.colors.onSecondary, + style = MaterialTheme.typography.body2 + ) + } + } + } +} diff --git a/link/src/test/java/com/stripe/android/link/ui/wallet/PaymentDetailsListItemScreenShotTest.kt b/link/src/test/java/com/stripe/android/link/ui/wallet/PaymentDetailsListItemScreenShotTest.kt new file mode 100644 index 00000000000..2cd0b5778d0 --- /dev/null +++ b/link/src/test/java/com/stripe/android/link/ui/wallet/PaymentDetailsListItemScreenShotTest.kt @@ -0,0 +1,178 @@ +package com.stripe.android.link.ui.wallet + +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import com.stripe.android.core.model.CountryCode +import com.stripe.android.link.theme.DefaultLinkTheme +import com.stripe.android.model.CardBrand +import com.stripe.android.model.ConsumerPaymentDetails +import com.stripe.android.model.CvcCheck +import com.stripe.android.screenshottesting.FontSize +import com.stripe.android.screenshottesting.PaparazziRule +import com.stripe.android.screenshottesting.SystemAppearance +import org.junit.Rule +import org.junit.Test + +internal class PaymentDetailsListItemScreenShotTest { + @get:Rule + val paparazziRule = PaparazziRule( + SystemAppearance.entries, + FontSize.entries, + boxModifier = Modifier + .padding(0.dp) + .fillMaxWidth(), + ) + + @Test + fun testCardEnabled() { + snapshot( + state = State( + details = ConsumerPaymentDetails.Card( + id = "QAAAKJ6", + expiryYear = 2023, + expiryMonth = 12, + isDefault = true, + brand = CardBrand.MasterCard, + last4 = "4444", + cvcCheck = CvcCheck.Pass, + billingAddress = ConsumerPaymentDetails.BillingAddress( + countryCode = CountryCode.US, + postalCode = "12312" + ) + ), + enabled = true, + isSelected = false, + isUpdating = false + ) + ) + } + + @Test + fun testCardEnabledAndSelected() { + snapshot( + state = State( + details = ConsumerPaymentDetails.Card( + id = "QAAAKJ6", + expiryYear = 2023, + expiryMonth = 12, + isDefault = true, + brand = CardBrand.MasterCard, + last4 = "4444", + cvcCheck = CvcCheck.Pass, + billingAddress = ConsumerPaymentDetails.BillingAddress( + countryCode = CountryCode.US, + postalCode = "12312" + ) + ), + enabled = true, + isSelected = true, + isUpdating = false + ) + ) + } + + @Test + fun testCardEnabledAndUpdating() { + snapshot( + state = State( + details = ConsumerPaymentDetails.Card( + id = "QAAAKJ6", + expiryYear = 2023, + expiryMonth = 12, + isDefault = true, + brand = CardBrand.MasterCard, + last4 = "4444", + cvcCheck = CvcCheck.Pass, + billingAddress = ConsumerPaymentDetails.BillingAddress( + countryCode = CountryCode.US, + postalCode = "12312" + ) + ), + enabled = true, + isSelected = false, + isUpdating = true + ) + ) + } + + @Test + fun testCardDisabledAndSelected() { + snapshot( + state = State( + details = ConsumerPaymentDetails.Card( + id = "QAAAKJ6", + expiryYear = 2023, + expiryMonth = 12, + isDefault = true, + brand = CardBrand.MasterCard, + last4 = "4444", + cvcCheck = CvcCheck.Pass, + billingAddress = ConsumerPaymentDetails.BillingAddress( + countryCode = CountryCode.US, + postalCode = "12312" + ) + ), + enabled = false, + isSelected = true, + isUpdating = false + ) + ) + } + + @Test + fun testBankAccountEnabled() { + snapshot( + state = State( + details = ConsumerPaymentDetails.BankAccount( + id = "wAAACGA", + last4 = "6789", + bankName = "STRIPE TEST BANK", + bankIconCode = null, + isDefault = false, + ), + enabled = true, + isSelected = false, + isUpdating = false + ) + ) + } + + @Test + fun testPassThroughEnabled() { + snapshot( + state = State( + details = ConsumerPaymentDetails.Passthrough( + id = "wAAACGA", + last4 = "6789", + ), + enabled = true, + isSelected = false, + isUpdating = false + ) + ) + } + + private fun snapshot(state: State) { + paparazziRule.snapshot { + DefaultLinkTheme { + PaymentDetailsListItem( + paymentDetails = state.details, + enabled = state.enabled, + isSelected = state.isSelected, + isUpdating = state.isUpdating, + onClick = {}, + onMenuButtonClick = {} + ) + } + } + } + + internal data class State( + val details: ConsumerPaymentDetails.PaymentDetails, + val enabled: Boolean, + val isSelected: Boolean, + val isUpdating: Boolean, + ) +} diff --git a/link/src/test/snapshots/images/com.stripe.android.link.ui.wallet_PaymentDetailsListItemScreenShotTest_testBankAccountEnabled[DarkTheme,DefaultFont].png b/link/src/test/snapshots/images/com.stripe.android.link.ui.wallet_PaymentDetailsListItemScreenShotTest_testBankAccountEnabled[DarkTheme,DefaultFont].png new file mode 100644 index 00000000000..d56eecd219b Binary files /dev/null and b/link/src/test/snapshots/images/com.stripe.android.link.ui.wallet_PaymentDetailsListItemScreenShotTest_testBankAccountEnabled[DarkTheme,DefaultFont].png differ diff --git a/link/src/test/snapshots/images/com.stripe.android.link.ui.wallet_PaymentDetailsListItemScreenShotTest_testBankAccountEnabled[DarkTheme,LargeFont].png b/link/src/test/snapshots/images/com.stripe.android.link.ui.wallet_PaymentDetailsListItemScreenShotTest_testBankAccountEnabled[DarkTheme,LargeFont].png new file mode 100644 index 00000000000..bedac7e4a0b Binary files /dev/null and b/link/src/test/snapshots/images/com.stripe.android.link.ui.wallet_PaymentDetailsListItemScreenShotTest_testBankAccountEnabled[DarkTheme,LargeFont].png differ diff --git a/link/src/test/snapshots/images/com.stripe.android.link.ui.wallet_PaymentDetailsListItemScreenShotTest_testBankAccountEnabled[LightTheme,DefaultFont].png b/link/src/test/snapshots/images/com.stripe.android.link.ui.wallet_PaymentDetailsListItemScreenShotTest_testBankAccountEnabled[LightTheme,DefaultFont].png new file mode 100644 index 00000000000..b934a9aef3b Binary files /dev/null and b/link/src/test/snapshots/images/com.stripe.android.link.ui.wallet_PaymentDetailsListItemScreenShotTest_testBankAccountEnabled[LightTheme,DefaultFont].png differ diff --git a/link/src/test/snapshots/images/com.stripe.android.link.ui.wallet_PaymentDetailsListItemScreenShotTest_testBankAccountEnabled[LightTheme,LargeFont].png b/link/src/test/snapshots/images/com.stripe.android.link.ui.wallet_PaymentDetailsListItemScreenShotTest_testBankAccountEnabled[LightTheme,LargeFont].png new file mode 100644 index 00000000000..26faca1e843 Binary files /dev/null and b/link/src/test/snapshots/images/com.stripe.android.link.ui.wallet_PaymentDetailsListItemScreenShotTest_testBankAccountEnabled[LightTheme,LargeFont].png differ diff --git a/link/src/test/snapshots/images/com.stripe.android.link.ui.wallet_PaymentDetailsListItemScreenShotTest_testCardDisabledAndSelected[DarkTheme,DefaultFont].png b/link/src/test/snapshots/images/com.stripe.android.link.ui.wallet_PaymentDetailsListItemScreenShotTest_testCardDisabledAndSelected[DarkTheme,DefaultFont].png new file mode 100644 index 00000000000..42d3074d2b7 Binary files /dev/null and b/link/src/test/snapshots/images/com.stripe.android.link.ui.wallet_PaymentDetailsListItemScreenShotTest_testCardDisabledAndSelected[DarkTheme,DefaultFont].png differ diff --git a/link/src/test/snapshots/images/com.stripe.android.link.ui.wallet_PaymentDetailsListItemScreenShotTest_testCardDisabledAndSelected[DarkTheme,LargeFont].png b/link/src/test/snapshots/images/com.stripe.android.link.ui.wallet_PaymentDetailsListItemScreenShotTest_testCardDisabledAndSelected[DarkTheme,LargeFont].png new file mode 100644 index 00000000000..c429f8d4d0b Binary files /dev/null and b/link/src/test/snapshots/images/com.stripe.android.link.ui.wallet_PaymentDetailsListItemScreenShotTest_testCardDisabledAndSelected[DarkTheme,LargeFont].png differ diff --git a/link/src/test/snapshots/images/com.stripe.android.link.ui.wallet_PaymentDetailsListItemScreenShotTest_testCardDisabledAndSelected[LightTheme,DefaultFont].png b/link/src/test/snapshots/images/com.stripe.android.link.ui.wallet_PaymentDetailsListItemScreenShotTest_testCardDisabledAndSelected[LightTheme,DefaultFont].png new file mode 100644 index 00000000000..efffa9f242b Binary files /dev/null and b/link/src/test/snapshots/images/com.stripe.android.link.ui.wallet_PaymentDetailsListItemScreenShotTest_testCardDisabledAndSelected[LightTheme,DefaultFont].png differ diff --git a/link/src/test/snapshots/images/com.stripe.android.link.ui.wallet_PaymentDetailsListItemScreenShotTest_testCardDisabledAndSelected[LightTheme,LargeFont].png b/link/src/test/snapshots/images/com.stripe.android.link.ui.wallet_PaymentDetailsListItemScreenShotTest_testCardDisabledAndSelected[LightTheme,LargeFont].png new file mode 100644 index 00000000000..7a556920768 Binary files /dev/null and b/link/src/test/snapshots/images/com.stripe.android.link.ui.wallet_PaymentDetailsListItemScreenShotTest_testCardDisabledAndSelected[LightTheme,LargeFont].png differ diff --git a/link/src/test/snapshots/images/com.stripe.android.link.ui.wallet_PaymentDetailsListItemScreenShotTest_testCardEnabledAndSelected[DarkTheme,DefaultFont].png b/link/src/test/snapshots/images/com.stripe.android.link.ui.wallet_PaymentDetailsListItemScreenShotTest_testCardEnabledAndSelected[DarkTheme,DefaultFont].png new file mode 100644 index 00000000000..42d3074d2b7 Binary files /dev/null and b/link/src/test/snapshots/images/com.stripe.android.link.ui.wallet_PaymentDetailsListItemScreenShotTest_testCardEnabledAndSelected[DarkTheme,DefaultFont].png differ diff --git a/link/src/test/snapshots/images/com.stripe.android.link.ui.wallet_PaymentDetailsListItemScreenShotTest_testCardEnabledAndSelected[DarkTheme,LargeFont].png b/link/src/test/snapshots/images/com.stripe.android.link.ui.wallet_PaymentDetailsListItemScreenShotTest_testCardEnabledAndSelected[DarkTheme,LargeFont].png new file mode 100644 index 00000000000..c429f8d4d0b Binary files /dev/null and b/link/src/test/snapshots/images/com.stripe.android.link.ui.wallet_PaymentDetailsListItemScreenShotTest_testCardEnabledAndSelected[DarkTheme,LargeFont].png differ diff --git a/link/src/test/snapshots/images/com.stripe.android.link.ui.wallet_PaymentDetailsListItemScreenShotTest_testCardEnabledAndSelected[LightTheme,DefaultFont].png b/link/src/test/snapshots/images/com.stripe.android.link.ui.wallet_PaymentDetailsListItemScreenShotTest_testCardEnabledAndSelected[LightTheme,DefaultFont].png new file mode 100644 index 00000000000..efffa9f242b Binary files /dev/null and b/link/src/test/snapshots/images/com.stripe.android.link.ui.wallet_PaymentDetailsListItemScreenShotTest_testCardEnabledAndSelected[LightTheme,DefaultFont].png differ diff --git a/link/src/test/snapshots/images/com.stripe.android.link.ui.wallet_PaymentDetailsListItemScreenShotTest_testCardEnabledAndSelected[LightTheme,LargeFont].png b/link/src/test/snapshots/images/com.stripe.android.link.ui.wallet_PaymentDetailsListItemScreenShotTest_testCardEnabledAndSelected[LightTheme,LargeFont].png new file mode 100644 index 00000000000..7a556920768 Binary files /dev/null and b/link/src/test/snapshots/images/com.stripe.android.link.ui.wallet_PaymentDetailsListItemScreenShotTest_testCardEnabledAndSelected[LightTheme,LargeFont].png differ diff --git a/link/src/test/snapshots/images/com.stripe.android.link.ui.wallet_PaymentDetailsListItemScreenShotTest_testCardEnabledAndUpdating[DarkTheme,DefaultFont].png b/link/src/test/snapshots/images/com.stripe.android.link.ui.wallet_PaymentDetailsListItemScreenShotTest_testCardEnabledAndUpdating[DarkTheme,DefaultFont].png new file mode 100644 index 00000000000..a83d4084a47 Binary files /dev/null and b/link/src/test/snapshots/images/com.stripe.android.link.ui.wallet_PaymentDetailsListItemScreenShotTest_testCardEnabledAndUpdating[DarkTheme,DefaultFont].png differ diff --git a/link/src/test/snapshots/images/com.stripe.android.link.ui.wallet_PaymentDetailsListItemScreenShotTest_testCardEnabledAndUpdating[DarkTheme,LargeFont].png b/link/src/test/snapshots/images/com.stripe.android.link.ui.wallet_PaymentDetailsListItemScreenShotTest_testCardEnabledAndUpdating[DarkTheme,LargeFont].png new file mode 100644 index 00000000000..a23500587de Binary files /dev/null and b/link/src/test/snapshots/images/com.stripe.android.link.ui.wallet_PaymentDetailsListItemScreenShotTest_testCardEnabledAndUpdating[DarkTheme,LargeFont].png differ diff --git a/link/src/test/snapshots/images/com.stripe.android.link.ui.wallet_PaymentDetailsListItemScreenShotTest_testCardEnabledAndUpdating[LightTheme,DefaultFont].png b/link/src/test/snapshots/images/com.stripe.android.link.ui.wallet_PaymentDetailsListItemScreenShotTest_testCardEnabledAndUpdating[LightTheme,DefaultFont].png new file mode 100644 index 00000000000..b121df5dd7b Binary files /dev/null and b/link/src/test/snapshots/images/com.stripe.android.link.ui.wallet_PaymentDetailsListItemScreenShotTest_testCardEnabledAndUpdating[LightTheme,DefaultFont].png differ diff --git a/link/src/test/snapshots/images/com.stripe.android.link.ui.wallet_PaymentDetailsListItemScreenShotTest_testCardEnabledAndUpdating[LightTheme,LargeFont].png b/link/src/test/snapshots/images/com.stripe.android.link.ui.wallet_PaymentDetailsListItemScreenShotTest_testCardEnabledAndUpdating[LightTheme,LargeFont].png new file mode 100644 index 00000000000..6554d928f40 Binary files /dev/null and b/link/src/test/snapshots/images/com.stripe.android.link.ui.wallet_PaymentDetailsListItemScreenShotTest_testCardEnabledAndUpdating[LightTheme,LargeFont].png differ diff --git a/link/src/test/snapshots/images/com.stripe.android.link.ui.wallet_PaymentDetailsListItemScreenShotTest_testCardEnabled[DarkTheme,DefaultFont].png b/link/src/test/snapshots/images/com.stripe.android.link.ui.wallet_PaymentDetailsListItemScreenShotTest_testCardEnabled[DarkTheme,DefaultFont].png new file mode 100644 index 00000000000..0e73db1a874 Binary files /dev/null and b/link/src/test/snapshots/images/com.stripe.android.link.ui.wallet_PaymentDetailsListItemScreenShotTest_testCardEnabled[DarkTheme,DefaultFont].png differ diff --git a/link/src/test/snapshots/images/com.stripe.android.link.ui.wallet_PaymentDetailsListItemScreenShotTest_testCardEnabled[DarkTheme,LargeFont].png b/link/src/test/snapshots/images/com.stripe.android.link.ui.wallet_PaymentDetailsListItemScreenShotTest_testCardEnabled[DarkTheme,LargeFont].png new file mode 100644 index 00000000000..5b182c7f886 Binary files /dev/null and b/link/src/test/snapshots/images/com.stripe.android.link.ui.wallet_PaymentDetailsListItemScreenShotTest_testCardEnabled[DarkTheme,LargeFont].png differ diff --git a/link/src/test/snapshots/images/com.stripe.android.link.ui.wallet_PaymentDetailsListItemScreenShotTest_testCardEnabled[LightTheme,DefaultFont].png b/link/src/test/snapshots/images/com.stripe.android.link.ui.wallet_PaymentDetailsListItemScreenShotTest_testCardEnabled[LightTheme,DefaultFont].png new file mode 100644 index 00000000000..906d7871723 Binary files /dev/null and b/link/src/test/snapshots/images/com.stripe.android.link.ui.wallet_PaymentDetailsListItemScreenShotTest_testCardEnabled[LightTheme,DefaultFont].png differ diff --git a/link/src/test/snapshots/images/com.stripe.android.link.ui.wallet_PaymentDetailsListItemScreenShotTest_testCardEnabled[LightTheme,LargeFont].png b/link/src/test/snapshots/images/com.stripe.android.link.ui.wallet_PaymentDetailsListItemScreenShotTest_testCardEnabled[LightTheme,LargeFont].png new file mode 100644 index 00000000000..500232d1706 Binary files /dev/null and b/link/src/test/snapshots/images/com.stripe.android.link.ui.wallet_PaymentDetailsListItemScreenShotTest_testCardEnabled[LightTheme,LargeFont].png differ diff --git a/link/src/test/snapshots/images/com.stripe.android.link.ui.wallet_PaymentDetailsListItemScreenShotTest_testPassThroughEnabled[DarkTheme,DefaultFont].png b/link/src/test/snapshots/images/com.stripe.android.link.ui.wallet_PaymentDetailsListItemScreenShotTest_testPassThroughEnabled[DarkTheme,DefaultFont].png new file mode 100644 index 00000000000..a279cfe9602 Binary files /dev/null and b/link/src/test/snapshots/images/com.stripe.android.link.ui.wallet_PaymentDetailsListItemScreenShotTest_testPassThroughEnabled[DarkTheme,DefaultFont].png differ diff --git a/link/src/test/snapshots/images/com.stripe.android.link.ui.wallet_PaymentDetailsListItemScreenShotTest_testPassThroughEnabled[DarkTheme,LargeFont].png b/link/src/test/snapshots/images/com.stripe.android.link.ui.wallet_PaymentDetailsListItemScreenShotTest_testPassThroughEnabled[DarkTheme,LargeFont].png new file mode 100644 index 00000000000..a59ec213a70 Binary files /dev/null and b/link/src/test/snapshots/images/com.stripe.android.link.ui.wallet_PaymentDetailsListItemScreenShotTest_testPassThroughEnabled[DarkTheme,LargeFont].png differ diff --git a/link/src/test/snapshots/images/com.stripe.android.link.ui.wallet_PaymentDetailsListItemScreenShotTest_testPassThroughEnabled[LightTheme,DefaultFont].png b/link/src/test/snapshots/images/com.stripe.android.link.ui.wallet_PaymentDetailsListItemScreenShotTest_testPassThroughEnabled[LightTheme,DefaultFont].png new file mode 100644 index 00000000000..50bd43fdbba Binary files /dev/null and b/link/src/test/snapshots/images/com.stripe.android.link.ui.wallet_PaymentDetailsListItemScreenShotTest_testPassThroughEnabled[LightTheme,DefaultFont].png differ diff --git a/link/src/test/snapshots/images/com.stripe.android.link.ui.wallet_PaymentDetailsListItemScreenShotTest_testPassThroughEnabled[LightTheme,LargeFont].png b/link/src/test/snapshots/images/com.stripe.android.link.ui.wallet_PaymentDetailsListItemScreenShotTest_testPassThroughEnabled[LightTheme,LargeFont].png new file mode 100644 index 00000000000..1ae57b64ab4 Binary files /dev/null and b/link/src/test/snapshots/images/com.stripe.android.link.ui.wallet_PaymentDetailsListItemScreenShotTest_testPassThroughEnabled[LightTheme,LargeFont].png differ