forked from stripe/stripe-android
-
Notifications
You must be signed in to change notification settings - Fork 0
/
RxTokenController.java
90 lines (77 loc) · 3.29 KB
/
RxTokenController.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
package com.stripe.example.controller;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.widget.Button;
import com.jakewharton.rxbinding2.view.RxView;
import com.stripe.android.PaymentConfiguration;
import com.stripe.android.Stripe;
import com.stripe.android.model.Card;
import com.stripe.android.model.Token;
import com.stripe.android.view.CardInputWidget;
import com.stripe.example.R;
import io.reactivex.Observable;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.CompositeDisposable;
import io.reactivex.schedulers.Schedulers;
/**
* Class containing all the logic needed to create a token and listen for the results using
* RxJava.
*/
public class RxTokenController {
@NonNull private final CompositeDisposable mCompositeDisposable;
@NonNull private final Context mContext;
@NonNull private final ErrorDialogHandler mErrorDialogHandler;
@NonNull private final ListViewController mOutputListController;
@NonNull private final ProgressDialogController mProgressDialogController;
@Nullable private CardInputWidget mCardInputWidget;
public RxTokenController(
@NonNull Button button,
@NonNull CardInputWidget cardInputWidget,
@NonNull Context context,
@NonNull ErrorDialogHandler errorDialogHandler,
@NonNull ListViewController outputListController,
@NonNull ProgressDialogController progressDialogController) {
mCompositeDisposable = new CompositeDisposable();
mCardInputWidget = cardInputWidget;
mContext = context;
mErrorDialogHandler = errorDialogHandler;
mOutputListController = outputListController;
mProgressDialogController = progressDialogController;
mCompositeDisposable.add(
RxView.clicks(button).subscribe(aVoid -> saveCard())
);
}
/**
* Release subscriptions to prevent memory leaks.
*/
public void detach() {
mCompositeDisposable.dispose();
mCardInputWidget = null;
}
private void saveCard() {
final Card cardToSave = mCardInputWidget.getCard();
if (cardToSave == null) {
mErrorDialogHandler.show("Invalid Card Data");
return;
}
final Stripe stripe = new Stripe(mContext);
// Note: using this style of Observable creation results in us having a method that
// will not be called until we subscribe to it.
final Observable<Token> tokenObservable =
Observable.fromCallable(
() -> stripe.createTokenSynchronous(cardToSave,
PaymentConfiguration.getInstance().getPublishableKey()));
mCompositeDisposable.add(tokenObservable
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.doOnSubscribe(
(d) -> mProgressDialogController.show(R.string.progressMessage))
.doOnComplete(mProgressDialogController::dismiss)
.subscribe(
mOutputListController::addToList,
throwable -> mErrorDialogHandler.show(throwable.getLocalizedMessage())
)
);
}
}