package com.seafile.seadroid2.transfer;
import android.content.Intent;
import android.support.v4.content.LocalBroadcastManager;
import com.google.common.collect.Lists;
import com.seafile.seadroid2.util.ConcurrentAsyncTask;
import com.seafile.seadroid2.SeadroidApplication;
import com.seafile.seadroid2.account.Account;
import com.seafile.seadroid2.notification.DownloadNotificationProvider;
import com.seafile.seadroid2.util.Utils;
import java.util.ArrayList;
import java.util.List;
/**
* Download task manager
* <p/>
*/
public class DownloadTaskManager extends TransferManager implements DownloadStateListener {
private static final String DEBUG_TAG = "DownloadTaskManager";
public static final String BROADCAST_FILE_DOWNLOAD_SUCCESS = "downloaded";
public static final String BROADCAST_FILE_DOWNLOAD_FAILED = "downloadFailed";
public static final String BROADCAST_FILE_DOWNLOAD_PROGRESS = "downloadProgress";
private static DownloadNotificationProvider mNotifProvider;
/**
* Add a new download task.
* call this method to execute a task immediately.
*/
public int addTask(Account account, String repoName, String repoID, String path, long fileSize) {
TransferTask task = new DownloadTask(++notificationID, account, repoName, repoID, path, this);
task.totalSize = fileSize;
TransferTask oldTask = null;
if (allTaskList.contains(task)) {
oldTask = allTaskList.get(allTaskList.indexOf(task));
}
if (oldTask != null) {
if (oldTask.getState().equals(TaskState.CANCELLED)
|| oldTask.getState().equals(TaskState.FAILED)
|| oldTask.getState().equals(TaskState.FINISHED)) {
allTaskList.remove(oldTask);
} else {
// return taskID of old task
return oldTask.getTaskID();
}
}
allTaskList.add(task);
ConcurrentAsyncTask.execute(task);
return task.getTaskID();
}
public void addTaskToQue(Account account, String repoName, String repoID, String path) {
// create a new one to avoid IllegalStateException
DownloadTask downloadTask = new DownloadTask(++notificationID, account, repoName, repoID, path, this);
addTaskToQue(downloadTask);
}
public int getDownloadingFileCountByPath(String repoID, String dir) {
List<DownloadTaskInfo> downloadTaskInfos = getTaskInfoListByPath(repoID, dir);
int count = 0;
for (DownloadTaskInfo downloadTaskInfo : downloadTaskInfos) {
if (downloadTaskInfo.state.equals(TaskState.INIT)
|| downloadTaskInfo.state.equals(TaskState.TRANSFERRING))
count++;
}
return count;
}
/**
* get all download task info under a specific directory.
*
* @param repoID
* @param dir
* @return List<DownloadTaskInfo>
*/
public List<DownloadTaskInfo> getTaskInfoListByPath(String repoID, String dir) {
ArrayList<DownloadTaskInfo> infos = Lists.newArrayList();
for (TransferTask task : allTaskList) {
if (!task.getRepoID().equals(repoID))
continue;
String parentDir = Utils.getParentPath(task.getPath());
if (parentDir.equals(dir))
infos.add(((DownloadTask) task).getTaskInfo());
}
return infos;
}
/**
* get all download task info under a specific repo.
*
* @param repoID
* @return List<DownloadTaskInfo>
*/
public List<DownloadTaskInfo> getTaskInfoListByRepo(String repoID) {
ArrayList<DownloadTaskInfo> infos = Lists.newArrayList();
for (TransferTask task : allTaskList) {
if (!task.getRepoID().equals(repoID))
continue;
infos.add(((DownloadTask) task).getTaskInfo());
}
return infos;
}
public void retry(int taskID) {
DownloadTask task = (DownloadTask) getTask(taskID);
if (task == null || !task.canRetry())
return;
addTaskToQue(task.getAccount(), task.getRepoName(), task.getRepoID(), task.getPath());
}
private void notifyProgress(int taskID) {
DownloadTaskInfo info = (DownloadTaskInfo) getTaskInfo(taskID);
if (info == null)
return;
if (mNotifProvider != null)
mNotifProvider.updateNotification();
}
public void saveNotifProvider(DownloadNotificationProvider provider) {
mNotifProvider = provider;
}
public boolean hasNotifProvider() {
return mNotifProvider != null;
}
public DownloadNotificationProvider getNotifProvider() {
if (hasNotifProvider())
return mNotifProvider;
else
return null;
}
public void cancelAllDownloadNotification() {
if (mNotifProvider != null)
mNotifProvider.cancelNotification();
}
// -------------------------- listener method --------------------//
@Override
public void onFileDownloadProgress(int taskID) {
Intent localIntent = new Intent(BROADCAST_ACTION).putExtra("type",
BROADCAST_FILE_DOWNLOAD_PROGRESS).putExtra("taskID", taskID);
LocalBroadcastManager.getInstance(SeadroidApplication.getAppContext()).sendBroadcast(localIntent);
notifyProgress(taskID);
}
@Override
public void onFileDownloaded(int taskID) {
remove(taskID);
doNext();
Intent localIntent = new Intent(BROADCAST_ACTION).putExtra("type",
BROADCAST_FILE_DOWNLOAD_SUCCESS).putExtra("taskID", taskID);
LocalBroadcastManager.getInstance(SeadroidApplication.getAppContext()).sendBroadcast(localIntent);
notifyProgress(taskID);
}
@Override
public void onFileDownloadFailed(int taskID) {
remove(taskID);
doNext();
Intent localIntent = new Intent(BROADCAST_ACTION).putExtra("type",
BROADCAST_FILE_DOWNLOAD_FAILED).putExtra("taskID", taskID);
LocalBroadcastManager.getInstance(SeadroidApplication.getAppContext()).sendBroadcast(localIntent);
notifyProgress(taskID);
}
}