Skip to content

Commit

Permalink
Link inline signup logic (#4870)
Browse files Browse the repository at this point in the history
  • Loading branch information
brnunes-stripe authored Apr 29, 2022
1 parent 3fb5d59 commit 66bea42
Show file tree
Hide file tree
Showing 46 changed files with 1,306 additions and 318 deletions.
65 changes: 47 additions & 18 deletions link/api/link.api
Original file line number Diff line number Diff line change
Expand Up @@ -87,11 +87,11 @@ public final class com/stripe/android/link/LinkActivityResult$Success : com/stri
}

public final class com/stripe/android/link/LinkActivityViewModel_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/LinkActivityViewModel_Factory;
public fun <init> (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;)Lcom/stripe/android/link/LinkActivityViewModel_Factory;
public fun get ()Lcom/stripe/android/link/LinkActivityViewModel;
public synthetic fun get ()Ljava/lang/Object;
public static fun newInstance (Lcom/stripe/android/link/LinkActivityContract$Args;Lcom/stripe/android/link/account/LinkAccountManager;Lcom/stripe/android/link/account/CookieStore;Lcom/stripe/android/link/model/Navigator;Lcom/stripe/android/link/confirmation/ConfirmationManager;)Lcom/stripe/android/link/LinkActivityViewModel;
public static fun newInstance (Lcom/stripe/android/link/LinkActivityContract$Args;Lcom/stripe/android/link/account/LinkAccountManager;Lcom/stripe/android/link/model/Navigator;Lcom/stripe/android/link/confirmation/ConfirmationManager;)Lcom/stripe/android/link/LinkActivityViewModel;
}

public final class com/stripe/android/link/LinkActivityViewModel_Factory_MembersInjector : dagger/MembersInjector {
Expand All @@ -105,8 +105,8 @@ public final class com/stripe/android/link/LinkActivityViewModel_Factory_Members
public final class com/stripe/android/link/LinkPaymentLauncher_Factory {
public fun <init> (Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;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;Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;)Lcom/stripe/android/link/LinkPaymentLauncher_Factory;
public fun get (Landroidx/activity/result/ActivityResultLauncher;)Lcom/stripe/android/link/LinkPaymentLauncher;
public static fun newInstance (Landroidx/activity/result/ActivityResultLauncher;Landroid/content/Context;Ljava/util/Set;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;ZLkotlin/coroutines/CoroutineContext;Lkotlin/coroutines/CoroutineContext;Lcom/stripe/android/networking/PaymentAnalyticsRequestFactory;Lcom/stripe/android/core/networking/AnalyticsRequestExecutor;Lcom/stripe/android/networking/StripeRepository;)Lcom/stripe/android/link/LinkPaymentLauncher;
public fun get (Ljava/lang/String;Ljava/lang/String;)Lcom/stripe/android/link/LinkPaymentLauncher;
public static fun newInstance (Ljava/lang/String;Ljava/lang/String;Landroid/content/Context;Ljava/util/Set;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;ZLkotlin/coroutines/CoroutineContext;Lkotlin/coroutines/CoroutineContext;Lcom/stripe/android/networking/PaymentAnalyticsRequestFactory;Lcom/stripe/android/core/networking/AnalyticsRequestExecutor;Lcom/stripe/android/networking/StripeRepository;)Lcom/stripe/android/link/LinkPaymentLauncher;
}

public final class com/stripe/android/link/account/CookieStore_Factory : dagger/internal/Factory {
Expand All @@ -126,11 +126,11 @@ public final class com/stripe/android/link/account/EncryptedStore_Factory : dagg
}

public final class com/stripe/android/link/account/LinkAccountManager_Factory : dagger/internal/Factory {
public fun <init> (Ljavax/inject/Provider;Ljavax/inject/Provider;)V
public static fun create (Ljavax/inject/Provider;Ljavax/inject/Provider;)Lcom/stripe/android/link/account/LinkAccountManager_Factory;
public fun <init> (Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;)V
public static fun create (Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;)Lcom/stripe/android/link/account/LinkAccountManager_Factory;
public fun get ()Lcom/stripe/android/link/account/LinkAccountManager;
public synthetic fun get ()Ljava/lang/Object;
public static fun newInstance (Lcom/stripe/android/link/repositories/LinkRepository;Lcom/stripe/android/link/account/CookieStore;)Lcom/stripe/android/link/account/LinkAccountManager;
public static fun newInstance (Lcom/stripe/android/link/LinkActivityContract$Args;Lcom/stripe/android/link/repositories/LinkRepository;Lcom/stripe/android/link/account/CookieStore;)Lcom/stripe/android/link/account/LinkAccountManager;
}

public final class com/stripe/android/link/confirmation/ConfirmationManager_Factory : dagger/internal/Factory {
Expand All @@ -143,7 +143,9 @@ public final class com/stripe/android/link/confirmation/ConfirmationManager_Fact

public final class com/stripe/android/link/injection/DaggerLinkPaymentLauncherComponent {
public static fun builder ()Lcom/stripe/android/link/injection/LinkPaymentLauncherComponent$Builder;
public fun getLinkAccountManager ()Lcom/stripe/android/link/account/LinkAccountManager;
public fun inject (Lcom/stripe/android/link/LinkActivityViewModel$Factory;)V
public fun inject (Lcom/stripe/android/link/ui/inline/InlineSignupViewModel$Factory;)V
public fun inject (Lcom/stripe/android/link/ui/signup/SignUpViewModel$Factory;)V
public fun inject (Lcom/stripe/android/link/ui/verification/VerificationViewModel$Factory;)V
public fun inject (Lcom/stripe/android/link/ui/wallet/WalletViewModel$Factory;)V
Expand All @@ -158,8 +160,8 @@ public final class com/stripe/android/link/injection/DaggerLinkViewModelFactoryC
}

public final class com/stripe/android/link/injection/LinkPaymentLauncherFactory_Impl : com/stripe/android/link/injection/LinkPaymentLauncherFactory {
public fun create (Landroidx/activity/result/ActivityResultLauncher;)Lcom/stripe/android/link/LinkPaymentLauncher;
public static fun create (Lcom/stripe/android/link/LinkPaymentLauncher_Factory;)Ljavax/inject/Provider;
public fun create (Ljava/lang/String;Ljava/lang/String;)Lcom/stripe/android/link/LinkPaymentLauncher;
}

public final class com/stripe/android/link/injection/LinkPaymentLauncherModule_Companion_ProvideLocaleFactory : dagger/internal/Factory {
Expand All @@ -170,6 +172,18 @@ public final class com/stripe/android/link/injection/LinkPaymentLauncherModule_C
public static fun provideLocale ()Ljava/util/Locale;
}

public final class com/stripe/android/link/injection/NamedConstantsKt {
}

public final class com/stripe/android/link/model/AccountStatus : java/lang/Enum {
public static final field NeedsVerification Lcom/stripe/android/link/model/AccountStatus;
public static final field SignedOut Lcom/stripe/android/link/model/AccountStatus;
public static final field VerificationStarted Lcom/stripe/android/link/model/AccountStatus;
public static final field Verified Lcom/stripe/android/link/model/AccountStatus;
public static fun valueOf (Ljava/lang/String;)Lcom/stripe/android/link/model/AccountStatus;
public static fun values ()[Lcom/stripe/android/link/model/AccountStatus;
}

public final class com/stripe/android/link/model/Navigator_Factory : dagger/internal/Factory {
public fun <init> ()V
public static fun create ()Lcom/stripe/android/link/model/Navigator_Factory;
Expand All @@ -193,11 +207,24 @@ public final class com/stripe/android/link/ui/ComposableSingletons$LinkAppBarKt
public final fun getLambda-1$link_release ()Lkotlin/jvm/functions/Function2;
}

public final class com/stripe/android/link/ui/ComposableSingletons$LinkButtonKt {
public static final field INSTANCE Lcom/stripe/android/link/ui/ComposableSingletons$LinkButtonKt;
public static field lambda-1 Lkotlin/jvm/functions/Function3;
public fun <init> ()V
public final fun getLambda-1$link_release ()Lkotlin/jvm/functions/Function3;
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/inline/InlineSignupViewModel_Factory : dagger/internal/Factory {
public fun <init> (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;)Lcom/stripe/android/link/ui/inline/InlineSignupViewModel_Factory;
public fun get ()Lcom/stripe/android/link/ui/inline/InlineSignupViewModel;
public synthetic fun get ()Ljava/lang/Object;
public static fun newInstance (Ljava/lang/String;Ljava/lang/String;Lcom/stripe/android/link/account/LinkAccountManager;Lcom/stripe/android/core/Logger;)Lcom/stripe/android/link/ui/inline/InlineSignupViewModel;
}

public final class com/stripe/android/link/ui/inline/InlineSignupViewModel_Factory_MembersInjector : dagger/MembersInjector {
public fun <init> (Ljavax/inject/Provider;)V
public static fun create (Ljavax/inject/Provider;)Ldagger/MembersInjector;
public fun injectMembers (Lcom/stripe/android/link/ui/inline/InlineSignupViewModel$Factory;)V
public synthetic fun injectMembers (Ljava/lang/Object;)V
public static fun injectViewModel (Lcom/stripe/android/link/ui/inline/InlineSignupViewModel$Factory;Lcom/stripe/android/link/ui/inline/InlineSignupViewModel;)V
}

public final class com/stripe/android/link/ui/signup/ComposableSingletons$SignUpScreenKt {
Expand Down Expand Up @@ -228,12 +255,14 @@ public final class com/stripe/android/link/ui/signup/SignUpViewModel_Factory_Mem
public final class com/stripe/android/link/ui/verification/ComposableSingletons$VerificationScreenKt {
public static final field INSTANCE Lcom/stripe/android/link/ui/verification/ComposableSingletons$VerificationScreenKt;
public static field lambda-1 Lkotlin/jvm/functions/Function2;
public static field lambda-2 Lkotlin/jvm/functions/Function3;
public static field lambda-3 Lkotlin/jvm/functions/Function2;
public static field lambda-2 Lkotlin/jvm/functions/Function2;
public fun <init> ()V
public final fun getLambda-1$link_release ()Lkotlin/jvm/functions/Function2;
public final fun getLambda-2$link_release ()Lkotlin/jvm/functions/Function3;
public final fun getLambda-3$link_release ()Lkotlin/jvm/functions/Function2;
public final fun getLambda-2$link_release ()Lkotlin/jvm/functions/Function2;
}

public final class com/stripe/android/link/ui/verification/VerificationDialogKt {
public static final fun LinkVerificationDialog (Lcom/stripe/android/link/LinkPaymentLauncher;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Landroidx/compose/runtime/Composer;I)V
}

public final class com/stripe/android/link/ui/verification/VerificationViewModel_Factory : dagger/internal/Factory {
Expand Down
7 changes: 6 additions & 1 deletion link/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,18 @@

<string name="accessibility_close">Close</string>

<string name="inline_sign_up_header">Save my info for secure 1-click checkout</string>

<string name="sign_up_header">Save your info for secure 1-click checkout</string>
<string name="sign_up_message">Pay faster at %1$s and thousands of merchants.</string>
<string name="sign_up_terms">You agree to Link terms of service and to create a Link with Stripe account.</string>
<string name="sign_up_terms">By joining Link, you agree to the Terms and Privacy Policy.</string>
<string name="sign_up">Join Link</string>

<string name="verification_header">Enter your verification code</string>
<string name="verification_message">Enter the code sent to %1$s to use Link to pay by default.</string>
<string name="verification_header_inline">Sign in to your Link account</string>
<string name="verification_message_inline">You’ve already saved your payment info with Link. Enter the code sent to %1$s.</string>
<string name="verification_header_prefilled">Use your saved info to check out faster</string>
<string name="verification_not_email">Not %1$s?</string>
<string name="verification_change_email">Change email</string>
<string name="verification_resend">Resend code</string>
Expand Down
43 changes: 36 additions & 7 deletions link/src/main/java/com/stripe/android/link/LinkActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package com.stripe.android.link

import android.content.Intent
import android.os.Bundle
import android.view.ViewTreeObserver
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.viewModels
Expand All @@ -19,23 +20,32 @@ import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.lifecycleScope
import androidx.navigation.NavHostController
import androidx.navigation.NavType
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController
import androidx.navigation.navArgument
import com.stripe.android.link.model.AccountStatus
import com.stripe.android.link.theme.DefaultLinkTheme
import com.stripe.android.link.ui.LinkAppBar
import com.stripe.android.link.ui.signup.SignUpBody
import com.stripe.android.link.ui.verification.VerificationBody
import com.stripe.android.link.ui.verification.VerificationBodyFullFlow
import com.stripe.android.link.ui.wallet.WalletBody
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.launch

internal class LinkActivity : ComponentActivity() {
@VisibleForTesting
internal var viewModelFactory: ViewModelProvider.Factory =
LinkActivityViewModel.Factory(
applicationSupplier = { application },
starterArgsSupplier = { requireNotNull(starterArgs) }
)

private val viewModel: LinkActivityViewModel by viewModels {
LinkActivityViewModel.Factory(application) { requireNotNull(starterArgs) }
}
private val viewModel: LinkActivityViewModel by viewModels { viewModelFactory }

@VisibleForTesting
lateinit var navController: NavHostController
Expand Down Expand Up @@ -66,7 +76,7 @@ internal class LinkActivity : ComponentActivity() {
onCloseButtonClick = { dismiss() }
)

NavHost(navController, viewModel.startDestination) {
NavHost(navController, LinkScreen.Loading.route) {
composable(LinkScreen.Loading.route) {
Box(
modifier = Modifier
Expand All @@ -92,7 +102,7 @@ internal class LinkActivity : ComponentActivity() {
}
composable(LinkScreen.Verification.route) {
linkAccount?.let { account ->
VerificationBody(
VerificationBodyFullFlow(
account,
viewModel.injector
)
Expand All @@ -113,7 +123,7 @@ internal class LinkActivity : ComponentActivity() {
.fillMaxHeight(),
contentAlignment = Alignment.Center
) {
Text(text = "<Placholder>\nAdd new payment method")
Text(text = "<Placeholder>\nAdd new payment method")
}
}
}
Expand All @@ -124,6 +134,25 @@ internal class LinkActivity : ComponentActivity() {

viewModel.navigator.onDismiss = ::dismiss
viewModel.setupPaymentLauncher(this)

// Navigate to the initial screen once the view has been laid out.
window.decorView.rootView.viewTreeObserver.addOnGlobalLayoutListener(
object : ViewTreeObserver.OnGlobalLayoutListener {
override fun onGlobalLayout() {
lifecycleScope.launch {
viewModel.navigator.navigateTo(
target = when (viewModel.linkAccountManager.accountStatus.first()) {
AccountStatus.Verified -> LinkScreen.Wallet
AccountStatus.NeedsVerification,
AccountStatus.VerificationStarted -> LinkScreen.Verification
AccountStatus.SignedOut -> LinkScreen.SignUp()
},
clearBackStack = true
)
}
window.decorView.rootView.viewTreeObserver.removeOnGlobalLayoutListener(this)
}
})
}

override fun onDestroy() {
Expand Down
Loading

0 comments on commit 66bea42

Please sign in to comment.