package com.dl7.mvp.adapter; import android.content.Context; import android.support.v4.content.ContextCompat; import android.view.View; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.ImageView; import com.daimajia.numberprogressbar.NumberProgressBar; import com.dl7.downloaderlib.entity.FileInfo; import com.dl7.downloaderlib.model.DownloadStatus; import com.dl7.mvp.R; import com.dl7.mvp.engine.DownloaderWrapper; import com.dl7.mvp.local.table.VideoInfo; import com.dl7.mvp.module.video.player.VideoPlayerActivity; import com.dl7.mvp.rxbus.RxBus; import com.dl7.mvp.utils.DefIconFactory; import com.dl7.mvp.utils.ImageLoader; import com.dl7.mvp.utils.StringUtils; import com.dl7.recycler.adapter.BaseViewHolder; /** * Created by long on 2016/12/15. * Video 下载适配器 */ public class VideoCacheAdapter extends BaseVideoDLAdapter { public VideoCacheAdapter(Context context, RxBus rxBus) { super(context, rxBus); } @Override protected int attachLayoutRes() { return R.layout.adapter_video_cache; } @Override protected void convert(final BaseViewHolder holder, final VideoInfo item) { setTag(holder, item.getVideoUrl()); ImageView ivThumb = holder.getView(R.id.iv_thumb); ImageLoader.loadFitCenter(mContext, item.getCover(), ivThumb, DefIconFactory.provideIcon()); holder.setText(R.id.tv_title, item.getTitle()); _switchViews(holder, item); holder.getView(R.id.btn_download).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { _handleClick(holder, item); } }); // 根据是否为编辑模式来进行处理 final CheckBox cbDelete = holder.getView(R.id.cb_delete); if (mIsEditMode) { cbDelete.setVisibility(View.VISIBLE); cbDelete.setChecked(mSparseItemChecked.get(holder.getAdapterPosition())); } else { cbDelete.setVisibility(View.GONE); cbDelete.setChecked(false); } cbDelete.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { // 注意这里在切换为编辑状态时,获取holder.getAdapterPosition()=-1 的情况,要在_handleCheckedChanged()进行判断处理 _handleCheckedChanged(holder.getAdapterPosition(), isChecked); } }); holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (mIsEditMode) { cbDelete.setChecked(!cbDelete.isChecked()); } else { VideoPlayerActivity.launch(mContext, item); } } }); } /** * 更新视图 * @param holder * @param item */ private void _switchViews(BaseViewHolder holder, VideoInfo item) { switch (item.getDownloadStatus()) { case DownloadStatus.DOWNLOADING: NumberProgressBar pbDownload = holder.getView(R.id.pb_download); if (!holder.isVisible(R.id.pb_download) || !holder.isSelected(R.id.btn_download)) { holder.setVisible(R.id.pb_download, true) .setSelected(R.id.btn_download, true) .setText(R.id.tv_total_size, StringUtils.convertStorageNoB(item.getTotalSize())) .setTextColor(R.id.tv_speed, ContextCompat.getColor(mContext, R.color.download_normal)); pbDownload.setMax((int) item.getTotalSize()); } holder.setText(R.id.tv_load_size, StringUtils.convertStorageNoB(item.getLoadedSize()) + "/") .setText(R.id.tv_speed, StringUtils.convertStorageNoB(item.getDownloadSpeed()) + "/s"); pbDownload.setProgress((int) item.getLoadedSize()); break; case DownloadStatus.STOP: if (holder.isVisible(R.id.pb_download) || holder.isSelected(R.id.btn_download)) { holder.setVisible(R.id.pb_download, false) .setSelected(R.id.btn_download, false) .setText(R.id.tv_speed, "下载暂停") .setTextColor(R.id.tv_speed, ContextCompat.getColor(mContext, R.color.download_stop)); } break; case DownloadStatus.COMPLETE: mRxBus.post(item); case DownloadStatus.CANCEL: // 移除 removeItem(item); break; case DownloadStatus.ERROR: holder.setText(R.id.tv_speed, "异常出错,请重新下载") .setVisible(R.id.pb_download, false) .setSelected(R.id.btn_download, false) .setTextColor(R.id.tv_speed, ContextCompat.getColor(mContext, R.color.download_error)); break; } } /** * 点击处理 * @param holder * @param item */ private void _handleClick(BaseViewHolder holder, VideoInfo item) { switch (item.getDownloadStatus()) { case DownloadStatus.NORMAL: case DownloadStatus.ERROR: case DownloadStatus.STOP: holder.setText(R.id.tv_speed, "处理中...") .setTextColor(R.id.tv_speed, ContextCompat.getColor(mContext, R.color.download_normal)); DownloaderWrapper.start(item); break; case DownloadStatus.DOWNLOADING: holder.setText(R.id.tv_speed, "即将暂停") .setTextColor(R.id.tv_speed, ContextCompat.getColor(mContext, R.color.download_normal)); DownloaderWrapper.stop(item); break; default: break; } } /*********************************************************************/ /** * 更新下载状态 * * @param info 应用信息 */ private void _updateDownload(VideoInfo info) { BaseViewHolder holder = getTag(info.getVideoUrl()); if (holder == null) { return; } _switchViews(holder, info); } /** * 查找 VideoInfo * url:http://flv2.bn.netease.com/videolib3/1501/28/wlncJ2098/SD/wlncJ2098-mobile.mp4 * * @param name wlncJ2098-mobile.mp4 -> 文件名 * @return */ private VideoInfo _find(String name) { for (VideoInfo info : mData) { if (name.equals(StringUtils.clipFileName(info.getVideoUrl()))) { return info; } } return null; } /** * 更新下载状态 * * @param fileInfo 文件信息 */ public void updateDownload(FileInfo fileInfo) { VideoInfo info = _find(fileInfo.getName()); if (info == null) { return; } info.setDownloadStatus(fileInfo.getStatus()); info.setTotalSize(fileInfo.getTotalBytes()); info.setLoadedSize(fileInfo.getLoadBytes()); info.setDownloadSpeed(fileInfo.getSpeed()); _updateDownload(info); } }