Browse Source

YCVideoPlayer

yangchong 7 years ago
parent
commit
e80aa5e6c6
25 changed files with 2841 additions and 162 deletions
  1. 1 3
      app/build.gradle
  2. 1 0
      app/src/main/AndroidManifest.xml
  3. 1 3
      app/src/main/java/org/yczbj/ycvideoplayer/download/TasksManager.java
  4. 0 1
      app/src/main/java/org/yczbj/ycvideoplayer/ui/home/presenter/VideoPlayerMePresenter.java
  5. 3 4
      app/src/main/java/org/yczbj/ycvideoplayer/ui/home/view/activity/VideoPlayerMeActivity.java
  6. 133 0
      app/src/main/java/org/yczbj/ycvideoplayer/ui/me/view/MeCacheActivity.java
  7. 577 0
      app/src/main/java/org/yczbj/ycvideoplayer/ui/me/view/adapter/MeCacheAdapter.java
  8. 0 114
      app/src/main/java/org/yczbj/ycvideoplayer/ui/test2/MyVideoPlayer.java
  9. 4 2
      app/src/main/java/org/yczbj/ycvideoplayer/ui/test3/download/DLTasksManager.java
  10. 3 3
      app/src/main/java/org/yczbj/ycvideoplayer/ui/test3/download/DLTasksManagerModel.java
  11. 405 0
      app/src/main/java/org/yczbj/ycvideoplayer/ui/test3/download2/DlCacheTasksManager.java
  12. 403 0
      app/src/main/java/org/yczbj/ycvideoplayer/ui/test3/download2/DlTasksManager.java
  13. 155 0
      app/src/main/java/org/yczbj/ycvideoplayer/ui/test3/download2/DlTasksManagerDBController.java
  14. 95 0
      app/src/main/java/org/yczbj/ycvideoplayer/ui/test3/download2/DlTasksManagerDBOpenHelper.java
  15. 101 0
      app/src/main/java/org/yczbj/ycvideoplayer/ui/test3/download2/DlTasksManagerModel.java
  16. 0 9
      app/src/main/java/org/yczbj/ycvideoplayer/ui/test3/ui/activity/DLManyTestActivity.java
  17. 134 5
      app/src/main/java/org/yczbj/ycvideoplayer/ui/test3/ui/activity/DLMyFileTestActivity.java
  18. 12 3
      app/src/main/java/org/yczbj/ycvideoplayer/ui/test3/ui/adapter/DLManyAdapter.java
  19. 566 0
      app/src/main/java/org/yczbj/ycvideoplayer/ui/test3/ui/adapter/DlMyFileAdapter.java
  20. 36 0
      app/src/main/res/layout/activity_me_cache.xml
  21. 29 0
      app/src/main/res/layout/activity_test_dl_my.xml
  22. 1 1
      app/src/main/res/layout/dialog_bottom_list_view.xml
  23. 2 14
      app/src/main/res/layout/item_dialog_list_view.xml
  24. 93 0
      app/src/main/res/layout/item_down_list_view.xml
  25. 86 0
      app/src/main/res/layout/item_me_cache_data.xml

+ 1 - 3
app/build.gradle

@@ -37,8 +37,6 @@ dependencies {
     compile 'com.android.support:recyclerview-v7:25.3.1'
     compile 'com.android.support:design:25.3.1'
     compile 'com.android.support:cardview-v7:25.3.1'
-    compile 'com.android.support:palette-v7:25.3.1'
-    compile 'com.android.support:percent:25.3.1'
     compile 'com.android.support:support-annotations:25.3.1'
     compile 'com.android.support:multidex:1.0.1'
 
@@ -77,7 +75,7 @@ dependencies {
     compile 'cn.yc:YCBannerLib:1.2'                                 //轮播图
     compile 'org.yczbj:YCRefreshViewLib:2.1'                        //RecyclerView封装
     compile 'cn.yc:YCBaseAdapterLib:1.2'                            //adapter封装
-    compile 'cn.yc:YCDialogLib:3.3'                                 //弹窗
+    compile 'cn.yc:YCDialogLib:3.4'                                 //弹窗
     compile 'cn.yc:YCProgressLib:1.2'                               //进度条
     compile 'cn.yc:YCVideoPlayerLib:2.3'                            //播放器
     //compile project(':YCVideoPlayerLib')

+ 1 - 0
app/src/main/AndroidManifest.xml

@@ -30,6 +30,7 @@
             android:screenOrientation="portrait"/>
         <activity android:name=".ui.me.view.MeLoginActivity" />
         <activity android:name=".ui.me.view.MeMemberActivity"/>
+        <activity android:name=".ui.me.view.MeCacheActivity"/>
 
 
 

+ 1 - 3
app/src/main/java/org/yczbj/ycvideoplayer/download/TasksManager.java

@@ -94,7 +94,7 @@ public class TasksManager {
         task.setTag(holder);
     }
 
-    public void releaseTask() {
+    private void releaseTask() {
         taskSparseArray.clear();
     }
 
@@ -202,7 +202,6 @@ public class TasksManager {
         if (TextUtils.isEmpty(url) || TextUtils.isEmpty(path)) {
             return null;
         }
-
         final int id = FileDownloadUtils.generateId(url, path);
         TasksManagerModel model = getById(id);
         if (model != null) {
@@ -212,7 +211,6 @@ public class TasksManager {
         if (newModel != null) {
             modelList.add(newModel);
         }
-
         return newModel;
     }
 

+ 0 - 1
app/src/main/java/org/yczbj/ycvideoplayer/ui/home/presenter/VideoPlayerMePresenter.java

@@ -6,7 +6,6 @@ import android.support.v7.widget.LinearLayoutManager;
 import android.support.v7.widget.RecyclerView;
 
 import com.flyco.tablayout.listener.CustomTabEntity;
-import com.pedaily.yc.ycdialoglib.bottomLayout.BottomDialog;
 
 import org.yczbj.ycvideoplayer.R;
 import org.yczbj.ycvideoplayer.ui.home.contract.VideoPlayerMeContract;

+ 3 - 4
app/src/main/java/org/yczbj/ycvideoplayer/ui/home/view/activity/VideoPlayerMeActivity.java

@@ -21,7 +21,7 @@ import android.widget.TextView;
 
 import com.blankj.utilcode.util.ScreenUtils;
 import com.blankj.utilcode.util.SizeUtils;
-import com.pedaily.yc.ycdialoglib.bottomLayout.BottomDialog;
+import com.pedaily.yc.ycdialoglib.bottomLayout.BottomDialogFragment;
 import com.pedaily.yc.ycdialoglib.toast.ToastUtil;
 
 import org.yczbj.ycrefreshviewlib.YCRefreshView;
@@ -368,14 +368,13 @@ public class VideoPlayerMeActivity extends BaseActivity implements VideoPlayerMe
                     "name","title",ConstantVideo.VideoPlayerList[a]);
             list.add(dialogListBean);
         }
-        BottomDialog.create(getSupportFragmentManager())
-            .setViewListener(new BottomDialog.ViewListener() {
+        BottomDialogFragment.create(getSupportFragmentManager())
+            .setViewListener(new BottomDialogFragment.ViewListener() {
                 @Override
                 public void bindView(View v) {
                     RecyclerView recyclerView = (RecyclerView) v.findViewById(R.id.recyclerView);
                     ImageView ivCancel = (ImageView) v.findViewById(R.id.iv_cancel);
                     ImageView ivDownload = (ImageView) v.findViewById(R.id.iv_download);
-                    ivCancel.setVisibility(View.GONE);
 
                     recyclerView.setLayoutManager(new LinearLayoutManager(VideoPlayerMeActivity.this));
                     DialogListAdapter mAdapter = new DialogListAdapter(VideoPlayerMeActivity.this, list);

+ 133 - 0
app/src/main/java/org/yczbj/ycvideoplayer/ui/me/view/MeCacheActivity.java

@@ -0,0 +1,133 @@
+package org.yczbj.ycvideoplayer.ui.me.view;
+
+import android.graphics.Color;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.view.View;
+import android.widget.Button;
+import android.widget.LinearLayout;
+
+import com.blankj.utilcode.util.SizeUtils;
+import com.pedaily.yc.ycdialoglib.toast.ToastUtil;
+
+import org.yczbj.ycrefreshviewlib.item.RecycleViewItemLine;
+import org.yczbj.ycrefreshviewlib.swipeMenu.OnSwipeMenuListener;
+import org.yczbj.ycvideoplayer.R;
+import org.yczbj.ycvideoplayer.base.BaseActivity;
+import org.yczbj.ycvideoplayer.ui.me.view.adapter.MeCacheAdapter;
+import org.yczbj.ycvideoplayer.ui.test3.download2.DlTasksManager;
+import org.yczbj.ycvideoplayer.ui.test3.download2.DlTasksManagerModel;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import butterknife.Bind;
+
+/**
+ * Created by yc on 2018/1/18.
+ */
+
+public class MeCacheActivity extends BaseActivity implements View.OnClickListener {
+
+    @Bind(R.id.btn_1)
+    Button btn1;
+    @Bind(R.id.btn_2)
+    Button btn2;
+    @Bind(R.id.btn_3)
+    Button btn3;
+    @Bind(R.id.recyclerView)
+    RecyclerView recyclerView;
+
+    List<DlTasksManagerModel> mList = new ArrayList<>();
+
+    /**
+     * 正在下载
+     */
+    private List<DlTasksManagerModel> downloadingList = new ArrayList<>();
+    /**
+     * 已经下载完成的数据
+     */
+    private List<DlTasksManagerModel> downloadedList = new ArrayList<>();
+    private MeCacheAdapter adapter;
+
+    @Override
+    public int getContentView() {
+        return R.layout.activity_me_cache;
+    }
+
+    @Override
+    public void initView() {
+        initRecyclerView();
+    }
+
+    @Override
+    public void initListener() {
+        btn1.setOnClickListener(this);
+        btn2.setOnClickListener(this);
+        btn3.setOnClickListener(this);
+        adapter.setOnSwipeMenuListener(new OnSwipeMenuListener() {
+            @Override
+            public void toDelete(int position) {
+                ToastUtil.showToast(MeCacheActivity.this,"删除");
+            }
+
+            @Override
+            public void toTop(int position) {
+                ToastUtil.showToast(MeCacheActivity.this,"置顶");
+            }
+        });
+    }
+
+    @Override
+    public void initData() {
+        getData();
+    }
+
+    @Override
+    public void onClick(View v) {
+        switch (v.getId()){
+            case R.id.btn_1:
+
+                break;
+            case R.id.btn_2:
+
+                break;
+            case R.id.btn_3:
+
+                break;
+            default:
+                break;
+        }
+    }
+
+
+    private void initRecyclerView() {
+        recyclerView.setLayoutManager(new LinearLayoutManager(this));
+        final RecycleViewItemLine line = new RecycleViewItemLine(this, LinearLayout.HORIZONTAL,
+                SizeUtils.dp2px(1), Color.parseColor("#f5f5f7"));
+        recyclerView.addItemDecoration(line);
+        adapter = new MeCacheAdapter(this,mList);
+        recyclerView.setAdapter(adapter);
+    }
+
+
+    private void getData() {
+        downloadingList = DlTasksManager.getImpl().getModelList();
+        downloadedList = DlTasksManager.getImpl().getDownloadedlList();
+        //正在下载的数据
+        if(downloadingList.size()>0){
+            adapter.clear();
+            adapter.addAll(downloadingList);
+        }else {
+            ToastUtil.showToast(this,"没有正在缓冲数据");
+        }
+        //已经下载完成的数据
+        if(downloadedList.size()>0){
+            adapter.addAll(downloadedList);
+        }
+        adapter.notifyDataSetChanged();
+    }
+
+
+
+}

+ 577 - 0
app/src/main/java/org/yczbj/ycvideoplayer/ui/me/view/adapter/MeCacheAdapter.java

@@ -0,0 +1,577 @@
+package org.yczbj.ycvideoplayer.ui.me.view.adapter;
+
+import android.annotation.SuppressLint;
+import android.app.Activity;
+import android.content.Context;
+import android.support.v7.widget.RecyclerView;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.Button;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.ProgressBar;
+import android.widget.TextView;
+
+import com.liulishuo.filedownloader.BaseDownloadTask;
+import com.liulishuo.filedownloader.FileDownloadListener;
+import com.liulishuo.filedownloader.FileDownloadSampleListener;
+import com.liulishuo.filedownloader.FileDownloader;
+import com.liulishuo.filedownloader.model.FileDownloadStatus;
+import com.liulishuo.filedownloader.util.FileDownloadUtils;
+import com.ns.yc.ycprogresslib.CircleProgressbar;
+import com.pedaily.yc.ycdialoglib.toast.ToastUtil;
+
+import org.yczbj.ycrefreshviewlib.swipeMenu.OnSwipeMenuListener;
+import org.yczbj.ycvideoplayer.R;
+import org.yczbj.ycvideoplayer.download.TasksManager;
+import org.yczbj.ycvideoplayer.listener.OnListItemClickListener;
+import org.yczbj.ycvideoplayer.ui.test3.download2.DlCacheTasksManager;
+import org.yczbj.ycvideoplayer.ui.test3.download2.DlTasksManagerModel;
+
+import java.io.File;
+import java.lang.ref.WeakReference;
+import java.util.List;
+
+import butterknife.Bind;
+import butterknife.ButterKnife;
+
+
+public class MeCacheAdapter extends RecyclerView.Adapter<MeCacheAdapter.ViewHolder> {
+
+
+    private LayoutInflater inflater;
+    private List<DlTasksManagerModel> mList;
+    private Context mContext;
+    private OnListItemClickListener onItemClickListener;
+
+    public MeCacheAdapter(Context mContext, List<DlTasksManagerModel> mList) {
+        this.mList = mList;
+        this.mContext = mContext;
+        inflater = LayoutInflater.from(mContext);
+        //1.一定要添加这一步
+        DlCacheTasksManager.getImpl().onCreate(new WeakReference<>(this));
+    }
+
+    @Override
+    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+        return new ViewHolder(inflater.inflate(R.layout.item_me_cache_data, parent, false));
+    }
+
+    @Override
+    public void onBindViewHolder(ViewHolder holder, @SuppressLint("RecyclerView") final int position) {
+        if(mList==null || mList.size()<=0){
+            return;
+        }
+        DlTasksManagerModel model = mList.get(position);
+        //获取下载链接
+        String url = model.getUrl();
+        //通过下载链接创建下载路径
+        final String path = DlCacheTasksManager.getImpl().createPath(url);
+        //通过下载链接创建下载id
+        int id = DlCacheTasksManager.getImpl().getId(url);
+        holder.update(id, position, model);
+        DlCacheTasksManager.getImpl().updateViewHolder(holder.id, holder);
+
+
+        holder.ivImage.setTag(holder);
+        holder.ivDownload.setTag(R.drawable.ic_player_start);
+        holder.ivImage.setOnClickListener(taskActionOnClickListener);
+
+        holder.tvName.setText(model.getName());
+        holder.ivDownload.setBackgroundResource(R.drawable.ic_player_start);
+
+
+        //条目点击事件
+        holder.itemView.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                if (onItemClickListener != null) {
+                    onItemClickListener.onItemClick(view, position);
+                }
+            }
+        });
+
+        View.OnClickListener clickListener = new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                switch (v.getId()) {
+                    case R.id.btn_del:
+                        if (null != listener) {
+                            listener.toDelete(position);
+                        }
+                        break;
+                    case R.id.btn_top:
+                        if (null != listener) {
+                            listener.toTop(position);
+                        }
+                        break;
+                    default:
+                        break;
+                }
+            }
+        };
+
+        holder.btnDel.setOnClickListener(clickListener);
+        holder.btnTop.setOnClickListener(clickListener);
+
+
+        if (DlCacheTasksManager.getImpl().isReady()) {
+            final int status = DlCacheTasksManager.getImpl().getStatus(id, path);
+            if (status == FileDownloadStatus.pending || status == FileDownloadStatus.started || status == FileDownloadStatus.connected) {
+                // start task, but file not created yet
+                //当下载在排队中,开始下载,或者链接下载时,则开始调用更新下载进度和状态的方法
+                long soFar = DlCacheTasksManager.getImpl().getSoFar(id);
+                //使用{code id}获取任务目标文件的总字节。
+                long total = DlCacheTasksManager.getImpl().getTotal(id);
+                holder.updateDownloading(status, soFar, total);
+            } else if (!new File(path).exists() && !new File(FileDownloadUtils.getTempPath(path)).exists()) {
+                // not exist file
+                //当下载文件夹不存在,并且下载路径不存在时,直接调用下载错误方法
+                holder.updateNotDownloaded(status, 0, 0);
+            } else if (DlCacheTasksManager.getImpl().isDownloaded(status)) {
+                // already downloaded and exist
+                //获取下载的状态是否下载完成,如果完成,则调用该方法
+                holder.updateDownloaded();
+            } else if (status == FileDownloadStatus.progress) {
+                //当下载在排队中,开始下载,或者链接下载时,则开始调用更新下载进度和状态的方法
+                long soFar = DlCacheTasksManager.getImpl().getSoFar(id);
+                //使用{code id}获取任务目标文件的总字节。
+                long total = DlCacheTasksManager.getImpl().getTotal(id);
+                // downloading
+                holder.updateDownloading(status, soFar, total);
+            } else {
+                // not start
+                //当下载在排队中,开始下载,或者链接下载时,则开始调用更新下载进度和状态的方法
+                long soFar = DlCacheTasksManager.getImpl().getSoFar(id);
+                //使用{code id}获取任务目标文件的总字节。
+                long total = DlCacheTasksManager.getImpl().getTotal(id);
+                holder.updateNotDownloaded(status, soFar, total);
+            }
+        } else {
+            //状态: 加载中...
+        }
+    }
+
+
+    @Override
+    public int getItemCount() {
+        return mList==null ? 0 : mList.size();
+    }
+
+
+    public void postNotifyDataChanged() {
+        ((Activity) mContext).runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                notifyDataSetChanged();
+            }
+        });
+    }
+
+    public void clear() {
+        if (mList != null) {
+            mList.clear();
+        }
+    }
+
+    public void addAll(List<DlTasksManagerModel> downloadingList) {
+        if (mList != null) {
+            mList.addAll(downloadingList);
+        }
+    }
+
+
+    public class ViewHolder extends RecyclerView.ViewHolder {
+
+        @Bind(R.id.iv_image)
+        ImageView ivImage;
+        @Bind(R.id.iv_download)
+        ImageView ivDownload;
+        @Bind(R.id.tv_name)
+        TextView tvName;
+        @Bind(R.id.tv_state)
+        TextView tvState;
+        @Bind(R.id.pb)
+        ProgressBar pb;
+        @Bind(R.id.btn_del)
+        Button btnDel;
+        @Bind(R.id.btn_top)
+        Button btnTop;
+        /**
+         * viewHolder position
+         */
+        private int position;
+        /**
+         * download id
+         */
+        private int id;
+        /**
+         * 数据
+         */
+        private DlTasksManagerModel model;
+
+
+        ViewHolder(View itemView) {
+            super(itemView);
+            ButterKnife.bind(this, itemView);
+        }
+
+        public void update(final int id, final int position, DlTasksManagerModel model) {
+            this.id = id;
+            this.position = position;
+            this.model = model;
+        }
+
+        void updateDownloaded() {
+            //当下载完成后,隐藏圆环控件,显示删除图标
+            ivDownload.setBackgroundResource(R.drawable.icon_cache_delete);
+            tvState.setText("下载完成");
+            ivDownload.setTag(R.drawable.icon_cache_delete);
+
+            pb.setMax(1);
+            pb.setProgress(1);
+
+            //TODO 当下载完成以后,就把下载完的数据保存起来
+            DlCacheTasksManager.getImpl().deleteTasksManagerModel(model.getUrl());
+            if (!DlCacheTasksManager.getImpl().isExistDownloadFile(model.getUrl())) {
+                DlCacheTasksManager.getImpl().addDownloaded(model);
+                ToastUtil.showToast(mContext, "添加下载完成数据成功");
+            }
+        }
+
+        @SuppressLint("DefaultLocale")
+        void updateNotDownloaded(int status, long sofar, long total) {
+            if (sofar > 0 && total > 0) {
+                final float percent = sofar / (float) total;
+                pb.setMax(100);
+                pb.setProgress((int) (percent * 100));
+            } else {
+                pb.setMax(1);
+                pb.setProgress(0);
+            }
+            switch (status) {
+                case FileDownloadStatus.error:
+                    ivDownload.setBackgroundResource(R.drawable.ic_player_start);
+                    tvState.setText("错误");
+                    break;
+                case FileDownloadStatus.paused:
+                    //tvVideoSize.setText(String.format("%dMB", total / 1024 / 1024));
+                    ivDownload.setBackgroundResource(R.drawable.ic_player_start);
+                    tvState.setText("暂停");
+                    break;
+                default:
+                    ivDownload.setBackgroundResource(R.drawable.ic_player_start);
+                    break;
+            }
+            ivDownload.setTag(R.drawable.ic_player_start);
+        }
+
+
+        void updateDownloading(int status, long sofar, long total) {
+            final float percent = sofar / (float) total;
+            switch (status) {
+                case FileDownloadStatus.pending:
+                    tvState.setText("排队中");
+                    ivDownload.setBackgroundResource(R.drawable.ic_player_start);
+                    break;
+                case FileDownloadStatus.started:
+                    tvState.setText("开始下载");
+                    ivDownload.setBackgroundResource(R.drawable.ic_player_start);
+                    break;
+                case FileDownloadStatus.connected:
+                    tvState.setText("链接中");
+                    ivDownload.setBackgroundResource(R.drawable.ic_player_start);
+                    break;
+                case FileDownloadStatus.progress:
+                    tvState.setText("下载中");
+                    ivDownload.setBackgroundResource(R.drawable.ic_player_pause);
+                    break;
+                default:
+                    ivDownload.setBackgroundResource(R.drawable.ic_player_pause);
+                    break;
+            }
+            pb.setMax(100);
+            pb.setProgress((int) (percent * 100));
+            ivDownload.setTag(R.drawable.ic_player_pause);
+        }
+    }
+
+
+    /**
+     * 处理点击事件
+     */
+    private View.OnClickListener taskActionOnClickListener = new View.OnClickListener() {
+        @Override
+        public void onClick(View v) {
+            if (v.getTag() == null) {
+                return;
+            }
+
+            ViewHolder holder = (ViewHolder) v.getTag();
+            int res = (int) holder.ivDownload.getTag();
+            int play = R.drawable.ic_player_pause;
+            int delete = R.drawable.icon_cache_delete;
+            int download = R.drawable.ic_player_start;
+
+            DlTasksManagerModel model = mList.get(holder.position);
+            if (res == play) {
+                //暂停
+                ToastUtil.showToast(mContext, "暂停");
+                FileDownloader.getImpl().pause(holder.id);
+            } else if (res == download) {
+                //下载
+                ToastUtil.showToast(mContext, "下载");
+                //获取下载链接
+                String url = model.getUrl();
+                //获取路径
+                String path = DlCacheTasksManager.getImpl().createPath(url);
+                final BaseDownloadTask task = FileDownloader.getImpl().create(url)
+                        .setPath(path)
+                        .setCallbackProgressTimes(500)
+                        .setListener(taskListener);
+                DlCacheTasksManager.getImpl().addTaskForViewHolder(task);
+                //将下载中的任务添加到缓冲数据库中,方便其他地方调用
+                DlCacheTasksManager.getImpl().addTask(model.getUrl());
+                DlCacheTasksManager.getImpl().updateViewHolder(holder.id, holder);
+                task.start();
+            } else if (res == delete) {
+                //删除
+                ToastUtil.showToast(mContext, "删除");
+                String path = DlCacheTasksManager.getImpl().createPath(model.getUrl());
+                if (path != null) {
+                    //删除
+                    //noinspection ResultOfMethodCallIgnored
+                    new File(path).delete();
+                } else {
+                    ToastUtil.showToast(mContext, "删除路径不能为空");
+                }
+                holder.updateNotDownloaded(FileDownloadStatus.INVALID_STATUS, 0, 0);
+                //不仅要删除文件,还要移除已经完成下载数据中的数据
+                DlCacheTasksManager.getImpl().removeDownloaded(model.getUrl());
+            }
+        }
+    };
+
+
+    /**
+     * 这个是用来监听下载的情况[没问题]
+     * 1.下载队列中
+     * 2.开始下载
+     * 3.连接中
+     * 4.下载中
+     * 5.下载错误
+     * 6.暂停
+     * 7.完成
+     */
+    private FileDownloadListener taskDownloadListener = new FileDownloadSampleListener() {
+
+        private ViewHolder checkCurrentHolder(final BaseDownloadTask task) {
+            final ViewHolder tag = (ViewHolder) task.getTag();
+            if (tag.id == 0) {
+                ToastUtil.showToast(mContext, "id值不对");
+                return null;
+            }
+            if (tag.id != task.getId()) {
+                return null;
+            }
+            return tag;
+        }
+
+        @Override
+        protected void pending(BaseDownloadTask task, int soFarBytes, int totalBytes) {
+            super.pending(task, soFarBytes, totalBytes);
+            final ViewHolder tag = checkCurrentHolder(task);
+            if (tag == null) {
+                return;
+            }
+            tag.updateDownloading(FileDownloadStatus.pending, soFarBytes, totalBytes);
+            tag.tvState.setText("队列中");
+        }
+
+        @Override
+        protected void started(BaseDownloadTask task) {
+            super.started(task);
+            final ViewHolder tag = checkCurrentHolder(task);
+            if (tag == null) {
+                return;
+            }
+            tag.tvState.setText("状态: 开始下载");
+        }
+
+        @Override
+        protected void connected(BaseDownloadTask task, String etag, boolean isContinue, int soFarBytes, int totalBytes) {
+            super.connected(task, etag, isContinue, soFarBytes, totalBytes);
+            final ViewHolder tag = checkCurrentHolder(task);
+            if (tag == null) {
+                return;
+            }
+            tag.updateDownloading(FileDownloadStatus.connected, soFarBytes, totalBytes);
+            tag.tvState.setText("状态: 连接中");
+        }
+
+        @Override
+        protected void progress(BaseDownloadTask task, int soFarBytes, int totalBytes) {
+            super.progress(task, soFarBytes, totalBytes);
+            final ViewHolder tag = checkCurrentHolder(task);
+            if (tag == null) {
+                return;
+            }
+            tag.updateDownloading(FileDownloadStatus.progress, soFarBytes, totalBytes);
+            tag.tvState.setText("状态: 下载中");
+        }
+
+        @Override
+        protected void error(BaseDownloadTask task, Throwable e) {
+            super.error(task, e);
+            final ViewHolder tag = checkCurrentHolder(task);
+            if (tag == null) {
+                return;
+            }
+            tag.updateNotDownloaded(FileDownloadStatus.error, task.getLargeFileSoFarBytes()
+                    , task.getLargeFileTotalBytes());
+            tag.tvState.setText("状态: 错误");
+            DlCacheTasksManager.getImpl().removeTaskForViewHolder(task.getId());
+        }
+
+        @Override
+        protected void paused(BaseDownloadTask task, int soFarBytes, int totalBytes) {
+            super.paused(task, soFarBytes, totalBytes);
+            final ViewHolder tag = checkCurrentHolder(task);
+            if (tag == null) {
+                return;
+            }
+            tag.updateNotDownloaded(FileDownloadStatus.paused, soFarBytes, totalBytes);
+            tag.tvState.setText("状态: 暂停");
+            DlCacheTasksManager.getImpl().removeTaskForViewHolder(task.getId());
+        }
+
+        @Override
+        protected void completed(BaseDownloadTask task) {
+            super.completed(task);
+            final ViewHolder tag = checkCurrentHolder(task);
+            if (tag == null) {
+                return;
+            }
+            tag.updateDownloaded();
+            tag.tvState.setText("状态: 完成");
+            DlCacheTasksManager.getImpl().removeTaskForViewHolder(task.getId());
+        }
+    };
+
+
+    /**
+     * 原生demo案例代码
+     */
+    private FileDownloadListener taskListener = new FileDownloadSampleListener() {
+        private ViewHolder checkCurrentHolder(final BaseDownloadTask task) {
+            final ViewHolder tag = (ViewHolder) task.getTag();
+            /*if (tag.id != task.getId()) {
+                return null;
+            }*/
+            return tag;
+        }
+
+        @Override
+        protected void pending(BaseDownloadTask task, int soFarBytes, int totalBytes) {
+            super.pending(task, soFarBytes, totalBytes);
+            final ViewHolder tag = checkCurrentHolder(task);
+            if (tag == null) {
+                return;
+            }
+            tag.updateDownloading(FileDownloadStatus.pending, soFarBytes, totalBytes);
+            tag.tvState.setText(R.string.tasks_manager_demo_status_pending);
+        }
+
+        @Override
+        protected void started(BaseDownloadTask task) {
+            super.started(task);
+            final ViewHolder tag = checkCurrentHolder(task);
+            if (tag == null) {
+                return;
+            }
+            tag.tvState.setText(R.string.tasks_manager_demo_status_started);
+        }
+
+        @Override
+        protected void connected(BaseDownloadTask task, String etag, boolean isContinue, int soFarBytes, int totalBytes) {
+            super.connected(task, etag, isContinue, soFarBytes, totalBytes);
+            final ViewHolder tag = checkCurrentHolder(task);
+            if (tag == null) {
+                return;
+            }
+            tag.updateDownloading(FileDownloadStatus.connected, soFarBytes, totalBytes);
+            tag.tvState.setText(R.string.tasks_manager_demo_status_connected);
+        }
+
+        @Override
+        protected void progress(BaseDownloadTask task, int soFarBytes, int totalBytes) {
+            super.progress(task, soFarBytes, totalBytes);
+            final ViewHolder tag = checkCurrentHolder(task);
+            if (tag == null) {
+                return;
+            }
+            tag.updateDownloading(FileDownloadStatus.progress, soFarBytes, totalBytes);
+        }
+
+        @Override
+        protected void error(BaseDownloadTask task, Throwable e) {
+            super.error(task, e);
+            final ViewHolder tag = checkCurrentHolder(task);
+            if (tag == null) {
+                return;
+            }
+
+            tag.updateNotDownloaded(FileDownloadStatus.error, task.getLargeFileSoFarBytes()
+                    , task.getLargeFileTotalBytes());
+            TasksManager.getImpl().removeTaskForViewHolder(task.getId());
+        }
+
+        @Override
+        protected void paused(BaseDownloadTask task, int soFarBytes, int totalBytes) {
+            super.paused(task, soFarBytes, totalBytes);
+            final ViewHolder tag = checkCurrentHolder(task);
+            if (tag == null) {
+                return;
+            }
+
+            tag.updateNotDownloaded(FileDownloadStatus.paused, soFarBytes, totalBytes);
+            tag.tvState.setText(R.string.tasks_manager_demo_status_paused);
+            TasksManager.getImpl().removeTaskForViewHolder(task.getId());
+        }
+
+        @Override
+        protected void completed(BaseDownloadTask task) {
+            super.completed(task);
+            final ViewHolder tag = checkCurrentHolder(task);
+            if (tag == null) {
+                return;
+            }
+
+            tag.updateDownloaded();
+            TasksManager.getImpl().removeTaskForViewHolder(task.getId());
+        }
+    };
+
+
+    private CircleProgressbar.OnCountdownProgressListener progressListener
+            = new CircleProgressbar.OnCountdownProgressListener() {
+        @Override
+        public void onProgress(int what, int progress) {
+            if (what == 1) {
+
+            }
+        }
+    };
+
+
+    public void setOnItemClickListener(OnListItemClickListener onItemClickListener) {
+        this.onItemClickListener = onItemClickListener;
+    }
+
+    private OnSwipeMenuListener listener;
+
+    public void setOnSwipeMenuListener(OnSwipeMenuListener listener) {
+        this.listener = listener;
+    }
+}

+ 0 - 114
app/src/main/java/org/yczbj/ycvideoplayer/ui/test2/MyVideoPlayer.java

@@ -1,114 +0,0 @@
-package org.yczbj.ycvideoplayer.ui.test2;
-
-import android.content.Context;
-
-import org.yczbj.ycvideoplayerlib.AbsVideoPlayerController;
-import org.yczbj.ycvideoplayerlib.VideoPlayer;
-
-import java.util.Map;
-
-/**
- * Created by yc on 2018/1/16.
- */
-
-public class MyVideoPlayer extends VideoPlayer {
-
-    public MyVideoPlayer(Context context) {
-        super(context);
-    }
-
-    @Override
-    public void setUp(String url, Map<String, String> headers) {
-        super.setUp(url, headers);
-    }
-
-    @Override
-    public void setController(AbsVideoPlayerController controller) {
-        super.setController(controller);
-    }
-
-    @Override
-    public void setPlayerType(int playerType) {
-        super.setPlayerType(playerType);
-    }
-
-    @Override
-    public void continueFromLastPosition(boolean continueFromLastPosition) {
-        super.continueFromLastPosition(continueFromLastPosition);
-    }
-
-    @Override
-    public void setSpeed(float speed) {
-        super.setSpeed(speed);
-    }
-
-    @Override
-    public void start() {
-        super.start();
-    }
-
-    @Override
-    public void start(long position) {
-        super.start(position);
-    }
-
-    @Override
-    public void restart() {
-        super.restart();
-    }
-
-    @Override
-    public void pause() {
-        super.pause();
-    }
-
-    @Override
-    public void seekTo(long pos) {
-        super.seekTo(pos);
-    }
-
-    @Override
-    public void setVolume(int volume) {
-        super.setVolume(volume);
-    }
-
-    @Override
-    public boolean isIdle() {
-        return super.isIdle();
-    }
-
-    @Override
-    public boolean isPreparing() {
-        return super.isPreparing();
-    }
-
-    @Override
-    public boolean isPrepared() {
-        return super.isPrepared();
-    }
-
-    @Override
-    public boolean isBufferingPlaying() {
-        return super.isBufferingPlaying();
-    }
-
-    @Override
-    public boolean isBufferingPaused() {
-        return super.isBufferingPaused();
-    }
-
-    @Override
-    public boolean isPlaying() {
-        return super.isPlaying();
-    }
-
-    @Override
-    public boolean isPaused() {
-        return super.isPaused();
-    }
-
-    @Override
-    public boolean isError() {
-        return super.isError();
-    }
-}

+ 4 - 2
app/src/main/java/org/yczbj/ycvideoplayer/ui/test3/download/DLTasksManager.java

@@ -40,7 +40,6 @@ public class DLTasksManager {
     private DLTasksManager() {
         dbController = new DLTasksManagerDBController();
         modelList = dbController.getAllTasks();
-        //initDemo();
     }
 
     private void initDemo() {
@@ -124,7 +123,10 @@ public class DLTasksManager {
     }
 
     public DLTasksManagerModel get(final int position) {
-        return modelList.get(position);
+        if(modelList!=null && modelList.size()>=position){
+            return modelList.get(position);
+        }
+        return null;
     }
 
     public DLTasksManagerModel getById(final int id) {

+ 3 - 3
app/src/main/java/org/yczbj/ycvideoplayer/ui/test3/download/DLTasksManagerModel.java

@@ -9,6 +9,7 @@ import android.content.ContentValues;
 public class DLTasksManagerModel {
 
     public final static String ID = "id";
+    public final static String LOGO = "logo";
     public final static String NAME = "name";
     public final static String URL = "url";
     public final static String PATH = "path";
@@ -19,9 +20,7 @@ public class DLTasksManagerModel {
     private String url;
     private String path;
 
-    public DLTasksManagerModel() {
-
-    }
+    DLTasksManagerModel() {}
 
     public DLTasksManagerModel(int id, String logo, String name, String url, String path) {
         this.id = id;
@@ -74,6 +73,7 @@ public class DLTasksManagerModel {
     public ContentValues toContentValues() {
         ContentValues cv = new ContentValues();
         cv.put(ID, id);
+        cv.put(LOGO, logo);
         cv.put(NAME, name);
         cv.put(URL, url);
         cv.put(PATH, path);

+ 405 - 0
app/src/main/java/org/yczbj/ycvideoplayer/ui/test3/download2/DlCacheTasksManager.java

@@ -0,0 +1,405 @@
+package org.yczbj.ycvideoplayer.ui.test3.download2;
+
+
+import android.text.TextUtils;
+import android.util.SparseArray;
+
+import com.blankj.utilcode.util.ToastUtils;
+import com.liulishuo.filedownloader.BaseDownloadTask;
+import com.liulishuo.filedownloader.FileDownloadConnectListener;
+import com.liulishuo.filedownloader.FileDownloader;
+import com.liulishuo.filedownloader.model.FileDownloadStatus;
+import com.liulishuo.filedownloader.util.FileDownloadUtils;
+
+
+import org.yczbj.ycvideoplayer.ui.me.view.adapter.MeCacheAdapter;
+
+import java.lang.ref.WeakReference;
+import java.util.List;
+
+/**
+ * ================================================
+ * 作    者:杨充
+ * 版    本:1.0
+ * 创建日期:2017/1/9
+ * 描    述:下载Tasks帮助类
+ * 修订历史:
+ *          下载框架:https://github.com/lingochamp/FileDownloader
+ *
+ *
+ *          思考一下,如果多个地方下载,关于这个引用可以传不同类型,那么task可不可以使用泛型,该如何使用???
+ * ================================================
+ */
+public class DlCacheTasksManager {
+
+    /**
+     * 数据库控制器
+     */
+    private DlTasksManagerDBController dbController;
+    /**
+     * 正在下载的
+     */
+    private List<DlTasksManagerModel> modelList;
+    /**
+     * 下载完成的
+     */
+    private List<DlTasksManagerModel> downloadModelList;
+    /**
+     * 集合
+     */
+    private SparseArray<BaseDownloadTask> taskSparseArray = new SparseArray<>();
+    /**
+     * 下载连接监听器
+     */
+    private FileDownloadConnectListener listener;
+
+
+    private final static class HolderClass {
+        private final static DlCacheTasksManager INSTANCE = new DlCacheTasksManager();
+    }
+
+    public static DlCacheTasksManager getImpl() {
+        return HolderClass.INSTANCE;
+    }
+
+    private DlCacheTasksManager() {
+        dbController = new DlTasksManagerDBController();
+        modelList = dbController.getAllTasks();
+        downloadModelList = dbController.getAllDownloadedList();
+    }
+
+
+    /**---------------------------------task增删改查---------------------------------------------*/
+
+    /**
+     * 添加
+     * @param task
+     */
+    public void addTaskForViewHolder(final BaseDownloadTask task) {
+        taskSparseArray.put(task.getId(), task);
+    }
+
+    /**
+     * 移除
+     * @param id
+     */
+    public void removeTaskForViewHolder(final int id) {
+        taskSparseArray.remove(id);
+    }
+
+    /**
+     * 更新
+     * @param id
+     * @param holder
+     */
+    public void updateViewHolder(final int id, final MeCacheAdapter.ViewHolder holder) {
+        final BaseDownloadTask task = taskSparseArray.get(id);
+        if (task == null) {
+            return;
+        }
+        task.setTag(holder);
+    }
+
+    /**
+     * 清除所有
+     * 一般在onDestroy方法执行
+     */
+    private void releaseTask() {
+        taskSparseArray.clear();
+    }
+
+
+    /**---------------------------服务连接监听器注册和注销--------------------------------------*/
+
+
+    /**
+     * 注册服务连接监听器
+     * @param weakReference             软引用集合
+     */
+    private void registerServiceConnectionListener(final WeakReference<MeCacheAdapter> weakReference) {
+        if (listener != null) {
+            FileDownloader.getImpl().removeServiceConnectListener(listener);
+        }
+
+        listener = new FileDownloadConnectListener() {
+            /**
+             * 连接
+             */
+            @Override
+            public void connected() {
+                if (weakReference == null || weakReference.get() == null) {
+                    return;
+                }
+                weakReference.get().postNotifyDataChanged();
+            }
+
+            /**
+             * 没有连接上
+             */
+            @Override
+            public void disconnected() {
+                if (weakReference == null || weakReference.get() == null) {
+                    return;
+                }
+                weakReference.get().postNotifyDataChanged();
+            }
+        };
+        FileDownloader.getImpl().addServiceConnectListener(listener);
+    }
+
+    /**
+     * 注销服务连接监听器
+     * 一般在onDestroy方法执行
+     */
+    private void unregisterServiceConnectionListener() {
+        FileDownloader.getImpl().removeServiceConnectListener(listener);
+        listener = null;
+    }
+
+
+    /**---------------------------生命周期方法调用--------------------------------------*/
+
+
+
+    /**
+     * 创建时执行
+     * @param weakReference         软引用集合对象
+     */
+    public void onCreate(final WeakReference<MeCacheAdapter> weakReference) {
+        if (!FileDownloader.getImpl().isServiceConnected()) {
+            FileDownloader.getImpl().bindService();
+            registerServiceConnectionListener(weakReference);
+        }
+    }
+
+    /**
+     * 销毁时执行
+     */
+    public void onDestroy() {
+        unregisterServiceConnectionListener();
+        releaseTask();
+    }
+
+    /**---------------------------其他方法--------------------------------------*/
+
+    /**
+     * 判断服务是否连接上
+     */
+    public boolean isReady() {
+        return FileDownloader.getImpl().isServiceConnected();
+    }
+
+    /**
+     * 获取集合中索引为position的数据
+     */
+    public DlTasksManagerModel get(final int position) {
+        if(modelList!=null){
+            return modelList.get(position);
+        }
+        return null;
+    }
+
+    /**
+     * 获取id,比较model中id和下载id是否相同,如果相同则返回model,如果不同则返回null
+     */
+    public DlTasksManagerModel getById(final int id) {
+        for (DlTasksManagerModel model : modelList) {
+            if (model.getId() == id) {
+                return model;
+            }
+        }
+        return null;
+    }
+
+    /**
+     * 获取下载的状态是否下载完成
+     */
+    public boolean isDownloaded(final int status) {
+        return status == FileDownloadStatus.completed;
+    }
+
+    /**
+     * 获取下载的状态
+     */
+    public int getStatus(final int id, String path) {
+        return FileDownloader.getImpl().getStatus(id, path);
+    }
+
+    /**
+     * 使用{code id}获取任务目标文件的总字节。
+     */
+    public long getTotal(final int id) {
+        return FileDownloader.getImpl().getTotal(id);
+    }
+
+    /**
+     * 下载到目前为止下载的字节。。
+     */
+    public long getSoFar(final int id) {
+        return FileDownloader.getImpl().getSoFar(id);
+    }
+
+    /**
+     * 获取下载任务的总数量
+     */
+    public int getTaskCounts() {
+        return modelList.size();
+    }
+
+    /**
+     * 添加task
+     * @param url               注意这个是下载链接地址
+     */
+    public DlTasksManagerModel addTask(final String url) {
+        return addTask(url, createPath(url));
+    }
+
+    /**
+     * 获取创建下载文件路劲
+     * @param url           下载地址
+     * @return              下载路径
+     */
+    public String createPath(final String url) {
+        if (TextUtils.isEmpty(url)) {
+            return null;
+        }
+        return FileDownloadUtils.getDefaultSaveFilePath(url);
+    }
+
+
+    /**
+     * 添加task
+     * @param url               注意这个是下载链接地址
+     * @param path              注意这个是下载路径
+     */
+    private DlTasksManagerModel addTask(final String url, final String path) {
+        if (TextUtils.isEmpty(url) || TextUtils.isEmpty(path)) {
+            return null;
+        }
+        final int id = FileDownloadUtils.generateId(url, path);
+        DlTasksManagerModel model = getById(id);
+        if (model != null) {
+            return model;
+        }
+        final DlTasksManagerModel newModel = dbController.addTask(url, path);
+        if (newModel != null) {
+            modelList.add(newModel);
+        }
+        return newModel;
+    }
+
+
+    /**--------------------------------------------------------------------------------------**/
+    /**----------------------------------下面是自己添加----------------------------------------**/
+
+
+
+    /**
+     * 获取下载文件的id
+     * @param url
+     * @return
+     */
+    public int getId(String url) {
+        if (TextUtils.isEmpty(url)){
+            return -1 ;
+        }
+        return FileDownloadUtils.generateId(url, createPath(url));
+    }
+
+
+    /**
+     * 获取正在下载的内容
+     * @return
+     */
+    public List<DlTasksManagerModel> getModelList(){
+        return modelList;
+    }
+
+
+    /**
+     * 获取下载完成的内容
+     * @return
+     */
+    public List<DlTasksManagerModel> getDownloadModelList(){
+        return downloadModelList;
+    }
+
+
+    /**
+     * 删除,移除正在下载数据库中的数据
+     * @param url
+     */
+    public void deleteTasksManagerModel(String url) {
+        if (TextUtils.isEmpty(url)) {
+            return ;
+        }
+        if(modelList.size()<=0){
+            return;
+        }
+        for (int i = 0; i < modelList.size(); i++) {
+            //如果删除的url和model中存储的url相同,则移除
+            if (url.equals(modelList.get(i).getUrl())){
+                modelList.remove(i);
+                break;
+            }
+        }
+        boolean b = dbController.removeTasks(url);
+        if(b){
+            ToastUtils.showShort("移除正在下载的数据成功");
+        }
+    }
+
+
+    /**
+     * 将下载完成的添加到已经完成数据库
+     * 思考:如何避免重复的添加数据,一定要去重数据
+     * 比较id是否相同,如果相同,则去重
+     */
+    public void addDownloaded(DlTasksManagerModel model){
+        String url = model.getPath();
+        String path = DlCacheTasksManager.getImpl().createPath(url);
+        if (TextUtils.isEmpty(url) || TextUtils.isEmpty(path)) {
+            return ;
+        }
+        final int id = FileDownloadUtils.generateId(url, path);
+        /*if(dlId==id){
+            ToastUtils.showShort("已经添加了该下载完成的数据");
+            return;
+        }*/
+        DlTasksManagerModel bean = new DlTasksManagerModel();
+        bean.setId(id);
+        bean.setName(url.substring(url.lastIndexOf("/")+1));
+        bean.setUrl(url);
+        bean.setPath(path);
+        bean.setType(2);
+        downloadModelList.add(model);
+        dbController.addDownloaded(model);
+    }
+
+
+    /**
+     * 从已经下载的数据库中移除某一条数据
+     * @param url
+     */
+    public void removeDownloaded(String  url){
+        for (int i = 0; i < downloadModelList.size(); i++) {
+            DlTasksManagerModel model = downloadModelList.get(i);
+            if (model.getUrl().equals(url)){
+                downloadModelList.remove(i);
+                break;
+            }
+        }
+        dbController.removeDownloaded(url);
+    }
+
+
+    /**
+     * 判断是否有下载文件
+     * @param url       下载链接
+     * @return
+     */
+    public boolean isExistDownloadFile(String url){
+        return dbController.isExistDownloadFile(url);
+    }
+
+}

+ 403 - 0
app/src/main/java/org/yczbj/ycvideoplayer/ui/test3/download2/DlTasksManager.java

@@ -0,0 +1,403 @@
+package org.yczbj.ycvideoplayer.ui.test3.download2;
+
+
+import android.text.TextUtils;
+import android.util.SparseArray;
+
+import com.blankj.utilcode.util.ToastUtils;
+import com.liulishuo.filedownloader.BaseDownloadTask;
+import com.liulishuo.filedownloader.FileDownloadConnectListener;
+import com.liulishuo.filedownloader.FileDownloader;
+import com.liulishuo.filedownloader.model.FileDownloadStatus;
+import com.liulishuo.filedownloader.util.FileDownloadUtils;
+import com.pedaily.yc.ycdialoglib.toast.ToastUtil;
+
+import org.yczbj.ycvideoplayer.download.TaskViewHolderImp;
+import org.yczbj.ycvideoplayer.ui.test3.ui.adapter.DlMyFileAdapter;
+
+import java.lang.ref.WeakReference;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * ================================================
+ * 作    者:杨充
+ * 版    本:1.0
+ * 创建日期:2017/1/9
+ * 描    述:下载Tasks帮助类
+ * 修订历史:
+ *          下载框架:https://github.com/lingochamp/FileDownloader
+ *
+ *
+ *          思考一下,如果多个地方下载,关于这个引用可以传不同类型,那么task可不可以使用泛型,该如何使用???
+ * ================================================
+ */
+public class DlTasksManager {
+
+    /**
+     * 数据库控制器
+     */
+    private DlTasksManagerDBController dbController;
+    /**
+     * 正在下载的
+     */
+    private List<DlTasksManagerModel> modelList;
+    /**
+     * 下载完成的
+     */
+    private List<DlTasksManagerModel> downloadedlList;
+    /**
+     * 集合
+     */
+    private SparseArray<BaseDownloadTask> taskSparseArray = new SparseArray<>();
+    /**
+     * 下载连接监听器
+     */
+    private FileDownloadConnectListener listener;
+
+
+    private final static class HolderClass {
+        private final static DlTasksManager INSTANCE = new DlTasksManager();
+    }
+
+    public static DlTasksManager getImpl() {
+        return HolderClass.INSTANCE;
+    }
+
+    private DlTasksManager() {
+        dbController = new DlTasksManagerDBController();
+        modelList = dbController.getAllTasks();
+        downloadedlList = dbController.getAllDownloadedList();
+    }
+
+
+    /**---------------------------------task增删改查---------------------------------------------*/
+
+    /**
+     * 添加
+     * @param task
+     */
+    public void addTaskForViewHolder(final BaseDownloadTask task) {
+        taskSparseArray.put(task.getId(), task);
+    }
+
+    /**
+     * 移除
+     * @param id
+     */
+    public void removeTaskForViewHolder(final int id) {
+        taskSparseArray.remove(id);
+    }
+
+    /**
+     * 更新
+     * @param id
+     * @param holder
+     */
+    public void updateViewHolder(final int id, final DlMyFileAdapter.ViewHolder holder) {
+        final BaseDownloadTask task = taskSparseArray.get(id);
+        if (task == null) {
+            return;
+        }
+        task.setTag(holder);
+    }
+
+    /**
+     * 清除所有
+     * 一般在onDestroy方法执行
+     */
+    private void releaseTask() {
+        taskSparseArray.clear();
+    }
+
+
+    /**---------------------------服务连接监听器注册和注销--------------------------------------*/
+
+
+    /**
+     * 注册服务连接监听器
+     * @param weakReference             软引用集合
+     */
+    private void registerServiceConnectionListener(final WeakReference<DlMyFileAdapter> weakReference) {
+        if (listener != null) {
+            FileDownloader.getImpl().removeServiceConnectListener(listener);
+        }
+
+        listener = new FileDownloadConnectListener() {
+            /**
+             * 连接
+             */
+            @Override
+            public void connected() {
+                if (weakReference == null || weakReference.get() == null) {
+                    return;
+                }
+                weakReference.get().postNotifyDataChanged();
+            }
+
+            /**
+             * 没有连接上
+             */
+            @Override
+            public void disconnected() {
+                if (weakReference == null || weakReference.get() == null) {
+                    return;
+                }
+                weakReference.get().postNotifyDataChanged();
+            }
+        };
+        FileDownloader.getImpl().addServiceConnectListener(listener);
+    }
+
+    /**
+     * 注销服务连接监听器
+     * 一般在onDestroy方法执行
+     */
+    private void unregisterServiceConnectionListener() {
+        FileDownloader.getImpl().removeServiceConnectListener(listener);
+        listener = null;
+    }
+
+
+    /**---------------------------生命周期方法调用--------------------------------------*/
+
+
+
+    /**
+     * 创建时执行
+     * @param weakReference         软引用集合对象
+     */
+    public void onCreate(final WeakReference<DlMyFileAdapter> weakReference) {
+        if (!FileDownloader.getImpl().isServiceConnected()) {
+            FileDownloader.getImpl().bindService();
+            registerServiceConnectionListener(weakReference);
+        }
+    }
+
+    /**
+     * 销毁时执行
+     */
+    public void onDestroy() {
+        unregisterServiceConnectionListener();
+        releaseTask();
+    }
+
+    /**---------------------------其他方法--------------------------------------*/
+
+    /**
+     * 判断服务是否连接上
+     */
+    public boolean isReady() {
+        return FileDownloader.getImpl().isServiceConnected();
+    }
+
+    /**
+     * 获取集合中索引为position的数据
+     */
+    public DlTasksManagerModel get(final int position) {
+        if(modelList!=null){
+            return modelList.get(position);
+        }
+        return null;
+    }
+
+    /**
+     * 获取id,比较model中id和下载id是否相同,如果相同则返回model,如果不同则返回null
+     */
+    public DlTasksManagerModel getById(final int id) {
+        for (DlTasksManagerModel model : modelList) {
+            if (model.getId() == id) {
+                return model;
+            }
+        }
+        return null;
+    }
+
+    /**
+     * 获取下载的状态是否下载完成
+     */
+    public boolean isDownloaded(final int status) {
+        return status == FileDownloadStatus.completed;
+    }
+
+    /**
+     * 获取下载的状态
+     */
+    public int getStatus(final int id, String path) {
+        return FileDownloader.getImpl().getStatus(id, path);
+    }
+
+    /**
+     * 使用{code id}获取任务目标文件的总字节。
+     */
+    public long getTotal(final int id) {
+        return FileDownloader.getImpl().getTotal(id);
+    }
+
+    /**
+     * 下载到目前为止下载的字节。。
+     */
+    public long getSoFar(final int id) {
+        return FileDownloader.getImpl().getSoFar(id);
+    }
+
+    /**
+     * 获取下载任务的总数量
+     */
+    public int getTaskCounts() {
+        return modelList.size();
+    }
+
+    /**
+     * 添加task
+     * @param url               注意这个是下载链接地址
+     */
+    public DlTasksManagerModel addTask(final String url) {
+        return addTask(url, createPath(url));
+    }
+
+    /**
+     * 获取创建下载文件路劲
+     * @param url           下载地址
+     * @return              下载路径
+     */
+    public String createPath(final String url) {
+        if (TextUtils.isEmpty(url)) {
+            return null;
+        }
+        return FileDownloadUtils.getDefaultSaveFilePath(url);
+    }
+
+
+    /**
+     * 添加task
+     * @param url               注意这个是下载链接地址
+     * @param path              注意这个是下载路径
+     */
+    private DlTasksManagerModel addTask(final String url, final String path) {
+        if (TextUtils.isEmpty(url) || TextUtils.isEmpty(path)) {
+            return null;
+        }
+        final int id = FileDownloadUtils.generateId(url, path);
+        DlTasksManagerModel model = getById(id);
+        if (model != null) {
+            return model;
+        }
+        final DlTasksManagerModel newModel = dbController.addTask(url, path);
+        if (newModel != null) {
+            modelList.add(newModel);
+        }
+        return newModel;
+    }
+
+
+    /**--------------------------------------------------------------------------------------**/
+    /**----------------------------------下面是自己添加----------------------------------------**/
+
+
+
+    /**
+     * 获取下载文件的id
+     * @param url
+     * @return
+     */
+    public int getId(String url) {
+        if (TextUtils.isEmpty(url)){
+            return -1 ;
+        }
+        return FileDownloadUtils.generateId(url, createPath(url));
+    }
+
+
+    /**
+     * 获取正在下载的内容
+     * @return
+     */
+    public List<DlTasksManagerModel> getModelList(){
+        return modelList;
+    }
+
+
+    /**
+     * 获取下载完成的内容
+     * @return
+     */
+    public List<DlTasksManagerModel> getDownloadedlList(){
+        return downloadedlList;
+    }
+
+
+    /**
+     * 删除,移除正在下载数据库中的数据
+     * @param url
+     */
+    public void deleteTasksManagerModel(String url) {
+        if (TextUtils.isEmpty(url)) {
+            return ;
+        }
+        if(modelList.size()<=0){
+            return;
+        }
+        for (int i = 0; i < modelList.size(); i++) {
+            //如果删除的url和model中存储的url相同,则移除
+            if (url.equals(modelList.get(i).getUrl())){
+                modelList.remove(i);
+                break;
+            }
+        }
+        boolean b = dbController.removeTasks(url);
+        if(b){
+            ToastUtils.showShort("移除正在下载的数据成功");
+        }
+    }
+
+
+    /**
+     * 将下载完成的添加到已经完成数据库
+     * 思考:如何避免重复的添加数据,一定要去重数据
+     * 比较id是否相同,如果相同,则去重
+     */
+    public void addDownloaded(DlTasksManagerModel model){
+        String url = model.getPath();
+        String path = DlTasksManager.getImpl().createPath(url);
+        if (TextUtils.isEmpty(url) || TextUtils.isEmpty(path)) {
+            return ;
+        }
+        final int id = FileDownloadUtils.generateId(url, path);
+        DlTasksManagerModel bean = new DlTasksManagerModel();
+        bean.setId(id);
+        bean.setName(url.substring(url.lastIndexOf("/")+1));
+        bean.setUrl(url);
+        bean.setPath(path);
+        bean.setType(2);
+        downloadedlList.add(model);
+        dbController.addDownloaded(model);
+    }
+
+
+    /**
+     * 从已经下载的数据库中移除某一条数据
+     * @param url
+     */
+    public void removeDownloaded(String  url){
+        for (int i = 0; i < downloadedlList.size(); i++) {
+            DlTasksManagerModel model = downloadedlList.get(i);
+            if (model.getUrl().equals(url)){
+                downloadedlList.remove(i);
+                break;
+            }
+        }
+        dbController.removeDownloaded(url);
+    }
+
+
+    /**
+     * 判断是否有下载文件
+     * @param url       下载链接
+     * @return
+     */
+    public boolean isExistDownloadFile(String url){
+        return dbController.isExistDownloadFile(url);
+    }
+
+}

+ 155 - 0
app/src/main/java/org/yczbj/ycvideoplayer/ui/test3/download2/DlTasksManagerDBController.java

@@ -0,0 +1,155 @@
+package org.yczbj.ycvideoplayer.ui.test3.download2;
+
+import android.database.Cursor;
+import android.database.sqlite.SQLiteDatabase;
+import android.text.TextUtils;
+
+import com.blankj.utilcode.util.ToastUtils;
+import com.liulishuo.filedownloader.util.FileDownloadUtils;
+import com.pedaily.yc.ycdialoglib.toast.ToastUtil;
+
+import org.yczbj.ycvideoplayer.base.BaseApplication;
+import org.yczbj.ycvideoplayer.ui.test3.download.DLTasksManagerModel;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by yc on 2018/1/17.
+ */
+
+public class DlTasksManagerDBController {
+
+    /**
+     * 这个是字典表的表名
+     */
+    final static String TABLE_NAME = "dlTasksManger2";
+    private final static String DOWNLOADED_NAME = "downloaded2";
+    private final SQLiteDatabase db;
+
+    DlTasksManagerDBController() {
+        DlTasksManagerDBOpenHelper openHelper = new DlTasksManagerDBOpenHelper(BaseApplication.getInstance());
+        db = openHelper.getWritableDatabase();
+    }
+
+    /**
+     * 从数据库中获取所有值
+     * 目前是正在下载的数据存储到数据库
+     * 思考:cursor类如何获取布尔类型数据
+     */
+    public List<DlTasksManagerModel> getAllTasks() {
+        final Cursor c = db.rawQuery("SELECT * FROM " + TABLE_NAME, null);
+        final List<DlTasksManagerModel> list = new ArrayList<>();
+        try {
+            if (!c.moveToLast()) {
+                return list;
+            }
+            do {
+                DlTasksManagerModel model = new DlTasksManagerModel();
+                model.setId(c.getInt(c.getColumnIndex(DlTasksManagerModel.ID)));
+                model.setLogo(c.getString(c.getColumnIndex(DlTasksManagerModel.LOGO)));
+                model.setName(c.getString(c.getColumnIndex(DlTasksManagerModel.NAME)));
+                model.setUrl(c.getString(c.getColumnIndex(DlTasksManagerModel.URL)));
+                model.setPath(c.getString(c.getColumnIndex(DlTasksManagerModel.PATH)));
+                model.setType(c.getInt(c.getColumnIndex(DlTasksManagerModel.TYPE)));
+                list.add(model);
+            } while (c.moveToPrevious());
+        } finally {
+            if (c != null) {
+                c.close();
+            }
+        }
+        return list;
+    }
+
+    /**
+     * 从数据库中获取所有值
+     * 目前是已经完成下载的数据
+     */
+    public List<DlTasksManagerModel> getAllDownloadedList() {
+        final Cursor c = db.rawQuery("SELECT * FROM " + DOWNLOADED_NAME, null);
+        final List<DlTasksManagerModel> list = new ArrayList<>();
+        try {
+            if (!c.moveToLast()) {
+                return list;
+            }
+            do {
+                DlTasksManagerModel model = new DlTasksManagerModel();
+                model.setId(c.getInt(c.getColumnIndex(DlTasksManagerModel.ID)));
+                model.setLogo(c.getString(c.getColumnIndex(DlTasksManagerModel.LOGO)));
+                model.setName(c.getString(c.getColumnIndex(DlTasksManagerModel.NAME)));
+                model.setUrl(c.getString(c.getColumnIndex(DlTasksManagerModel.URL)));
+                model.setPath(c.getString(c.getColumnIndex(DlTasksManagerModel.PATH)));
+                model.setType(c.getInt(c.getColumnIndex(DlTasksManagerModel.TYPE)));
+                list.add(model);
+            } while (c.moveToPrevious());
+        } finally {
+            if (c != null) {
+                c.close();
+            }
+        }
+        return list;
+    }
+
+
+    DlTasksManagerModel addTask(final String url, final String path) {
+        if (TextUtils.isEmpty(url) || TextUtils.isEmpty(path)) {
+            ToastUtils.showShort("链接或者路径不能为空");
+            return null;
+        }
+        // have to use FileDownloadUtils.generateId to associate TasksManagerModel with FileDownloader
+        final int id = FileDownloadUtils.generateId(url, path);
+        DlTasksManagerModel model = new DlTasksManagerModel();
+        model.setId(id);
+        model.setName("name");
+        model.setUrl(url);
+        model.setPath(path);
+        model.setType(1);
+        final boolean succeed = db.insert(TABLE_NAME, null, model.toContentValues()) != -1;
+        return succeed ? model : null;
+    }
+
+    /**
+     * 从数据库中删除
+     * @param url
+     * @return
+     */
+    boolean removeTasks(String url) {
+        return db.delete(TABLE_NAME ,"url = ?" ,new String[]{url})!=-1;
+    }
+
+    /**
+     * 判断数据库中是否存在
+     * @param url
+     * @return
+     */
+    boolean isExistDownloadFile(String url) {
+        Cursor c = db.query(DOWNLOADED_NAME,null,"url= ?", new String[]{url},null,null,null);
+        try{
+            return c.moveToNext();
+        }finally {
+            if (c!=null) {
+                c.close();
+            }
+        }
+    }
+
+    /**
+     * 添加到已经完成下载数据库
+     * @param model
+     * @return
+     */
+    boolean addDownloaded(DlTasksManagerModel model) {
+        return db.insert(DOWNLOADED_NAME ,null ,model.toContentValues()) != -1;
+    }
+
+    /**
+     * 从已经完成数据库中移除某一条数据
+     * @param url
+     * @return
+     */
+    boolean removeDownloaded(String url){
+        return db.delete(DOWNLOADED_NAME ,"url = ?" ,new String[]{url})!=-1;
+    }
+
+}

+ 95 - 0
app/src/main/java/org/yczbj/ycvideoplayer/ui/test3/download2/DlTasksManagerDBOpenHelper.java

@@ -0,0 +1,95 @@
+package org.yczbj.ycvideoplayer.ui.test3.download2;
+
+import android.content.Context;
+import android.database.sqlite.SQLiteDatabase;
+import android.database.sqlite.SQLiteOpenHelper;
+
+import org.yczbj.ycvideoplayer.ui.test3.download.DLTasksManagerModel;
+
+/**
+ * Created by yc on 2018/1/17.
+ */
+
+public class DlTasksManagerDBOpenHelper extends SQLiteOpenHelper {
+
+    /**
+     * 这个是数据库的数据库名称
+     */
+    private final static String DATABASE_NAME = "dlTasksManger2.db";
+    private final static int DATABASE_VERSION = 2;
+
+    DlTasksManagerDBOpenHelper(Context context) {
+        super(context, DATABASE_NAME, null, DATABASE_VERSION);
+    }
+
+
+    @Override
+    public void onCreate(SQLiteDatabase db) {
+        /*db.execSQL("CREATE TABLE IF NOT EXISTS "
+                + DlTasksManagerDBController.TABLE_NAME
+                + String.format(
+                "("
+                        + "%s INTEGER PRIMARY KEY, " // id, download id
+                        + "%s VARCHAR, " // name
+                        + "%s VARCHAR, " // url
+                        + "%s VARCHAR " // path
+                        + ")"
+                , DLTasksManagerModel.ID
+                , DLTasksManagerModel.LOGO
+                , DLTasksManagerModel.NAME
+                , DLTasksManagerModel.URL
+                , DLTasksManagerModel.PATH
+        ));*/
+
+        String sql = "create table if not exists dlTasksManger2(" +
+                "_id integer primary key autoincrement," +
+                "id integer," +
+                "logo varchar(200)," +
+                "name varchar(200)," +
+                "url  varchar(200)," +
+                "path verchar(200)," +
+                ")";
+        db.execSQL(sql);
+
+        sql = "create table if not exists downloaded2(" +
+                "_id integer primary key autoincrement," +
+                "id integer," +
+                "logo varchar(200)," +
+                "name varchar(200)," +
+                "url  varchar(200)," +
+                "path verchar(200)," +
+                ")";
+        db.execSQL(sql);
+    }
+
+
+    @Override
+    public void onOpen(SQLiteDatabase db) {
+        super.onOpen(db);
+        /*db.execSQL("CREATE TABLE IF NOT EXISTS "
+                + DlTasksManagerDBController.DOWNLOADED_NAME
+                + String.format(
+                "("
+                        + "%s INTEGER PRIMARY KEY, " // id, download id
+                        + "%s VARCHAR, " // name
+                        + "%s VARCHAR, " // url
+                        + "%s VARCHAR " // path
+                        + ")"
+                , DLTasksManagerModel.ID
+                , DLTasksManagerModel.LOGO
+                , DLTasksManagerModel.NAME
+                , DLTasksManagerModel.URL
+                , DLTasksManagerModel.PATH
+        ));*/
+    }
+
+
+    @Override
+    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
+        if (oldVersion == 1 && newVersion == 2) {
+            db.delete(DlTasksManagerDBController.TABLE_NAME, null, null);
+        }
+    }
+
+
+}

+ 101 - 0
app/src/main/java/org/yczbj/ycvideoplayer/ui/test3/download2/DlTasksManagerModel.java

@@ -0,0 +1,101 @@
+package org.yczbj.ycvideoplayer.ui.test3.download2;
+
+import android.content.ContentValues;
+
+/**
+ * Created by yc on 2018/1/17.
+ */
+
+public class DlTasksManagerModel {
+
+    public final static String ID = "id";
+    public final static String LOGO = "logo";
+    public final static String NAME = "name";
+    public final static String URL = "url";
+    public final static String PATH = "path";
+    public final static String TYPE = "type";
+
+    private int id;
+    private String logo;
+    private String name;
+    private String url;
+    private String path;
+    /**
+     * type表示类型:1是正在下载中数据;2是已经完成下载数据,其他则是默认为1类型
+     */
+    private int type;
+
+    public DlTasksManagerModel() {
+
+    }
+
+    public DlTasksManagerModel(int id, String logo, String name, String url, String path , int type) {
+        this.id = id;
+        this.logo = logo;
+        this.name = name;
+        this.url = url;
+        this.path = path;
+        this.type = type;
+    }
+
+    public String getLogo() {
+        return logo;
+    }
+
+    public void setLogo(String logo) {
+        this.logo = logo;
+    }
+
+    public int getId() {
+        return id;
+    }
+
+    public void setId(int id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getUrl() {
+        return url;
+    }
+
+    public void setUrl(String url) {
+        this.url = url;
+    }
+
+    public String getPath() {
+        return path;
+    }
+
+    public void setPath(String path) {
+        this.path = path;
+    }
+
+    public int getType() {
+        return type;
+    }
+
+    public void setType(int type) {
+        this.type = type;
+    }
+
+
+    public ContentValues toContentValues() {
+        ContentValues cv = new ContentValues();
+        cv.put(ID, id);
+        cv.put(LOGO, logo);
+        cv.put(NAME, name);
+        cv.put(URL, url);
+        cv.put(PATH, path);
+        cv.put(TYPE, type);
+        return cv;
+    }
+
+}

+ 0 - 9
app/src/main/java/org/yczbj/ycvideoplayer/ui/test3/ui/activity/DLManyTestActivity.java

@@ -45,15 +45,6 @@ public class DLManyTestActivity extends BaseActivity {
         DLTasksManager.getImpl().onCreate(new WeakReference<>(this));
     }
 
-    @Override
-    protected void onDestroy() {
-        TasksManager.getImpl().onDestroy();
-        adapter = null;
-        FileDownloader.getImpl().pauseAll();
-        super.onDestroy();
-    }
-
-
     @Override
     public int getContentView() {
         return R.layout.base_recycler_view;

+ 134 - 5
app/src/main/java/org/yczbj/ycvideoplayer/ui/test3/ui/activity/DLMyFileTestActivity.java

@@ -1,10 +1,139 @@
 package org.yczbj.ycvideoplayer.ui.test3.ui.activity;
 
-import android.support.v7.app.AppCompatActivity;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.view.View;
+import android.widget.Button;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
 
-/**
- * Created by yc on 2018/1/12.
- */
+import com.blankj.utilcode.util.ScreenUtils;
+import com.blankj.utilcode.util.SizeUtils;
+import com.pedaily.yc.ycdialoglib.bottomLayout.BottomDialogFragment;
+
+import org.yczbj.ycrefreshviewlib.item.RecycleViewItemLine;
+import org.yczbj.ycvideoplayer.R;
+import org.yczbj.ycvideoplayer.api.ConstantVideo;
+import org.yczbj.ycvideoplayer.base.BaseActivity;
+import org.yczbj.ycvideoplayer.listener.OnListItemClickListener;
+import org.yczbj.ycvideoplayer.ui.home.model.DialogListBean;
+import org.yczbj.ycvideoplayer.ui.me.view.MeCacheActivity;
+import org.yczbj.ycvideoplayer.ui.me.view.MeMemberActivity;
+import org.yczbj.ycvideoplayer.ui.test3.download.DLTasksManagerModel;
+import org.yczbj.ycvideoplayer.ui.test3.download2.DlTasksManagerModel;
+import org.yczbj.ycvideoplayer.ui.test3.ui.adapter.DlMyFileAdapter;
+import org.yczbj.ycvideoplayer.util.AppUtil;
+import org.yczbj.ycvideoplayerlib.VideoPlayer;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import butterknife.Bind;
+
+public class DLMyFileTestActivity extends BaseActivity implements View.OnClickListener {
+
+
+    @Bind(R.id.btn_1)
+    Button btn1;
+    @Bind(R.id.btn_2)
+    Button btn2;
+    @Bind(R.id.video_player)
+    VideoPlayer videoPlayer;
+
+    @Override
+    public int getContentView() {
+        return R.layout.activity_test_dl_my;
+    }
+
+    @Override
+    public void initView() {
+
+    }
+
+    @Override
+    public void initListener() {
+        btn1.setOnClickListener(this);
+        btn2.setOnClickListener(this);
+    }
+
+    @Override
+    public void initData() {
+
+    }
+
+
+    @Override
+    public void onClick(View v) {
+        switch (v.getId()) {
+            case R.id.btn_1:
+                showBottomDialog();
+                break;
+            case R.id.btn_2:
+                startActivity(MeCacheActivity.class);
+                break;
+            default:
+                break;
+        }
+    }
+
+
+    private void showBottomDialog() {
+        final List<DlTasksManagerModel> list = new ArrayList<>();
+        for(int a = 0; a< ConstantVideo.VideoPlayerList.length; a++){
+            DlTasksManagerModel bean = new DlTasksManagerModel(0,"logo",
+                    ConstantVideo.VideoPlayerTitle[a], ConstantVideo.VideoPlayerList[a],"path",0);
+            list.add(bean);
+        }
+        final BottomDialogFragment dialog = new BottomDialogFragment();
+        dialog.setFragmentManager(getSupportFragmentManager());
+        dialog.setViewListener(new BottomDialogFragment.ViewListener() {
+            @Override
+            public void bindView(View v) {
+                RecyclerView recyclerView = (RecyclerView) v.findViewById(R.id.recyclerView);
+                ImageView ivCancel = (ImageView) v.findViewById(R.id.iv_cancel);
+                ImageView ivDownload = (ImageView) v.findViewById(R.id.iv_download);
+
+                recyclerView.setLayoutManager(new LinearLayoutManager(DLMyFileTestActivity.this));
+                DlMyFileAdapter mAdapter = new DlMyFileAdapter(DLMyFileTestActivity.this, list);
+                recyclerView.setAdapter(mAdapter);
+                final RecycleViewItemLine line = new RecycleViewItemLine(
+                        DLMyFileTestActivity.this, LinearLayout.HORIZONTAL,
+                        SizeUtils.dp2px(1),
+                        DLMyFileTestActivity.this.getResources().getColor(R.color.grayLine));
+                recyclerView.addItemDecoration(line);
+                mAdapter.setOnItemClickListener(new OnListItemClickListener() {
+                    @Override
+                    public void onItemClick(View view , int position) {
+
+                    }
+                });
+                View.OnClickListener listener = new View.OnClickListener() {
+                    @Override
+                    public void onClick(View v) {
+                        switch (v.getId()){
+                            case R.id.iv_cancel:
+                                dialog.dismissDialogFragment();
+                                break;
+                            case R.id.iv_download:
+
+                                break;
+                            default:
+                                break;
+                        }
+                    }
+                };
+                ivCancel.setOnClickListener(listener);
+                ivDownload.setOnClickListener(listener);
+            }
+        });
+        dialog.setLayoutRes(R.layout.dialog_bottom_list_view);
+        dialog.setDimAmount(0.5f);
+        dialog.setTag("BottomDialogFragment");
+        dialog.setCancelOutside(true);
+        //这个高度可以自己设置,十分灵活
+        dialog.setHeight(ScreenUtils.getScreenHeight()-videoPlayer.getHeight()
+                - AppUtil.getStatusBarHeight(this));
+        dialog.show();
+    }
 
-public class DLMyFileTestActivity extends AppCompatActivity {
 }

+ 12 - 3
app/src/main/java/org/yczbj/ycvideoplayer/ui/test3/ui/adapter/DLManyAdapter.java

@@ -60,7 +60,7 @@ public class DLManyAdapter extends RecyclerView.Adapter<DLManyAdapter.MyViewHold
 
     @Override
     public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
-        View view = LayoutInflater.from(context).inflate(R.layout.item_dialog_list_view, parent, false);
+        View view = LayoutInflater.from(context).inflate(R.layout.item_down_list_view, parent, false);
         return new MyViewHolder(view, mItemClickListener);
     }
 
@@ -309,12 +309,21 @@ public class DLManyAdapter extends RecyclerView.Adapter<DLManyAdapter.MyViewHold
                 // to start
                 // to start
                 String path = TasksManager.getImpl().createPath(downManyBean.getPath());
-                final DLTasksManagerModel model = DLTasksManager.getImpl().get(holder.position);
-                final BaseDownloadTask task = FileDownloader.getImpl().create(model.getUrl())
+                final BaseDownloadTask task = FileDownloader.getImpl().create(downManyBean.getPath())
                         .setPath(path)
                         .setCallbackProgressTimes(100)
                         .setListener(taskDownloadListener);
 
+                /*final DLTasksManagerModel model = DLTasksManager.getImpl().get(holder.position);
+                if(model==null){
+                    ToastUtil.showToast(context,"值不能为空");
+                    return;
+                }
+                final BaseDownloadTask task = FileDownloader.getImpl().create(model.getUrl())
+                        .setPath(path)
+                        .setCallbackProgressTimes(100)
+                        .setListener(taskDownloadListener);*/
+
                 DLTasksManager.getImpl().addTaskForViewHolder(task);
                 DLTasksManager.getImpl().updateViewHolder(holder.id, holder);
                 task.start();

+ 566 - 0
app/src/main/java/org/yczbj/ycvideoplayer/ui/test3/ui/adapter/DlMyFileAdapter.java

@@ -0,0 +1,566 @@
+package org.yczbj.ycvideoplayer.ui.test3.ui.adapter;
+
+import android.annotation.SuppressLint;
+import android.app.Activity;
+import android.content.Context;
+import android.support.v7.widget.RecyclerView;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.ProgressBar;
+import android.widget.TextView;
+
+import com.liulishuo.filedownloader.BaseDownloadTask;
+import com.liulishuo.filedownloader.FileDownloadListener;
+import com.liulishuo.filedownloader.FileDownloadSampleListener;
+import com.liulishuo.filedownloader.FileDownloader;
+import com.liulishuo.filedownloader.model.FileDownloadStatus;
+import com.liulishuo.filedownloader.util.FileDownloadUtils;
+import com.ns.yc.ycprogresslib.CircleProgressbar;
+import com.pedaily.yc.ycdialoglib.toast.ToastUtil;
+
+import org.yczbj.ycvideoplayer.R;
+import org.yczbj.ycvideoplayer.download.TasksManager;
+import org.yczbj.ycvideoplayer.download.TasksManagerModel;
+import org.yczbj.ycvideoplayer.listener.OnListItemClickListener;
+import org.yczbj.ycvideoplayer.ui.home.view.adapter.DownloadVideoAdapter;
+import org.yczbj.ycvideoplayer.ui.test3.download2.DlTasksManager;
+import org.yczbj.ycvideoplayer.ui.test3.download2.DlTasksManagerModel;
+import org.yczbj.ycvideoplayer.util.LogUtils;
+
+import java.io.File;
+import java.lang.ref.WeakReference;
+import java.util.List;
+
+import butterknife.Bind;
+import butterknife.ButterKnife;
+
+
+public class DlMyFileAdapter extends RecyclerView.Adapter<DlMyFileAdapter.ViewHolder> {
+
+
+    private LayoutInflater inflater;
+    private List<DlTasksManagerModel> mList;
+    private Context mContext;
+    private OnListItemClickListener onItemClickListener;
+
+    public DlMyFileAdapter(Context mContext, List<DlTasksManagerModel> mList) {
+        this.mList = mList;
+        this.mContext = mContext;
+        inflater = LayoutInflater.from(mContext);
+        //1.一定要添加这一步
+        DlTasksManager.getImpl().onCreate(new WeakReference<>(this));
+    }
+
+    @Override
+    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+        return new ViewHolder(inflater.inflate(R.layout.item_dialog_list_view, parent, false));
+    }
+
+    @Override
+    public void onBindViewHolder(ViewHolder holder, @SuppressLint("RecyclerView") final int position) {
+        DlTasksManagerModel model = mList.get(position);
+        //获取下载链接
+        String url = model.getUrl();
+        //通过下载链接创建下载路径
+        final String path = DlTasksManager.getImpl().createPath(url);
+        //通过下载链接创建下载id
+        int id = DlTasksManager.getImpl().getId(url);
+        //model.setId(id);
+        //model.setUrl(url);
+        //model.setPath(path);
+
+
+        holder.update(id,position,model);
+        DlTasksManager.getImpl().updateViewHolder(holder.id, holder);
+
+
+        holder.llDownload.setTag(holder);
+        holder.ivDownload.setTag(R.drawable.icon_cache_download);
+        holder.llDownload.setOnClickListener(taskActionOnClickListener);
+
+        holder.tvTitle.setText(model.getName());
+        holder.tvTime.setText("时长98:00:12");
+        holder.tvVideoSize.setText("100MB");
+        holder.ivDownload.setBackgroundResource(R.drawable.icon_cache_download);
+
+        //设置类型
+        holder.circlePb.setProgressType(CircleProgressbar.ProgressType.COUNT);
+        //设置圆形的填充颜色
+        holder.circlePb.setInCircleColor(mContext.getResources().getColor(R.color.colorTransparent));
+        //设置外部轮廓的颜色
+        holder.circlePb.setOutLineColor(mContext.getResources().getColor(R.color.gray3));
+        //设置进度监听
+        holder.circlePb.setCountdownProgressListener(1, progressListener);
+        //设置外部轮廓的颜色
+        holder.circlePb.setOutLineWidth(1);
+        //设置进度条线的宽度
+        holder.circlePb.setProgressLineWidth(2);
+        //设置进度
+        holder.circlePb.setProgress(0);
+
+        //条目点击事件
+        holder.itemView.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                if (onItemClickListener != null) {
+                    onItemClickListener.onItemClick(view, position);
+                }
+            }
+        });
+
+
+
+        if (DlTasksManager.getImpl().isReady()) {
+            final int status = DlTasksManager.getImpl().getStatus(id, path);
+            if (status == FileDownloadStatus.pending || status == FileDownloadStatus.started || status == FileDownloadStatus.connected) {
+                // start task, but file not created yet
+                //当下载在排队中,开始下载,或者链接下载时,则开始调用更新下载进度和状态的方法
+                long soFar = DlTasksManager.getImpl().getSoFar(id);
+                //使用{code id}获取任务目标文件的总字节。
+                long total = DlTasksManager.getImpl().getTotal(id);
+                holder.updateDownloading(status,soFar , total);
+            } else if (!new File(path).exists() && !new File(FileDownloadUtils.getTempPath(path)).exists()) {
+                // not exist file
+                //当下载文件夹不存在,并且下载路径不存在时,直接调用下载错误方法
+                holder.updateNotDownloaded(status, 0, 0);
+            } else if (DlTasksManager.getImpl().isDownloaded(status)) {
+                // already downloaded and exist
+                //获取下载的状态是否下载完成,如果完成,则调用该方法
+                holder.updateDownloaded();
+            } else if (status == FileDownloadStatus.progress) {
+                //当下载在排队中,开始下载,或者链接下载时,则开始调用更新下载进度和状态的方法
+                long soFar = DlTasksManager.getImpl().getSoFar(id);
+                //使用{code id}获取任务目标文件的总字节。
+                long total = DlTasksManager.getImpl().getTotal(id);
+                // downloading
+                holder.updateDownloading(status, soFar, total);
+            } else {
+                // not start
+                //当下载在排队中,开始下载,或者链接下载时,则开始调用更新下载进度和状态的方法
+                long soFar = DlTasksManager.getImpl().getSoFar(id);
+                //使用{code id}获取任务目标文件的总字节。
+                long total = DlTasksManager.getImpl().getTotal(id);
+                holder.updateNotDownloaded(status, soFar, total);
+            }
+        } else {
+            //状态: 加载中...
+        }
+    }
+
+
+    @Override
+    public int getItemCount() {
+        return mList.size();
+    }
+
+
+    public void postNotifyDataChanged() {
+        ((Activity) mContext).runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                notifyDataSetChanged();
+            }
+        });
+    }
+
+
+    public class ViewHolder extends RecyclerView.ViewHolder {
+
+        @Bind(R.id.tv_title)
+        TextView tvTitle;
+        @Bind(R.id.tv_time)
+        TextView tvTime;
+        @Bind(R.id.pb)
+        ProgressBar pb;
+        @Bind(R.id.iv_download)
+        ImageView ivDownload;
+        @Bind(R.id.circle_pb)
+        CircleProgressbar circlePb;
+        @Bind(R.id.tv_download_state)
+        TextView tvDownloadState;
+        @Bind(R.id.tv_video_size)
+        TextView tvVideoSize;
+        @Bind(R.id.ll_download)
+        LinearLayout llDownload;
+        /**
+         * viewHolder position
+         */
+        private int position;
+        /**
+         * download id
+         */
+        private int id;
+        /**
+         * 数据
+         */
+        private DlTasksManagerModel model;
+
+
+        ViewHolder(View itemView) {
+            super(itemView);
+            ButterKnife.bind(this, itemView);
+        }
+
+        public void update(final int id, final int position, DlTasksManagerModel model) {
+            this.id = id;
+            this.position = position;
+            this.model = model;
+        }
+
+        void updateDownloaded() {
+            //当下载完成后,隐藏圆环控件,显示删除图标
+            circlePb.setVisibility(View.GONE);
+            ivDownload.setBackgroundResource(R.drawable.icon_cache_delete);
+            tvDownloadState.setText("下载完成");
+            ivDownload.setTag(R.drawable.icon_cache_delete);
+
+            pb.setMax(1);
+            pb.setProgress(1);
+
+            //TODO 当下载完成以后,就把下载完的数据保存起来
+            DlTasksManager.getImpl().deleteTasksManagerModel(model.getUrl());
+            if (!DlTasksManager.getImpl().isExistDownloadFile(model.getUrl())) {
+                DlTasksManager.getImpl().addDownloaded(model);
+                ToastUtil.showToast(mContext,"添加下载完成数据成功");
+            }
+        }
+
+        @SuppressLint("DefaultLocale")
+        void updateNotDownloaded(int status, long sofar, long total) {
+            if (sofar > 0 && total > 0) {
+                final float percent = sofar / (float) total;
+                circlePb.setProgress((int) (percent * 100));
+                pb.setMax(100);
+                pb.setProgress((int) (percent * 100));
+            } else {
+                circlePb.setProgress(0);
+                pb.setMax(1);
+                pb.setProgress(0);
+            }
+            switch (status) {
+                case FileDownloadStatus.error:
+                    ivDownload.setBackgroundResource(R.drawable.icon_cache_download);
+                    tvDownloadState.setText("错误");
+                    break;
+                case FileDownloadStatus.paused:
+                    tvVideoSize.setText(String.format("%dMB",total/1024/1024));
+                    ivDownload.setBackgroundResource(R.drawable.icon_cache_download);
+                    tvDownloadState.setText("暂停");
+                    break;
+                default:
+                    ivDownload.setBackgroundResource(R.drawable.icon_cache_download);
+                    break;
+            }
+            ivDownload.setTag(R.drawable.icon_cache_download);
+        }
+
+
+        void updateDownloading(int status, long sofar, long total) {
+            final float percent = sofar / (float) total;
+            circlePb.setProgress((int) (percent * 100));
+            switch (status) {
+                case FileDownloadStatus.pending:
+                    tvDownloadState.setText("排队中");
+                    ivDownload.setBackgroundResource(R.drawable.icon_cache_download);
+                    break;
+                case FileDownloadStatus.started:
+                    tvDownloadState.setText("开始下载");
+                    ivDownload.setBackgroundResource(R.drawable.icon_cache_download);
+                    break;
+                case FileDownloadStatus.connected:
+                    tvDownloadState.setText("链接中");
+                    ivDownload.setBackgroundResource(R.drawable.icon_cache_download);
+                    break;
+                case FileDownloadStatus.progress:
+                    tvDownloadState.setText("下载中");
+                    ivDownload.setBackgroundResource(R.drawable.icon_cache_play);
+                    break;
+                default:
+                    ivDownload.setBackgroundResource(R.drawable.icon_cache_play);
+                    break;
+            }
+            pb.setMax(100);
+            pb.setProgress((int) (percent * 100));
+            ivDownload.setTag(R.drawable.icon_cache_play);
+        }
+    }
+
+
+    /**
+     * 处理点击事件
+     */
+    private View.OnClickListener taskActionOnClickListener = new View.OnClickListener() {
+        @Override
+        public void onClick(View v) {
+            if (v.getTag() == null) {
+                return;
+            }
+
+            ViewHolder holder = (ViewHolder) v.getTag();
+            int res = (int) holder.ivDownload.getTag();
+            int play = R.drawable.icon_cache_play;
+            int delete = R.drawable.icon_cache_delete;
+            int download = R.drawable.icon_cache_download;
+
+            DlTasksManagerModel model = mList.get(holder.position);
+            if (res == play) {
+                //暂停
+                ToastUtil.showToast(mContext,"暂停");
+                FileDownloader.getImpl().pause(holder.id);
+            } else if (res == download) {
+                //下载
+                ToastUtil.showToast(mContext,"下载");
+                //获取下载链接
+                String url = model.getUrl();
+                //获取路径
+                String path = DlTasksManager.getImpl().createPath(url);
+                final BaseDownloadTask task = FileDownloader.getImpl().create(url)
+                        .setPath(path)
+                        .setCallbackProgressTimes(500)
+                        .setListener(taskListener);
+                DlTasksManager.getImpl().addTaskForViewHolder(task);
+                //将下载中的任务添加到缓冲数据库中,方便其他地方调用
+                DlTasksManager.getImpl().addTask(model.getUrl());
+                DlTasksManager.getImpl().updateViewHolder(holder.id, holder);
+                task.start();
+            } else if (res == delete) {
+                //删除
+                ToastUtil.showToast(mContext,"删除");
+                //String path = DlTasksManager.getImpl().get(holder.position).getPath();
+                //String path = model.getPath();
+                String path = DlTasksManager.getImpl().createPath(model.getUrl());
+                if(path!=null){
+                    //删除
+                    //noinspection ResultOfMethodCallIgnored
+                    new File(path).delete();
+                }else {
+                    ToastUtil.showToast(mContext,"删除路径不能为空");
+                }
+                holder.updateNotDownloaded(FileDownloadStatus.INVALID_STATUS, 0, 0);
+                //不仅要删除文件,还要移除已经完成下载数据中的数据
+                DlTasksManager.getImpl().removeDownloaded(model.getUrl());
+                //DlTasksManager.getImpl().removeDownloaded(path);
+            }
+        }
+    };
+
+
+    /**
+     * 这个是用来监听下载的情况[没问题]
+     * 1.下载队列中
+     * 2.开始下载
+     * 3.连接中
+     * 4.下载中
+     * 5.下载错误
+     * 6.暂停
+     * 7.完成
+     */
+    private FileDownloadListener taskDownloadListener = new FileDownloadSampleListener() {
+
+        private ViewHolder checkCurrentHolder(final BaseDownloadTask task) {
+            final ViewHolder tag = (ViewHolder) task.getTag();
+            if(tag.id == 0){
+                ToastUtil.showToast(mContext,"id值不对");
+                return null;
+            }
+            if (tag.id != task.getId()) {
+                return null;
+            }
+            return tag;
+        }
+
+        @Override
+        protected void pending(BaseDownloadTask task, int soFarBytes, int totalBytes) {
+            super.pending(task, soFarBytes, totalBytes);
+            final ViewHolder tag = checkCurrentHolder(task);
+            if (tag == null) {
+                return;
+            }
+            tag.updateDownloading(FileDownloadStatus.pending, soFarBytes, totalBytes);
+            tag.tvDownloadState.setText("队列中");
+        }
+
+        @Override
+        protected void started(BaseDownloadTask task) {
+            super.started(task);
+            final ViewHolder tag = checkCurrentHolder(task);
+            if (tag == null) {
+                return;
+            }
+            tag.tvDownloadState.setText("状态: 开始下载");
+        }
+
+        @Override
+        protected void connected(BaseDownloadTask task, String etag, boolean isContinue, int soFarBytes, int totalBytes) {
+            super.connected(task, etag, isContinue, soFarBytes, totalBytes);
+            final ViewHolder tag = checkCurrentHolder(task);
+            if (tag == null) {
+                return;
+            }
+            tag.updateDownloading(FileDownloadStatus.connected, soFarBytes, totalBytes);
+            tag.tvDownloadState.setText("状态: 连接中");
+        }
+
+        @Override
+        protected void progress(BaseDownloadTask task, int soFarBytes, int totalBytes) {
+            super.progress(task, soFarBytes, totalBytes);
+            final ViewHolder tag = checkCurrentHolder(task);
+            if (tag == null) {
+                return;
+            }
+            tag.updateDownloading(FileDownloadStatus.progress, soFarBytes, totalBytes);
+            tag.tvDownloadState.setText("状态: 下载中");
+        }
+
+        @Override
+        protected void error(BaseDownloadTask task, Throwable e) {
+            super.error(task, e);
+            final ViewHolder tag = checkCurrentHolder(task);
+            if (tag == null) {
+                return;
+            }
+            tag.updateNotDownloaded(FileDownloadStatus.error, task.getLargeFileSoFarBytes()
+                    , task.getLargeFileTotalBytes());
+            tag.tvDownloadState.setText("状态: 错误");
+            DlTasksManager.getImpl().removeTaskForViewHolder(task.getId());
+        }
+
+        @Override
+        protected void paused(BaseDownloadTask task, int soFarBytes, int totalBytes) {
+            super.paused(task, soFarBytes, totalBytes);
+            final ViewHolder tag = checkCurrentHolder(task);
+            if (tag == null) {
+                return;
+            }
+            tag.updateNotDownloaded(FileDownloadStatus.paused, soFarBytes, totalBytes);
+            tag.tvDownloadState.setText("状态: 暂停");
+            DlTasksManager.getImpl().removeTaskForViewHolder(task.getId());
+        }
+
+        @Override
+        protected void completed(BaseDownloadTask task) {
+            super.completed(task);
+            final ViewHolder tag = checkCurrentHolder(task);
+            if (tag == null) {
+                return;
+            }
+            tag.updateDownloaded();
+            tag.tvDownloadState.setText("状态: 完成");
+            DlTasksManager.getImpl().removeTaskForViewHolder(task.getId());
+        }
+    };
+
+
+    /**
+     * 原生demo案例代码
+     */
+    private FileDownloadListener taskListener = new FileDownloadSampleListener() {
+        private ViewHolder checkCurrentHolder(final BaseDownloadTask task) {
+            final ViewHolder tag = (ViewHolder) task.getTag();
+            /*if (tag.id != task.getId()) {
+                return null;
+            }*/
+            return tag;
+        }
+
+        @Override
+        protected void pending(BaseDownloadTask task, int soFarBytes, int totalBytes) {
+            super.pending(task, soFarBytes, totalBytes);
+            final ViewHolder tag = checkCurrentHolder(task);
+            if (tag == null) {
+                return;
+            }
+            tag.updateDownloading(FileDownloadStatus.pending, soFarBytes, totalBytes);
+            tag.tvDownloadState.setText(R.string.tasks_manager_demo_status_pending);
+        }
+
+        @Override
+        protected void started(BaseDownloadTask task) {
+            super.started(task);
+            final ViewHolder tag = checkCurrentHolder(task);
+            if (tag == null) {
+                return;
+            }
+            tag.tvDownloadState.setText(R.string.tasks_manager_demo_status_started);
+        }
+
+        @Override
+        protected void connected(BaseDownloadTask task, String etag, boolean isContinue, int soFarBytes, int totalBytes) {
+            super.connected(task, etag, isContinue, soFarBytes, totalBytes);
+            final ViewHolder tag = checkCurrentHolder(task);
+            if (tag == null) {
+                return;
+            }
+            tag.updateDownloading(FileDownloadStatus.connected, soFarBytes, totalBytes);
+            tag.tvDownloadState.setText(R.string.tasks_manager_demo_status_connected);
+        }
+
+        @Override
+        protected void progress(BaseDownloadTask task, int soFarBytes, int totalBytes) {
+            super.progress(task, soFarBytes, totalBytes);
+            final ViewHolder tag = checkCurrentHolder(task);
+            if (tag == null) {
+                return;
+            }
+            tag.updateDownloading(FileDownloadStatus.progress, soFarBytes, totalBytes);
+        }
+
+        @Override
+        protected void error(BaseDownloadTask task, Throwable e) {
+            super.error(task, e);
+            final ViewHolder tag = checkCurrentHolder(task);
+            if (tag == null) {
+                return;
+            }
+
+            tag.updateNotDownloaded(FileDownloadStatus.error, task.getLargeFileSoFarBytes()
+                    , task.getLargeFileTotalBytes());
+            TasksManager.getImpl().removeTaskForViewHolder(task.getId());
+        }
+
+        @Override
+        protected void paused(BaseDownloadTask task, int soFarBytes, int totalBytes) {
+            super.paused(task, soFarBytes, totalBytes);
+            final ViewHolder tag = checkCurrentHolder(task);
+            if (tag == null) {
+                return;
+            }
+
+            tag.updateNotDownloaded(FileDownloadStatus.paused, soFarBytes, totalBytes);
+            tag.tvDownloadState.setText(R.string.tasks_manager_demo_status_paused);
+            TasksManager.getImpl().removeTaskForViewHolder(task.getId());
+        }
+
+        @Override
+        protected void completed(BaseDownloadTask task) {
+            super.completed(task);
+            final ViewHolder tag = checkCurrentHolder(task);
+            if (tag == null) {
+                return;
+            }
+
+            tag.updateDownloaded();
+            TasksManager.getImpl().removeTaskForViewHolder(task.getId());
+        }
+    };
+    
+
+    private CircleProgressbar.OnCountdownProgressListener progressListener
+            = new CircleProgressbar.OnCountdownProgressListener() {
+        @Override
+        public void onProgress(int what, int progress) {
+            if (what == 1) {
+
+            }
+        }
+    };
+
+
+    public void setOnItemClickListener(OnListItemClickListener onItemClickListener) {
+        this.onItemClickListener = onItemClickListener;
+    }
+
+}

+ 36 - 0
app/src/main/res/layout/activity_me_cache.xml

@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:orientation="vertical"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:padding="10dp"
+        android:orientation="horizontal">
+        <Button
+            android:id="@+id/btn_1"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="编辑"/>
+        <Button
+            android:id="@+id/btn_2"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="侧滑"/>
+        <Button
+            android:id="@+id/btn_3"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="拖动条目移动位置"/>
+    </LinearLayout>
+
+
+    <android.support.v7.widget.RecyclerView
+        android:id="@+id/recyclerView"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"/>
+
+</LinearLayout>

+ 29 - 0
app/src/main/res/layout/activity_test_dl_my.xml

@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:orientation="vertical"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:padding="10dp">
+
+
+    <org.yczbj.ycvideoplayerlib.VideoPlayer
+        android:id="@+id/video_player"
+        android:layout_width="match_parent"
+        android:layout_height="150dp"/>
+
+    <Button
+        android:id="@+id/btn_1"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:gravity="left|center_vertical"
+        android:text="1.模拟弹窗下载列表"/>
+
+    <Button
+        android:id="@+id/btn_2"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:gravity="left|center_vertical"
+        android:text="2.跳转到我的下载页面,看缓冲是否同步"/>
+
+</LinearLayout>

+ 1 - 1
app/src/main/res/layout/dialog_bottom_list_view.xml

@@ -23,7 +23,7 @@
             android:id="@+id/iv_cancel"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:visibility="gone"
+            android:visibility="visible"
             android:background="@drawable/icon_cancel"/>
     </LinearLayout>
     <View style="@style/DeepUnderLineDp"/>

+ 2 - 14
app/src/main/res/layout/item_dialog_list_view.xml

@@ -36,18 +36,6 @@
             android:layout_weight="1.0" />
     </LinearLayout>
 
-    <TextView
-        android:id="@+id/tv_start_or_pause"
-        android:layout_width="wrap_content"
-        android:layout_height="match_parent"
-        android:layout_margin="10dp"
-        android:gravity="center"
-        android:layout_marginTop="3dp"
-        android:background="@color/gray3"
-        android:padding="10dp"
-        android:textSize="14sp"
-        android:textColor="@color/blackText3"
-        android:text="暂停"/>
 
     <LinearLayout
         android:id="@+id/ll_download"
@@ -66,8 +54,8 @@
                 android:background="@drawable/icon_cache_download"/>
             <com.ns.yc.ycprogresslib.CircleProgressbar
                 android:id="@+id/circle_pb"
-                android:layout_width="20dp"
-                android:layout_height="20dp"
+                android:layout_width="25dp"
+                android:layout_height="25dp"
                 android:text="" />
         </FrameLayout>
         <TextView

+ 93 - 0
app/src/main/res/layout/item_down_list_view.xml

@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:orientation="horizontal"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:padding="10dp">
+
+    <LinearLayout
+        android:layout_width="0dp"
+        android:layout_weight="1"
+        android:layout_height="wrap_content"
+        android:orientation="vertical">
+        <TextView
+            android:id="@+id/tv_title"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:textColor="@color/blackText"
+            android:textSize="16sp"
+            android:maxLength="15"
+            android:text="笑傲江湖之东方不败"/>
+        <TextView
+            android:id="@+id/tv_time"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="15dp"
+            android:textColor="@color/blackText3"
+            android:textSize="12sp"
+            android:text="96:09"/>
+        <ProgressBar
+            android:id="@+id/pb"
+            style="?android:attr/progressBarStyleHorizontal"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="5dp"
+            android:layout_weight="1.0" />
+    </LinearLayout>
+
+    <TextView
+        android:id="@+id/tv_start_or_pause"
+        android:layout_width="wrap_content"
+        android:layout_height="match_parent"
+        android:layout_margin="10dp"
+        android:gravity="center"
+        android:layout_marginTop="3dp"
+        android:background="@color/gray3"
+        android:padding="10dp"
+        android:textSize="14sp"
+        android:textColor="@color/blackText3"
+        android:text="暂停"/>
+
+    <LinearLayout
+        android:id="@+id/ll_download"
+        android:layout_width="80dp"
+        android:layout_height="wrap_content"
+        android:orientation="vertical"
+        android:gravity="center">
+        <FrameLayout
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content">
+            <ImageView
+                android:id="@+id/iv_download"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center"
+                android:background="@drawable/icon_cache_download"/>
+            <com.ns.yc.ycprogresslib.CircleProgressbar
+                android:id="@+id/circle_pb"
+                android:layout_width="20dp"
+                android:layout_height="20dp"
+                android:text="" />
+        </FrameLayout>
+        <TextView
+            android:id="@+id/tv_download_state"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="3dp"
+            android:textSize="10sp"
+            android:textColor="@color/blackText3"
+            android:text="下载状态"/>
+        <TextView
+            android:id="@+id/tv_video_size"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="3dp"
+            android:textSize="12sp"
+            android:textColor="@color/blackText3"
+            android:text="987.8MB"/>
+    </LinearLayout>
+
+
+
+</LinearLayout>

+ 86 - 0
app/src/main/res/layout/item_me_cache_data.xml

@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="utf-8"?>
+<org.yczbj.ycrefreshviewlib.swipeMenu.YCSwipeMenu
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:orientation="horizontal"
+    android:layout_height="wrap_content"
+    android:layout_width="match_parent">
+
+    <!--item内容-->
+    <RelativeLayout
+        android:orientation="horizontal"
+        android:layout_width="match_parent"
+        android:layout_height="100dp"
+        android:gravity="center_vertical"
+        android:foreground="?android:attr/selectableItemBackground"
+        android:background="@android:color/white">
+        <FrameLayout
+            android:id="@+id/fl_image"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_centerVertical="true"
+            android:layout_marginLeft="16dp">
+            <ImageView
+                android:id="@+id/iv_image"
+                android:layout_width="100dp"
+                android:layout_height="75dp"
+                android:background="@drawable/image_default" />
+            <ImageView
+                android:id="@+id/iv_download"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center"
+                android:src="@drawable/ic_player_start"/>
+        </FrameLayout>
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:paddingBottom="5dp"
+            android:paddingTop="5dp"
+            android:paddingLeft="10dp"
+            android:paddingRight="10dp"
+            android:layout_toRightOf="@+id/fl_image"
+            android:gravity="center_vertical"
+            android:orientation="vertical">
+            <TextView
+                android:id="@+id/tv_name"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:textSize="16sp"
+                android:text="这个是音视频的标题"
+                android:textColor="@color/blackText"
+                android:gravity="center_vertical" />
+            <TextView
+                android:id="@+id/tv_state"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="5dp"
+                android:textColor="@color/blackText2"
+                android:text="下载状态"
+                android:textSize="12sp"/>
+            <ProgressBar
+                android:id="@+id/pb"
+                style="?android:attr/progressBarStyleHorizontal"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="5dp"/>
+        </LinearLayout>
+    </RelativeLayout>
+
+    <!-- 侧滑菜单 -->
+    <Button
+        android:id="@+id/btn_del"
+        android:layout_width="70dp"
+        android:layout_height="match_parent"
+        android:background="@color/colorPrimary"
+        android:text="删除"
+        android:textColor="@android:color/white"/>
+    <Button
+        android:id="@+id/btn_top"
+        android:layout_width="70dp"
+        android:layout_height="match_parent"
+        android:background="@color/colorAccent"
+        android:text="置顶"
+        android:textColor="@android:color/white"/>
+
+</org.yczbj.ycrefreshviewlib.swipeMenu.YCSwipeMenu>