package com.dl7.mvp.module.video.player; import com.dl7.downloaderlib.model.DownloadStatus; import com.dl7.mvp.local.table.DanmakuInfo; import com.dl7.mvp.local.table.DanmakuInfoDao; import com.dl7.mvp.local.table.VideoInfo; import com.dl7.mvp.local.table.VideoInfoDao; import com.dl7.mvp.rxbus.RxBus; import com.dl7.mvp.rxbus.event.VideoEvent; import com.dl7.mvp.utils.GsonHelper; import java.io.ByteArrayInputStream; import java.io.InputStream; import java.util.List; import rx.android.schedulers.AndroidSchedulers; import rx.functions.Action1; import rx.functions.Func1; /** * Created by long on 2016/11/30. * Video Presenter */ public class VideoPlayerPresenter implements IVideoPresenter { private final IVideoView mView; private final VideoInfoDao mDbDao; private final RxBus mRxBus; private final VideoInfo mVideoData; private final DanmakuInfoDao mDanmakuDao; // 是否数据库有记录 private boolean mIsContains = false; public VideoPlayerPresenter(IVideoView view, VideoInfoDao dbDao, RxBus rxBus, VideoInfo videoData, DanmakuInfoDao danmakuDao) { mView = view; mDbDao = dbDao; mRxBus = rxBus; mVideoData = videoData; mDanmakuDao = danmakuDao; mIsContains = mDbDao.queryBuilder().list().contains(videoData); } @Override public void getData(boolean isRefresh) { mDbDao.queryBuilder().rx() .oneByOne() .filter(new Func1<VideoInfo, Boolean>() { @Override public Boolean call(VideoInfo videoBean) { return mVideoData.equals(videoBean); } }) .observeOn(AndroidSchedulers.mainThread()) .compose(mView.<VideoInfo>bindToLife()) .subscribe(new Action1<VideoInfo>() { @Override public void call(VideoInfo videoBean) { mIsContains = true; mView.loadData(videoBean); } }); mDanmakuDao.queryBuilder().where(DanmakuInfoDao.Properties.Vid.eq(mVideoData.getVid())) .rx() .list() .map(new Func1<List<DanmakuInfo>, InputStream>() { @Override public InputStream call(List<DanmakuInfo> danmakuInfos) { // 有同志提交了关于 Gson 解析的问题处理,这里去掉之前的 Fastjson // String jsonStr = JSON.toJSONString(danmakuInfos); String jsonStr = GsonHelper.object2JsonStr(danmakuInfos); // 将 String 转为 InputStream InputStream inputStream = new ByteArrayInputStream(jsonStr.getBytes()); return inputStream; } }) .compose(mView.<InputStream>bindToLife()) .subscribe(new Action1<InputStream>() { @Override public void call(InputStream inputStream) { mView.loadDanmakuData(inputStream); } }); } @Override public void getMoreData() { } @Override public void insert(VideoInfo data) { if (mIsContains) { mDbDao.update(data); } else { mDbDao.insert(data); } mRxBus.post(new VideoEvent()); } @Override public void delete(VideoInfo data) { if (!data.isCollect() && data.getDownloadStatus() == DownloadStatus.NORMAL) { mDbDao.delete(data); mIsContains = false; } else { mDbDao.update(data); } mRxBus.post(new VideoEvent()); } @Override public void update(List<VideoInfo> list) { } @Override public void addDanmaku(DanmakuInfo danmakuInfo) { mDanmakuDao.insert(danmakuInfo); } @Override public void cleanDanmaku() { mDanmakuDao.queryBuilder().where(DanmakuInfoDao.Properties.Vid.eq(mVideoData.getVid())) .rx() .list() .compose(mView.<List<DanmakuInfo>>bindToLife()) .subscribe(new Action1<List<DanmakuInfo>>() { @Override public void call(List<DanmakuInfo> danmakuInfos) { mDanmakuDao.deleteInTx(danmakuInfos); } }); } }