package org.xutils.sample;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import org.xutils.common.Callback;
import org.xutils.ex.DbException;
import org.xutils.sample.download.DownloadInfo;
import org.xutils.sample.download.DownloadManager;
import org.xutils.sample.download.DownloadState;
import org.xutils.sample.download.DownloadViewHolder;
import org.xutils.view.annotation.ContentView;
import org.xutils.view.annotation.Event;
import org.xutils.view.annotation.ViewInject;
import org.xutils.x;
import java.io.File;
@ContentView(R.layout.activity_download)
public class DownloadActivity extends BaseActivity {
@ViewInject(R.id.lv_download)
private ListView downloadList;
private DownloadManager downloadManager;
private DownloadListAdapter downloadListAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
downloadManager = DownloadManager.getInstance();
downloadListAdapter = new DownloadListAdapter();
downloadList.setAdapter(downloadListAdapter);
}
private class DownloadListAdapter extends BaseAdapter {
private Context mContext;
private final LayoutInflater mInflater;
private DownloadListAdapter() {
mContext = getBaseContext();
mInflater = LayoutInflater.from(mContext);
}
@Override
public int getCount() {
if (downloadManager == null) return 0;
return downloadManager.getDownloadListCount();
}
@Override
public Object getItem(int i) {
return downloadManager.getDownloadInfo(i);
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
DownloadItemViewHolder holder = null;
DownloadInfo downloadInfo = downloadManager.getDownloadInfo(i);
if (view == null) {
view = mInflater.inflate(R.layout.download_item, null);
holder = new DownloadItemViewHolder(view, downloadInfo);
view.setTag(holder);
holder.refresh();
} else {
holder = (DownloadItemViewHolder) view.getTag();
holder.update(downloadInfo);
}
if (downloadInfo.getState().value() < DownloadState.FINISHED.value()) {
try {
downloadManager.startDownload(
downloadInfo.getUrl(),
downloadInfo.getLabel(),
downloadInfo.getFileSavePath(),
downloadInfo.isAutoResume(),
downloadInfo.isAutoRename(),
holder);
} catch (DbException ex) {
Toast.makeText(x.app(), "添加下载失败", Toast.LENGTH_LONG).show();
}
}
return view;
}
}
public class DownloadItemViewHolder extends DownloadViewHolder {
@ViewInject(R.id.download_label)
TextView label;
@ViewInject(R.id.download_state)
TextView state;
@ViewInject(R.id.download_pb)
ProgressBar progressBar;
@ViewInject(R.id.download_stop_btn)
Button stopBtn;
public DownloadItemViewHolder(View view, DownloadInfo downloadInfo) {
super(view, downloadInfo);
refresh();
}
@Event(R.id.download_stop_btn)
private void toggleEvent(View view) {
DownloadState state = downloadInfo.getState();
switch (state) {
case WAITING:
case STARTED:
downloadManager.stopDownload(downloadInfo);
break;
case ERROR:
case STOPPED:
try {
downloadManager.startDownload(
downloadInfo.getUrl(),
downloadInfo.getLabel(),
downloadInfo.getFileSavePath(),
downloadInfo.isAutoResume(),
downloadInfo.isAutoRename(),
this);
} catch (DbException ex) {
Toast.makeText(x.app(), "添加下载失败", Toast.LENGTH_LONG).show();
}
break;
case FINISHED:
Toast.makeText(x.app(), "已经下载完成", Toast.LENGTH_LONG).show();
break;
default:
break;
}
}
@Event(R.id.download_remove_btn)
private void removeEvent(View view) {
try {
downloadManager.removeDownload(downloadInfo);
downloadListAdapter.notifyDataSetChanged();
} catch (DbException e) {
Toast.makeText(x.app(), "移除任务失败", Toast.LENGTH_LONG).show();
}
}
@Override
public void update(DownloadInfo downloadInfo) {
super.update(downloadInfo);
refresh();
}
@Override
public void onWaiting() {
refresh();
}
@Override
public void onStarted() {
refresh();
}
@Override
public void onLoading(long total, long current) {
refresh();
}
@Override
public void onSuccess(File result) {
refresh();
}
@Override
public void onError(Throwable ex, boolean isOnCallback) {
refresh();
}
@Override
public void onCancelled(Callback.CancelledException cex) {
refresh();
}
public void refresh() {
label.setText(downloadInfo.getLabel());
state.setText(downloadInfo.getState().toString());
progressBar.setProgress(downloadInfo.getProgress());
stopBtn.setVisibility(View.VISIBLE);
stopBtn.setText(x.app().getString(R.string.stop));
DownloadState state = downloadInfo.getState();
switch (state) {
case WAITING:
case STARTED:
stopBtn.setText(x.app().getString(R.string.stop));
break;
case ERROR:
case STOPPED:
stopBtn.setText(x.app().getString(R.string.start));
break;
case FINISHED:
stopBtn.setVisibility(View.INVISIBLE);
break;
default:
stopBtn.setText(x.app().getString(R.string.start));
break;
}
}
}
}