package com.jasonchen.microlang.workers;
import com.jasonchen.microlang.database.DownloadPicturesDBTask;
import com.jasonchen.microlang.utils.TaskCache;
import com.jasonchen.microlang.utils.file.FileDownloaderHttpHelper;
import com.jasonchen.microlang.utils.file.FileLocationMethod;
import com.jasonchen.microlang.utils.file.FileManager;
import com.jasonchen.microlang.utils.image.ImageUtility;
import java.util.concurrent.Callable;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.FutureTask;
/**
* jasonchen
* 2015/04/10
*/
public class DownloadFutureTask extends FutureTask<Boolean> {
public static DownloadFutureTask newInstance(String url, FileLocationMethod method) {
JobCallable jobCallable = new JobCallable(url, method);
DownloadFutureTask downloadFutureTask = new DownloadFutureTask(jobCallable);
jobCallable.futureTask = downloadFutureTask;
return downloadFutureTask;
}
private JobCallable callable;
private DownloadFutureTask(JobCallable callable) {
super(callable);
this.callable = callable;
}
public void addDownloadListener(FileDownloaderHttpHelper.DownloadListener listener) {
callable.addDownloadListener(listener);
}
public String getUrl() {
return callable.url;
}
private static class JobCallable implements Callable<Boolean> {
private DownloadFutureTask futureTask;
private CopyOnWriteArrayList<FileDownloaderHttpHelper.DownloadListener> downloadListenerList
= new CopyOnWriteArrayList<FileDownloaderHttpHelper.DownloadListener>();
private String url;
private FileLocationMethod method;
private int progress;
private int max;
public void addDownloadListener(FileDownloaderHttpHelper.DownloadListener listener) {
if (listener == null) {
return;
}
downloadListenerList.addIfAbsent(listener);
if (progress > 0 && max > 0) {
listener.pushProgress(progress, max);
}
}
private JobCallable(String url, FileLocationMethod method) {
this.url = url;
this.method = method;
}
@Override
public Boolean call() throws Exception {
synchronized (TimeLineBitmapDownloader.pauseDownloadWorkLock) {
while (TimeLineBitmapDownloader.pauseDownloadWork && !Thread.currentThread()
.isInterrupted()) {
try {
TimeLineBitmapDownloader.pauseDownloadWorkLock.wait();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
String filePath = FileManager.generateDownloadFileName(url);
String actualDownloadUrl = url;
switch (method) {
case picture_thumbnail:
actualDownloadUrl = url.replace("thumbnail", "webp180");
break;
case picture_bmiddle:
actualDownloadUrl = url.replace("bmiddle", "webp720");
break;
case picture_large:
actualDownloadUrl = url.replace("large", "woriginal");
break;
}
boolean result = ImageUtility.getBitmapFromNetWork(actualDownloadUrl, filePath,
new FileDownloaderHttpHelper.DownloadListener() {
@Override
public void pushProgress(int progress, int max) {
JobCallable.this.progress = progress;
JobCallable.this.max = max;
for (FileDownloaderHttpHelper.DownloadListener downloadListener : downloadListenerList) {
if (downloadListener != null) {
downloadListener.pushProgress(progress, max);
}
}
}
});
if (result) {
DownloadPicturesDBTask.add(this.url,
FileManager.generateDownloadFileName(this.url),
this.method);
}
TaskCache.removeDownloadTask(url, futureTask);
return result;
}
}
}