Skip to content

Commit

Permalink
Merge pull request #318 from amitshekhariitbhu/development
Browse files Browse the repository at this point in the history
Add support for multi contentType and multiple files with same key
  • Loading branch information
amitshekhariitbhu committed Jul 10, 2018
2 parents 7613161 + b35b47a commit 909128d
Show file tree
Hide file tree
Showing 18 changed files with 938 additions and 40 deletions.
9 changes: 9 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,15 @@
Change Log
==========

Version 1.0.2 *(2018-07-10)*
----------------------------

* New: Add support for multiple file upload with same key
* New: Add support for multi contentType in multipart
* Bump OkHttp Version to 3.10.0
* Bump other dependencies


Version 1.0.1 *(2017-12-20)*
----------------------------

Expand Down
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ Fast Android Networking Library supports Android 2.3 (Gingerbread) and later.

Add this in your build.gradle
```groovy
compile 'com.amitshekhar.android:android-networking:1.0.1'
compile 'com.amitshekhar.android:android-networking:1.0.2'
```
Do not forget to add internet permission in manifest if already not present
```xml
Expand All @@ -77,7 +77,7 @@ AndroidNetworking.initialize(getApplicationContext(),okHttpClient);
```
Using the Fast Android Networking with Jackson Parser
```groovy
compile 'com.amitshekhar.android:jackson-android-networking:1.0.1'
compile 'com.amitshekhar.android:jackson-android-networking:1.0.2'
```
```java
// Then set the JacksonParserFactory like below
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,8 @@
import com.androidnetworking.interfaces.UploadProgressListener;
import com.androidnetworking.internal.ANRequestQueue;
import com.androidnetworking.internal.SynchronousCall;
import com.androidnetworking.model.MultipartFileBody;
import com.androidnetworking.model.MultipartStringBody;
import com.androidnetworking.utils.ParseUtil;
import com.androidnetworking.utils.Utils;
import com.google.gson.internal.$Gson$Types;
Expand Down Expand Up @@ -89,10 +91,10 @@ public class ANRequest<T extends ANRequest> {
private HashMap<String, List<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, MultipartStringBody> mMultiPartParameterMap = new HashMap<>();
private HashMap<String, List<String>> mQueryParameterMap = new HashMap<>();
private HashMap<String, String> mPathParameterMap = new HashMap<>();
private HashMap<String, File> mMultiPartFileMap = new HashMap<>();
private HashMap<String, List<MultipartFileBody>> mMultiPartFileMap = new HashMap<>();
private String mDirPath;
private String mFileName;
private String mApplicationJsonString = null;
Expand Down Expand Up @@ -849,22 +851,34 @@ public RequestBody getRequestBody() {
}

public RequestBody getMultiPartRequestBody() {
MultipartBody.Builder builder = new MultipartBody
.Builder()
MultipartBody.Builder builder = new MultipartBody.Builder()
.setType((customMediaType == null) ? MultipartBody.FORM : customMediaType);
try {
for (HashMap.Entry<String, String> entry : mMultiPartParameterMap.entrySet()) {
for (HashMap.Entry<String, MultipartStringBody> entry : mMultiPartParameterMap.entrySet()) {
MultipartStringBody stringBody = entry.getValue();
MediaType mediaType = null;
if (stringBody.contentType != null) {
mediaType = MediaType.parse(stringBody.contentType);
}
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);
RequestBody.create(mediaType, stringBody.value));
}
for (HashMap.Entry<String, List<MultipartFileBody>> entry : mMultiPartFileMap.entrySet()) {
List<MultipartFileBody> fileBodies = entry.getValue();
for (MultipartFileBody fileBody : fileBodies) {
String fileName = fileBody.file.getName();
MediaType mediaType;
if (fileBody.contentType != null) {
mediaType = MediaType.parse(fileBody.contentType);
} else {
mediaType = MediaType.parse(Utils.getMimeType(fileName));
}
RequestBody requestBody = RequestBody.create(mediaType, fileBody.file);
builder.addPart(Headers.of("Content-Disposition",
"form-data; name=\"" + entry.getKey() + "\"; filename=\"" + fileName + "\""),
requestBody);
}
}
} catch (Exception e) {
e.printStackTrace();
Expand Down Expand Up @@ -1602,10 +1616,10 @@ public static class MultiPartBuilder<T extends MultiPartBuilder> implements Requ
private String mUrl;
private Object mTag;
private HashMap<String, List<String>> mHeadersMap = new HashMap<>();
private HashMap<String, String> mMultiPartParameterMap = new HashMap<>();
private HashMap<String, List<String>> mQueryParameterMap = new HashMap<>();
private HashMap<String, String> mPathParameterMap = new HashMap<>();
private HashMap<String, File> mMultiPartFileMap = new HashMap<>();
private HashMap<String, MultipartStringBody> mMultiPartParameterMap = new HashMap<>();
private HashMap<String, List<MultipartFileBody>> mMultiPartFileMap = new HashMap<>();
private CacheControl mCacheControl;
private int mPercentageThresholdForCancelling = 0;
private Executor mExecutor;
Expand Down Expand Up @@ -1768,34 +1782,100 @@ public T setUserAgent(String userAgent) {
}

public T addMultipartParameter(String key, String value) {
mMultiPartParameterMap.put(key, value);
return addMultipartParameter(key, value, null);
}

public T addMultipartParameter(String key, String value, String contentType) {
MultipartStringBody stringBody = new MultipartStringBody(value, contentType);
mMultiPartParameterMap.put(key, stringBody);
return (T) this;
}

public T addMultipartParameter(Map<String, String> multiPartParameterMap) {
return addMultipartParameter(multiPartParameterMap, null);
}

public T addMultipartParameter(Map<String, String> multiPartParameterMap, String contentType) {
if (multiPartParameterMap != null) {
mMultiPartParameterMap.putAll(multiPartParameterMap);
Map<String, MultipartStringBody> parameterMap = new HashMap<>();
for (HashMap.Entry<String, String> entry : multiPartParameterMap.entrySet()) {
MultipartStringBody stringBody = new MultipartStringBody(entry.getValue(), contentType);
parameterMap.put(entry.getKey(), stringBody);
}
mMultiPartParameterMap.putAll(parameterMap);
}
return (T) this;
}

public T addMultipartParameter(Object object) {
return addMultipartParameter(object, null);
}

public T addMultipartParameter(Object object, String contentType) {
if (object != null) {
mMultiPartParameterMap.putAll(ParseUtil
Map<String, String> parameterMap = ParseUtil
.getParserFactory()
.getStringMap(object));
.getStringMap(object);
addMultipartParameter(parameterMap, contentType);
}
return (T) this;
}

public T addMultipartFile(String key, File file) {
mMultiPartFileMap.put(key, file);
return addMultipartFile(key, file, null);
}

public T addMultipartFile(String key, File file, String contentType) {
MultipartFileBody fileBody = new MultipartFileBody(file, contentType);
addMultipartFileWithKey(key, fileBody);
return (T) this;
}

public T addMultipartFile(Map<String, File> multiPartFileMap) {
return addMultipartFile(multiPartFileMap, null);
}

public T addMultipartFile(Map<String, File> multiPartFileMap, String contentType) {
if (multiPartFileMap != null) {
mMultiPartFileMap.putAll(multiPartFileMap);
for (HashMap.Entry<String, File> entry : multiPartFileMap.entrySet()) {
MultipartFileBody fileBody = new MultipartFileBody(entry.getValue(), contentType);
addMultipartFileWithKey(entry.getKey(), fileBody);
}
}
return (T) this;
}

public T addMultipartFileList(String key, List<File> files) {
return addMultipartFileList(key, files, null);
}

public T addMultipartFileList(String key, List<File> files, String contentType) {
if (files != null) {
for (File file : files) {
MultipartFileBody fileBody = new MultipartFileBody(file, contentType);
addMultipartFileWithKey(key, fileBody);
}
}
return (T) this;
}

public T addMultipartFileList(Map<String, List<File>> multiPartFileMap) {
return addMultipartFileList(multiPartFileMap, null);
}

public T addMultipartFileList(Map<String, List<File>> multiPartFileMap, String contentType) {
if (multiPartFileMap != null) {
Map<String, List<MultipartFileBody>> parameterMap = new HashMap<>();
for (HashMap.Entry<String, List<File>> entry : multiPartFileMap.entrySet()) {
List<File> files = entry.getValue();
List<MultipartFileBody> fileBodies = new ArrayList<>();
for (File file : files) {
MultipartFileBody fileBody = new MultipartFileBody(file, contentType);
fileBodies.add(fileBody);
}
parameterMap.put(entry.getKey(), fileBodies);
}
mMultiPartFileMap.putAll(parameterMap);
}
return (T) this;
}
Expand All @@ -1810,6 +1890,15 @@ public T setContentType(String contentType) {
return (T) this;
}

private void addMultipartFileWithKey(String key, MultipartFileBody fileBody) {
List<MultipartFileBody> fileBodies = mMultiPartFileMap.get(key);
if (fileBodies == null) {
fileBodies = new ArrayList<>();
}
fileBodies.add(fileBody);
mMultiPartFileMap.put(key, fileBodies);
}

public ANRequest build() {
return new ANRequest(this);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.androidnetworking.model;

import java.io.File;

public class MultipartFileBody {

public final File file;
public final String contentType;

public MultipartFileBody(File file, String contentType) {
this.file = file;
this.contentType = contentType;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.androidnetworking.model;

public class MultipartStringBody {

public final String value;
public final String contentType;

public MultipartStringBody(String value, String contentType) {
this.value = value;
this.contentType = contentType;
}

}
2 changes: 1 addition & 1 deletion android-networking/upload.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ def siteUrl = 'https://github.com/amitshekhariitbhu/Fast-Android-Networking'
def gitUrl = 'https://github.com/amitshekhariitbhu/Fast-Android-Networking.git'

group = "com.amitshekhar.android"
version = '1.0.1'
version = '1.0.2'

install {
repositories.mavenInstaller {
Expand Down
4 changes: 3 additions & 1 deletion app/src/main/java/com/networking/ApiTestActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -433,9 +433,11 @@ public void onError(ANError error) {
}

public void uploadImage(final View view) {
final String key = "image";
final File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath(), "test.png");
AndroidNetworking.upload(ApiEndPoint.BASE_URL + ApiEndPoint.UPLOAD_IMAGE)
.setPriority(Priority.MEDIUM)
.addMultipartFile("image", new File(Environment.getExternalStorageDirectory().getAbsolutePath(), "test.png"))
.addMultipartFile(key, file)
.setTag(this)
.build()
.setAnalyticsListener(new AnalyticsListener() {
Expand Down
16 changes: 16 additions & 0 deletions app/src/main/java/com/networking/OkHttpResponseTestActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -1059,6 +1059,22 @@ public void onReceived(long timeTakenInMillis, long bytesSent, long bytesReceive
}).start();
}

public void checkOptionsRequest(View view) {
AndroidNetworking.options("https://api.github.com/square/okhttp/issues")
.build()
.getAsOkHttpResponse(new OkHttpResponseListener() {
@Override
public void onResponse(Response response) {
Log.d(TAG, "response : " + response.headers().toString());
}

@Override
public void onError(ANError anError) {
Utils.logError(TAG, anError);
}
});
}

public void getCurrentConnectionQuality(View view) {
Log.d(TAG, "getCurrentConnectionQuality : " + AndroidNetworking.getCurrentConnectionQuality() + " currentBandwidth : " + AndroidNetworking.getCurrentBandwidth());
}
Expand Down
16 changes: 8 additions & 8 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ buildscript {
google()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.2'
classpath 'com.android.tools.build:gradle:3.1.0'
classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.4'
classpath 'com.github.dcendents:android-maven-gradle-plugin:1.4.1'
// NOTE: Do not place your application dependencies here; they belong
Expand All @@ -47,17 +47,17 @@ ext {
compileSdkVersion = 27
minSdkVersion = 14
targetSdkVersion = 27
buildToolsVersion = "26.0.2"
buildToolsVersion = "27.0.3"

// App dependencies versions
okHttp3Version = "3.9.1"
okHttp3Version = "3.10.0"
gsonVersion = "2.8.2"
jacksonVersion = "2.8.2"
rxJavaVersion = "1.3.4"
rxJavaVersion = "1.3.8"
rxJavaAndroidVersion = "1.2.1"
rxJava2Version = "2.1.7"
rxJava2AndroidVersion = "2.0.1"
rxJava2Version = "2.1.12"
rxJava2AndroidVersion = "2.0.2"
jUnitVersion = "4.12"
mockWebServerVersion = "3.9.1"
supportAppCompatVersion = "27.0.2"
mockWebServerVersion = "3.10.0"
supportAppCompatVersion = "27.1.1"
}
4 changes: 2 additions & 2 deletions gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#Wed Dec 06 17:39:39 MST 2017
#Thu Apr 12 21:48:48 IST 2018
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip
2 changes: 1 addition & 1 deletion jackson-android-networking/jackson-upload.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ def siteUrl = 'https://github.com/amitshekhariitbhu/Fast-Android-Networking'
def gitUrl = 'https://github.com/amitshekhariitbhu/Fast-Android-Networking.git'

group = "com.amitshekhar.android"
version = '1.0.1'
version = '1.0.2'

install {
repositories.mavenInstaller {
Expand Down
2 changes: 1 addition & 1 deletion rx-android-networking/rx-upload.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ def siteUrl = 'https://github.com/amitshekhariitbhu/Fast-Android-Networking'
def gitUrl = 'https://github.com/amitshekhariitbhu/Fast-Android-Networking.git'

group = "com.amitshekhar.android"
version = '1.0.1'
version = '1.0.2'

install {
repositories.mavenInstaller {
Expand Down
2 changes: 1 addition & 1 deletion rx2-android-networking/rx2-upload.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ def siteUrl = 'https://github.com/amitshekhariitbhu/Fast-Android-Networking'
def gitUrl = 'https://github.com/amitshekhariitbhu/Fast-Android-Networking.git'

group = "com.amitshekhar.android"
version = '1.0.1'
version = '1.0.2'

install {
repositories.mavenInstaller {
Expand Down

0 comments on commit 909128d

Please sign in to comment.