Skip to content

Commit

Permalink
Remove onNewIntent Override in MainActivity (#311)
Browse files Browse the repository at this point in the history
* Remove onNewIntent override.

* Rename auth challenge viewModel method.

* Fix stuck spinner in PayPalWebView.

* Remove auth state when appropriate for browser switched flows.
  • Loading branch information
sshropshire authored Feb 10, 2025
1 parent d5fd214 commit 3ee3b8d
Show file tree
Hide file tree
Showing 9 changed files with 69 additions and 20 deletions.
6 changes: 0 additions & 6 deletions Demo/src/main/java/com/paypal/android/MainActivity.kt
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.paypal.android

import android.content.Intent
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
Expand All @@ -22,9 +21,4 @@ class MainActivity : ComponentActivity() {
DemoApp()
}
}

override fun onNewIntent(newIntent: Intent) {
super.onNewIntent(newIntent)
intent = newIntent
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ import com.paypal.android.uishared.components.OrderView
import com.paypal.android.uishared.components.StepHeader
import com.paypal.android.uishared.state.CompletedActionState
import com.paypal.android.utils.OnLifecycleOwnerResumeEffect
import com.paypal.android.utils.OnNewIntentEffect
import com.paypal.android.utils.UIConstants
import com.paypal.android.utils.getActivityOrNull

Expand All @@ -48,7 +49,11 @@ fun ApproveOrderView(
val context = LocalContext.current
OnLifecycleOwnerResumeEffect {
val intent = context.getActivityOrNull()?.intent
intent?.let { viewModel.completeAuthChallenge(intent) }
intent?.let { viewModel.completeAuthChallenge(it) }
}

OnNewIntentEffect { newIntent ->
viewModel.completeAuthChallenge(newIntent)
}

val contentPadding = UIConstants.paddingMedium
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -235,18 +235,25 @@ class ApproveOrderViewModel @Inject constructor(
OrderInfo(orderId, status, didAttemptThreeDSecureAuthentication)
}
approveOrderState = ActionState.Success(orderInfo)
// discard authState
authState = null
}

is CardFinishApproveOrderResult.Failure -> {
approveOrderState = ActionState.Failure(approveOrderResult.error)
// discard authState
authState = null
}

CardFinishApproveOrderResult.Canceled -> {
approveOrderState = ActionState.Failure(Exception("USER CANCELED"))
// discard authState
authState = null
}

CardFinishApproveOrderResult.NoResult -> {
// ignore
// no result; re-enable approve order button so user can retry
approveOrderState = ActionState.Idle
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ import com.paypal.android.uishared.components.OrderView
import com.paypal.android.uishared.components.StepHeader
import com.paypal.android.uishared.state.CompletedActionState
import com.paypal.android.utils.OnLifecycleOwnerResumeEffect
import com.paypal.android.utils.OnNewIntentEffect
import com.paypal.android.utils.UIConstants
import com.paypal.android.utils.getActivityOrNull

Expand All @@ -41,7 +42,12 @@ fun PayPalWebView(

val context = LocalContext.current
OnLifecycleOwnerResumeEffect {
context.getActivityOrNull()?.let { viewModel.handleBrowserSwitchResult(it) }
val intent = context.getActivityOrNull()?.intent
intent?.let { viewModel.completeAuthChallenge(it) }
}

OnNewIntentEffect { newIntent ->
viewModel.completeAuthChallenge(newIntent)
}

val contentPadding = UIConstants.paddingMedium
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.paypal.android.ui.paypalweb

import android.content.Context
import android.content.Intent
import android.util.Log
import androidx.activity.ComponentActivity
import androidx.lifecycle.ViewModel
Expand Down Expand Up @@ -148,25 +149,32 @@ class PayPalWebViewModel @Inject constructor(
}
}

fun handleBrowserSwitchResult(activity: ComponentActivity) {
val result = authState?.let { paypalClient?.finishStart(activity.intent, it) }
fun completeAuthChallenge(intent: Intent) {
val result = authState?.let { paypalClient?.finishStart(intent, it) }
when (result) {
is PayPalWebCheckoutFinishStartResult.Success -> {
payPalWebCheckoutState = ActionState.Success(result)
// discard authState
authState = null
}

is PayPalWebCheckoutFinishStartResult.Canceled -> {
val error = Exception("USER CANCELED")
payPalWebCheckoutState = ActionState.Failure(error)
// discard authState
authState = null
}

is PayPalWebCheckoutFinishStartResult.Failure -> {
Log.i(TAG, "Checkout Error: ${result.error.errorDescription}")
payPalWebCheckoutState = ActionState.Failure(result.error)
// discard authState
authState = null
}

null, PayPalWebCheckoutFinishStartResult.NoResult -> {
// do nothing
// no result; re-enable PayPal button so user can retry
payPalWebCheckoutState = ActionState.Idle
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import com.paypal.android.uishared.components.PropertyView
import com.paypal.android.uishared.components.StepHeader
import com.paypal.android.uishared.state.CompletedActionState
import com.paypal.android.utils.OnLifecycleOwnerResumeEffect
import com.paypal.android.utils.OnNewIntentEffect
import com.paypal.android.utils.UIConstants
import com.paypal.android.utils.getActivityOrNull

Expand All @@ -38,7 +39,12 @@ fun PayPalWebVaultView(viewModel: PayPalWebVaultViewModel = hiltViewModel()) {

val context = LocalContext.current
OnLifecycleOwnerResumeEffect {
context.getActivityOrNull()?.let { viewModel.handleBrowserSwitchResult(it) }
val intent = context.getActivityOrNull()?.intent
intent?.let { viewModel.completeAuthChallenge(it) }
}

OnNewIntentEffect { newIntent ->
viewModel.completeAuthChallenge(newIntent)
}

val contentPadding = UIConstants.paddingMedium
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.paypal.android.ui.paypalwebvault

import android.content.Intent
import androidx.activity.ComponentActivity
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
Expand Down Expand Up @@ -123,20 +124,30 @@ class PayPalWebVaultViewModel @Inject constructor(
}
}

fun handleBrowserSwitchResult(activity: ComponentActivity) {
val result = authState?.let { paypalClient?.finishVault(activity.intent, it) }
fun completeAuthChallenge(intent: Intent) {
val result = authState?.let { paypalClient?.finishVault(intent, it) }
when (result) {
is PayPalWebCheckoutFinishVaultResult.Success ->
is PayPalWebCheckoutFinishVaultResult.Success -> {
vaultPayPalState = ActionState.Success(result)
// discard authState
authState = null
}

is PayPalWebCheckoutFinishVaultResult.Failure ->
is PayPalWebCheckoutFinishVaultResult.Failure -> {
vaultPayPalState = ActionState.Failure(result.error)
// discard authState
authState = null
}

PayPalWebCheckoutFinishVaultResult.Canceled ->
PayPalWebCheckoutFinishVaultResult.Canceled -> {
vaultPayPalState = ActionState.Failure(Exception("USER CANCELED"))
// discard authState
authState = null
}

null, PayPalWebCheckoutFinishVaultResult.NoResult -> {
// do nothing
// no result; re-enable PayPal button so user can retry
vaultPayPalState = ActionState.Idle
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ import com.paypal.android.uishared.components.ErrorView
import com.paypal.android.uishared.components.StepHeader
import com.paypal.android.uishared.state.CompletedActionState
import com.paypal.android.utils.OnLifecycleOwnerResumeEffect
import com.paypal.android.utils.OnNewIntentEffect
import com.paypal.android.utils.UIConstants
import com.paypal.android.utils.getActivityOrNull

Expand All @@ -53,6 +54,10 @@ fun VaultCardView(
intent?.let { viewModel.completeAuthChallenge(it) }
}

OnNewIntentEffect { newIntent ->
viewModel.completeAuthChallenge(newIntent)
}

val contentPadding = UIConstants.paddingMedium
Column(
verticalArrangement = UIConstants.spacingLarge,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -207,18 +207,25 @@ class VaultCardViewModel @Inject constructor(
)
}
updateSetupTokenState = ActionState.Success(setupTokenInfo)
// discard authState
authState = null
}

CardFinishVaultResult.Canceled -> {
updateSetupTokenState = ActionState.Failure(Exception("USER CANCELED"))
// discard authState
authState = null
}

is CardFinishVaultResult.Failure -> {
updateSetupTokenState = ActionState.Failure(vaultResult.error)
// discard authState
authState = null
}

CardFinishVaultResult.NoResult -> {
// ignore
// no result; re-enable vault button so user can retry
updateSetupTokenState = ActionState.Idle
}
}
}
Expand Down

0 comments on commit 3ee3b8d

Please sign in to comment.