Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
  • Loading branch information
AriaLyy committed Sep 3, 2019
2 parents 202e664 + 86c3003 commit 22c8136
Show file tree
Hide file tree
Showing 112 changed files with 1,073 additions and 716 deletions.
4 changes: 2 additions & 2 deletions Aria/src/main/java/com/arialyy/aria/core/Aria.java
Expand Up @@ -116,7 +116,7 @@ public static AriaManager get(Context context) {
+ "请参考【https://aria.laoyuyu.me/aria_doc/create/any_java.html】,参数请使用 download(this) 或 upload(this);"
+ "不要使用 download(getContext()) 或 upload(getContext())");
}
return AriaManager.getInstance(context);
return AriaManager.init(context);
}

/**
Expand All @@ -126,7 +126,7 @@ public static AriaManager get(Context context) {
* {@link #download(Object)}、{@link #upload(Object)}
*/
public static AriaManager init(Context context) {
return AriaManager.getInstance(context);
return get(context);
}

private static Context convertContext(Object obj) {
Expand Down
31 changes: 21 additions & 10 deletions Aria/src/main/java/com/arialyy/aria/core/AriaManager.java
Expand Up @@ -86,7 +86,7 @@
* activity 和其Dialog、Fragment的映射表
*/
private Map<String, List<String>> mSubClass = new ConcurrentHashMap<>();
public static Context APP;
private static Context APP;
private DownloadConfig mDConfig;
private UploadConfig mUConfig;
private AppConfig mAConfig;
Expand All @@ -96,27 +96,38 @@

private AriaManager(Context context) {
APP = context.getApplicationContext();
initDb(APP);
regAppLifeCallback(context);
initConfig();
initAria();
amendTaskState();
regNetCallBack(context);
}

public static AriaManager getInstance(Context context) {
public static AriaManager getInstance() {
if (INSTANCE == null) {
throw new NullPointerException("请使用AriaManager.init(context)初始化管理器");
}
return INSTANCE;
}

static AriaManager init(Context context) {
if (INSTANCE == null) {
synchronized (LOCK) {
if (INSTANCE == null) {
INSTANCE = new AriaManager(context);
INSTANCE.initData();
}
}
}
return INSTANCE;
}

static AriaManager getInstance() {
return INSTANCE;
private void initData() {
initDb(APP);
regAppLifeCallback(APP);
initConfig();
initAria();
amendTaskState();
regNetCallBack(APP);
}

public Context getAPP() {
return APP;
}

/**
Expand Down
7 changes: 6 additions & 1 deletion Aria/src/main/java/com/arialyy/aria/core/FtpUrlEntity.java
Expand Up @@ -94,7 +94,12 @@ public class FtpUrlEntity implements Cloneable {
* {@link ProtocolType}
*/
@ProtocolType
public String protocol;
public String protocol = ProtocolType.Default;

/**
* 安全模式 true 隐式,false 显式
*/
public boolean isImplicit = true;

/**
* 私钥别名
Expand Down
Expand Up @@ -80,7 +80,7 @@ boolean handlePopupWindowLift(PopupWindow popupWindow) {
private PopupWindow.OnDismissListener createPopupWindowListener(final PopupWindow popupWindow) {
return new PopupWindow.OnDismissListener() {
@Override public void onDismiss() {
AriaManager.getInstance(AriaManager.APP).removeReceiver(popupWindow);
AriaManager.getInstance().removeReceiver(popupWindow);
}
};
}
Expand Down Expand Up @@ -120,7 +120,7 @@ private Dialog.OnCancelListener createCancelListener() {
return new Dialog.OnCancelListener() {

@Override public void onCancel(DialogInterface dialog) {
AriaManager.getInstance(AriaManager.APP).removeReceiver(dialog);
AriaManager.getInstance().removeReceiver(dialog);
}
};
}
Expand All @@ -132,7 +132,7 @@ private Dialog.OnDismissListener createDismissListener() {
return new Dialog.OnDismissListener() {

@Override public void onDismiss(DialogInterface dialog) {
AriaManager.getInstance(AriaManager.APP).removeReceiver(dialog);
AriaManager.getInstance().removeReceiver(dialog);
}
};
}
Expand Down
Expand Up @@ -41,7 +41,7 @@ final class HighestPriorityCmd<T extends AbsTaskWrapper> extends AbsNormalCmd<T>

@Override public void executeCmd() {
if (!canExeCmd) return;
if (!NetUtils.isConnected(AriaManager.APP)){
if (!NetUtils.isConnected(AriaManager.getInstance().getAPP())){
ALog.e(TAG, "启动任务失败,网络未连接");
return;
}
Expand Down
Expand Up @@ -36,7 +36,7 @@ final class ResumeAllCmd<T extends AbsTaskWrapper> extends AbsNormalCmd<T> {
}

@Override public void executeCmd() {
if (!NetUtils.isConnected(AriaManager.APP)) {
if (!NetUtils.isConnected(AriaManager.getInstance().getAPP())) {
ALog.w(TAG, "恢复任务失败,网络未连接");
return;
}
Expand Down
Expand Up @@ -50,13 +50,13 @@ final class StartCmd<T extends AbsTaskWrapper> extends AbsNormalCmd<T> {

@Override public void executeCmd() {
if (!canExeCmd) return;
if (!NetUtils.isConnected(AriaManager.APP)) {
if (!NetUtils.isConnected(AriaManager.getInstance().getAPP())) {
ALog.e(TAG, "启动任务失败,网络未连接");
return;
}
String mod;
int maxTaskNum = mQueue.getMaxTaskNum();
AriaManager manager = AriaManager.getInstance(AriaManager.APP);
AriaManager manager = AriaManager.getInstance();
if (isDownloadCmd) {
mod = manager.getDownloadConfig().getQueueMod();
} else {
Expand Down
Expand Up @@ -16,20 +16,20 @@
package com.arialyy.aria.core.common;

import com.arialyy.aria.core.common.controller.IStartFeature;
import com.arialyy.aria.core.common.controller.StartController;
import com.arialyy.aria.core.common.controller.BuilderController;
import com.arialyy.aria.core.inf.AbsTarget;

/**
* 处理第一次下载
*/
public abstract class AbsStartTarget<TARGET extends AbsStartTarget> extends AbsTarget<TARGET>
public abstract class AbsBuilderTarget<TARGET extends AbsBuilderTarget> extends AbsTarget<TARGET>
implements IStartFeature {

private StartController mStartController;
private BuilderController mStartController;

private synchronized StartController getController() {
private synchronized BuilderController getController() {
if (mStartController == null) {
mStartController = new StartController(getTaskWrapper());
mStartController = new BuilderController(getTaskWrapper());
}
return mStartController;
}
Expand Down
Expand Up @@ -89,7 +89,7 @@ protected AbsThreadTask(SubThreadConfig<TASK_WRAPPER> config) {
mEntity = mTaskWrapper.getEntity();
mLastSaveTime = System.currentTimeMillis();
mConfigThreadPool = Executors.newCachedThreadPool();
mAridManager = AriaManager.getInstance(AriaManager.APP);
mAridManager = AriaManager.getInstance();
if (getMaxSpeed() > 0) {
mSpeedBandUtil = new BandwidthLimiter(getMaxSpeed(), config.startThreadNum);
}
Expand Down Expand Up @@ -375,13 +375,14 @@ protected void fail(final long subCurrentLocation, BaseException ex, boolean nee
* 重试ts分片
*/
private void retryM3U8Peer(boolean needRetry) {
boolean isConnected = NetUtils.isConnected(AriaManager.APP);
boolean isConnected = NetUtils.isConnected(AriaManager.getInstance().getAPP());
if (!isConnected && !isNotNetRetry) {
ALog.w(TAG, String.format("ts切片【%s】重试失败,网络未连接", getFileName()));
sendFailMsg(null);
return;
}
if (mFailTimes < RETRY_NUM && needRetry && (NetUtils.isConnected(AriaManager.APP)
if (mFailTimes < RETRY_NUM && needRetry && (NetUtils.isConnected(
AriaManager.getInstance().getAPP())
|| isNotNetRetry) && !isBreak()) {
ALog.w(TAG, String.format("ts切片【%s】正在重试", getFileName()));
mFailTimes++;
Expand All @@ -399,12 +400,13 @@ private void retryM3U8Peer(boolean needRetry) {
* @param needRetry 是否可以重试
*/
private void retryBlockTask(boolean needRetry) {
if (!NetUtils.isConnected(AriaManager.APP) && !isNotNetRetry) {
if (!NetUtils.isConnected(AriaManager.getInstance().getAPP()) && !isNotNetRetry) {
ALog.w(TAG, String.format("分块【%s】重试失败,网络未连接", getFileName()));
sendFailMsg(null);
return;
}
if (mFailTimes < RETRY_NUM && needRetry && (NetUtils.isConnected(AriaManager.APP)
if (mFailTimes < RETRY_NUM && needRetry && (NetUtils.isConnected(
AriaManager.getInstance().getAPP())
|| isNotNetRetry) && !isBreak()) {
ALog.w(TAG, String.format("分块【%s】正在重试", getFileName()));
mFailTimes++;
Expand Down
Expand Up @@ -39,10 +39,10 @@ protected AbsTaskWrapper getTaskWrapper() {

/**
* 使用对应等控制器,注意:
* 1、对于不存在的任务(第一次下载),只能使用{@link ControllerType#START_CONTROLLER}
* 2、对于已存在的任务,只能使用{@link ControllerType#NORMAL_CONTROLLER}
* 1、对于不存在的任务(第一次下载),只能使用{@link ControllerType#CREATE_CONTROLLER}
* 2、对于已存在的任务,只能使用{@link ControllerType#TASK_CONTROLLER}
*
* @param clazz {@link ControllerType#START_CONTROLLER}、{@link ControllerType#NORMAL_CONTROLLER}
* @param clazz {@link ControllerType#CREATE_CONTROLLER}、{@link ControllerType#TASK_CONTROLLER}
*/
@CheckResult(suggest = Suggest.TASK_CONTROLLER)
public synchronized <T extends FeatureController> T controller(@ControllerType Class<T> clazz) {
Expand Down
Expand Up @@ -21,11 +21,11 @@
import com.arialyy.aria.util.CommonUtil;

/**
* 启动控制器
* 创建任务时使用的控制器
*/
public final class StartController extends FeatureController implements IStartFeature {
public final class BuilderController extends FeatureController implements IStartFeature {

public StartController(AbsTaskWrapper wrapper) {
public BuilderController(AbsTaskWrapper wrapper) {
super(wrapper);
}

Expand Down
Expand Up @@ -22,9 +22,9 @@
/**
* 仅用于第一次创建任务,后续可调用`#create()、#add()、#setHighestPriority()`方法。
*/
Class<StartController> START_CONTROLLER = StartController.class;
Class<BuilderController> CREATE_CONTROLLER = BuilderController.class;
/**
* 用于后续的任务控制,后续可调用`#stop()、#resume()、#cancel()、#cancel(boolean)、#retry()、#restart()`方法。
*/
Class<NormalController> NORMAL_CONTROLLER = NormalController.class;
Class<NormalController> TASK_CONTROLLER = NormalController.class;
}
Expand Up @@ -15,8 +15,11 @@
*/
package com.arialyy.aria.core.common.controller;

import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Handler;
import android.os.Looper;
import com.arialyy.aria.core.AriaManager;
import com.arialyy.aria.core.download.CheckDEntityUtil;
import com.arialyy.aria.core.download.CheckDGEntityUtil;
import com.arialyy.aria.core.download.CheckFtpDirEntityUtil;
Expand All @@ -27,42 +30,44 @@
import com.arialyy.aria.core.inf.ICheckEntityUtil;
import com.arialyy.aria.core.inf.ITask;
import com.arialyy.aria.core.inf.ITaskWrapper;
import com.arialyy.aria.core.scheduler.DownloadGroupSchedulers;
import com.arialyy.aria.core.scheduler.DownloadSchedulers;
import com.arialyy.aria.core.scheduler.ISchedulers;
import com.arialyy.aria.core.scheduler.UploadSchedulers;
import com.arialyy.aria.core.scheduler.TaskSchedulers;
import com.arialyy.aria.core.upload.CheckUEntityUtil;
import com.arialyy.aria.core.upload.UTaskWrapper;
import com.arialyy.aria.util.ALog;
import com.arialyy.aria.util.CommonUtil;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

/**
* 功能控制器
*/
public abstract class FeatureController {
private final String TAG;

private AbsTaskWrapper mTaskWrapper;

FeatureController(AbsTaskWrapper wrapper) {
mTaskWrapper = wrapper;
TAG = CommonUtil.getClassName(getClass());
}

/**
* 使用对应等控制器,注意:
* 1、对于不存在的任务(第一次下载),只能使用{@link ControllerType#START_CONTROLLER}
* 2、对于已存在的任务,只能使用{@link ControllerType#NORMAL_CONTROLLER}
* 1、对于不存在的任务(第一次下载),只能使用{@link ControllerType#CREATE_CONTROLLER}
* 2、对于已存在的任务,只能使用{@link ControllerType#TASK_CONTROLLER}
*
* @param clazz {@link ControllerType#START_CONTROLLER}、{@link ControllerType#NORMAL_CONTROLLER}
* @param clazz {@link ControllerType#CREATE_CONTROLLER}、{@link ControllerType#TASK_CONTROLLER}
*/
public static <T extends FeatureController> T newInstance(@ControllerType Class<T> clazz,
AbsTaskWrapper wrapper) {
if (wrapper.getEntity().getId() == -1 && clazz != ControllerType.START_CONTROLLER) {
throw new IllegalArgumentException("对于不存在的任务(第一次下载),只能使用\"ControllerType.START_CONTROLLER\"");
if (wrapper.getEntity().getId() == -1 && clazz != ControllerType.CREATE_CONTROLLER) {
throw new IllegalArgumentException(
"对于不存在的任务(第一次下载),只能使用\"ControllerType.CREATE_CONTROLLER\"");
}
if (wrapper.getEntity().getId() != -1 && clazz != ControllerType.NORMAL_CONTROLLER) {
if (wrapper.getEntity().getId() != -1 && clazz != ControllerType.TASK_CONTROLLER) {
throw new IllegalArgumentException(
"对于已存在的任务,只能使用\" ControllerType.NORMAL_CONTROLLER\",请检查是否重复调用#create()方法");
"对于已存在的任务,只能使用\" ControllerType.TASK_CONTROLLER\",请检查是否重复调用#create()方法");
}

Class[] paramTypes = { AbsTaskWrapper.class };
Expand Down Expand Up @@ -106,8 +111,11 @@ int checkTaskType() {
* 如果检查实体失败,将错误回调
*/
boolean checkConfig() {
if (!checkPermission()) {
return false;
}
boolean b = checkEntity();
ISchedulers schedulers = getScheduler();
TaskSchedulers schedulers = TaskSchedulers.getInstance();
if (!b && schedulers != null) {
new Handler(Looper.getMainLooper(), schedulers).obtainMessage(ISchedulers.CHECK_FAIL,
checkTaskType(), -1, null).sendToTarget();
Expand All @@ -116,17 +124,39 @@ boolean checkConfig() {
return b;
}

private ISchedulers getScheduler() {
if (mTaskWrapper instanceof DTaskWrapper) {
return DownloadSchedulers.getInstance();
/**
* 检查权限,需要的权限有
* {@link Manifest.permission#WRITE_EXTERNAL_STORAGE}
* {@link Manifest.permission#READ_EXTERNAL_STORAGE}
* {@link Manifest.permission#INTERNET}
*
* @return {@code false} 缺少权限
*/
private boolean checkPermission() {

if (AriaManager.getInstance()
.getAPP()
.checkCallingOrSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
ALog.e(TAG, "启动失败,缺少权限:Manifest.permission.WRITE_EXTERNAL_STORAGE");
return false;
}
if (mTaskWrapper instanceof UTaskWrapper) {
return UploadSchedulers.getInstance();
if (AriaManager.getInstance()
.getAPP()
.checkCallingOrSelfPermission(Manifest.permission.INTERNET)
!= PackageManager.PERMISSION_GRANTED) {
ALog.e(TAG, "启动失败,缺少权限:Manifest.permission.INTERNET");
return false;
}
if (mTaskWrapper instanceof DGTaskWrapper) {
return DownloadGroupSchedulers.getInstance();
if (AriaManager.getInstance()
.getAPP()
.checkCallingOrSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
ALog.e(TAG, "启动失败,缺少权限:Manifest.permission.READ_EXTERNAL_STORAGE");
return false;
}
return null;

return true;
}

private boolean checkEntity() {
Expand Down

0 comments on commit 22c8136

Please sign in to comment.