From 299813d527aea24c1b1dbf6ea9aca34f697ef51d Mon Sep 17 00:00:00 2001 From: Alex Ning Date: Fri, 16 Jul 2021 22:44:18 +0800 Subject: [PATCH] Continue adding support for submitting gallery posts. --- .../RedditGalleryPayload.java | 17 +++++++--- .../activities/PostGalleryActivity.java | 34 ++++++++++++------- ...tGallerySubmissionRecyclerViewAdapter.java | 4 +-- .../events/SubmitGalleryPostEvent.java | 15 ++++++++ .../services/SubmitPostService.java | 21 ++++++++++-- .../infinityforreddit/utils/JSONUtils.java | 1 + app/src/main/res/values/strings.xml | 1 + 7 files changed, 70 insertions(+), 23 deletions(-) create mode 100644 app/src/main/java/ml/docilealligator/infinityforreddit/events/SubmitGalleryPostEvent.java diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/RedditGalleryPayload.java b/app/src/main/java/ml/docilealligator/infinityforreddit/RedditGalleryPayload.java index 94fcb822..ef91d6d9 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/RedditGalleryPayload.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/RedditGalleryPayload.java @@ -5,7 +5,7 @@ import android.os.Parcelable; import com.google.gson.annotations.SerializedName; -import java.util.List; +import java.util.ArrayList; public class RedditGalleryPayload { @SerializedName("sr") @@ -29,17 +29,24 @@ public class RedditGalleryPayload { public boolean sendReplies; @SerializedName("validate_on_submit") public boolean validateOnSubmit = true; - public List items; + @SerializedName("flair_id") + public String flairId; + @SerializedName("flair_text") + public String flairText; + public ArrayList items; - public RedditGalleryPayload(String subredditName, String submitType, String kind, String title, - boolean isSpoiler, boolean isNSFW, boolean sendReplies, List items) { + public RedditGalleryPayload(String subredditName, String submitType, String title, + boolean isSpoiler, boolean isNSFW, boolean sendReplies, Flair flair, ArrayList items) { this.subredditName = subredditName; this.submitType = submitType; this.title = title; this.isSpoiler = isSpoiler; this.isNSFW = isNSFW; - this.kind = kind; this.sendReplies = sendReplies; + if (flair != null) { + flairId = flair.getId(); + flairText = flair.getText(); + } this.items = items; } diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/activities/PostGalleryActivity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/activities/PostGalleryActivity.java index 21d5c5d6..429257e0 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/activities/PostGalleryActivity.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/activities/PostGalleryActivity.java @@ -24,7 +24,6 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.widget.Toolbar; import androidx.coordinatorlayout.widget.CoordinatorLayout; -import androidx.core.content.ContextCompat; import androidx.core.content.FileProvider; import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -459,9 +458,9 @@ public class PostGalleryActivity extends BaseActivity implements FlairBottomShee try { Bitmap resource = Glide.with(PostGalleryActivity.this).asBitmap().load(imageUri).submit().get(); String response = UploadImageUtils.uploadImage(mOauthRetrofit, mUploadMediaRetrofit, mAccessToken, resource, true); - RedditGalleryPayload.Item item = new Gson().fromJson(new JSONObject(response).getJSONObject(JSONUtils.ASSET_KEY).toString(), RedditGalleryPayload.Item.class); + String mediaId = new JSONObject(response).getJSONObject(JSONUtils.ASSET_KEY).getString(JSONUtils.ASSET_ID_KEY); handler.post(() -> { - adapter.setImageAsUploaded(item); + adapter.setImageAsUploaded(mediaId); isUploading = false; }); } catch (ExecutionException | InterruptedException e) { @@ -475,7 +474,7 @@ public class PostGalleryActivity extends BaseActivity implements FlairBottomShee e.printStackTrace(); handler.post(() -> { adapter.removeFailedToUploadImage(); - Snackbar.make(coordinatorLayout, R.string.error_processing_image, Snackbar.LENGTH_LONG).show(); + Snackbar.make(coordinatorLayout, R.string.upload_image_failed, Snackbar.LENGTH_LONG).show(); isUploading = false; }); } @@ -516,7 +515,7 @@ public class PostGalleryActivity extends BaseActivity implements FlairBottomShee @Override public boolean onCreateOptionsMenu(Menu menu) { - getMenuInflater().inflate(R.menu.post_image_activity, menu); + getMenuInflater().inflate(R.menu.post_gallery_activity, menu); applyMenuItemTheme(menu); mMemu = menu; if (isPosting) { @@ -541,7 +540,7 @@ public class PostGalleryActivity extends BaseActivity implements FlairBottomShee } finish(); return true; - } else if (itemId == R.id.action_send_post_image_activity) { + } else if (itemId == R.id.action_send_post_gallery_activity) { if (!subredditSelected) { Snackbar.make(coordinatorLayout, R.string.select_a_subreddit, Snackbar.LENGTH_SHORT).show(); return true; @@ -552,11 +551,16 @@ public class PostGalleryActivity extends BaseActivity implements FlairBottomShee return true; } - if (redditGalleryImageInfoList == null) { + if (redditGalleryImageInfoList == null || redditGalleryImageInfoList.isEmpty()) { Snackbar.make(coordinatorLayout, R.string.select_an_image, Snackbar.LENGTH_SHORT).show(); return true; } + if (redditGalleryImageInfoList.get(redditGalleryImageInfoList.size() - 1).payload == null) { + Snackbar.make(coordinatorLayout, R.string.please_wait_image_is_uploading, Snackbar.LENGTH_LONG).show(); + return true; + } + isPosting = true; item.setEnabled(false); @@ -574,13 +578,17 @@ public class PostGalleryActivity extends BaseActivity implements FlairBottomShee Intent intent = new Intent(this, SubmitPostService.class); intent.putExtra(SubmitPostService.EXTRA_ACCESS_TOKEN, mAccessToken); intent.putExtra(SubmitPostService.EXTRA_SUBREDDIT_NAME, subredditName); - intent.putExtra(SubmitPostService.EXTRA_TITLE, titleEditText.getText().toString()); - intent.putExtra(SubmitPostService.EXTRA_FLAIR, flair); - intent.putExtra(SubmitPostService.EXTRA_IS_SPOILER, isSpoiler); - intent.putExtra(SubmitPostService.EXTRA_IS_NSFW, isNSFW); - intent.putExtra(SubmitPostService.EXTRA_RECEIVE_POST_REPLY_NOTIFICATIONS, receivePostReplyNotificationsSwitchMaterial.isChecked()); + intent.putExtra(SubmitPostService.EXTRA_POST_TYPE, SubmitPostService.EXTRA_POST_TYPE_GALLERY); + ArrayList items = new ArrayList<>(); + for (RedditGallerySubmissionRecyclerViewAdapter.RedditGalleryImageInfo i : redditGalleryImageInfoList) { + items.add(i.payload); + } + RedditGalleryPayload payload = new RedditGalleryPayload(subredditName, subredditIsUser ? "profile" : "subreddit", + titleEditText.getText().toString(), isSpoiler, isNSFW, receivePostReplyNotificationsSwitchMaterial.isChecked(), + flair, items); + intent.putExtra(SubmitPostService.EXTRA_REDDIT_GALLERY_PAYLOAD, new Gson().toJson(payload)); - ContextCompat.startForegroundService(this, intent); + //ContextCompat.startForegroundService(this, intent); return true; } diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/RedditGallerySubmissionRecyclerViewAdapter.java b/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/RedditGallerySubmissionRecyclerViewAdapter.java index 80b4d1e4..66f0a8b9 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/RedditGallerySubmissionRecyclerViewAdapter.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/RedditGallerySubmissionRecyclerViewAdapter.java @@ -131,8 +131,8 @@ public class RedditGallerySubmissionRecyclerViewAdapter extends RecyclerView.Ada notifyItemInserted(redditGalleryImageInfoList.size() - 1); } - public void setImageAsUploaded(RedditGalleryPayload.Item item) { - redditGalleryImageInfoList.get(redditGalleryImageInfoList.size() - 1).payload = item; + public void setImageAsUploaded(String mediaId) { + redditGalleryImageInfoList.get(redditGalleryImageInfoList.size() - 1).payload = new RedditGalleryPayload.Item("", "", mediaId); notifyItemChanged(redditGalleryImageInfoList.size() - 1); } diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/events/SubmitGalleryPostEvent.java b/app/src/main/java/ml/docilealligator/infinityforreddit/events/SubmitGalleryPostEvent.java new file mode 100644 index 00000000..53ee9906 --- /dev/null +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/events/SubmitGalleryPostEvent.java @@ -0,0 +1,15 @@ +package ml.docilealligator.infinityforreddit.events; + +import ml.docilealligator.infinityforreddit.post.Post; + +public class SubmitGalleryPostEvent { + public boolean postSuccess; + public Post post; + public String errorMessage; + + public SubmitGalleryPostEvent(boolean postSuccess, Post post, String errorMessage) { + this.postSuccess = postSuccess; + this.post = post; + this.errorMessage = errorMessage; + } +} diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/services/SubmitPostService.java b/app/src/main/java/ml/docilealligator/infinityforreddit/services/SubmitPostService.java index b883b02c..54f99c2d 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/services/SubmitPostService.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/services/SubmitPostService.java @@ -41,6 +41,7 @@ import javax.inject.Named; import ml.docilealligator.infinityforreddit.Flair; import ml.docilealligator.infinityforreddit.Infinity; import ml.docilealligator.infinityforreddit.R; +import ml.docilealligator.infinityforreddit.apis.RedditAPI; import ml.docilealligator.infinityforreddit.customtheme.CustomThemeWrapper; import ml.docilealligator.infinityforreddit.events.SubmitCrosspostEvent; import ml.docilealligator.infinityforreddit.events.SubmitImagePostEvent; @@ -50,6 +51,7 @@ import ml.docilealligator.infinityforreddit.post.Post; import ml.docilealligator.infinityforreddit.post.SubmitPost; import ml.docilealligator.infinityforreddit.utils.APIUtils; import ml.docilealligator.infinityforreddit.utils.NotificationUtils; +import retrofit2.Response; import retrofit2.Retrofit; public class SubmitPostService extends Service { @@ -67,7 +69,8 @@ public class SubmitPostService extends Service { public static final int EXTRA_POST_TEXT_OR_LINK = 0; public static final int EXTRA_POST_TYPE_IMAGE = 1; public static final int EXTRA_POST_TYPE_VIDEO = 2; - public static final int EXTRA_POST_TYPE_CROSSPOST = 3; + public static final int EXTRA_POST_TYPE_GALLERY = 3; + public static final int EXTRA_POST_TYPE_CROSSPOST = 4; private static final String EXTRA_MEDIA_URI = "EU"; @Inject @@ -126,10 +129,12 @@ public class SubmitPostService extends Service { Uri mediaUri = Uri.parse(bundle.getString(EXTRA_MEDIA_URI)); submitImagePost(accessToken, mediaUri, subredditName, title, flair, isSpoiler, isNSFW, receivePostReplyNotifications); - } else { + } else if (postType == EXTRA_POST_TYPE_VIDEO) { Uri mediaUri = Uri.parse(bundle.getString(EXTRA_MEDIA_URI)); submitVideoPost(accessToken, mediaUri, subredditName, title, flair, isSpoiler, isNSFW, receivePostReplyNotifications); + } else { + } } } @@ -176,9 +181,11 @@ public class SubmitPostService extends Service { } else if (postType == EXTRA_POST_TYPE_IMAGE) { bundle.putString(EXTRA_MEDIA_URI, intent.getData().toString()); startForeground(NotificationUtils.SUBMIT_POST_SERVICE_NOTIFICATION_ID + randomNotificationIdOffset, createNotification(R.string.posting_image)); - } else { + } else if (postType == EXTRA_POST_TYPE_VIDEO) { bundle.putString(EXTRA_MEDIA_URI, intent.getData().toString()); startForeground(NotificationUtils.SUBMIT_POST_SERVICE_NOTIFICATION_ID + randomNotificationIdOffset, createNotification(R.string.posting_video)); + } else { + startForeground(NotificationUtils.SUBMIT_POST_SERVICE_NOTIFICATION_ID + randomNotificationIdOffset, createNotification(R.string.posting_gallery)); } Message msg = serviceHandler.obtainMessage(); @@ -328,6 +335,14 @@ public class SubmitPostService extends Service { } } + private void submitGalleryPost(String accessToken, String payload) { + try { + Response response = mOauthRetrofit.create(RedditAPI.class).submitGalleryPost(APIUtils.getOAuthHeader(accessToken), payload).execute(); + } catch (IOException e) { + e.printStackTrace(); + } + } + private static void copyFileToCache(InputStream fileInputStream, String destinationFilePath) throws IOException { OutputStream out = new FileOutputStream(destinationFilePath); byte[] buf = new byte[2048]; diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/utils/JSONUtils.java b/app/src/main/java/ml/docilealligator/infinityforreddit/utils/JSONUtils.java index 785cd12d..c1b9843b 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/utils/JSONUtils.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/utils/JSONUtils.java @@ -165,4 +165,5 @@ public class JSONUtils { public static final String PAYLOAD_KEY = "payload"; public static final String AUTHOR_ICON_IMAGE = "author_icon_img"; public static final String ASSET_KEY = "asset"; + public static final String ASSET_ID_KEY = "asset_id"; } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 51f6727a..d57ac76e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -287,6 +287,7 @@ Posting Video Posting Image + Posting Gallery Please wait Add account