/* * Copyright © 2012-2013 LiuZhongnan. All rights reserved. * * Email:qq81595157@126.com * * PROPRIETARY/CONFIDENTIAL. */ package com.youku.service.download; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; import android.content.Intent; import android.os.Handler; import android.os.HandlerThread; import android.os.Message; import android.widget.Toast; import com.baseproject.utils.Logger; import com.youku.player.YoukuPlayerConfiguration; import com.youku.player.ui.R; import com.youku.player.util.PlayerUtil; import com.youku.service.download.SDCardManager.SDCardInfo; /** * FileCreateThread.创建下载视频文件 * * @author 刘仲男 qq81595157@126.com * @version v3.5 * @created time 2012-10-15 下午4:03:24 */ public class FileCreateThread extends Thread { private static final String TAG = "Download_CreateRunnable"; private static final String pageName = "缓存模块"; private DownloadServiceManager download; // private Activity activity; /** 添加等待队列,防止重复添加 */ private ArrayList download_temp_infos; public static Map tempCreateData; private int successCount = 0; private int failCount = 0; private boolean hasMaryPaths = false; private static boolean isRunning = false; public static boolean isRunning() { return isRunning; } public FileCreateThread(String videoId, String videoName) { download = DownloadServiceManager.getInstance(); isRunning = true; if (download_temp_infos == null) download_temp_infos = new ArrayList(); if (tempCreateData == null) tempCreateData = new HashMap(); if (tempCreateData.containsKey(videoId)) { return; } DownloadInfo info; Logger.d(TAG, "title:" + videoName + "/vid:" + videoId); info = new DownloadInfo(); info.videoid = videoId; info.title = videoName; info.format = DownloadUtils.getDownloadFormat(); info.language = DownloadUtils.getDownloadLanguageName(); info.savePath = download.getCurrentDownloadSDCardPath() + YoukuPlayerConfiguration.getDownloadPath() + info.videoid + "/"; download_temp_infos.add(info); tempCreateData.put(info.videoid, ""); } public FileCreateThread(String[] vids, String[] titles) { download = DownloadServiceManager.getInstance(); isRunning = true; if (download_temp_infos == null) download_temp_infos = new ArrayList(); if (tempCreateData == null) tempCreateData = new HashMap(); int format = DownloadUtils.getDownloadFormat(); String language = DownloadUtils.getDownloadLanguageName(); String path = download.getCurrentDownloadSDCardPath(); DownloadInfo info; for (int i = 0, n = vids.length; i < n; i++) { Logger.d(TAG, "titles:" + titles[i] + "/vids:" + vids[i]); if (tempCreateData.containsKey(vids[i])) { continue; } info = new DownloadInfo(); info.title = titles[i]; info.videoid = vids[i]; info.format = format; info.language = language; info.savePath = path + YoukuPlayerConfiguration.getDownloadPath() + info.videoid + "/"; download_temp_infos.add(info); tempCreateData.put(info.videoid, ""); } } private void over() { YoukuPlayerConfiguration.context.sendBroadcast(new Intent( IDownload.ACTION_CREATE_DOWNLOAD_ALL_READY)); download_temp_infos.clear(); isRunning = false; } @Override public void run() { for (DownloadInfo info : download_temp_infos) { if (download.existsDownloadInfo(info.videoid)) { if (download.isDownloadFinished(info.videoid)) {// 已下载完成 PlayerUtil.showTips(R.string.download_exist_finished); } else { PlayerUtil.showTips(R.string.download_exist_not_finished); } continue; } long time = System.currentTimeMillis(); info.createTime = time; info.taskId = String.valueOf(time).substring(5);// 用时间戳做ID if (init(info)) { Logger.d("DownloadFlow","init() success"); download.addDownloadingInfo(info); switch (info.format) { case DownloadInfo.FORMAT_HD2: break; case DownloadInfo.FORMAT_MP4: break; default: break; } successCount++; YoukuPlayerConfiguration.context.sendBroadcast(new Intent( IDownload.ACTION_CREATE_DOWNLOAD_ONE_READY)); } else { Logger.d("DownloadFlow","init() fail"); failCount++; YoukuPlayerConfiguration.context.sendBroadcast(new Intent( IDownload.ACTION_CREATE_DOWNLOAD_ONE_FAILED)); if (info.getExceptionId() == DownloadInfo.EXCEPTION_NO_SPACE) {// 没有空间,提示切换空间 failCount = download_temp_infos.size() - successCount; ArrayList card = SDCardManager .getExternalStorageDirectory(); if (card != null && card.size() > 1) { hasMaryPaths = true; HandlerThread ht = new HandlerThread("handler_thread1"); ht.start(); new Handler(ht.getLooper()) { public void handleMessage(Message msg) { /* YoukuPlayerConfiguration.context .startActivity(new Intent( YoukuPlayerConfiguration.context, EmptyActivity.class) .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK));*/ Toast.makeText(YoukuPlayerConfiguration.context, "存储空间不足", Toast.LENGTH_SHORT).show(); }; }.sendEmptyMessageDelayed(0, 500L); } break; } continue; } } for (DownloadInfo info : download_temp_infos) { tempCreateData.remove(info.videoid); } showTips(); over(); HandlerThread ht = new HandlerThread("handler_thread2"); ht.start(); new Handler(ht.getLooper()) { public void handleMessage(Message msg) { Logger.d("DownloadFlow","FileCreateThread: create task to download"); download.startNewTask(); }; }.sendEmptyMessageDelayed(0, 1000L); super.run(); } private void showTips() { if (download_temp_infos.size() == successCount) {// 全部成功 PlayerUtil.showTips(R.string.download_add_success); return; } else if (download_temp_infos.size() == 1) {// 单个添加失败 if (hasMaryPaths == false) { String e = download_temp_infos.get(0).getExceptionInfo(); if (e != null && e.length() != 0){ PlayerUtil.showTips(e); Logger.e("DownloadFlow",e); } } return; } // 多个添加失败 int differenceFailCount = 0;// 不同错误的数量 int exceptionId = -1; for (DownloadInfo info : download_temp_infos) { if (info.getExceptionId() != 0) { if (info.getExceptionId() != exceptionId) { exceptionId = info.getExceptionId(); differenceFailCount++; } } } if (differenceFailCount == 1) {// 只有一种错误原因的 switch (exceptionId) { case DownloadInfo.EXCEPTION_NO_SDCARD: case DownloadInfo.EXCEPTION_NO_NETWORK: break; case DownloadInfo.EXCEPTION_NO_SPACE: if (hasMaryPaths == false) { String e = YoukuPlayerConfiguration.context.getResources().getString( R.string.download_many_fail_no_space); e = e.replace("S", String.valueOf(successCount)); e = e.replace("F", String.valueOf(failCount)); PlayerUtil.showTips(e); } break; case DownloadInfo.EXCEPTION_NO_COPYRIGHT: case DownloadInfo.EXCEPTION_NO_RESOURCES: case DownloadInfo.EXCEPTION_HTTP_NOT_FOUND: String e = YoukuPlayerConfiguration.context.getResources().getString( R.string.download_many_fail); e = e.replace("S", String.valueOf(successCount)); e = e.replace("F", String.valueOf(failCount)); PlayerUtil.showTips(e); break; case DownloadInfo.EXCEPTION_TIMEOUT: e = YoukuPlayerConfiguration.context.getResources().getString( R.string.download_many_fail_timeout); e = e.replace("S", String.valueOf(successCount)); e = e.replace("F", String.valueOf(failCount)); PlayerUtil.showTips(e); break; case DownloadInfo.EXCEPTION_WRITE_ERROR: case DownloadInfo.EXCEPTION_UNKNOWN_ERROR: e = YoukuPlayerConfiguration.context.getResources().getString( R.string.download_many_fail_unknown_error); e = e.replace("S", String.valueOf(successCount)); e = e.replace("F", String.valueOf(failCount)); PlayerUtil.showTips(e); break; default: break; } } else if (differenceFailCount > 1) {// 有两种不同错误以上 String s = YoukuPlayerConfiguration.context.getResources().getString( R.string.download_many_fail_unknown_error); s = s.replace("S", String.valueOf(successCount)); s = s.replace("F", String.valueOf(failCount)); PlayerUtil.showTips(s); } } private boolean init(final DownloadInfo info) { info.setState(DownloadInfo.STATE_INIT); if (!DownloadUtils.getDownloadData(info)) { return false; } if (!DownloadUtils.getVideoInfo(info)) { return false; } if (hasEnoughSpace(info.size)) { new Thread() { public void run() { DownloadUtils.createVideoThumbnail(info.imgUrl, info.savePath); }; }.start(); DownloadUtils.makeM3U8File(info); } else { info.setExceptionId(DownloadInfo.EXCEPTION_NO_SPACE); return false; } if (!DownloadUtils.makeDownloadInfoFile(info)) { return false; } Logger.d("DownloadFlow","FileCreateThread: init() end: return true"); info.downloadListener = new DownloadListenerImpl(YoukuPlayerConfiguration.context, info); return true; } /*** * 是否有足够的空间 * * @param needSpace * @return */ @SuppressWarnings("rawtypes") private boolean hasEnoughSpace(long needSpace) { String savePath = download.getCurrentDownloadSDCardPath(); SDCardManager m = new SDCardManager(savePath); if (!m.exist()) return false; // 下载中的视频还需要的空间 long needsize = 0L; Map data = download.getDownloadingData(); Iterator iter = data.entrySet().iterator(); // 获得map的Iterator while (iter.hasNext()) { Entry entry = (Entry) iter.next(); DownloadInfo info = (DownloadInfo) entry.getValue(); if (info.savePath.contains(savePath)) { needsize += (info.size - info.downloadedSize); } } // 未使用的剩余空间-未完成的视频所需空间-新视频所需空间 if (savePath.equals(SDCardManager.getDefauleSDCardPath())) { if ((m.getFreeSize() - needsize - needSpace) < 100 * 1024 * 1024) { return false;// SD卡空间不足 } } else { if ((m.getFreeSize() - needsize - needSpace) < 100 * 1024 * 1024) { return false;// SD卡空间不足 } } return true; } }