Skip to content

Commit 01a40bf

Browse files
Refactor ActivityStarter and make AddPaymentMethodActivityStarter public (#1412)
Specify a request code for each `ActivityStarter` instance instead of passing it in via `startForResult()`.
1 parent 0f24106 commit 01a40bf

13 files changed

+78
-61
lines changed

example/src/main/java/com/stripe/example/activity/CustomerSessionActivity.kt

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import com.stripe.android.CustomerSession
1313
import com.stripe.android.StripeError
1414
import com.stripe.android.model.Customer
1515
import com.stripe.android.model.PaymentMethod
16+
import com.stripe.android.view.AddPaymentMethodActivityStarter
1617
import com.stripe.android.view.PaymentMethodsActivity
1718
import com.stripe.android.view.PaymentMethodsActivityStarter
1819
import com.stripe.example.R
@@ -55,13 +56,15 @@ class CustomerSessionActivity : AppCompatActivity() {
5556
}
5657

5758
private fun launchWithCustomer() {
58-
PaymentMethodsActivityStarter(this).startForResult(REQUEST_CODE_SELECT_SOURCE)
59+
PaymentMethodsActivityStarter(this).startForResult()
5960
}
6061

6162
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
6263
super.onActivityResult(requestCode, resultCode, data)
63-
if (requestCode == REQUEST_CODE_SELECT_SOURCE && resultCode == Activity.RESULT_OK) {
64-
val paymentMethod = data!!.getParcelableExtra<PaymentMethod>(PaymentMethodsActivity.EXTRA_SELECTED_PAYMENT)
64+
if (requestCode == AddPaymentMethodActivityStarter.REQUEST_CODE &&
65+
resultCode == Activity.RESULT_OK && data != null) {
66+
val paymentMethod = data
67+
.getParcelableExtra<PaymentMethod>(PaymentMethodsActivity.EXTRA_SELECTED_PAYMENT)
6568

6669
if (paymentMethod?.card != null) {
6770
selectedSourceTextView.text = buildCardString(paymentMethod.card!!)
@@ -111,8 +114,4 @@ class CustomerSessionActivity : AppCompatActivity() {
111114
}
112115
}
113116
}
114-
115-
companion object {
116-
private const val REQUEST_CODE_SELECT_SOURCE = 55
117-
}
118117
}

stripe/src/main/java/com/stripe/android/PaymentSession.java

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,6 @@ public class PaymentSession {
2727
public static final String TOKEN_PAYMENT_SESSION = "PaymentSession";
2828
public static final String EXTRA_PAYMENT_SESSION_ACTIVE = "payment_session_active";
2929

30-
static final int PAYMENT_SHIPPING_DETAILS_REQUEST = 3004;
31-
static final int PAYMENT_METHOD_REQUEST = 3003;
32-
3330
public static final String PAYMENT_SESSION_DATA_KEY = "payment_session_data";
3431

3532
@NonNull
@@ -103,8 +100,8 @@ public void onCompleted() {
103100
* otherwise {@code false}
104101
*/
105102
public boolean handlePaymentData(int requestCode, int resultCode, @NonNull Intent data) {
106-
if (requestCode != PAYMENT_METHOD_REQUEST &&
107-
requestCode != PAYMENT_SHIPPING_DETAILS_REQUEST) {
103+
if (requestCode != PaymentMethodsActivityStarter.REQUEST_CODE &&
104+
requestCode != PaymentFlowActivityStarter.REQUEST_CODE) {
108105
return false;
109106
}
110107

@@ -113,7 +110,7 @@ public boolean handlePaymentData(int requestCode, int resultCode, @NonNull Inten
113110
return false;
114111
} else if (resultCode == Activity.RESULT_OK) {
115112
switch (requestCode) {
116-
case PAYMENT_METHOD_REQUEST: {
113+
case PaymentMethodsActivityStarter.REQUEST_CODE: {
117114
final PaymentMethod paymentMethod =
118115
data.getParcelableExtra(PaymentMethodsActivity.EXTRA_SELECTED_PAYMENT);
119116
if (paymentMethod != null) {
@@ -128,7 +125,7 @@ public boolean handlePaymentData(int requestCode, int resultCode, @NonNull Inten
128125
}
129126
return true;
130127
}
131-
case PAYMENT_SHIPPING_DETAILS_REQUEST: {
128+
case PaymentFlowActivityStarter.REQUEST_CODE: {
132129
final PaymentSessionData paymentSessionData = data.getParcelableExtra(
133130
PAYMENT_SESSION_DATA_KEY);
134131
paymentSessionData.updateIsPaymentReadyToCharge(mPaymentSessionConfig);
@@ -283,7 +280,7 @@ public void presentPaymentMethodSelection(@NonNull String selectedPaymentMethodI
283280
*/
284281
public void presentPaymentMethodSelection(boolean shouldRequirePostalCode,
285282
@Nullable String userSelectedPaymentMethodId) {
286-
mPaymentMethodsActivityStarter.startForResult(PAYMENT_METHOD_REQUEST,
283+
mPaymentMethodsActivityStarter.startForResult(
287284
new PaymentMethodsActivityStarter.Args.Builder()
288285
.setInitialPaymentMethodId(
289286
getSelectedPaymentMethodId(userSelectedPaymentMethodId))
@@ -336,12 +333,13 @@ public void setCartTotal(@IntRange(from = 0) long cartTotal) {
336333
* Launch the {@link PaymentFlowActivity} to allow the user to fill in payment details.
337334
*/
338335
public void presentShippingFlow() {
339-
mPaymentFlowActivityStarter.startForResult(PAYMENT_SHIPPING_DETAILS_REQUEST,
336+
mPaymentFlowActivityStarter.startForResult(
340337
new PaymentFlowActivityStarter.Args.Builder()
341338
.setPaymentSessionConfig(mPaymentSessionConfig)
342339
.setPaymentSessionData(mPaymentSessionData)
343340
.setIsPaymentSessionActive(true)
344-
.build());
341+
.build()
342+
);
345343
}
346344

347345
/**

stripe/src/main/java/com/stripe/android/view/ActivityStarter.java

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,37 +15,42 @@ public abstract class ActivityStarter
1515
@Nullable private final Fragment mFragment;
1616
@NonNull private final Class<TargetActivityType> mTargetClass;
1717
@NonNull private final ArgsType mDefaultArgs;
18+
@NonNull private final int mRequestCode;
1819

1920
ActivityStarter(@NonNull Activity activity,
2021
@NonNull Class<TargetActivityType> targetClass,
21-
@NonNull ArgsType args) {
22+
@NonNull ArgsType args,
23+
int requestCode) {
2224
mActivity = activity;
2325
mFragment = null;
2426
mTargetClass = targetClass;
2527
mDefaultArgs = args;
28+
mRequestCode = requestCode;
2629
}
2730

2831
ActivityStarter(@NonNull Fragment fragment,
2932
@NonNull Class<TargetActivityType> targetClass,
30-
@NonNull ArgsType args) {
33+
@NonNull ArgsType args,
34+
int requestCode) {
3135
mActivity = fragment.requireActivity();
3236
mFragment = fragment;
3337
mTargetClass = targetClass;
3438
mDefaultArgs = args;
39+
mRequestCode = requestCode;
3540
}
3641

37-
public final void startForResult(final int requestCode) {
38-
startForResult(requestCode, mDefaultArgs);
42+
public final void startForResult() {
43+
startForResult(mDefaultArgs);
3944
}
4045

41-
public final void startForResult(int requestCode, @NonNull ArgsType args) {
46+
public final void startForResult(@NonNull ArgsType args) {
4247
final Intent intent = newIntent()
4348
.putExtra(Args.EXTRA, args);
4449

4550
if (mFragment != null) {
46-
Objects.requireNonNull(mFragment).startActivityForResult(intent, requestCode);
51+
Objects.requireNonNull(mFragment).startActivityForResult(intent, mRequestCode);
4752
} else {
48-
mActivity.startActivityForResult(intent, requestCode);
53+
mActivity.startActivityForResult(intent, mRequestCode);
4954
}
5055
}
5156

stripe/src/main/java/com/stripe/android/view/AddPaymentMethodActivity.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ protected void onCreate(Bundle savedInstanceState) {
6262

6363
configureView(args);
6464

65-
mShouldAttachToCustomer = mPaymentMethodType.isReusable && args.shouldUpdateCustomer;
65+
mShouldAttachToCustomer = mPaymentMethodType.isReusable && args.shouldAttachToCustomer;
6666
mStartedFromPaymentSession = args.isPaymentSessionActive;
6767

6868
if (mShouldAttachToCustomer && args.shouldInitCustomerSessionTokens) {

stripe/src/main/java/com/stripe/android/view/AddPaymentMethodActivityStarter.java

Lines changed: 26 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -14,16 +14,24 @@
1414

1515
import java.util.Objects;
1616

17-
public class AddPaymentMethodActivityStarter
17+
/**
18+
* A class to start {@link AddPaymentMethodActivity}. Arguments for the activity can be
19+
* specified with {@link Args} and constructed with {@link Args.Builder}.
20+
*
21+
* <p>The result will be returned with request code {@link #REQUEST_CODE}.</p>
22+
*/
23+
public final class AddPaymentMethodActivityStarter
1824
extends ActivityStarter<AddPaymentMethodActivity, AddPaymentMethodActivityStarter.Args> {
25+
public static final int REQUEST_CODE = 6001;
26+
1927
AddPaymentMethodActivityStarter(@NonNull Activity activity) {
20-
super(activity, AddPaymentMethodActivity.class, Args.DEFAULT);
28+
super(activity, AddPaymentMethodActivity.class, Args.DEFAULT, REQUEST_CODE);
2129
}
2230

2331
public static final class Args implements ActivityStarter.Args {
2432
private static final Args DEFAULT = new Args.Builder().build();
2533

26-
final boolean shouldUpdateCustomer;
34+
final boolean shouldAttachToCustomer;
2735
final boolean shouldRequirePostalCode;
2836
final boolean isPaymentSessionActive;
2937
final boolean shouldInitCustomerSessionTokens;
@@ -38,7 +46,7 @@ public static AddPaymentMethodActivityStarter.Args create(@NonNull Intent intent
3846
}
3947

4048
private Args(@NonNull AddPaymentMethodActivityStarter.Args.Builder builder) {
41-
this.shouldUpdateCustomer = builder.mShouldUpdateCustomer;
49+
this.shouldAttachToCustomer = builder.mShouldAttachToCustomer;
4250
this.shouldRequirePostalCode = builder.mShouldRequirePostalCode;
4351
this.isPaymentSessionActive = builder.mIsPaymentSessionActive;
4452
this.shouldInitCustomerSessionTokens = builder.mShouldInitCustomerSessionTokens;
@@ -50,7 +58,7 @@ private Args(@NonNull AddPaymentMethodActivityStarter.Args.Builder builder) {
5058
}
5159

5260
private Args(@NonNull Parcel in) {
53-
this.shouldUpdateCustomer = in.readInt() == 1;
61+
this.shouldAttachToCustomer = in.readInt() == 1;
5462
this.shouldRequirePostalCode = in.readInt() == 1;
5563
this.isPaymentSessionActive = in.readInt() == 1;
5664
this.shouldInitCustomerSessionTokens = in.readInt() == 1;
@@ -66,7 +74,7 @@ public int describeContents() {
6674

6775
@Override
6876
public void writeToParcel(Parcel dest, int flags) {
69-
dest.writeInt(shouldUpdateCustomer ? 1 : 0);
77+
dest.writeInt(shouldAttachToCustomer ? 1 : 0);
7078
dest.writeInt(shouldRequirePostalCode ? 1 : 0);
7179
dest.writeInt(isPaymentSessionActive ? 1 : 0);
7280
dest.writeInt(shouldInitCustomerSessionTokens ? 1 : 0);
@@ -76,7 +84,7 @@ public void writeToParcel(Parcel dest, int flags) {
7684

7785
@Override
7886
public int hashCode() {
79-
return ObjectUtils.hash(shouldUpdateCustomer, shouldRequirePostalCode,
87+
return ObjectUtils.hash(shouldAttachToCustomer, shouldRequirePostalCode,
8088
isPaymentSessionActive, shouldInitCustomerSessionTokens, paymentMethodType,
8189
paymentConfiguration);
8290
}
@@ -87,7 +95,7 @@ public boolean equals(@Nullable Object obj) {
8795
}
8896

8997
private boolean typedEquals(@NonNull Args args) {
90-
return ObjectUtils.equals(shouldUpdateCustomer, args.shouldUpdateCustomer) &&
98+
return ObjectUtils.equals(shouldAttachToCustomer, args.shouldAttachToCustomer) &&
9199
ObjectUtils.equals(shouldRequirePostalCode, args.shouldRequirePostalCode) &&
92100
ObjectUtils.equals(isPaymentSessionActive, args.isPaymentSessionActive) &&
93101
ObjectUtils.equals(shouldInitCustomerSessionTokens,
@@ -114,25 +122,29 @@ public AddPaymentMethodActivityStarter.Args[] newArray(int size) {
114122

115123
public static final class Builder
116124
implements ObjectBuilder<AddPaymentMethodActivityStarter.Args> {
117-
private boolean mShouldUpdateCustomer;
125+
private boolean mShouldAttachToCustomer;
118126
private boolean mShouldRequirePostalCode;
119127
private boolean mIsPaymentSessionActive = false;
120128
private boolean mShouldInitCustomerSessionTokens = true;
121129
@Nullable private PaymentMethod.Type mPaymentMethodType;
122130
@Nullable private PaymentConfiguration mPaymentConfiguration;
123131

124132
/**
125-
* If true, update using an already-initialized
126-
* {@link com.stripe.android.CustomerSession}
133+
* If true, the created Payment Method will be attached to the current Customer
134+
* using an already-initialized {@link com.stripe.android.CustomerSession}.
127135
*/
128136
@NonNull
129-
Builder setShouldUpdateCustomer(boolean shouldUpdateCustomer) {
130-
this.mShouldUpdateCustomer = shouldUpdateCustomer;
137+
public Builder setShouldAttachToCustomer(boolean shouldAttachToCustomer) {
138+
this.mShouldAttachToCustomer = shouldAttachToCustomer;
131139
return this;
132140
}
133141

142+
/**
143+
* If true, a postal code field will be shown and validated.
144+
* Currently, only US ZIP Codes are supported.
145+
*/
134146
@NonNull
135-
Builder setShouldRequirePostalCode(boolean shouldRequirePostalCode) {
147+
public Builder setShouldRequirePostalCode(boolean shouldRequirePostalCode) {
136148
this.mShouldRequirePostalCode = shouldRequirePostalCode;
137149
return this;
138150
}

stripe/src/main/java/com/stripe/android/view/AddPaymentMethodCardRowView.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ public class AddPaymentMethodCardRowView extends AddPaymentMethodRowView {
1515
R.layout.add_payment_method_card_row,
1616
R.id.payment_methods_add_card,
1717
new AddPaymentMethodActivityStarter.Args.Builder()
18-
.setShouldUpdateCustomer(true)
18+
.setShouldAttachToCustomer(true)
1919
.setShouldRequirePostalCode(args.shouldRequirePostalCode)
2020
.setIsPaymentSessionActive(args.isPaymentSessionActive)
2121
.setPaymentMethodType(PaymentMethod.Type.Card)

stripe/src/main/java/com/stripe/android/view/AddPaymentMethodRowView.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,7 @@ abstract class AddPaymentMethodRowView extends FrameLayout {
1919
setOnClickListener(new View.OnClickListener() {
2020
@Override
2121
public void onClick(@NonNull View view) {
22-
new AddPaymentMethodActivityStarter(activity).startForResult(
23-
PaymentMethodsActivity.REQUEST_CODE_CREATE_PAYMENT_METHOD, args);
22+
new AddPaymentMethodActivityStarter(activity).startForResult(args);
2423
}
2524
});
2625
}

stripe/src/main/java/com/stripe/android/view/PaymentFlowActivityStarter.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,14 @@
1717

1818
public final class PaymentFlowActivityStarter
1919
extends ActivityStarter<PaymentFlowActivity, PaymentFlowActivityStarter.Args> {
20+
public static final int REQUEST_CODE = 6002;
21+
2022
public PaymentFlowActivityStarter(@NonNull Activity activity) {
21-
super(activity, PaymentFlowActivity.class, Args.DEFAULT);
23+
super(activity, PaymentFlowActivity.class, Args.DEFAULT, REQUEST_CODE);
2224
}
2325

2426
public PaymentFlowActivityStarter(@NonNull Fragment fragment) {
25-
super(fragment, PaymentFlowActivity.class, Args.DEFAULT);
27+
super(fragment, PaymentFlowActivity.class, Args.DEFAULT, REQUEST_CODE);
2628
}
2729

2830
public static final class Args implements ActivityStarter.Args {

stripe/src/main/java/com/stripe/android/view/PaymentMethodsActivity.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@ public class PaymentMethodsActivity extends AppCompatActivity {
4141
public static final String EXTRA_SELECTED_PAYMENT = "selected_payment";
4242
public static final String TOKEN_PAYMENT_METHODS_ACTIVITY = "PaymentMethodsActivity";
4343

44-
static final int REQUEST_CODE_CREATE_PAYMENT_METHOD = 700;
4544
private boolean mCommunicating;
4645
private PaymentMethodsAdapter mAdapter;
4746
private ProgressBar mProgressBar;
@@ -110,7 +109,8 @@ protected void onCreate(@Nullable Bundle savedInstanceState) {
110109
@Override
111110
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
112111
super.onActivityResult(requestCode, resultCode, data);
113-
if (requestCode == REQUEST_CODE_CREATE_PAYMENT_METHOD && resultCode == RESULT_OK) {
112+
if (requestCode == AddPaymentMethodActivityStarter.REQUEST_CODE &&
113+
resultCode == RESULT_OK) {
114114
onPaymentMethodCreated(data);
115115
}
116116
}

stripe/src/main/java/com/stripe/android/view/PaymentMethodsActivityStarter.java

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,14 @@
2020

2121
public final class PaymentMethodsActivityStarter
2222
extends ActivityStarter<PaymentMethodsActivity, PaymentMethodsActivityStarter.Args> {
23+
public static final int REQUEST_CODE = 6000;
24+
2325
public PaymentMethodsActivityStarter(@NonNull Activity activity) {
24-
super(activity, PaymentMethodsActivity.class, Args.DEFAULT);
26+
super(activity, PaymentMethodsActivity.class, Args.DEFAULT, REQUEST_CODE);
2527
}
2628

2729
public PaymentMethodsActivityStarter(@NonNull Fragment fragment) {
28-
super(fragment, PaymentMethodsActivity.class, Args.DEFAULT);
30+
super(fragment, PaymentMethodsActivity.class, Args.DEFAULT, REQUEST_CODE);
2931
}
3032

3133
public static final class Args implements ActivityStarter.Args {
@@ -145,16 +147,15 @@ public Builder setIsPaymentSessionActive(boolean isPaymentSessionActive) {
145147
}
146148

147149
@NonNull
148-
public Builder setPaymentMethodTypes(
149-
@NonNull Set<PaymentMethod.Type> paymentMethodTypes) {
150-
mPaymentMethodTypes = paymentMethodTypes;
150+
public Builder setPaymentConfiguration(
151+
@Nullable PaymentConfiguration paymentConfiguration) {
152+
this.mPaymentConfiguration = paymentConfiguration;
151153
return this;
152154
}
153155

154156
@NonNull
155-
public Builder setPaymentConfiguration(
156-
@Nullable PaymentConfiguration paymentConfiguration) {
157-
this.mPaymentConfiguration = paymentConfiguration;
157+
Builder setPaymentMethodTypes(@NonNull Set<PaymentMethod.Type> paymentMethodTypes) {
158+
mPaymentMethodTypes = paymentMethodTypes;
158159
return this;
159160
}
160161

stripe/src/test/java/com/stripe/android/PaymentSessionTest.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ public void handlePaymentData_whenPaymentMethodRequest_notifiesListenerAndFetche
150150
reset(mPaymentSessionListener);
151151

152152
final boolean handled = paymentSession.handlePaymentData(
153-
PaymentSession.PAYMENT_METHOD_REQUEST, RESULT_OK,
153+
PaymentMethodsActivityStarter.REQUEST_CODE, RESULT_OK,
154154
new Intent().putExtra(PaymentMethodsActivity.EXTRA_SELECTED_PAYMENT,
155155
PaymentMethod.fromString(PaymentMethodTest.PM_CARD_JSON)));
156156
assertTrue(handled);
@@ -173,7 +173,7 @@ public void selectPaymentMethod_launchesPaymentMethodsActivityWithLog() {
173173
paymentSession.presentPaymentMethodSelection();
174174

175175
verify(mActivity).startActivityForResult(mIntentArgumentCaptor.capture(),
176-
eq(PaymentSession.PAYMENT_METHOD_REQUEST));
176+
eq(PaymentMethodsActivityStarter.REQUEST_CODE));
177177

178178
final Intent intent = mIntentArgumentCaptor.getValue();
179179
assertNotNull(intent.getComponent());
@@ -194,7 +194,7 @@ public void presentPaymentMethodSelection_withShouldRequirePostalCode_shouldPass
194194
paymentSession.presentPaymentMethodSelection(true);
195195

196196
verify(mActivity).startActivityForResult(mIntentArgumentCaptor.capture(),
197-
eq(PaymentSession.PAYMENT_METHOD_REQUEST));
197+
eq(PaymentMethodsActivityStarter.REQUEST_CODE));
198198
assertTrue(PaymentMethodsActivityStarter.Args.create(mIntentArgumentCaptor.getValue())
199199
.shouldRequirePostalCode);
200200
}
@@ -333,7 +333,7 @@ public void handlePaymentData_withInvalidRequestCode_aborts() {
333333
@Test
334334
public void handlePaymentData_withValidRequestCodeAndCanceledResult_retrievesCustomer() {
335335
final PaymentSession paymentSession = createPaymentSession();
336-
assertFalse(paymentSession.handlePaymentData(PaymentSession.PAYMENT_METHOD_REQUEST,
336+
assertFalse(paymentSession.handlePaymentData(PaymentMethodsActivityStarter.REQUEST_CODE,
337337
RESULT_CANCELED, new Intent()));
338338
verify(mCustomerSession).retrieveCurrentCustomer(
339339
ArgumentMatchers.<CustomerSession.CustomerRetrievalListener>any());

0 commit comments

Comments
 (0)