diff --git a/android-networking/src/main/java/com/androidnetworking/common/ANConstants.java b/android-networking/src/main/java/com/androidnetworking/common/ANConstants.java index 89d36aa2..5b47436b 100644 --- a/android-networking/src/main/java/com/androidnetworking/common/ANConstants.java +++ b/android-networking/src/main/java/com/androidnetworking/common/ANConstants.java @@ -33,4 +33,6 @@ public final class ANConstants { public static final String USER_AGENT = "User-Agent"; public static final String SUCCESS = "success"; public static final String OPTIONS = "OPTIONS"; + public static final String RANGE = "Range"; + public static final String ACCEPT_ENCODING = "Accept-Encoding"; } diff --git a/android-networking/src/main/java/com/androidnetworking/common/ANRequest.java b/android-networking/src/main/java/com/androidnetworking/common/ANRequest.java index d85b1db8..2d27be4e 100644 --- a/android-networking/src/main/java/com/androidnetworking/common/ANRequest.java +++ b/android-networking/src/main/java/com/androidnetworking/common/ANRequest.java @@ -139,6 +139,7 @@ public class ANRequest { private Executor mExecutor = null; private OkHttpClient mOkHttpClient = null; private String mUserAgent = null; + private boolean mResumeAllowed = false; private Type mType = null; public ANRequest(GetRequestBuilder builder) { @@ -200,6 +201,7 @@ public ANRequest(DownloadBuilder builder) { this.mExecutor = builder.mExecutor; this.mOkHttpClient = builder.mOkHttpClient; this.mUserAgent = builder.mUserAgent; + this.mResumeAllowed = builder.mResumeAllowed; } public ANRequest(MultiPartBuilder builder) { @@ -465,6 +467,10 @@ public String getUserAgent() { return mUserAgent; } + public boolean getResumeAllowed() { + return mResumeAllowed; + } + public Type getType() { return mType; } @@ -1443,6 +1449,7 @@ public static class DownloadBuilder implements Reques private Executor mExecutor; private OkHttpClient mOkHttpClient; private String mUserAgent; + private boolean mResumeAllowed; public DownloadBuilder(String url, String dirPath, String fileName) { this.mUrl = url; @@ -1600,6 +1607,11 @@ public T setUserAgent(String userAgent) { return (T) this; } + public T allowResume(boolean resumeAllowed) { + mResumeAllowed = resumeAllowed; + return (T) this; + } + public T setPercentageThresholdForCancelling(int percentageThresholdForCancelling) { mPercentageThresholdForCancelling = percentageThresholdForCancelling; return (T) this; diff --git a/android-networking/src/main/java/com/androidnetworking/internal/InternalNetworking.java b/android-networking/src/main/java/com/androidnetworking/internal/InternalNetworking.java index 43c539bd..aaf2d706 100644 --- a/android-networking/src/main/java/com/androidnetworking/internal/InternalNetworking.java +++ b/android-networking/src/main/java/com/androidnetworking/internal/InternalNetworking.java @@ -205,9 +205,11 @@ public Response intercept(Chain chain) throws IOException { } } catch (IOException ioe) { try { - File destinationFile = new File(request.getDirPath() + File.separator + request.getFileName()); - if (destinationFile.exists()) { - destinationFile.delete(); + if (!request.getResumeAllowed()) { + File destinationFile = new File(request.getDirPath() + File.separator + request.getFileName()); + if (destinationFile.exists()) { + destinationFile.delete(); + } } } catch (Exception e) { e.printStackTrace(); @@ -276,12 +278,28 @@ public static void addHeadersToRequestBuilder(Request.Builder builder, ANRequest request.setUserAgent(sUserAgent); builder.addHeader(ANConstants.USER_AGENT, sUserAgent); } + if (request.getResumeAllowed()) { + File destinationFile = new File(request.getDirPath() + File.separator + request.getFileName()); + if (destinationFile.exists()) { + long fileLength = destinationFile.length(); + builder.addHeader(ANConstants.ACCEPT_ENCODING, "identity"); + builder.addHeader(ANConstants.RANGE, "bytes=" + fileLength + "-"); + } + } Headers requestHeaders = request.getHeaders(); if (requestHeaders != null) { builder.headers(requestHeaders); if (request.getUserAgent() != null && !requestHeaders.names().contains(ANConstants.USER_AGENT)) { builder.addHeader(ANConstants.USER_AGENT, request.getUserAgent()); } + if (request.getResumeAllowed() && !requestHeaders.names().contains(ANConstants.RANGE)) { + File destinationFile = new File(request.getDirPath() + File.separator + request.getFileName()); + if (destinationFile.exists()) { + long fileLength = destinationFile.length(); + builder.addHeader(ANConstants.ACCEPT_ENCODING, "identity"); + builder.addHeader(ANConstants.RANGE, "bytes=" + fileLength + "-"); + } + } } } diff --git a/android-networking/src/main/java/com/androidnetworking/utils/Utils.java b/android-networking/src/main/java/com/androidnetworking/utils/Utils.java index 588cba83..bf90be4b 100644 --- a/android-networking/src/main/java/com/androidnetworking/utils/Utils.java +++ b/android-networking/src/main/java/com/androidnetworking/utils/Utils.java @@ -172,7 +172,7 @@ public static int findBestSampleSize(int actualWidth, int actualHeight, public static void saveFile(Response response, String dirPath, String fileName) throws IOException { InputStream is = null; - byte[] buf = new byte[2048]; + byte[] buf = new byte[8192]; int len; FileOutputStream fos = null; try { @@ -182,11 +182,15 @@ public static void saveFile(Response response, String dirPath, dir.mkdirs(); } File file = new File(dir, fileName); - fos = new FileOutputStream(file); + int code = response.code(); + if ((code == 206 || code == 416) && file.exists()) { + fos = new FileOutputStream(file, true); + } else { + fos = new FileOutputStream(file); + } while ((len = is.read(buf)) != -1) { fos.write(buf, 0, len); } - fos.flush(); } finally { try { if (is != null) is.close();