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();
}
}
}