package com.dl7.mvp.module.news.channel;
import com.dl7.mvp.local.dao.NewsTypeDao;
import com.dl7.mvp.local.table.NewsTypeInfo;
import com.dl7.mvp.local.table.NewsTypeInfoDao;
import com.dl7.mvp.rxbus.RxBus;
import com.dl7.mvp.rxbus.event.ChannelEvent;
import com.orhanobut.logger.Logger;
import java.util.ArrayList;
import java.util.List;
import rx.Observable;
import rx.Subscriber;
import rx.android.schedulers.AndroidSchedulers;
import rx.functions.Action0;
import rx.functions.Func1;
import rx.schedulers.Schedulers;
/**
* Created by long on 2016/9/1.
* 栏目管理 Presenter
*/
public class ChannelPresenter implements IChannelPresenter<NewsTypeInfo> {
private final IChannelView mView;
private final NewsTypeInfoDao mDbDao;
private final RxBus mRxBus;
public ChannelPresenter(IChannelView view, NewsTypeInfoDao dbDao, RxBus rxBus) {
mView = view;
mDbDao = dbDao;
mRxBus = rxBus;
}
@Override
public void getData(boolean isRefresh) {
// 从数据库获取
final List<NewsTypeInfo> checkList = mDbDao.queryBuilder().list();
final List<String> typeList = new ArrayList<>();
for (NewsTypeInfo bean : checkList) {
typeList.add(bean.getTypeId());
}
Observable.from(NewsTypeDao.getAllChannels())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.filter(new Func1<NewsTypeInfo, Boolean>() {
@Override
public Boolean call(NewsTypeInfo newsTypeBean) {
// 过滤掉已经选中的栏目
return !typeList.contains(newsTypeBean.getTypeId());
}
})
.toList()
.subscribe(new Subscriber<List<NewsTypeInfo>>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
Logger.e(e.toString());
}
@Override
public void onNext(List<NewsTypeInfo> uncheckList) {
mView.loadData(checkList, uncheckList);
}
});
}
@Override
public void getMoreData() {
}
@Override
public void insert(final NewsTypeInfo data) {
mDbDao.rx().insert(data)
.subscribeOn(Schedulers.io())
.subscribe(new Subscriber<NewsTypeInfo>() {
@Override
public void onCompleted() {
mRxBus.post(new ChannelEvent(ChannelEvent.ADD_EVENT, data));
}
@Override
public void onError(Throwable e) {
Logger.e(e.toString());
}
@Override
public void onNext(NewsTypeInfo newsTypeBean) {
Logger.w(newsTypeBean.toString());
}
});
}
@Override
public void delete(final NewsTypeInfo data) {
mDbDao.rx().delete(data)
.subscribeOn(Schedulers.io())
.subscribe(new Subscriber<Void>() {
@Override
public void onCompleted() {
mRxBus.post(new ChannelEvent(ChannelEvent.DEL_EVENT, data));
}
@Override
public void onError(Throwable e) {
Logger.e(e.toString());
}
@Override
public void onNext(Void aVoid) {
}
});
}
@Override
public void update(List<NewsTypeInfo> list) {
// 这做法不太妥当,而且列表在交互位置时可能产生很多无用的交互没处理掉,暂时没想到简便的方法来处理,以后有想法再改。
Observable.from(list)
.doOnSubscribe(new Action0() {
@Override
public void call() {
// 清空数据库
mDbDao.deleteAll();
}
})
.subscribeOn(Schedulers.io())
.subscribe(new Subscriber<NewsTypeInfo>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
Logger.e(e.toString());
}
@Override
public void onNext(NewsTypeInfo newsTypeBean) {
// 把ID清除再加入数据库会从新按列表顺序递增ID
newsTypeBean.setId(null);
mDbDao.save(newsTypeBean);
}
});
}
@Override
public void swap(int fromPos, int toPos) {
mRxBus.post(new ChannelEvent(ChannelEvent.SWAP_EVENT, fromPos, toPos));
}
}