From b7b55e42fc724ce984b50dffab250f45592dad62 Mon Sep 17 00:00:00 2001
From: AriaLyy <511455842@qq.com>
Date: Tue, 15 Aug 2017 10:41:20 +0800
Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=88=B7=E6=96=B0=E9=93=BE?=
 =?UTF-8?q?=E6=8E=A5=E4=BF=A1=E6=81=AF=E7=9A=84api=20https://github.com/Ar?=
 =?UTF-8?q?iaLyy/Aria/issues/89#issuecomment-322193785?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../aria/core/download/DownloadReceiver.java  | 44 ++++++++++++++++---
 .../aria/core/download/DownloadTarget.java    | 10 +++++
 .../aria/core/download/FtpDownloadTarget.java |  5 +++
 .../download/downloader/AbsFtpInfoThread.java |  4 +-
 .../core/download/downloader/Downloader.java  | 15 ++++---
 .../download/downloader/FtpDirInfoThread.java |  2 -
 .../downloader/FtpFileInfoThread.java         |  8 ++++
 .../downloader/HttpFileInfoThread.java        |  8 ++--
 .../downloader/SimpleDownloadUtil.java        |  4 +-
 .../arialyy/aria/core/inf/AbsTaskEntity.java  | 10 +++++
 app/src/main/assets/aria_config.xml           |  5 ++-
 .../simple/download/FtpDownloadActivity.java  |  2 +-
 .../simple/download/SingleTaskActivity.java   |  2 +-
 .../group/FTPDirDownloadActivity.java         |  2 +-
 .../com/arialyy/aria/core/Configuration.java  |  2 +-
 15 files changed, 96 insertions(+), 27 deletions(-)

diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/DownloadReceiver.java b/Aria/src/main/java/com/arialyy/aria/core/download/DownloadReceiver.java
index 90088d3f..886fcb68 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/download/DownloadReceiver.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/download/DownloadReceiver.java
@@ -16,16 +16,14 @@
 package com.arialyy.aria.core.download;
 
 import android.support.annotation.NonNull;
-import com.arialyy.aria.core.Aria;
 import com.arialyy.aria.core.AriaManager;
+import com.arialyy.aria.core.command.normal.NormalCmdFactory;
+import com.arialyy.aria.core.common.ProxyHelper;
 import com.arialyy.aria.core.inf.AbsEntity;
 import com.arialyy.aria.core.inf.AbsReceiver;
-import com.arialyy.aria.core.inf.IReceiver;
-import com.arialyy.aria.core.command.normal.NormalCmdFactory;
 import com.arialyy.aria.core.scheduler.DownloadGroupSchedulers;
 import com.arialyy.aria.core.scheduler.DownloadSchedulers;
 import com.arialyy.aria.core.scheduler.ISchedulerListener;
-import com.arialyy.aria.core.common.ProxyHelper;
 import com.arialyy.aria.orm.DbEntity;
 import com.arialyy.aria.util.CheckUtil;
 import com.arialyy.aria.util.CommonUtil;
@@ -53,17 +51,40 @@ public class DownloadReceiver extends AbsReceiver {
 
   /**
    * 使用下载实体执行下载操作
+   *
+   * @param entity 下载实体
    */
   public DownloadTarget load(DownloadEntity entity) {
-    return new DownloadTarget(entity, targetName);
+    return load(entity, false);
+  }
+
+  /**
+   * 使用下载实体执行下载操作
+   *
+   * @param refreshInfo 是否刷新下载信息
+   */
+  public DownloadTarget load(DownloadEntity entity, boolean refreshInfo) {
+    return new DownloadTarget(entity, targetName, refreshInfo);
   }
 
   /**
    * 加载Http、https单任务下载地址
+   *
+   * @param url 下载地址
    */
   public DownloadTarget load(@NonNull String url) {
+    return load(url, false);
+  }
+
+  /**
+   * 加载Http、https单任务下载地址
+   *
+   * @param url 下载地址
+   * @param refreshInfo 是否刷新下载信息
+   */
+  public DownloadTarget load(@NonNull String url, boolean refreshInfo) {
     CheckUtil.checkDownloadUrl(url);
-    return new DownloadTarget(url, targetName);
+    return new DownloadTarget(url, targetName, refreshInfo);
   }
 
   /**
@@ -78,8 +99,17 @@ public class DownloadReceiver extends AbsReceiver {
    * 加载ftp单任务下载地址
    */
   public FtpDownloadTarget loadFtp(@NonNull String url) {
+    return loadFtp(url, false);
+  }
+
+  /**
+   * 加载ftp单任务下载地址
+   *
+   * @param refreshInfo 是否刷新下载信息
+   */
+  public FtpDownloadTarget loadFtp(@NonNull String url, boolean refreshInfo) {
     CheckUtil.checkDownloadUrl(url);
-    return new FtpDownloadTarget(url, targetName);
+    return new FtpDownloadTarget(url, targetName, refreshInfo);
   }
 
   /**
diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/DownloadTarget.java b/Aria/src/main/java/com/arialyy/aria/core/download/DownloadTarget.java
index 6303a43b..1c527810 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/download/DownloadTarget.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/download/DownloadTarget.java
@@ -33,16 +33,26 @@ public class DownloadTarget
   protected String url;
 
   DownloadTarget(DownloadEntity entity, String targetName) {
+    this(entity, targetName, false);
+  }
+
+  DownloadTarget(DownloadEntity entity, String targetName, boolean refreshInfo) {
     this.url = entity.getUrl();
     mTargetName = targetName;
     initTask(entity);
+    mTaskEntity.refreshInfo = refreshInfo;
   }
 
   DownloadTarget(String url, String targetName) {
+    this(url, targetName, false);
+  }
+
+  DownloadTarget(String url, String targetName, boolean refreshInfo) {
     this.url = url;
     mTargetName = targetName;
     DownloadEntity entity = getEntity(url);
     initTask(entity);
+    mTaskEntity.refreshInfo = refreshInfo;
   }
 
   private void initTask(DownloadEntity entity) {
diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/FtpDownloadTarget.java b/Aria/src/main/java/com/arialyy/aria/core/download/FtpDownloadTarget.java
index b7dea7cc..210528d5 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/download/FtpDownloadTarget.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/download/FtpDownloadTarget.java
@@ -32,6 +32,10 @@ public class FtpDownloadTarget extends DownloadTarget {
   private int port;
 
   FtpDownloadTarget(String url, String targetName) {
+    this(url, targetName, false);
+  }
+
+  FtpDownloadTarget(String url, String targetName, boolean refreshInfo) {
     super(url, targetName);
     String[] pp = url.split("/")[2].split(":");
     this.serverIp = pp[0];
@@ -45,6 +49,7 @@ public class FtpDownloadTarget extends DownloadTarget {
     mTaskEntity.serverIp = serverIp;
     mTaskEntity.port = port;
     mEntity.setFileName(url.substring(lastIndex + 1, url.length()));
+    mTaskEntity.refreshInfo = refreshInfo;
   }
 
   /**
diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/AbsFtpInfoThread.java b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/AbsFtpInfoThread.java
index b20909c7..20e9a834 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/AbsFtpInfoThread.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/AbsFtpInfoThread.java
@@ -40,6 +40,7 @@ abstract class AbsFtpInfoThread<ENTITY extends AbsEntity, TASK_ENTITY extends Ab
   protected TASK_ENTITY mTaskEntity;
   private int mConnectTimeOut;
   private OnFileInfoCallback mCallback;
+  protected long mSize = 0;
 
   AbsFtpInfoThread(TASK_ENTITY taskEntity, OnFileInfoCallback callback) {
     mTaskEntity = taskEntity;
@@ -82,8 +83,7 @@ abstract class AbsFtpInfoThread<ENTITY extends AbsEntity, TASK_ENTITY extends Ab
       client.setFileType(FTP.BINARY_FILE_TYPE);
       FTPFile[] files =
           client.listFiles(new String(remotePath.getBytes(charSet), AbsThreadTask.SERVER_CHARSET));
-      long size = getFileSize(files, client, remotePath);
-      mEntity.setFileSize(size);
+      mSize = getFileSize(files, client, remotePath);
       reply = client.getReplyCode();
       if (!FTPReply.isPositiveCompletion(reply)) {
         client.disconnect();
diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/Downloader.java b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/Downloader.java
index ddfb8c4f..241b324b 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/Downloader.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/Downloader.java
@@ -40,22 +40,25 @@ class Downloader extends AbsFileer<DownloadEntity, DownloadTaskEntity> {
   }
 
   @Override protected void checkTask() {
-    if (!mTaskEntity.isSupportBP) {
-      isNewTask = true;
-      return;
-    }
     mConfigFile = new File(mContext.getFilesDir().getPath()
         + AriaManager.DOWNLOAD_TEMP_DIR
         + mEntity.getFileName()
         + ".properties");
     mTempFile = new File(mEntity.getDownloadPath());
+    if (!mTaskEntity.isSupportBP) {
+      isNewTask = true;
+      return;
+    }
+    if (mTaskEntity.isNewTask) {
+      isNewTask = true;
+      return;
+    }
     if (!mConfigFile.exists()) { //记录文件被删除,则重新下载
       isNewTask = true;
       CommonUtil.createFile(mConfigFile.getPath());
     } else if (!mTempFile.exists()) {
       isNewTask = true;
-    } else if (DbEntity.findFirst(DownloadEntity.class, "url=?", mEntity.getDownloadUrl())
-        == null) {
+    } else if (DbEntity.findFirst(DownloadEntity.class, "url=?", mEntity.getUrl()) == null) {
       isNewTask = true;
     } else {
       isNewTask = checkConfigFile();
diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/FtpDirInfoThread.java b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/FtpDirInfoThread.java
index 963639de..d53c186d 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/FtpDirInfoThread.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/FtpDirInfoThread.java
@@ -28,7 +28,6 @@ import org.apache.commons.net.ftp.FTPFile;
  * 获取ftp文件夹信息
  */
 class FtpDirInfoThread extends AbsFtpInfoThread<DownloadGroupEntity, DownloadGroupTaskEntity> {
-  private long mSize = 0;
 
   FtpDirInfoThread(DownloadGroupTaskEntity taskEntity, OnFileInfoCallback callback) {
     super(taskEntity, callback);
@@ -36,7 +35,6 @@ class FtpDirInfoThread extends AbsFtpInfoThread<DownloadGroupEntity, DownloadGro
 
   @Override void handleFile(String remotePath, FTPFile ftpFile) {
     super.handleFile(remotePath, ftpFile);
-    mSize += ftpFile.getSize();
     addEntity(remotePath, ftpFile);
   }
 
diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/FtpFileInfoThread.java b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/FtpFileInfoThread.java
index c83db279..82991c77 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/FtpFileInfoThread.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/FtpFileInfoThread.java
@@ -27,4 +27,12 @@ class FtpFileInfoThread extends AbsFtpInfoThread<DownloadEntity, DownloadTaskEnt
   FtpFileInfoThread(DownloadTaskEntity taskEntity, OnFileInfoCallback callback) {
     super(taskEntity, callback);
   }
+
+  @Override protected void onPreComplete() {
+    super.onPreComplete();
+    if (mSize != mTaskEntity.getEntity().getFileSize()) {
+      mTaskEntity.isNewTask = true;
+    }
+    mEntity.setFileSize(mSize);
+  }
 }
diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/HttpFileInfoThread.java b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/HttpFileInfoThread.java
index 07103531..83d3c2d3 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/HttpFileInfoThread.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/HttpFileInfoThread.java
@@ -25,7 +25,6 @@ import java.io.IOException;
 import java.net.HttpURLConnection;
 import java.net.URL;
 import java.net.URLDecoder;
-import java.net.URLEncoder;
 
 /**
  * 下载文件信息获取
@@ -147,12 +146,15 @@ class HttpFileInfoThread implements Runnable {
   }
 
   /**
-   * 检查长度是否合法
+   * 检查长度是否合法,并且检查新获取的文件长度是否和数据库的文件长度一直,如果不一致,则表示该任务为新任务
    *
    * @param len 从服务器获取的文件长度
-   * @return true, 合法
+   * @return {@code true}合法
    */
   private boolean checkLen(long len) {
+    if (len != mEntity.getFileSize()) {
+      mTaskEntity.isNewTask = true;
+    }
     if (len < 0) {
       failDownload("任务【" + mEntity.getUrl() + "】下载失败,文件长度小于0");
       return false;
diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/SimpleDownloadUtil.java b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/SimpleDownloadUtil.java
index 62236c33..a124bb27 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/SimpleDownloadUtil.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/SimpleDownloadUtil.java
@@ -23,7 +23,7 @@ import com.arialyy.aria.core.inf.IDownloadListener;
 
 /**
  * Created by lyy on 2015/8/25.
- * HTTP单任务下载工具
+ * HTTP\FTP单任务下载工具
  */
 public class SimpleDownloadUtil implements IUtil, Runnable {
   private static final String TAG = "SimpleDownloadUtil";
@@ -87,7 +87,7 @@ public class SimpleDownloadUtil implements IUtil, Runnable {
 
   @Override public void run() {
     mListener.onPre();
-    if (mTaskEntity.getEntity().getFileSize() <= 1) {
+    if (mTaskEntity.getEntity().getFileSize() <= 1 || mTaskEntity.refreshInfo) {
       new Thread(createInfoThread()).start();
     } else {
       mDownloader.start();
diff --git a/Aria/src/main/java/com/arialyy/aria/core/inf/AbsTaskEntity.java b/Aria/src/main/java/com/arialyy/aria/core/inf/AbsTaskEntity.java
index 02048aa7..0afb9a4e 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/inf/AbsTaskEntity.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/inf/AbsTaskEntity.java
@@ -50,6 +50,16 @@ public abstract class AbsTaskEntity<ENTITY extends AbsEntity> extends DbEntity {
   @Ignore public String userName, userPw, account, serverIp;
   @Ignore public int port;
 
+  /**
+   * 刷新信息 {@code true} 重新刷新下载信息
+   */
+  @Ignore public boolean refreshInfo = false;
+
+  /**
+   * 是否是新任务,{@code true} 新任务
+   */
+  @Ignore public boolean isNewTask = false;
+
   /**
    * 请求类型
    * {@link AbsTaskEntity#HTTP}、{@link AbsTaskEntity#FTP}
diff --git a/app/src/main/assets/aria_config.xml b/app/src/main/assets/aria_config.xml
index 621b0464..b2d0febd 100644
--- a/app/src/main/assets/aria_config.xml
+++ b/app/src/main/assets/aria_config.xml
@@ -31,7 +31,7 @@
     <!--是否需要转换速度单位,转换完成后为:1b/s、1kb/s、1mb/s、1gb/s、1tb/s,如果不需要将返回byte长度-->
     <convertSpeed value="true"/>
 
-    <!--执行队列类型,见com.arialyy.aria.core.QueueMod,默认类型为now-->
+    <!--执行队列类型,见com.arialyy.aria.core.QueueMod,默认类型为wait-->
     <queueMod value="wait"/>
 
   </download>
@@ -51,6 +51,9 @@
 
     <!--设置url连接超时时间,单位为毫秒,默认5000毫秒-->
     <connectTimeOut value="5000"/>
+
+    <!--执行队列类型,见com.arialyy.aria.core.QueueMod,默认类型为wait-->
+    <queueMod value="wait"/>
   </upload>
 
 </aria>
\ No newline at end of file
diff --git a/app/src/main/java/com/arialyy/simple/download/FtpDownloadActivity.java b/app/src/main/java/com/arialyy/simple/download/FtpDownloadActivity.java
index a1bf4f89..a871366e 100644
--- a/app/src/main/java/com/arialyy/simple/download/FtpDownloadActivity.java
+++ b/app/src/main/java/com/arialyy/simple/download/FtpDownloadActivity.java
@@ -59,7 +59,7 @@ public class FtpDownloadActivity extends BaseActivity<ActivityFtpDownloadBinding
     switch (view.getId()) {
       case R.id.start:
         Aria.download(this)
-            .loadFtp(URL)
+            .loadFtp(URL, true)
             .login("lao", "123456")
             .setDownloadPath("/mnt/sdcard/")
             .start();
diff --git a/app/src/main/java/com/arialyy/simple/download/SingleTaskActivity.java b/app/src/main/java/com/arialyy/simple/download/SingleTaskActivity.java
index 381d3967..c96d01cc 100644
--- a/app/src/main/java/com/arialyy/simple/download/SingleTaskActivity.java
+++ b/app/src/main/java/com/arialyy/simple/download/SingleTaskActivity.java
@@ -187,7 +187,7 @@ public class SingleTaskActivity extends BaseActivity<ActivitySingleBinding> {
     switch (view.getId()) {
       case R.id.start:
         Aria.download(SingleTaskActivity.this)
-            .load(DOWNLOAD_URL)
+            .load(DOWNLOAD_URL, true)
             .addHeader("groupName", "value")
             .setDownloadPath(Environment.getExternalStorageDirectory().getPath() + "/gggg.apk")
             .start();
diff --git a/app/src/main/java/com/arialyy/simple/download/group/FTPDirDownloadActivity.java b/app/src/main/java/com/arialyy/simple/download/group/FTPDirDownloadActivity.java
index f9b0000f..864adc59 100644
--- a/app/src/main/java/com/arialyy/simple/download/group/FTPDirDownloadActivity.java
+++ b/app/src/main/java/com/arialyy/simple/download/group/FTPDirDownloadActivity.java
@@ -35,7 +35,7 @@ import com.arialyy.simple.widget.SubStateLinearLayout;
  * Created by Aria.Lao on 2017/7/6.
  */
 public class FTPDirDownloadActivity extends BaseActivity<ActivityDownloadGroupBinding> {
-  private static final String dir = "ftp://172.18.104.129:21/haha/";
+  private static final String dir = "ftp://172.18.104.66:21/haha/";
 
   @Bind(R.id.child_list) SubStateLinearLayout mChildList;
 
diff --git a/aria/src/main/java/com/arialyy/aria/core/Configuration.java b/aria/src/main/java/com/arialyy/aria/core/Configuration.java
index e8b6ba7a..e65f4218 100644
--- a/aria/src/main/java/com/arialyy/aria/core/Configuration.java
+++ b/aria/src/main/java/com/arialyy/aria/core/Configuration.java
@@ -70,7 +70,7 @@ class Configuration {
      *
      * @see QueueMod
      */
-    String queueMod = "now";
+    String queueMod = "wait";
 
     public String getQueueMod() {
       return queueMod;