Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactoring to support Bank Accounts in Link #5466

Merged
merged 5 commits into from
Aug 26, 2022
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
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>
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 = false) {
brnunes-stripe marked this conversation as resolved.
Show resolved Hide resolved
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