package com.lzy.okhttpdemo.activity;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.text.format.Formatter;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import com.bumptech.glide.Glide;
import com.lzy.okhttpdemo.Bean.ApkInfo;
import com.lzy.okhttpdemo.R;
import com.lzy.okhttpdemo.utils.ApkUtils;
import com.lzy.okhttpserver.download.DownloadInfo;
import com.lzy.okhttpserver.download.DownloadManager;
import com.lzy.okhttpserver.download.DownloadService;
import com.lzy.okhttpserver.listener.DownloadListener;
import com.lzy.okhttputils.OkHttpUtils;
import com.lzy.okhttputils.request.GetRequest;
import java.io.File;
public class DesActivity extends AppCompatActivity implements View.OnClickListener {
private TextView downloadSize;
private TextView tvProgress;
private TextView netSpeed;
private ProgressBar pbProgress;
private Button download;
private Button remove;
private Button restart;
private MyListener listener;
private DownloadInfo downloadInfo;
private ApkInfo apk;
private DownloadManager downloadManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_download_details);
apk = (ApkInfo) getIntent().getSerializableExtra("apk");
downloadManager = DownloadService.getDownloadManager();
ImageView icon = (ImageView) findViewById(R.id.icon);
TextView name = (TextView) findViewById(R.id.name);
downloadSize = (TextView) findViewById(R.id.downloadSize);
tvProgress = (TextView) findViewById(R.id.tvProgress);
netSpeed = (TextView) findViewById(R.id.netSpeed);
pbProgress = (ProgressBar) findViewById(R.id.pbProgress);
download = (Button) findViewById(R.id.start);
remove = (Button) findViewById(R.id.remove);
restart = (Button) findViewById(R.id.restart);
Glide.with(this).load(apk.getIconUrl()).error(R.mipmap.ic_launcher).into(icon);
name.setText(apk.getName());
download.setOnClickListener(this);
remove.setOnClickListener(this);
restart.setOnClickListener(this);
listener = new MyListener();
downloadInfo = downloadManager.getDownloadInfo(apk.getUrl());
if (downloadInfo != null) {
//如果任务存在,把任务的监听换成当前页面需要的监听
downloadInfo.setListener(listener);
//需要第一次手动刷一次,因为任务可能处于下载完成,暂停,等待状态,此时是不会回调进度方法的
refreshUi(downloadInfo);
}
}
@Override
protected void onResume() {
super.onResume();
if (downloadInfo != null) refreshUi(downloadInfo);
}
@Override
protected void onDestroy() {
super.onDestroy();
if (downloadInfo != null) downloadInfo.removeListener();
}
@Override
public void onClick(View v) {
//每次点击的时候,需要更新当前对象
downloadInfo = downloadManager.getDownloadInfo(apk.getUrl());
if (v.getId() == download.getId()) {
if (downloadInfo == null) {
GetRequest request = OkHttpUtils.get(downloadInfo.getUrl())//
.headers("headerKey1", "headerValue1")//
.headers("headerKey2", "headerValue2")//
.params("paramKey1", "paramValue1")//
.params("paramKey2", "paramValue2");
downloadManager.addTask(apk.getUrl(), request, listener);
return;
}
switch (downloadInfo.getState()) {
case DownloadManager.PAUSE:
case DownloadManager.NONE:
case DownloadManager.ERROR:
downloadManager.addTask(downloadInfo.getUrl(), downloadInfo.getRequest(), listener);
break;
case DownloadManager.DOWNLOADING:
downloadManager.pauseTask(downloadInfo.getUrl());
break;
case DownloadManager.FINISH:
if (ApkUtils.isAvailable(this, new File(downloadInfo.getTargetPath()))) {
ApkUtils.uninstall(this, ApkUtils.getPackageName(this, downloadInfo.getTargetPath()));
} else {
ApkUtils.install(this, new File(downloadInfo.getTargetPath()));
}
break;
}
} else if (v.getId() == remove.getId()) {
if (downloadInfo == null) {
Toast.makeText(this, "请先下载任务", Toast.LENGTH_SHORT).show();
return;
}
downloadManager.removeTask(downloadInfo.getUrl());
downloadSize.setText("--M/--M");
netSpeed.setText("---/s");
tvProgress.setText("--.--%");
pbProgress.setProgress(0);
download.setText("下载");
} else if (v.getId() == restart.getId()) {
if (downloadInfo == null) {
Toast.makeText(this, "请先下载任务", Toast.LENGTH_SHORT).show();
return;
}
downloadManager.restartTask(downloadInfo.getUrl());
}
}
private class MyListener extends DownloadListener {
@Override
public void onProgress(DownloadInfo downloadInfo) {
refreshUi(downloadInfo);
}
@Override
public void onFinish(DownloadInfo downloadInfo) {
System.out.println("onFinish");
Toast.makeText(DesActivity.this, "下载完成:" + downloadInfo.getTargetPath(), Toast.LENGTH_SHORT).show();
}
@Override
public void onError(DownloadInfo downloadInfo, String errorMsg, Exception e) {
System.out.println("onError");
if (errorMsg != null) Toast.makeText(DesActivity.this, errorMsg, Toast.LENGTH_SHORT).show();
}
}
private void refreshUi(DownloadInfo downloadInfo) {
String downloadLength = Formatter.formatFileSize(DesActivity.this, downloadInfo.getDownloadLength());
String totalLength = Formatter.formatFileSize(DesActivity.this, downloadInfo.getTotalLength());
downloadSize.setText(downloadLength + "/" + totalLength);
String networkSpeed = Formatter.formatFileSize(DesActivity.this, downloadInfo.getNetworkSpeed());
netSpeed.setText(networkSpeed + "/s");
tvProgress.setText((Math.round(downloadInfo.getProgress() * 10000) * 1.0f / 100) + "%");
pbProgress.setMax((int) downloadInfo.getTotalLength());
pbProgress.setProgress((int) downloadInfo.getDownloadLength());
switch (downloadInfo.getState()) {
case DownloadManager.NONE:
download.setText("下载");
break;
case DownloadManager.DOWNLOADING:
download.setText("暂停");
break;
case DownloadManager.PAUSE:
download.setText("继续");
break;
case DownloadManager.WAITING:
download.setText("等待");
break;
case DownloadManager.ERROR:
download.setText("出错");
break;
case DownloadManager.FINISH:
if (ApkUtils.isAvailable(DesActivity.this, new File(downloadInfo.getTargetPath()))) {
download.setText("卸载");
} else {
download.setText("安装");
}
break;
}
}
}