package com.dl7.mvp.engine;
import android.text.TextUtils;
import com.dl7.downloaderlib.DownloadListener;
import com.dl7.downloaderlib.FileDownloader;
import com.dl7.downloaderlib.entity.FileInfo;
import com.dl7.downloaderlib.model.DownloadStatus;
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.StringUtils;
import com.orhanobut.logger.Logger;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
/**
* Created by long on 2016/12/16.
* 下载器封装
*/
public final class DownloaderWrapper {
private static List<VideoInfo> sDLVideoList = new ArrayList<>();
private static RxBus sRxBus;
private static VideoInfoDao sDbDao;
private DownloaderWrapper() {
throw new AssertionError();
}
public static void init(RxBus rxBus, VideoInfoDao videoInfoDao) {
sRxBus = rxBus;
sDbDao = videoInfoDao;
}
/**
* 开始下载
* @param info
*/
public static void start(VideoInfo info) {
// 在真正处理前状态设为等待
info.setDownloadStatus(DownloadStatus.WAIT);
// 有高清就用高清的,没有用另一个
if (TextUtils.isEmpty(info.getMp4Hd_url())) {
info.setVideoUrl(info.getMp4_url());
} else {
info.setVideoUrl(info.getMp4Hd_url());
}
// 插入或更新
sDbDao.insertOrReplace(info);
sDLVideoList.add(info);
// 通知 Video 主界面刷新下载数
sRxBus.post(new VideoEvent());
// 启动下载
FileDownloader.start(info.getVideoUrl(), StringUtils.clipFileName(info.getVideoUrl()), new ListenerWrapper());
}
/**
* 暂停下载
* @param info
*/
public static void stop(VideoInfo info) {
FileDownloader.stop(info.getVideoUrl());
}
/**
* 取消下载,不会删除已下载完的文件
*
* @param info
*/
public static void cancel(VideoInfo info) {
FileDownloader.cancel(info.getVideoUrl());
// 删除
sDbDao.delete(info);
// 通知 Video 主界面刷新下载数
sRxBus.post(new VideoEvent());
// 通知缓存列表
sRxBus.post(new FileInfo(DownloadStatus.CANCEL, info.getVideoUrl(),
StringUtils.clipFileName(info.getVideoUrl()), (int) info.getTotalSize()));
sDLVideoList.remove(_findApp(info.getVideoUrl()));
}
/**
* 删除会把下载完成的文件清除
* @param info
*/
public static void delete(VideoInfo info) {
// 路径要在 FileDownloader.cancel 前获取
String path = FileDownloader.getFilePathByUrl(info.getVideoUrl());
FileDownloader.cancel(info.getVideoUrl());
// 删除
sDbDao.delete(info);
// 通知 Video 主界面刷新下载数
sRxBus.post(new VideoEvent());
sDLVideoList.remove(_findApp(info.getVideoUrl()));
File file = new File(path);
if (file.exists()) {
file.delete();
}
}
/**
* 监听器封装类
*/
static class ListenerWrapper implements DownloadListener {
@Override
public void onStart(FileInfo fileInfo) {
_updateVideoInfo(fileInfo);
sRxBus.post(fileInfo);
}
@Override
public void onUpdate(FileInfo fileInfo) {
_updateVideoInfo(fileInfo);
sRxBus.post(fileInfo);
}
@Override
public void onStop(FileInfo fileInfo) {
_updateVideoInfo(fileInfo);
sRxBus.post(fileInfo);
sDLVideoList.remove(_findApp(fileInfo.getUrl()));
}
@Override
public void onComplete(FileInfo fileInfo) {
_updateVideoInfo(fileInfo);
sRxBus.post(fileInfo);
// 通知 Video 主界面刷新下载数
sRxBus.post(new VideoEvent());
Logger.e("onComplete " + fileInfo.toString());
}
@Override
public void onCancel(FileInfo fileInfo) {
_updateVideoInfo(fileInfo);
sRxBus.post(fileInfo);
sDLVideoList.remove(_findApp(fileInfo.getUrl()));
}
@Override
public void onError(FileInfo fileInfo, String s) {
_updateVideoInfo(fileInfo);
Logger.e(s);
sRxBus.post(fileInfo);
}
}
/**
* 查找APP
*
* @param url url
* @return
*/
private static VideoInfo _findApp(String url) {
for (VideoInfo appInfo : sDLVideoList) {
if (appInfo.getVideoUrl().equals(url)) {
return appInfo;
}
}
return null;
}
/**
* 更新数据
*
* @param fileInfo 文件信息
*/
private static void _updateVideoInfo(FileInfo fileInfo) {
VideoInfo info = _findApp(fileInfo.getUrl());
if (info != null) {
if (fileInfo.getTotalBytes() != 0) {
info.setTotalSize(fileInfo.getTotalBytes());
info.setLoadedSize(fileInfo.getLoadBytes());
info.setDownloadSpeed(fileInfo.getSpeed());
}
info.setDownloadStatus(fileInfo.getStatus());
sDbDao.update(info);
}
}
}