@OnClick(R.id.btn_demo_retrofit_contributors)
  public void onListContributorsClicked() {
    _adapter.clear();

    _subscriptions.add( //
        _api.contributors(_username.getText().toString(), _repo.getText().toString())
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(
                new Observer<List<Contributor>>() {
                  @Override
                  public void onCompleted() {
                    Timber.d("Retrofit call 1 completed");
                  }

                  @Override
                  public void onError(Throwable e) {
                    Timber.e(e, "woops we got an error while getting the list of contributors");
                  }

                  @Override
                  public void onNext(List<Contributor> contributors) {
                    for (Contributor c : contributors) {
                      _adapter.add(
                          format(
                              "%s has made %d contributions to %s",
                              c.login, c.contributions, _repo.getText().toString()));

                      Timber.d(
                          "%s has made %d contributions to %s",
                          c.login, c.contributions, _repo.getText().toString());
                    }
                  }
                }));
  }
  @OnClick(R.id.btn_demo_retrofit_contributors_with_user_info)
  public void onListContributorsWithFullUserInfoClicked() {
    _adapter.clear();

    _subscriptions.add(
        _api.contributors(_username.getText().toString(), _repo.getText().toString())
            .flatMap(
                new Func1<List<Contributor>, Observable<Contributor>>() {
                  @Override
                  public Observable<Contributor> call(List<Contributor> contributors) {
                    return Observable.from(contributors);
                  }
                })
            .flatMap(
                new Func1<Contributor, Observable<Pair<User, Contributor>>>() {
                  @Override
                  public Observable<Pair<User, Contributor>> call(Contributor contributor) {
                    Observable<User> _userObservable =
                        _api.user(contributor.login)
                            .filter(
                                new Func1<User, Boolean>() {
                                  @Override
                                  public Boolean call(User user) {
                                    return !isEmpty(user.name) && !isEmpty(user.email);
                                  }
                                });

                    return Observable.zip(
                        _userObservable,
                        Observable.just(contributor),
                        new Func2<User, Contributor, Pair<User, Contributor>>() {
                          @Override
                          public Pair<User, Contributor> call(User user, Contributor contributor) {
                            return new Pair<>(user, contributor);
                          }
                        });
                  }
                })
            .subscribeOn(Schedulers.newThread())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(
                new Observer<Pair<User, Contributor>>() {
                  @Override
                  public void onCompleted() {
                    Timber.d("Retrofit call 2 completed ");
                  }

                  @Override
                  public void onError(Throwable e) {
                    Timber.e(
                        e, "error while getting the list of contributors along with full names");
                  }

                  @Override
                  public void onNext(Pair<User, Contributor> pair) {
                    User user = pair.first;
                    Contributor contributor = pair.second;

                    _adapter.add(
                        format(
                            "%s(%s) has made %d contributions to %s",
                            user.name,
                            user.email,
                            contributor.contributions,
                            _repo.getText().toString()));

                    _adapter.notifyDataSetChanged();

                    Timber.d(
                        "%s(%s) has made %d contributions to %s",
                        user.name,
                        user.email,
                        contributor.contributions,
                        _repo.getText().toString());
                  }
                }));
  }