From f33dfd288a4a6535bc8357765d1ffe98299100ba Mon Sep 17 00:00:00 2001 From: Alex Ning Date: Sun, 4 Jul 2021 09:05:14 +0800 Subject: Separate image uploading methods from SubmitPost and put them into a new class: UploadImageUtils to prepare to upload images when commenting and submitting text posts. --- .../infinityforreddit/post/SubmitPost.java | 83 ++---------------- .../infinityforreddit/utils/UploadImageUtils.java | 98 ++++++++++++++++++++++ 2 files changed, 103 insertions(+), 78 deletions(-) create mode 100644 app/src/main/java/ml/docilealligator/infinityforreddit/utils/UploadImageUtils.java diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/post/SubmitPost.java b/app/src/main/java/ml/docilealligator/infinityforreddit/post/SubmitPost.java index 33c4ea19..b7dd5f59 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/post/SubmitPost.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/post/SubmitPost.java @@ -8,14 +8,10 @@ import androidx.annotation.Nullable; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; -import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; -import org.xmlpull.v1.XmlPullParserFactory; -import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; -import java.io.StringReader; import java.util.HashMap; import java.util.Locale; import java.util.Map; @@ -25,6 +21,7 @@ import ml.docilealligator.infinityforreddit.Flair; import ml.docilealligator.infinityforreddit.apis.RedditAPI; import ml.docilealligator.infinityforreddit.utils.APIUtils; import ml.docilealligator.infinityforreddit.utils.JSONUtils; +import ml.docilealligator.infinityforreddit.utils.UploadImageUtils; import okhttp3.MediaType; import okhttp3.MultipartBody; import okhttp3.RequestBody; @@ -45,7 +42,7 @@ public class SubmitPost { String accessToken, String subredditName, String title, Bitmap image, Flair flair, boolean isSpoiler, boolean isNSFW, SubmitPostListener submitPostListener) { try { - String imageUrlOrError = uploadImage(oauthRetrofit, uploadMediaRetrofit, accessToken, image); + String imageUrlOrError = UploadImageUtils.uploadImage(oauthRetrofit, uploadMediaRetrofit, accessToken, image); if (imageUrlOrError != null && !imageUrlOrError.startsWith("Error: ")) { submitPost(executor, handler, oauthRetrofit, accessToken, subredditName, title, imageUrlOrError, flair, isSpoiler, isNSFW, @@ -76,7 +73,7 @@ public class SubmitPost { try { Response uploadImageResponse = uploadImageCall.execute(); if (uploadImageResponse.isSuccessful()) { - Map nameValuePairsMap = parseJSONResponseFromAWS(uploadImageResponse.body()); + Map nameValuePairsMap = UploadImageUtils.parseJSONResponseFromAWS(uploadImageResponse.body()); RequestBody fileBody = RequestBody.create(buffer, MediaType.parse("application/octet-stream")); MultipartBody.Part fileToUpload = MultipartBody.Part.createFormData("file", "post_video." + fileType, fileBody); @@ -90,12 +87,12 @@ public class SubmitPost { Call uploadMediaToAWS = uploadVideoToAWSApi.uploadMediaToAWS(nameValuePairsMap, fileToUpload); Response uploadMediaToAWSResponse = uploadMediaToAWS.execute(); if (uploadMediaToAWSResponse.isSuccessful()) { - String url = parseXMLResponseFromAWS(uploadMediaToAWSResponse.body()); + String url = UploadImageUtils.parseXMLResponseFromAWS(uploadMediaToAWSResponse.body()); if (url == null) { submitPostListener.submitFailed(null); return; } - String imageUrlOrError = uploadImage(oauthRetrofit, uploadMediaRetrofit, accessToken, posterBitmap); + String imageUrlOrError = UploadImageUtils.uploadImage(oauthRetrofit, uploadMediaRetrofit, accessToken, posterBitmap); if (imageUrlOrError != null && !imageUrlOrError.startsWith("Error: ")) { if (fileType.equals("gif")) { submitPost(executor, handler, oauthRetrofit, accessToken, @@ -185,40 +182,6 @@ public class SubmitPost { } } - @Nullable - private static String uploadImage(Retrofit oauthRetrofit, Retrofit uploadMediaRetrofit, - String accessToken, Bitmap image) throws IOException, JSONException, XmlPullParserException { - RedditAPI api = oauthRetrofit.create(RedditAPI.class); - - Map uploadImageParams = new HashMap<>(); - uploadImageParams.put(APIUtils.FILEPATH_KEY, "post_image.jpg"); - uploadImageParams.put(APIUtils.MIMETYPE_KEY, "image/jpeg"); - - Call uploadImageCall = api.uploadImage(APIUtils.getOAuthHeader(accessToken), uploadImageParams); - Response uploadImageResponse = uploadImageCall.execute(); - if (uploadImageResponse.isSuccessful()) { - Map nameValuePairsMap = parseJSONResponseFromAWS(uploadImageResponse.body()); - - ByteArrayOutputStream stream = new ByteArrayOutputStream(); - image.compress(Bitmap.CompressFormat.JPEG, 100, stream); - byte[] byteArray = stream.toByteArray(); - - RequestBody fileBody = RequestBody.create(MediaType.parse("application/octet-stream"), byteArray); - MultipartBody.Part fileToUpload = MultipartBody.Part.createFormData("file", "post_image.jpg", fileBody); - - RedditAPI uploadMediaToAWSApi = uploadMediaRetrofit.create(RedditAPI.class); - Call uploadMediaToAWS = uploadMediaToAWSApi.uploadMediaToAWS(nameValuePairsMap, fileToUpload); - Response uploadMediaToAWSResponse = uploadMediaToAWS.execute(); - if (uploadMediaToAWSResponse.isSuccessful()) { - return parseXMLResponseFromAWS(uploadMediaToAWSResponse.body()); - } else { - return "Error: " + uploadMediaToAWSResponse.code(); - } - } else { - return "Error: " + uploadImageResponse.message(); - } - } - private static void getSubmittedPost(Executor executor, Handler handler, String response, String kind, Retrofit oauthRetrofit, String accessToken, SubmitPostListener submitPostListener) throws JSONException, IOException { @@ -273,40 +236,4 @@ public class SubmitPost { void submitFailed(@Nullable String errorMessage); } - - private static Map parseJSONResponseFromAWS(String response) throws JSONException { - JSONObject responseObject = new JSONObject(response); - JSONArray nameValuePairs = responseObject.getJSONObject(JSONUtils.ARGS_KEY).getJSONArray(JSONUtils.FIELDS_KEY); - - Map nameValuePairsMap = new HashMap<>(); - for (int i = 0; i < nameValuePairs.length(); i++) { - nameValuePairsMap.put(nameValuePairs.getJSONObject(i).getString(JSONUtils.NAME_KEY), - APIUtils.getRequestBody(nameValuePairs.getJSONObject(i).getString(JSONUtils.VALUE_KEY))); - } - - return nameValuePairsMap; - } - - @Nullable - private static String parseXMLResponseFromAWS(String response) throws XmlPullParserException, IOException { - XmlPullParser xmlPullParser = XmlPullParserFactory.newInstance().newPullParser(); - xmlPullParser.setInput(new StringReader(response)); - - boolean isLocationTag = false; - int eventType = xmlPullParser.getEventType(); - while (eventType != XmlPullParser.END_DOCUMENT) { - if (eventType == XmlPullParser.START_TAG) { - if (xmlPullParser.getName().equals("Location")) { - isLocationTag = true; - } - } else if (eventType == XmlPullParser.TEXT) { - if (isLocationTag) { - return xmlPullParser.getText(); - } - } - eventType = xmlPullParser.next(); - } - - return null; - } } diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/utils/UploadImageUtils.java b/app/src/main/java/ml/docilealligator/infinityforreddit/utils/UploadImageUtils.java new file mode 100644 index 00000000..4eff065d --- /dev/null +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/utils/UploadImageUtils.java @@ -0,0 +1,98 @@ +package ml.docilealligator.infinityforreddit.utils; + +import android.graphics.Bitmap; + +import androidx.annotation.Nullable; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserException; +import org.xmlpull.v1.XmlPullParserFactory; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.StringReader; +import java.util.HashMap; +import java.util.Map; + +import ml.docilealligator.infinityforreddit.apis.RedditAPI; +import okhttp3.MediaType; +import okhttp3.MultipartBody; +import okhttp3.RequestBody; +import retrofit2.Call; +import retrofit2.Response; +import retrofit2.Retrofit; + +public class UploadImageUtils { + @Nullable + public static String uploadImage(Retrofit oauthRetrofit, Retrofit uploadMediaRetrofit, + String accessToken, Bitmap image) throws IOException, JSONException, XmlPullParserException { + RedditAPI api = oauthRetrofit.create(RedditAPI.class); + + Map uploadImageParams = new HashMap<>(); + uploadImageParams.put(APIUtils.FILEPATH_KEY, "post_image.jpg"); + uploadImageParams.put(APIUtils.MIMETYPE_KEY, "image/jpeg"); + + Call uploadImageCall = api.uploadImage(APIUtils.getOAuthHeader(accessToken), uploadImageParams); + Response uploadImageResponse = uploadImageCall.execute(); + if (uploadImageResponse.isSuccessful()) { + Map nameValuePairsMap = parseJSONResponseFromAWS(uploadImageResponse.body()); + + ByteArrayOutputStream stream = new ByteArrayOutputStream(); + image.compress(Bitmap.CompressFormat.JPEG, 100, stream); + byte[] byteArray = stream.toByteArray(); + + RequestBody fileBody = RequestBody.create(MediaType.parse("application/octet-stream"), byteArray); + MultipartBody.Part fileToUpload = MultipartBody.Part.createFormData("file", "post_image.jpg", fileBody); + + RedditAPI uploadMediaToAWSApi = uploadMediaRetrofit.create(RedditAPI.class); + Call uploadMediaToAWS = uploadMediaToAWSApi.uploadMediaToAWS(nameValuePairsMap, fileToUpload); + Response uploadMediaToAWSResponse = uploadMediaToAWS.execute(); + if (uploadMediaToAWSResponse.isSuccessful()) { + return parseXMLResponseFromAWS(uploadMediaToAWSResponse.body()); + } else { + return "Error: " + uploadMediaToAWSResponse.code(); + } + } else { + return "Error: " + uploadImageResponse.message(); + } + } + + @Nullable + public static String parseXMLResponseFromAWS(String response) throws XmlPullParserException, IOException { + XmlPullParser xmlPullParser = XmlPullParserFactory.newInstance().newPullParser(); + xmlPullParser.setInput(new StringReader(response)); + + boolean isLocationTag = false; + int eventType = xmlPullParser.getEventType(); + while (eventType != XmlPullParser.END_DOCUMENT) { + if (eventType == XmlPullParser.START_TAG) { + if (xmlPullParser.getName().equals("Location")) { + isLocationTag = true; + } + } else if (eventType == XmlPullParser.TEXT) { + if (isLocationTag) { + return xmlPullParser.getText(); + } + } + eventType = xmlPullParser.next(); + } + + return null; + } + + public static Map parseJSONResponseFromAWS(String response) throws JSONException { + JSONObject responseObject = new JSONObject(response); + JSONArray nameValuePairs = responseObject.getJSONObject(JSONUtils.ARGS_KEY).getJSONArray(JSONUtils.FIELDS_KEY); + + Map nameValuePairsMap = new HashMap<>(); + for (int i = 0; i < nameValuePairs.length(); i++) { + nameValuePairsMap.put(nameValuePairs.getJSONObject(i).getString(JSONUtils.NAME_KEY), + APIUtils.getRequestBody(nameValuePairs.getJSONObject(i).getString(JSONUtils.VALUE_KEY))); + } + + return nameValuePairsMap; + } +} -- cgit v1.2.3