Skip to content

Commit 3ee3b8d

Browse files
authored
Remove onNewIntent Override in MainActivity (#311)
* Remove onNewIntent override. * Rename auth challenge viewModel method. * Fix stuck spinner in PayPalWebView. * Remove auth state when appropriate for browser switched flows.
1 parent d5fd214 commit 3ee3b8d

File tree

9 files changed

+69
-20
lines changed

9 files changed

+69
-20
lines changed

Demo/src/main/java/com/paypal/android/MainActivity.kt

-6
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package com.paypal.android
22

3-
import android.content.Intent
43
import android.os.Bundle
54
import androidx.activity.ComponentActivity
65
import androidx.activity.compose.setContent
@@ -22,9 +21,4 @@ class MainActivity : ComponentActivity() {
2221
DemoApp()
2322
}
2423
}
25-
26-
override fun onNewIntent(newIntent: Intent) {
27-
super.onNewIntent(newIntent)
28-
intent = newIntent
29-
}
3024
}

Demo/src/main/java/com/paypal/android/ui/approveorder/ApproveOrderView.kt

+6-1
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import com.paypal.android.uishared.components.OrderView
2727
import com.paypal.android.uishared.components.StepHeader
2828
import com.paypal.android.uishared.state.CompletedActionState
2929
import com.paypal.android.utils.OnLifecycleOwnerResumeEffect
30+
import com.paypal.android.utils.OnNewIntentEffect
3031
import com.paypal.android.utils.UIConstants
3132
import com.paypal.android.utils.getActivityOrNull
3233

@@ -48,7 +49,11 @@ fun ApproveOrderView(
4849
val context = LocalContext.current
4950
OnLifecycleOwnerResumeEffect {
5051
val intent = context.getActivityOrNull()?.intent
51-
intent?.let { viewModel.completeAuthChallenge(intent) }
52+
intent?.let { viewModel.completeAuthChallenge(it) }
53+
}
54+
55+
OnNewIntentEffect { newIntent ->
56+
viewModel.completeAuthChallenge(newIntent)
5257
}
5358

5459
val contentPadding = UIConstants.paddingMedium

Demo/src/main/java/com/paypal/android/ui/approveorder/ApproveOrderViewModel.kt

+8-1
Original file line numberDiff line numberDiff line change
@@ -235,18 +235,25 @@ class ApproveOrderViewModel @Inject constructor(
235235
OrderInfo(orderId, status, didAttemptThreeDSecureAuthentication)
236236
}
237237
approveOrderState = ActionState.Success(orderInfo)
238+
// discard authState
239+
authState = null
238240
}
239241

240242
is CardFinishApproveOrderResult.Failure -> {
241243
approveOrderState = ActionState.Failure(approveOrderResult.error)
244+
// discard authState
245+
authState = null
242246
}
243247

244248
CardFinishApproveOrderResult.Canceled -> {
245249
approveOrderState = ActionState.Failure(Exception("USER CANCELED"))
250+
// discard authState
251+
authState = null
246252
}
247253

248254
CardFinishApproveOrderResult.NoResult -> {
249-
// ignore
255+
// no result; re-enable approve order button so user can retry
256+
approveOrderState = ActionState.Idle
250257
}
251258
}
252259
}

Demo/src/main/java/com/paypal/android/ui/paypalweb/PayPalWebView.kt

+7-1
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import com.paypal.android.uishared.components.OrderView
2525
import com.paypal.android.uishared.components.StepHeader
2626
import com.paypal.android.uishared.state.CompletedActionState
2727
import com.paypal.android.utils.OnLifecycleOwnerResumeEffect
28+
import com.paypal.android.utils.OnNewIntentEffect
2829
import com.paypal.android.utils.UIConstants
2930
import com.paypal.android.utils.getActivityOrNull
3031

@@ -41,7 +42,12 @@ fun PayPalWebView(
4142

4243
val context = LocalContext.current
4344
OnLifecycleOwnerResumeEffect {
44-
context.getActivityOrNull()?.let { viewModel.handleBrowserSwitchResult(it) }
45+
val intent = context.getActivityOrNull()?.intent
46+
intent?.let { viewModel.completeAuthChallenge(it) }
47+
}
48+
49+
OnNewIntentEffect { newIntent ->
50+
viewModel.completeAuthChallenge(newIntent)
4551
}
4652

4753
val contentPadding = UIConstants.paddingMedium

Demo/src/main/java/com/paypal/android/ui/paypalweb/PayPalWebViewModel.kt

+11-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.paypal.android.ui.paypalweb
22

33
import android.content.Context
4+
import android.content.Intent
45
import android.util.Log
56
import androidx.activity.ComponentActivity
67
import androidx.lifecycle.ViewModel
@@ -148,25 +149,32 @@ class PayPalWebViewModel @Inject constructor(
148149
}
149150
}
150151

151-
fun handleBrowserSwitchResult(activity: ComponentActivity) {
152-
val result = authState?.let { paypalClient?.finishStart(activity.intent, it) }
152+
fun completeAuthChallenge(intent: Intent) {
153+
val result = authState?.let { paypalClient?.finishStart(intent, it) }
153154
when (result) {
154155
is PayPalWebCheckoutFinishStartResult.Success -> {
155156
payPalWebCheckoutState = ActionState.Success(result)
157+
// discard authState
158+
authState = null
156159
}
157160

158161
is PayPalWebCheckoutFinishStartResult.Canceled -> {
159162
val error = Exception("USER CANCELED")
160163
payPalWebCheckoutState = ActionState.Failure(error)
164+
// discard authState
165+
authState = null
161166
}
162167

163168
is PayPalWebCheckoutFinishStartResult.Failure -> {
164169
Log.i(TAG, "Checkout Error: ${result.error.errorDescription}")
165170
payPalWebCheckoutState = ActionState.Failure(result.error)
171+
// discard authState
172+
authState = null
166173
}
167174

168175
null, PayPalWebCheckoutFinishStartResult.NoResult -> {
169-
// do nothing
176+
// no result; re-enable PayPal button so user can retry
177+
payPalWebCheckoutState = ActionState.Idle
170178
}
171179
}
172180
}

Demo/src/main/java/com/paypal/android/ui/paypalwebvault/PayPalWebVaultView.kt

+7-1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import com.paypal.android.uishared.components.PropertyView
2323
import com.paypal.android.uishared.components.StepHeader
2424
import com.paypal.android.uishared.state.CompletedActionState
2525
import com.paypal.android.utils.OnLifecycleOwnerResumeEffect
26+
import com.paypal.android.utils.OnNewIntentEffect
2627
import com.paypal.android.utils.UIConstants
2728
import com.paypal.android.utils.getActivityOrNull
2829

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

3940
val context = LocalContext.current
4041
OnLifecycleOwnerResumeEffect {
41-
context.getActivityOrNull()?.let { viewModel.handleBrowserSwitchResult(it) }
42+
val intent = context.getActivityOrNull()?.intent
43+
intent?.let { viewModel.completeAuthChallenge(it) }
44+
}
45+
46+
OnNewIntentEffect { newIntent ->
47+
viewModel.completeAuthChallenge(newIntent)
4248
}
4349

4450
val contentPadding = UIConstants.paddingMedium

Demo/src/main/java/com/paypal/android/ui/paypalwebvault/PayPalWebVaultViewModel.kt

+17-6
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.paypal.android.ui.paypalwebvault
22

3+
import android.content.Intent
34
import androidx.activity.ComponentActivity
45
import androidx.lifecycle.ViewModel
56
import androidx.lifecycle.viewModelScope
@@ -123,20 +124,30 @@ class PayPalWebVaultViewModel @Inject constructor(
123124
}
124125
}
125126

126-
fun handleBrowserSwitchResult(activity: ComponentActivity) {
127-
val result = authState?.let { paypalClient?.finishVault(activity.intent, it) }
127+
fun completeAuthChallenge(intent: Intent) {
128+
val result = authState?.let { paypalClient?.finishVault(intent, it) }
128129
when (result) {
129-
is PayPalWebCheckoutFinishVaultResult.Success ->
130+
is PayPalWebCheckoutFinishVaultResult.Success -> {
130131
vaultPayPalState = ActionState.Success(result)
132+
// discard authState
133+
authState = null
134+
}
131135

132-
is PayPalWebCheckoutFinishVaultResult.Failure ->
136+
is PayPalWebCheckoutFinishVaultResult.Failure -> {
133137
vaultPayPalState = ActionState.Failure(result.error)
138+
// discard authState
139+
authState = null
140+
}
134141

135-
PayPalWebCheckoutFinishVaultResult.Canceled ->
142+
PayPalWebCheckoutFinishVaultResult.Canceled -> {
136143
vaultPayPalState = ActionState.Failure(Exception("USER CANCELED"))
144+
// discard authState
145+
authState = null
146+
}
137147

138148
null, PayPalWebCheckoutFinishVaultResult.NoResult -> {
139-
// do nothing
149+
// no result; re-enable PayPal button so user can retry
150+
vaultPayPalState = ActionState.Idle
140151
}
141152
}
142153
}

Demo/src/main/java/com/paypal/android/ui/vaultcard/VaultCardView.kt

+5
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import com.paypal.android.uishared.components.ErrorView
3030
import com.paypal.android.uishared.components.StepHeader
3131
import com.paypal.android.uishared.state.CompletedActionState
3232
import com.paypal.android.utils.OnLifecycleOwnerResumeEffect
33+
import com.paypal.android.utils.OnNewIntentEffect
3334
import com.paypal.android.utils.UIConstants
3435
import com.paypal.android.utils.getActivityOrNull
3536

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

57+
OnNewIntentEffect { newIntent ->
58+
viewModel.completeAuthChallenge(newIntent)
59+
}
60+
5661
val contentPadding = UIConstants.paddingMedium
5762
Column(
5863
verticalArrangement = UIConstants.spacingLarge,

Demo/src/main/java/com/paypal/android/ui/vaultcard/VaultCardViewModel.kt

+8-1
Original file line numberDiff line numberDiff line change
@@ -207,18 +207,25 @@ class VaultCardViewModel @Inject constructor(
207207
)
208208
}
209209
updateSetupTokenState = ActionState.Success(setupTokenInfo)
210+
// discard authState
211+
authState = null
210212
}
211213

212214
CardFinishVaultResult.Canceled -> {
213215
updateSetupTokenState = ActionState.Failure(Exception("USER CANCELED"))
216+
// discard authState
217+
authState = null
214218
}
215219

216220
is CardFinishVaultResult.Failure -> {
217221
updateSetupTokenState = ActionState.Failure(vaultResult.error)
222+
// discard authState
223+
authState = null
218224
}
219225

220226
CardFinishVaultResult.NoResult -> {
221-
// ignore
227+
// no result; re-enable vault button so user can retry
228+
updateSetupTokenState = ActionState.Idle
222229
}
223230
}
224231
}

0 commit comments

Comments
 (0)