package com.lzy.demo.okserver;
import android.os.Bundle;
import android.support.v7.widget.Toolbar;
import android.text.format.Formatter;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import com.bumptech.glide.Glide;
import com.lzy.demo.R;
import com.lzy.demo.base.BaseActivity;
import com.lzy.demo.model.ApkModel;
import com.lzy.demo.ui.NumberProgressBar;
import com.lzy.demo.utils.ApkUtils;
import com.lzy.okserver.download.DownloadInfo;
import com.lzy.okserver.download.DownloadManager;
import com.lzy.okserver.download.DownloadService;
import com.lzy.okserver.listener.DownloadListener;
import com.lzy.okserver.task.ExecutorWithListener;
import java.io.File;
import java.util.List;
import butterknife.Bind;
public class DownloadManagerActivity extends BaseActivity implements View.OnClickListener, ExecutorWithListener.OnAllTaskEndListener {
private List<DownloadInfo> allTask;
private MyAdapter adapter;
private DownloadManager downloadManager;
@Bind(R.id.toolbar) Toolbar toolbar;
@Bind(R.id.listView) ListView listView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_download_manager);
initToolBar(toolbar, true, "下载管理");
downloadManager = DownloadService.getDownloadManager();
allTask = downloadManager.getAllTask();
adapter = new MyAdapter();
listView.setAdapter(adapter);
downloadManager.getThreadPool().getExecutor().addOnAllTaskEndListener(this);
}
@Override
public void onAllTaskEnd() {
for (DownloadInfo downloadInfo : allTask) {
if (downloadInfo.getState() != DownloadManager.FINISH) {
Toast.makeText(DownloadManagerActivity.this, "所有下载线程结束,部分下载未完成", Toast.LENGTH_SHORT).show();
return;
}
}
Toast.makeText(DownloadManagerActivity.this, "所有下载任务完成", Toast.LENGTH_SHORT).show();
}
@Override
protected void onDestroy() {
super.onDestroy();
//记得移除,否者会回调多次
downloadManager.getThreadPool().getExecutor().removeOnAllTaskEndListener(this);
}
@Override
protected void onResume() {
super.onResume();
adapter.notifyDataSetChanged();
}
public void onClick(View v) {
switch (v.getId()) {
case R.id.removeAll:
downloadManager.removeAllTask();
adapter.notifyDataSetChanged(); //移除的时候需要调用
break;
case R.id.pauseAll:
downloadManager.pauseAllTask();
break;
case R.id.stopAll:
downloadManager.stopAllTask();
break;
case R.id.startAll:
downloadManager.startAllTask();
break;
}
}
private class MyAdapter extends BaseAdapter {
@Override
public int getCount() {
return allTask.size();
}
@Override
public DownloadInfo getItem(int position) {
return allTask.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
DownloadInfo downloadInfo = getItem(position);
ViewHolder holder;
if (convertView == null) {
convertView = View.inflate(DownloadManagerActivity.this, R.layout.item_download_manager, null);
holder = new ViewHolder(convertView);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.refresh(downloadInfo);
//对于非进度更新的ui放在这里,对于实时更新的进度ui,放在holder中
ApkModel apk = (ApkModel) downloadInfo.getData();
if (apk != null) {
Glide.with(DownloadManagerActivity.this).load(apk.getIconUrl()).error(R.mipmap.ic_launcher).into(holder.icon);
holder.name.setText(apk.getName());
} else {
holder.name.setText(downloadInfo.getFileName());
}
holder.download.setOnClickListener(holder);
holder.remove.setOnClickListener(holder);
holder.restart.setOnClickListener(holder);
DownloadListener downloadListener = new MyDownloadListener();
downloadListener.setUserTag(holder);
downloadInfo.setListener(downloadListener);
return convertView;
}
}
private class ViewHolder implements View.OnClickListener {
private DownloadInfo downloadInfo;
private ImageView icon;
private TextView name;
private TextView downloadSize;
private TextView tvProgress;
private TextView netSpeed;
private NumberProgressBar pbProgress;
private Button download;
private Button remove;
private Button restart;
public ViewHolder(View convertView) {
icon = (ImageView) convertView.findViewById(R.id.icon);
name = (TextView) convertView.findViewById(R.id.name);
downloadSize = (TextView) convertView.findViewById(R.id.downloadSize);
tvProgress = (TextView) convertView.findViewById(R.id.tvProgress);
netSpeed = (TextView) convertView.findViewById(R.id.netSpeed);
pbProgress = (NumberProgressBar) convertView.findViewById(R.id.pbProgress);
download = (Button) convertView.findViewById(R.id.start);
remove = (Button) convertView.findViewById(R.id.remove);
restart = (Button) convertView.findViewById(R.id.restart);
}
public void refresh(DownloadInfo downloadInfo) {
this.downloadInfo = downloadInfo;
refresh();
}
//对于实时更新的进度ui,放在这里,例如进度的显示,而图片加载等,不要放在这,会不停的重复回调
//也会导致内存泄漏
private void refresh() {
String downloadLength = Formatter.formatFileSize(DownloadManagerActivity.this, downloadInfo.getDownloadLength());
String totalLength = Formatter.formatFileSize(DownloadManagerActivity.this, downloadInfo.getTotalLength());
downloadSize.setText(downloadLength + "/" + totalLength);
if (downloadInfo.getState() == DownloadManager.NONE) {
netSpeed.setText("停止");
download.setText("下载");
} else if (downloadInfo.getState() == DownloadManager.PAUSE) {
netSpeed.setText("暂停中");
download.setText("继续");
} else if (downloadInfo.getState() == DownloadManager.ERROR) {
netSpeed.setText("下载出错");
download.setText("出错");
} else if (downloadInfo.getState() == DownloadManager.WAITING) {
netSpeed.setText("等待中");
download.setText("等待");
} else if (downloadInfo.getState() == DownloadManager.FINISH) {
if (ApkUtils.isAvailable(DownloadManagerActivity.this, new File(downloadInfo.getTargetPath()))) {
download.setText("卸载");
} else {
download.setText("安装");
}
netSpeed.setText("下载完成");
} else if (downloadInfo.getState() == DownloadManager.DOWNLOADING) {
String networkSpeed = Formatter.formatFileSize(DownloadManagerActivity.this, downloadInfo.getNetworkSpeed());
netSpeed.setText(networkSpeed + "/s");
download.setText("暂停");
}
tvProgress.setText((Math.round(downloadInfo.getProgress() * 10000) * 1.0f / 100) + "%");
pbProgress.setMax((int) downloadInfo.getTotalLength());
pbProgress.setProgress((int) downloadInfo.getDownloadLength());
}
@Override
public void onClick(View v) {
if (v.getId() == download.getId()) {
switch (downloadInfo.getState()) {
case DownloadManager.PAUSE:
case DownloadManager.NONE:
case DownloadManager.ERROR:
downloadManager.addTask(downloadInfo.getUrl(), downloadInfo.getRequest(), downloadInfo.getListener());
break;
case DownloadManager.DOWNLOADING:
downloadManager.pauseTask(downloadInfo.getUrl());
break;
case DownloadManager.FINISH:
if (ApkUtils.isAvailable(DownloadManagerActivity.this, new File(downloadInfo.getTargetPath()))) {
ApkUtils.uninstall(DownloadManagerActivity.this, ApkUtils.getPackageName(DownloadManagerActivity.this, downloadInfo.getTargetPath()));
} else {
ApkUtils.install(DownloadManagerActivity.this, new File(downloadInfo.getTargetPath()));
}
break;
}
refresh();
} else if (v.getId() == remove.getId()) {
downloadManager.removeTask(downloadInfo.getUrl());
adapter.notifyDataSetChanged();
} else if (v.getId() == restart.getId()) {
downloadManager.restartTask(downloadInfo.getUrl());
}
}
}
private class MyDownloadListener extends DownloadListener {
@Override
public void onProgress(DownloadInfo downloadInfo) {
if (getUserTag() == null) return;
ViewHolder holder = (ViewHolder) getUserTag();
holder.refresh(); //这里不能使用传递进来的 DownloadInfo,否者会出现条目错乱的问题
}
@Override
public void onFinish(DownloadInfo downloadInfo) {
Toast.makeText(DownloadManagerActivity.this, "下载完成:" + downloadInfo.getTargetPath(), Toast.LENGTH_SHORT).show();
}
@Override
public void onError(DownloadInfo downloadInfo, String errorMsg, Exception e) {
if (errorMsg != null) Toast.makeText(DownloadManagerActivity.this, errorMsg, Toast.LENGTH_SHORT).show();
}
}
}