code: void createCardSource(@NonNull Card card) {
          final SourceParams cardSourceParams = SourceParams.createCardParams(card);
          final Observable<Source> cardSourceObservable =
                  Observable.fromCallable(
                          new Callable<Source>() {
                              @Override
                              public Source call() throws Exception {
                                  return mStripe.createSourceSynchronous(
                                          cardSourceParams,
                                          PaymentConfiguration.getInstance().getPublishableKey());
                              }
                          });
  
          mCompositeSubscription.add(cardSourceObservable
                  .subscribeOn(Schedulers.io())
                  .observeOn(AndroidSchedulers.mainThread())
                  .doOnSubscribe(new Action0() {
                      @Override
                      public void call() {
                          mProgressDialogController.show(R.string.createSource);
                      }
                  })
                  .subscribe(
                          // Because we've made the mapping above, we're now subscribing
                          // to the result of creating a 3DS Source
                          new Action1<Source>() {
                              @Override
                              public void call(Source source) {
                                  SourceCardData sourceCardData =
                                          (SourceCardData) source.getSourceTypeModel();
  
                                  final String threeDSecureStatus = sourceCardData != null ?
                                          sourceCardData.getThreeDSecureStatus() : null;
  
                                  // Making a note of the Card Source in our list.
                                  mRedirectAdapter.addItem(
                                          source.getStatus(),
                                          threeDSecureStatus,
                                          source.getId(),
                                          source.getType());
                                  // If we need to get 3DS verification for this card, we
                                  // first create a 3DS Source.
                                  if (SourceCardData.REQUIRED.equals(threeDSecureStatus)) {
  
                                      // The card Source can be used to create a 3DS Source
                                      createThreeDSecureSource(source.getId());
                                  } else {
                                      mProgressDialogController.dismiss();
                                  }
  
                              }
                          },
                          new Action1<Throwable>() {
                              @Override
                              public void call(Throwable throwable) {
                                  mErrorDialogHandler.show(throwable.getMessage());
                              }
                          }
                  ));
      }
docs: To start the 3DS cycle, create a {@link Source} out of the user-entered {@link Card}.
  
  @param card the {@link Card} used to create a source