package starter.kit.feature.rx; import android.os.Bundle; import com.trello.rxlifecycle.FragmentEvent; import com.trello.rxlifecycle.RxLifecycle; import java.util.ArrayList; import rx.Observable; import rx.functions.Action2; import rx.functions.Func0; import rx.functions.Func1; import rx.subjects.BehaviorSubject; import rx.subjects.PublishSubject; import starter.kit.model.entity.Entity; import starter.kit.util.RxRequestKey; import starter.kit.util.RxUtils; import static rx.android.schedulers.AndroidSchedulers.mainThread; import static rx.schedulers.Schedulers.io; public abstract class RxResourcePresenter<T extends Entity> extends RxStarterPresenter<RxStarterRecyclerFragment> { private static final int RESTARTABLE_ID = 100; private PublishSubject<RxRequestKey> mRequests = PublishSubject.create(); @SuppressWarnings("Unchecked") @Override protected void onCreate(Bundle savedState) { super.onCreate(savedState); restartableReplay(restartableId(), new Func0<Observable<ArrayList<T>>>() { @Override public Observable<ArrayList<T>> call() { return observableFactory(); } }, new Action2<RxStarterRecyclerFragment, ArrayList<T>>() { @Override public void call(RxStarterRecyclerFragment fragment, ArrayList<T> items) { fragment.notifyDataSetChanged(items); } }, new Action2<RxStarterRecyclerFragment, Throwable>() { @Override public void call(RxStarterRecyclerFragment fragment, Throwable throwable) { fragment.onError(throwable); } }); } private Observable<ArrayList<T>> observableFactory() { return view().concatMap(new Func1<RxStarterRecyclerFragment, Observable<ArrayList<T>>>() { @Override public Observable<ArrayList<T>> call(RxStarterRecyclerFragment fragment) { return mRequests.startWith(fragment.getRequestKey()) .concatMap(new Func1<RxRequestKey, Observable<? extends ArrayList<T>>>() { @Override public Observable<? extends ArrayList<T>> call(RxRequestKey requestKey) { BehaviorSubject<FragmentEvent> lifecycle = BehaviorSubject.create(); return request(requestKey.previousKey(), requestKey.nextKey(), requestKey.pageSize()).subscribeOn(io()) .compose(RxUtils.progressTransformer(fragment)) .compose(RxLifecycle.bindFragment(lifecycle)) .observeOn(mainThread()); } }); } }); } public int restartableId() { return RESTARTABLE_ID; } public abstract Observable<ArrayList<T>> request(String previousKey, String nextKey, int pageSize); public void request() { start(restartableId()); } public void requestNext(RxRequestKey requestKey) { mRequests.onNext(requestKey); } }