package com.pandaq.pandaeye.modules.douban.mvp;
import com.pandaq.pandaeye.CustomApplication;
import com.pandaq.pandaeye.config.Constants;
import com.pandaq.pandaeye.disklrucache.DiskCacheManager;
import com.pandaq.pandaeye.api.ApiManager;
import com.pandaq.pandaeye.BasePresenter;
import com.pandaq.pandaqlib.magicrecyclerView.BaseItem;
import java.util.ArrayList;
import java.util.List;
import io.reactivex.Observable;
import io.reactivex.ObservableSource;
import io.reactivex.SingleObserver;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
import io.reactivex.functions.Function;
import io.reactivex.schedulers.Schedulers;
/**
* Created by PandaQ on 2016/9/8.
* email : 767807368@qq.com
* 豆瓣电影FragmentPresenter
*/
public class DouBanMoviePresenter extends BasePresenter implements DoubanContract.Presenter{
private DoubanContract.View mMovieListFrag;
private int start;
private boolean loadAllCompleted = false;
public DouBanMoviePresenter(DoubanContract.View mMovieListFrag) {
this.mMovieListFrag = mMovieListFrag;
}
/**
* 刷新操作
*/
public void refreshData() {
mMovieListFrag.showProgressBar();
ApiManager.getInstence().getDoubanService()
.getTop250(0, 20)
.flatMap(new Function<MovieTop250, ObservableSource<MovieSubject>>() {
@Override
public Observable<MovieSubject> apply(MovieTop250 movieTop250) throws Exception {
//刷新后下一次加载的起点为
start = movieTop250.getCount();
return Observable.fromIterable(movieTop250.getMovieSubjects());
}
})
.map(new Function<MovieSubject, BaseItem>() {
@Override
public BaseItem apply(MovieSubject movieSubject) {
BaseItem<MovieSubject> baseItem = new BaseItem<>();
baseItem.setData(movieSubject);
return baseItem;
}
})
.toList()
//将 List 转为ArrayList 缓存存储 ArrayList Serializable对象
.map(new Function<List<BaseItem>, ArrayList<BaseItem>>() {
@Override
public ArrayList<BaseItem> apply(List<BaseItem> baseItems) {
ArrayList<BaseItem> items = new ArrayList<>();
items.addAll(baseItems);
DiskCacheManager manager = new DiskCacheManager(CustomApplication.getContext(), Constants.CACHE_DOUBAN_FILE);
manager.put(Constants.CACHE_DOUBAN_MOVIE, items);
return items;
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new SingleObserver<ArrayList<BaseItem>>() {
@Override
public void onError(Throwable e) {
mMovieListFrag.hideProgressBar();
mMovieListFrag.refreshFail(e.getMessage());
}
@Override
public void onSubscribe(Disposable d) {
addDisposable(d);
}
@Override
public void onSuccess(ArrayList<BaseItem> value) {
mMovieListFrag.hideProgressBar();
mMovieListFrag.refreshSucceed(value);
}
});
}
/**
* 对外提供的加载更多方法,当还未全部加载完的时候回去加载更多
*/
public void loadMoreData() {
if (!loadAllCompleted) {
loadMore();
}
}
/**
* 加载更多
*/
private void loadMore() {
ApiManager.getInstence().getDoubanService()
.getTop250(start, 20)
.flatMap(new Function<MovieTop250, ObservableSource<MovieSubject>>() {
@Override
public ObservableSource<MovieSubject> apply(MovieTop250 movieTop250) {
//刷新后下一次加载的起点为
start += movieTop250.getCount();
if (start == movieTop250.getTotal()) {
loadAllCompleted = true;
}
return Observable.fromIterable(movieTop250.getMovieSubjects());
}
})
.map(new Function<MovieSubject, BaseItem>() {
@Override
public BaseItem apply(MovieSubject movieSubject) {
BaseItem<MovieSubject> baseItem = new BaseItem<>();
baseItem.setData(movieSubject);
return baseItem;
}
})
.toList()
.map(new Function<List<BaseItem>, ArrayList<BaseItem>>() {
@Override
public ArrayList<BaseItem> apply(List<BaseItem> baseItems) {
ArrayList<BaseItem> items = new ArrayList<>();
items.addAll(baseItems);
return items;
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new SingleObserver<ArrayList<BaseItem>>() {
@Override
public void onError(Throwable e) {
mMovieListFrag.hideProgressBar();
mMovieListFrag.loadFail(e.getMessage());
}
@Override
public void onSubscribe(Disposable d) {
addDisposable(d);
}
@Override
public void onSuccess(ArrayList<BaseItem> value) {
mMovieListFrag.hideProgressBar();
if (value != null) {
mMovieListFrag.loadSuccessed(value);
} else {
mMovieListFrag.loadFail("null value");
}
}
});
}
/**
* 加载缓存
*/
public void loadCache() {
DiskCacheManager manager = new DiskCacheManager(CustomApplication.getContext(), Constants.CACHE_DOUBAN_FILE);
ArrayList<BaseItem> movieSubjects = manager.getSerializable(Constants.CACHE_DOUBAN_MOVIE);
if (movieSubjects != null) {
mMovieListFrag.refreshSucceed(movieSubjects);
}
}
}