package org.xutils.sample.download;
import org.xutils.common.Callback;
import org.xutils.common.util.LogUtil;
import org.xutils.ex.DbException;
import java.io.File;
import java.lang.ref.WeakReference;
/**
* Created by wyouflf on 15/11/10.
*/
/*package*/ class DownloadCallback implements
Callback.CommonCallback<File>,
Callback.ProgressCallback<File>,
Callback.Cancelable {
private DownloadInfo downloadInfo;
private WeakReference<DownloadViewHolder> viewHolderRef;
private DownloadManager downloadManager;
private boolean cancelled = false;
private Cancelable cancelable;
public DownloadCallback(DownloadViewHolder viewHolder) {
this.switchViewHolder(viewHolder);
}
public boolean switchViewHolder(DownloadViewHolder viewHolder) {
if (viewHolder == null) return false;
synchronized (DownloadCallback.class) {
if (downloadInfo != null) {
if (this.isStopped()) {
return false;
}
}
this.downloadInfo = viewHolder.getDownloadInfo();
this.viewHolderRef = new WeakReference<DownloadViewHolder>(viewHolder);
}
return true;
}
public void setDownloadManager(DownloadManager downloadManager) {
this.downloadManager = downloadManager;
}
public void setCancelable(Cancelable cancelable) {
this.cancelable = cancelable;
}
private DownloadViewHolder getViewHolder() {
if (viewHolderRef == null) return null;
DownloadViewHolder viewHolder = viewHolderRef.get();
if (viewHolder != null) {
DownloadInfo downloadInfo = viewHolder.getDownloadInfo();
if (this.downloadInfo != null && this.downloadInfo.equals(downloadInfo)) {
return viewHolder;
}
}
return null;
}
@Override
public void onWaiting() {
try {
downloadInfo.setState(DownloadState.WAITING);
downloadManager.updateDownloadInfo(downloadInfo);
} catch (DbException ex) {
LogUtil.e(ex.getMessage(), ex);
}
DownloadViewHolder viewHolder = this.getViewHolder();
if (viewHolder != null) {
viewHolder.onWaiting();
}
}
@Override
public void onStarted() {
try {
downloadInfo.setState(DownloadState.STARTED);
downloadManager.updateDownloadInfo(downloadInfo);
} catch (DbException ex) {
LogUtil.e(ex.getMessage(), ex);
}
DownloadViewHolder viewHolder = this.getViewHolder();
if (viewHolder != null) {
viewHolder.onStarted();
}
}
@Override
public void onLoading(long total, long current, boolean isDownloading) {
if (isDownloading) {
try {
downloadInfo.setState(DownloadState.STARTED);
downloadInfo.setFileLength(total);
downloadInfo.setProgress((int) (current * 100 / total));
downloadManager.updateDownloadInfo(downloadInfo);
} catch (DbException ex) {
LogUtil.e(ex.getMessage(), ex);
}
DownloadViewHolder viewHolder = this.getViewHolder();
if (viewHolder != null) {
viewHolder.onLoading(total, current);
}
}
}
@Override
public void onSuccess(File result) {
synchronized (DownloadCallback.class) {
try {
downloadInfo.setState(DownloadState.FINISHED);
downloadManager.updateDownloadInfo(downloadInfo);
} catch (DbException ex) {
LogUtil.e(ex.getMessage(), ex);
}
DownloadViewHolder viewHolder = this.getViewHolder();
if (viewHolder != null) {
viewHolder.onSuccess(result);
}
}
}
@Override
public void onError(Throwable ex, boolean isOnCallback) {
synchronized (DownloadCallback.class) {
try {
downloadInfo.setState(DownloadState.ERROR);
downloadManager.updateDownloadInfo(downloadInfo);
} catch (DbException e) {
LogUtil.e(e.getMessage(), e);
}
DownloadViewHolder viewHolder = this.getViewHolder();
if (viewHolder != null) {
viewHolder.onError(ex, isOnCallback);
}
}
}
@Override
public void onCancelled(CancelledException cex) {
synchronized (DownloadCallback.class) {
try {
downloadInfo.setState(DownloadState.STOPPED);
downloadManager.updateDownloadInfo(downloadInfo);
} catch (DbException ex) {
LogUtil.e(ex.getMessage(), ex);
}
DownloadViewHolder viewHolder = this.getViewHolder();
if (viewHolder != null) {
viewHolder.onCancelled(cex);
}
}
}
@Override
public void onFinished() {
cancelled = false;
}
private boolean isStopped() {
DownloadState state = downloadInfo.getState();
return isCancelled() || state.value() > DownloadState.STARTED.value();
}
@Override
public void cancel() {
cancelled = true;
if (cancelable != null) {
cancelable.cancel();
}
}
@Override
public boolean isCancelled() {
return cancelled;
}
}