package zlc.season.rxdownloadproject.viewholder; import android.content.Context; import android.content.Intent; import android.net.Uri; import android.util.Log; import android.view.ViewGroup; import android.widget.Button; import android.widget.ImageView; 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.Consumer; import zlc.season.practicalrecyclerview.AbstractViewHolder; import zlc.season.rxdownload2.RxDownload; import zlc.season.rxdownload2.entity.DownloadBean; import zlc.season.rxdownload2.entity.DownloadEvent; import zlc.season.rxdownload2.entity.DownloadFlag; import zlc.season.rxdownload2.function.Utils; import zlc.season.rxdownloadproject.model.AppInfoBean; import zlc.season.rxdownloadproject.model.DownloadController; import zlc.season.rxdownloadproject.R; import static android.Manifest.permission.WRITE_EXTERNAL_STORAGE; import static zlc.season.rxdownload2.function.Utils.log; /** * Author: Season(ssseasonnn@gmail.com) * Date: 2016/11/14 * Time: 09:43 * FIXME */ public class AppInfoViewHolder extends AbstractViewHolder<AppInfoBean> { @BindView(R.id.head) ImageView mHead; @BindView(R.id.title) TextView mTitle; @BindView(R.id.content) TextView mContent; @BindView(R.id.action) Button mAction; private AppInfoBean mData; private DownloadController mDownloadController; private Context mContext; private RxDownload mRxDownload; private DownloadBean downloadBean; private int flag; public AppInfoViewHolder(ViewGroup parent) { super(parent, R.layout.app_info_item); ButterKnife.bind(this, itemView); mContext = parent.getContext(); mRxDownload = RxDownload.getInstance(mContext); mDownloadController = new DownloadController(new TextView(mContext), mAction); } @Override public void setData(AppInfoBean data) { this.mData = data; Picasso.with(mContext).load(data.img).into(mHead); mTitle.setText(data.name); mContent.setText(data.info); downloadBean = new DownloadBean .Builder(data.downloadUrl) .setSaveName(null) //not need. .setSavePath(null) //not need .setExtra1(mData.img) //save extra info into database. .setExtra2(mData.name) //save extra info into database. .build(); Utils.log(mData.downloadUrl); mData.disposable = mRxDownload.receiveDownloadStatus(mData.downloadUrl) .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); } }); } @OnClick(R.id.action) public void onClick() { mDownloadController.handleClick(new DownloadController.Callback() { @Override public void startDownload() { start(); } @Override public void pauseDownload() { pause(); } @Override public void install() { installApk(); } }); } 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(downloadBean)) .subscribe(new Consumer<Object>() { @Override public void accept(Object o) throws Exception { Toast.makeText(mContext, "下载开始", Toast.LENGTH_SHORT).show(); } }); } private void pause() { mRxDownload.pauseServiceDownload(mData.downloadUrl).subscribe(); } private void installApk() { File[] files = mRxDownload.getRealFiles(mData.downloadUrl); 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(); } } }