diff --git a/Aria/src/main/java/com/arialyy/aria/core/Aria.java b/Aria/src/main/java/com/arialyy/aria/core/Aria.java
index 3263ada6..e7381e54 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/Aria.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/Aria.java
@@ -1,154 +1,154 @@
-/*
- * 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;
-
-import android.annotation.TargetApi;
-import android.app.Activity;
-import android.app.Application;
-import android.app.Dialog;
-import android.app.Service;
-import android.content.Context;
-import android.os.Build;
-import android.support.v4.app.DialogFragment;
-import android.support.v4.app.Fragment;
-import android.widget.PopupWindow;
-import com.arialyy.aria.core.download.DownloadReceiver;
-import com.arialyy.aria.core.upload.UploadReceiver;
-import com.arialyy.aria.util.ALog;
-
-/**
- * Created by lyy on 2016/12/1.
- *
- * @see Aria
- * @see Aria doc
- * Aria启动,管理全局任务
- *
- *
- * //下载
- * Aria.download(this)
- * .load(URL) //下载地址,必填
- * //文件保存路径,必填
- * .setDownloadPath(Environment.getExternalStorageDirectory().getPath() + "/test.apk")
- * .start();
- *
- *
- * //上传
- * Aria.upload(this)
- * .load(filePath) //文件路径,必填
- * .setUploadUrl(uploadUrl) //上传路径,必填
- * .setAttachment(fileKey) //服务器读取文件的key,必填
- * .start();
- *
- *
- *
- * 如果你需要在【Activity、Service、Application、DialogFragment、Fragment、PopupWindow、Dialog】
- * 之外的java中使用Aria,那么你应该在Application或Activity初始化的时候调用{@link #init(Context)}对Aria进行初始化
- * 然后才能使用{@link #download(Object)}、{@link #upload(Object)}
- *
- *
- *
- * Aria.init(this);
- *
- * Aria.download(this)
- * .load(URL) //下载地址,必填
- * //文件保存路径,必填
- * .setDownloadPath(Environment.getExternalStorageDirectory().getPath() + "/test.apk")
- * .start();
- *
- *
- *
- *
- */
-@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1) public class Aria {
-
- private Aria() {
- }
-
- /**
- * 下载,在当前类中调用Aria方法,参数需要使用this,否则将
- * 如果不是【Activity、Service、Application、DialogFragment、Fragment、PopupWindow、Dialog】对象,那么你
- * 需要在对象中初始化下载前,在Application或Activity初始化的时候调用{@link #init(Context)}对Aria进行初始化
- *
- * @param obj 观察者对象,为本类对象,使用{@code this}
- */
- public static DownloadReceiver download(Object obj) {
- if (AriaManager.getInstance() != null){
- return AriaManager.getInstance().download(obj);
- }
- return get(convertContext(obj)).download(obj);
- }
-
- /**
- * 上传
- * 如果不是【Activity、Service、Application、DialogFragment、Fragment、PopupWindow、Dialog】对象,那么你
- * 需要在对象中初始化下载前,在Application或Activity初始化的时候调用{@link #init(Context)}对Aria进行初始化
- *
- * @param obj 观察者对象,为本类对象,使用{@code this}
- */
- public static UploadReceiver upload(Object obj) {
- if (AriaManager.getInstance() != null){
- return AriaManager.getInstance().upload(obj);
- }
- return get(convertContext(obj)).upload(obj);
- }
-
- /**
- * 处理通用事件
- */
- public static AriaManager get(Context context) {
- if (context == null) {
- throw new NullPointerException("context 无效,在非【Activity、Service、Application、DialogFragment、Fragment、PopupWindow、Dialog】,"
- + "请参考【https://aria.laoyuyu.me/aria_doc/start/any_java.html】,参数请使用 download(this) 或 upload(this);"
- + "不要使用 download(getContext()) 或 upload(getContext())");
- }
- return AriaManager.getInstance(context);
- }
-
- /**
- * 初始化Aria,如果你需要在【Activity、Service、Application、DialogFragment、Fragment、PopupWindow、Dialog】
- * 之外的java中使用Aria,那么你应该在Application或Activity初始化的时候调用本方法对Aria进行初始化
- * 只需要初始化一次就可以
- * {@link #download(Object)}、{@link #upload(Object)}
- */
- public static AriaManager init(Context context) {
- return AriaManager.getInstance(context);
- }
-
- private static Context convertContext(Object obj) {
- if (obj instanceof Application) {
- return (Application) obj;
- } else if (obj instanceof Service) {
- return (Service) obj;
- } else if (obj instanceof Activity) {
- return (Activity) obj;
- } else if (obj instanceof DialogFragment) {
- return ((DialogFragment) obj).getContext();
- } else if (obj instanceof android.app.DialogFragment) {
- return ((android.app.DialogFragment) obj).getActivity();
- } else if (obj instanceof android.support.v4.app.Fragment) {
- return ((Fragment) obj).getContext();
- } else if (obj instanceof android.app.Fragment) {
- return ((android.app.Fragment) obj).getActivity();
- } else if (obj instanceof Dialog) {
- return ((Dialog) obj).getContext();
- } else if (obj instanceof PopupWindow) {
- return ((PopupWindow) obj).getContentView().getContext();
- }
- ALog.e("Aria", "请使用download(this)或upload(this)");
- return null;
- }
-}
+/*
+ * 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;
+
+import android.annotation.TargetApi;
+import android.app.Activity;
+import android.app.Application;
+import android.app.Dialog;
+import android.app.Service;
+import android.content.Context;
+import android.os.Build;
+import android.support.v4.app.DialogFragment;
+import android.support.v4.app.Fragment;
+import android.widget.PopupWindow;
+import com.arialyy.aria.core.download.DownloadReceiver;
+import com.arialyy.aria.core.upload.UploadReceiver;
+import com.arialyy.aria.util.ALog;
+
+/**
+ * Created by lyy on 2016/12/1.
+ *
+ * @see Aria
+ * @see Aria doc
+ * Aria启动,管理全局任务
+ *
+ *
+ * //下载
+ * Aria.download(this)
+ * .load(URL) //下载地址,必填
+ * //文件保存路径,必填
+ * .setDownloadPath(Environment.getExternalStorageDirectory().getPath() + "/test.apk")
+ * .start();
+ *
+ *
+ * //上传
+ * Aria.upload(this)
+ * .load(filePath) //文件路径,必填
+ * .setTempUrl(uploadUrl) //上传路径,必填
+ * .setAttachment(fileKey) //服务器读取文件的key,必填
+ * .start();
+ *
+ *
+ *
+ * 如果你需要在【Activity、Service、Application、DialogFragment、Fragment、PopupWindow、Dialog】
+ * 之外的java中使用Aria,那么你应该在Application或Activity初始化的时候调用{@link #init(Context)}对Aria进行初始化
+ * 然后才能使用{@link #download(Object)}、{@link #upload(Object)}
+ *
+ *
+ *
+ * Aria.init(this);
+ *
+ * Aria.download(this)
+ * .load(URL) //下载地址,必填
+ * //文件保存路径,必填
+ * .setDownloadPath(Environment.getExternalStorageDirectory().getPath() + "/test.apk")
+ * .start();
+ *
+ *
+ *
+ *
+ */
+@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1) public class Aria {
+
+ private Aria() {
+ }
+
+ /**
+ * 下载,在当前类中调用Aria方法,参数需要使用this,否则将
+ * 如果不是【Activity、Service、Application、DialogFragment、Fragment、PopupWindow、Dialog】对象,那么你
+ * 需要在对象中初始化下载前,在Application或Activity初始化的时候调用{@link #init(Context)}对Aria进行初始化
+ *
+ * @param obj 观察者对象,为本类对象,使用{@code this}
+ */
+ public static DownloadReceiver download(Object obj) {
+ if (AriaManager.getInstance() != null){
+ return AriaManager.getInstance().download(obj);
+ }
+ return get(convertContext(obj)).download(obj);
+ }
+
+ /**
+ * 上传
+ * 如果不是【Activity、Service、Application、DialogFragment、Fragment、PopupWindow、Dialog】对象,那么你
+ * 需要在对象中初始化下载前,在Application或Activity初始化的时候调用{@link #init(Context)}对Aria进行初始化
+ *
+ * @param obj 观察者对象,为本类对象,使用{@code this}
+ */
+ public static UploadReceiver upload(Object obj) {
+ if (AriaManager.getInstance() != null){
+ return AriaManager.getInstance().upload(obj);
+ }
+ return get(convertContext(obj)).upload(obj);
+ }
+
+ /**
+ * 处理通用事件
+ */
+ public static AriaManager get(Context context) {
+ if (context == null) {
+ throw new NullPointerException("context 无效,在非【Activity、Service、Application、DialogFragment、Fragment、PopupWindow、Dialog】,"
+ + "请参考【https://aria.laoyuyu.me/aria_doc/start/any_java.html】,参数请使用 download(this) 或 upload(this);"
+ + "不要使用 download(getContext()) 或 upload(getContext())");
+ }
+ return AriaManager.getInstance(context);
+ }
+
+ /**
+ * 初始化Aria,如果你需要在【Activity、Service、Application、DialogFragment、Fragment、PopupWindow、Dialog】
+ * 之外的java中使用Aria,那么你应该在Application或Activity初始化的时候调用本方法对Aria进行初始化
+ * 只需要初始化一次就可以
+ * {@link #download(Object)}、{@link #upload(Object)}
+ */
+ public static AriaManager init(Context context) {
+ return AriaManager.getInstance(context);
+ }
+
+ private static Context convertContext(Object obj) {
+ if (obj instanceof Application) {
+ return (Application) obj;
+ } else if (obj instanceof Service) {
+ return (Service) obj;
+ } else if (obj instanceof Activity) {
+ return (Activity) obj;
+ } else if (obj instanceof DialogFragment) {
+ return ((DialogFragment) obj).getContext();
+ } else if (obj instanceof android.app.DialogFragment) {
+ return ((android.app.DialogFragment) obj).getActivity();
+ } else if (obj instanceof android.support.v4.app.Fragment) {
+ return ((Fragment) obj).getContext();
+ } else if (obj instanceof android.app.Fragment) {
+ return ((android.app.Fragment) obj).getActivity();
+ } else if (obj instanceof Dialog) {
+ return ((Dialog) obj).getContext();
+ } else if (obj instanceof PopupWindow) {
+ return ((PopupWindow) obj).getContentView().getContext();
+ }
+ ALog.e("Aria", "请使用download(this)或upload(this)");
+ return null;
+ }
+}
diff --git a/Aria/src/main/java/com/arialyy/aria/core/common/ftp/FTPSDelegate.java b/Aria/src/main/java/com/arialyy/aria/core/common/ftp/FTPSDelegate.java
index 5188d59d..4ea18029 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/common/ftp/FTPSDelegate.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/common/ftp/FTPSDelegate.java
@@ -1,120 +1,124 @@
-/*
- * 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.common.ftp;
-
-import android.text.TextUtils;
-import com.arialyy.aria.core.FtpUrlEntity;
-import com.arialyy.aria.core.common.ProtocolType;
-import com.arialyy.aria.core.inf.AbsTarget;
-import com.arialyy.aria.core.inf.ITarget;
-
-/**
- * FTP SSL/TSL 参数委托
- */
-public class FTPSDelegate implements ITarget {
- private final String TAG = "FTPSDelegate";
- private TARGET mTarget;
- private FtpUrlEntity mUrlEntity;
-
- public FTPSDelegate(TARGET target) {
- mTarget = target;
- mUrlEntity = mTarget.getTaskWrapper().asFtp().getUrlEntity();
- }
-
- /**
- * 设置协议类型
- *
- * @param protocol {@link ProtocolType}
- */
- public FTPSDelegate setProtocol(@ProtocolType String protocol) {
- if (TextUtils.isEmpty(protocol)) {
- throw new NullPointerException("协议为空");
- }
- mUrlEntity.protocol = protocol;
- return this;
- }
-
- /**
- * 设置证书别名
- *
- * @param keyAlias 别名
- */
- public FTPSDelegate setAlias(String keyAlias) {
- if (TextUtils.isEmpty(keyAlias)) {
- throw new NullPointerException("别名为空");
- }
- mUrlEntity.keyAlias = keyAlias;
- return this;
- }
-
- /**
- * 设置证书密码
- *
- * @param storePass 私钥密码
- */
- public FTPSDelegate setStorePass(String storePass) {
- if (TextUtils.isEmpty(storePass)) {
- throw new NullPointerException("证书密码为空");
- }
- mUrlEntity.storePass = storePass;
- return this;
- }
-
- /**
- * 设置证书路径
- *
- * @param storePath 证书路径
- */
- public FTPSDelegate setStorePath(String storePath) {
- if (TextUtils.isEmpty(storePath)) {
- throw new NullPointerException("证书路径为空");
- }
- mUrlEntity.storePath = storePath;
- return this;
- }
-
- @Override public void start() {
- mTarget.start();
- }
-
- @Override public void stop() {
- mTarget.stop();
- }
-
- @Override public void resume() {
- mTarget.resume();
- }
-
- @Override public void cancel() {
- mTarget.cancel();
- }
-
- @Override public void save() {
- mTarget.save();
- }
-
- @Override public void cancel(boolean removeFile) {
- mTarget.cancel(removeFile);
- }
-
- @Override public void reTry() {
- mTarget.reTry();
- }
-
- @Override public void reStart() {
- mTarget.reStart();
- }
-}
+/*
+ * 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.common.ftp;
+
+import android.text.TextUtils;
+import com.arialyy.aria.core.FtpUrlEntity;
+import com.arialyy.aria.core.common.ProtocolType;
+import com.arialyy.aria.core.inf.AbsTarget;
+import com.arialyy.aria.core.inf.ITargetHandler;
+
+/**
+ * FTP SSL/TSL 参数委托
+ */
+public class FTPSDelegate implements ITargetHandler {
+ private final String TAG = "FTPSDelegate";
+ private TARGET mTarget;
+ private FtpUrlEntity mUrlEntity;
+
+ public FTPSDelegate(TARGET target) {
+ mTarget = target;
+ mUrlEntity = mTarget.getTaskWrapper().asFtp().getUrlEntity();
+ }
+
+ /**
+ * 设置协议类型
+ *
+ * @param protocol {@link ProtocolType}
+ */
+ public FTPSDelegate setProtocol(@ProtocolType String protocol) {
+ if (TextUtils.isEmpty(protocol)) {
+ throw new NullPointerException("协议为空");
+ }
+ mUrlEntity.protocol = protocol;
+ return this;
+ }
+
+ /**
+ * 设置证书别名
+ *
+ * @param keyAlias 别名
+ */
+ public FTPSDelegate setAlias(String keyAlias) {
+ if (TextUtils.isEmpty(keyAlias)) {
+ throw new NullPointerException("别名为空");
+ }
+ mUrlEntity.keyAlias = keyAlias;
+ return this;
+ }
+
+ /**
+ * 设置证书密码
+ *
+ * @param storePass 私钥密码
+ */
+ public FTPSDelegate setStorePass(String storePass) {
+ if (TextUtils.isEmpty(storePass)) {
+ throw new NullPointerException("证书密码为空");
+ }
+ mUrlEntity.storePass = storePass;
+ return this;
+ }
+
+ /**
+ * 设置证书路径
+ *
+ * @param storePath 证书路径
+ */
+ public FTPSDelegate setStorePath(String storePath) {
+ if (TextUtils.isEmpty(storePath)) {
+ throw new NullPointerException("证书路径为空");
+ }
+ mUrlEntity.storePath = storePath;
+ return this;
+ }
+
+ @Override public void add() {
+ mTarget.add();
+ }
+
+ @Override public void start() {
+ mTarget.start();
+ }
+
+ @Override public void stop() {
+ mTarget.stop();
+ }
+
+ @Override public void resume() {
+ mTarget.resume();
+ }
+
+ @Override public void cancel() {
+ mTarget.cancel();
+ }
+
+ @Override public void save() {
+ mTarget.save();
+ }
+
+ @Override public void cancel(boolean removeFile) {
+ mTarget.cancel(removeFile);
+ }
+
+ @Override public void reTry() {
+ mTarget.reTry();
+ }
+
+ @Override public void reStart() {
+ mTarget.reStart();
+ }
+}
diff --git a/Aria/src/main/java/com/arialyy/aria/core/common/ftp/FtpTaskDelegate.java b/Aria/src/main/java/com/arialyy/aria/core/common/ftp/FtpTaskDelegate.java
index 581b609a..5e1fc7d4 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/common/ftp/FtpTaskDelegate.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/common/ftp/FtpTaskDelegate.java
@@ -1,62 +1,62 @@
-/*
- * 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.common.ftp;
-
-import com.arialyy.aria.core.FtpUrlEntity;
-import com.arialyy.aria.core.inf.ITaskDelegate;
-import java.net.Proxy;
-
-/**
- * fTP任务设置的信息,如:用户名、密码、端口等信息
- */
-public class FtpTaskDelegate implements ITaskDelegate {
-
- /**
- * 账号和密码
- */
- private FtpUrlEntity urlEntity;
-
- private Proxy proxy;
-
- /**
- * 字符编码,默认为"utf-8"
- */
- private String charSet = "utf-8";
-
- public FtpUrlEntity getUrlEntity() {
- return urlEntity;
- }
-
- public void setUrlEntity(FtpUrlEntity urlEntity) {
- this.urlEntity = urlEntity;
- }
-
- public void setProxy(Proxy proxy) {
- this.proxy = proxy;
- }
-
- public Proxy getProxy() {
- return proxy;
- }
-
- public String getCharSet() {
- return charSet;
- }
-
- public void setCharSet(String charSet) {
- this.charSet = charSet;
- }
-}
+/*
+ * 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.common.ftp;
+
+import com.arialyy.aria.core.FtpUrlEntity;
+import com.arialyy.aria.core.inf.ITargetHeadDelegate;
+import java.net.Proxy;
+
+/**
+ * fTP任务设置的信息,如:用户名、密码、端口等信息
+ */
+public class FtpTaskDelegate implements ITargetHeadDelegate {
+
+ /**
+ * 账号和密码
+ */
+ private FtpUrlEntity urlEntity;
+
+ private Proxy proxy;
+
+ /**
+ * 字符编码,默认为"utf-8"
+ */
+ private String charSet = "utf-8";
+
+ public FtpUrlEntity getUrlEntity() {
+ return urlEntity;
+ }
+
+ public void setUrlEntity(FtpUrlEntity urlEntity) {
+ this.urlEntity = urlEntity;
+ }
+
+ public void setProxy(Proxy proxy) {
+ this.proxy = proxy;
+ }
+
+ public Proxy getProxy() {
+ return proxy;
+ }
+
+ public String getCharSet() {
+ return charSet;
+ }
+
+ public void setCharSet(String charSet) {
+ this.charSet = charSet;
+ }
+}
diff --git a/Aria/src/main/java/com/arialyy/aria/core/common/http/HttpDelegate.java b/Aria/src/main/java/com/arialyy/aria/core/common/http/HttpDelegate.java
index 3caf18a9..40ac1f48 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/common/http/HttpDelegate.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/common/http/HttpDelegate.java
@@ -1,100 +1,104 @@
-/*
- * 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.common.http;
-
-import android.text.TextUtils;
-import com.arialyy.aria.core.download.DGTaskWrapper;
-import com.arialyy.aria.core.download.DTaskWrapper;
-import com.arialyy.aria.core.download.DownloadGroupTarget;
-import com.arialyy.aria.core.inf.AbsTarget;
-import com.arialyy.aria.core.inf.ITarget;
-import com.arialyy.aria.util.ALog;
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * HTTP参数委托
- * @param
- */
-class HttpDelegate implements ITarget {
- private static final String TAG = "PostDelegate";
- TARGET mTarget;
-
- HttpDelegate(TARGET target) {
- mTarget = target;
- }
-
- public TARGET setParams(Map params) {
- mTarget.getTaskWrapper().asHttp().setParams(params);
- if (mTarget instanceof DownloadGroupTarget) {
- for (DTaskWrapper subTask : ((DGTaskWrapper) mTarget.getTaskWrapper()).getSubTaskWrapper()) {
- subTask.asHttp().setParams(params);
- }
- }
- return mTarget;
- }
-
- public TARGET setParam(String key, String value) {
- if (TextUtils.isEmpty(key) || TextUtils.isEmpty(value)) {
- ALog.d(TAG, "key 或value 为空");
- return mTarget;
- }
- Map params = mTarget.getTaskWrapper().asHttp().getParams();
- if (params == null) {
- params = new HashMap<>();
- mTarget.getTaskWrapper().asHttp().setParams(params);
- }
- params.put(key, value);
- if (mTarget instanceof DownloadGroupTarget) {
- for (DTaskWrapper subTask : ((DGTaskWrapper) mTarget.getTaskWrapper()).getSubTaskWrapper()) {
- subTask.asHttp().setParams(params);
- }
- }
- return mTarget;
- }
-
- @Override public void start() {
- mTarget.start();
- }
-
- @Override public void stop() {
- mTarget.stop();
- }
-
- @Override public void resume() {
- mTarget.resume();
- }
-
- @Override public void cancel() {
- mTarget.cancel();
- }
-
- @Override public void save() {
- mTarget.save();
- }
-
- @Override public void cancel(boolean removeFile) {
- mTarget.cancel(removeFile);
- }
-
- @Override public void reTry() {
- mTarget.reTry();
- }
-
- @Override public void reStart() {
- mTarget.reStart();
- }
-}
+/*
+ * 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.common.http;
+
+import android.text.TextUtils;
+import com.arialyy.aria.core.download.DGTaskWrapper;
+import com.arialyy.aria.core.download.DTaskWrapper;
+import com.arialyy.aria.core.download.DownloadGroupTarget;
+import com.arialyy.aria.core.inf.AbsTarget;
+import com.arialyy.aria.core.inf.ITargetHandler;
+import com.arialyy.aria.util.ALog;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * HTTP参数委托
+ * @param
+ */
+class HttpDelegate implements ITargetHandler {
+ private static final String TAG = "PostDelegate";
+ TARGET mTarget;
+
+ HttpDelegate(TARGET target) {
+ mTarget = target;
+ }
+
+ public TARGET setParams(Map params) {
+ mTarget.getTaskWrapper().asHttp().setParams(params);
+ if (mTarget instanceof DownloadGroupTarget) {
+ for (DTaskWrapper subTask : ((DGTaskWrapper) mTarget.getTaskWrapper()).getSubTaskWrapper()) {
+ subTask.asHttp().setParams(params);
+ }
+ }
+ return mTarget;
+ }
+
+ public TARGET setParam(String key, String value) {
+ if (TextUtils.isEmpty(key) || TextUtils.isEmpty(value)) {
+ ALog.d(TAG, "key 或value 为空");
+ return mTarget;
+ }
+ Map params = mTarget.getTaskWrapper().asHttp().getParams();
+ if (params == null) {
+ params = new HashMap<>();
+ mTarget.getTaskWrapper().asHttp().setParams(params);
+ }
+ params.put(key, value);
+ if (mTarget instanceof DownloadGroupTarget) {
+ for (DTaskWrapper subTask : ((DGTaskWrapper) mTarget.getTaskWrapper()).getSubTaskWrapper()) {
+ subTask.asHttp().setParams(params);
+ }
+ }
+ return mTarget;
+ }
+
+ @Override public void add() {
+ mTarget.add();
+ }
+
+ @Override public void start() {
+ mTarget.start();
+ }
+
+ @Override public void stop() {
+ mTarget.stop();
+ }
+
+ @Override public void resume() {
+ mTarget.resume();
+ }
+
+ @Override public void cancel() {
+ mTarget.cancel();
+ }
+
+ @Override public void save() {
+ mTarget.save();
+ }
+
+ @Override public void cancel(boolean removeFile) {
+ mTarget.cancel(removeFile);
+ }
+
+ @Override public void reTry() {
+ mTarget.reTry();
+ }
+
+ @Override public void reStart() {
+ mTarget.reStart();
+ }
+}
diff --git a/Aria/src/main/java/com/arialyy/aria/core/common/http/HttpTaskDelegate.java b/Aria/src/main/java/com/arialyy/aria/core/common/http/HttpTaskDelegate.java
index 58b217ac..5dadd800 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/common/http/HttpTaskDelegate.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/common/http/HttpTaskDelegate.java
@@ -1,187 +1,187 @@
-/*
- * 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.common.http;
-
-import com.arialyy.aria.core.common.RequestEnum;
-import com.arialyy.aria.core.inf.ITaskDelegate;
-import java.net.CookieManager;
-import java.net.Proxy;
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * Http任务设置的信息,如:cookie、请求参数
- */
-public class HttpTaskDelegate implements ITaskDelegate {
-
- private CookieManager cookieManager;
-
- /**
- * 请求参数
- */
- private Map params;
-
- /**
- * http 请求头
- */
- private Map headers = new HashMap<>();
-
- /**
- * 字符编码,默认为"utf-8"
- */
- private String charSet = "utf-8";
-
- /**
- * 网络请求类型
- */
- private RequestEnum requestEnum = RequestEnum.GET;
-
- /**
- * 是否使用服务器通过content-disposition传递的文件名,内容格式{@code attachment; filename="filename.jpg"} {@code true}
- * 使用
- */
- private boolean useServerFileName = false;
-
- /**
- * 重定向链接
- */
- private String redirectUrl = "";
-
- /**
- * 是否是chunk模式
- */
- private boolean isChunked = false;
- /**
- * 文件上传需要的key
- */
- private String attachment;
- /**
- * 上传的文件类型
- */
- private String contentType = "multipart/form-data";
- private String userAgent = "Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-CN; rv:1.9.2.6)";
-
- private Proxy proxy;
- /**
- * 文件上传表单
- */
- private Map formFields = new HashMap<>();
-
- public Map getFormFields() {
- return formFields;
- }
-
- public void setFormFields(Map formFields) {
- this.formFields = formFields;
- }
-
- public String getAttachment() {
- return attachment;
- }
-
- public void setAttachment(String attachment) {
- this.attachment = attachment;
- }
-
- public String getContentType() {
- return contentType;
- }
-
- public void setContentType(String contentType) {
- this.contentType = contentType;
- }
-
- public String getUserAgent() {
- return userAgent;
- }
-
- public void setUserAgent(String userAgent) {
- this.userAgent = userAgent;
- }
-
- public boolean isChunked() {
- return isChunked;
- }
-
- public void setChunked(boolean chunked) {
- isChunked = chunked;
- }
-
- public CookieManager getCookieManager() {
- return cookieManager;
- }
-
- public void setCookieManager(CookieManager cookieManager) {
- this.cookieManager = cookieManager;
- }
-
- public Proxy getProxy() {
- return proxy;
- }
-
- public void setProxy(Proxy proxy) {
- this.proxy = proxy;
- }
-
- public Map getHeaders() {
- return headers;
- }
-
- public void setHeaders(Map headers) {
- this.headers = headers;
- }
-
- public String getCharSet() {
- return charSet;
- }
-
- public void setCharSet(String charSet) {
- this.charSet = charSet;
- }
-
- public RequestEnum getRequestEnum() {
- return requestEnum;
- }
-
- public void setRequestEnum(RequestEnum requestEnum) {
- this.requestEnum = requestEnum;
- }
-
- public boolean isUseServerFileName() {
- return useServerFileName;
- }
-
- public void setUseServerFileName(boolean useServerFileName) {
- this.useServerFileName = useServerFileName;
- }
-
- public String getRedirectUrl() {
- return redirectUrl;
- }
-
- public void setRedirectUrl(String redirectUrl) {
- this.redirectUrl = redirectUrl;
- }
-
- public Map getParams() {
- return params;
- }
-
- public void setParams(Map params) {
- this.params = params;
- }
-}
+/*
+ * 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.common.http;
+
+import com.arialyy.aria.core.common.RequestEnum;
+import com.arialyy.aria.core.inf.ITargetHeadDelegate;
+import java.net.CookieManager;
+import java.net.Proxy;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Http任务设置的信息,如:cookie、请求参数
+ */
+public class HttpTaskDelegate implements ITargetHeadDelegate {
+
+ private CookieManager cookieManager;
+
+ /**
+ * 请求参数
+ */
+ private Map params;
+
+ /**
+ * http 请求头
+ */
+ private Map headers = new HashMap<>();
+
+ /**
+ * 字符编码,默认为"utf-8"
+ */
+ private String charSet = "utf-8";
+
+ /**
+ * 网络请求类型
+ */
+ private RequestEnum requestEnum = RequestEnum.GET;
+
+ /**
+ * 是否使用服务器通过content-disposition传递的文件名,内容格式{@code attachment; filename="filename.jpg"} {@code true}
+ * 使用
+ */
+ private boolean useServerFileName = false;
+
+ /**
+ * 重定向链接
+ */
+ private String redirectUrl = "";
+
+ /**
+ * 是否是chunk模式
+ */
+ private boolean isChunked = false;
+ /**
+ * 文件上传需要的key
+ */
+ private String attachment;
+ /**
+ * 上传的文件类型
+ */
+ private String contentType = "multipart/form-data";
+ private String userAgent = "Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-CN; rv:1.9.2.6)";
+
+ private Proxy proxy;
+ /**
+ * 文件上传表单
+ */
+ private Map formFields = new HashMap<>();
+
+ public Map getFormFields() {
+ return formFields;
+ }
+
+ public void setFormFields(Map formFields) {
+ this.formFields = formFields;
+ }
+
+ public String getAttachment() {
+ return attachment;
+ }
+
+ public void setAttachment(String attachment) {
+ this.attachment = attachment;
+ }
+
+ public String getContentType() {
+ return contentType;
+ }
+
+ public void setContentType(String contentType) {
+ this.contentType = contentType;
+ }
+
+ public String getUserAgent() {
+ return userAgent;
+ }
+
+ public void setUserAgent(String userAgent) {
+ this.userAgent = userAgent;
+ }
+
+ public boolean isChunked() {
+ return isChunked;
+ }
+
+ public void setChunked(boolean chunked) {
+ isChunked = chunked;
+ }
+
+ public CookieManager getCookieManager() {
+ return cookieManager;
+ }
+
+ public void setCookieManager(CookieManager cookieManager) {
+ this.cookieManager = cookieManager;
+ }
+
+ public Proxy getProxy() {
+ return proxy;
+ }
+
+ public void setProxy(Proxy proxy) {
+ this.proxy = proxy;
+ }
+
+ public Map getHeaders() {
+ return headers;
+ }
+
+ public void setHeaders(Map headers) {
+ this.headers = headers;
+ }
+
+ public String getCharSet() {
+ return charSet;
+ }
+
+ public void setCharSet(String charSet) {
+ this.charSet = charSet;
+ }
+
+ public RequestEnum getRequestEnum() {
+ return requestEnum;
+ }
+
+ public void setRequestEnum(RequestEnum requestEnum) {
+ this.requestEnum = requestEnum;
+ }
+
+ public boolean isUseServerFileName() {
+ return useServerFileName;
+ }
+
+ public void setUseServerFileName(boolean useServerFileName) {
+ this.useServerFileName = useServerFileName;
+ }
+
+ public String getRedirectUrl() {
+ return redirectUrl;
+ }
+
+ public void setRedirectUrl(String redirectUrl) {
+ this.redirectUrl = redirectUrl;
+ }
+
+ public Map getParams() {
+ return params;
+ }
+
+ public void setParams(Map params) {
+ this.params = params;
+ }
+}
diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/AbsDownloadTarget.java b/Aria/src/main/java/com/arialyy/aria/core/download/AbsDownloadTarget.java
index ab19a525..2e589d3b 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/download/AbsDownloadTarget.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/download/AbsDownloadTarget.java
@@ -1,102 +1,121 @@
-/*
- * 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.download;
-
-import com.arialyy.aria.core.AriaManager;
-import com.arialyy.aria.core.command.normal.NormalCmdFactory;
-import com.arialyy.aria.core.inf.AbsEntity;
-import com.arialyy.aria.core.inf.AbsTarget;
-import com.arialyy.aria.core.inf.AbsTaskWrapper;
-import com.arialyy.aria.util.CommonUtil;
-
-/**
- * Created by lyy on 2017/2/28.
- */
-abstract class AbsDownloadTarget
- extends AbsTarget {
-
- static final int HTTP = 1;
- static final int FTP = 2;
- //HTTP任务组
- static final int GROUP_HTTP = 3;
- //FTP文件夹
- static final int GROUP_FTP_DIR = 4;
-
- /**
- * 设置的文件保存路径的临时变量
- */
- String mTempFilePath;
-
- /**
- * {@code true}强制下载,不考虑文件路径是否被占用
- */
- boolean forceDownload = false;
-
- /**
- * 将任务设置为最高优先级任务,最高优先级任务有以下特点:
- * 1、在下载队列中,有且只有一个最高优先级任务
- * 2、最高优先级任务会一直存在,直到用户手动暂停或任务完成
- * 3、任务调度器不会暂停最高优先级任务
- * 4、用户手动暂停或任务完成后,第二次重新执行该任务,该命令将失效
- * 5、如果下载队列中已经满了,则会停止队尾的任务,当高优先级任务完成后,该队尾任务将自动执行
- * 6、把任务设置为最高优先级任务后,将自动执行任务,不需要重新调用start()启动任务
- */
- protected void setHighestPriority() {
- if (checkEntity()) {
- AriaManager.getInstance(AriaManager.APP)
- .setCmd(CommonUtil.createNormalCmd(mTaskWrapper, NormalCmdFactory.TASK_HIGHEST_PRIORITY,
- checkTaskType()))
- .exe();
- }
- }
-
- /**
- * 添加任务
- */
- public void add() {
- if (checkEntity()) {
- AriaManager.getInstance(AriaManager.APP)
- .setCmd(CommonUtil.createNormalCmd(mTaskWrapper, NormalCmdFactory.TASK_CREATE,
- checkTaskType()))
- .exe();
- }
- }
-
- /**
- * 获取任务文件大小
- *
- * @return 文件大小
- */
- public long getFileSize() {
- return getSize();
- }
-
- /**
- * 获取单位转换后的文件大小
- *
- * @return 文件大小{@code xxx mb}
- */
- public String getConvertFileSize() {
- return getConvertSize();
- }
-
- /**
- * 设置target类型
- *
- * @return {@link #HTTP}、{@link #FTP}、{@link #GROUP_HTTP}、{@link #GROUP_FTP_DIR}
- */
- protected abstract int getTargetType();
-}
+/*
+ * 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.download;
+
+import com.arialyy.aria.core.AriaManager;
+import com.arialyy.aria.core.command.normal.NormalCmdFactory;
+import com.arialyy.aria.core.inf.AbsTarget;
+import com.arialyy.aria.util.CommonUtil;
+
+/**
+ * Created by lyy on 2017/2/28.
+ */
+abstract class AbsDownloadTarget
+ extends AbsTarget {
+
+ /**
+ * 设置的文件保存路径的临时变量
+ */
+ private String mTempFilePath;
+
+ /**
+ * {@code true}强制下载,不考虑文件路径是否被占用
+ */
+ private boolean forceDownload = false;
+ /**
+ * 资源地址
+ */
+ private String mUrl, mNewUrl;
+
+ /**
+ * 更新下载url
+ *
+ * @param newUrl 新的下载url
+ */
+ public abstract TARGET updateUrl(String newUrl);
+
+ /**
+ * 将任务设置为最高优先级任务,最高优先级任务有以下特点:
+ * 1、在下载队列中,有且只有一个最高优先级任务
+ * 2、最高优先级任务会一直存在,直到用户手动暂停或任务完成
+ * 3、任务调度器不会暂停最高优先级任务
+ * 4、用户手动暂停或任务完成后,第二次重新执行该任务,该命令将失效
+ * 5、如果下载队列中已经满了,则会停止队尾的任务,当高优先级任务完成后,该队尾任务将自动执行
+ * 6、把任务设置为最高优先级任务后,将自动执行任务,不需要重新调用start()启动任务
+ */
+ public void setHighestPriority() {
+ if (checkEntity()) {
+ AriaManager.getInstance(AriaManager.APP)
+ .setCmd(
+ CommonUtil.createNormalCmd(getTaskWrapper(), NormalCmdFactory.TASK_HIGHEST_PRIORITY,
+ checkTaskType()))
+ .exe();
+ }
+ }
+
+ /**
+ * 是否强制下载文件 {@link DownloadTarget#setFilePath(String, boolean)}、
+ * {@link FtpDownloadTarget#setFilePath(String, boolean)}
+ *
+ * @return {@code true} 强制下载文件
+ */
+ boolean isForceDownload() {
+ return forceDownload;
+ }
+
+ @Override public void setTaskWrapper(DTaskWrapper taskWrapper) {
+ super.setTaskWrapper(taskWrapper);
+ }
+
+ /**
+ * 文件保存路径的临时变量
+ */
+ String getTempFilePath() {
+ return mTempFilePath;
+ }
+
+ void setForceDownload(boolean forceDownload) {
+ this.forceDownload = forceDownload;
+ }
+
+ public String getUrl() {
+ return mUrl;
+ }
+
+ void setUrl(String url) {
+ this.mUrl = url;
+ }
+
+ String getNewUrl() {
+ return mNewUrl;
+ }
+
+ void setNewUrl(String newUrl) {
+ this.mNewUrl = newUrl;
+ }
+
+ void setTempFilePath(String mTempFilePath) {
+ this.mTempFilePath = mTempFilePath;
+ }
+
+ public void setEntity(DownloadEntity entity) {
+ mEntity = entity;
+ }
+
+ @Override public DownloadEntity getEntity() {
+ return super.getEntity();
+ }
+}
diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/BaseGroupTarget.java b/Aria/src/main/java/com/arialyy/aria/core/download/BaseGroupTarget.java
index 45b1f7d8..adb049a4 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/download/BaseGroupTarget.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/download/BaseGroupTarget.java
@@ -18,6 +18,7 @@ package com.arialyy.aria.core.download;
import android.support.annotation.CheckResult;
import android.text.TextUtils;
import com.arialyy.aria.core.inf.AbsEntity;
+import com.arialyy.aria.core.inf.AbsTarget;
import com.arialyy.aria.core.manager.SubTaskManager;
import com.arialyy.aria.core.queue.DownloadGroupTaskQueue;
import com.arialyy.aria.orm.DbEntity;
@@ -30,7 +31,7 @@ import java.util.List;
* Created by lyy on 2017/7/26.
*/
abstract class BaseGroupTarget
- extends AbsDownloadTarget {
+ extends AbsTarget {
/**
* 组任务名
@@ -55,7 +56,7 @@ abstract class BaseGroupTarget
@CheckResult
public SubTaskManager getSubTaskManager() {
if (mSubTaskManager == null) {
- mSubTaskManager = new SubTaskManager(mTargetName, mTaskWrapper);
+ mSubTaskManager = new SubTaskManager(getTargetName(), getTaskWrapper());
}
return mSubTaskManager;
}
@@ -122,7 +123,7 @@ abstract class BaseGroupTarget
* @param newDirPath 新的文件夹路径
*/
void reChangeDirPath(String newDirPath) {
- List subTasks = mTaskWrapper.getSubTaskWrapper();
+ List subTasks = getTaskWrapper().getSubTaskWrapper();
if (subTasks != null && !subTasks.isEmpty()) {
List des = new ArrayList<>();
for (DTaskWrapper dte : subTasks) {
diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/BaseNormalTarget.java b/Aria/src/main/java/com/arialyy/aria/core/download/BaseNormalTarget.java
index 49357622..b7c7bace 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/download/BaseNormalTarget.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/download/BaseNormalTarget.java
@@ -1,207 +1,199 @@
-/*
- * 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.download;
-
-import android.text.TextUtils;
-import com.arialyy.aria.core.manager.TaskWrapperManager;
-import com.arialyy.aria.core.queue.DownloadTaskQueue;
-import com.arialyy.aria.orm.DbEntity;
-import com.arialyy.aria.util.ALog;
-import com.arialyy.aria.util.CommonUtil;
-import java.io.File;
-
-/**
- * Created by Aria.Lao on 2017/7/26.
- */
-abstract class BaseNormalTarget
- extends AbsDownloadTarget {
-
- /**
- * 资源地址
- */
- protected String url, newUrl;
-
- /**
- * 通过地址初始化target
- */
- void initTarget(String url, String targetName) {
- this.url = url;
- mTargetName = targetName;
- mTaskWrapper = TaskWrapperManager.getInstance().getHttpTaskWrapper(DTaskWrapper.class, url);
- mEntity = mTaskWrapper.getEntity();
-
- if (mEntity != null) {
- mTempFilePath = mEntity.getDownloadPath();
- }
- }
-
- /**
- * 更新下载url
- *
- * @param newUrl 新的下载url
- */
- public TARGET updateUrl(String newUrl) {
- if (TextUtils.isEmpty(newUrl)) {
- ALog.e(TAG, "下载url更新失败,newUrl为null");
- return (TARGET) this;
- }
- if (url.equals(newUrl)) {
- ALog.e(TAG, "下载url更新失败,新的下载url和旧的url一致");
- return (TARGET) this;
- }
- this.newUrl = newUrl;
- mTaskWrapper.setRefreshInfo(true);
- return (TARGET) this;
- }
-
- /**
- * 将任务设置为最高优先级任务,最高优先级任务有以下特点: 1、在下载队列中,有且只有一个最高优先级任务 2、最高优先级任务会一直存在,直到用户手动暂停或任务完成
- * 3、任务调度器不会暂停最高优先级任务 4、用户手动暂停或任务完成后,第二次重新执行该任务,该命令将失效 5、如果下载队列中已经满了,则会停止队尾的任务,当高优先级任务完成后,该队尾任务将自动执行
- * 6、把任务设置为最高优先级任务后,将自动执行任务,不需要重新调用start()启动任务
- */
- @Override public void setHighestPriority() {
- super.setHighestPriority();
- }
-
- /**
- * 下载任务是否存在
- *
- * @return {@code true}任务存在
- */
- @Override public boolean taskExists() {
- return DbEntity.checkDataExist(DownloadEntity.class, "url=?", url);
- }
-
- /**
- * 获取下载实体
- */
- public DownloadEntity getDownloadEntity() {
- return mEntity;
- }
-
- /**
- * 是否在下载,该api后续版本会删除
- *
- * @deprecated {@link #isRunning()}
- */
- @Deprecated public boolean isDownloading() {
- return isRunning();
- }
-
- /**
- * 是否在下载
- *
- * @return {@code true}任务正在下载
- */
- @Override public boolean isRunning() {
- DownloadTask task = DownloadTaskQueue.getInstance().getTask(mEntity.getKey());
- return task != null && task.isRunning();
- }
-
- /**
- * 检查下载实体,判断实体是否合法 合法标准为: 1、下载路径不为null,并且下载路径是正常的http或ftp路径 2、保存路径不为null,并且保存路径是android文件系统路径
- * 3、保存路径不能重复
- *
- * @return {@code true}合法
- */
- @Override protected boolean checkEntity() {
- boolean b = getTargetType() < GROUP_HTTP && checkUrl() && checkFilePath();
- if (b) {
- mEntity.save();
- }
- return b;
- }
-
- /**
- * 检查并设置普通任务的文件保存路径
- *
- * @return {@code true}保存路径合法
- */
- private boolean checkFilePath() {
- String filePath = mTempFilePath;
- if (TextUtils.isEmpty(filePath)) {
- ALog.e(TAG, "下载失败,文件保存路径为null");
- return false;
- } else if (!filePath.startsWith("/")) {
- ALog.e(TAG, "下载失败,文件保存路径【" + filePath + "】错误");
- return false;
- }
- File file = new File(filePath);
- if (file.isDirectory()) {
- if (getTargetType() == HTTP) {
- ALog.e(TAG, "下载失败,保存路径【" + filePath + "】不能为文件夹,路径需要是完整的文件路径,如:/mnt/sdcard/game.zip");
- return false;
- } else if (getTargetType() == FTP) {
- filePath += mEntity.getFileName();
- }
- } else {
- // http文件名设置
- if (TextUtils.isEmpty(mEntity.getFileName())) {
- mEntity.setFileName(file.getName());
- }
- }
-
- //设置文件保存路径,如果新文件路径和旧文件路径不同,则修改路径
- if (!filePath.equals(mEntity.getDownloadPath())) {
- // 检查路径冲突
- if (DbEntity.checkDataExist(DownloadEntity.class, "downloadPath=?", filePath)) {
- if (!forceDownload) {
- ALog.e(TAG, "下载失败,保存路径【" + filePath + "】已经被其它任务占用,请设置其它保存路径");
- return false;
- } else {
- ALog.w(TAG, "保存路径【" + filePath + "】已经被其它任务占用,当前任务将覆盖该路径的文件");
- CommonUtil.delTaskRecord(filePath, 1);
- mTaskWrapper =
- TaskWrapperManager.getInstance().getHttpTaskWrapper(DTaskWrapper.class, url);
- }
- }
- File oldFile = new File(mEntity.getDownloadPath());
- File newFile = new File(filePath);
- mEntity.setDownloadPath(filePath);
- mEntity.setFileName(newFile.getName());
- if (oldFile.exists()) {
- oldFile.renameTo(newFile);
- CommonUtil.modifyTaskRecord(oldFile.getPath(), newFile.getPath());
- }
- }
- return true;
- }
-
- /**
- * 检查普通任务的下载地址
- *
- * @return {@code true}地址合法
- */
- private boolean checkUrl() {
- final String url = mEntity.getUrl();
- if (TextUtils.isEmpty(url)) {
- ALog.e(TAG, "下载失败,url为null");
- return false;
- } else if (!url.startsWith("http") && !url.startsWith("ftp")) {
- ALog.e(TAG, "下载失败,url【" + url + "】错误");
- return false;
- }
- int index = url.indexOf("://");
- if (index == -1) {
- ALog.e(TAG, "下载失败,url【" + url + "】不合法");
- return false;
- }
- if (!TextUtils.isEmpty(newUrl)) {
- mEntity.setUrl(newUrl);
- }
- return true;
- }
-}
+///*
+// * 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.download;
+//
+//import android.text.TextUtils;
+//import com.arialyy.aria.core.manager.TaskWrapperManager;
+//import com.arialyy.aria.core.queue.DownloadTaskQueue;
+//import com.arialyy.aria.orm.DbEntity;
+//import com.arialyy.aria.util.ALog;
+//import com.arialyy.aria.util.CommonUtil;
+//import java.io.File;
+//
+///**
+// * Created by Aria.Lao on 2017/7/26.
+// */
+//abstract class BaseNormalTarget
+// extends AbsDownloadTarget {
+//
+// /**
+// * 通过地址初始化target
+// */
+// void initTarget(String url, String targetName) {
+// setUrl(url);
+// setTargetName(targetName);
+// setTaskWrapper(TaskWrapperManager.getInstance().getHttpTaskWrapper(DTaskWrapper.class, url));
+// mEntity = getTaskWrapper().getEntity();
+//
+// if (mEntity != null) {
+// setTempFilePath(mEntity.getDownloadPath());
+// }
+// }
+//
+// /**
+// * 更新下载url
+// *
+// * @param newUrl 新的下载url
+// */
+// public TARGET updateUrl(String newUrl) {
+// if (TextUtils.isEmpty(newUrl)) {
+// ALog.e(TAG, "下载url更新失败,newUrl为null");
+// return (TARGET) this;
+// }
+// if (getUrl().equals(newUrl)) {
+// ALog.e(TAG, "下载url更新失败,新的下载url和旧的url一致");
+// return (TARGET) this;
+// }
+// setNewUrl(newUrl);
+// getTaskWrapper().setRefreshInfo(true);
+// return (TARGET) this;
+// }
+//
+// /**
+// * 将任务设置为最高优先级任务,最高优先级任务有以下特点:
+// * 1、在下载队列中,有且只有一个最高优先级任务
+// * 2、最高优先级任务会一直存在,直到用户手动暂停或任务完成
+// * 3、任务调度器不会暂停最高优先级任务
+// * 4、用户手动暂停或任务完成后,第二次重新执行该任务,该命令将失效
+// * 5、如果下载队列中已经满了,则会停止队尾的任务,当高优先级任务完成后,该队尾任务将自动执行
+// * 6、把任务设置为最高优先级任务后,将自动执行任务,不需要重新调用start()启动任务
+// */
+// @Override public void setHighestPriority() {
+// super.setHighestPriority();
+// }
+//
+// /**
+// * 下载任务是否存在
+// *
+// * @return {@code true}任务存在
+// */
+// @Override public boolean taskExists() {
+// return DbEntity.checkDataExist(DownloadEntity.class, "url=?", getUrl());
+// }
+//
+// /**
+// * 获取下载实体
+// */
+// public DownloadEntity getDownloadEntity() {
+// return mEntity;
+// }
+//
+// /**
+// * 是否在下载
+// *
+// * @return {@code true}任务正在下载
+// */
+// @Override public boolean isRunning() {
+// DownloadTask task = DownloadTaskQueue.getInstance().getTask(mEntity.getKey());
+// return task != null && task.isRunning();
+// }
+//
+// /**
+// * 检查下载实体,判断实体是否合法 合法标准为:
+// * 1、下载路径不为null,并且下载路径是正常的http或ftp路径
+// * 2、保存路径不为null,并且保存路径是android文件系统路径
+// * 3、保存路径不能重复
+// *
+// * @return {@code true}合法
+// */
+// @Override protected boolean checkEntity() {
+// boolean b = getTargetType() < GROUP_HTTP && checkUrl() && checkFilePath();
+// if (b) {
+// mEntity.save();
+// }
+// return b;
+// }
+//
+// /**
+// * 检查并设置普通任务的文件保存路径
+// *
+// * @return {@code true}保存路径合法
+// */
+// private boolean checkFilePath() {
+// String filePath = getTempFilePath();
+// if (TextUtils.isEmpty(filePath)) {
+// ALog.e(TAG, "下载失败,文件保存路径为null");
+// return false;
+// } else if (!filePath.startsWith("/")) {
+// ALog.e(TAG, "下载失败,文件保存路径【" + filePath + "】错误");
+// return false;
+// }
+// File file = new File(filePath);
+// if (file.isDirectory()) {
+// if (getTargetType() == HTTP) {
+// ALog.e(TAG, "下载失败,保存路径【" + filePath + "】不能为文件夹,路径需要是完整的文件路径,如:/mnt/sdcard/game.zip");
+// return false;
+// } else if (getTargetType() == FTP) {
+// filePath += mEntity.getFileName();
+// }
+// } else {
+// // http文件名设置
+// if (TextUtils.isEmpty(mEntity.getFileName())) {
+// mEntity.setFileName(file.getName());
+// }
+// }
+//
+// //设置文件保存路径,如果新文件路径和旧文件路径不同,则修改路径
+// if (!filePath.equals(mEntity.getDownloadPath())) {
+// // 检查路径冲突
+// if (DbEntity.checkDataExist(DownloadEntity.class, "downloadPath=?", filePath)) {
+// if (!isForceDownload()) {
+// ALog.e(TAG, "下载失败,保存路径【" + filePath + "】已经被其它任务占用,请设置其它保存路径");
+// return false;
+// } else {
+// ALog.w(TAG, "保存路径【" + filePath + "】已经被其它任务占用,当前任务将覆盖该路径的文件");
+// CommonUtil.delTaskRecord(filePath, 1);
+// setTaskWrapper(
+// TaskWrapperManager.getInstance().getHttpTaskWrapper(DTaskWrapper.class, getUrl()));
+// }
+// }
+// File oldFile = new File(mEntity.getDownloadPath());
+// File newFile = new File(filePath);
+// mEntity.setDownloadPath(filePath);
+// mEntity.setFileName(newFile.getName());
+// if (oldFile.exists()) {
+// oldFile.renameTo(newFile);
+// CommonUtil.modifyTaskRecord(oldFile.getPath(), newFile.getPath());
+// }
+// }
+// return true;
+// }
+//
+// /**
+// * 检查普通任务的下载地址
+// *
+// * @return {@code true}地址合法
+// */
+// private boolean checkUrl() {
+// final String url = mEntity.getUrl();
+// if (TextUtils.isEmpty(url)) {
+// ALog.e(TAG, "下载失败,url为null");
+// return false;
+// } else if (!url.startsWith("http") && !url.startsWith("ftp")) {
+// ALog.e(TAG, "下载失败,url【" + url + "】错误");
+// return false;
+// }
+// int index = url.indexOf("://");
+// if (index == -1) {
+// ALog.e(TAG, "下载失败,url【" + url + "】不合法");
+// return false;
+// }
+// if (!TextUtils.isEmpty(getNewUrl())) {
+// mEntity.setUrl(getNewUrl());
+// }
+// return true;
+// }
+//}
diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/DNormalDelegate.java b/Aria/src/main/java/com/arialyy/aria/core/download/DNormalDelegate.java
new file mode 100644
index 00000000..d9dd36cc
--- /dev/null
+++ b/Aria/src/main/java/com/arialyy/aria/core/download/DNormalDelegate.java
@@ -0,0 +1,161 @@
+/*
+ * 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.download;
+
+import android.text.TextUtils;
+import com.arialyy.aria.core.inf.ITargetHandler;
+import com.arialyy.aria.core.inf.ITargetNormal;
+import com.arialyy.aria.core.manager.TaskWrapperManager;
+import com.arialyy.aria.core.queue.DownloadTaskQueue;
+import com.arialyy.aria.orm.DbEntity;
+import com.arialyy.aria.util.ALog;
+import com.arialyy.aria.util.CommonUtil;
+import java.io.File;
+
+/**
+ * Created by AriaL on 2019/4/5.
+ * 普通下载任务通用功能处理
+ */
+class DNormalDelegate implements ITargetNormal {
+ private final String TAG = "DNormalDelegate";
+ private DownloadEntity mEntity;
+
+ private TARGET target;
+
+ DNormalDelegate(TARGET target, String url, String targetName) {
+ this.target = target;
+ initTarget(url, targetName);
+ }
+
+ @Override public void initTarget(String url, String targetName) {
+ DTaskWrapper taskWrapper = TaskWrapperManager.getInstance().getHttpTaskWrapper(DTaskWrapper.class, url);
+ mEntity = taskWrapper.getEntity();
+
+ target.setUrl(url);
+ target.setTargetName(targetName);
+ target.setTaskWrapper(taskWrapper);
+ target.setEntity(mEntity);
+ if (mEntity != null) {
+ target.setTempFilePath(mEntity.getDownloadPath());
+ }
+ }
+
+ @Override public TARGET updateUrl(String newUrl) {
+ if (TextUtils.isEmpty(newUrl)) {
+ ALog.e(TAG, "下载url更新失败,newUrl为null");
+ return target;
+ }
+ if (target.getUrl().equals(newUrl)) {
+ ALog.e(TAG, "下载url更新失败,新的下载url和旧的url一致");
+ return target;
+ }
+ target.setNewUrl(newUrl);
+ target.getTaskWrapper().setRefreshInfo(true);
+ return target;
+ }
+
+ @Override public DownloadEntity getEntity() {
+ return target.getEntity();
+ }
+
+ @Override public boolean taskExists() {
+ return DbEntity.checkDataExist(DownloadEntity.class, "url=?", target.getUrl());
+ }
+
+ @Override public boolean isRunning() {
+ DownloadTask task = DownloadTaskQueue.getInstance().getTask(mEntity.getKey());
+ return task != null && task.isRunning();
+ }
+
+ @Override public boolean checkEntity() {
+ boolean b = checkUrl() && checkFilePath();
+ if (b) {
+ mEntity.save();
+ }
+ return b;
+ }
+
+ @Override public boolean checkFilePath() {
+ String filePath = target.getTempFilePath();
+ if (TextUtils.isEmpty(filePath)) {
+ ALog.e(TAG, "下载失败,文件保存路径为null");
+ return false;
+ } else if (!filePath.startsWith("/")) {
+ ALog.e(TAG, "下载失败,文件保存路径【" + filePath + "】错误");
+ return false;
+ }
+ File file = new File(filePath);
+ if (file.isDirectory()) {
+ if (target.getTargetType() == ITargetHandler.HTTP) {
+ ALog.e(TAG, "下载失败,保存路径【" + filePath + "】不能为文件夹,路径需要是完整的文件路径,如:/mnt/sdcard/game.zip");
+ return false;
+ } else if (target.getTargetType() == ITargetHandler.FTP) {
+ filePath += mEntity.getFileName();
+ }
+ } else {
+ // http文件名设置
+ if (TextUtils.isEmpty(mEntity.getFileName())) {
+ mEntity.setFileName(file.getName());
+ }
+ }
+
+ //设置文件保存路径,如果新文件路径和旧文件路径不同,则修改路径
+ if (!filePath.equals(mEntity.getDownloadPath())) {
+ // 检查路径冲突
+ if (DbEntity.checkDataExist(DownloadEntity.class, "downloadPath=?", filePath)) {
+ if (!target.isForceDownload()) {
+ ALog.e(TAG, "下载失败,保存路径【" + filePath + "】已经被其它任务占用,请设置其它保存路径");
+ return false;
+ } else {
+ ALog.w(TAG, "保存路径【" + filePath + "】已经被其它任务占用,当前任务将覆盖该路径的文件");
+ CommonUtil.delTaskRecord(filePath, 1);
+ target.setTaskWrapper(
+ TaskWrapperManager.getInstance()
+ .getHttpTaskWrapper(DTaskWrapper.class, target.getUrl()));
+ }
+ }
+ File oldFile = new File(mEntity.getDownloadPath());
+ File newFile = new File(filePath);
+ mEntity.setDownloadPath(filePath);
+ mEntity.setFileName(newFile.getName());
+ if (oldFile.exists()) {
+ oldFile.renameTo(newFile);
+ CommonUtil.modifyTaskRecord(oldFile.getPath(), newFile.getPath());
+ }
+ }
+ return true;
+ }
+
+ @Override public boolean checkUrl() {
+ final String url = mEntity.getUrl();
+ if (TextUtils.isEmpty(url)) {
+ ALog.e(TAG, "下载失败,url为null");
+ return false;
+ } else if (!url.startsWith("http") && !url.startsWith("ftp")) {
+ ALog.e(TAG, "下载失败,url【" + url + "】错误");
+ return false;
+ }
+ int index = url.indexOf("://");
+ if (index == -1) {
+ ALog.e(TAG, "下载失败,url【" + url + "】不合法");
+ return false;
+ }
+ if (!TextUtils.isEmpty(target.getNewUrl())) {
+ mEntity.setUrl(target.getNewUrl());
+ }
+ return true;
+ }
+}
diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/DownloadGroupTarget.java b/Aria/src/main/java/com/arialyy/aria/core/download/DownloadGroupTarget.java
index 05d21afa..2bf4809c 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/download/DownloadGroupTarget.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/download/DownloadGroupTarget.java
@@ -1,337 +1,337 @@
-/*
- * 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.download;
-
-import android.support.annotation.CheckResult;
-import android.support.annotation.NonNull;
-import android.text.TextUtils;
-import com.arialyy.aria.core.common.RequestEnum;
-import com.arialyy.aria.core.common.http.HttpHeaderDelegate;
-import com.arialyy.aria.core.common.http.PostDelegate;
-import com.arialyy.aria.core.inf.IHttpHeaderDelegate;
-import com.arialyy.aria.core.manager.TaskWrapperManager;
-import com.arialyy.aria.orm.DbEntity;
-import com.arialyy.aria.util.ALog;
-import com.arialyy.aria.util.CommonUtil;
-import java.io.File;
-import java.net.Proxy;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Created by AriaL on 2017/6/29.
- * 下载任务组
- */
-public class DownloadGroupTarget extends BaseGroupTarget implements
- IHttpHeaderDelegate {
- private HttpHeaderDelegate mDelegate;
- /**
- * 子任务下载地址,
- */
- private List mUrls = new ArrayList<>();
-
- /**
- * 子任务文件名
- */
- private List mSubNameTemp = new ArrayList<>();
-
- public DownloadGroupTarget(DownloadGroupEntity groupEntity, String targetName) {
- this.mTargetName = targetName;
- if (groupEntity.getUrls() != null && !groupEntity.getUrls().isEmpty()) {
- this.mUrls.addAll(groupEntity.getUrls());
- }
- init();
- }
-
- DownloadGroupTarget(List urls, String targetName) {
- this.mTargetName = targetName;
- this.mUrls = urls;
- init();
- }
-
- private void init() {
- mGroupHash = CommonUtil.getMd5Code(mUrls);
- mTaskWrapper = TaskWrapperManager.getInstance().getDGTaskWrapper(DGTaskWrapper.class, mUrls);
- mEntity = mTaskWrapper.getEntity();
- if (mEntity != null) {
- mDirPathTemp = mEntity.getDirPath();
- }
- mDelegate = new HttpHeaderDelegate<>(this);
- }
-
- /**
- * Post处理
- */
- public PostDelegate asPost() {
- return new PostDelegate<>(this);
- }
-
- /**
- * 更新组合任务下载地址
- *
- * @param urls 新的组合任务下载地址列表
- */
- @CheckResult
- public DownloadGroupTarget updateUrls(List urls) {
- if (urls == null || urls.isEmpty()) {
- throw new NullPointerException("下载地址列表为空");
- }
- if (urls.size() != mUrls.size()) {
- throw new IllegalArgumentException("新下载地址数量和旧下载地址数量不一致");
- }
- mUrls.clear();
- mUrls.addAll(urls);
- mGroupHash = CommonUtil.getMd5Code(urls);
- mEntity.setGroupHash(mGroupHash);
- mEntity.update();
- if (mEntity.getSubEntities() != null && !mEntity.getSubEntities().isEmpty()) {
- for (DownloadEntity de : mEntity.getSubEntities()) {
- de.setGroupHash(mGroupHash);
- de.update();
- }
- }
- return this;
- }
-
- /**
- * 任务组总任务大小,任务组是一个抽象的概念,没有真实的数据实体,任务组的大小是Aria动态获取子任务大小相加而得到的,
- * 如果你知道当前任务组总大小,你也可以调用该方法给任务组设置大小
- *
- * 为了更好的用户体验,组合任务必须设置文件大小
- *
- * @param fileSize 任务组总大小
- */
- @CheckResult
- public DownloadGroupTarget setFileSize(long fileSize) {
- if (fileSize <= 0) {
- ALog.e(TAG, "文件大小不能小于 0");
- return this;
- }
- if (mEntity.getFileSize() <= 1 || mEntity.getFileSize() != fileSize) {
- mEntity.setFileSize(fileSize);
- }
- return this;
- }
-
- /**
- * 如果你是使用{@link DownloadReceiver#load(DownloadGroupEntity)}进行下载操作,那么你需要设置任务组的下载地址
- */
- @CheckResult
- public DownloadGroupTarget setGroupUrl(List urls) {
- mUrls.clear();
- mUrls.addAll(urls);
- return this;
- }
-
- /**
- * 设置子任务文件名,该方法必须在{@link #setDirPath(String)}之后调用,否则不生效
- *
- * @deprecated {@link #setSubFileName(List)} 请使用该api
- */
- @CheckResult
- @Deprecated public DownloadGroupTarget setSubTaskFileName(List subTaskFileName) {
- return setSubFileName(subTaskFileName);
- }
-
- /**
- * 设置子任务文件名,该方法必须在{@link #setDirPath(String)}之后调用,否则不生效
- */
- @CheckResult
- public DownloadGroupTarget setSubFileName(List subTaskFileName) {
- if (subTaskFileName == null || subTaskFileName.isEmpty()) {
- ALog.e(TAG, "修改子任务的文件名失败:列表为null");
- return this;
- }
- if (subTaskFileName.size() != mTaskWrapper.getSubTaskWrapper().size()) {
- ALog.e(TAG, "修改子任务的文件名失败:子任务文件名列表数量和子任务的数量不匹配");
- return this;
- }
- mSubNameTemp.clear();
- mSubNameTemp.addAll(subTaskFileName);
- return this;
- }
-
- @Override protected int getTargetType() {
- return GROUP_HTTP;
- }
-
- @Override protected boolean checkEntity() {
- if (getTargetType() == GROUP_HTTP) {
- if (!checkDirPath()) {
- return false;
- }
-
- if (!checkSubName()) {
- return false;
- }
-
- if (!checkUrls()) {
- return false;
- }
-
- if (mTaskWrapper.getEntity().getFileSize() == 0) {
- ALog.e(TAG, "组合任务必须设置文件文件大小");
- return false;
- }
-
- if (mTaskWrapper.asHttp().getRequestEnum() == RequestEnum.POST) {
- for (DTaskWrapper subTask : mTaskWrapper.getSubTaskWrapper()) {
- subTask.asHttp().setRequestEnum(RequestEnum.POST);
- }
- }
-
- mEntity.save();
-
- if (needModifyPath) {
- reChangeDirPath(mDirPathTemp);
- }
-
- if (!mSubNameTemp.isEmpty()) {
- updateSingleSubFileName();
- }
- return true;
- }
- return false;
- }
-
- /**
- * 更新所有改动的子任务文件名
- */
- private void updateSingleSubFileName() {
- List entities = mTaskWrapper.getSubTaskWrapper();
- int i = 0;
- for (DTaskWrapper entity : entities) {
- if (i < mSubNameTemp.size()) {
- String newName = mSubNameTemp.get(i);
- updateSingleSubFileName(entity, newName);
- }
- i++;
- }
- }
-
- /**
- * 检查urls是否合法,并删除不合法的子任务
- *
- * @return {@code true} 合法
- */
- private boolean checkUrls() {
- if (mUrls.isEmpty()) {
- ALog.e(TAG, "下载失败,子任务下载列表为null");
- return false;
- }
- Set delItem = new HashSet<>();
-
- int i = 0;
- for (String url : mUrls) {
- if (TextUtils.isEmpty(url)) {
- ALog.e(TAG, "子任务url为null,即将删除该子任务。");
- delItem.add(i);
- continue;
- } else if (!url.startsWith("http")) {
- //} else if (!url.startsWith("http") && !url.startsWith("ftp")) {
- ALog.e(TAG, "子任务url【" + url + "】错误,即将删除该子任务。");
- delItem.add(i);
- continue;
- }
- int index = url.indexOf("://");
- if (index == -1) {
- ALog.e(TAG, "子任务url【" + url + "】不合法,即将删除该子任务。");
- delItem.add(i);
- continue;
- }
-
- i++;
- }
-
- for (int index : delItem) {
- mUrls.remove(index);
- if (mSubNameTemp != null && !mSubNameTemp.isEmpty()) {
- mSubNameTemp.remove(index);
- }
- }
-
- mEntity.setGroupHash(CommonUtil.getMd5Code(mUrls));
-
- return true;
- }
-
- /**
- * 更新单个子任务文件名
- */
- private void updateSingleSubFileName(DTaskWrapper taskEntity, String newName) {
- DownloadEntity entity = taskEntity.getEntity();
- if (!newName.equals(entity.getFileName())) {
- String oldPath = mEntity.getDirPath() + "/" + entity.getFileName();
- String newPath = mEntity.getDirPath() + "/" + newName;
- if (DbEntity.checkDataExist(DownloadEntity.class, "downloadPath=? or isComplete='true'",
- newPath)) {
- ALog.w(TAG, String.format("更新文件名失败,路径【%s】已存在或文件已下载", newPath));
- return;
- }
-
- File oldFile = new File(oldPath);
- if (oldFile.exists()) {
- oldFile.renameTo(new File(newPath));
- }
-
- CommonUtil.modifyTaskRecord(oldFile.getPath(), newPath);
- entity.setDownloadPath(newPath);
- entity.setFileName(newName);
- entity.update();
- }
- }
-
- /**
- * 如果用户设置了子任务文件名,检查子任务文件名
- *
- * @return {@code true} 合法
- */
- private boolean checkSubName() {
- if (mSubNameTemp == null || mSubNameTemp.isEmpty()) {
- return true;
- }
- if (mUrls.size() != mSubNameTemp.size()) {
- ALog.e(TAG, "子任务文件名必须和子任务数量一致");
- return false;
- }
-
- return true;
- }
-
- @CheckResult
- @Override public DownloadGroupTarget addHeader(@NonNull String key, @NonNull String value) {
- for (DTaskWrapper subTask : mTaskWrapper.getSubTaskWrapper()) {
- mDelegate.addHeader(subTask, key, value);
- }
- return mDelegate.addHeader(key, value);
- }
-
- @CheckResult
- @Override public DownloadGroupTarget addHeaders(Map headers) {
- for (DTaskWrapper subTask : mTaskWrapper.getSubTaskWrapper()) {
- mDelegate.addHeaders(subTask, headers);
- }
- return mDelegate.addHeaders(headers);
- }
-
- @CheckResult
- @Override public DownloadGroupTarget setUrlProxy(Proxy proxy) {
- return mDelegate.setUrlProxy(proxy);
- }
-}
+/*
+ * 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.download;
+
+import android.support.annotation.CheckResult;
+import android.support.annotation.NonNull;
+import android.text.TextUtils;
+import com.arialyy.aria.core.common.RequestEnum;
+import com.arialyy.aria.core.common.http.HttpHeaderDelegate;
+import com.arialyy.aria.core.common.http.PostDelegate;
+import com.arialyy.aria.core.inf.IHttpHeaderDelegate;
+import com.arialyy.aria.core.manager.TaskWrapperManager;
+import com.arialyy.aria.orm.DbEntity;
+import com.arialyy.aria.util.ALog;
+import com.arialyy.aria.util.CommonUtil;
+import java.io.File;
+import java.net.Proxy;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Created by AriaL on 2017/6/29.
+ * 下载任务组
+ */
+public class DownloadGroupTarget extends BaseGroupTarget implements
+ IHttpHeaderDelegate {
+ private HttpHeaderDelegate mDelegate;
+ /**
+ * 子任务下载地址,
+ */
+ private List mUrls = new ArrayList<>();
+
+ /**
+ * 子任务文件名
+ */
+ private List mSubNameTemp = new ArrayList<>();
+
+ public DownloadGroupTarget(DownloadGroupEntity groupEntity, String targetName) {
+ setTargetName(targetName);
+ if (groupEntity.getUrls() != null && !groupEntity.getUrls().isEmpty()) {
+ this.mUrls.addAll(groupEntity.getUrls());
+ }
+ init();
+ }
+
+ DownloadGroupTarget(List urls, String targetName) {
+ setTargetName(targetName);
+ this.mUrls = urls;
+ init();
+ }
+
+ private void init() {
+ mGroupHash = CommonUtil.getMd5Code(mUrls);
+ setTaskWrapper(TaskWrapperManager.getInstance().getDGTaskWrapper(DGTaskWrapper.class, mUrls));
+ mEntity = getEntity();
+ if (mEntity != null) {
+ mDirPathTemp = mEntity.getDirPath();
+ }
+ mDelegate = new HttpHeaderDelegate<>(this);
+ }
+
+ /**
+ * Post处理
+ */
+ public PostDelegate asPost() {
+ return new PostDelegate<>(this);
+ }
+
+ /**
+ * 更新组合任务下载地址
+ *
+ * @param urls 新的组合任务下载地址列表
+ */
+ @CheckResult
+ public DownloadGroupTarget updateUrls(List urls) {
+ if (urls == null || urls.isEmpty()) {
+ throw new NullPointerException("下载地址列表为空");
+ }
+ if (urls.size() != mUrls.size()) {
+ throw new IllegalArgumentException("新下载地址数量和旧下载地址数量不一致");
+ }
+ mUrls.clear();
+ mUrls.addAll(urls);
+ mGroupHash = CommonUtil.getMd5Code(urls);
+ mEntity.setGroupHash(mGroupHash);
+ mEntity.update();
+ if (mEntity.getSubEntities() != null && !mEntity.getSubEntities().isEmpty()) {
+ for (DownloadEntity de : mEntity.getSubEntities()) {
+ de.setGroupHash(mGroupHash);
+ de.update();
+ }
+ }
+ return this;
+ }
+
+ /**
+ * 任务组总任务大小,任务组是一个抽象的概念,没有真实的数据实体,任务组的大小是Aria动态获取子任务大小相加而得到的,
+ * 如果你知道当前任务组总大小,你也可以调用该方法给任务组设置大小
+ *
+ * 为了更好的用户体验,组合任务必须设置文件大小
+ *
+ * @param fileSize 任务组总大小
+ */
+ @CheckResult
+ public DownloadGroupTarget setFileSize(long fileSize) {
+ if (fileSize <= 0) {
+ ALog.e(TAG, "文件大小不能小于 0");
+ return this;
+ }
+ if (mEntity.getFileSize() <= 1 || mEntity.getFileSize() != fileSize) {
+ mEntity.setFileSize(fileSize);
+ }
+ return this;
+ }
+
+ /**
+ * 如果你是使用{@link DownloadReceiver#load(DownloadGroupEntity)}进行下载操作,那么你需要设置任务组的下载地址
+ */
+ @CheckResult
+ public DownloadGroupTarget setGroupUrl(List urls) {
+ mUrls.clear();
+ mUrls.addAll(urls);
+ return this;
+ }
+
+ /**
+ * 设置子任务文件名,该方法必须在{@link #setDirPath(String)}之后调用,否则不生效
+ *
+ * @deprecated {@link #setSubFileName(List)} 请使用该api
+ */
+ @CheckResult
+ @Deprecated public DownloadGroupTarget setSubTaskFileName(List subTaskFileName) {
+ return setSubFileName(subTaskFileName);
+ }
+
+ /**
+ * 设置子任务文件名,该方法必须在{@link #setDirPath(String)}之后调用,否则不生效
+ */
+ @CheckResult
+ public DownloadGroupTarget setSubFileName(List subTaskFileName) {
+ if (subTaskFileName == null || subTaskFileName.isEmpty()) {
+ ALog.e(TAG, "修改子任务的文件名失败:列表为null");
+ return this;
+ }
+ if (subTaskFileName.size() != getTaskWrapper().getSubTaskWrapper().size()) {
+ ALog.e(TAG, "修改子任务的文件名失败:子任务文件名列表数量和子任务的数量不匹配");
+ return this;
+ }
+ mSubNameTemp.clear();
+ mSubNameTemp.addAll(subTaskFileName);
+ return this;
+ }
+
+ @Override public int getTargetType() {
+ return GROUP_HTTP;
+ }
+
+ @Override protected boolean checkEntity() {
+ if (getTargetType() == GROUP_HTTP) {
+ if (!checkDirPath()) {
+ return false;
+ }
+
+ if (!checkSubName()) {
+ return false;
+ }
+
+ if (!checkUrls()) {
+ return false;
+ }
+
+ if (getTaskWrapper().getEntity().getFileSize() == 0) {
+ ALog.e(TAG, "组合任务必须设置文件文件大小");
+ return false;
+ }
+
+ if (getTaskWrapper().asHttp().getRequestEnum() == RequestEnum.POST) {
+ for (DTaskWrapper subTask : getTaskWrapper().getSubTaskWrapper()) {
+ subTask.asHttp().setRequestEnum(RequestEnum.POST);
+ }
+ }
+
+ mEntity.save();
+
+ if (needModifyPath) {
+ reChangeDirPath(mDirPathTemp);
+ }
+
+ if (!mSubNameTemp.isEmpty()) {
+ updateSingleSubFileName();
+ }
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * 更新所有改动的子任务文件名
+ */
+ private void updateSingleSubFileName() {
+ List entities = getTaskWrapper().getSubTaskWrapper();
+ int i = 0;
+ for (DTaskWrapper entity : entities) {
+ if (i < mSubNameTemp.size()) {
+ String newName = mSubNameTemp.get(i);
+ updateSingleSubFileName(entity, newName);
+ }
+ i++;
+ }
+ }
+
+ /**
+ * 检查urls是否合法,并删除不合法的子任务
+ *
+ * @return {@code true} 合法
+ */
+ private boolean checkUrls() {
+ if (mUrls.isEmpty()) {
+ ALog.e(TAG, "下载失败,子任务下载列表为null");
+ return false;
+ }
+ Set delItem = new HashSet<>();
+
+ int i = 0;
+ for (String url : mUrls) {
+ if (TextUtils.isEmpty(url)) {
+ ALog.e(TAG, "子任务url为null,即将删除该子任务。");
+ delItem.add(i);
+ continue;
+ } else if (!url.startsWith("http")) {
+ //} else if (!url.startsWith("http") && !url.startsWith("ftp")) {
+ ALog.e(TAG, "子任务url【" + url + "】错误,即将删除该子任务。");
+ delItem.add(i);
+ continue;
+ }
+ int index = url.indexOf("://");
+ if (index == -1) {
+ ALog.e(TAG, "子任务url【" + url + "】不合法,即将删除该子任务。");
+ delItem.add(i);
+ continue;
+ }
+
+ i++;
+ }
+
+ for (int index : delItem) {
+ mUrls.remove(index);
+ if (mSubNameTemp != null && !mSubNameTemp.isEmpty()) {
+ mSubNameTemp.remove(index);
+ }
+ }
+
+ mEntity.setGroupHash(CommonUtil.getMd5Code(mUrls));
+
+ return true;
+ }
+
+ /**
+ * 更新单个子任务文件名
+ */
+ private void updateSingleSubFileName(DTaskWrapper taskEntity, String newName) {
+ DownloadEntity entity = taskEntity.getEntity();
+ if (!newName.equals(entity.getFileName())) {
+ String oldPath = mEntity.getDirPath() + "/" + entity.getFileName();
+ String newPath = mEntity.getDirPath() + "/" + newName;
+ if (DbEntity.checkDataExist(DownloadEntity.class, "downloadPath=? or isComplete='true'",
+ newPath)) {
+ ALog.w(TAG, String.format("更新文件名失败,路径【%s】已存在或文件已下载", newPath));
+ return;
+ }
+
+ File oldFile = new File(oldPath);
+ if (oldFile.exists()) {
+ oldFile.renameTo(new File(newPath));
+ }
+
+ CommonUtil.modifyTaskRecord(oldFile.getPath(), newPath);
+ entity.setDownloadPath(newPath);
+ entity.setFileName(newName);
+ entity.update();
+ }
+ }
+
+ /**
+ * 如果用户设置了子任务文件名,检查子任务文件名
+ *
+ * @return {@code true} 合法
+ */
+ private boolean checkSubName() {
+ if (mSubNameTemp == null || mSubNameTemp.isEmpty()) {
+ return true;
+ }
+ if (mUrls.size() != mSubNameTemp.size()) {
+ ALog.e(TAG, "子任务文件名必须和子任务数量一致");
+ return false;
+ }
+
+ return true;
+ }
+
+ @CheckResult
+ @Override public DownloadGroupTarget addHeader(@NonNull String key, @NonNull String value) {
+ for (DTaskWrapper subTask : getTaskWrapper().getSubTaskWrapper()) {
+ mDelegate.addHeader(subTask, key, value);
+ }
+ return mDelegate.addHeader(key, value);
+ }
+
+ @CheckResult
+ @Override public DownloadGroupTarget addHeaders(Map headers) {
+ for (DTaskWrapper subTask : getTaskWrapper().getSubTaskWrapper()) {
+ mDelegate.addHeaders(subTask, headers);
+ }
+ return mDelegate.addHeaders(headers);
+ }
+
+ @CheckResult
+ @Override public DownloadGroupTarget setUrlProxy(Proxy proxy) {
+ return mDelegate.setUrlProxy(proxy);
+ }
+}
diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/DownloadTarget.java b/Aria/src/main/java/com/arialyy/aria/core/download/DownloadTarget.java
index 386f7f63..68266865 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/download/DownloadTarget.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/download/DownloadTarget.java
@@ -1,143 +1,159 @@
-/*
- * 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.download;
-
-import android.support.annotation.CheckResult;
-import android.support.annotation.NonNull;
-import com.arialyy.aria.core.common.http.GetDelegate;
-import com.arialyy.aria.core.common.http.HttpHeaderDelegate;
-import com.arialyy.aria.core.common.http.PostDelegate;
-import com.arialyy.aria.core.inf.IHttpHeaderDelegate;
-import java.net.Proxy;
-import java.util.Map;
-
-/**
- * Created by lyy on 2016/12/5.
- * https://github.com/AriaLyy/Aria
- */
-public class DownloadTarget extends BaseNormalTarget
- implements IHttpHeaderDelegate {
- private HttpHeaderDelegate mHeaderDelegate;
-
- DownloadTarget(DownloadEntity entity, String targetName) {
- this(entity.getUrl(), targetName);
- }
-
- DownloadTarget(String url, String targetName) {
- initTarget(url, targetName);
- mHeaderDelegate = new HttpHeaderDelegate<>(this);
- }
-
- /**
- * Post处理
- */
- @CheckResult
- public PostDelegate asPost() {
- return new PostDelegate<>(this);
- }
-
- /**
- * get参数传递
- */
- @CheckResult
- public GetDelegate asGet(){
- return new GetDelegate<>(this);
- }
-
- /**
- * 是否使用服务器通过content-disposition传递的文件名,内容格式{@code attachment;filename=***}
- * 如果获取不到服务器文件名,则使用用户设置的文件名
- *
- * @param use {@code true} 使用
- */
- @CheckResult
- public DownloadTarget useServerFileName(boolean use) {
- mTaskWrapper.asHttp().setUseServerFileName(use);
- return this;
- }
-
- /**
- * 设置文件存储路径
- * 该api后续版本会删除
- *
- * @param downloadPath 文件保存路径
- * @deprecated {@link #setFilePath(String)} 请使用这个api
- */
- @CheckResult
- @Deprecated public DownloadTarget setDownloadPath(@NonNull String downloadPath) {
- return setFilePath(downloadPath);
- }
-
- /**
- * 设置文件存储路径,如果需要修改新的文件名,修改路径便可。
- * 如:原文件路径 /mnt/sdcard/test.zip
- * 如果需要将test.zip改为game.zip,只需要重新设置文件路径为:/mnt/sdcard/game.zip
- *
- * @param filePath 路径必须为文件路径,不能为文件夹路径
- */
- @CheckResult
- public DownloadTarget setFilePath(@NonNull String filePath) {
- mTempFilePath = filePath;
- return this;
- }
-
- /**
- * 设置文件存储路径,如果需要修改新的文件名,修改路径便可。
- * 如:原文件路径 /mnt/sdcard/test.zip
- * 如果需要将test.zip改为game.zip,只需要重新设置文件路径为:/mnt/sdcard/game.zip
- *
- * @param filePath 路径必须为文件路径,不能为文件夹路径
- * @param forceDownload {@code true}强制下载,不考虑未见路径是否被占用
- */
- @CheckResult
- public DownloadTarget setFilePath(@NonNull String filePath, boolean forceDownload) {
- mTempFilePath = filePath;
- this.forceDownload = forceDownload;
- return this;
- }
-
- /**
- * 从header中获取文件描述信息
- */
- public String getContentDisposition() {
- return mEntity.getDisposition();
- }
-
- @Override protected int getTargetType() {
- return HTTP;
- }
-
- /**
- * 设置URL的代理
- *
- * @param proxy {@link Proxy}
- */
- @CheckResult
- @Override public DownloadTarget setUrlProxy(Proxy proxy) {
- return mHeaderDelegate.setUrlProxy(proxy);
- }
-
- @CheckResult
- @Override public DownloadTarget addHeader(@NonNull String key, @NonNull String value) {
- return mHeaderDelegate.addHeader(key, value);
- }
-
- @CheckResult
- @Override public DownloadTarget addHeaders(Map headers) {
- return mHeaderDelegate.addHeaders(headers);
- }
-
-}
+/*
+ * 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.download;
+
+import android.support.annotation.CheckResult;
+import android.support.annotation.NonNull;
+import com.arialyy.aria.core.common.http.GetDelegate;
+import com.arialyy.aria.core.common.http.HttpHeaderDelegate;
+import com.arialyy.aria.core.common.http.PostDelegate;
+import com.arialyy.aria.core.inf.IHttpHeaderDelegate;
+import java.net.Proxy;
+import java.util.Map;
+
+/**
+ * Created by lyy on 2016/12/5.
+ * https://github.com/AriaLyy/Aria
+ */
+public class DownloadTarget extends AbsDownloadTarget
+ implements IHttpHeaderDelegate {
+ private HttpHeaderDelegate mHeaderDelegate;
+ private DNormalDelegate mNormalDelegate;
+
+ DownloadTarget(DownloadEntity entity, String targetName) {
+ this(entity.getUrl(), targetName);
+ }
+
+ DownloadTarget(String url, String targetName) {
+ mNormalDelegate = new DNormalDelegate<>(this, url, targetName);
+ mHeaderDelegate = new HttpHeaderDelegate<>(this);
+ }
+
+ /**
+ * Post处理
+ */
+ @CheckResult
+ public PostDelegate asPost() {
+ return new PostDelegate<>(this);
+ }
+
+ /**
+ * get参数传递
+ */
+ @CheckResult
+ public GetDelegate asGet() {
+ return new GetDelegate<>(this);
+ }
+
+ /**
+ * 是否使用服务器通过content-disposition传递的文件名,内容格式{@code attachment;filename=***}
+ * 如果获取不到服务器文件名,则使用用户设置的文件名
+ *
+ * @param use {@code true} 使用
+ */
+ @CheckResult
+ public DownloadTarget useServerFileName(boolean use) {
+ getTaskWrapper().asHttp().setUseServerFileName(use);
+ return this;
+ }
+
+ /**
+ * 设置文件存储路径
+ * 该api后续版本会删除
+ *
+ * @param downloadPath 文件保存路径
+ * @deprecated {@link #setFilePath(String)} 请使用这个api
+ */
+ @CheckResult
+ @Deprecated public DownloadTarget setDownloadPath(@NonNull String downloadPath) {
+ return setFilePath(downloadPath);
+ }
+
+ /**
+ * 设置文件存储路径,如果需要修改新的文件名,修改路径便可。
+ * 如:原文件路径 /mnt/sdcard/test.zip
+ * 如果需要将test.zip改为game.zip,只需要重新设置文件路径为:/mnt/sdcard/game.zip
+ *
+ * @param filePath 路径必须为文件路径,不能为文件夹路径
+ */
+ @CheckResult
+ public DownloadTarget setFilePath(@NonNull String filePath) {
+ setTempFilePath(filePath);
+ return this;
+ }
+
+ /**
+ * 设置文件存储路径,如果需要修改新的文件名,修改路径便可。
+ * 如:原文件路径 /mnt/sdcard/test.zip
+ * 如果需要将test.zip改为game.zip,只需要重新设置文件路径为:/mnt/sdcard/game.zip
+ *
+ * @param filePath 路径必须为文件路径,不能为文件夹路径
+ * @param forceDownload {@code true}强制下载,不考虑文件路径是否被占用
+ */
+ @CheckResult
+ public DownloadTarget setFilePath(@NonNull String filePath, boolean forceDownload) {
+ setTempFilePath(filePath);
+ setForceDownload(forceDownload);
+ return this;
+ }
+
+ /**
+ * 从header中获取文件描述信息
+ */
+ public String getContentDisposition() {
+ return mEntity.getDisposition();
+ }
+
+ @Override public DownloadTarget updateUrl(String newUrl) {
+ return mNormalDelegate.updateUrl(newUrl);
+ }
+
+ @Override public int getTargetType() {
+ return HTTP;
+ }
+
+ /**
+ * 设置URL的代理
+ *
+ * @param proxy {@link Proxy}
+ */
+ @CheckResult
+ @Override public DownloadTarget setUrlProxy(Proxy proxy) {
+ return mHeaderDelegate.setUrlProxy(proxy);
+ }
+
+ @CheckResult
+ @Override public DownloadTarget addHeader(@NonNull String key, @NonNull String value) {
+ return mHeaderDelegate.addHeader(key, value);
+ }
+
+ @CheckResult
+ @Override public DownloadTarget addHeaders(Map headers) {
+ return mHeaderDelegate.addHeaders(headers);
+ }
+
+ @Override protected boolean checkEntity() {
+ return mNormalDelegate.checkEntity();
+ }
+
+ @Override public boolean isRunning() {
+ return mNormalDelegate.isRunning();
+ }
+
+ @Override public boolean taskExists() {
+ return mNormalDelegate.taskExists();
+ }
+}
diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/FtpDirDownloadTarget.java b/Aria/src/main/java/com/arialyy/aria/core/download/FtpDirDownloadTarget.java
index e44d3a2b..41be403c 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/download/FtpDirDownloadTarget.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/download/FtpDirDownloadTarget.java
@@ -1,145 +1,145 @@
-/*
- * 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.download;
-
-import android.support.annotation.CheckResult;
-import android.text.TextUtils;
-import com.arialyy.aria.core.FtpUrlEntity;
-import com.arialyy.aria.core.common.ftp.FTPSDelegate;
-import com.arialyy.aria.core.common.ftp.FtpDelegate;
-import com.arialyy.aria.core.inf.AbsTaskWrapper;
-import com.arialyy.aria.core.inf.IFtpTarget;
-import com.arialyy.aria.core.manager.TaskWrapperManager;
-import com.arialyy.aria.util.ALog;
-import java.net.Proxy;
-
-/**
- * Created by Aria.Lao on 2017/7/26.
- * ftp文件夹下载
- */
-public class FtpDirDownloadTarget extends BaseGroupTarget
- implements IFtpTarget {
- private FtpDelegate mDelegate;
-
- FtpDirDownloadTarget(String url, String targetName) {
- mTargetName = targetName;
- init(url);
- }
-
- private void init(String key) {
- mGroupHash = key;
- mTaskWrapper = TaskWrapperManager.getInstance().getFtpTaskWrapper(DGTaskWrapper.class, key);
- mTaskWrapper.setRequestType(AbsTaskWrapper.D_FTP_DIR);
- mEntity = mTaskWrapper.getEntity();
- if (mEntity != null) {
- mDirPathTemp = mEntity.getDirPath();
- }
- mDelegate = new FtpDelegate<>(this);
- }
-
- @Override protected int getTargetType() {
- return GROUP_FTP_DIR;
- }
-
- @Override protected boolean checkEntity() {
- boolean b = getTargetType() == GROUP_FTP_DIR && checkDirPath() && checkUrl();
- if (b) {
- mEntity.save();
- if (mTaskWrapper.getSubTaskWrapper() != null) {
- //初始化子项的登录信息
- FtpUrlEntity tUrlEntity = mTaskWrapper.asFtp().getUrlEntity();
- for (DTaskWrapper wrapper : mTaskWrapper.getSubTaskWrapper()) {
- FtpUrlEntity urlEntity = wrapper.asFtp().getUrlEntity();
- urlEntity.needLogin = tUrlEntity.needLogin;
- urlEntity.account = tUrlEntity.account;
- urlEntity.user = tUrlEntity.user;
- urlEntity.password = tUrlEntity.password;
- // 处理ftps详细
- if (tUrlEntity.isFtps) {
- urlEntity.isFtps = true;
- urlEntity.protocol = tUrlEntity.protocol;
- urlEntity.storePath = tUrlEntity.storePath;
- urlEntity.storePass = tUrlEntity.storePass;
- urlEntity.keyAlias = tUrlEntity.keyAlias;
- }
- }
- }
- }
- if (mTaskWrapper.asFtp().getUrlEntity().isFtps) {
- if (TextUtils.isEmpty(mTaskWrapper.asFtp().getUrlEntity().storePath)) {
- ALog.e(TAG, "证书路径为空");
- return false;
- }
- if (TextUtils.isEmpty(mTaskWrapper.asFtp().getUrlEntity().keyAlias)) {
- ALog.e(TAG, "证书别名为空");
- return false;
- }
- }
- return b;
- }
-
- /**
- * 检查普通任务的下载地址
- *
- * @return {@code true}地址合法
- */
- private boolean checkUrl() {
- final String url = mGroupHash;
- if (TextUtils.isEmpty(url)) {
- ALog.e(TAG, "下载失败,url为null");
- return false;
- } else if (!url.startsWith("ftp")) {
- ALog.e(TAG, "下载失败,url【" + url + "】错误");
- return false;
- }
- int index = url.indexOf("://");
- if (index == -1) {
- ALog.e(TAG, "下载失败,url【" + url + "】不合法");
- return false;
- }
- return true;
- }
-
- /**
- * 是否是FTPS协议
- * 如果是FTPS协议,需要使用{@link FTPSDelegate#setStorePath(String)} 、{@link FTPSDelegate#setAlias(String)}
- * 设置证书信息
- */
- @CheckResult
- public FTPSDelegate asFtps() {
- mTaskWrapper.asFtp().getUrlEntity().isFtps = true;
- return new FTPSDelegate<>(this);
- }
-
- @CheckResult
- @Override public FtpDirDownloadTarget charSet(String charSet) {
- return mDelegate.charSet(charSet);
- }
-
- @CheckResult
- @Override public FtpDirDownloadTarget login(String userName, String password) {
- return mDelegate.login(userName, password);
- }
-
- @CheckResult
- @Override public FtpDirDownloadTarget login(String userName, String password, String account) {
- return mDelegate.login(userName, password, account);
- }
-
- @Override public FtpDirDownloadTarget setProxy(Proxy proxy) {
- return mDelegate.setProxy(proxy);
- }
-}
+/*
+ * 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.download;
+
+import android.support.annotation.CheckResult;
+import android.text.TextUtils;
+import com.arialyy.aria.core.FtpUrlEntity;
+import com.arialyy.aria.core.common.ftp.FTPSDelegate;
+import com.arialyy.aria.core.common.ftp.FtpDelegate;
+import com.arialyy.aria.core.inf.AbsTaskWrapper;
+import com.arialyy.aria.core.inf.IFtpTarget;
+import com.arialyy.aria.core.manager.TaskWrapperManager;
+import com.arialyy.aria.util.ALog;
+import java.net.Proxy;
+
+/**
+ * Created by Aria.Lao on 2017/7/26.
+ * ftp文件夹下载
+ */
+public class FtpDirDownloadTarget extends BaseGroupTarget
+ implements IFtpTarget {
+ private FtpDelegate mDelegate;
+
+ FtpDirDownloadTarget(String url, String targetName) {
+ setTargetName(targetName);
+ init(url);
+ }
+
+ private void init(String key) {
+ mGroupHash = key;
+ setTaskWrapper(TaskWrapperManager.getInstance().getFtpTaskWrapper(DGTaskWrapper.class, key));
+ getTaskWrapper().setRequestType(AbsTaskWrapper.D_FTP_DIR);
+ mEntity = getEntity();
+ if (mEntity != null) {
+ mDirPathTemp = mEntity.getDirPath();
+ }
+ mDelegate = new FtpDelegate<>(this);
+ }
+
+ @Override public int getTargetType() {
+ return GROUP_FTP_DIR;
+ }
+
+ @Override protected boolean checkEntity() {
+ boolean b = getTargetType() == GROUP_FTP_DIR && checkDirPath() && checkUrl();
+ if (b) {
+ mEntity.save();
+ if (getTaskWrapper().getSubTaskWrapper() != null) {
+ //初始化子项的登录信息
+ FtpUrlEntity tUrlEntity = getTaskWrapper().asFtp().getUrlEntity();
+ for (DTaskWrapper wrapper : getTaskWrapper().getSubTaskWrapper()) {
+ FtpUrlEntity urlEntity = wrapper.asFtp().getUrlEntity();
+ urlEntity.needLogin = tUrlEntity.needLogin;
+ urlEntity.account = tUrlEntity.account;
+ urlEntity.user = tUrlEntity.user;
+ urlEntity.password = tUrlEntity.password;
+ // 处理ftps详细
+ if (tUrlEntity.isFtps) {
+ urlEntity.isFtps = true;
+ urlEntity.protocol = tUrlEntity.protocol;
+ urlEntity.storePath = tUrlEntity.storePath;
+ urlEntity.storePass = tUrlEntity.storePass;
+ urlEntity.keyAlias = tUrlEntity.keyAlias;
+ }
+ }
+ }
+ }
+ if (getTaskWrapper().asFtp().getUrlEntity().isFtps) {
+ if (TextUtils.isEmpty(getTaskWrapper().asFtp().getUrlEntity().storePath)) {
+ ALog.e(TAG, "证书路径为空");
+ return false;
+ }
+ if (TextUtils.isEmpty(getTaskWrapper().asFtp().getUrlEntity().keyAlias)) {
+ ALog.e(TAG, "证书别名为空");
+ return false;
+ }
+ }
+ return b;
+ }
+
+ /**
+ * 检查普通任务的下载地址
+ *
+ * @return {@code true}地址合法
+ */
+ private boolean checkUrl() {
+ final String url = mGroupHash;
+ if (TextUtils.isEmpty(url)) {
+ ALog.e(TAG, "下载失败,url为null");
+ return false;
+ } else if (!url.startsWith("ftp")) {
+ ALog.e(TAG, "下载失败,url【" + url + "】错误");
+ return false;
+ }
+ int index = url.indexOf("://");
+ if (index == -1) {
+ ALog.e(TAG, "下载失败,url【" + url + "】不合法");
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * 是否是FTPS协议
+ * 如果是FTPS协议,需要使用{@link FTPSDelegate#setStorePath(String)} 、{@link FTPSDelegate#setAlias(String)}
+ * 设置证书信息
+ */
+ @CheckResult
+ public FTPSDelegate asFtps() {
+ getTaskWrapper().asFtp().getUrlEntity().isFtps = true;
+ return new FTPSDelegate<>(this);
+ }
+
+ @CheckResult
+ @Override public FtpDirDownloadTarget charSet(String charSet) {
+ return mDelegate.charSet(charSet);
+ }
+
+ @CheckResult
+ @Override public FtpDirDownloadTarget login(String userName, String password) {
+ return mDelegate.login(userName, password);
+ }
+
+ @CheckResult
+ @Override public FtpDirDownloadTarget login(String userName, String password, String account) {
+ return mDelegate.login(userName, password, account);
+ }
+
+ @Override public FtpDirDownloadTarget setProxy(Proxy proxy) {
+ return mDelegate.setProxy(proxy);
+ }
+}
diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/FtpDownloadTarget.java b/Aria/src/main/java/com/arialyy/aria/core/download/FtpDownloadTarget.java
index 14b3e4d6..3ba5a82e 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/download/FtpDownloadTarget.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/download/FtpDownloadTarget.java
@@ -1,127 +1,155 @@
-/*
- * 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.download;
-
-import android.support.annotation.CheckResult;
-import android.support.annotation.NonNull;
-import android.text.TextUtils;
-import com.arialyy.aria.core.common.ftp.FTPSDelegate;
-import com.arialyy.aria.core.common.ftp.FtpDelegate;
-import com.arialyy.aria.core.inf.AbsTaskWrapper;
-import com.arialyy.aria.core.inf.IFtpTarget;
-import com.arialyy.aria.util.ALog;
-import com.arialyy.aria.util.CommonUtil;
-import java.net.Proxy;
-
-/**
- * Created by lyy on 2016/12/5.
- * https://github.com/AriaLyy/Aria
- */
-public class FtpDownloadTarget extends BaseNormalTarget
- implements IFtpTarget {
- private FtpDelegate mDelegate;
-
- public FtpDownloadTarget(DownloadEntity entity, String targetName) {
- this(entity.getUrl(), targetName);
- }
-
- FtpDownloadTarget(String url, String targetName) {
- initTarget(url, targetName);
- init();
- }
-
- private void init() {
- int lastIndex = url.lastIndexOf("/");
- mEntity.setFileName(url.substring(lastIndex + 1));
- mTaskWrapper.asFtp().setUrlEntity(CommonUtil.getFtpUrlInfo(url));
- mTaskWrapper.setRequestType(AbsTaskWrapper.D_FTP);
-
- mDelegate = new FtpDelegate<>(this);
- }
-
- /**
- * 是否是FTPS协议
- * 如果是FTPS协议,需要使用{@link FTPSDelegate#setStorePath(String)} 、{@link FTPSDelegate#setAlias(String)}
- * 设置证书信息
- */
- @CheckResult
- public FTPSDelegate asFtps() {
- mTaskWrapper.asFtp().getUrlEntity().isFtps = true;
- return new FTPSDelegate<>(this);
- }
-
- @Override protected boolean checkEntity() {
- if (mTaskWrapper.asFtp().getUrlEntity().isFtps){
- if (TextUtils.isEmpty(mTaskWrapper.asFtp().getUrlEntity().storePath)){
- ALog.e(TAG, "证书路径为空");
- return false;
- }
- if (TextUtils.isEmpty(mTaskWrapper.asFtp().getUrlEntity().keyAlias)){
- ALog.e(TAG, "证书别名为空");
- return false;
- }
- }
- return super.checkEntity();
- }
-
- /**
- * 设置文件保存文件夹路径
- *
- * @param filePath 文件保存路径
- * @deprecated {@link #setFilePath(String)} 请使用这个api
- */
- @Deprecated
- @CheckResult
- public FtpDownloadTarget setDownloadPath(@NonNull String filePath) {
- return setFilePath(filePath);
- }
-
- /**
- * 设置文件保存文件夹路径
- * 关于文件名:
- * 1、如果保存路径是该文件的保存路径,如:/mnt/sdcard/file.zip,则使用路径中的文件名file.zip
- * 2、如果保存路径是文件夹路径,如:/mnt/sdcard/,则使用FTP服务器该文件的文件名
- */
- @CheckResult
- public FtpDownloadTarget setFilePath(@NonNull String filePath) {
- mTempFilePath = filePath;
- return this;
- }
-
- @Override protected int getTargetType() {
- return FTP;
- }
-
- @CheckResult
- @Override public FtpDownloadTarget charSet(String charSet) {
- return mDelegate.charSet(charSet);
- }
-
- @CheckResult
- @Override public FtpDownloadTarget login(String userName, String password) {
- return mDelegate.login(userName, password);
- }
-
- @CheckResult
- @Override public FtpDownloadTarget login(String userName, String password, String account) {
- return mDelegate.login(userName, password, account);
- }
-
- @CheckResult
- @Override public FtpDownloadTarget setProxy(Proxy proxy) {
- return mDelegate.setProxy(proxy);
- }
-}
+/*
+ * 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.download;
+
+import android.support.annotation.CheckResult;
+import android.support.annotation.NonNull;
+import android.text.TextUtils;
+import com.arialyy.aria.core.common.ftp.FTPSDelegate;
+import com.arialyy.aria.core.common.ftp.FtpDelegate;
+import com.arialyy.aria.core.inf.AbsTaskWrapper;
+import com.arialyy.aria.core.inf.IFtpTarget;
+import com.arialyy.aria.util.ALog;
+import com.arialyy.aria.util.CommonUtil;
+import java.net.Proxy;
+
+/**
+ * Created by lyy on 2016/12/5.
+ * https://github.com/AriaLyy/Aria
+ */
+public class FtpDownloadTarget extends AbsDownloadTarget
+ implements IFtpTarget {
+ private FtpDelegate mFtpDelegate;
+ private DNormalDelegate mNormalDelegate;
+
+ FtpDownloadTarget(DownloadEntity entity, String targetName) {
+ this(entity.getUrl(), targetName);
+ }
+
+ FtpDownloadTarget(String url, String targetName) {
+ mNormalDelegate = new DNormalDelegate<>(this, url, targetName);
+ init();
+ }
+
+ private void init() {
+ int lastIndex = getUrl().lastIndexOf("/");
+ mEntity.setFileName(getUrl().substring(lastIndex + 1));
+ getTaskWrapper().asFtp().setUrlEntity(CommonUtil.getFtpUrlInfo(getUrl()));
+ getTaskWrapper().setRequestType(AbsTaskWrapper.D_FTP);
+
+ mFtpDelegate = new FtpDelegate<>(this);
+ }
+
+ /**
+ * 是否是FTPS协议
+ * 如果是FTPS协议,需要使用{@link FTPSDelegate#setStorePath(String)} 、{@link FTPSDelegate#setAlias(String)}
+ * 设置证书信息
+ */
+ @CheckResult
+ public FTPSDelegate asFtps() {
+ getTaskWrapper().asFtp().getUrlEntity().isFtps = true;
+ return new FTPSDelegate<>(this);
+ }
+
+ @Override protected boolean checkEntity() {
+ if (getTaskWrapper().asFtp().getUrlEntity().isFtps) {
+ if (TextUtils.isEmpty(getTaskWrapper().asFtp().getUrlEntity().storePath)) {
+ ALog.e(TAG, "证书路径为空");
+ return false;
+ }
+ if (TextUtils.isEmpty(getTaskWrapper().asFtp().getUrlEntity().keyAlias)) {
+ ALog.e(TAG, "证书别名为空");
+ return false;
+ }
+ }
+ return mNormalDelegate.checkEntity();
+ }
+
+ @Override public boolean isRunning() {
+ return mNormalDelegate.isRunning();
+ }
+
+ @Override public boolean taskExists() {
+ return mNormalDelegate.taskExists();
+ }
+
+ /**
+ * 设置文件保存文件夹路径
+ *
+ * @param filePath 文件保存路径
+ * @deprecated {@link #setFilePath(String)} 请使用这个api
+ */
+ @Deprecated
+ @CheckResult
+ public FtpDownloadTarget setDownloadPath(@NonNull String filePath) {
+ return setFilePath(filePath);
+ }
+
+ /**
+ * 设置文件保存文件夹路径
+ * 关于文件名:
+ * 1、如果保存路径是该文件的保存路径,如:/mnt/sdcard/file.zip,则使用路径中的文件名file.zip
+ * 2、如果保存路径是文件夹路径,如:/mnt/sdcard/,则使用FTP服务器该文件的文件名
+ */
+ @CheckResult
+ public FtpDownloadTarget setFilePath(@NonNull String filePath) {
+ setTempFilePath(filePath);
+ return this;
+ }
+
+ /**
+ * 设置文件存储路径,如果需要修改新的文件名,修改路径便可。
+ * 如:原文件路径 /mnt/sdcard/test.zip
+ * 如果需要将test.zip改为game.zip,只需要重新设置文件路径为:/mnt/sdcard/game.zip
+ *
+ * @param filePath 路径必须为文件路径,不能为文件夹路径
+ * @param forceDownload {@code true}强制下载,不考虑文件路径是否被占用
+ */
+ @CheckResult
+ public FtpDownloadTarget setFilePath(@NonNull String filePath, boolean forceDownload) {
+ setTempFilePath(filePath);
+ setForceDownload(forceDownload);
+ return this;
+ }
+
+ @Override public int getTargetType() {
+ return FTP;
+ }
+
+ @CheckResult
+ @Override public FtpDownloadTarget charSet(String charSet) {
+ return mFtpDelegate.charSet(charSet);
+ }
+
+ @CheckResult
+ @Override public FtpDownloadTarget login(String userName, String password) {
+ return mFtpDelegate.login(userName, password);
+ }
+
+ @CheckResult
+ @Override public FtpDownloadTarget login(String userName, String password, String account) {
+ return mFtpDelegate.login(userName, password, account);
+ }
+
+ @CheckResult
+ @Override public FtpDownloadTarget setProxy(Proxy proxy) {
+ return mFtpDelegate.setProxy(proxy);
+ }
+
+ @Override public FtpDownloadTarget updateUrl(String newUrl) {
+ return mNormalDelegate.updateUrl(newUrl);
+ }
+}
diff --git a/Aria/src/main/java/com/arialyy/aria/core/inf/AbsTarget.java b/Aria/src/main/java/com/arialyy/aria/core/inf/AbsTarget.java
index 44ad1b90..9b380196 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/inf/AbsTarget.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/inf/AbsTarget.java
@@ -1,312 +1,348 @@
-/*
- * 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;
-
-import android.support.annotation.CheckResult;
-import android.text.TextUtils;
-import com.arialyy.aria.core.AriaManager;
-import com.arialyy.aria.core.command.ICmd;
-import com.arialyy.aria.core.command.normal.CancelCmd;
-import com.arialyy.aria.core.command.normal.NormalCmdFactory;
-import com.arialyy.aria.core.common.TaskRecord;
-import com.arialyy.aria.core.download.DGTaskWrapper;
-import com.arialyy.aria.core.download.DownloadGroupEntity;
-import com.arialyy.aria.core.download.DTaskWrapper;
-import com.arialyy.aria.core.manager.TaskWrapperManager;
-import com.arialyy.aria.core.upload.UTaskWrapper;
-import com.arialyy.aria.orm.DbEntity;
-import com.arialyy.aria.util.ALog;
-import com.arialyy.aria.util.CommonUtil;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Created by AriaL on 2017/7/3.
- */
-public abstract class AbsTarget
- implements ITarget {
- protected String TAG;
- protected ENTITY mEntity;
- protected TASK_WRAPPER mTaskWrapper;
- protected String mTargetName;
-
- protected AbsTarget() {
- TAG = CommonUtil.getClassName(this);
- }
-
- /**
- * 重置状态,将任务状态设置为未开始状态
- * 注意:如果在后续方法调用链中没有调用 {@link #start()}、{@link #stop()}、{@link #cancel()}、{@link #resume()}
- * 等操作任务的方法,那么你需要调用{@link #save()}才能将修改保存到数据库
- */
- @CheckResult(suggest = "after use #start()、#stop()、#cancel()、#resume()、#save()?")
- public TARGET resetState() {
- mTaskWrapper.getEntity().setState(IEntity.STATE_WAIT);
- mTaskWrapper.setRefreshInfo(true);
- return (TARGET) this;
- }
-
- /**
- * 删除记录,如果任务正在执行,则会删除正在下载的任务
- */
- public void removeRecord() {
- if (isRunning()) {
- ALog.d("AbsTarget", "任务正在下载,即将删除任务");
- cancel();
- } else {
- if (mEntity instanceof AbsNormalEntity) {
- TaskRecord record =
- DbEntity.findFirst(TaskRecord.class, "TaskRecord.filePath=?", mTaskWrapper.getKey());
- if (record != null) {
- CommonUtil.delTaskRecord(record, mTaskWrapper.isRemoveFile(), (AbsNormalEntity) mEntity);
- } else {
- mEntity.deleteData();
- }
- } else if (mEntity instanceof DownloadGroupEntity) {
- CommonUtil.delGroupTaskRecord(mTaskWrapper.isRemoveFile(), ((DownloadGroupEntity) mEntity));
- }
- TaskWrapperManager.getInstance().removeTaskWrapper(mEntity.getKey());
- }
- }
-
- /**
- * 获取任务实体
- */
- public TASK_WRAPPER getTaskWrapper() {
- return mTaskWrapper;
- }
-
- /**
- * 获取任务进度,如果任务存在,则返回当前进度
- *
- * @return 该任务进度
- */
- public long getCurrentProgress() {
- return mEntity == null ? -1 : mEntity.getCurrentProgress();
- }
-
- /**
- * 获取任务文件大小
- *
- * @return 文件大小
- */
- public long getSize() {
- return mEntity == null ? 0 : mEntity.getFileSize();
- }
-
- /**
- * 获取单位转换后的文件大小
- *
- * @return 文件大小{@code xxx mb}
- */
- public String getConvertSize() {
- return mEntity == null ? "0b" : CommonUtil.formatFileSize(mEntity.getFileSize());
- }
-
- /**
- * 设置扩展字段,用来保存你的其它数据,如果你的数据比较多,你可以把你的数据转换为JSON字符串,然后再存到Aria中
- * 注意:如果在后续方法调用链中没有调用 {@link #start()}、{@link #stop()}、{@link #cancel()}、{@link #resume()}
- * 等操作任务的方法,那么你需要调用{@link #save()}才能将修改保存到数据库
- *
- * @param str 扩展数据
- */
- @CheckResult(suggest = "after use #start()、#stop()、#cancel()、#resume()、#save()?")
- public TARGET setExtendField(String str) {
- if (TextUtils.isEmpty(str)) return (TARGET) this;
- if (TextUtils.isEmpty(mEntity.getStr()) || !mEntity.getStr().equals(str)) {
- mEntity.setStr(str);
- } else {
- ALog.e(TAG, "设置扩展字段失败,扩展字段为一致");
- }
-
- return (TARGET) this;
- }
-
- /**
- * 获取存放的扩展字段
- * 设置扩展字段{@link #setExtendField(String)}
- */
- public String getExtendField() {
- return mEntity.getStr();
- }
-
- /**
- * 获取任务状态
- *
- * @return {@link IEntity}
- */
- public int getTaskState() {
- return mEntity.getState();
- }
-
- /**
- * 获取任务进度百分比
- *
- * @return 返回任务进度
- */
- public int getPercent() {
- if (mEntity == null) {
- ALog.e("AbsTarget", "下载管理器中没有该任务");
- return 0;
- }
- if (mEntity.getFileSize() != 0) {
- return (int) (mEntity.getCurrentProgress() * 100 / mEntity.getFileSize());
- }
- return 0;
- }
-
- /**
- * 检查实体是否合法,如果实体合法,将保存实体到数据库,或更新数据库中的实体对象
- *
- * @return {@code true} 合法
- */
- protected abstract boolean checkEntity();
-
- protected int checkTaskType() {
- int taskType = 0;
- if (mTaskWrapper instanceof DTaskWrapper) {
- taskType = ICmd.TASK_TYPE_DOWNLOAD;
- } else if (mTaskWrapper instanceof DGTaskWrapper) {
- taskType = ICmd.TASK_TYPE_DOWNLOAD_GROUP;
- } else if (mTaskWrapper instanceof UTaskWrapper) {
- taskType = ICmd.TASK_TYPE_UPLOAD;
- }
- return taskType;
- }
-
- /**
- * 保存修改
- */
- @Override public void save() {
- if (!checkEntity()) {
- ALog.e(TAG, "保存修改失败");
- } else {
- ALog.i(TAG, "保存成功");
- }
- }
-
- /**
- * 任务是否在执行
- *
- * @return {@code true} 任务正在执行
- */
- public abstract boolean isRunning();
-
- /**
- * 任务是否存在
- *
- * @return {@code true} 任务存在
- */
- public abstract boolean taskExists();
-
- /**
- * 开始任务
- */
- @Override public void start() {
- if (checkEntity()) {
- AriaManager.getInstance(AriaManager.APP)
- .setCmd(
- CommonUtil.createNormalCmd(mTaskWrapper, NormalCmdFactory.TASK_START,
- checkTaskType()))
- .exe();
- }
- }
-
- /**
- * 停止任务
- *
- * @see #stop()
- */
- @Deprecated public void pause() {
- if (checkEntity()) {
- stop();
- }
- }
-
- @Override public void stop() {
- if (checkEntity()) {
- AriaManager.getInstance(AriaManager.APP)
- .setCmd(
- CommonUtil.createNormalCmd(mTaskWrapper, NormalCmdFactory.TASK_STOP, checkTaskType()))
- .exe();
- }
- }
-
- /**
- * 恢复任务
- */
- @Override public void resume() {
- if (checkEntity()) {
- AriaManager.getInstance(AriaManager.APP)
- .setCmd(
- CommonUtil.createNormalCmd(mTaskWrapper, NormalCmdFactory.TASK_START,
- checkTaskType()))
- .exe();
- }
- }
-
- /**
- * 删除任务
- */
- @Override public void cancel() {
- if (checkEntity()) {
- AriaManager.getInstance(AriaManager.APP)
- .setCmd(CommonUtil.createNormalCmd(mTaskWrapper, NormalCmdFactory.TASK_CANCEL,
- checkTaskType()))
- .exe();
- }
- }
-
- /**
- * 任务重试
- */
- @Override public void reTry() {
- if (checkEntity()) {
- List cmds = new ArrayList<>();
- int taskType = checkTaskType();
- cmds.add(
- CommonUtil.createNormalCmd(mTaskWrapper, NormalCmdFactory.TASK_STOP, taskType));
- cmds.add(CommonUtil.createNormalCmd(mTaskWrapper, NormalCmdFactory.TASK_START, taskType));
- AriaManager.getInstance(AriaManager.APP).setCmds(cmds).exe();
- }
- }
-
- /**
- * 删除任务
- *
- * @param removeFile {@code true} 不仅删除任务数据库记录,还会删除已经删除完成的文件
- * {@code false}如果任务已经完成,只删除任务数据库记录,
- */
- @Override public void cancel(boolean removeFile) {
- if (checkEntity()) {
- CancelCmd cancelCmd =
- (CancelCmd) CommonUtil.createNormalCmd(mTaskWrapper, NormalCmdFactory.TASK_CANCEL,
- checkTaskType());
- cancelCmd.removeFile = removeFile;
- AriaManager.getInstance(AriaManager.APP).setCmd(cancelCmd).exe();
- }
- }
-
- /**
- * 重新下载
- */
- @Override public void reStart() {
- if (checkEntity()) {
- cancel();
- start();
- }
- }
-}
+/*
+ * 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;
+
+import android.support.annotation.CheckResult;
+import android.text.TextUtils;
+import com.arialyy.aria.core.AriaManager;
+import com.arialyy.aria.core.command.ICmd;
+import com.arialyy.aria.core.command.normal.CancelCmd;
+import com.arialyy.aria.core.command.normal.NormalCmdFactory;
+import com.arialyy.aria.core.common.TaskRecord;
+import com.arialyy.aria.core.download.DGTaskWrapper;
+import com.arialyy.aria.core.download.DownloadGroupEntity;
+import com.arialyy.aria.core.download.DTaskWrapper;
+import com.arialyy.aria.core.manager.TaskWrapperManager;
+import com.arialyy.aria.core.upload.UTaskWrapper;
+import com.arialyy.aria.orm.DbEntity;
+import com.arialyy.aria.util.ALog;
+import com.arialyy.aria.util.CommonUtil;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by AriaL on 2017/7/3.
+ */
+public abstract class AbsTarget
+ implements ITargetHandler {
+
+ protected String TAG;
+ protected ENTITY mEntity;
+ private TASK_WRAPPER mTaskWrapper;
+ private String mTargetName;
+
+ protected AbsTarget() {
+ TAG = CommonUtil.getClassName(this);
+ }
+
+ /**
+ * 重置状态,将任务状态设置为未开始状态
+ * 注意:如果在后续方法调用链中没有调用 {@link #start()}、{@link #stop()}、{@link #cancel()}、{@link #resume()}
+ * 等操作任务的方法,那么你需要调用{@link #save()}才能将修改保存到数据库
+ */
+ @CheckResult(suggest = "after use #start()、#stop()、#cancel()、#resume()、#save()?")
+ public TARGET resetState() {
+ mTaskWrapper.getEntity().setState(IEntity.STATE_WAIT);
+ mTaskWrapper.setRefreshInfo(true);
+ return (TARGET) this;
+ }
+
+ /**
+ * 删除记录,如果任务正在执行,则会删除正在下载的任务
+ */
+ public void removeRecord() {
+ if (isRunning()) {
+ ALog.d("AbsTarget", "任务正在下载,即将删除任务");
+ cancel();
+ } else {
+ if (mEntity instanceof AbsNormalEntity) {
+ TaskRecord record =
+ DbEntity.findFirst(TaskRecord.class, "TaskRecord.filePath=?", mTaskWrapper.getKey());
+ if (record != null) {
+ CommonUtil.delTaskRecord(record, mTaskWrapper.isRemoveFile(), (AbsNormalEntity) mEntity);
+ } else {
+ mEntity.deleteData();
+ }
+ } else if (mEntity instanceof DownloadGroupEntity) {
+ CommonUtil.delGroupTaskRecord(mTaskWrapper.isRemoveFile(), ((DownloadGroupEntity) mEntity));
+ }
+ TaskWrapperManager.getInstance().removeTaskWrapper(mEntity.getKey());
+ }
+ }
+
+ public ENTITY getEntity() {
+ return mEntity;
+ }
+
+ public void setTaskWrapper(TASK_WRAPPER mTaskWrapper) {
+ this.mTaskWrapper = mTaskWrapper;
+ }
+
+ public String getTargetName() {
+ return mTargetName;
+ }
+
+ public void setTargetName(String mTargetName) {
+ this.mTargetName = mTargetName;
+ }
+
+ /**
+ * 获取任务实体
+ */
+ public TASK_WRAPPER getTaskWrapper() {
+ return mTaskWrapper;
+ }
+
+ /**
+ * 获取任务进度,如果任务存在,则返回当前进度
+ *
+ * @return 该任务进度
+ */
+ public long getCurrentProgress() {
+ return mEntity == null ? -1 : mEntity.getCurrentProgress();
+ }
+
+ /**
+ * 获取任务文件大小
+ *
+ * @return 文件大小
+ */
+ public long getFileSize() {
+ return mEntity == null ? 0 : mEntity.getFileSize();
+ }
+
+ /**
+ * 获取单位转换后的文件大小
+ *
+ * @return 文件大小{@code xxx mb}
+ */
+ public String getConvertFileSize() {
+ return mEntity == null ? "0b" : CommonUtil.formatFileSize(mEntity.getFileSize());
+ }
+
+ /**
+ * 设置扩展字段,用来保存你的其它数据,如果你的数据比较多,你可以把你的数据转换为JSON字符串,然后再存到Aria中
+ * 注意:如果在后续方法调用链中没有调用 {@link #start()}、{@link #stop()}、{@link #cancel()}、{@link #resume()}
+ * 等操作任务的方法,那么你需要调用{@link #save()}才能将修改保存到数据库
+ *
+ * @param str 扩展数据
+ */
+ @CheckResult(suggest = "after use #start()、#stop()、#cancel()、#resume()、#save()?")
+ public TARGET setExtendField(String str) {
+ if (TextUtils.isEmpty(str)) return (TARGET) this;
+ if (TextUtils.isEmpty(mEntity.getStr()) || !mEntity.getStr().equals(str)) {
+ mEntity.setStr(str);
+ } else {
+ ALog.e(TAG, "设置扩展字段失败,扩展字段为一致");
+ }
+
+ return (TARGET) this;
+ }
+
+ /**
+ * 获取存放的扩展字段
+ * 设置扩展字段{@link #setExtendField(String)}
+ */
+ public String getExtendField() {
+ return mEntity.getStr();
+ }
+
+ /**
+ * 获取任务状态
+ *
+ * @return {@link IEntity}
+ */
+ public int getTaskState() {
+ return mEntity.getState();
+ }
+
+ /**
+ * 获取任务进度百分比
+ *
+ * @return 返回任务进度
+ */
+ public int getPercent() {
+ if (mEntity == null) {
+ ALog.e("AbsTarget", "下载管理器中没有该任务");
+ return 0;
+ }
+ if (mEntity.getFileSize() != 0) {
+ return (int) (mEntity.getCurrentProgress() * 100 / mEntity.getFileSize());
+ }
+ return 0;
+ }
+
+ /**
+ * 检查实体是否合法,如果实体合法,将保存实体到数据库,或更新数据库中的实体对象
+ *
+ * @return {@code true} 合法
+ */
+ protected abstract boolean checkEntity();
+
+ protected int checkTaskType() {
+ int taskType = 0;
+ if (mTaskWrapper instanceof DTaskWrapper) {
+ taskType = ICmd.TASK_TYPE_DOWNLOAD;
+ } else if (mTaskWrapper instanceof DGTaskWrapper) {
+ taskType = ICmd.TASK_TYPE_DOWNLOAD_GROUP;
+ } else if (mTaskWrapper instanceof UTaskWrapper) {
+ taskType = ICmd.TASK_TYPE_UPLOAD;
+ }
+ return taskType;
+ }
+
+ /**
+ * 保存修改
+ */
+ @Override public void save() {
+ if (!checkEntity()) {
+ ALog.e(TAG, "保存修改失败");
+ } else {
+ ALog.i(TAG, "保存成功");
+ }
+ }
+
+ /**
+ * 任务是否在执行
+ *
+ * @return {@code true} 任务正在执行
+ */
+ public abstract boolean isRunning();
+
+ /**
+ * 任务是否存在
+ *
+ * @return {@code true} 任务存在
+ */
+ public abstract boolean taskExists();
+
+ /**
+ * 设置target类型
+ *
+ * @return {@link #HTTP}、{@link #FTP}、{@link #GROUP_HTTP}、{@link #GROUP_FTP_DIR}
+ */
+ public abstract int getTargetType();
+
+ /**
+ * 添加任务
+ */
+ @Override public void add() {
+ if (checkEntity()) {
+ AriaManager.getInstance(AriaManager.APP)
+ .setCmd(CommonUtil.createNormalCmd(getTaskWrapper(), NormalCmdFactory.TASK_CREATE,
+ checkTaskType()))
+ .exe();
+ }
+ }
+
+ /**
+ * 开始任务
+ */
+ @Override public void start() {
+ if (checkEntity()) {
+ AriaManager.getInstance(AriaManager.APP)
+ .setCmd(
+ CommonUtil.createNormalCmd(mTaskWrapper, NormalCmdFactory.TASK_START,
+ checkTaskType()))
+ .exe();
+ }
+ }
+
+ /**
+ * 停止任务
+ *
+ * @see #stop()
+ */
+ @Deprecated public void pause() {
+ if (checkEntity()) {
+ stop();
+ }
+ }
+
+ @Override public void stop() {
+ if (checkEntity()) {
+ AriaManager.getInstance(AriaManager.APP)
+ .setCmd(
+ CommonUtil.createNormalCmd(mTaskWrapper, NormalCmdFactory.TASK_STOP, checkTaskType()))
+ .exe();
+ }
+ }
+
+ /**
+ * 恢复任务
+ */
+ @Override public void resume() {
+ if (checkEntity()) {
+ AriaManager.getInstance(AriaManager.APP)
+ .setCmd(
+ CommonUtil.createNormalCmd(mTaskWrapper, NormalCmdFactory.TASK_START,
+ checkTaskType()))
+ .exe();
+ }
+ }
+
+ /**
+ * 删除任务
+ */
+ @Override public void cancel() {
+ if (checkEntity()) {
+ AriaManager.getInstance(AriaManager.APP)
+ .setCmd(CommonUtil.createNormalCmd(mTaskWrapper, NormalCmdFactory.TASK_CANCEL,
+ checkTaskType()))
+ .exe();
+ }
+ }
+
+ /**
+ * 任务重试
+ */
+ @Override public void reTry() {
+ if (checkEntity()) {
+ List cmds = new ArrayList<>();
+ int taskType = checkTaskType();
+ cmds.add(
+ CommonUtil.createNormalCmd(mTaskWrapper, NormalCmdFactory.TASK_STOP, taskType));
+ cmds.add(CommonUtil.createNormalCmd(mTaskWrapper, NormalCmdFactory.TASK_START, taskType));
+ AriaManager.getInstance(AriaManager.APP).setCmds(cmds).exe();
+ }
+ }
+
+ /**
+ * 删除任务
+ *
+ * @param removeFile {@code true} 不仅删除任务数据库记录,还会删除已经删除完成的文件
+ * {@code false}如果任务已经完成,只删除任务数据库记录,
+ */
+ @Override public void cancel(boolean removeFile) {
+ if (checkEntity()) {
+ CancelCmd cancelCmd =
+ (CancelCmd) CommonUtil.createNormalCmd(mTaskWrapper, NormalCmdFactory.TASK_CANCEL,
+ checkTaskType());
+ cancelCmd.removeFile = removeFile;
+ AriaManager.getInstance(AriaManager.APP).setCmd(cancelCmd).exe();
+ }
+ }
+
+ /**
+ * 重新下载
+ */
+ @Override public void reStart() {
+ if (checkEntity()) {
+ cancel();
+ start();
+ }
+ }
+}
diff --git a/Aria/src/main/java/com/arialyy/aria/core/inf/IFtpTarget.java b/Aria/src/main/java/com/arialyy/aria/core/inf/IFtpTarget.java
index 2fc81a17..c1b5faf6 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/inf/IFtpTarget.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/inf/IFtpTarget.java
@@ -1,57 +1,57 @@
-/*
- * 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;
-
-import android.support.annotation.CheckResult;
-import java.net.Proxy;
-
-/**
- * Created by laoyuyu on 2018/3/9.
- */
-public interface IFtpTarget {
- /**
- * 设置字符编码
- */
- @CheckResult
- TARGET charSet(String charSet);
-
- /**
- * ftp 用户登录信。
- *
- * @param userName ftp用户名
- * @param password ftp用户密码
- */
- @CheckResult
- TARGET login(String userName, String password);
-
- /**
- * ftp 用户登录信息
- *
- * @param userName ftp用户名
- * @param password ftp用户密码
- * @param account ftp账号
- */
- @CheckResult
- TARGET login(String userName, String password, String account);
-
- /**
- * 设置代理
- *
- * @param proxy {@link Proxy}
- */
- @CheckResult
- TARGET setProxy(Proxy proxy);
-}
+/*
+ * 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;
+
+import android.support.annotation.CheckResult;
+import java.net.Proxy;
+
+/**
+ * Created by laoyuyu on 2018/3/9.
+ */
+public interface IFtpTarget {
+ /**
+ * 设置字符编码
+ */
+ @CheckResult
+ TARGET charSet(String charSet);
+
+ /**
+ * ftp 用户登录信。
+ *
+ * @param userName ftp用户名
+ * @param password ftp用户密码
+ */
+ @CheckResult
+ TARGET login(String userName, String password);
+
+ /**
+ * ftp 用户登录信息
+ *
+ * @param userName ftp用户名
+ * @param password ftp用户密码
+ * @param account ftp账号
+ */
+ @CheckResult
+ TARGET login(String userName, String password, String account);
+
+ /**
+ * 设置代理
+ *
+ * @param proxy {@link Proxy}
+ */
+ @CheckResult
+ TARGET setProxy(Proxy proxy);
+}
diff --git a/Aria/src/main/java/com/arialyy/aria/core/inf/IHttpHeaderDelegate.java b/Aria/src/main/java/com/arialyy/aria/core/inf/IHttpHeaderDelegate.java
index 80307556..fdc930ba 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/inf/IHttpHeaderDelegate.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/inf/IHttpHeaderDelegate.java
@@ -1,52 +1,50 @@
-/*
- * 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;
-
-import android.support.annotation.CheckResult;
-import android.support.annotation.NonNull;
-import com.arialyy.aria.core.common.RequestEnum;
-import com.arialyy.aria.core.download.DownloadEntity;
-import java.net.Proxy;
-import java.util.Map;
-
-/**
- * Created by laoyuyu on 2018/3/9.
- * HTTP Header功能接口
- */
-public interface IHttpHeaderDelegate {
-
- /**
- * 给url请求添加Header数据
- * 如果新的header数据和数据保存的不一致,则更新数据库中对应的header数据
- *
- * @param key header对应的key
- * @param value header对应的value
- */
- @CheckResult
- TARGET addHeader(@NonNull String key, @NonNull String value);
-
- /**
- * 给url请求添加一组header数据
- * 如果新的header数据和数据保存的不一致,则更新数据库中对应的header数据
- *
- * @param headers 一组http header数据
- */
- @CheckResult
- TARGET addHeaders(Map headers);
-
- @CheckResult
- TARGET setUrlProxy(Proxy proxy);
-}
+/*
+ * 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;
+
+import android.support.annotation.CheckResult;
+import android.support.annotation.NonNull;
+import java.net.Proxy;
+import java.util.Map;
+
+/**
+ * Created by laoyuyu on 2018/3/9.
+ * HTTP Header功能接口
+ */
+public interface IHttpHeaderDelegate {
+
+ /**
+ * 给url请求添加Header数据
+ * 如果新的header数据和数据保存的不一致,则更新数据库中对应的header数据
+ *
+ * @param key header对应的key
+ * @param value header对应的value
+ */
+ @CheckResult
+ TARGET addHeader(@NonNull String key, @NonNull String value);
+
+ /**
+ * 给url请求添加一组header数据
+ * 如果新的header数据和数据保存的不一致,则更新数据库中对应的header数据
+ *
+ * @param headers 一组http header数据
+ */
+ @CheckResult
+ TARGET addHeaders(Map headers);
+
+ @CheckResult
+ TARGET setUrlProxy(Proxy proxy);
+}
diff --git a/Aria/src/main/java/com/arialyy/aria/core/inf/ITarget.java b/Aria/src/main/java/com/arialyy/aria/core/inf/ITargetHandler.java
similarity index 77%
rename from Aria/src/main/java/com/arialyy/aria/core/inf/ITarget.java
rename to Aria/src/main/java/com/arialyy/aria/core/inf/ITargetHandler.java
index ce1ef35c..0c2ae824 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/inf/ITarget.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/inf/ITargetHandler.java
@@ -1,64 +1,77 @@
-/*
- * 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/29.
- */
-public interface ITarget {
- /**
- * 开始下载
- */
- void start();
-
- /**
- * 停止下载
- */
- void stop();
-
- /**
- * 恢复下载
- */
- void resume();
-
- /**
- * 取消下载
- */
- void cancel();
-
- /**
- * 保存修改
- */
- void save();
-
- /**
- * 删除任务
- *
- * @param removeFile {@code true} 不仅删除任务数据库记录,还会删除已经删除完成的文件
- * {@code false}如果任务已经完成,只删除任务数据库记录,
- */
- void cancel(boolean removeFile);
-
- /**
- * 任务重试
- */
- void reTry();
-
- /**
- * 重新下载
- */
- void reStart();
-}
+/*
+ * 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/29.
+ * 任务接收器的控制接口,处理添加任务、开始任务、停止任务、删除任务等功能
+ */
+public interface ITargetHandler {
+ int HTTP = 1;
+ int FTP = 2;
+ //HTTP任务组
+ int GROUP_HTTP = 3;
+ //FTP文件夹
+ int GROUP_FTP_DIR = 4;
+
+ /**
+ * 添加任务
+ */
+ void add();
+
+ /**
+ * 开始下载
+ */
+ void start();
+
+ /**
+ * 停止下载
+ */
+ void stop();
+
+ /**
+ * 恢复下载
+ */
+ void resume();
+
+ /**
+ * 取消下载
+ */
+ void cancel();
+
+ /**
+ * 保存修改
+ */
+ void save();
+
+ /**
+ * 删除任务
+ *
+ * @param removeFile {@code true} 不仅删除任务数据库记录,还会删除已经删除完成的文件
+ * {@code false}如果任务已经完成,只删除任务数据库记录,
+ */
+ void cancel(boolean removeFile);
+
+ /**
+ * 任务重试
+ */
+ void reTry();
+
+ /**
+ * 重新下载
+ */
+ void reStart();
+}
diff --git a/Aria/src/main/java/com/arialyy/aria/core/inf/ITaskDelegate.java b/Aria/src/main/java/com/arialyy/aria/core/inf/ITargetHeadDelegate.java
similarity index 82%
rename from Aria/src/main/java/com/arialyy/aria/core/inf/ITaskDelegate.java
rename to Aria/src/main/java/com/arialyy/aria/core/inf/ITargetHeadDelegate.java
index 5f357575..ee49769f 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/inf/ITaskDelegate.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/inf/ITargetHeadDelegate.java
@@ -1,23 +1,24 @@
-/*
- * 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;
-
-/**
- * 任务信息
- */
-public interface ITaskDelegate {
-
-}
+/*
+ * 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/29.
+ * 处理任务头部信息等设置等接口
+ */
+public interface ITargetHeadDelegate {
+
+}
diff --git a/Aria/src/main/java/com/arialyy/aria/core/inf/ITargetNormal.java b/Aria/src/main/java/com/arialyy/aria/core/inf/ITargetNormal.java
new file mode 100644
index 00000000..a2d4a9e4
--- /dev/null
+++ b/Aria/src/main/java/com/arialyy/aria/core/inf/ITargetNormal.java
@@ -0,0 +1,81 @@
+/*
+ * 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 lyy on 2019/4/5.
+ * 普通任务接收器功能接口
+ */
+public interface ITargetNormal {
+
+ /**
+ * 通过地址初始化target
+ *
+ * @param url 下载url、上传url
+ * @param targetName 接收器名称
+ */
+ void initTarget(String url, String targetName);
+
+ /**
+ * 更新下载url
+ *
+ * @param newUrl 新的下载url
+ */
+ TARGET updateUrl(String newUrl);
+
+ /**
+ * 获取实体
+ */
+ AbsEntity getEntity();
+
+ /**
+ * 任务是否存在
+ *
+ * @return {@code true}任务存在,{@code false} 任务不存在
+ */
+ boolean taskExists();
+
+ /**
+ * 任务是否在执行
+ *
+ * @return {@code true} 任务正在执行,{@code false} 任务没有执行
+ */
+ boolean isRunning();
+
+ /**
+ * 检查下载实体,判断实体是否合法 合法标准为:
+ * 1、下载路径不为null,并且下载路径是正常的http或ftp路径
+ * 2、保存路径不为null,并且保存路径是android文件系统路径
+ * 3、保存路径不能重复
+ *
+ * @return {@code true}合法
+ */
+ boolean checkEntity();
+
+ /**
+ * 检查并设置普通任务的文件保存路径
+ *
+ * @return {@code true}保存路径合法
+ */
+ boolean checkFilePath();
+
+ /**
+ * 检查普通任务的下载地址
+ *
+ * @return {@code true}地址合法
+ */
+ boolean checkUrl();
+}
diff --git a/Aria/src/main/java/com/arialyy/aria/core/inf/ITask.java b/Aria/src/main/java/com/arialyy/aria/core/inf/ITask.java
index e8759e5d..9540ec57 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/inf/ITask.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/inf/ITask.java
@@ -1,128 +1,133 @@
-/*
- * 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 lyy on 2017/2/13.
- */
-public interface ITask {
-
- /**
- * 普通下载任务
- */
- int DOWNLOAD = 1;
- /**
- * 上传任务
- */
- int UPLOAD = 2;
- /**
- * 组合任务
- */
- int DOWNLOAD_GROUP = 3;
- /**
- * 组合任务的子任务
- */
- int DOWNLOAD_GROUP_SUB = 4;
- /**
- * 未知
- */
- int OTHER = -1;
-
- /**
- * 获取任务类型
- *
- * @return {@link #DOWNLOAD}、{@link #UPLOAD}、{@link #DOWNLOAD_GROUP}
- */
- int getTaskType();
-
- /**
- * 获取下载状态
- */
- int getState();
-
- /**
- * 唯一标识符,DownloadTask 为下载地址,UploadTask 为文件路径
- */
- String getKey();
-
- /**
- * 任务是否正在执行
- *
- * @return true,正在执行;
- */
- boolean isRunning();
-
- /**
- * 获取信息实体
- */
- TASK_WRAPPER getTaskWrapper();
-
- void start();
-
- /**
- * 停止任务
- */
- void stop();
-
- /**
- * 停止任务
- *
- * @param type {@code 0}默认操作,{@code 1}停止任务不自动执行下一任务
- */
- void stop(int type);
-
- /**
- * 删除任务
- */
- void cancel();
-
- /**
- * 原始byte速度
- */
- long getSpeed();
-
- /**
- * 转换单位后的速度
- */
- String getConvertSpeed();
-
- /**
- * 获取百分比进度
- */
- int getPercent();
-
- /**
- * 原始文件byte长度
- */
- long getFileSize();
-
- /**
- * 转换单位后的文件长度
- */
- String getConvertFileSize();
-
- /**
- * 获取当前进度
- */
- long getCurrentProgress();
-
- /**
- * 获取单位转换后的进度
- *
- * @return 返回 3mb
- */
- String getConvertCurrentProgress();
-}
+/*
+ * 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;
+
+import com.arialyy.aria.core.download.DownloadGroupTask;
+import com.arialyy.aria.core.download.DownloadTask;
+import com.arialyy.aria.core.upload.UploadTask;
+
+/**
+ * Created by lyy on 2017/2/13.
+ * 任务接口{@link DownloadTask}、{@link UploadTask}、{@link DownloadGroupTask}
+ */
+public interface ITask {
+
+ /**
+ * 普通下载任务
+ */
+ int DOWNLOAD = 1;
+ /**
+ * 上传任务
+ */
+ int UPLOAD = 2;
+ /**
+ * 组合任务
+ */
+ int DOWNLOAD_GROUP = 3;
+ /**
+ * 组合任务的子任务
+ */
+ int DOWNLOAD_GROUP_SUB = 4;
+ /**
+ * 未知
+ */
+ int OTHER = -1;
+
+ /**
+ * 获取任务类型
+ *
+ * @return {@link #DOWNLOAD}、{@link #UPLOAD}、{@link #DOWNLOAD_GROUP}
+ */
+ int getTaskType();
+
+ /**
+ * 获取下载状态
+ */
+ int getState();
+
+ /**
+ * 唯一标识符,DownloadTask 为下载地址,UploadTask 为文件路径
+ */
+ String getKey();
+
+ /**
+ * 任务是否正在执行
+ *
+ * @return true,正在执行;
+ */
+ boolean isRunning();
+
+ /**
+ * 获取信息实体
+ */
+ TASK_WRAPPER getTaskWrapper();
+
+ void start();
+
+ /**
+ * 停止任务
+ */
+ void stop();
+
+ /**
+ * 停止任务
+ *
+ * @param type {@code 0}默认操作,{@code 1}停止任务不自动执行下一任务
+ */
+ void stop(int type);
+
+ /**
+ * 删除任务
+ */
+ void cancel();
+
+ /**
+ * 原始byte速度
+ */
+ long getSpeed();
+
+ /**
+ * 转换单位后的速度
+ */
+ String getConvertSpeed();
+
+ /**
+ * 获取百分比进度
+ */
+ int getPercent();
+
+ /**
+ * 原始文件byte长度
+ */
+ long getFileSize();
+
+ /**
+ * 转换单位后的文件长度
+ */
+ String getConvertFileSize();
+
+ /**
+ * 获取当前进度
+ */
+ long getCurrentProgress();
+
+ /**
+ * 获取单位转换后的进度
+ *
+ * @return 返回 3mb
+ */
+ String getConvertCurrentProgress();
+}
diff --git a/Aria/src/main/java/com/arialyy/aria/core/upload/AbsUploadTarget.java b/Aria/src/main/java/com/arialyy/aria/core/upload/AbsUploadTarget.java
index a5f39961..d1b03718 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/upload/AbsUploadTarget.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/upload/AbsUploadTarget.java
@@ -1,28 +1,47 @@
-/*
- * 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.upload;
-
-import com.arialyy.aria.core.inf.AbsEntity;
-import com.arialyy.aria.core.inf.AbsTarget;
-import com.arialyy.aria.core.inf.AbsTaskWrapper;
-
-/**
- * Created by AriaL on 2017/6/29.
- */
-abstract class AbsUploadTarget
- extends AbsTarget {
-
-}
+/*
+ * 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.upload;
+
+import com.arialyy.aria.core.inf.AbsTarget;
+
+/**
+ * Created by AriaL on 2017/6/29.
+ * 普通上传任务接收器
+ */
+abstract class AbsUploadTarget
+ extends AbsTarget {
+
+ /**
+ * 上传路径
+ */
+ private String mTempUrl;
+
+ @Override public void setTaskWrapper(UTaskWrapper mTaskWrapper) {
+ super.setTaskWrapper(mTaskWrapper);
+ }
+
+ String getTempUrl() {
+ return mTempUrl;
+ }
+
+ void setTempUrl(String tempUrl) {
+ this.mTempUrl = tempUrl;
+ }
+
+ void setEntity(UploadEntity entity) {
+ this.mEntity = entity;
+ }
+}
diff --git a/Aria/src/main/java/com/arialyy/aria/core/upload/BaseNormalTarget.java b/Aria/src/main/java/com/arialyy/aria/core/upload/BaseNormalTarget.java
index f29668e2..7b095415 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/upload/BaseNormalTarget.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/upload/BaseNormalTarget.java
@@ -1,146 +1,146 @@
-/*
- * 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.upload;
-
-import android.support.annotation.CheckResult;
-import android.support.annotation.NonNull;
-import android.text.TextUtils;
-import com.arialyy.aria.core.manager.TaskWrapperManager;
-import com.arialyy.aria.core.queue.UploadTaskQueue;
-import com.arialyy.aria.orm.DbEntity;
-import com.arialyy.aria.util.ALog;
-import java.io.File;
-
-/**
- * Created by AriaL on 2018/3/9.
- */
-abstract class BaseNormalTarget
- extends AbsUploadTarget {
-
- protected String mTempUrl;
-
- void initTarget(String filePath) {
- mTaskWrapper =
- TaskWrapperManager.getInstance().getHttpTaskWrapper(UTaskWrapper.class, filePath);
- mEntity = mTaskWrapper.getEntity();
- File file = new File(filePath);
- mEntity.setFileName(file.getName());
- mEntity.setFileSize(file.length());
- mTempUrl = mEntity.getUrl();
- }
-
- /**
- * 设置上传路径
- *
- * @param uploadUrl 上传路径
- */
- @CheckResult
- public TARGET setUploadUrl(@NonNull String uploadUrl) {
- mTempUrl = uploadUrl;
- return (TARGET) this;
- }
-
- /**
- * 上传任务是否存在
- *
- * @return {@code true}存在
- */
- @Override public boolean taskExists() {
- return DbEntity.checkDataExist(UploadEntity.class, "key=?", mEntity.getFilePath());
- }
-
- /**
- * 是否在上传
- *
- * @deprecated {@link #isRunning()}
- */
- public boolean isUploading() {
- return isRunning();
- }
-
- @Override public boolean isRunning() {
- UploadTask task = UploadTaskQueue.getInstance().getTask(mEntity.getKey());
- return task != null && task.isRunning();
- }
-
- @Override protected boolean checkEntity() {
- boolean b = checkUrl() && checkFilePath();
- if (b) {
- mEntity.save();
- }
- if (mTaskWrapper.asFtp().getUrlEntity() != null && mTaskWrapper.asFtp().getUrlEntity().isFtps) {
- //if (TextUtils.isEmpty(mTaskWrapper.getUrlEntity().storePath)) {
- // ALog.e(TAG, "证书路径为空");
- // return false;
- //}
- if (TextUtils.isEmpty(mTaskWrapper.asFtp().getUrlEntity().keyAlias)) {
- ALog.e(TAG, "证书别名为空");
- return false;
- }
- }
- return b;
- }
-
- /**
- * 检查上传文件路径是否合法
- *
- * @return {@code true} 合法
- */
- private boolean checkFilePath() {
- String filePath = mEntity.getFilePath();
- if (TextUtils.isEmpty(filePath)) {
- ALog.e(TAG, "上传失败,文件路径为null");
- return false;
- } else if (!filePath.startsWith("/")) {
- ALog.e(TAG, "上传失败,文件路径【" + filePath + "】不合法");
- return false;
- }
-
- File file = new File(mEntity.getFilePath());
- if (!file.exists()) {
- ALog.e(TAG, "上传失败,文件【" + filePath + "】不存在");
- return false;
- }
- if (file.isDirectory()) {
- ALog.e(TAG, "上传失败,文件【" + filePath + "】不能是文件夹");
- return false;
- }
- return true;
- }
-
- /**
- * 检查普通任务的下载地址
- *
- * @return {@code true}地址合法
- */
- protected boolean checkUrl() {
- final String url = mTempUrl;
- if (TextUtils.isEmpty(url)) {
- ALog.e(TAG, "上传失败,url为null");
- return false;
- } else if (!url.startsWith("http") && !url.startsWith("ftp")) {
- ALog.e(TAG, "上传失败,url【" + url + "】错误");
- return false;
- }
- int index = url.indexOf("://");
- if (index == -1) {
- ALog.e(TAG, "上传失败,url【" + url + "】不合法");
- return false;
- }
- mEntity.setUrl(url);
- return true;
- }
-}
+///*
+// * 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.upload;
+//
+//import android.support.annotation.CheckResult;
+//import android.support.annotation.NonNull;
+//import android.text.TextUtils;
+//import com.arialyy.aria.core.manager.TaskWrapperManager;
+//import com.arialyy.aria.core.queue.UploadTaskQueue;
+//import com.arialyy.aria.orm.DbEntity;
+//import com.arialyy.aria.util.ALog;
+//import java.io.File;
+//
+///**
+// * Created by AriaL on 2018/3/9.
+// */
+//abstract class BaseNormalTarget
+// extends AbsUploadTarget {
+//
+// protected String mTempUrl;
+//
+// void initTarget(String filePath) {
+// mTaskWrapper =
+// TaskWrapperManager.getInstance().getHttpTaskWrapper(UTaskWrapper.class, filePath);
+// mEntity = mTaskWrapper.getEntity();
+// File file = new File(filePath);
+// mEntity.setFileName(file.getName());
+// mEntity.setFileSize(file.length());
+// mTempUrl = mEntity.getUrl();
+// }
+//
+// /**
+// * 设置上传路径
+// *
+// * @param uploadUrl 上传路径
+// */
+// @CheckResult
+// public TARGET setTempUrl(@NonNull String uploadUrl) {
+// mTempUrl = uploadUrl;
+// return (TARGET) this;
+// }
+//
+// /**
+// * 上传任务是否存在
+// *
+// * @return {@code true}存在
+// */
+// @Override public boolean taskExists() {
+// return DbEntity.checkDataExist(UploadEntity.class, "key=?", mEntity.getFilePath());
+// }
+//
+// /**
+// * 是否在上传
+// *
+// * @deprecated {@link #isRunning()}
+// */
+// public boolean isUploading() {
+// return isRunning();
+// }
+//
+// @Override public boolean isRunning() {
+// UploadTask task = UploadTaskQueue.getInstance().getTask(mEntity.getKey());
+// return task != null && task.isRunning();
+// }
+//
+// @Override protected boolean checkEntity() {
+// boolean b = checkUrl() && checkFilePath();
+// if (b) {
+// mEntity.save();
+// }
+// if (mTaskWrapper.asFtp().getUrlEntity() != null && mTaskWrapper.asFtp().getUrlEntity().isFtps) {
+// //if (TextUtils.isEmpty(mTaskWrapper.getUrlEntity().storePath)) {
+// // ALog.e(TAG, "证书路径为空");
+// // return false;
+// //}
+// if (TextUtils.isEmpty(mTaskWrapper.asFtp().getUrlEntity().keyAlias)) {
+// ALog.e(TAG, "证书别名为空");
+// return false;
+// }
+// }
+// return b;
+// }
+//
+// /**
+// * 检查上传文件路径是否合法
+// *
+// * @return {@code true} 合法
+// */
+// private boolean checkFilePath() {
+// String filePath = mEntity.getFilePath();
+// if (TextUtils.isEmpty(filePath)) {
+// ALog.e(TAG, "上传失败,文件路径为null");
+// return false;
+// } else if (!filePath.startsWith("/")) {
+// ALog.e(TAG, "上传失败,文件路径【" + filePath + "】不合法");
+// return false;
+// }
+//
+// File file = new File(mEntity.getFilePath());
+// if (!file.exists()) {
+// ALog.e(TAG, "上传失败,文件【" + filePath + "】不存在");
+// return false;
+// }
+// if (file.isDirectory()) {
+// ALog.e(TAG, "上传失败,文件【" + filePath + "】不能是文件夹");
+// return false;
+// }
+// return true;
+// }
+//
+// /**
+// * 检查普通任务的下载地址
+// *
+// * @return {@code true}地址合法
+// */
+// protected boolean checkUrl() {
+// final String url = mTempUrl;
+// if (TextUtils.isEmpty(url)) {
+// ALog.e(TAG, "上传失败,url为null");
+// return false;
+// } else if (!url.startsWith("http") && !url.startsWith("ftp")) {
+// ALog.e(TAG, "上传失败,url【" + url + "】错误");
+// return false;
+// }
+// int index = url.indexOf("://");
+// if (index == -1) {
+// ALog.e(TAG, "上传失败,url【" + url + "】不合法");
+// return false;
+// }
+// mEntity.setUrl(url);
+// return true;
+// }
+//}
diff --git a/Aria/src/main/java/com/arialyy/aria/core/upload/FtpUploadTarget.java b/Aria/src/main/java/com/arialyy/aria/core/upload/FtpUploadTarget.java
index 9ba2b609..18ecf446 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/upload/FtpUploadTarget.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/upload/FtpUploadTarget.java
@@ -1,125 +1,102 @@
-/*
- * 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.upload;
-
-import android.support.annotation.CheckResult;
-import com.arialyy.aria.core.AriaManager;
-import com.arialyy.aria.core.FtpUrlEntity;
-import com.arialyy.aria.core.command.normal.NormalCmdFactory;
-import com.arialyy.aria.core.common.ftp.FTPSDelegate;
-import com.arialyy.aria.core.common.ftp.FtpDelegate;
-import com.arialyy.aria.core.common.ftp.FtpTaskDelegate;
-import com.arialyy.aria.core.inf.AbsTaskWrapper;
-import com.arialyy.aria.core.inf.IFtpTarget;
-import com.arialyy.aria.util.CommonUtil;
-import java.net.Proxy;
-
-/**
- * Created by Aria.Lao on 2017/7/27.
- * ftp单任务上传
- */
-public class FtpUploadTarget extends BaseNormalTarget
- implements IFtpTarget {
- private FtpDelegate mDelegate;
-
- private String mAccount, mUser, mPw;
- private boolean needLogin = false;
-
- FtpUploadTarget(String filePath, String targetName) {
- this.mTargetName = targetName;
- initTask(filePath);
- }
-
- private void initTask(String filePath) {
- initTarget(filePath);
- mTaskWrapper.setRequestType(AbsTaskWrapper.U_FTP);
- mDelegate = new FtpDelegate<>(this);
- }
-
- /**
- * 添加任务
- */
- public void add() {
- if (checkEntity()) {
- AriaManager.getInstance(AriaManager.APP)
- .setCmd(CommonUtil.createNormalCmd(mTaskWrapper, NormalCmdFactory.TASK_CREATE,
- checkTaskType()))
- .exe();
- }
- }
-
- @Override protected boolean checkUrl() {
- boolean b = super.checkUrl();
- if (!b) {
- return false;
- }
- FtpTaskDelegate taskDelegate = mTaskWrapper.asFtp();
- FtpUrlEntity temp = taskDelegate.getUrlEntity();
- FtpUrlEntity newEntity = CommonUtil.getFtpUrlInfo(mTempUrl);
- if (temp != null) { //处理FTPS的信息
- newEntity.isFtps = temp.isFtps;
- newEntity.storePass = temp.storePass;
- newEntity.keyAlias = temp.keyAlias;
- newEntity.protocol = temp.protocol;
- newEntity.storePath = temp.storePath;
- }
- taskDelegate.setUrlEntity(newEntity);
- taskDelegate.getUrlEntity().account = mAccount;
- taskDelegate.getUrlEntity().user = mUser;
- taskDelegate.getUrlEntity().password = mPw;
- taskDelegate.getUrlEntity().needLogin = needLogin;
- return true;
- }
-
- /**
- * 是否是FTPS协议
- * 如果是FTPS协议,需要使用{@link FTPSDelegate#setStorePath(String)} 、{@link FTPSDelegate#setAlias(String)}
- * 设置证书信息
- */
- @CheckResult
- public FTPSDelegate asFtps() {
- if (mTaskWrapper.asFtp().getUrlEntity() == null) {
- FtpUrlEntity urlEntity = new FtpUrlEntity();
- urlEntity.isFtps = true;
- mTaskWrapper.asFtp().setUrlEntity(urlEntity);
- }
- return new FTPSDelegate<>(this);
- }
-
- @CheckResult
- @Override public FtpUploadTarget charSet(String charSet) {
- return mDelegate.charSet(charSet);
- }
-
- @Override public FtpUploadTarget login(String userName, String password) {
- needLogin = true;
- mUser = userName;
- mPw = password;
- return this;
- }
-
- @Override public FtpUploadTarget login(String userName, String password, String account) {
- needLogin = true;
- mUser = userName;
- mPw = password;
- mAccount = account;
- return this;
- }
-
- @Override public FtpUploadTarget setProxy(Proxy proxy) {
- return mDelegate.setProxy(proxy);
- }
-}
+/*
+ * 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.upload;
+
+import android.support.annotation.CheckResult;
+import com.arialyy.aria.core.FtpUrlEntity;
+import com.arialyy.aria.core.common.ftp.FTPSDelegate;
+import com.arialyy.aria.core.common.ftp.FtpDelegate;
+import com.arialyy.aria.core.inf.AbsTaskWrapper;
+import com.arialyy.aria.core.inf.IFtpTarget;
+import java.net.Proxy;
+
+/**
+ * Created by Aria.Lao on 2017/7/27.
+ * ftp单任务上传
+ */
+public class FtpUploadTarget extends AbsUploadTarget
+ implements IFtpTarget {
+ private FtpDelegate mFtpDelegate;
+ private UNormalDelegate mNormalDelegate;
+
+ FtpUploadTarget(String filePath, String targetName) {
+ mNormalDelegate = new UNormalDelegate<>(this, filePath, targetName);
+ initTask();
+ }
+
+ private void initTask() {
+ getTaskWrapper().setRequestType(AbsTaskWrapper.U_FTP);
+ mFtpDelegate = new FtpDelegate<>(this);
+ }
+
+ /**
+ * 设置上传路径
+ *
+ * @param tempUrl 上传路径
+ */
+ public FtpUploadTarget setUploadUrl(String tempUrl) {
+ setTempUrl(tempUrl);
+ return this;
+ }
+
+ /**
+ * 是否是FTPS协议
+ * 如果是FTPS协议,需要使用{@link FTPSDelegate#setStorePath(String)} 、{@link FTPSDelegate#setAlias(String)}
+ * 设置证书信息
+ */
+ @CheckResult
+ public FTPSDelegate asFtps() {
+ if (getTaskWrapper().asFtp().getUrlEntity() == null) {
+ FtpUrlEntity urlEntity = new FtpUrlEntity();
+ urlEntity.isFtps = true;
+ getTaskWrapper().asFtp().setUrlEntity(urlEntity);
+ }
+ return new FTPSDelegate<>(this);
+ }
+
+ @CheckResult
+ @Override public FtpUploadTarget charSet(String charSet) {
+ return mFtpDelegate.charSet(charSet);
+ }
+
+ @Override public FtpUploadTarget login(String userName, String password) {
+ return mFtpDelegate.login(userName, password);
+ }
+
+ @Override public FtpUploadTarget login(String userName, String password, String account) {
+ return mFtpDelegate.login(userName, password, account);
+ }
+
+ @Override public FtpUploadTarget setProxy(Proxy proxy) {
+ return mFtpDelegate.setProxy(proxy);
+ }
+
+ @Override protected boolean checkEntity() {
+ return mNormalDelegate.checkEntity();
+ }
+
+ @Override public boolean isRunning() {
+ return mNormalDelegate.isRunning();
+ }
+
+ @Override public boolean taskExists() {
+ return mNormalDelegate.taskExists();
+ }
+
+ @Override public int getTargetType() {
+ return FTP;
+ }
+}
diff --git a/Aria/src/main/java/com/arialyy/aria/core/upload/UNormalDelegate.java b/Aria/src/main/java/com/arialyy/aria/core/upload/UNormalDelegate.java
new file mode 100644
index 00000000..359e7937
--- /dev/null
+++ b/Aria/src/main/java/com/arialyy/aria/core/upload/UNormalDelegate.java
@@ -0,0 +1,132 @@
+/*
+ * 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.upload;
+
+import android.text.TextUtils;
+import com.arialyy.aria.core.inf.AbsEntity;
+import com.arialyy.aria.core.inf.ITargetNormal;
+import com.arialyy.aria.core.manager.TaskWrapperManager;
+import com.arialyy.aria.core.queue.UploadTaskQueue;
+import com.arialyy.aria.orm.DbEntity;
+import com.arialyy.aria.util.ALog;
+import java.io.File;
+
+/**
+ * Created by Aria.Lao on 2019/4/5.
+ * 普通上传任务通用功能处理
+ */
+public class UNormalDelegate implements ITargetNormal {
+ private String TAG = "UNormalDelegate";
+ private UploadEntity mEntity;
+ private TARGET mTarget;
+
+ UNormalDelegate(TARGET target, String filePath, String targetName) {
+ mTarget = target;
+ initTarget(filePath, targetName);
+ }
+
+ @Override public void initTarget(String filePath, String targetName) {
+ UTaskWrapper taskWrapper =
+ TaskWrapperManager.getInstance().getHttpTaskWrapper(UTaskWrapper.class, filePath);
+ mEntity = taskWrapper.getEntity();
+ File file = new File(filePath);
+ mEntity.setFileName(file.getName());
+ mEntity.setFileSize(file.length());
+ mTarget.setTargetName(targetName);
+ mTarget.setTaskWrapper(taskWrapper);
+ mTarget.setEntity(mEntity);
+ mTarget.setTempUrl(mEntity.getUrl());
+ }
+
+ @Override public TARGET updateUrl(String newUrl) {
+ mTarget.setTempUrl(mEntity.getUrl());
+ return mTarget;
+ }
+
+ @Override public AbsEntity getEntity() {
+ return mEntity;
+ }
+
+ @Override public boolean taskExists() {
+ return DbEntity.checkDataExist(UploadEntity.class, "key=?", mEntity.getFilePath());
+ }
+
+ @Override public boolean isRunning() {
+ UploadTask task = UploadTaskQueue.getInstance().getTask(mEntity.getKey());
+ return task != null && task.isRunning();
+ }
+
+ @Override public boolean checkEntity() {
+ boolean b = checkUrl() && checkFilePath();
+ if (b) {
+ mEntity.save();
+ }
+ if (mTarget.getTaskWrapper().asFtp().getUrlEntity() != null && mTarget.getTaskWrapper()
+ .asFtp()
+ .getUrlEntity().isFtps) {
+ //if (TextUtils.isEmpty(mTaskWrapper.getUrlEntity().storePath)) {
+ // ALog.e(TAG, "证书路径为空");
+ // return false;
+ //}
+ if (TextUtils.isEmpty(mTarget.getTaskWrapper().asFtp().getUrlEntity().keyAlias)) {
+ ALog.e(TAG, "证书别名为空");
+ return false;
+ }
+ }
+ return b;
+ }
+
+ @Override public boolean checkFilePath() {
+ String filePath = mEntity.getFilePath();
+ if (TextUtils.isEmpty(filePath)) {
+ ALog.e(TAG, "上传失败,文件路径为null");
+ return false;
+ } else if (!filePath.startsWith("/")) {
+ ALog.e(TAG, "上传失败,文件路径【" + filePath + "】不合法");
+ return false;
+ }
+
+ File file = new File(mEntity.getFilePath());
+ if (!file.exists()) {
+ ALog.e(TAG, "上传失败,文件【" + filePath + "】不存在");
+ return false;
+ }
+ if (file.isDirectory()) {
+ ALog.e(TAG, "上传失败,文件【" + filePath + "】不能是文件夹");
+ return false;
+ }
+ return true;
+ }
+
+ @Override public boolean checkUrl() {
+
+ final String url = mTarget.getTempUrl();
+ if (TextUtils.isEmpty(url)) {
+ ALog.e(TAG, "上传失败,url为null");
+ return false;
+ } else if (!url.startsWith("http") && !url.startsWith("ftp")) {
+ ALog.e(TAG, "上传失败,url【" + url + "】错误");
+ return false;
+ }
+ int index = url.indexOf("://");
+ if (index == -1) {
+ ALog.e(TAG, "上传失败,url【" + url + "】不合法");
+ return false;
+ }
+ mEntity.setUrl(url);
+ return true;
+ }
+}
diff --git a/Aria/src/main/java/com/arialyy/aria/core/upload/UploadTarget.java b/Aria/src/main/java/com/arialyy/aria/core/upload/UploadTarget.java
index 01c5f57d..c6f40c0e 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/upload/UploadTarget.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/upload/UploadTarget.java
@@ -1,100 +1,125 @@
-/*
- * 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.upload;
-
-import android.support.annotation.CheckResult;
-import android.support.annotation.NonNull;
-import com.arialyy.aria.core.common.http.HttpHeaderDelegate;
-import com.arialyy.aria.core.common.http.PostDelegate;
-import com.arialyy.aria.core.inf.AbsTaskWrapper;
-import com.arialyy.aria.core.inf.IHttpHeaderDelegate;
-import java.net.Proxy;
-import java.util.Map;
-
-/**
- * Created by lyy on 2017/2/28.
- * http 单文件上传
- */
-public class UploadTarget extends BaseNormalTarget
- implements IHttpHeaderDelegate {
- private HttpHeaderDelegate mDelegate;
-
- UploadTarget(String filePath, String targetName) {
- this.mTargetName = targetName;
- initTask(filePath);
- }
-
- private void initTask(String filePath) {
- initTarget(filePath);
-
- //http暂时不支持断点上传
- mTaskWrapper.setSupportBP(false);
- mTaskWrapper.setRequestType(AbsTaskWrapper.U_HTTP);
- mDelegate = new HttpHeaderDelegate<>(this);
- }
-
- /**
- * Post处理
- */
- public PostDelegate asPost() {
- return new PostDelegate<>(this);
- }
-
- /**
- * 设置userAgent
- */
- @CheckResult
- public UploadTarget setUserAngent(@NonNull String userAgent) {
- mTaskWrapper.asHttp().setUserAgent(userAgent);
- return this;
- }
-
- /**
- * 设置服务器需要的附件key
- *
- * @param attachment 附件key
- */
- @CheckResult
- public UploadTarget setAttachment(@NonNull String attachment) {
- mTaskWrapper.asHttp().setAttachment(attachment);
- return this;
- }
-
- /**
- * 设置上传文件类型
- *
- * @param contentType tip:multipart/form-data
- */
- @CheckResult
- public UploadTarget setContentType(String contentType) {
- mTaskWrapper.asHttp().setContentType(contentType);
- return this;
- }
-
- @CheckResult
- @Override public UploadTarget addHeader(@NonNull String key, @NonNull String value) {
- return mDelegate.addHeader(key, value);
- }
-
- @CheckResult
- @Override public UploadTarget addHeaders(Map headers) {
- return mDelegate.addHeaders(headers);
- }
-
- @Override public UploadTarget setUrlProxy(Proxy proxy) {
- return mDelegate.setUrlProxy(proxy);
- }
-}
+/*
+ * 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.upload;
+
+import android.support.annotation.CheckResult;
+import android.support.annotation.NonNull;
+import com.arialyy.aria.core.common.http.HttpHeaderDelegate;
+import com.arialyy.aria.core.common.http.PostDelegate;
+import com.arialyy.aria.core.inf.AbsTaskWrapper;
+import com.arialyy.aria.core.inf.IHttpHeaderDelegate;
+import java.net.Proxy;
+import java.util.Map;
+
+/**
+ * Created by lyy on 2017/2/28.
+ * http 单文件上传
+ */
+public class UploadTarget extends AbsUploadTarget
+ implements IHttpHeaderDelegate {
+ private HttpHeaderDelegate mHeaderDelegate;
+ private UNormalDelegate mNormalDelegate;
+
+ UploadTarget(String filePath, String targetName) {
+ mNormalDelegate = new UNormalDelegate<>(this, filePath, targetName);
+ initTask();
+ }
+
+ private void initTask() {
+ //http暂时不支持断点上传
+ getTaskWrapper().setSupportBP(false);
+ getTaskWrapper().setRequestType(AbsTaskWrapper.U_HTTP);
+ mHeaderDelegate = new HttpHeaderDelegate<>(this);
+ }
+
+ /**
+ * 设置上传路径
+ *
+ * @param tempUrl 上传路径
+ */
+ public UploadTarget setUploadUrl(String tempUrl) {
+ setTempUrl(tempUrl);
+ return this;
+ }
+
+ /**
+ * Post处理
+ */
+ public PostDelegate asPost() {
+ return new PostDelegate<>(this);
+ }
+
+ /**
+ * 设置userAgent
+ */
+ @CheckResult
+ public UploadTarget setUserAngent(@NonNull String userAgent) {
+ getTaskWrapper().asHttp().setUserAgent(userAgent);
+ return this;
+ }
+
+ /**
+ * 设置服务器需要的附件key
+ *
+ * @param attachment 附件key
+ */
+ @CheckResult
+ public UploadTarget setAttachment(@NonNull String attachment) {
+ getTaskWrapper().asHttp().setAttachment(attachment);
+ return this;
+ }
+
+ /**
+ * 设置上传文件类型
+ *
+ * @param contentType tip:multipart/form-data
+ */
+ @CheckResult
+ public UploadTarget setContentType(String contentType) {
+ getTaskWrapper().asHttp().setContentType(contentType);
+ return this;
+ }
+
+ @CheckResult
+ @Override public UploadTarget addHeader(@NonNull String key, @NonNull String value) {
+ return mHeaderDelegate.addHeader(key, value);
+ }
+
+ @CheckResult
+ @Override public UploadTarget addHeaders(Map headers) {
+ return mHeaderDelegate.addHeaders(headers);
+ }
+
+ @Override public UploadTarget setUrlProxy(Proxy proxy) {
+ return mHeaderDelegate.setUrlProxy(proxy);
+ }
+
+ @Override protected boolean checkEntity() {
+ return mNormalDelegate.checkEntity();
+ }
+
+ @Override public boolean isRunning() {
+ return mNormalDelegate.isRunning();
+ }
+
+ @Override public boolean taskExists() {
+ return mNormalDelegate.taskExists();
+ }
+
+ @Override public int getTargetType() {
+ return HTTP;
+ }
+}
diff --git a/app/src/main/java/com/arialyy/simple/core/download/HighestPriorityActivity.java b/app/src/main/java/com/arialyy/simple/core/download/HighestPriorityActivity.java
index e140abe4..a400e26d 100644
--- a/app/src/main/java/com/arialyy/simple/core/download/HighestPriorityActivity.java
+++ b/app/src/main/java/com/arialyy/simple/core/download/HighestPriorityActivity.java
@@ -1,244 +1,244 @@
-/*
- * 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.simple.core.download;
-
-import android.os.Bundle;
-import android.os.Environment;
-import android.support.v7.widget.LinearLayoutManager;
-import android.support.v7.widget.RecyclerView;
-import android.view.Menu;
-import android.view.MenuItem;
-import android.view.View;
-import android.widget.Button;
-import android.widget.TextView;
-import com.arialyy.annotations.Download;
-import com.arialyy.aria.core.Aria;
-import com.arialyy.aria.core.download.DownloadEntity;
-import com.arialyy.aria.core.download.DownloadTarget;
-import com.arialyy.aria.core.download.DownloadTask;
-import com.arialyy.aria.core.inf.AbsEntity;
-import com.arialyy.aria.core.inf.IEntity;
-import com.arialyy.frame.util.show.L;
-import com.arialyy.simple.R;
-import com.arialyy.simple.base.BaseActivity;
-import com.arialyy.simple.databinding.ActivityHighestPriorityBinding;
-import com.arialyy.simple.core.download.multi_download.DownloadAdapter;
-import com.arialyy.simple.widget.HorizontalProgressBarWithNumber;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-/**
- * Created by lyy on 2017/6/2.
- * 最高优先级任务Demo
- */
-public class HighestPriorityActivity extends BaseActivity {
- private HorizontalProgressBarWithNumber mPb;
- private Button mStart;
- private Button mStop;
- private Button mCancel;
- private TextView mSize;
- private TextView mSpeed;
- private RecyclerView mList;
-
- private String mTaskName = "光明大陆";
- private static final String DOWNLOAD_URL =
- "https://res5.d.cn/6f78ee3bcfdd033e64892a8553a95814cf5b4a62b12a76d9eb2a694905f0dc30fa5c7f728806a4ee0b3479e7b26a38707dac92b136add91191ac1219aadb4a3aa70bfa6d06d2d8db.apk";
- private DownloadAdapter mAdapter;
- private List mData = new ArrayList<>();
- private Set mRecord = new HashSet<>();
-
- @Override protected int setLayoutId() {
- return R.layout.activity_highest_priority;
- }
-
- @Override protected void init(Bundle savedInstanceState) {
- super.init(savedInstanceState);
- mPb = findViewById(R.id.progressBar);
- mStart = findViewById(R.id.start);
- mStop = findViewById(R.id.stop);
- mCancel = findViewById(R.id.cancel);
- mSize = findViewById(R.id.size);
- mSpeed = findViewById(R.id.speed);
- mList = findViewById(R.id.list);
-
- setTitle("最高优先级任务");
- getBinding().setTaskName("任务名:" + mTaskName + " (最高优先级任务)");
- initWidget();
- Aria.download(this).register();
- }
-
- private void initWidget() {
- DownloadTarget target = Aria.download(this).load(DOWNLOAD_URL);
- mPb.setProgress(target.getPercent());
- if (target.getTaskState() == IEntity.STATE_STOP) {
- mStart.setText("恢复");
- mStart.setTextColor(getResources().getColor(android.R.color.holo_blue_light));
- setBtState(true);
- } else if (target.isRunning()) {
- setBtState(false);
- }
- mSize.setText(target.getConvertFileSize());
- List temp = Aria.download(this).getTaskList();
- if (temp != null && !temp.isEmpty()) {
- for (DownloadEntity entity : temp) {
- if (entity.getUrl().equals(DOWNLOAD_URL)) continue;
- mData.add(entity);
- mRecord.add(entity.getUrl());
- }
- }
- mAdapter = new DownloadAdapter(this, mData);
- mList.setLayoutManager(new LinearLayoutManager(this));
- mList.setAdapter(mAdapter);
- }
-
- @Override public boolean onCreateOptionsMenu(Menu menu) {
- getMenuInflater().inflate(R.menu.menu_highest_priority, menu);
- return super.onCreateOptionsMenu(menu);
- }
-
- @Override public boolean onMenuItemClick(MenuItem item) {
- switch (item.getItemId()) {
- case R.id.add_task:
- List temp = getModule(DownloadModule.class).getHighestTestList();
- for (DownloadEntity entity : temp) {
- String url = entity.getUrl();
- if (mRecord.contains(url)) {
- continue;
- }
- mAdapter.addDownloadEntity(entity);
- mRecord.add(url);
- }
- mAdapter.notifyDataSetChanged();
- break;
- case R.id.help:
- String title = "最高优先级任务介绍";
- String msg = " 将任务设置为最高优先级任务,最高优先级任务有以下特点:\n"
- + " 1、在下载队列中,有且只有一个最高优先级任务\n"
- + " 2、最高优先级任务会一直存在,直到用户手动暂停或任务完成\n"
- + " 3、任务调度器不会暂停最高优先级任务\n"
- + " 4、用户手动暂停或任务完成后,第二次重新执行该任务,该命令将失效\n"
- + " 5、如果下载队列中已经满了,则会停止队尾的任务,当高优先级任务完成后,该队尾任务将自动执行\n"
- + " 6、把任务设置为最高优先级任务后,将自动执行任务,不需要重新调用start()启动任务";
- showMsgDialog(title, msg);
- break;
- }
- return true;
- }
-
- public void onClick(View view) {
- switch (view.getId()) {
- case R.id.start:
- String text = ((TextView) view).getText().toString();
- if (text.equals("重新开始?") || text.equals("开始")) {
- Aria.download(this)
- .load(DOWNLOAD_URL)
- .setDownloadPath(Environment.getExternalStorageDirectory().getPath()
- + "/Download/"
- + mTaskName
- + ".apk")
- .setHighestPriority();
- } else if (text.equals("恢复")) {
- Aria.download(this).load(DOWNLOAD_URL).resume();
- }
- break;
- case R.id.stop:
- Aria.download(this).load(DOWNLOAD_URL).pause();
- break;
- case R.id.cancel:
- Aria.download(this).load(DOWNLOAD_URL).cancel();
- break;
- }
- }
-
- /**
- * 设置start 和 stop 按钮状态
- */
- private void setBtState(boolean state) {
- mStart.setEnabled(state);
- mStop.setEnabled(!state);
- }
-
- @Download.onPre public void onPre(DownloadTask task) {
- mAdapter.updateState(task.getDownloadEntity());
- }
-
- @Download.onTaskPre public void onTaskPre(DownloadTask task) {
- if (task.getKey().equals(DOWNLOAD_URL)) {
- mSize.setText(task.getConvertFileSize());
- }
- mAdapter.updateState(task.getDownloadEntity());
- }
-
- @Download.onTaskStart public void onTaskStart(DownloadTask task) {
- if (task.getKey().equals(DOWNLOAD_URL)) {
- setBtState(false);
- }
- mAdapter.updateState(task.getDownloadEntity());
- }
-
- @Download.onTaskResume public void onTaskResume(DownloadTask task) {
- if (task.getKey().equals(DOWNLOAD_URL)) {
- setBtState(false);
- }
- mAdapter.updateState(task.getDownloadEntity());
- }
-
- @Download.onTaskStop public void onTaskStop(DownloadTask task) {
- if (task.getKey().equals(DOWNLOAD_URL)) {
- setBtState(true);
- mStart.setText("恢复");
- mStart.setTextColor(getResources().getColor(android.R.color.holo_blue_light));
- }
- mAdapter.updateState(task.getDownloadEntity());
- }
-
- @Download.onTaskCancel public void onTaskCancel(DownloadTask task) {
- if (task.getKey().equals(DOWNLOAD_URL)) {
- setBtState(true);
- mStart.setText("开始");
- mPb.setProgress(0);
- }
- mAdapter.updateState(task.getDownloadEntity());
- }
-
- @Download.onTaskFail public void onTaskFail(DownloadTask task) {
- if (task.getKey().equals(DOWNLOAD_URL)) {
- setBtState(true);
- } else {
- L.d(TAG, "download fail【" + task.getKey() + "】");
- }
- }
-
- @Download.onTaskComplete public void onTaskComplete(DownloadTask task) {
- if (task.getKey().equals(DOWNLOAD_URL)) {
- setBtState(true);
- mStart.setText("重新开始");
- mStart.setTextColor(getResources().getColor(android.R.color.holo_green_light));
- mPb.setProgress(100);
- }
- mAdapter.updateState(task.getDownloadEntity());
- }
-
- @Download.onTaskRunning public void onTaskRunning(DownloadTask task) {
- if (task.getKey().equals(DOWNLOAD_URL)) {
- mPb.setProgress(task.getPercent());
- mSpeed.setText(task.getConvertSpeed());
- }
- mAdapter.setProgress(task.getDownloadEntity());
- }
-}
+/*
+ * 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.simple.core.download;
+
+import android.os.Bundle;
+import android.os.Environment;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.View;
+import android.widget.Button;
+import android.widget.TextView;
+import com.arialyy.annotations.Download;
+import com.arialyy.aria.core.Aria;
+import com.arialyy.aria.core.download.DownloadEntity;
+import com.arialyy.aria.core.download.DownloadTarget;
+import com.arialyy.aria.core.download.DownloadTask;
+import com.arialyy.aria.core.inf.AbsEntity;
+import com.arialyy.aria.core.inf.IEntity;
+import com.arialyy.frame.util.show.L;
+import com.arialyy.simple.R;
+import com.arialyy.simple.base.BaseActivity;
+import com.arialyy.simple.databinding.ActivityHighestPriorityBinding;
+import com.arialyy.simple.core.download.multi_download.DownloadAdapter;
+import com.arialyy.simple.widget.HorizontalProgressBarWithNumber;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * Created by lyy on 2017/6/2.
+ * 最高优先级任务Demo
+ */
+public class HighestPriorityActivity extends BaseActivity {
+ private HorizontalProgressBarWithNumber mPb;
+ private Button mStart;
+ private Button mStop;
+ private Button mCancel;
+ private TextView mSize;
+ private TextView mSpeed;
+ private RecyclerView mList;
+
+ private String mTaskName = "光明大陆";
+ private static final String DOWNLOAD_URL =
+ "https://res5.d.cn/6f78ee3bcfdd033e64892a8553a95814cf5b4a62b12a76d9eb2a694905f0dc30fa5c7f728806a4ee0b3479e7b26a38707dac92b136add91191ac1219aadb4a3aa70bfa6d06d2d8db.apk";
+ private DownloadAdapter mAdapter;
+ private List mData = new ArrayList<>();
+ private Set mRecord = new HashSet<>();
+
+ @Override protected int setLayoutId() {
+ return R.layout.activity_highest_priority;
+ }
+
+ @Override protected void init(Bundle savedInstanceState) {
+ super.init(savedInstanceState);
+ mPb = findViewById(R.id.progressBar);
+ mStart = findViewById(R.id.start);
+ mStop = findViewById(R.id.stop);
+ mCancel = findViewById(R.id.cancel);
+ mSize = findViewById(R.id.size);
+ mSpeed = findViewById(R.id.speed);
+ mList = findViewById(R.id.list);
+
+ setTitle("最高优先级任务");
+ getBinding().setTaskName("任务名:" + mTaskName + " (最高优先级任务)");
+ initWidget();
+ Aria.download(this).register();
+ }
+
+ private void initWidget() {
+ DownloadTarget target = Aria.download(this).load(DOWNLOAD_URL);
+ mPb.setProgress(target.getPercent());
+ if (target.getTaskState() == IEntity.STATE_STOP) {
+ mStart.setText("恢复");
+ mStart.setTextColor(getResources().getColor(android.R.color.holo_blue_light));
+ setBtState(true);
+ } else if (target.isRunning()) {
+ setBtState(false);
+ }
+ mSize.setText(target.getConvertFileSize());
+ List temp = Aria.download(this).getTaskList();
+ if (temp != null && !temp.isEmpty()) {
+ for (DownloadEntity entity : temp) {
+ if (entity.getUrl().equals(DOWNLOAD_URL)) continue;
+ mData.add(entity);
+ mRecord.add(entity.getUrl());
+ }
+ }
+ mAdapter = new DownloadAdapter(this, mData);
+ mList.setLayoutManager(new LinearLayoutManager(this));
+ mList.setAdapter(mAdapter);
+ }
+
+ @Override public boolean onCreateOptionsMenu(Menu menu) {
+ getMenuInflater().inflate(R.menu.menu_highest_priority, menu);
+ return super.onCreateOptionsMenu(menu);
+ }
+
+ @Override public boolean onMenuItemClick(MenuItem item) {
+ switch (item.getItemId()) {
+ case R.id.add_task:
+ List temp = getModule(DownloadModule.class).getHighestTestList();
+ for (DownloadEntity entity : temp) {
+ String url = entity.getUrl();
+ if (mRecord.contains(url)) {
+ continue;
+ }
+ mAdapter.addDownloadEntity(entity);
+ mRecord.add(url);
+ }
+ mAdapter.notifyDataSetChanged();
+ break;
+ case R.id.help:
+ String title = "最高优先级任务介绍";
+ String msg = " 将任务设置为最高优先级任务,最高优先级任务有以下特点:\n"
+ + " 1、在下载队列中,有且只有一个最高优先级任务\n"
+ + " 2、最高优先级任务会一直存在,直到用户手动暂停或任务完成\n"
+ + " 3、任务调度器不会暂停最高优先级任务\n"
+ + " 4、用户手动暂停或任务完成后,第二次重新执行该任务,该命令将失效\n"
+ + " 5、如果下载队列中已经满了,则会停止队尾的任务,当高优先级任务完成后,该队尾任务将自动执行\n"
+ + " 6、把任务设置为最高优先级任务后,将自动执行任务,不需要重新调用start()启动任务";
+ showMsgDialog(title, msg);
+ break;
+ }
+ return true;
+ }
+
+ public void onClick(View view) {
+ switch (view.getId()) {
+ case R.id.start:
+ String text = ((TextView) view).getText().toString();
+ if (text.equals("重新开始?") || text.equals("开始")) {
+ Aria.download(this)
+ .load(DOWNLOAD_URL)
+ .setDownloadPath(Environment.getExternalStorageDirectory().getPath()
+ + "/Download/"
+ + mTaskName
+ + ".apk")
+ .setHighestPriority();
+ } else if (text.equals("恢复")) {
+ Aria.download(this).load(DOWNLOAD_URL).resume();
+ }
+ break;
+ case R.id.stop:
+ Aria.download(this).load(DOWNLOAD_URL).pause();
+ break;
+ case R.id.cancel:
+ Aria.download(this).load(DOWNLOAD_URL).cancel();
+ break;
+ }
+ }
+
+ /**
+ * 设置start 和 stop 按钮状态
+ */
+ private void setBtState(boolean state) {
+ mStart.setEnabled(state);
+ mStop.setEnabled(!state);
+ }
+
+ @Download.onPre public void onPre(DownloadTask task) {
+ mAdapter.updateState(task.getDownloadEntity());
+ }
+
+ @Download.onTaskPre public void onTaskPre(DownloadTask task) {
+ if (task.getKey().equals(DOWNLOAD_URL)) {
+ mSize.setText(task.getConvertFileSize());
+ }
+ mAdapter.updateState(task.getDownloadEntity());
+ }
+
+ @Download.onTaskStart public void onTaskStart(DownloadTask task) {
+ if (task.getKey().equals(DOWNLOAD_URL)) {
+ setBtState(false);
+ }
+ mAdapter.updateState(task.getDownloadEntity());
+ }
+
+ @Download.onTaskResume public void onTaskResume(DownloadTask task) {
+ if (task.getKey().equals(DOWNLOAD_URL)) {
+ setBtState(false);
+ }
+ mAdapter.updateState(task.getDownloadEntity());
+ }
+
+ @Download.onTaskStop public void onTaskStop(DownloadTask task) {
+ if (task.getKey().equals(DOWNLOAD_URL)) {
+ setBtState(true);
+ mStart.setText("恢复");
+ mStart.setTextColor(getResources().getColor(android.R.color.holo_blue_light));
+ }
+ mAdapter.updateState(task.getDownloadEntity());
+ }
+
+ @Download.onTaskCancel public void onTaskCancel(DownloadTask task) {
+ if (task.getKey().equals(DOWNLOAD_URL)) {
+ setBtState(true);
+ mStart.setText("开始");
+ mPb.setProgress(0);
+ }
+ mAdapter.updateState(task.getDownloadEntity());
+ }
+
+ @Download.onTaskFail public void onTaskFail(DownloadTask task) {
+ if (task.getKey().equals(DOWNLOAD_URL)) {
+ setBtState(true);
+ } else {
+ L.d(TAG, "download fail【" + task.getKey() + "】");
+ }
+ }
+
+ @Download.onTaskComplete public void onTaskComplete(DownloadTask task) {
+ if (task.getKey().equals(DOWNLOAD_URL)) {
+ setBtState(true);
+ mStart.setText("重新开始");
+ mStart.setTextColor(getResources().getColor(android.R.color.holo_green_light));
+ mPb.setProgress(100);
+ }
+ mAdapter.updateState(task.getDownloadEntity());
+ }
+
+ @Download.onTaskRunning public void onTaskRunning(DownloadTask task) {
+ if (task.getKey().equals(DOWNLOAD_URL)) {
+ mPb.setProgress(task.getPercent());
+ mSpeed.setText(task.getConvertSpeed());
+ }
+ mAdapter.setProgress(task.getDownloadEntity());
+ }
+}
diff --git a/app/src/main/java/com/arialyy/simple/core/upload/HttpUploadActivity.java b/app/src/main/java/com/arialyy/simple/core/upload/HttpUploadActivity.java
index 242a8106..201d9844 100644
--- a/app/src/main/java/com/arialyy/simple/core/upload/HttpUploadActivity.java
+++ b/app/src/main/java/com/arialyy/simple/core/upload/HttpUploadActivity.java
@@ -68,7 +68,7 @@ public class HttpUploadActivity extends BaseActivity {
Aria.upload(HttpUploadActivity.this).load(FILE_PATH)
.setUploadUrl(
"http://lib-test.xzxyun.com:8042/Api/upload?data={\"type\":\"1\",\"fileType\":\".apk\"}")
- //.setUploadUrl("http://192.168.1.6:8080/upload/sign_file/").setAttachment("file")
+ //.setTempUrl("http://192.168.1.6:8080/upload/sign_file/").setAttachment("file")
//.addHeader("iplanetdirectorypro", "11a09102fb934ad0bc206f9c611d7933")
.asPost()
.start();