package zlc.season.rxdownloadproject.viewholder; import android.content.Context; import android.content.Intent; import android.net.Uri; import android.support.v7.widget.ListPopupWindow; import android.util.Log; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.ImageView; import android.widget.ProgressBar; import android.widget.TextView; import android.widget.Toast; import com.squareup.picasso.Picasso; import com.tbruyelle.rxpermissions2.RxPermissions; import java.io.File; import butterknife.BindView; import butterknife.ButterKnife; import butterknife.OnClick; import io.reactivex.functions.Action; import io.reactivex.functions.Consumer; import zlc.season.practicalrecyclerview.AbstractAdapter; import zlc.season.practicalrecyclerview.AbstractViewHolder; import zlc.season.rxdownload2.RxDownload; import zlc.season.rxdownload2.entity.DownloadEvent; import zlc.season.rxdownload2.entity.DownloadFlag; import zlc.season.rxdownload2.entity.DownloadStatus; import zlc.season.rxdownload2.function.Utils; import zlc.season.rxdownloadproject.model.DownloadController; import zlc.season.rxdownloadproject.R; import zlc.season.rxdownloadproject.model.DownloadItem; import static android.Manifest.permission.WRITE_EXTERNAL_STORAGE; import static zlc.season.rxdownload2.function.Utils.dispose; import static zlc.season.rxdownload2.function.Utils.empty; import static zlc.season.rxdownload2.function.Utils.log; import static zlc.season.rxdownloadproject.R.id.percent; /** * Author: Season(ssseasonnn@gmail.com) * Date: 2016/10/28 * Time: 09:37 * FIXME */ public class DownloadViewHolder extends AbstractViewHolder<DownloadItem> { @BindView(R.id.img) ImageView mImg; @BindView(percent) TextView mPercent; @BindView(R.id.progress) ProgressBar mProgress; @BindView(R.id.size) TextView mSize; @BindView(R.id.status) TextView mStatusText; @BindView(R.id.action) Button mActionButton; @BindView(R.id.name) TextView mName; @BindView(R.id.more) Button mMore; private AbstractAdapter mAdapter; private DownloadController mDownloadController; private Context mContext; private DownloadItem data; private RxDownload mRxDownload; private int flag; public DownloadViewHolder(ViewGroup parent, AbstractAdapter adapter) { super(parent, R.layout.download_manager_item); ButterKnife.bind(this, itemView); this.mAdapter = adapter; mContext = parent.getContext(); mRxDownload = RxDownload.getInstance(mContext); mDownloadController = new DownloadController(mStatusText, mActionButton); } @Override public void setData(DownloadItem param) { this.data = param; if (empty(param.record.getExtra1())) { Picasso.with(mContext).load(R.mipmap.ic_file_download).into(mImg); } else { Picasso.with(mContext).load(param.record.getExtra1()).into(mImg); } String name = empty(param.record.getExtra2()) ? param.record.getSaveName() : param.record.getExtra2(); mName.setText(name); Utils.log(data.record.getUrl()); data.disposable = mRxDownload.receiveDownloadStatus(data.record.getUrl()) .subscribe(new Consumer<DownloadEvent>() { @Override public void accept(DownloadEvent downloadEvent) throws Exception { if (flag != downloadEvent.getFlag()) { flag = downloadEvent.getFlag(); log(flag + ""); } if (downloadEvent.getFlag() == DownloadFlag.FAILED) { Throwable throwable = downloadEvent.getError(); Log.w("TAG", throwable); } mDownloadController.setEvent(downloadEvent); updateProgressStatus(downloadEvent.getDownloadStatus()); } }); } @OnClick({R.id.action, R.id.more}) public void onClick(View view) { switch (view.getId()) { case R.id.action: mDownloadController.handleClick(new DownloadController.Callback() { @Override public void startDownload() { start(); } @Override public void pauseDownload() { pause(); } @Override public void install() { installApk(); } }); break; case R.id.more: showPopUpWindow(view); break; } } private void updateProgressStatus(DownloadStatus status) { mProgress.setIndeterminate(status.isChunked); mProgress.setMax((int) status.getTotalSize()); mProgress.setProgress((int) status.getDownloadSize()); mPercent.setText(status.getPercent()); mSize.setText(status.getFormatStatusString()); } private void installApk() { File[] files = mRxDownload.getRealFiles(data.record.getUrl()); if (files != null) { Uri uri = Uri.fromFile(files[0]); Intent intent = new Intent(Intent.ACTION_VIEW); intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); intent.setDataAndType(uri, "application/vnd.android.package-archive"); mContext.startActivity(intent); } else { Toast.makeText(mContext, "File not exists", Toast.LENGTH_SHORT).show(); } } private void start() { RxPermissions.getInstance(mContext) .request(WRITE_EXTERNAL_STORAGE) .doOnNext(new Consumer<Boolean>() { @Override public void accept(Boolean granted) throws Exception { if (!granted) { throw new RuntimeException("no permission"); } } }) .compose(mRxDownload.<Boolean>transformService(data.record.getUrl())) .subscribe(new Consumer<Object>() { @Override public void accept(Object o) throws Exception { Toast.makeText(mContext, "下载开始", Toast.LENGTH_SHORT).show(); } }); } private void pause() { mRxDownload.pauseServiceDownload(data.record.getUrl()).subscribe(); } private void delete() { dispose(data.disposable); mRxDownload.deleteServiceDownload(data.record.getUrl(), true) .doFinally(new Action() { @Override public void run() throws Exception { mAdapter.remove(getAdapterPosition()); } }) .subscribe(); } private void showPopUpWindow(View view) { final ListPopupWindow listPopupWindow = new ListPopupWindow(mContext); listPopupWindow.setAdapter(new ArrayAdapter<>(mContext, android.R.layout.simple_list_item_1, new String[]{"删除"})); listPopupWindow.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int pos, long id) { if (pos == 0) { delete(); listPopupWindow.dismiss(); } } }); listPopupWindow.setWidth(200); listPopupWindow.setAnchorView(view); listPopupWindow.setModal(false); listPopupWindow.show(); } }