Skip to content

Commit eb96fcc

Browse files
Refactor result handling to centralize customer state, selection updates. (#13788)
1 parent 8a65b24 commit eb96fcc

3 files changed

Lines changed: 55 additions & 30 deletions

File tree

paymentsheet/src/main/java/com/stripe/android/checkout/CheckoutSheetLauncher.kt

Lines changed: 15 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -65,45 +65,41 @@ internal class CheckoutSheetLauncher @Inject constructor(
6565

6666
private fun handleFormResult(result: EmbeddedActivityResult) {
6767
when (result) {
68-
is EmbeddedActivityResult.Complete -> {
69-
result.customerState?.let { customerStateHolder.setCustomerState(it) }
70-
selectionHolder.setPreviousNewSelections(result.previousNewSelections)
71-
selectionHolder.setSelection(result.selection)
72-
}
73-
is EmbeddedActivityResult.Cancelled -> {
74-
result.customerState?.let { customerStateHolder.setCustomerState(it) }
75-
}
68+
is EmbeddedActivityResult.Complete -> applyCompleteResult(result)
69+
is EmbeddedActivityResult.Cancelled -> applyCustomerState(result.customerState)
7670
is EmbeddedActivityResult.Error -> Unit
7771
}
7872
}
7973

8074
private fun handleManageResult(result: EmbeddedActivityResult) {
8175
when (result) {
82-
is EmbeddedActivityResult.Complete -> {
83-
result.customerState?.let { customerStateHolder.setCustomerState(it) }
84-
selectionHolder.setPreviousNewSelections(result.previousNewSelections)
85-
selectionHolder.setSelection(result.selection)
86-
}
76+
is EmbeddedActivityResult.Complete -> applyCompleteResult(result)
8777
is EmbeddedActivityResult.Cancelled -> Unit
8878
is EmbeddedActivityResult.Error -> Unit
8979
}
9080
}
9181

9282
private fun handlePaymentOptionsResult(result: EmbeddedActivityResult) {
9383
when (result) {
94-
is EmbeddedActivityResult.Complete -> {
95-
result.customerState?.let { customerStateHolder.setCustomerState(it) }
96-
selectionHolder.setPreviousNewSelections(result.previousNewSelections)
97-
selectionHolder.setSelection(result.selection)
98-
}
84+
is EmbeddedActivityResult.Complete -> applyCompleteResult(result)
9985
is EmbeddedActivityResult.Cancelled -> {
100-
result.customerState?.let { customerStateHolder.setCustomerState(it) }
86+
applyCustomerState(result.customerState)
10187
clearStaleSelection()
10288
}
10389
is EmbeddedActivityResult.Error -> Unit
10490
}
10591
}
10692

93+
private fun applyCompleteResult(result: EmbeddedActivityResult.Complete) {
94+
applyCustomerState(result.customerState)
95+
selectionHolder.setPreviousNewSelections(result.previousNewSelections)
96+
selectionHolder.setSelection(result.selection)
97+
}
98+
99+
private fun applyCustomerState(customerState: CustomerState?) {
100+
customerState?.let { customerStateHolder.setCustomerState(it) }
101+
}
102+
107103
private fun clearStaleSelection() {
108104
val currentSelection = selectionHolder.selection.value
109105
if (currentSelection is PaymentSelection.Saved) {

paymentsheet/src/main/java/com/stripe/android/paymentelement/embedded/content/DefaultEmbeddedSheetLauncher.kt

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -90,9 +90,7 @@ internal class DefaultEmbeddedSheetLauncher @Inject constructor(
9090
private fun handleFormResult(result: EmbeddedActivityResult) {
9191
when (result) {
9292
is EmbeddedActivityResult.Complete -> {
93-
result.customerState?.let { customerStateHolder.setCustomerState(it) }
94-
selectionHolder.setPreviousNewSelections(result.previousNewSelections)
95-
selectionHolder.setSelection(result.selection)
93+
applyCompleteResult(result)
9694
if (result.hasBeenConfirmed) {
9795
embeddedResultCallbackHelper.setResult(
9896
EmbeddedPaymentElement.Result.Completed()
@@ -102,7 +100,7 @@ internal class DefaultEmbeddedSheetLauncher @Inject constructor(
102100
}
103101
}
104102
is EmbeddedActivityResult.Cancelled -> {
105-
result.customerState?.let { customerStateHolder.setCustomerState(it) }
103+
applyCustomerState(result.customerState)
106104
embeddedResultCallbackHelper.setResult(
107105
EmbeddedPaymentElement.Result.Canceled()
108106
)
@@ -114,9 +112,7 @@ internal class DefaultEmbeddedSheetLauncher @Inject constructor(
114112
private fun handleManageResult(result: EmbeddedActivityResult) {
115113
when (result) {
116114
is EmbeddedActivityResult.Complete -> {
117-
result.customerState?.let { customerStateHolder.setCustomerState(it) }
118-
selectionHolder.setPreviousNewSelections(result.previousNewSelections)
119-
selectionHolder.setSelection(result.selection)
115+
applyCompleteResult(result)
120116
if (result.shouldInvokeSelectionCallback && result.selection is PaymentSelection.Saved) {
121117
rowSelectionImmediateActionHandler.invoke()
122118
}
@@ -129,23 +125,31 @@ internal class DefaultEmbeddedSheetLauncher @Inject constructor(
129125
private fun handlePaymentOptionsResult(result: EmbeddedActivityResult) {
130126
when (result) {
131127
is EmbeddedActivityResult.Complete -> {
132-
result.customerState?.let { customerStateHolder.setCustomerState(it) }
133-
selectionHolder.setPreviousNewSelections(result.previousNewSelections)
134-
selectionHolder.setSelection(result.selection)
128+
applyCompleteResult(result)
135129
if (result.hasBeenConfirmed) {
136130
embeddedResultCallbackHelper.setResult(
137131
EmbeddedPaymentElement.Result.Completed()
138132
)
139133
}
140134
}
141135
is EmbeddedActivityResult.Cancelled -> {
142-
result.customerState?.let { customerStateHolder.setCustomerState(it) }
136+
applyCustomerState(result.customerState)
143137
clearStaleSelection()
144138
}
145139
is EmbeddedActivityResult.Error -> Unit
146140
}
147141
}
148142

143+
private fun applyCompleteResult(result: EmbeddedActivityResult.Complete) {
144+
applyCustomerState(result.customerState)
145+
selectionHolder.setPreviousNewSelections(result.previousNewSelections)
146+
selectionHolder.setSelection(result.selection)
147+
}
148+
149+
private fun applyCustomerState(customerState: CustomerState?) {
150+
customerState?.let { customerStateHolder.setCustomerState(it) }
151+
}
152+
149153
private fun clearStaleSelection() {
150154
val currentSelection = selectionHolder.selection.value
151155
if (currentSelection is PaymentSelection.Saved) {

paymentsheet/src/test/java/com/stripe/android/checkout/CheckoutSheetLauncherTest.kt

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import com.stripe.android.paymentelement.embedded.content.EmbeddedSheetLauncher
2424
import com.stripe.android.paymentelement.embedded.content.SheetStateHolder
2525
import com.stripe.android.paymentelement.embedded.previousNewSelection
2626
import com.stripe.android.paymentelement.embedded.sheet.EmbeddedSheetContract
27+
import com.stripe.android.paymentelement.embedded.stashNewSelection
2728
import com.stripe.android.paymentsheet.CustomerStateHolder
2829
import com.stripe.android.paymentsheet.DefaultCustomerStateHolder
2930
import com.stripe.android.paymentsheet.PaymentSheet
@@ -500,6 +501,30 @@ internal class CheckoutSheetLauncherTest {
500501
)
501502
}
502503

504+
@Test
505+
fun `paymentOptionsResult merges returned previous new selections into selection holder`() = testScenario {
506+
sheetStateHolder.sheetIsOpen = true
507+
val returnedSelections = Bundle().apply {
508+
stashNewSelection(PaymentMethodFixtures.CASHAPP_PAYMENT_SELECTION)
509+
}
510+
val result = EmbeddedActivityResult.Complete(
511+
previousNewSelections = returnedSelections,
512+
customerState = null,
513+
selection = null,
514+
hasBeenConfirmed = false,
515+
shouldInvokeSelectionCallback = false,
516+
launchMode = EmbeddedLaunchMode.PaymentOptions(
517+
paymentMethodLayout = PaymentSheet.PaymentMethodLayout.Vertical,
518+
),
519+
)
520+
521+
val callback = registerCall.callback.asCallbackFor<EmbeddedActivityResult>()
522+
callback.onActivityResult(result)
523+
524+
assertThat(selectionHolder.getPreviousNewSelection("cashapp"))
525+
.isEqualTo(PaymentMethodFixtures.CASHAPP_PAYMENT_SELECTION)
526+
}
527+
503528
@Test
504529
fun `paymentOptionsResult callback updates state on complete result`() = testScenario {
505530
sheetStateHolder.sheetIsOpen = true

0 commit comments

Comments
 (0)