package com.tevinjeffrey.rutgersct.ui.trackedsections; import android.os.Bundle; import com.squareup.otto.Bus; import com.squareup.otto.Subscribe; import com.tevinjeffrey.rutgersct.database.DatabaseHandler; import com.tevinjeffrey.rutgersct.rutgersapi.RetroRutgers; import com.tevinjeffrey.rutgersct.rutgersapi.model.Course; import com.tevinjeffrey.rutgersct.rutgersapi.model.Course.Section; import com.tevinjeffrey.rutgersct.rutgersapi.model.Request; import com.tevinjeffrey.rutgersct.ui.base.BasePresenter; import com.tevinjeffrey.rutgersct.database.DatabaseUpdateEvent; import com.tevinjeffrey.rutgersct.utils.AndroidMainThread; import com.tevinjeffrey.rutgersct.utils.AndroidSchedulerTransformer; import com.tevinjeffrey.rutgersct.utils.BackgroundThread; import com.tevinjeffrey.rutgersct.utils.RxUtils; import com.tevinjeffrey.rutgersct.utils.SchedulerTransformer; import java.util.List; import javax.inject.Inject; import rx.Observable; import rx.Scheduler; import rx.Subscriber; import rx.Subscription; import rx.android.schedulers.AndroidSchedulers; import rx.functions.Action0; import rx.functions.Func1; import rx.schedulers.Schedulers; import static com.tevinjeffrey.rutgersct.ui.base.View.LayoutType.EMPTY; import static com.tevinjeffrey.rutgersct.ui.base.View.LayoutType.LIST; public class TrackedSectionsPresenterImpl extends BasePresenter implements TrackedSectionsPresenter { private static final String TAG = TrackedSectionsPresenterImpl.class.getSimpleName(); @Inject DatabaseHandler mDatabaseHandler; @Inject RetroRutgers mRetroRutgers; @Inject Bus mBus; @Inject @AndroidMainThread Scheduler mMainThread; @Inject @BackgroundThread Scheduler mBackgroundThread; private boolean isLoading = false; private Subscription mSubscription; Subscriber<List<Section>> trackedSectinsSubscriber; public TrackedSectionsPresenterImpl() { } public void loadTrackedSections(final boolean pullToRefresh) { if (getView() != null) getView().showLoading(pullToRefresh); cancePreviousSubscription(); trackedSectinsSubscriber = new Subscriber<List<Section>>() { @Override public void onCompleted() { if (getView() != null) getView().showLoading(false); } @Override public void onError(Throwable e) { //Removes the animated loading drawable if (getView() != null) getView().showLoading(false); //Lets the view decide what to display depending on what type of exception it is. if (getView() != null) getView().showError(e); } @Override public void onNext(List<Section> sectionList) { if (getView() != null) { getView().setData(sectionList); } } }; mSubscription = mDatabaseHandler.getObservableSections() .flatMap(new Func1<List<Request>, Observable<Section>>() { @Override public Observable<Section> call(List<Request> requests) { return mRetroRutgers.getTrackedSections(requests); } }) .doOnSubscribe(new Action0() { @Override public void call() { isLoading = true; } }) .doOnTerminate(new Action0() { @Override public void call() { isLoading = false; } }) .toSortedList() .subscribeOn(mBackgroundThread) .observeOn(mMainThread) .subscribe(trackedSectinsSubscriber); } private void cancePreviousSubscription() { RxUtils.unsubscribeIfNotNull(mSubscription); } public TrackedSectionsView getView() { return (TrackedSectionsView) super.getView(); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); } @Override public void onPause() { super.onPause(); mBus.unregister(this); } @Override public void onResume() { mBus.register(this); } @Subscribe public void onDbUpdateEvent(DatabaseUpdateEvent event) { //When a database update event comes through it loads the data, without a loading animation. loadTrackedSections(false); } @Override public boolean isLoading() { return isLoading; } @Override public String toString() { return TAG; } }