Skip to content

Commit

Permalink
Refactoring to support Bank Accounts in Link (#5466)
Browse files Browse the repository at this point in the history
  • Loading branch information
brnunes-stripe committed Aug 26, 2022
1 parent 3966968 commit 167fe2a
Show file tree
Hide file tree
Showing 32 changed files with 439 additions and 270 deletions.
48 changes: 24 additions & 24 deletions link/api/link.api
Expand Up @@ -362,30 +362,6 @@ public final class com/stripe/android/link/ui/LinkTermsKt {
public static final fun LinkTerms-5stqomU (Landroidx/compose/ui/Modifier;ILandroidx/compose/runtime/Composer;II)V
}

public final class com/stripe/android/link/ui/cardedit/CardEditViewModel$Result$Cancelled$Creator : android/os/Parcelable$Creator {
public fun <init> ()V
public final fun createFromParcel (Landroid/os/Parcel;)Lcom/stripe/android/link/ui/cardedit/CardEditViewModel$Result$Cancelled;
public synthetic fun createFromParcel (Landroid/os/Parcel;)Ljava/lang/Object;
public final fun newArray (I)[Lcom/stripe/android/link/ui/cardedit/CardEditViewModel$Result$Cancelled;
public synthetic fun newArray (I)[Ljava/lang/Object;
}

public final class com/stripe/android/link/ui/cardedit/CardEditViewModel$Result$Failure$Creator : android/os/Parcelable$Creator {
public fun <init> ()V
public final fun createFromParcel (Landroid/os/Parcel;)Lcom/stripe/android/link/ui/cardedit/CardEditViewModel$Result$Failure;
public synthetic fun createFromParcel (Landroid/os/Parcel;)Ljava/lang/Object;
public final fun newArray (I)[Lcom/stripe/android/link/ui/cardedit/CardEditViewModel$Result$Failure;
public synthetic fun newArray (I)[Ljava/lang/Object;
}

public final class com/stripe/android/link/ui/cardedit/CardEditViewModel$Result$Success$Creator : android/os/Parcelable$Creator {
public fun <init> ()V
public final fun createFromParcel (Landroid/os/Parcel;)Lcom/stripe/android/link/ui/cardedit/CardEditViewModel$Result$Success;
public synthetic fun createFromParcel (Landroid/os/Parcel;)Ljava/lang/Object;
public final fun newArray (I)[Lcom/stripe/android/link/ui/cardedit/CardEditViewModel$Result$Success;
public synthetic fun newArray (I)[Ljava/lang/Object;
}

public final class com/stripe/android/link/ui/cardedit/CardEditViewModel_Factory : dagger/internal/Factory {
public fun <init> (Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;)V
public static fun create (Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;)Lcom/stripe/android/link/ui/cardedit/CardEditViewModel_Factory;
Expand Down Expand Up @@ -585,6 +561,30 @@ public final class com/stripe/android/link/ui/wallet/ComposableSingletons$Wallet
public final fun getLambda-2$link_release ()Lkotlin/jvm/functions/Function2;
}

public final class com/stripe/android/link/ui/wallet/PaymentDetailsResult$Cancelled$Creator : android/os/Parcelable$Creator {
public fun <init> ()V
public final fun createFromParcel (Landroid/os/Parcel;)Lcom/stripe/android/link/ui/wallet/PaymentDetailsResult$Cancelled;
public synthetic fun createFromParcel (Landroid/os/Parcel;)Ljava/lang/Object;
public final fun newArray (I)[Lcom/stripe/android/link/ui/wallet/PaymentDetailsResult$Cancelled;
public synthetic fun newArray (I)[Ljava/lang/Object;
}

public final class com/stripe/android/link/ui/wallet/PaymentDetailsResult$Failure$Creator : android/os/Parcelable$Creator {
public fun <init> ()V
public final fun createFromParcel (Landroid/os/Parcel;)Lcom/stripe/android/link/ui/wallet/PaymentDetailsResult$Failure;
public synthetic fun createFromParcel (Landroid/os/Parcel;)Ljava/lang/Object;
public final fun newArray (I)[Lcom/stripe/android/link/ui/wallet/PaymentDetailsResult$Failure;
public synthetic fun newArray (I)[Ljava/lang/Object;
}

public final class com/stripe/android/link/ui/wallet/PaymentDetailsResult$Success$Creator : android/os/Parcelable$Creator {
public fun <init> ()V
public final fun createFromParcel (Landroid/os/Parcel;)Lcom/stripe/android/link/ui/wallet/PaymentDetailsResult$Success;
public synthetic fun createFromParcel (Landroid/os/Parcel;)Ljava/lang/Object;
public final fun newArray (I)[Lcom/stripe/android/link/ui/wallet/PaymentDetailsResult$Success;
public synthetic fun newArray (I)[Ljava/lang/Object;
}

public final class com/stripe/android/link/ui/wallet/WalletViewModel_Factory : dagger/internal/Factory {
public fun <init> (Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;)V
public static fun create (Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;)Lcom/stripe/android/link/ui/wallet/WalletViewModel_Factory;
Expand Down
19 changes: 6 additions & 13 deletions link/res/drawable/ic_link_add.xml
@@ -1,16 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
android:width="16dp"
android:height="16dp"
android:viewportWidth="16"
android:viewportHeight="16">
<path
android:pathData="M6,0L18,0A6,6 0,0 1,24 6L24,18A6,6 0,0 1,18 24L6,24A6,6 0,0 1,0 18L0,6A6,6 0,0 1,6 0z"
android:fillColor="#33DDB3"
android:fillAlpha="0.15"/>
<path
android:pathData="M12.75,11.25H17.25C17.664,11.25 18,11.586 18,12C18,12.414 17.664,12.75 17.25,12.75H12.75V17.25C12.75,17.664 12.414,18 12,18C11.586,18 11.25,17.664 11.25,17.25V12.75H6.75C6.336,12.75 6,12.414 6,12C6,11.586 6.336,11.25 6.75,11.25H11.25V6.75C11.25,6.336 11.586,6 12,6C12.414,6 12.75,6.336 12.75,6.75V11.25Z"
android:strokeAlpha="0.9"
android:fillColor="#05A87F"
android:fillType="evenOdd"
android:fillAlpha="0.9"/>
android:pathData="M8.75,0.75C8.75,0.336 8.414,0 8,0C7.586,0 7.25,0.336 7.25,0.75V7.25H0.75C0.336,7.25 0,7.586 0,8C0,8.414 0.336,8.75 0.75,8.75H7.25V15.25C7.25,15.664 7.586,16 8,16C8.414,16 8.75,15.664 8.75,15.25V8.75H15.25C15.664,8.75 16,8.414 16,8C16,7.586 15.664,7.25 15.25,7.25H8.75V0.75Z"
android:fillColor="#1D3944"/>
</vector>
16 changes: 16 additions & 0 deletions link/res/drawable/ic_link_add_green.xml
@@ -0,0 +1,16 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:pathData="M6,0L18,0A6,6 0,0 1,24 6L24,18A6,6 0,0 1,18 24L6,24A6,6 0,0 1,0 18L0,6A6,6 0,0 1,6 0z"
android:fillColor="#33DDB3"
android:fillAlpha="0.15"/>
<path
android:pathData="M12.75,11.25H17.25C17.664,11.25 18,11.586 18,12C18,12.414 17.664,12.75 17.25,12.75H12.75V17.25C12.75,17.664 12.414,18 12,18C11.586,18 11.25,17.664 11.25,17.25V12.75H6.75C6.336,12.75 6,12.414 6,12C6,11.586 6.336,11.25 6.75,11.25H11.25V6.75C11.25,6.336 11.586,6 12,6C12.414,6 12.75,6.336 12.75,6.75V11.25Z"
android:strokeAlpha="0.9"
android:fillColor="#05A87F"
android:fillType="evenOdd"
android:fillAlpha="0.9"/>
</vector>
8 changes: 4 additions & 4 deletions link/res/drawable/ic_link_bank.xml
@@ -1,9 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="18dp"
android:width="19dp"
android:height="17dp"
android:viewportWidth="18"
android:viewportWidth="19"
android:viewportHeight="17">
<path
android:pathData="M0.578,5.047C0.578,5.43 0.875,5.797 1.383,5.797H16.102C16.609,5.797 16.906,5.43 16.906,5.047C16.906,4.766 16.75,4.539 16.414,4.328L9.758,0.492C9.43,0.305 9.078,0.203 8.742,0.203C8.406,0.203 8.055,0.305 7.727,0.492L1.07,4.328C0.734,4.539 0.578,4.766 0.578,5.047ZM1.609,14.055C1.609,14.43 1.828,14.648 2.211,14.648H4.211C4.594,14.648 4.813,14.43 4.813,14.055V13.844C4.813,13.477 4.594,13.258 4.211,13.258H3.914V7.789H4.211C4.594,7.789 4.813,7.57 4.813,7.195V6.984C4.813,6.609 4.594,6.391 4.211,6.391H2.211C1.828,6.391 1.609,6.609 1.609,6.984V7.195C1.609,7.57 1.828,7.789 2.211,7.789H2.523V13.258H2.211C1.828,13.258 1.609,13.477 1.609,13.844V14.055ZM5.328,14.055C5.328,14.43 5.555,14.648 5.93,14.648H7.938C8.313,14.648 8.531,14.43 8.531,14.055V13.844C8.531,13.477 8.313,13.258 7.938,13.258H7.633V7.789H7.938C8.313,7.789 8.531,7.57 8.531,7.195V6.984C8.531,6.609 8.313,6.391 7.938,6.391H5.93C5.555,6.391 5.328,6.609 5.328,6.984V7.195C5.328,7.57 5.555,7.789 5.93,7.789H6.242V13.258H5.93C5.555,13.258 5.328,13.477 5.328,13.844V14.055ZM9.063,14.055C9.063,14.43 9.281,14.648 9.656,14.648H11.664C12.039,14.648 12.266,14.43 12.266,14.055V13.844C12.266,13.477 12.039,13.258 11.664,13.258H11.367V7.789H11.664C12.039,7.789 12.266,7.57 12.266,7.195V6.984C12.266,6.609 12.039,6.391 11.664,6.391H9.656C9.281,6.391 9.063,6.609 9.063,6.984V7.195C9.063,7.57 9.281,7.789 9.656,7.789H9.969V13.258H9.656C9.281,13.258 9.063,13.477 9.063,13.844V14.055ZM12.781,14.055C12.781,14.43 13,14.648 13.383,14.648H15.383C15.766,14.648 15.984,14.43 15.984,14.055V13.844C15.984,13.477 15.766,13.258 15.383,13.258H15.086V7.789H15.383C15.766,7.789 15.984,7.57 15.984,7.195V6.984C15.984,6.609 15.766,6.391 15.383,6.391H13.383C13,6.391 12.781,6.609 12.781,6.984V7.195C12.781,7.57 13,7.789 13.383,7.789H13.688V13.258H13.383C13,13.258 12.781,13.477 12.781,13.844V14.055ZM0.156,16C0.156,16.406 0.492,16.742 0.906,16.742H16.594C17,16.742 17.336,16.406 17.336,16C17.336,15.586 17,15.25 16.594,15.25H0.906C0.492,15.25 0.156,15.586 0.156,16Z"
android:fillColor="#33DDB3"/>
android:pathData="M1.328,5.047C1.328,5.43 1.625,5.797 2.133,5.797H16.852C17.359,5.797 17.656,5.43 17.656,5.047C17.656,4.766 17.5,4.539 17.164,4.328L10.508,0.492C10.18,0.305 9.828,0.203 9.492,0.203C9.156,0.203 8.805,0.305 8.477,0.492L1.82,4.328C1.484,4.539 1.328,4.766 1.328,5.047ZM2.359,14.055C2.359,14.43 2.578,14.648 2.961,14.648H4.961C5.344,14.648 5.563,14.43 5.563,14.055V13.844C5.563,13.477 5.344,13.258 4.961,13.258H4.664V7.789H4.961C5.344,7.789 5.563,7.57 5.563,7.195V6.984C5.563,6.609 5.344,6.391 4.961,6.391H2.961C2.578,6.391 2.359,6.609 2.359,6.984V7.195C2.359,7.57 2.578,7.789 2.961,7.789H3.273V13.258H2.961C2.578,13.258 2.359,13.477 2.359,13.844V14.055ZM6.078,14.055C6.078,14.43 6.305,14.648 6.68,14.648H8.688C9.063,14.648 9.281,14.43 9.281,14.055V13.844C9.281,13.477 9.063,13.258 8.688,13.258H8.383V7.789H8.688C9.063,7.789 9.281,7.57 9.281,7.195V6.984C9.281,6.609 9.063,6.391 8.688,6.391H6.68C6.305,6.391 6.078,6.609 6.078,6.984V7.195C6.078,7.57 6.305,7.789 6.68,7.789H6.992V13.258H6.68C6.305,13.258 6.078,13.477 6.078,13.844V14.055ZM9.813,14.055C9.813,14.43 10.031,14.648 10.406,14.648H12.414C12.789,14.648 13.016,14.43 13.016,14.055V13.844C13.016,13.477 12.789,13.258 12.414,13.258H12.117V7.789H12.414C12.789,7.789 13.016,7.57 13.016,7.195V6.984C13.016,6.609 12.789,6.391 12.414,6.391H10.406C10.031,6.391 9.813,6.609 9.813,6.984V7.195C9.813,7.57 10.031,7.789 10.406,7.789H10.719V13.258H10.406C10.031,13.258 9.813,13.477 9.813,13.844V14.055ZM13.531,14.055C13.531,14.43 13.75,14.648 14.133,14.648H16.133C16.516,14.648 16.734,14.43 16.734,14.055V13.844C16.734,13.477 16.516,13.258 16.133,13.258H15.836V7.789H16.133C16.516,7.789 16.734,7.57 16.734,7.195V6.984C16.734,6.609 16.516,6.391 16.133,6.391H14.133C13.75,6.391 13.531,6.609 13.531,6.984V7.195C13.531,7.57 13.75,7.789 14.133,7.789H14.438V13.258H14.133C13.75,13.258 13.531,13.477 13.531,13.844V14.055ZM0.906,16C0.906,16.406 1.242,16.742 1.656,16.742H17.344C17.75,16.742 18.086,16.406 18.086,16C18.086,15.586 17.75,15.25 17.344,15.25H1.656C1.242,15.25 0.906,15.586 0.906,16Z"
android:fillColor="#6A7383"/>
</vector>
9 changes: 9 additions & 0 deletions link/res/drawable/ic_link_card.xml
@@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="20dp"
android:height="16dp"
android:viewportWidth="20"
android:viewportHeight="16">
<path
android:pathData="M3.625,15.758H16.875C18.617,15.758 19.539,14.828 19.539,13.109V3.625C19.539,1.906 18.617,0.984 16.875,0.984H3.625C1.891,0.984 0.961,1.906 0.961,3.625V13.109C0.961,14.836 1.891,15.758 3.625,15.758ZM2.75,3.82C2.75,3.109 3.109,2.773 3.789,2.773H16.711C17.383,2.773 17.75,3.109 17.75,3.82V4.922H2.75V3.82ZM3.789,13.969C3.109,13.969 2.75,13.625 2.75,12.914V6.797H17.75V12.914C17.75,13.625 17.383,13.969 16.711,13.969H3.789ZM5.039,12.445H6.953C7.414,12.445 7.727,12.133 7.727,11.695V10.25C7.727,9.805 7.414,9.5 6.953,9.5H5.039C4.586,9.5 4.273,9.805 4.273,10.25V11.695C4.273,12.133 4.586,12.445 5.039,12.445Z"
android:fillColor="#6A7383"/>
</vector>
4 changes: 2 additions & 2 deletions link/res/values/strings.xml
Expand Up @@ -31,10 +31,10 @@
<string name="wallet_remove_account_confirmation">Are you sure you want to remove this account?</string>
<string name="wallet_bank_account_terms">By continuing, you agree to authorize payments pursuant to &lt;a href=\"https://stripe.com/legal/ach-payments/authorization\"&gt;these terms&lt;/a&gt;.</string>

<string name="wallet_add_payment_method">Add a payment method</string>
<string name="add_payment_method">Add a payment method</string>
<string name="add_bank_account">Add bank account</string>
<string name="wallet_pay_another_way">Pay another way</string>

<string name="pm_add_new_card">Add a new card</string>
<string name="pm_your_default">This is your default</string>
<string name="pm_set_as_default">Set as default payment</string>
</resources>
2 changes: 1 addition & 1 deletion link/src/main/java/com/stripe/android/link/LinkActivity.kt
Expand Up @@ -124,7 +124,7 @@ internal class LinkActivity : ComponentActivity() {

LinkAppBar(
state = appBarState,
onButtonClick = { viewModel.navigator.onBack() }
onButtonClick = { viewModel.navigator.onBack(userInitiated = true) }
)

NavHost(navController, LinkScreen.Loading.route) {
Expand Down
Expand Up @@ -183,8 +183,7 @@ class LinkPaymentLauncher @AssistedInject internal constructor(
suspend fun attachNewCardToAccount(
paymentMethodCreateParams: PaymentMethodCreateParams
): Result<LinkPaymentDetails.New> =
linkAccountManager.createPaymentDetails(
SupportedPaymentMethod.Card,
linkAccountManager.createCardPaymentDetails(
paymentMethodCreateParams
)

Expand Down
Expand Up @@ -10,7 +10,6 @@ import com.stripe.android.link.model.AccountStatus
import com.stripe.android.link.model.LinkAccount
import com.stripe.android.link.repositories.LinkRepository
import com.stripe.android.link.ui.inline.UserInput
import com.stripe.android.link.ui.paymentmethod.SupportedPaymentMethod
import com.stripe.android.model.ConsumerPaymentDetailsUpdateParams
import com.stripe.android.model.ConsumerSession
import com.stripe.android.model.PaymentMethodCreateParams
Expand Down Expand Up @@ -41,7 +40,6 @@ internal class LinkAccountManager @Inject constructor(
/**
* The publishable key for the signed in Link account.
*/
@VisibleForTesting
var consumerPublishableKey: String? = null

val accountStatus = linkAccount.transform { value ->
Expand Down Expand Up @@ -201,18 +199,16 @@ internal class LinkAccountManager @Inject constructor(
}

/**
* Creates a new PaymentDetails attached to the current account.
* Creates a new PaymentDetails.Card attached to the current account.
*
* @return The parameters needed to confirm the current Stripe Intent using the newly created
* Payment Details.
*/
suspend fun createPaymentDetails(
paymentMethod: SupportedPaymentMethod,
suspend fun createCardPaymentDetails(
paymentMethodCreateParams: PaymentMethodCreateParams
): Result<LinkPaymentDetails.New> =
linkAccount.value?.let { account ->
createPaymentDetails(
paymentMethod,
createCardPaymentDetails(
paymentMethodCreateParams,
account.email,
stripeIntent
Expand All @@ -222,16 +218,37 @@ internal class LinkAccountManager @Inject constructor(
)

/**
* Create a new payment method in the signed in consumer account.
* Create a session used to connect a bank account through Financial Connections.
*/
suspend fun createFinancialConnectionsSession() = retryingOnAuthError { clientSecret ->
linkRepository.createFinancialConnectionsSession(
clientSecret,
consumerPublishableKey
)
}

/**
* Create a new Bank Account payment method attached to the consumer account.
*/
suspend fun createBankAccountPaymentDetails(
financialConnectionsAccountId: String
) = retryingOnAuthError { clientSecret ->
linkRepository.createBankAccountPaymentDetails(
financialConnectionsAccountId,
clientSecret,
consumerPublishableKey
)
}

/**
* Create a new Card payment method attached to the consumer account.
*/
suspend fun createPaymentDetails(
paymentMethod: SupportedPaymentMethod,
suspend fun createCardPaymentDetails(
paymentMethodCreateParams: PaymentMethodCreateParams,
userEmail: String,
stripeIntent: StripeIntent
) = retryingOnAuthError { clientSecret ->
linkRepository.createPaymentDetails(
paymentMethod,
linkRepository.createCardPaymentDetails(
paymentMethodCreateParams,
userEmail,
stripeIntent,
Expand Down
10 changes: 6 additions & 4 deletions link/src/main/java/com/stripe/android/link/model/Navigator.kt
Expand Up @@ -12,7 +12,7 @@ import javax.inject.Singleton
*/
@Singleton
internal class Navigator @Inject constructor() {
var backNavigationEnabled = true
var userNavigationEnabled = true
var navigationController: NavHostController? = null
var onDismiss: ((LinkActivityResult) -> Unit)? = null

Expand Down Expand Up @@ -41,10 +41,12 @@ internal class Navigator @Inject constructor() {
/**
* Behaves like a back button, popping the back stack and dismissing the Activity if this was
* the last screen.
* Only performs any action if [backNavigationEnabled] is true.
* When [userInitiated] is true, only performs any action if [userNavigationEnabled] is true.
*
* @param userInitiated Whether the action was initiated by user interaction.
*/
fun onBack() {
if (backNavigationEnabled) {
fun onBack(userInitiated: Boolean) {
if (!userInitiated || userNavigationEnabled) {
navigationController?.let { navController ->
if (!navController.popBackStack()) {
dismiss()
Expand Down
Expand Up @@ -8,6 +8,7 @@ import com.stripe.android.link.LinkPaymentDetails
import com.stripe.android.link.confirmation.ConfirmStripeIntentParamsFactory
import com.stripe.android.link.ui.paymentmethod.SupportedPaymentMethod
import com.stripe.android.model.ConsumerPaymentDetails
import com.stripe.android.model.ConsumerPaymentDetailsCreateParams
import com.stripe.android.model.ConsumerPaymentDetailsUpdateParams
import com.stripe.android.model.ConsumerSession
import com.stripe.android.model.ConsumerSessionLookup
Expand Down Expand Up @@ -180,7 +181,7 @@ internal class LinkApiRepository @Inject constructor(
}
}

override suspend fun createPaymentDetails(
override suspend fun createBankAccountPaymentDetails(
financialConnectionsAccountId: String,
consumerSessionClientSecret: String,
consumerPublishableKey: String?
Expand All @@ -203,8 +204,7 @@ internal class LinkApiRepository @Inject constructor(
}
}

override suspend fun createPaymentDetails(
paymentMethod: SupportedPaymentMethod,
override suspend fun createCardPaymentDetails(
paymentMethodCreateParams: PaymentMethodCreateParams,
userEmail: String,
stripeIntent: StripeIntent,
Expand All @@ -215,7 +215,10 @@ internal class LinkApiRepository @Inject constructor(
requireNotNull(
stripeRepository.createPaymentDetails(
consumerSessionClientSecret,
paymentMethod.createParams(paymentMethodCreateParams, userEmail),
ConsumerPaymentDetailsCreateParams.Card(
paymentMethodCreateParams.toParamMap(),
userEmail
),
consumerPublishableKey?.let {
ApiRequest.Options(it)
} ?: ApiRequest.Options(
Expand All @@ -229,7 +232,9 @@ internal class LinkApiRepository @Inject constructor(
.createPaymentMethodCreateParams(
consumerSessionClientSecret,
it,
paymentMethod.extraConfirmationParams(paymentMethodCreateParams)
ConsumerPaymentDetailsCreateParams.Card.extraConfirmationParams(
paymentMethodCreateParams
)
),
paymentMethodCreateParams
)
Expand Down

0 comments on commit 167fe2a

Please sign in to comment.