parent
							
								
									598c863559
								
							
						
					
					
						commit
						30c41e4cb2
					
				| @ -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 <a href="https://github.com/AriaLyy/Aria">Aria</a> | ||||
|  * @see <a href="https://aria.laoyuyu.me/aria_doc/">Aria doc</a> | ||||
|  * Aria启动,管理全局任务 | ||||
|  * <pre> | ||||
|  *   <code> | ||||
|  *   //下载
 | ||||
|  *   Aria.download(this) | ||||
|  *       .load(URL)     //下载地址,必填
 | ||||
|  *       //文件保存路径,必填
 | ||||
|  *       .setDownloadPath(Environment.getExternalStorageDirectory().getPath() + "/test.apk") | ||||
|  *       .start(); | ||||
|  *   </code> | ||||
|  *   <code> | ||||
|  *    //上传
 | ||||
|  *    Aria.upload(this) | ||||
|  *        .load(filePath)     //文件路径,必填
 | ||||
|  *        .setUploadUrl(uploadUrl)  //上传路径,必填
 | ||||
|  *        .setAttachment(fileKey)   //服务器读取文件的key,必填
 | ||||
|  *        .start(); | ||||
|  *   </code> | ||||
|  * </pre> | ||||
|  * | ||||
|  * 如果你需要在【Activity、Service、Application、DialogFragment、Fragment、PopupWindow、Dialog】 | ||||
|  * 之外的java中使用Aria,那么你应该在Application或Activity初始化的时候调用{@link #init(Context)}对Aria进行初始化 | ||||
|  * 然后才能使用{@link #download(Object)}、{@link #upload(Object)} | ||||
|  * | ||||
|  * <pre> | ||||
|  *   <code> | ||||
|  *       Aria.init(this); | ||||
|  * | ||||
|  *      Aria.download(this) | ||||
|  *       .load(URL)     //下载地址,必填
 | ||||
|  *       //文件保存路径,必填
 | ||||
|  *       .setDownloadPath(Environment.getExternalStorageDirectory().getPath() + "/test.apk") | ||||
|  *       .start(); | ||||
|  * | ||||
|  *   </code> | ||||
|  * | ||||
|  * </pre> | ||||
|  */ | ||||
| @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 <a href="https://github.com/AriaLyy/Aria">Aria</a> | ||||
|  * @see <a href="https://aria.laoyuyu.me/aria_doc/">Aria doc</a> | ||||
|  * Aria启动,管理全局任务 | ||||
|  * <pre> | ||||
|  *   <code> | ||||
|  *   //下载
 | ||||
|  *   Aria.download(this) | ||||
|  *       .load(URL)     //下载地址,必填
 | ||||
|  *       //文件保存路径,必填
 | ||||
|  *       .setDownloadPath(Environment.getExternalStorageDirectory().getPath() + "/test.apk") | ||||
|  *       .start(); | ||||
|  *   </code> | ||||
|  *   <code> | ||||
|  *    //上传
 | ||||
|  *    Aria.upload(this) | ||||
|  *        .load(filePath)     //文件路径,必填
 | ||||
|  *        .setTempUrl(uploadUrl)  //上传路径,必填
 | ||||
|  *        .setAttachment(fileKey)   //服务器读取文件的key,必填
 | ||||
|  *        .start(); | ||||
|  *   </code> | ||||
|  * </pre> | ||||
|  * | ||||
|  * 如果你需要在【Activity、Service、Application、DialogFragment、Fragment、PopupWindow、Dialog】 | ||||
|  * 之外的java中使用Aria,那么你应该在Application或Activity初始化的时候调用{@link #init(Context)}对Aria进行初始化 | ||||
|  * 然后才能使用{@link #download(Object)}、{@link #upload(Object)} | ||||
|  * | ||||
|  * <pre> | ||||
|  *   <code> | ||||
|  *       Aria.init(this); | ||||
|  * | ||||
|  *      Aria.download(this) | ||||
|  *       .load(URL)     //下载地址,必填
 | ||||
|  *       //文件保存路径,必填
 | ||||
|  *       .setDownloadPath(Environment.getExternalStorageDirectory().getPath() + "/test.apk") | ||||
|  *       .start(); | ||||
|  * | ||||
|  *   </code> | ||||
|  * | ||||
|  * </pre> | ||||
|  */ | ||||
| @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; | ||||
|   } | ||||
| } | ||||
|  | ||||
| @ -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<TARGET extends AbsTarget> 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<TARGET extends AbsTarget> 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(); | ||||
|   } | ||||
| } | ||||
|  | ||||
| @ -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; | ||||
|   } | ||||
| } | ||||
|  | ||||
| @ -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 <TARGET> | ||||
|  */ | ||||
| class HttpDelegate<TARGET extends AbsTarget> implements ITarget { | ||||
|   private static final String TAG = "PostDelegate"; | ||||
|   TARGET mTarget; | ||||
| 
 | ||||
|   HttpDelegate(TARGET target) { | ||||
|     mTarget = target; | ||||
|   } | ||||
| 
 | ||||
|   public TARGET setParams(Map<String, String> 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<String, String> 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 <TARGET> | ||||
|  */ | ||||
| class HttpDelegate<TARGET extends AbsTarget> implements ITargetHandler { | ||||
|   private static final String TAG = "PostDelegate"; | ||||
|   TARGET mTarget; | ||||
| 
 | ||||
|   HttpDelegate(TARGET target) { | ||||
|     mTarget = target; | ||||
|   } | ||||
| 
 | ||||
|   public TARGET setParams(Map<String, String> 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<String, String> 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(); | ||||
|   } | ||||
| } | ||||
|  | ||||
| @ -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<String, String> params; | ||||
| 
 | ||||
|   /** | ||||
|    * http 请求头 | ||||
|    */ | ||||
|   private Map<String, String> 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<String, String> formFields = new HashMap<>(); | ||||
| 
 | ||||
|   public Map<String, String> getFormFields() { | ||||
|     return formFields; | ||||
|   } | ||||
| 
 | ||||
|   public void setFormFields(Map<String, String> 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<String, String> getHeaders() { | ||||
|     return headers; | ||||
|   } | ||||
| 
 | ||||
|   public void setHeaders(Map<String, String> 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<String, String> getParams() { | ||||
|     return params; | ||||
|   } | ||||
| 
 | ||||
|   public void setParams(Map<String, String> 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<String, String> params; | ||||
| 
 | ||||
|   /** | ||||
|    * http 请求头 | ||||
|    */ | ||||
|   private Map<String, String> 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<String, String> formFields = new HashMap<>(); | ||||
| 
 | ||||
|   public Map<String, String> getFormFields() { | ||||
|     return formFields; | ||||
|   } | ||||
| 
 | ||||
|   public void setFormFields(Map<String, String> 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<String, String> getHeaders() { | ||||
|     return headers; | ||||
|   } | ||||
| 
 | ||||
|   public void setHeaders(Map<String, String> 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<String, String> getParams() { | ||||
|     return params; | ||||
|   } | ||||
| 
 | ||||
|   public void setParams(Map<String, String> params) { | ||||
|     this.params = params; | ||||
|   } | ||||
| } | ||||
|  | ||||
| @ -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<TARGET extends AbsTarget, ENTITY extends AbsEntity, TASK_ENTITY extends AbsTaskWrapper> | ||||
|     extends AbsTarget<TARGET, ENTITY, TASK_ENTITY> { | ||||
| 
 | ||||
|   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<TARGET extends AbsDownloadTarget> | ||||
|     extends AbsTarget<TARGET, DownloadEntity, DTaskWrapper> { | ||||
| 
 | ||||
|   /** | ||||
|    * 设置的文件保存路径的临时变量 | ||||
|    */ | ||||
|   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(); | ||||
|   } | ||||
| } | ||||
|  | ||||
| @ -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<TARGET extends BaseNormalTarget> | ||||
|     extends AbsDownloadTarget<TARGET, DownloadEntity, DTaskWrapper> { | ||||
| 
 | ||||
|   /** | ||||
|    * 资源地址 | ||||
|    */ | ||||
|   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<TARGET extends BaseNormalTarget>
 | ||||
| //    extends AbsDownloadTarget<TARGET, DownloadEntity, DTaskWrapper> {
 | ||||
| //
 | ||||
| //  /**
 | ||||
| //   * 通过地址初始化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;
 | ||||
| //  }
 | ||||
| //}
 | ||||
|  | ||||
| @ -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<TARGET extends AbsDownloadTarget> implements ITargetNormal<TARGET> { | ||||
|   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; | ||||
|   } | ||||
| } | ||||
| @ -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<DownloadGroupTarget> implements | ||||
|     IHttpHeaderDelegate<DownloadGroupTarget> { | ||||
|   private HttpHeaderDelegate<DownloadGroupTarget> mDelegate; | ||||
|   /** | ||||
|    * 子任务下载地址, | ||||
|    */ | ||||
|   private List<String> mUrls = new ArrayList<>(); | ||||
| 
 | ||||
|   /** | ||||
|    * 子任务文件名 | ||||
|    */ | ||||
|   private List<String> 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<String> 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<String> 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<String> urls) { | ||||
|     mUrls.clear(); | ||||
|     mUrls.addAll(urls); | ||||
|     return this; | ||||
|   } | ||||
| 
 | ||||
|   /** | ||||
|    * 设置子任务文件名,该方法必须在{@link #setDirPath(String)}之后调用,否则不生效 | ||||
|    * | ||||
|    * @deprecated {@link #setSubFileName(List)} 请使用该api | ||||
|    */ | ||||
|   @CheckResult | ||||
|   @Deprecated public DownloadGroupTarget setSubTaskFileName(List<String> subTaskFileName) { | ||||
|     return setSubFileName(subTaskFileName); | ||||
|   } | ||||
| 
 | ||||
|   /** | ||||
|    * 设置子任务文件名,该方法必须在{@link #setDirPath(String)}之后调用,否则不生效 | ||||
|    */ | ||||
|   @CheckResult | ||||
|   public DownloadGroupTarget setSubFileName(List<String> 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<DTaskWrapper> 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<Integer> 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<String, String> 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<DownloadGroupTarget> implements | ||||
|     IHttpHeaderDelegate<DownloadGroupTarget> { | ||||
|   private HttpHeaderDelegate<DownloadGroupTarget> mDelegate; | ||||
|   /** | ||||
|    * 子任务下载地址, | ||||
|    */ | ||||
|   private List<String> mUrls = new ArrayList<>(); | ||||
| 
 | ||||
|   /** | ||||
|    * 子任务文件名 | ||||
|    */ | ||||
|   private List<String> 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<String> 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<String> 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<String> urls) { | ||||
|     mUrls.clear(); | ||||
|     mUrls.addAll(urls); | ||||
|     return this; | ||||
|   } | ||||
| 
 | ||||
|   /** | ||||
|    * 设置子任务文件名,该方法必须在{@link #setDirPath(String)}之后调用,否则不生效 | ||||
|    * | ||||
|    * @deprecated {@link #setSubFileName(List)} 请使用该api | ||||
|    */ | ||||
|   @CheckResult | ||||
|   @Deprecated public DownloadGroupTarget setSubTaskFileName(List<String> subTaskFileName) { | ||||
|     return setSubFileName(subTaskFileName); | ||||
|   } | ||||
| 
 | ||||
|   /** | ||||
|    * 设置子任务文件名,该方法必须在{@link #setDirPath(String)}之后调用,否则不生效 | ||||
|    */ | ||||
|   @CheckResult | ||||
|   public DownloadGroupTarget setSubFileName(List<String> 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<DTaskWrapper> 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<Integer> 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<String, String> 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); | ||||
|   } | ||||
| } | ||||
|  | ||||
| @ -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<DownloadTarget> | ||||
|     implements IHttpHeaderDelegate<DownloadTarget> { | ||||
|   private HttpHeaderDelegate<DownloadTarget> 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<String, String> 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<DownloadTarget> | ||||
|     implements IHttpHeaderDelegate<DownloadTarget> { | ||||
|   private HttpHeaderDelegate<DownloadTarget> mHeaderDelegate; | ||||
|   private DNormalDelegate<DownloadTarget> 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<String, String> 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(); | ||||
|   } | ||||
| } | ||||
|  | ||||
| @ -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<FtpDirDownloadTarget> | ||||
|     implements IFtpTarget<FtpDirDownloadTarget> { | ||||
|   private FtpDelegate<FtpDirDownloadTarget> 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<FtpDirDownloadTarget> 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<FtpDirDownloadTarget> | ||||
|     implements IFtpTarget<FtpDirDownloadTarget> { | ||||
|   private FtpDelegate<FtpDirDownloadTarget> 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<FtpDirDownloadTarget> 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); | ||||
|   } | ||||
| } | ||||
|  | ||||
| @ -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<FtpDownloadTarget> | ||||
|     implements IFtpTarget<FtpDownloadTarget> { | ||||
|   private FtpDelegate<FtpDownloadTarget> 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<FtpDownloadTarget> 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<FtpDownloadTarget> | ||||
|     implements IFtpTarget<FtpDownloadTarget> { | ||||
|   private FtpDelegate<FtpDownloadTarget> mFtpDelegate; | ||||
|   private DNormalDelegate<FtpDownloadTarget> 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<FtpDownloadTarget> 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); | ||||
|   } | ||||
| } | ||||
|  | ||||
| @ -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<TARGET extends AbsTarget, ENTITY extends AbsEntity, TASK_WRAPPER extends AbsTaskWrapper> | ||||
|     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<ICmd> 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<TARGET extends AbsTarget, ENTITY extends AbsEntity, TASK_WRAPPER extends AbsTaskWrapper> | ||||
|     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<ICmd> 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(); | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
| @ -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<TARGET extends ITarget> { | ||||
|   /** | ||||
|    * 设置字符编码 | ||||
|    */ | ||||
|   @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<TARGET extends ITargetHandler> { | ||||
|   /** | ||||
|    * 设置字符编码 | ||||
|    */ | ||||
|   @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); | ||||
| } | ||||
|  | ||||
| @ -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<TARGET extends ITarget> { | ||||
| 
 | ||||
|   /** | ||||
|    * 给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<String, String> 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<TARGET extends ITargetHandler> { | ||||
| 
 | ||||
|   /** | ||||
|    * 给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<String, String> headers); | ||||
| 
 | ||||
|   @CheckResult | ||||
|   TARGET setUrlProxy(Proxy proxy); | ||||
| } | ||||
|  | ||||
| @ -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(); | ||||
| } | ||||
| @ -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 { | ||||
| 
 | ||||
| } | ||||
| @ -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 extends AbsTarget> { | ||||
| 
 | ||||
|   /** | ||||
|    * 通过地址初始化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(); | ||||
| } | ||||
| @ -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<TASK_WRAPPER extends AbsTaskWrapper> { | ||||
| 
 | ||||
|   /** | ||||
|    * 普通下载任务 | ||||
|    */ | ||||
|   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<TASK_WRAPPER extends AbsTaskWrapper> { | ||||
| 
 | ||||
|   /** | ||||
|    * 普通下载任务 | ||||
|    */ | ||||
|   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(); | ||||
| } | ||||
|  | ||||
| @ -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<TARGET extends AbsUploadTarget, ENTITY extends AbsEntity, TASK_ENTITY extends AbsTaskWrapper> | ||||
|     extends AbsTarget<TARGET, ENTITY, TASK_ENTITY> { | ||||
| 
 | ||||
| } | ||||
| /* | ||||
|  * 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<TARGET extends AbsUploadTarget> | ||||
|     extends AbsTarget<TARGET, UploadEntity, UTaskWrapper> { | ||||
| 
 | ||||
|   /** | ||||
|    * 上传路径 | ||||
|    */ | ||||
|   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; | ||||
|   } | ||||
| } | ||||
|  | ||||
| @ -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<TARGET extends AbsUploadTarget> | ||||
|     extends AbsUploadTarget<TARGET, UploadEntity, UTaskWrapper> { | ||||
| 
 | ||||
|   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<TARGET extends AbsUploadTarget>
 | ||||
| //    extends AbsUploadTarget<TARGET, UploadEntity, UTaskWrapper> {
 | ||||
| //
 | ||||
| //  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;
 | ||||
| //  }
 | ||||
| //}
 | ||||
|  | ||||
| @ -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<FtpUploadTarget> | ||||
|     implements IFtpTarget<FtpUploadTarget> { | ||||
|   private FtpDelegate<FtpUploadTarget> 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<FtpUploadTarget> 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<FtpUploadTarget> | ||||
|     implements IFtpTarget<FtpUploadTarget> { | ||||
|   private FtpDelegate<FtpUploadTarget> mFtpDelegate; | ||||
|   private UNormalDelegate<FtpUploadTarget> 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<FtpUploadTarget> 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; | ||||
|   } | ||||
| } | ||||
|  | ||||
| @ -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<TARGET extends AbsUploadTarget> implements ITargetNormal<TARGET> { | ||||
|   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; | ||||
|   } | ||||
| } | ||||
| @ -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<UploadTarget> | ||||
|     implements IHttpHeaderDelegate<UploadTarget> { | ||||
|   private HttpHeaderDelegate<UploadTarget> 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<String, String> 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<UploadTarget> | ||||
|     implements IHttpHeaderDelegate<UploadTarget> { | ||||
|   private HttpHeaderDelegate<UploadTarget> mHeaderDelegate; | ||||
|   private UNormalDelegate<UploadTarget> 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<String, String> 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; | ||||
|   } | ||||
| } | ||||
|  | ||||
| @ -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<ActivityHighestPriorityBinding> { | ||||
|   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<AbsEntity> mData = new ArrayList<>(); | ||||
|   private Set<String> 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<DownloadEntity> 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<DownloadEntity> 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<ActivityHighestPriorityBinding> { | ||||
|   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<AbsEntity> mData = new ArrayList<>(); | ||||
|   private Set<String> 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<DownloadEntity> 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<DownloadEntity> 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()); | ||||
|   } | ||||
| } | ||||
|  | ||||
					Loading…
					
					
				
		Reference in new issue