File tree 9 files changed +69
-20
lines changed
Demo/src/main/java/com/paypal/android
9 files changed +69
-20
lines changed Original file line number Diff line number Diff line change 1
1
package com.paypal.android
2
2
3
- import android.content.Intent
4
3
import android.os.Bundle
5
4
import androidx.activity.ComponentActivity
6
5
import androidx.activity.compose.setContent
@@ -22,9 +21,4 @@ class MainActivity : ComponentActivity() {
22
21
DemoApp ()
23
22
}
24
23
}
25
-
26
- override fun onNewIntent (newIntent : Intent ) {
27
- super .onNewIntent(newIntent)
28
- intent = newIntent
29
- }
30
24
}
Original file line number Diff line number Diff line change @@ -27,6 +27,7 @@ import com.paypal.android.uishared.components.OrderView
27
27
import com.paypal.android.uishared.components.StepHeader
28
28
import com.paypal.android.uishared.state.CompletedActionState
29
29
import com.paypal.android.utils.OnLifecycleOwnerResumeEffect
30
+ import com.paypal.android.utils.OnNewIntentEffect
30
31
import com.paypal.android.utils.UIConstants
31
32
import com.paypal.android.utils.getActivityOrNull
32
33
@@ -48,7 +49,11 @@ fun ApproveOrderView(
48
49
val context = LocalContext .current
49
50
OnLifecycleOwnerResumeEffect {
50
51
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)
52
57
}
53
58
54
59
val contentPadding = UIConstants .paddingMedium
Original file line number Diff line number Diff line change @@ -235,18 +235,25 @@ class ApproveOrderViewModel @Inject constructor(
235
235
OrderInfo (orderId, status, didAttemptThreeDSecureAuthentication)
236
236
}
237
237
approveOrderState = ActionState .Success (orderInfo)
238
+ // discard authState
239
+ authState = null
238
240
}
239
241
240
242
is CardFinishApproveOrderResult .Failure -> {
241
243
approveOrderState = ActionState .Failure (approveOrderResult.error)
244
+ // discard authState
245
+ authState = null
242
246
}
243
247
244
248
CardFinishApproveOrderResult .Canceled -> {
245
249
approveOrderState = ActionState .Failure (Exception (" USER CANCELED" ))
250
+ // discard authState
251
+ authState = null
246
252
}
247
253
248
254
CardFinishApproveOrderResult .NoResult -> {
249
- // ignore
255
+ // no result; re-enable approve order button so user can retry
256
+ approveOrderState = ActionState .Idle
250
257
}
251
258
}
252
259
}
Original file line number Diff line number Diff line change @@ -25,6 +25,7 @@ import com.paypal.android.uishared.components.OrderView
25
25
import com.paypal.android.uishared.components.StepHeader
26
26
import com.paypal.android.uishared.state.CompletedActionState
27
27
import com.paypal.android.utils.OnLifecycleOwnerResumeEffect
28
+ import com.paypal.android.utils.OnNewIntentEffect
28
29
import com.paypal.android.utils.UIConstants
29
30
import com.paypal.android.utils.getActivityOrNull
30
31
@@ -41,7 +42,12 @@ fun PayPalWebView(
41
42
42
43
val context = LocalContext .current
43
44
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)
45
51
}
46
52
47
53
val contentPadding = UIConstants .paddingMedium
Original file line number Diff line number Diff line change 1
1
package com.paypal.android.ui.paypalweb
2
2
3
3
import android.content.Context
4
+ import android.content.Intent
4
5
import android.util.Log
5
6
import androidx.activity.ComponentActivity
6
7
import androidx.lifecycle.ViewModel
@@ -148,25 +149,32 @@ class PayPalWebViewModel @Inject constructor(
148
149
}
149
150
}
150
151
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) }
153
154
when (result) {
154
155
is PayPalWebCheckoutFinishStartResult .Success -> {
155
156
payPalWebCheckoutState = ActionState .Success (result)
157
+ // discard authState
158
+ authState = null
156
159
}
157
160
158
161
is PayPalWebCheckoutFinishStartResult .Canceled -> {
159
162
val error = Exception (" USER CANCELED" )
160
163
payPalWebCheckoutState = ActionState .Failure (error)
164
+ // discard authState
165
+ authState = null
161
166
}
162
167
163
168
is PayPalWebCheckoutFinishStartResult .Failure -> {
164
169
Log .i(TAG , " Checkout Error: ${result.error.errorDescription} " )
165
170
payPalWebCheckoutState = ActionState .Failure (result.error)
171
+ // discard authState
172
+ authState = null
166
173
}
167
174
168
175
null , PayPalWebCheckoutFinishStartResult .NoResult -> {
169
- // do nothing
176
+ // no result; re-enable PayPal button so user can retry
177
+ payPalWebCheckoutState = ActionState .Idle
170
178
}
171
179
}
172
180
}
Original file line number Diff line number Diff line change @@ -23,6 +23,7 @@ import com.paypal.android.uishared.components.PropertyView
23
23
import com.paypal.android.uishared.components.StepHeader
24
24
import com.paypal.android.uishared.state.CompletedActionState
25
25
import com.paypal.android.utils.OnLifecycleOwnerResumeEffect
26
+ import com.paypal.android.utils.OnNewIntentEffect
26
27
import com.paypal.android.utils.UIConstants
27
28
import com.paypal.android.utils.getActivityOrNull
28
29
@@ -38,7 +39,12 @@ fun PayPalWebVaultView(viewModel: PayPalWebVaultViewModel = hiltViewModel()) {
38
39
39
40
val context = LocalContext .current
40
41
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)
42
48
}
43
49
44
50
val contentPadding = UIConstants .paddingMedium
Original file line number Diff line number Diff line change 1
1
package com.paypal.android.ui.paypalwebvault
2
2
3
+ import android.content.Intent
3
4
import androidx.activity.ComponentActivity
4
5
import androidx.lifecycle.ViewModel
5
6
import androidx.lifecycle.viewModelScope
@@ -123,20 +124,30 @@ class PayPalWebVaultViewModel @Inject constructor(
123
124
}
124
125
}
125
126
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) }
128
129
when (result) {
129
- is PayPalWebCheckoutFinishVaultResult .Success ->
130
+ is PayPalWebCheckoutFinishVaultResult .Success -> {
130
131
vaultPayPalState = ActionState .Success (result)
132
+ // discard authState
133
+ authState = null
134
+ }
131
135
132
- is PayPalWebCheckoutFinishVaultResult .Failure ->
136
+ is PayPalWebCheckoutFinishVaultResult .Failure -> {
133
137
vaultPayPalState = ActionState .Failure (result.error)
138
+ // discard authState
139
+ authState = null
140
+ }
134
141
135
- PayPalWebCheckoutFinishVaultResult .Canceled ->
142
+ PayPalWebCheckoutFinishVaultResult .Canceled -> {
136
143
vaultPayPalState = ActionState .Failure (Exception (" USER CANCELED" ))
144
+ // discard authState
145
+ authState = null
146
+ }
137
147
138
148
null , PayPalWebCheckoutFinishVaultResult .NoResult -> {
139
- // do nothing
149
+ // no result; re-enable PayPal button so user can retry
150
+ vaultPayPalState = ActionState .Idle
140
151
}
141
152
}
142
153
}
Original file line number Diff line number Diff line change @@ -30,6 +30,7 @@ import com.paypal.android.uishared.components.ErrorView
30
30
import com.paypal.android.uishared.components.StepHeader
31
31
import com.paypal.android.uishared.state.CompletedActionState
32
32
import com.paypal.android.utils.OnLifecycleOwnerResumeEffect
33
+ import com.paypal.android.utils.OnNewIntentEffect
33
34
import com.paypal.android.utils.UIConstants
34
35
import com.paypal.android.utils.getActivityOrNull
35
36
@@ -53,6 +54,10 @@ fun VaultCardView(
53
54
intent?.let { viewModel.completeAuthChallenge(it) }
54
55
}
55
56
57
+ OnNewIntentEffect { newIntent ->
58
+ viewModel.completeAuthChallenge(newIntent)
59
+ }
60
+
56
61
val contentPadding = UIConstants .paddingMedium
57
62
Column (
58
63
verticalArrangement = UIConstants .spacingLarge,
Original file line number Diff line number Diff line change @@ -207,18 +207,25 @@ class VaultCardViewModel @Inject constructor(
207
207
)
208
208
}
209
209
updateSetupTokenState = ActionState .Success (setupTokenInfo)
210
+ // discard authState
211
+ authState = null
210
212
}
211
213
212
214
CardFinishVaultResult .Canceled -> {
213
215
updateSetupTokenState = ActionState .Failure (Exception (" USER CANCELED" ))
216
+ // discard authState
217
+ authState = null
214
218
}
215
219
216
220
is CardFinishVaultResult .Failure -> {
217
221
updateSetupTokenState = ActionState .Failure (vaultResult.error)
222
+ // discard authState
223
+ authState = null
218
224
}
219
225
220
226
CardFinishVaultResult .NoResult -> {
221
- // ignore
227
+ // no result; re-enable vault button so user can retry
228
+ updateSetupTokenState = ActionState .Idle
222
229
}
223
230
}
224
231
}
You can’t perform that action at this time.
0 commit comments