package starter.kit.feature.rx; import android.os.Bundle; import com.trello.rxlifecycle.FragmentEvent; import com.trello.rxlifecycle.RxLifecycle; import rx.Observable; import rx.functions.Action2; import rx.functions.Func0; import rx.subjects.BehaviorSubject; import starter.kit.feature.NetworkContract; import starter.kit.retrofit.RetrofitException; import starter.kit.util.HudInterface; import starter.kit.util.RxUtils; import static rx.android.schedulers.AndroidSchedulers.mainThread; import static rx.schedulers.Schedulers.io; public abstract class RxNetworkPresenter<T, ViewType extends NetworkContract.View> extends RxStarterPresenter<ViewType> implements HudInterface { private static final int RESTARTABLE_ID = 2000; @Override protected void onCreate(Bundle savedState) { super.onCreate(savedState); restartableFirst(restartableId(), new Func0<Observable<T>>() { @Override public Observable<T> call() { BehaviorSubject<FragmentEvent> lifecycle = BehaviorSubject.create(); return request().subscribeOn(io()) .compose(RxUtils.hudTransformer(RxNetworkPresenter.this)) .compose(RxLifecycle.bindFragment(lifecycle)) .observeOn(mainThread()); } }, new Action2<ViewType, T>() { @Override public void call(ViewType viewType, T item) { viewType.onSuccess(item); } }, new Action2<ViewType, Throwable>() { @Override public void call(ViewType viewType, Throwable throwable) { RetrofitException error = (RetrofitException) throwable; viewType.onError(error); } }); } public int restartableId() { return RESTARTABLE_ID; } public abstract Observable<T> request(); public void start() { start(restartableId()); } public void stop() { stop(restartableId()); } }