package com.tevinjeffrey.rutgersct.ui.subject; import com.tevinjeffrey.rutgersct.rutgersapi.RetroRutgers; import com.tevinjeffrey.rutgersct.rutgersapi.model.Request; import com.tevinjeffrey.rutgersct.rutgersapi.model.Subject; import com.tevinjeffrey.rutgersct.ui.base.BasePresenter; import com.tevinjeffrey.rutgersct.ui.base.View; import com.tevinjeffrey.rutgersct.utils.AndroidMainThread; import com.tevinjeffrey.rutgersct.utils.BackgroundThread; import com.tevinjeffrey.rutgersct.utils.RxUtils; import com.tevinjeffrey.rutgersct.rutgersapi.exceptions.RutgersDataIOException; import java.util.List; import javax.inject.Inject; import rx.Scheduler; import rx.Subscriber; import rx.Subscription; import rx.android.schedulers.AndroidSchedulers; import rx.functions.Action0; import rx.schedulers.Schedulers; public class SubjectPresenterImpl extends BasePresenter implements SubjectPresenter { private static final String TAG = SubjectPresenter.class.getSimpleName(); @Inject RetroRutgers mRetroRutgers; @Inject @AndroidMainThread Scheduler mMainThread; @Inject @BackgroundThread Scheduler mBackgroundThread; private Subscription mSubscription; private final Request mRequest; private boolean isLoading; public SubjectPresenterImpl(Request mRequest) { this.mRequest = mRequest; } @Override public void loadSubjects(boolean pullToRefresh) { if (getView() != null) getView().showLoading(pullToRefresh); cancePreviousSubscription(); Subscriber<List<Subject>> mSubscriber = new Subscriber<List<Subject>>() { @Override public void onCompleted() { if (getView() != null) getView().showLoading(false); } @Override public void onError(Throwable e) { //Lets the view decide what to display depending on what type of exception it is. if (getView() != null) getView().showError(e); //Removes the animated loading drawable if (getView() != null) { getView().showLoading(false); } } @Override public void onNext(List<Subject> subjectList) { if (getView() != null) { getView().setData(subjectList); if (subjectList.size() == 0) getView().showError(new RutgersDataIOException()); if (subjectList.size() > 0) getView().showLayout(View.LayoutType.LIST); } } }; mSubscription = mRetroRutgers.getSubjects(mRequest) .doOnSubscribe(new Action0() { @Override public void call() { isLoading = true; } }) .doOnTerminate(new Action0() { @Override public void call() { isLoading = false; } }) .subscribeOn(mBackgroundThread) .observeOn(mMainThread) .subscribe(mSubscriber); } private void cancePreviousSubscription() { RxUtils.unsubscribeIfNotNull(mSubscription); } public SubjectView getView() { return (SubjectView) super.getView(); } @Override public boolean isLoading() { return isLoading; } }