Java tutorial
/* * Copyright (C) 2016 Amit Shekhar * Copyright (C) 2011 Android Open Source Project * * 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.androidnetworking.common; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.widget.ImageView; import com.androidnetworking.core.Core; import com.androidnetworking.error.ANError; import com.androidnetworking.interfaces.AnalyticsListener; import com.androidnetworking.interfaces.BitmapRequestListener; import com.androidnetworking.interfaces.DownloadListener; import com.androidnetworking.interfaces.DownloadProgressListener; import com.androidnetworking.interfaces.JSONArrayRequestListener; import com.androidnetworking.interfaces.JSONObjectRequestListener; import com.androidnetworking.interfaces.OkHttpResponseAndBitmapRequestListener; import com.androidnetworking.interfaces.OkHttpResponseAndJSONArrayRequestListener; import com.androidnetworking.interfaces.OkHttpResponseAndJSONObjectRequestListener; import com.androidnetworking.interfaces.OkHttpResponseAndParsedRequestListener; import com.androidnetworking.interfaces.OkHttpResponseAndStringRequestListener; import com.androidnetworking.interfaces.OkHttpResponseListener; import com.androidnetworking.interfaces.ParsedRequestListener; import com.androidnetworking.interfaces.StringRequestListener; import com.androidnetworking.interfaces.UploadProgressListener; import com.androidnetworking.internal.ANRequestQueue; import com.androidnetworking.internal.SynchronousCall; import com.androidnetworking.utils.ParseUtil; import com.androidnetworking.utils.Utils; import com.google.gson.internal.$Gson$Types; import com.google.gson.reflect.TypeToken; import org.json.JSONArray; import org.json.JSONObject; import java.io.File; import java.lang.reflect.Type; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.Executor; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import okhttp3.CacheControl; import okhttp3.Call; import okhttp3.FormBody; import okhttp3.Headers; import okhttp3.HttpUrl; import okhttp3.MediaType; import okhttp3.MultipartBody; import okhttp3.OkHttpClient; import okhttp3.RequestBody; import okhttp3.Response; import okio.Okio; /** * Created by amitshekhar on 26/03/16. */ @SuppressWarnings({ "unchecked", "unused" }) public class ANRequest<T extends ANRequest> { private final static String TAG = ANRequest.class.getSimpleName(); private int mMethod; private Priority mPriority; private int mRequestType; private String mUrl; private int sequenceNumber; private Object mTag; private ResponseType mResponseType; private HashMap<String, String> mHeadersMap = new HashMap<>(); private HashMap<String, String> mBodyParameterMap = new HashMap<>(); private HashMap<String, String> mUrlEncodedFormBodyParameterMap = new HashMap<>(); private HashMap<String, String> mMultiPartParameterMap = new HashMap<>(); private HashMap<String, String> mQueryParameterMap = new HashMap<>(); private HashMap<String, String> mPathParameterMap = new HashMap<>(); private HashMap<String, File> mMultiPartFileMap = new HashMap<>(); private String mDirPath; private String mFileName; private String mApplicationJsonString = null; private String mStringBody = null; private byte[] mByte = null; private File mFile = null; private static final MediaType JSON_MEDIA_TYPE = MediaType.parse("application/json; charset=utf-8"); private static final MediaType MEDIA_TYPE_MARKDOWN = MediaType.parse("text/x-markdown; charset=utf-8"); private MediaType customMediaType = null; private static final Object sDecodeLock = new Object(); private Future future; private Call call; private int mProgress; private boolean isCancelled; private boolean isDelivered; private int mPercentageThresholdForCancelling = 0; private JSONArrayRequestListener mJSONArrayRequestListener; private JSONObjectRequestListener mJSONObjectRequestListener; private StringRequestListener mStringRequestListener; private OkHttpResponseListener mOkHttpResponseListener; private BitmapRequestListener mBitmapRequestListener; private ParsedRequestListener mParsedRequestListener; private OkHttpResponseAndJSONObjectRequestListener mOkHttpResponseAndJSONObjectRequestListener; private OkHttpResponseAndJSONArrayRequestListener mOkHttpResponseAndJSONArrayRequestListener; private OkHttpResponseAndStringRequestListener mOkHttpResponseAndStringRequestListener; private OkHttpResponseAndBitmapRequestListener mOkHttpResponseAndBitmapRequestListener; private OkHttpResponseAndParsedRequestListener mOkHttpResponseAndParsedRequestListener; private DownloadProgressListener mDownloadProgressListener; private UploadProgressListener mUploadProgressListener; private DownloadListener mDownloadListener; private AnalyticsListener mAnalyticsListener; private Bitmap.Config mDecodeConfig; private int mMaxWidth; private int mMaxHeight; private ImageView.ScaleType mScaleType; private CacheControl mCacheControl = null; private Executor mExecutor = null; private OkHttpClient mOkHttpClient = null; private String mUserAgent = null; private Type mType = null; public ANRequest(GetRequestBuilder builder) { this.mRequestType = RequestType.SIMPLE; this.mMethod = builder.mMethod; this.mPriority = builder.mPriority; this.mUrl = builder.mUrl; this.mTag = builder.mTag; this.mHeadersMap = builder.mHeadersMap; this.mDecodeConfig = builder.mDecodeConfig; this.mMaxHeight = builder.mMaxHeight; this.mMaxWidth = builder.mMaxWidth; this.mScaleType = builder.mScaleType; this.mQueryParameterMap = builder.mQueryParameterMap; this.mPathParameterMap = builder.mPathParameterMap; this.mCacheControl = builder.mCacheControl; this.mExecutor = builder.mExecutor; this.mOkHttpClient = builder.mOkHttpClient; this.mUserAgent = builder.mUserAgent; } public ANRequest(PostRequestBuilder builder) { this.mRequestType = RequestType.SIMPLE; this.mMethod = builder.mMethod; this.mPriority = builder.mPriority; this.mUrl = builder.mUrl; this.mTag = builder.mTag; this.mHeadersMap = builder.mHeadersMap; this.mBodyParameterMap = builder.mBodyParameterMap; this.mUrlEncodedFormBodyParameterMap = builder.mUrlEncodedFormBodyParameterMap; this.mQueryParameterMap = builder.mQueryParameterMap; this.mPathParameterMap = builder.mPathParameterMap; this.mApplicationJsonString = builder.mApplicationJsonString; this.mStringBody = builder.mStringBody; this.mFile = builder.mFile; this.mByte = builder.mByte; this.mCacheControl = builder.mCacheControl; this.mExecutor = builder.mExecutor; this.mOkHttpClient = builder.mOkHttpClient; this.mUserAgent = builder.mUserAgent; if (builder.mCustomContentType != null) { this.customMediaType = MediaType.parse(builder.mCustomContentType); } } public ANRequest(DownloadBuilder builder) { this.mRequestType = RequestType.DOWNLOAD; this.mMethod = Method.GET; this.mPriority = builder.mPriority; this.mUrl = builder.mUrl; this.mTag = builder.mTag; this.mDirPath = builder.mDirPath; this.mFileName = builder.mFileName; this.mHeadersMap = builder.mHeadersMap; this.mQueryParameterMap = builder.mQueryParameterMap; this.mPathParameterMap = builder.mPathParameterMap; this.mCacheControl = builder.mCacheControl; this.mPercentageThresholdForCancelling = builder.mPercentageThresholdForCancelling; this.mExecutor = builder.mExecutor; this.mOkHttpClient = builder.mOkHttpClient; this.mUserAgent = builder.mUserAgent; } public ANRequest(MultiPartBuilder builder) { this.mRequestType = RequestType.MULTIPART; this.mMethod = Method.POST; this.mPriority = builder.mPriority; this.mUrl = builder.mUrl; this.mTag = builder.mTag; this.mHeadersMap = builder.mHeadersMap; this.mQueryParameterMap = builder.mQueryParameterMap; this.mPathParameterMap = builder.mPathParameterMap; this.mMultiPartParameterMap = builder.mMultiPartParameterMap; this.mMultiPartFileMap = builder.mMultiPartFileMap; this.mCacheControl = builder.mCacheControl; this.mPercentageThresholdForCancelling = builder.mPercentageThresholdForCancelling; this.mExecutor = builder.mExecutor; this.mOkHttpClient = builder.mOkHttpClient; this.mUserAgent = builder.mUserAgent; if (builder.mCustomContentType != null) { this.customMediaType = MediaType.parse(builder.mCustomContentType); } } public void getAsJSONObject(JSONObjectRequestListener requestListener) { this.mResponseType = ResponseType.JSON_OBJECT; this.mJSONObjectRequestListener = requestListener; ANRequestQueue.getInstance().addRequest(this); } public void getAsJSONArray(JSONArrayRequestListener requestListener) { this.mResponseType = ResponseType.JSON_ARRAY; this.mJSONArrayRequestListener = requestListener; ANRequestQueue.getInstance().addRequest(this); } public void getAsString(StringRequestListener requestListener) { this.mResponseType = ResponseType.STRING; this.mStringRequestListener = requestListener; ANRequestQueue.getInstance().addRequest(this); } public void getAsOkHttpResponse(OkHttpResponseListener requestListener) { this.mResponseType = ResponseType.OK_HTTP_RESPONSE; this.mOkHttpResponseListener = requestListener; ANRequestQueue.getInstance().addRequest(this); } public void getAsBitmap(BitmapRequestListener requestListener) { this.mResponseType = ResponseType.BITMAP; this.mBitmapRequestListener = requestListener; ANRequestQueue.getInstance().addRequest(this); } public void getAsParsed(TypeToken typeToken, ParsedRequestListener parsedRequestListener) { this.mType = typeToken.getType(); this.mResponseType = ResponseType.PARSED; this.mParsedRequestListener = parsedRequestListener; ANRequestQueue.getInstance().addRequest(this); } public void getAsObject(Class objectClass, ParsedRequestListener parsedRequestListener) { this.mType = objectClass; this.mResponseType = ResponseType.PARSED; this.mParsedRequestListener = parsedRequestListener; ANRequestQueue.getInstance().addRequest(this); } public void getAsObjectList(Class objectClass, ParsedRequestListener parsedRequestListener) { this.mType = $Gson$Types.newParameterizedTypeWithOwner(null, List.class, objectClass); this.mResponseType = ResponseType.PARSED; this.mParsedRequestListener = parsedRequestListener; ANRequestQueue.getInstance().addRequest(this); } public void getAsOkHttpResponseAndJSONObject(OkHttpResponseAndJSONObjectRequestListener requestListener) { this.mResponseType = ResponseType.JSON_OBJECT; this.mOkHttpResponseAndJSONObjectRequestListener = requestListener; ANRequestQueue.getInstance().addRequest(this); } public void getAsOkHttpResponseAndJSONArray(OkHttpResponseAndJSONArrayRequestListener requestListener) { this.mResponseType = ResponseType.JSON_ARRAY; this.mOkHttpResponseAndJSONArrayRequestListener = requestListener; ANRequestQueue.getInstance().addRequest(this); } public void getAsOkHttpResponseAndString(OkHttpResponseAndStringRequestListener requestListener) { this.mResponseType = ResponseType.STRING; this.mOkHttpResponseAndStringRequestListener = requestListener; ANRequestQueue.getInstance().addRequest(this); } public void getAsOkHttpResponseAndBitmap(OkHttpResponseAndBitmapRequestListener requestListener) { this.mResponseType = ResponseType.BITMAP; this.mOkHttpResponseAndBitmapRequestListener = requestListener; ANRequestQueue.getInstance().addRequest(this); } public void getAsOkHttpResponseAndParsed(TypeToken typeToken, OkHttpResponseAndParsedRequestListener parsedRequestListener) { this.mType = typeToken.getType(); this.mResponseType = ResponseType.PARSED; this.mOkHttpResponseAndParsedRequestListener = parsedRequestListener; ANRequestQueue.getInstance().addRequest(this); } public void getAsOkHttpResponseAndObject(Class objectClass, OkHttpResponseAndParsedRequestListener parsedRequestListener) { this.mType = objectClass; this.mResponseType = ResponseType.PARSED; this.mOkHttpResponseAndParsedRequestListener = parsedRequestListener; ANRequestQueue.getInstance().addRequest(this); } public void getAsOkHttpResponseAndObjectList(Class objectClass, OkHttpResponseAndParsedRequestListener parsedRequestListener) { this.mType = $Gson$Types.newParameterizedTypeWithOwner(null, List.class, objectClass); this.mResponseType = ResponseType.PARSED; this.mOkHttpResponseAndParsedRequestListener = parsedRequestListener; ANRequestQueue.getInstance().addRequest(this); } public void startDownload(DownloadListener downloadListener) { this.mDownloadListener = downloadListener; ANRequestQueue.getInstance().addRequest(this); } public void prefetch() { this.mResponseType = ResponseType.PREFETCH; ANRequestQueue.getInstance().addRequest(this); } public ANResponse executeForJSONObject() { this.mResponseType = ResponseType.JSON_OBJECT; return SynchronousCall.execute(this); } public ANResponse executeForJSONArray() { this.mResponseType = ResponseType.JSON_ARRAY; return SynchronousCall.execute(this); } public ANResponse executeForString() { this.mResponseType = ResponseType.STRING; return SynchronousCall.execute(this); } public ANResponse executeForOkHttpResponse() { this.mResponseType = ResponseType.OK_HTTP_RESPONSE; return SynchronousCall.execute(this); } public ANResponse executeForBitmap() { this.mResponseType = ResponseType.BITMAP; return SynchronousCall.execute(this); } public ANResponse executeForParsed(TypeToken typeToken) { this.mType = typeToken.getType(); this.mResponseType = ResponseType.PARSED; return SynchronousCall.execute(this); } public ANResponse executeForObject(Class objectClass) { this.mType = objectClass; this.mResponseType = ResponseType.PARSED; return SynchronousCall.execute(this); } public ANResponse executeForObjectList(Class objectClass) { this.mType = $Gson$Types.newParameterizedTypeWithOwner(null, List.class, objectClass); this.mResponseType = ResponseType.PARSED; return SynchronousCall.execute(this); } public ANResponse executeForDownload() { return SynchronousCall.execute(this); } public T setDownloadProgressListener(DownloadProgressListener downloadProgressListener) { this.mDownloadProgressListener = downloadProgressListener; return (T) this; } public T setUploadProgressListener(UploadProgressListener uploadProgressListener) { this.mUploadProgressListener = uploadProgressListener; return (T) this; } public T setAnalyticsListener(AnalyticsListener analyticsListener) { this.mAnalyticsListener = analyticsListener; return (T) this; } public AnalyticsListener getAnalyticsListener() { return mAnalyticsListener; } public int getMethod() { return mMethod; } public Priority getPriority() { return mPriority; } public String getUrl() { String tempUrl = mUrl; for (HashMap.Entry<String, String> entry : mPathParameterMap.entrySet()) { tempUrl = tempUrl.replace("{" + entry.getKey() + "}", String.valueOf(entry.getValue())); } HttpUrl.Builder urlBuilder = HttpUrl.parse(tempUrl).newBuilder(); for (HashMap.Entry<String, String> entry : mQueryParameterMap.entrySet()) { urlBuilder.addQueryParameter(entry.getKey(), entry.getValue()); } return urlBuilder.build().toString(); } public int getSequenceNumber() { return sequenceNumber; } public void setSequenceNumber(int sequenceNumber) { this.sequenceNumber = sequenceNumber; } public void setProgress(int progress) { this.mProgress = progress; } public void setResponseAs(ResponseType responseType) { this.mResponseType = responseType; } public ResponseType getResponseAs() { return mResponseType; } public Object getTag() { return mTag; } public int getRequestType() { return mRequestType; } public OkHttpClient getOkHttpClient() { return mOkHttpClient; } public void setUserAgent(String userAgent) { this.mUserAgent = userAgent; } public String getUserAgent() { return mUserAgent; } public Type getType() { return mType; } public void setType(Type type) { this.mType = type; } public DownloadProgressListener getDownloadProgressListener() { return new DownloadProgressListener() { @Override public void onProgress(final long bytesDownloaded, final long totalBytes) { if (mDownloadProgressListener != null && !isCancelled) { mDownloadProgressListener.onProgress(bytesDownloaded, totalBytes); } } }; } public void updateDownloadCompletion() { isDelivered = true; if (mDownloadListener != null) { if (!isCancelled) { if (mExecutor != null) { mExecutor.execute(new Runnable() { @Override public void run() { if (mDownloadListener != null) { mDownloadListener.onDownloadComplete(); } finish(); } }); } else { Core.getInstance().getExecutorSupplier().forMainThreadTasks().execute(new Runnable() { @Override public void run() { if (mDownloadListener != null) { mDownloadListener.onDownloadComplete(); } finish(); } }); } } else { deliverError(new ANError()); finish(); } } else { finish(); } } public UploadProgressListener getUploadProgressListener() { return new UploadProgressListener() { @Override public void onProgress(final long bytesUploaded, final long totalBytes) { mProgress = (int) ((bytesUploaded * 100) / totalBytes); if (mUploadProgressListener != null && !isCancelled) { mUploadProgressListener.onProgress(bytesUploaded, totalBytes); } } }; } public String getDirPath() { return mDirPath; } public String getFileName() { return mFileName; } public CacheControl getCacheControl() { return mCacheControl; } public ImageView.ScaleType getScaleType() { return mScaleType; } public void cancel(boolean forceCancel) { try { if (forceCancel || mPercentageThresholdForCancelling == 0 || mProgress < mPercentageThresholdForCancelling) { isCancelled = true; if (call != null) { call.cancel(); } if (future != null) { future.cancel(true); } if (!isDelivered) { deliverError(new ANError()); } } } catch (Exception e) { e.printStackTrace(); } } public boolean isCanceled() { return isCancelled; } public Call getCall() { return call; } public void setCall(Call call) { this.call = call; } public Future getFuture() { return future; } public void setFuture(Future future) { this.future = future; } public void destroy() { mJSONArrayRequestListener = null; mJSONArrayRequestListener = null; mStringRequestListener = null; mBitmapRequestListener = null; mParsedRequestListener = null; mDownloadProgressListener = null; mUploadProgressListener = null; mDownloadListener = null; mAnalyticsListener = null; } public void finish() { destroy(); ANRequestQueue.getInstance().finish(this); } public ANResponse parseResponse(Response response) { switch (mResponseType) { case JSON_ARRAY: try { JSONArray json = new JSONArray(Okio.buffer(response.body().source()).readUtf8()); return ANResponse.success(json); } catch (Exception e) { return ANResponse.failed(Utils.getErrorForParse(new ANError(e))); } case JSON_OBJECT: try { JSONObject json = new JSONObject(Okio.buffer(response.body().source()).readUtf8()); return ANResponse.success(json); } catch (Exception e) { return ANResponse.failed(Utils.getErrorForParse(new ANError(e))); } case STRING: try { return ANResponse.success(Okio.buffer(response.body().source()).readUtf8()); } catch (Exception e) { return ANResponse.failed(Utils.getErrorForParse(new ANError(e))); } case BITMAP: synchronized (sDecodeLock) { try { return Utils.decodeBitmap(response, mMaxWidth, mMaxHeight, mDecodeConfig, mScaleType); } catch (Exception e) { return ANResponse.failed(Utils.getErrorForParse(new ANError(e))); } } case PARSED: try { return ANResponse .success(ParseUtil.getParserFactory().responseBodyParser(mType).convert(response.body())); } catch (Exception e) { return ANResponse.failed(Utils.getErrorForParse(new ANError(e))); } case PREFETCH: try { Okio.buffer(response.body().source()).skip(Long.MAX_VALUE); return ANResponse.success(ANConstants.PREFETCH); } catch (Exception e) { return ANResponse.failed(Utils.getErrorForParse(new ANError(e))); } } return null; } public ANError parseNetworkError(ANError anError) { try { if (anError.getResponse() != null && anError.getResponse().body() != null && anError.getResponse().body().source() != null) { anError.setErrorBody(Okio.buffer(anError.getResponse().body().source()).readUtf8()); } } catch (Exception e) { e.printStackTrace(); } return anError; } public synchronized void deliverError(ANError anError) { try { if (!isDelivered) { if (isCancelled) { anError.setCancellationMessageInError(); anError.setErrorCode(0); } deliverErrorResponse(anError); } isDelivered = true; } catch (Exception e) { e.printStackTrace(); } } public void deliverResponse(final ANResponse response) { try { isDelivered = true; if (!isCancelled) { if (mExecutor != null) { mExecutor.execute(new Runnable() { @Override public void run() { deliverSuccessResponse(response); } }); } else { Core.getInstance().getExecutorSupplier().forMainThreadTasks().execute(new Runnable() { public void run() { deliverSuccessResponse(response); } }); } } else { ANError anError = new ANError(); anError.setCancellationMessageInError(); anError.setErrorCode(0); deliverErrorResponse(anError); finish(); } } catch (Exception e) { e.printStackTrace(); } } private void deliverSuccessResponse(ANResponse response) { if (mJSONObjectRequestListener != null) { mJSONObjectRequestListener.onResponse((JSONObject) response.getResult()); } else if (mJSONArrayRequestListener != null) { mJSONArrayRequestListener.onResponse((JSONArray) response.getResult()); } else if (mStringRequestListener != null) { mStringRequestListener.onResponse((String) response.getResult()); } else if (mBitmapRequestListener != null) { mBitmapRequestListener.onResponse((Bitmap) response.getResult()); } else if (mParsedRequestListener != null) { mParsedRequestListener.onResponse(response.getResult()); } else if (mOkHttpResponseAndJSONObjectRequestListener != null) { mOkHttpResponseAndJSONObjectRequestListener.onResponse(response.getOkHttpResponse(), (JSONObject) response.getResult()); } else if (mOkHttpResponseAndJSONArrayRequestListener != null) { mOkHttpResponseAndJSONArrayRequestListener.onResponse(response.getOkHttpResponse(), (JSONArray) response.getResult()); } else if (mOkHttpResponseAndStringRequestListener != null) { mOkHttpResponseAndStringRequestListener.onResponse(response.getOkHttpResponse(), (String) response.getResult()); } else if (mOkHttpResponseAndBitmapRequestListener != null) { mOkHttpResponseAndBitmapRequestListener.onResponse(response.getOkHttpResponse(), (Bitmap) response.getResult()); } else if (mOkHttpResponseAndParsedRequestListener != null) { mOkHttpResponseAndParsedRequestListener.onResponse(response.getOkHttpResponse(), response.getResult()); } finish(); } private void deliverErrorResponse(ANError anError) { if (mJSONObjectRequestListener != null) { mJSONObjectRequestListener.onError(anError); } else if (mJSONArrayRequestListener != null) { mJSONArrayRequestListener.onError(anError); } else if (mStringRequestListener != null) { mStringRequestListener.onError(anError); } else if (mBitmapRequestListener != null) { mBitmapRequestListener.onError(anError); } else if (mParsedRequestListener != null) { mParsedRequestListener.onError(anError); } else if (mOkHttpResponseListener != null) { mOkHttpResponseListener.onError(anError); } else if (mOkHttpResponseAndJSONObjectRequestListener != null) { mOkHttpResponseAndJSONObjectRequestListener.onError(anError); } else if (mOkHttpResponseAndJSONArrayRequestListener != null) { mOkHttpResponseAndJSONArrayRequestListener.onError(anError); } else if (mOkHttpResponseAndStringRequestListener != null) { mOkHttpResponseAndStringRequestListener.onError(anError); } else if (mOkHttpResponseAndBitmapRequestListener != null) { mOkHttpResponseAndBitmapRequestListener.onError(anError); } else if (mOkHttpResponseAndParsedRequestListener != null) { mOkHttpResponseAndParsedRequestListener.onError(anError); } else if (mDownloadListener != null) { mDownloadListener.onError(anError); } } public void deliverOkHttpResponse(final Response response) { try { isDelivered = true; if (!isCancelled) { if (mExecutor != null) { mExecutor.execute(new Runnable() { @Override public void run() { if (mOkHttpResponseListener != null) { mOkHttpResponseListener.onResponse(response); } finish(); } }); } else { Core.getInstance().getExecutorSupplier().forMainThreadTasks().execute(new Runnable() { public void run() { if (mOkHttpResponseListener != null) { mOkHttpResponseListener.onResponse(response); } finish(); } }); } } else { ANError anError = new ANError(); anError.setCancellationMessageInError(); anError.setErrorCode(0); if (mOkHttpResponseListener != null) { mOkHttpResponseListener.onError(anError); } finish(); } } catch (Exception e) { e.printStackTrace(); } } public RequestBody getRequestBody() { if (mApplicationJsonString != null) { if (customMediaType != null) { return RequestBody.create(customMediaType, mApplicationJsonString); } return RequestBody.create(JSON_MEDIA_TYPE, mApplicationJsonString); } else if (mStringBody != null) { if (customMediaType != null) { return RequestBody.create(customMediaType, mStringBody); } return RequestBody.create(MEDIA_TYPE_MARKDOWN, mStringBody); } else if (mFile != null) { if (customMediaType != null) { return RequestBody.create(customMediaType, mFile); } return RequestBody.create(MEDIA_TYPE_MARKDOWN, mFile); } else if (mByte != null) { if (customMediaType != null) { return RequestBody.create(customMediaType, mByte); } return RequestBody.create(MEDIA_TYPE_MARKDOWN, mByte); } else { FormBody.Builder builder = new FormBody.Builder(); try { for (HashMap.Entry<String, String> entry : mBodyParameterMap.entrySet()) { builder.add(entry.getKey(), entry.getValue()); } for (HashMap.Entry<String, String> entry : mUrlEncodedFormBodyParameterMap.entrySet()) { builder.addEncoded(entry.getKey(), entry.getValue()); } } catch (Exception e) { e.printStackTrace(); } return builder.build(); } } public RequestBody getMultiPartRequestBody() { MultipartBody.Builder builder = new MultipartBody.Builder() .setType((customMediaType == null) ? MultipartBody.FORM : customMediaType); try { for (HashMap.Entry<String, String> entry : mMultiPartParameterMap.entrySet()) { builder.addPart(Headers.of("Content-Disposition", "form-data; name=\"" + entry.getKey() + "\""), RequestBody.create(null, entry.getValue())); } for (HashMap.Entry<String, File> entry : mMultiPartFileMap.entrySet()) { String fileName = entry.getValue().getName(); RequestBody fileBody = RequestBody.create(MediaType.parse(Utils.getMimeType(fileName)), entry.getValue()); builder.addPart( Headers.of("Content-Disposition", "form-data; name=\"" + entry.getKey() + "\"; filename=\"" + fileName + "\""), fileBody); } } catch (Exception e) { e.printStackTrace(); } return builder.build(); } public Headers getHeaders() { Headers.Builder builder = new Headers.Builder(); try { for (HashMap.Entry<String, String> entry : mHeadersMap.entrySet()) { builder.add(entry.getKey(), entry.getValue()); } } catch (Exception e) { e.printStackTrace(); } return builder.build(); } public static class HeadRequestBuilder extends GetRequestBuilder { public HeadRequestBuilder(String url) { super(url, Method.HEAD); } } public static class GetRequestBuilder<T extends GetRequestBuilder> implements RequestBuilder { private Priority mPriority = Priority.MEDIUM; private int mMethod = Method.GET; private String mUrl; private Object mTag; private Bitmap.Config mDecodeConfig; private BitmapFactory.Options mBitmapOptions; private int mMaxWidth; private int mMaxHeight; private ImageView.ScaleType mScaleType; private HashMap<String, String> mHeadersMap = new HashMap<>(); private HashMap<String, String> mQueryParameterMap = new HashMap<>(); private HashMap<String, String> mPathParameterMap = new HashMap<>(); private CacheControl mCacheControl; private Executor mExecutor; private OkHttpClient mOkHttpClient; private String mUserAgent; public GetRequestBuilder(String url) { this.mUrl = url; this.mMethod = Method.GET; } public GetRequestBuilder(String url, int method) { this.mUrl = url; this.mMethod = method; } @Override public T setPriority(Priority priority) { mPriority = priority; return (T) this; } @Override public T setTag(Object tag) { mTag = tag; return (T) this; } @Override public T addQueryParameter(String key, String value) { mQueryParameterMap.put(key, value); return (T) this; } @Override public T addQueryParameter(Map<String, String> queryParameterMap) { if (queryParameterMap != null) { mQueryParameterMap.putAll(queryParameterMap); } return (T) this; } @Override public T addQueryParameter(Object object) { if (object != null) { mQueryParameterMap.putAll(ParseUtil.getParserFactory().getStringMap(object)); } return (T) this; } @Override public T addPathParameter(String key, String value) { mPathParameterMap.put(key, value); return (T) this; } @Override public T addPathParameter(Map<String, String> pathParameterMap) { if (pathParameterMap != null) { mPathParameterMap.putAll(pathParameterMap); } return (T) this; } @Override public T addPathParameter(Object object) { if (object != null) { mPathParameterMap.putAll(ParseUtil.getParserFactory().getStringMap(object)); } return (T) this; } @Override public T addHeaders(String key, String value) { mHeadersMap.put(key, value); return (T) this; } @Override public T addHeaders(Map<String, String> headerMap) { if (headerMap != null) { mHeadersMap.putAll(headerMap); } return (T) this; } @Override public T addHeaders(Object object) { if (object != null) { mHeadersMap.putAll(ParseUtil.getParserFactory().getStringMap(object)); } return (T) this; } @Override public T doNotCacheResponse() { mCacheControl = new CacheControl.Builder().noStore().build(); return (T) this; } @Override public T getResponseOnlyIfCached() { mCacheControl = CacheControl.FORCE_CACHE; return (T) this; } @Override public T getResponseOnlyFromNetwork() { mCacheControl = CacheControl.FORCE_NETWORK; return (T) this; } @Override public T setMaxAgeCacheControl(int maxAge, TimeUnit timeUnit) { mCacheControl = new CacheControl.Builder().maxAge(maxAge, timeUnit).build(); return (T) this; } @Override public T setMaxStaleCacheControl(int maxStale, TimeUnit timeUnit) { mCacheControl = new CacheControl.Builder().maxStale(maxStale, timeUnit).build(); return (T) this; } @Override public T setExecutor(Executor executor) { mExecutor = executor; return (T) this; } @Override public T setOkHttpClient(OkHttpClient okHttpClient) { mOkHttpClient = okHttpClient; return (T) this; } @Override public T setUserAgent(String userAgent) { mUserAgent = userAgent; return (T) this; } public T setBitmapConfig(Bitmap.Config bitmapConfig) { mDecodeConfig = bitmapConfig; return (T) this; } public T setBitmapOptions(BitmapFactory.Options bitmapOptions) { mBitmapOptions = bitmapOptions; return (T) this; } public T setBitmapMaxHeight(int maxHeight) { mMaxHeight = maxHeight; return (T) this; } public T setBitmapMaxWidth(int maxWidth) { mMaxWidth = maxWidth; return (T) this; } public T setImageScaleType(ImageView.ScaleType imageScaleType) { mScaleType = imageScaleType; return (T) this; } public ANRequest build() { return new ANRequest(this); } } public static class PutRequestBuilder extends PostRequestBuilder { public PutRequestBuilder(String url) { super(url, Method.PUT); } } public static class DeleteRequestBuilder extends PostRequestBuilder { public DeleteRequestBuilder(String url) { super(url, Method.DELETE); } } public static class PatchRequestBuilder extends PostRequestBuilder { public PatchRequestBuilder(String url) { super(url, Method.PATCH); } } public static class PostRequestBuilder<T extends PostRequestBuilder> implements RequestBuilder { private Priority mPriority = Priority.MEDIUM; private int mMethod = Method.POST; private String mUrl; private Object mTag; private String mApplicationJsonString = null; private String mStringBody = null; private byte[] mByte = null; private File mFile = null; private HashMap<String, String> mHeadersMap = new HashMap<>(); private HashMap<String, String> mBodyParameterMap = new HashMap<>(); private HashMap<String, String> mUrlEncodedFormBodyParameterMap = new HashMap<>(); private HashMap<String, String> mQueryParameterMap = new HashMap<>(); private HashMap<String, String> mPathParameterMap = new HashMap<>(); private CacheControl mCacheControl; private Executor mExecutor; private OkHttpClient mOkHttpClient; private String mUserAgent; private String mCustomContentType; public PostRequestBuilder(String url) { this.mUrl = url; this.mMethod = Method.POST; } public PostRequestBuilder(String url, int method) { this.mUrl = url; this.mMethod = method; } @Override public T setPriority(Priority priority) { mPriority = priority; return (T) this; } @Override public T setTag(Object tag) { mTag = tag; return (T) this; } @Override public T addQueryParameter(String key, String value) { mQueryParameterMap.put(key, value); return (T) this; } @Override public T addQueryParameter(Map<String, String> queryParameterMap) { if (queryParameterMap != null) { mQueryParameterMap.putAll(queryParameterMap); } return (T) this; } @Override public T addQueryParameter(Object object) { if (object != null) { mQueryParameterMap.putAll(ParseUtil.getParserFactory().getStringMap(object)); } return (T) this; } @Override public T addPathParameter(String key, String value) { mPathParameterMap.put(key, value); return (T) this; } @Override public T addPathParameter(Map<String, String> pathParameterMap) { if (pathParameterMap != null) { mPathParameterMap.putAll(pathParameterMap); } return (T) this; } @Override public T addPathParameter(Object object) { if (object != null) { mPathParameterMap.putAll(ParseUtil.getParserFactory().getStringMap(object)); } return (T) this; } @Override public T addHeaders(String key, String value) { mHeadersMap.put(key, value); return (T) this; } @Override public T addHeaders(Map<String, String> headerMap) { if (headerMap != null) { mHeadersMap.putAll(headerMap); } return (T) this; } @Override public T addHeaders(Object object) { if (object != null) { mHeadersMap.putAll(ParseUtil.getParserFactory().getStringMap(object)); } return (T) this; } @Override public T doNotCacheResponse() { mCacheControl = new CacheControl.Builder().noStore().build(); return (T) this; } @Override public T getResponseOnlyIfCached() { mCacheControl = CacheControl.FORCE_CACHE; return (T) this; } @Override public T getResponseOnlyFromNetwork() { mCacheControl = CacheControl.FORCE_NETWORK; return (T) this; } @Override public T setMaxAgeCacheControl(int maxAge, TimeUnit timeUnit) { mCacheControl = new CacheControl.Builder().maxAge(maxAge, timeUnit).build(); return (T) this; } @Override public T setMaxStaleCacheControl(int maxStale, TimeUnit timeUnit) { mCacheControl = new CacheControl.Builder().maxStale(maxStale, timeUnit).build(); return (T) this; } @Override public T setExecutor(Executor executor) { mExecutor = executor; return (T) this; } @Override public T setOkHttpClient(OkHttpClient okHttpClient) { mOkHttpClient = okHttpClient; return (T) this; } @Override public T setUserAgent(String userAgent) { mUserAgent = userAgent; return (T) this; } public T addBodyParameter(String key, String value) { mBodyParameterMap.put(key, value); return (T) this; } public T addBodyParameter(Map<String, String> bodyParameterMap) { if (bodyParameterMap != null) { mBodyParameterMap.putAll(bodyParameterMap); } return (T) this; } public T addBodyParameter(Object object) { if (object != null) { mBodyParameterMap.putAll(ParseUtil.getParserFactory().getStringMap(object)); } return (T) this; } public T addUrlEncodeFormBodyParameter(String key, String value) { mUrlEncodedFormBodyParameterMap.put(key, value); return (T) this; } public T addUrlEncodeFormBodyParameter(Map<String, String> bodyParameterMap) { if (bodyParameterMap != null) { mUrlEncodedFormBodyParameterMap.putAll(bodyParameterMap); } return (T) this; } public T addUrlEncodeFormBodyParameter(Object object) { if (object != null) { mUrlEncodedFormBodyParameterMap.putAll(ParseUtil.getParserFactory().getStringMap(object)); } return (T) this; } public T addApplicationJsonBody(Object object) { if (object != null) { mApplicationJsonString = ParseUtil.getParserFactory().getString(object); } return (T) this; } public T addJSONObjectBody(JSONObject jsonObject) { if (jsonObject != null) { mApplicationJsonString = jsonObject.toString(); } return (T) this; } public T addJSONArrayBody(JSONArray jsonArray) { if (jsonArray != null) { mApplicationJsonString = jsonArray.toString(); } return (T) this; } public T addStringBody(String stringBody) { mStringBody = stringBody; return (T) this; } public T addFileBody(File file) { mFile = file; return (T) this; } public T addByteBody(byte[] bytes) { mByte = bytes; return (T) this; } public T setContentType(String contentType) { mCustomContentType = contentType; return (T) this; } public ANRequest build() { return new ANRequest(this); } } public static class DownloadBuilder<T extends DownloadBuilder> implements RequestBuilder { private Priority mPriority = Priority.MEDIUM; private String mUrl; private Object mTag; private HashMap<String, String> mHeadersMap = new HashMap<>(); private HashMap<String, String> mQueryParameterMap = new HashMap<>(); private HashMap<String, String> mPathParameterMap = new HashMap<>(); private String mDirPath; private String mFileName; private CacheControl mCacheControl; private int mPercentageThresholdForCancelling = 0; private Executor mExecutor; private OkHttpClient mOkHttpClient; private String mUserAgent; public DownloadBuilder(String url, String dirPath, String fileName) { this.mUrl = url; this.mDirPath = dirPath; this.mFileName = fileName; } @Override public T setPriority(Priority priority) { mPriority = priority; return (T) this; } @Override public T setTag(Object tag) { mTag = tag; return (T) this; } @Override public T addHeaders(String key, String value) { mHeadersMap.put(key, value); return (T) this; } @Override public T addHeaders(Map<String, String> headerMap) { if (headerMap != null) { mHeadersMap.putAll(headerMap); } return (T) this; } @Override public T addHeaders(Object object) { if (object != null) { mHeadersMap.putAll(ParseUtil.getParserFactory().getStringMap(object)); } return (T) this; } @Override public T addQueryParameter(String key, String value) { mQueryParameterMap.put(key, value); return (T) this; } @Override public T addQueryParameter(Map<String, String> queryParameterMap) { if (queryParameterMap != null) { mQueryParameterMap.putAll(queryParameterMap); } return (T) this; } @Override public T addQueryParameter(Object object) { if (object != null) { mQueryParameterMap.putAll(ParseUtil.getParserFactory().getStringMap(object)); } return (T) this; } @Override public T addPathParameter(String key, String value) { mPathParameterMap.put(key, value); return (T) this; } @Override public T addPathParameter(Map<String, String> pathParameterMap) { if (pathParameterMap != null) { mPathParameterMap.putAll(pathParameterMap); } return (T) this; } @Override public T addPathParameter(Object object) { if (object != null) { mPathParameterMap.putAll(ParseUtil.getParserFactory().getStringMap(object)); } return (T) this; } @Override public T doNotCacheResponse() { mCacheControl = new CacheControl.Builder().noStore().build(); return (T) this; } @Override public T getResponseOnlyIfCached() { mCacheControl = CacheControl.FORCE_CACHE; return (T) this; } @Override public T getResponseOnlyFromNetwork() { mCacheControl = CacheControl.FORCE_NETWORK; return (T) this; } @Override public T setMaxAgeCacheControl(int maxAge, TimeUnit timeUnit) { mCacheControl = new CacheControl.Builder().maxAge(maxAge, timeUnit).build(); return (T) this; } @Override public T setMaxStaleCacheControl(int maxStale, TimeUnit timeUnit) { mCacheControl = new CacheControl.Builder().maxStale(maxStale, timeUnit).build(); return (T) this; } @Override public T setExecutor(Executor executor) { mExecutor = executor; return (T) this; } @Override public T setOkHttpClient(OkHttpClient okHttpClient) { mOkHttpClient = okHttpClient; return (T) this; } @Override public T setUserAgent(String userAgent) { mUserAgent = userAgent; return (T) this; } public T setPercentageThresholdForCancelling(int percentageThresholdForCancelling) { mPercentageThresholdForCancelling = percentageThresholdForCancelling; return (T) this; } public ANRequest build() { return new ANRequest(this); } } public static class MultiPartBuilder<T extends MultiPartBuilder> implements RequestBuilder { private Priority mPriority = Priority.MEDIUM; private String mUrl; private Object mTag; private HashMap<String, String> mHeadersMap = new HashMap<>(); private HashMap<String, String> mMultiPartParameterMap = new HashMap<>(); private HashMap<String, String> mQueryParameterMap = new HashMap<>(); private HashMap<String, String> mPathParameterMap = new HashMap<>(); private HashMap<String, File> mMultiPartFileMap = new HashMap<>(); private CacheControl mCacheControl; private int mPercentageThresholdForCancelling = 0; private Executor mExecutor; private OkHttpClient mOkHttpClient; private String mUserAgent; private String mCustomContentType; public MultiPartBuilder(String url) { this.mUrl = url; } @Override public T setPriority(Priority priority) { mPriority = priority; return (T) this; } @Override public T setTag(Object tag) { mTag = tag; return (T) this; } @Override public T addQueryParameter(String key, String value) { mQueryParameterMap.put(key, value); return (T) this; } @Override public T addQueryParameter(Map<String, String> queryParameterMap) { if (queryParameterMap != null) { mQueryParameterMap.putAll(queryParameterMap); } return (T) this; } @Override public T addQueryParameter(Object object) { if (object != null) { mQueryParameterMap.putAll(ParseUtil.getParserFactory().getStringMap(object)); } return (T) this; } @Override public T addPathParameter(String key, String value) { mPathParameterMap.put(key, value); return (T) this; } @Override public T addPathParameter(Map<String, String> pathParameterMap) { if (pathParameterMap != null) { mPathParameterMap.putAll(pathParameterMap); } return (T) this; } @Override public T addPathParameter(Object object) { if (object != null) { mPathParameterMap.putAll(ParseUtil.getParserFactory().getStringMap(object)); } return (T) this; } @Override public T addHeaders(String key, String value) { mHeadersMap.put(key, value); return (T) this; } @Override public T addHeaders(Map<String, String> headerMap) { if (headerMap != null) { mHeadersMap.putAll(headerMap); } return (T) this; } @Override public T addHeaders(Object object) { if (object != null) { mHeadersMap.putAll(ParseUtil.getParserFactory().getStringMap(object)); } return (T) this; } @Override public T doNotCacheResponse() { mCacheControl = new CacheControl.Builder().noStore().build(); return (T) this; } @Override public T getResponseOnlyIfCached() { mCacheControl = CacheControl.FORCE_CACHE; return (T) this; } @Override public T getResponseOnlyFromNetwork() { mCacheControl = CacheControl.FORCE_NETWORK; return (T) this; } @Override public T setMaxAgeCacheControl(int maxAge, TimeUnit timeUnit) { mCacheControl = new CacheControl.Builder().maxAge(maxAge, timeUnit).build(); return (T) this; } @Override public T setMaxStaleCacheControl(int maxStale, TimeUnit timeUnit) { mCacheControl = new CacheControl.Builder().maxStale(maxStale, timeUnit).build(); return (T) this; } @Override public T setExecutor(Executor executor) { mExecutor = executor; return (T) this; } @Override public T setOkHttpClient(OkHttpClient okHttpClient) { mOkHttpClient = okHttpClient; return (T) this; } @Override public T setUserAgent(String userAgent) { mUserAgent = userAgent; return (T) this; } public T addMultipartParameter(String key, String value) { mMultiPartParameterMap.put(key, value); return (T) this; } public T addMultipartParameter(Map<String, String> multiPartParameterMap) { if (multiPartParameterMap != null) { mMultiPartParameterMap.putAll(multiPartParameterMap); } return (T) this; } public T addMultipartParameter(Object object) { if (object != null) { mMultiPartParameterMap.putAll(ParseUtil.getParserFactory().getStringMap(object)); } return (T) this; } public T addMultipartFile(String key, File file) { mMultiPartFileMap.put(key, file); return (T) this; } public T addMultipartFile(Map<String, File> multiPartFileMap) { if (multiPartFileMap != null) { mMultiPartFileMap.putAll(multiPartFileMap); } return (T) this; } public T setPercentageThresholdForCancelling(int percentageThresholdForCancelling) { this.mPercentageThresholdForCancelling = percentageThresholdForCancelling; return (T) this; } public T setContentType(String contentType) { mCustomContentType = contentType; return (T) this; } public ANRequest build() { return new ANRequest(this); } } @Override public String toString() { return "ANRequest{" + "sequenceNumber='" + sequenceNumber + ", mMethod=" + mMethod + ", mPriority=" + mPriority + ", mRequestType=" + mRequestType + ", mUrl=" + mUrl + '}'; } }