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