package com.seafile.seadroid2.transfer; import android.app.Service; import android.content.Intent; import android.os.Binder; import android.os.IBinder; import android.util.Log; import com.seafile.seadroid2.account.Account; import com.seafile.seadroid2.notification.DownloadNotificationProvider; import com.seafile.seadroid2.notification.UploadNotificationProvider; import java.util.List; public class TransferService extends Service { private static final String DEBUG_TAG = "TransferService"; private final IBinder mBinder = new TransferBinder(); public DownloadTaskManager getDownloadTaskManager() { return downloadTaskManager; } public UploadTaskManager getUploadTaskManager() { return uploadTaskManager; } private DownloadTaskManager downloadTaskManager; private UploadTaskManager uploadTaskManager; @Override public void onCreate() { downloadTaskManager = new DownloadTaskManager(); uploadTaskManager = new UploadTaskManager(); } @Override public void onDestroy() { Log.d(DEBUG_TAG, "onDestroy"); } @Override public int onStartCommand(Intent intent, int flags, int startId) { return START_STICKY; } public class TransferBinder extends Binder { public TransferService getService() { return TransferService.this; } } public boolean isTransferring() { List<UploadTaskInfo> uInfos = getNoneCameraUploadTaskInfos(); for (UploadTaskInfo info : uInfos) { if (info.state.equals(TaskState.INIT) || info.state.equals(TaskState.TRANSFERRING)) return true; } List<DownloadTaskInfo> dInfos = getAllDownloadTaskInfos(); for (DownloadTaskInfo info : dInfos) { if (info.state.equals(TaskState.INIT) || info.state.equals(TaskState.TRANSFERRING)) return true; } return false; } @Override public IBinder onBind(Intent intent) { // Log.d(DEBUG_TAG, "onBind"); return mBinder; } // -------------------------- upload task --------------------// /** * Call this method to handle upload request, like file upload or camera upload. * Uploading tasks are managed in a queue. * * Note: use isCopyToLocal to mark automatic camera upload if false, or file upload if true. * @param account * @param repoID * @param repoName * @param dir * @param filePath * @param isUpdate * @param isCopyToLocal * @return */ public int addTaskToUploadQue(Account account, String repoID, String repoName, String dir, String filePath, boolean isUpdate, boolean isCopyToLocal) { return uploadTaskManager.addTaskToQue(account, repoID, repoName, dir, filePath, isUpdate, isCopyToLocal); } /** * Call this method to handle upload request, like file upload or camera upload. * Uploading tasks are managed in a queue. * * Note: use isCopyToLocal to mark automatic camera upload if false, or file upload if true. * @param account * @param repoID * @param repoName * @param dir * @param filePath * @param isUpdate * @param isCopyToLocal * @param version * @return */ public int addTaskToUploadQue(Account account, String repoID, String repoName, String dir, String filePath, boolean isUpdate, boolean isCopyToLocal, int version) { return uploadTaskManager.addTaskToQue(account, repoID, repoName, dir, filePath, isUpdate, isCopyToLocal, version); } /** * Call this method to handle upload request, like file upload or camera upload. * * Note: use isCopyToLocal to mark automatic camera upload if false, or file upload if true. * @param account * @param repoID * @param repoName * @param dir * @param filePath * @param isUpdate * @param isCopyToLocal * @return */ public int addUploadTask(Account account, String repoID, String repoName, String dir, String filePath, boolean isUpdate, boolean isCopyToLocal) { return addTaskToUploadQue(account, repoID, repoName, dir, filePath, isUpdate, isCopyToLocal); } public UploadTaskInfo getUploadTaskInfo(int taskID) { return (UploadTaskInfo) uploadTaskManager.getTaskInfo(taskID); } public List<UploadTaskInfo> getAllUploadTaskInfos() { return (List<UploadTaskInfo>) uploadTaskManager.getAllTaskInfoList(); } public List<UploadTaskInfo> getNoneCameraUploadTaskInfos() { return uploadTaskManager.getNoneCameraUploadTaskInfos(); } public void removeAllUploadTasksByState(TaskState taskState) { uploadTaskManager.removeByState(taskState); } public void restartAllUploadTasksByState(TaskState taskState) { for (TransferTask tt : uploadTaskManager.getTasksByState(taskState)) { retryUploadTask(tt.getTaskID()); } } public void restartUploadTasksByIds(List<Integer> ids) { for (int id : ids) { retryUploadTask(id); } } public void cancelUploadTaskInQue(int taskID) { uploadTaskManager.cancel(taskID); uploadTaskManager.doNext(); } public void cancelAllUploadTasks() { uploadTaskManager.cancelAll(); uploadTaskManager.cancelAllUploadNotification(); } public void cancelUploadTasksByIds(List<Integer> ids) { uploadTaskManager.cancelByIds(ids); uploadTaskManager.cancelAllUploadNotification(); } public void retryUploadTask(int taskID) { uploadTaskManager.retry(taskID); } public void removeUploadTask(int taskID) { uploadTaskManager.removeInAllTaskList(taskID); } /** * remove all upload tasks by their taskIds. * * Note: when deleting all tasks whose state is {@link com.seafile.seadroid2.transfer.TaskState#TRANSFERRING} in the queue, * other tasks left will never be executed, because they are all in the {@link com.seafile.seadroid2.transfer.TaskState#INIT} state. * In this case, explicitly call doNext to start processing the queue. * * @param ids */ public void removeUploadTasksByIds(List<Integer> ids) { uploadTaskManager.removeByIds(ids); // explicitly call doNext if there aren`t any tasks under transferring state, // in case that all tasks are waiting in the queue. // This could happen if all transferring tasks are removed by calling removeByIds. if (!uploadTaskManager.isTransferring()) uploadTaskManager.doNext(); } // -------------------------- download task --------------------// public int addDownloadTask(Account account, String repoName, String repoID, String path) { return addDownloadTask(account, repoName, repoID, path, -1L); } public int addDownloadTask(Account account, String repoName, String repoID, String path, long fileSize) { return downloadTaskManager.addTask(account, repoName, repoID, path, fileSize); } public void addTaskToDownloadQue(Account account, String repoName, String repoID, String path) { downloadTaskManager.addTaskToQue(account, repoName, repoID, path); } public List<DownloadTaskInfo> getAllDownloadTaskInfos() { return (List<DownloadTaskInfo>) downloadTaskManager.getAllTaskInfoList(); } public int getDownloadingFileCountByPath(String repoID, String dirPath) { return downloadTaskManager.getDownloadingFileCountByPath(repoID, dirPath); } public List<DownloadTaskInfo> getDownloadTaskInfosByPath(String repoID, String dir) { return downloadTaskManager.getTaskInfoListByPath(repoID, dir); } public List<DownloadTaskInfo> getDownloadTaskInfosByRepo(String repoID) { return downloadTaskManager.getTaskInfoListByRepo(repoID); } public void removeDownloadTask(int taskID) { downloadTaskManager.removeInAllTaskList(taskID); } public void restartAllDownloadTasksByState(TaskState taskState) { for (TransferTask tt : downloadTaskManager.getTasksByState(taskState)) { retryDownloadTask(tt.getTaskID()); } } public void restartDownloadTasksByIds(List<Integer> ids) { for (int id : ids) { retryDownloadTask(id); } } public void removeAllDownloadTasksByState(TaskState taskState) { downloadTaskManager.removeByState(taskState); } /** * remove all download tasks by their taskIds. * * Note: when deleting all tasks whose state is {@link com.seafile.seadroid2.transfer.TaskState#TRANSFERRING} in the queue, * other tasks left will never be executed, because they are all in the {@link com.seafile.seadroid2.transfer.TaskState#INIT} state. * In this case, explicitly call doNext to start processing the queue. * * @param ids */ public void removeDownloadTasksByIds(List<Integer> ids) { downloadTaskManager.removeByIds(ids); // explicitly call doNext if there aren`t any tasks under transferring state, // in case that all tasks are waiting in the queue. // This could happen if all transferring tasks are removed by calling removeByIds. if (!downloadTaskManager.isTransferring()) downloadTaskManager.doNext(); } public void retryDownloadTask(int taskID) { downloadTaskManager.retry(taskID); } public DownloadTaskInfo getDownloadTaskInfo(int taskID) { return (DownloadTaskInfo) downloadTaskManager.getTaskInfo(taskID); } public void cancelDownloadTask(int taskID) { cancelDownloadTaskInQue(taskID); } public void cancelNotification() { downloadTaskManager.cancelAllDownloadNotification(); } public void cancelDownloadTaskInQue(int taskID) { downloadTaskManager.cancel(taskID); downloadTaskManager.doNext(); } public void cancellAllDownloadTasks() { downloadTaskManager.cancelAll(); downloadTaskManager.cancelAllDownloadNotification(); } public void cancellDownloadTasksByIds(List<Integer> ids) { downloadTaskManager.cancelByIds(ids); downloadTaskManager.cancelAllDownloadNotification(); } // -------------------------- upload notification --------------------// public void saveUploadNotifProvider(UploadNotificationProvider provider) { uploadTaskManager.saveUploadNotifProvider(provider); } public boolean hasUploadNotifProvider() { return uploadTaskManager.hasNotifProvider(); } public UploadNotificationProvider getUploadNotifProvider() { return uploadTaskManager.getNotifProvider(); } // -------------------------- download notification --------------------// public void saveDownloadNotifProvider(DownloadNotificationProvider provider) { downloadTaskManager.saveNotifProvider(provider); } public boolean hasDownloadNotifProvider() { return downloadTaskManager.hasNotifProvider(); } public DownloadNotificationProvider getDownloadNotifProvider() { return downloadTaskManager.getNotifProvider(); } }