package com.seafile.seadroid2.transfer; import android.content.Intent; import android.support.v4.content.LocalBroadcastManager; import android.util.Log; import com.google.common.collect.Lists; import com.seafile.seadroid2.SeadroidApplication; import com.seafile.seadroid2.account.Account; import com.seafile.seadroid2.notification.UploadNotificationProvider; import java.util.List; /** * Upload task manager * <p/> */ public class UploadTaskManager extends TransferManager implements UploadStateListener { private static final String DEBUG_TAG = "UploadTaskManager"; public static final String BROADCAST_FILE_UPLOAD_SUCCESS = "uploaded"; public static final String BROADCAST_FILE_UPLOAD_FAILED = "uploadFailed"; public static final String BROADCAST_FILE_UPLOAD_PROGRESS = "uploadProgress"; public static final String BROADCAST_FILE_UPLOAD_CANCELLED = "uploadCancelled"; private static UploadNotificationProvider mNotifyProvider; public int addTaskToQue(Account account, String repoID, String repoName, String dir, String filePath, boolean isUpdate, boolean isCopyToLocal) { if (repoID == null || repoName == null) return 0; // create a new one to avoid IllegalStateException UploadTask task = new UploadTask(++notificationID, account, repoID, repoName, dir, filePath, isUpdate, isCopyToLocal, false, -1, this); addTaskToQue(task); return task.getTaskID(); } public int addTaskToQue(Account account, String repoID, String repoName, String dir, String filePath, boolean isUpdate, boolean isCopyToLocal, int version) { if (repoID == null || repoName == null) return 0; // create a new one to avoid IllegalStateException UploadTask task = new UploadTask(++notificationID, account, repoID, repoName, dir, filePath, isUpdate, isCopyToLocal, true, version, this); addTaskToQue(task); return task.getTaskID(); } public List<UploadTaskInfo> getNoneCameraUploadTaskInfos() { List<UploadTaskInfo> noneCameraUploadTaskInfos = Lists.newArrayList(); List<UploadTaskInfo> uploadTaskInfos = (List<UploadTaskInfo>) getAllTaskInfoList(); for (UploadTaskInfo uploadTaskInfo : uploadTaskInfos) { // use isCopyToLocal as a flag to mark a camera photo upload task if false // mark a file upload task if true if (!uploadTaskInfo.isCopyToLocal) { continue; } noneCameraUploadTaskInfos.add(uploadTaskInfo); } return noneCameraUploadTaskInfos; } public void retry(int taskID) { UploadTask task = (UploadTask) getTask(taskID); if (task == null || !task.canRetry()) return; addTaskToQue(task.getAccount(), task.getRepoID(), task.getRepoName(), task.getDir(), task.getPath(), task.isUpdate(), task.isCopyToLocal()); } private void notifyProgress(int taskID) { UploadTaskInfo info = (UploadTaskInfo) getTaskInfo(taskID); if (info == null) return; // use isCopyToLocal as a flag to mark a camera photo upload task if false // mark a file upload task if true if (!info.isCopyToLocal) return; //Log.d(DEBUG_TAG, "notify key " + info.repoID); if (mNotifyProvider != null) { mNotifyProvider.updateNotification(); } } public void saveUploadNotifProvider(UploadNotificationProvider provider) { mNotifyProvider = provider; } public boolean hasNotifProvider() { return mNotifyProvider != null; } public UploadNotificationProvider getNotifProvider() { if (hasNotifProvider()) return mNotifyProvider; else return null; } public void cancelAllUploadNotification() { if (mNotifyProvider != null) mNotifyProvider.cancelNotification(); } // -------------------------- listener method --------------------// @Override public void onFileUploadProgress(int taskID) { Intent localIntent = new Intent(BROADCAST_ACTION).putExtra("type", BROADCAST_FILE_UPLOAD_PROGRESS).putExtra("taskID", taskID); LocalBroadcastManager.getInstance(SeadroidApplication.getAppContext()).sendBroadcast(localIntent); notifyProgress(taskID); } @Override public void onFileUploaded(int taskID) { remove(taskID); doNext(); Intent localIntent = new Intent(BROADCAST_ACTION).putExtra("type", BROADCAST_FILE_UPLOAD_SUCCESS).putExtra("taskID", taskID); LocalBroadcastManager.getInstance(SeadroidApplication.getAppContext()).sendBroadcast(localIntent); notifyProgress(taskID); } @Override public void onFileUploadCancelled(int taskID) { Intent localIntent = new Intent(BROADCAST_ACTION).putExtra("type", BROADCAST_FILE_UPLOAD_CANCELLED).putExtra("taskID", taskID); LocalBroadcastManager.getInstance(SeadroidApplication.getAppContext()).sendBroadcast(localIntent); notifyProgress(taskID); } @Override public void onFileUploadFailed(int taskID) { remove(taskID); doNext(); Intent localIntent = new Intent(BROADCAST_ACTION).putExtra("type", BROADCAST_FILE_UPLOAD_FAILED).putExtra("taskID", taskID); LocalBroadcastManager.getInstance(SeadroidApplication.getAppContext()).sendBroadcast(localIntent); notifyProgress(taskID); } }