package com.fastaccess.ui.base.mvp.presenter; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.annotation.StringRes; import com.fastaccess.R; import com.fastaccess.data.dao.GitHubErrorResponse; import com.fastaccess.helper.RxHelper; import com.fastaccess.provider.rest.RestProvider; import com.fastaccess.ui.base.mvp.BaseMvp; import net.grandcentrix.thirtyinch.TiPresenter; import net.grandcentrix.thirtyinch.rx.RxTiPresenterSubscriptionHandler; import java.io.IOException; import java.util.concurrent.TimeoutException; import retrofit2.adapter.rxjava.HttpException; import rx.Observable; import rx.Subscription; import rx.functions.Action1; /** * Created by Kosh on 25 May 2016, 9:12 PM */ public class BasePresenter<V extends BaseMvp.FAView> extends TiPresenter<V> implements BaseMvp.FAPresenter { private boolean apiCalled; private final RxTiPresenterSubscriptionHandler subscriptionHandler = new RxTiPresenterSubscriptionHandler(this); @Override public void manageSubscription(@Nullable Subscription... subscription) { if (subscription != null) { subscriptionHandler.manageSubscriptions(subscription); } } @Override public boolean isApiCalled() { return apiCalled; } @Override public void onSubscribed() { sendToView(v -> v.showProgress(R.string.in_progress)); } @Override public void onError(@NonNull Throwable throwable) { apiCalled = true; throwable.printStackTrace(); if (RestProvider.getErrorCode(throwable) == 401) { sendToView(BaseMvp.FAView::onRequireLogin); return; } GitHubErrorResponse errorResponse = RestProvider.getErrorResponse(throwable); if (errorResponse != null && errorResponse.getMessage() != null) { sendToView(v -> v.showErrorMessage(errorResponse.getMessage())); } else { sendToView(v -> v.showMessage(R.string.error, getPrettifiedErrorMessage(throwable))); } } @Override public <T> void makeRestCall(@NonNull Observable<T> observable, @NonNull Action1<T> onNext) { manageSubscription( RxHelper.getObserver(observable) .doOnSubscribe(this::onSubscribed) .subscribe(onNext, this::onError, () -> apiCalled = true) ); } @StringRes private int getPrettifiedErrorMessage(@Nullable Throwable throwable) { int resId = R.string.network_error; if (throwable instanceof HttpException) { resId = R.string.network_error; } else if (throwable instanceof IOException) { resId = R.string.request_error; } else if (throwable instanceof TimeoutException) { resId = R.string.unexpected_error; } return resId; } }