diff --git a/Aria/src/main/java/com/arialyy/aria/core/command/CancelAllCmd.java b/Aria/src/main/java/com/arialyy/aria/core/command/CancelAllCmd.java new file mode 100644 index 00000000..057c8a2b --- /dev/null +++ b/Aria/src/main/java/com/arialyy/aria/core/command/CancelAllCmd.java @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2016 AriaLyy(https://github.com/AriaLyy/Aria) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.arialyy.aria.core.command; + +import com.arialyy.aria.core.AriaManager; +import com.arialyy.aria.core.download.DownloadEntity; +import com.arialyy.aria.core.download.DownloadTaskEntity; +import com.arialyy.aria.core.inf.AbsTaskEntity; +import com.arialyy.aria.core.upload.UploadEntity; +import com.arialyy.aria.orm.DbEntity; +import com.arialyy.aria.util.CommonUtil; +import java.io.File; +import java.util.List; + +/** + * Created by AriaL on 2017/6/27. + * 删除所有任务,并且删除所有回掉 + */ +final class CancelAllCmd extends AbsCmd { + /** + * @param targetName 产生任务的对象名 + */ + CancelAllCmd(String targetName, T entity) { + super(targetName, entity); + } + + @Override public void executeCmd() { + mQueue.removeAllTask(); + if (mTaskEntity instanceof DownloadTaskEntity) { + handleDownloadRemove(); + } else { + handleUploadRemove(); + } + } + + /** + * 处理上传的删除 + */ + private void handleUploadRemove() { + List allEntity = DbEntity.findAllData(UploadEntity.class); + for (UploadEntity entity : allEntity) { + CommonUtil.delUploadTaskConfig(mTaskEntity.removeFile, entity); + } + } + + /** + * 处理下载的删除 + */ + private void handleDownloadRemove() { + List allEntity = DbEntity.findAllData(DownloadEntity.class); + for (DownloadEntity entity : allEntity) { + CommonUtil.delDownloadTaskConfig(mTaskEntity.removeFile, entity); + } + } +} diff --git a/Aria/src/main/java/com/arialyy/aria/core/command/CmdFactory.java b/Aria/src/main/java/com/arialyy/aria/core/command/CmdFactory.java index ae725b51..e2fdf3e0 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/command/CmdFactory.java +++ b/Aria/src/main/java/com/arialyy/aria/core/command/CmdFactory.java @@ -56,7 +56,10 @@ public class CmdFactory { * 恢复所有停止的任务 */ public static final int TASK_RESUME_ALL = 0x130; - + /** + * 删除所有任务, + */ + public static final int TASK_CANCEL_ALL = 0x131; private static volatile CmdFactory INSTANCE = null; private CmdFactory() { @@ -95,6 +98,8 @@ public class CmdFactory { return new StopAllCmd<>(target, entity); case TASK_RESUME_ALL: return new ResumeAllCmd<>(target, entity); + case TASK_CANCEL_ALL: + return new CancelAllCmd<>(target, entity); default: return null; } diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/DownloadReceiver.java b/Aria/src/main/java/com/arialyy/aria/core/download/DownloadReceiver.java index 6aa171ca..32a255d3 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/DownloadReceiver.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/DownloadReceiver.java @@ -17,7 +17,7 @@ package com.arialyy.aria.core.download; import android.support.annotation.NonNull; import com.arialyy.aria.core.AriaManager; -import com.arialyy.aria.core.inf.ICmd; +import com.arialyy.aria.core.inf.AbsReceiver; import com.arialyy.aria.core.inf.IEntity; import com.arialyy.aria.core.inf.IReceiver; import com.arialyy.aria.core.command.CmdFactory; @@ -36,10 +36,8 @@ import java.util.Set; * Created by lyy on 2016/12/5. * 下载功能接收器 */ -public class DownloadReceiver implements IReceiver { +public class DownloadReceiver extends AbsReceiver { private static final String TAG = "DownloadReceiver"; - public String targetName; - public Object obj; public ISchedulerListener listener; /** @@ -143,9 +141,10 @@ public class DownloadReceiver implements IReceiver { * 停止所有正在下载的任务,并清空等待队列。 */ @Override public void stopAllTask() { - final AriaManager ariaManager = AriaManager.getInstance(AriaManager.APP); - ariaManager.setCmd(CmdFactory.getInstance() - .createCmd(targetName, new DownloadTaskEntity(), CmdFactory.TASK_STOP_ALL)).exe(); + AriaManager.getInstance(AriaManager.APP) + .setCmd(CmdFactory.getInstance() + .createCmd(targetName, new DownloadTaskEntity(), CmdFactory.TASK_STOP_ALL)) + .exe(); } /** @@ -154,23 +153,25 @@ public class DownloadReceiver implements IReceiver { * 2.如果队列执行队列已经满了,则将所有任务添加到等待队列中 */ public void resumeAllTask() { - final AriaManager ariaManager = AriaManager.getInstance(AriaManager.APP); - ariaManager.setCmd(CmdFactory.getInstance() - .createCmd(targetName, new DownloadTaskEntity(), CmdFactory.TASK_RESUME_ALL)).exe(); + AriaManager.getInstance(AriaManager.APP) + .setCmd(CmdFactory.getInstance() + .createCmd(targetName, new DownloadTaskEntity(), CmdFactory.TASK_RESUME_ALL)) + .exe(); } /** * 删除所有任务 + * + * @param removeFile {@code true} 删除已经下载完成的任务,不仅删除下载记录,还会删除已经下载完成的文件,{@code false} + * 如果文件已经下载完成,只删除下载记录 */ - @Override public void removeAllTask() { + @Override public void removeAllTask(boolean removeFile) { final AriaManager ariaManager = AriaManager.getInstance(AriaManager.APP); - List allEntity = DbEntity.findAllData(DownloadEntity.class); - List cancelCmds = new ArrayList<>(); - for (DownloadEntity entity : allEntity) { - cancelCmds.add( - CommonUtil.createCmd(targetName, new DownloadTaskEntity(entity), CmdFactory.TASK_CANCEL)); - } - ariaManager.setCmds(cancelCmds).exe(); + AriaManager.getInstance(AriaManager.APP) + .setCmd( + CommonUtil.createCmd(targetName, new DownloadTaskEntity(), CmdFactory.TASK_CANCEL_ALL)) + .exe(); + Set keys = ariaManager.getReceiver().keySet(); for (String key : keys) { IReceiver receiver = ariaManager.getReceiver().get(key); diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/DownloadTaskGroup.java b/Aria/src/main/java/com/arialyy/aria/core/download/DownloadTaskGroup.java new file mode 100644 index 00000000..edb322a4 --- /dev/null +++ b/Aria/src/main/java/com/arialyy/aria/core/download/DownloadTaskGroup.java @@ -0,0 +1,8 @@ +package com.arialyy.aria.core.download; + +/** + * Created by AriaL on 2017/6/27. + */ + +public class DownloadTaskGroup { +} diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/DownloadUtil.java b/Aria/src/main/java/com/arialyy/aria/core/download/DownloadUtil.java index 3dbf6aca..526f08ba 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/DownloadUtil.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/DownloadUtil.java @@ -101,7 +101,7 @@ class DownloadUtil implements IDownloadUtil, Runnable { mDownloadEntity.getDownloadUrl()) == null) { isNewTask = true; } else { - isNewTask = false; + isNewTask = !mDownloadFile.exists(); } } catch (Exception e) { e.printStackTrace(); @@ -342,7 +342,8 @@ class DownloadUtil implements IDownloadUtil, Runnable { recordL[rl] = i; rl++; } else { - handleNewTask(fileLength); + //handleNewTask(fileLength); + isNewTask = true; } if (isNewTask) { recordL[rl] = i; diff --git a/Aria/src/main/java/com/arialyy/aria/core/inf/AbsReceiver.java b/Aria/src/main/java/com/arialyy/aria/core/inf/AbsReceiver.java new file mode 100644 index 00000000..4e67339e --- /dev/null +++ b/Aria/src/main/java/com/arialyy/aria/core/inf/AbsReceiver.java @@ -0,0 +1,27 @@ +/* + * Copyright (C) 2016 AriaLyy(https://github.com/AriaLyy/Aria) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.arialyy.aria.core.inf; + +/** + * Created by AriaL on 2017/6/27. + */ + +public abstract class AbsReceiver implements IReceiver{ + public String targetName; + public Object obj; + +} diff --git a/Aria/src/main/java/com/arialyy/aria/core/inf/AbsTaskEntity.java b/Aria/src/main/java/com/arialyy/aria/core/inf/AbsTaskEntity.java index 4f82ad27..fe63cd37 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/inf/AbsTaskEntity.java +++ b/Aria/src/main/java/com/arialyy/aria/core/inf/AbsTaskEntity.java @@ -39,5 +39,10 @@ public abstract class AbsTaskEntity { */ public String redirectUrlKey = "location"; + /** + * 用于判断删除任务时是否需要删除文件{@code true}删除 + */ + public boolean removeFile = false; + public abstract AbsEntity getEntity(); } diff --git a/Aria/src/main/java/com/arialyy/aria/core/inf/IReceiver.java b/Aria/src/main/java/com/arialyy/aria/core/inf/IReceiver.java index 0c8d701c..19b1b11f 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/inf/IReceiver.java +++ b/Aria/src/main/java/com/arialyy/aria/core/inf/IReceiver.java @@ -44,7 +44,7 @@ public interface IReceiver { /** * 删除所有任务 */ - public void removeAllTask(); + public void removeAllTask(boolean removeFile); /** * 任务是否存在 diff --git a/Aria/src/main/java/com/arialyy/aria/core/queue/AbsTaskQueue.java b/Aria/src/main/java/com/arialyy/aria/core/queue/AbsTaskQueue.java index 64a8ca14..0bd83e6e 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/queue/AbsTaskQueue.java +++ b/Aria/src/main/java/com/arialyy/aria/core/queue/AbsTaskQueue.java @@ -41,6 +41,18 @@ abstract class AbsTaskQueue exeKeys = mExecutePool.getAllTask().keySet(); + for (String key : exeKeys) { + TASK task = mExecutePool.getAllTask().get(key); + if (task != null) task.cancel(); + } + Set cacheKeys = mCachePool.getAllTask().keySet(); + for (String key : cacheKeys) { + mExecutePool.removeTask(key); + } + } + /** * 停止所有任务 */ diff --git a/Aria/src/main/java/com/arialyy/aria/core/queue/ITaskQueue.java b/Aria/src/main/java/com/arialyy/aria/core/queue/ITaskQueue.java index c562ffc0..b628a1d3 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/queue/ITaskQueue.java +++ b/Aria/src/main/java/com/arialyy/aria/core/queue/ITaskQueue.java @@ -46,6 +46,11 @@ public interface ITaskQueue { +public class UploadReceiver extends AbsReceiver { private static final String TAG = "DownloadReceiver"; - public String targetName; - public Object obj; public ISchedulerListener listener; /** @@ -94,15 +94,20 @@ public class UploadReceiver implements IReceiver { AriaManager.getInstance(AriaManager.APP).setCmds(stopCmds).exe(); } - @Override public void removeAllTask() { + /** + * 删除所有任务 + * + * @param removeFile {@code true} 删除已经上传完成的任务,不仅删除上传记录,还会删除已经上传完成的文件,{@code false} + * 如果文件已经上传完成,只删除上传记录 + */ + @Override public void removeAllTask(boolean removeFile) { final AriaManager am = AriaManager.getInstance(AriaManager.APP); - List allEntity = DbEntity.findAllData(UploadEntity.class); - List cancelCmds = new ArrayList<>(); - for (UploadEntity entity : allEntity) { - cancelCmds.add( - CommonUtil.createCmd(targetName, new UploadTaskEntity(entity), CmdFactory.TASK_CANCEL)); - } - am.setCmds(cancelCmds).exe(); + + AriaManager.getInstance(AriaManager.APP) + .setCmd( + CommonUtil.createCmd(targetName, new DownloadTaskEntity(), CmdFactory.TASK_CANCEL_ALL)) + .exe(); + Set keys = am.getReceiver().keySet(); for (String key : keys) { IReceiver receiver = am.getReceiver().get(key); @@ -118,8 +123,10 @@ public class UploadReceiver implements IReceiver { /** * 添加调度器回调 + * + * @see #register() */ - public UploadReceiver addSchedulerListener(ISchedulerListener listener) { + @Deprecated public UploadReceiver addSchedulerListener(ISchedulerListener listener) { this.listener = listener; UploadSchedulers.getInstance().addSchedulerListener(targetName, listener); return this; diff --git a/Aria/src/main/java/com/arialyy/aria/util/CommonUtil.java b/Aria/src/main/java/com/arialyy/aria/util/CommonUtil.java index 28d447ad..2b42354a 100644 --- a/Aria/src/main/java/com/arialyy/aria/util/CommonUtil.java +++ b/Aria/src/main/java/com/arialyy/aria/util/CommonUtil.java @@ -22,9 +22,12 @@ import android.content.SharedPreferences; import android.net.Uri; import android.text.TextUtils; import android.util.Log; +import com.arialyy.aria.core.AriaManager; import com.arialyy.aria.core.command.CmdFactory; import com.arialyy.aria.core.command.AbsCmd; +import com.arialyy.aria.core.download.DownloadEntity; import com.arialyy.aria.core.inf.AbsTaskEntity; +import com.arialyy.aria.core.upload.UploadEntity; import java.io.File; import java.io.FileFilter; import java.io.FileInputStream; @@ -49,10 +52,52 @@ import java.util.regex.Pattern; public class CommonUtil { private static final String TAG = "CommonUtil"; + /** + * 删除上传任务的配置,包括 + * + * @param removeFile {@code true} 删除已经上传完成的任务,不仅删除上传记录,还会删除已经上传完成的文件,{@code false} + * 如果文件已经上传完成,只删除上传记录 + */ + public static void delUploadTaskConfig(boolean removeFile, UploadEntity entity) { + if (removeFile) { + File file = new File(entity.getFilePath()); + if (file.exists()) { + file.delete(); + } + } + File config = new File( + AriaManager.APP.getFilesDir().getPath() + "/temp/" + entity.getFileName() + ".properties"); + if (config.exists()) { + config.delete(); + } + entity.deleteData(); + } + + /** + * 删除下载任务的配置,包括 + * + * @param removeFile{@code true} 删除已经下载完成的任务,不仅删除下载记录,还会删除已经下载完成的文件,{@code false} + * 如果文件已经下载完成,只删除下载记录 + */ + public static void delDownloadTaskConfig(boolean removeFile, DownloadEntity entity) { + if (removeFile) { + File file = new File(entity.getDownloadPath()); + if (file.exists()) { + file.delete(); + } + } + File config = new File( + AriaManager.APP.getFilesDir().getPath() + "/temp/" + entity.getFileName() + ".properties"); + if (config.exists()) { + config.delete(); + } + entity.deleteData(); + } + /** * 获取CPU核心数 */ - public static int getNumCores() { + public static int getCoresNum() { //Private Class to display only CPU devices in the directory listing class CpuFilter implements FileFilter { @Override public boolean accept(File pathname) {