From cb8cd24a47865ec3c4940b3fcbfd948091f69e81 Mon Sep 17 00:00:00 2001 From: Michael Boisvert Date: Sat, 30 Nov 2024 13:49:46 -0700 Subject: [PATCH 1/8] Refactor to make request type an argument for CacheRequest --- .../activities/ImageViewActivity.java | 2 + .../activities/ImgurUploadActivity.java | 1 + .../activities/InboxListingActivity.java | 1 + .../redreader/cache/CacheDownload.java | 1 + .../redreader/cache/CacheRequest.java | 14 ++++ .../redreader/common/FileUtils.java | 2 + .../redreader/compose/net/NetWrapper.kt | 1 + .../fragments/PostListingFragment.java | 3 + .../redreader/fragments/UserProfileDialog.kt | 1 + .../redreader/http/HTTPBackend.kt | 7 +- .../redreader/http/okhttp/OKHTTPBackend.kt | 67 ++++++++++--------- .../redreader/image/DeviantArtAPI.java | 1 + .../redreader/image/GfycatAPI.java | 1 + .../redreader/image/ImgurAPI.java | 2 + .../redreader/image/ImgurAPIV3.java | 2 + .../redreader/image/RedditGalleryAPI.kt | 1 + .../redreader/image/RedditVideosAPI.kt | 1 + .../redreader/image/RedgifsAPI.java | 1 + .../redreader/image/RedgifsAPIV2.java | 2 + .../redreader/image/StreamableAPI.java | 1 + .../receivers/NewMessageChecker.java | 1 + .../announcements/AnnouncementDownloader.java | 1 + .../reddit/CommentListingRequest.java | 1 + .../redreader/reddit/RedditAPI.java | 2 + ...itAPIIndividualSubredditDataRequester.java | 1 + ...itAPIIndividualSubredditListRequester.java | 1 + .../RedditAPIMultiredditListRequester.java | 1 + .../redreader/reddit/api/RedditOAuth.kt | 8 ++- .../reddit/prepared/RedditPreparedPost.java | 1 + .../prepared/html/HtmlRawElementImg.java | 1 + .../redreader/views/RedditPostView.java | 1 + 31 files changed, 97 insertions(+), 34 deletions(-) diff --git a/src/main/java/org/quantumbadger/redreader/activities/ImageViewActivity.java b/src/main/java/org/quantumbadger/redreader/activities/ImageViewActivity.java index 69085d8a3..7c05b14c4 100644 --- a/src/main/java/org/quantumbadger/redreader/activities/ImageViewActivity.java +++ b/src/main/java/org/quantumbadger/redreader/activities/ImageViewActivity.java @@ -889,6 +889,7 @@ private void makeCacheRequest( DownloadStrategyIfNotCached.INSTANCE, Constants.FileType.IMAGE, CacheRequest.DownloadQueueType.IMMEDIATE, + CacheRequest.RequestMethod.GET, this, new CacheRequestCallbacks() { @@ -979,6 +980,7 @@ public void onDataStreamAvailable( DownloadStrategyIfNotCached.INSTANCE, Constants.FileType.IMAGE, CacheRequest.DownloadQueueType.IMMEDIATE, + CacheRequest.RequestMethod.GET, this, new CacheRequestCallbacks() { @Override diff --git a/src/main/java/org/quantumbadger/redreader/activities/ImgurUploadActivity.java b/src/main/java/org/quantumbadger/redreader/activities/ImgurUploadActivity.java index 5fb7224fe..c4e04201d 100644 --- a/src/main/java/org/quantumbadger/redreader/activities/ImgurUploadActivity.java +++ b/src/main/java/org/quantumbadger/redreader/activities/ImgurUploadActivity.java @@ -285,6 +285,7 @@ private void uploadImage() { DownloadStrategyAlways.INSTANCE, Constants.FileType.NOCACHE, CacheRequest.DownloadQueueType.IMGUR_API, + CacheRequest.RequestMethod.POST, new HTTPRequestBody.Multipart() .addPart(new Part.FormDataBinary("image", mImageData)), this, diff --git a/src/main/java/org/quantumbadger/redreader/activities/InboxListingActivity.java b/src/main/java/org/quantumbadger/redreader/activities/InboxListingActivity.java index 06a1ed38a..7b7cbf315 100644 --- a/src/main/java/org/quantumbadger/redreader/activities/InboxListingActivity.java +++ b/src/main/java/org/quantumbadger/redreader/activities/InboxListingActivity.java @@ -262,6 +262,7 @@ private void makeFirstRequest(final Context context) { DownloadStrategyAlways.INSTANCE, Constants.FileType.INBOX_LIST, CacheRequest.DownloadQueueType.REDDIT_API, + CacheRequest.RequestMethod.GET, false, context, new CacheRequestCallbacks() { diff --git a/src/main/java/org/quantumbadger/redreader/cache/CacheDownload.java b/src/main/java/org/quantumbadger/redreader/cache/CacheDownload.java index 8660bcba3..0507192df 100644 --- a/src/main/java/org/quantumbadger/redreader/cache/CacheDownload.java +++ b/src/main/java/org/quantumbadger/redreader/cache/CacheDownload.java @@ -75,6 +75,7 @@ public CacheDownload( initiator.context, new HTTPBackend.RequestDetails( mInitiator.url, + mInitiator.requestMethod, mInitiator.requestBody.asNullable())); } diff --git a/src/main/java/org/quantumbadger/redreader/cache/CacheRequest.java b/src/main/java/org/quantumbadger/redreader/cache/CacheRequest.java index a5a66e41a..d3fe3bef4 100644 --- a/src/main/java/org/quantumbadger/redreader/cache/CacheRequest.java +++ b/src/main/java/org/quantumbadger/redreader/cache/CacheRequest.java @@ -64,6 +64,11 @@ public enum RequestFailureType { CACHE_DIR_DOES_NOT_EXIST } + public enum RequestMethod { + GET, + POST + } + public final UriString url; public final RedditAccount user; public final UUID requestSession; @@ -75,6 +80,7 @@ public enum RequestFailureType { public final int fileType; public final DownloadQueueType queueType; + public final RequestMethod requestMethod; @NonNull public final Optional requestBody; public final boolean cache; @@ -114,6 +120,7 @@ public CacheRequest( @NonNull final DownloadStrategy downloadStrategy, final int fileType, final DownloadQueueType queueType, + final RequestMethod requestMethod, final boolean cache, @NonNull final Context context, @NonNull final CacheRequestCallbacks callbacks) { @@ -126,6 +133,7 @@ public CacheRequest( downloadStrategy, fileType, queueType, + requestMethod, null, cache, context, @@ -140,6 +148,7 @@ public CacheRequest( @NonNull final DownloadStrategy downloadStrategy, final int fileType, final DownloadQueueType queueType, + final RequestMethod requestMethod, @NonNull final Context context, @NonNull final CacheRequestCallbacks callbacks) { @@ -151,6 +160,7 @@ public CacheRequest( downloadStrategy, fileType, queueType, + requestMethod, true, context, callbacks); @@ -164,6 +174,7 @@ public CacheRequest( @NonNull final DownloadStrategy downloadStrategy, final int fileType, final DownloadQueueType queueType, + final RequestMethod requestMethod, @Nullable final HTTPRequestBody requestBody, @NonNull final Context context, @NonNull final CacheRequestCallbacks callbacks) { @@ -176,6 +187,7 @@ public CacheRequest( downloadStrategy, fileType, queueType, + requestMethod, requestBody, false, context, @@ -191,6 +203,7 @@ private CacheRequest( @NonNull final DownloadStrategy downloadStrategy, final int fileType, final DownloadQueueType queueType, + final RequestMethod requestMethod, @Nullable final HTTPRequestBody requestBody, final boolean cache, @NonNull final Context context, @@ -216,6 +229,7 @@ private CacheRequest( this.downloadStrategy = downloadStrategy; this.fileType = fileType; this.queueType = queueType; + this.requestMethod = requestMethod; this.requestBody = Optional.ofNullable(requestBody); this.cache = (requestBody == null) && cache; diff --git a/src/main/java/org/quantumbadger/redreader/common/FileUtils.java b/src/main/java/org/quantumbadger/redreader/common/FileUtils.java index 7e3b69878..58207b6e4 100644 --- a/src/main/java/org/quantumbadger/redreader/common/FileUtils.java +++ b/src/main/java/org/quantumbadger/redreader/common/FileUtils.java @@ -487,6 +487,7 @@ private static void internalDownloadImageToSaveAudio( DownloadStrategyIfNotCached.INSTANCE, Constants.FileType.IMAGE, CacheRequest.DownloadQueueType.IMMEDIATE, + CacheRequest.RequestMethod.GET, activity, new CacheRequestCallbacks() { @@ -604,6 +605,7 @@ public void onSuccess(final ImageInfo info) { DownloadStrategyIfNotCached.INSTANCE, Constants.FileType.IMAGE, CacheRequest.DownloadQueueType.IMMEDIATE, + CacheRequest.RequestMethod.GET, activity, new CacheRequestCallbacks() { @Override diff --git a/src/main/java/org/quantumbadger/redreader/compose/net/NetWrapper.kt b/src/main/java/org/quantumbadger/redreader/compose/net/NetWrapper.kt index 123c8bd49..3363d98e3 100644 --- a/src/main/java/org/quantumbadger/redreader/compose/net/NetWrapper.kt +++ b/src/main/java/org/quantumbadger/redreader/compose/net/NetWrapper.kt @@ -315,6 +315,7 @@ private fun fetchFile( downloadStrategy, fileType, queueType, + CacheRequest.RequestMethod.GET, cache, context, object : CacheRequestCallbacks { diff --git a/src/main/java/org/quantumbadger/redreader/fragments/PostListingFragment.java b/src/main/java/org/quantumbadger/redreader/fragments/PostListingFragment.java index 573aebabd..0fa4423b0 100644 --- a/src/main/java/org/quantumbadger/redreader/fragments/PostListingFragment.java +++ b/src/main/java/org/quantumbadger/redreader/fragments/PostListingFragment.java @@ -665,6 +665,7 @@ private CacheRequest createPostListingRequest( downloadStrategy, Constants.FileType.POST_LIST, CacheRequest.DownloadQueueType.REDDIT_API, + CacheRequest.RequestMethod.GET, activity, new CacheRequestCallbacks() { @Override @@ -1018,6 +1019,7 @@ private void precacheComments( TimestampBound.notOlderThan(TimeDuration.minutes(15))), Constants.FileType.COMMENT_LIST, CacheRequest.DownloadQueueType.REDDIT_API, + CacheRequest.RequestMethod.GET, // Don't parse the JSON activity, new CacheRequestCallbacks() { @@ -1133,6 +1135,7 @@ private void precacheImage( DownloadStrategyIfNotCached.INSTANCE, Constants.FileType.IMAGE, CacheRequest.DownloadQueueType.IMAGE_PRECACHE, + CacheRequest.RequestMethod.GET, activity, new CacheRequestCallbacks() { @Override diff --git a/src/main/java/org/quantumbadger/redreader/fragments/UserProfileDialog.kt b/src/main/java/org/quantumbadger/redreader/fragments/UserProfileDialog.kt index d27a74fb8..e3d57914d 100644 --- a/src/main/java/org/quantumbadger/redreader/fragments/UserProfileDialog.kt +++ b/src/main/java/org/quantumbadger/redreader/fragments/UserProfileDialog.kt @@ -437,6 +437,7 @@ object UserProfileDialog { DownloadStrategyIfNotCached.INSTANCE, Constants.FileType.INLINE_IMAGE_PREVIEW, CacheRequest.DownloadQueueType.IMMEDIATE, + CacheRequest.RequestMethod.GET, context, object : CacheRequestCallbacks { override fun onDataStreamComplete( diff --git a/src/main/java/org/quantumbadger/redreader/http/HTTPBackend.kt b/src/main/java/org/quantumbadger/redreader/http/HTTPBackend.kt index bbad86973..42a1c765a 100644 --- a/src/main/java/org/quantumbadger/redreader/http/HTTPBackend.kt +++ b/src/main/java/org/quantumbadger/redreader/http/HTTPBackend.kt @@ -18,6 +18,7 @@ package org.quantumbadger.redreader.http import android.content.Context +import org.quantumbadger.redreader.cache.CacheRequest.RequestMethod import org.quantumbadger.redreader.cache.CacheRequest.RequestFailureType import org.quantumbadger.redreader.common.Result import org.quantumbadger.redreader.common.UriString @@ -26,9 +27,11 @@ import org.quantumbadger.redreader.http.okhttp.OKHTTPBackend import java.io.InputStream abstract class HTTPBackend { + data class RequestDetails( - val url: UriString, - val requestBody: HTTPRequestBody? + val url: UriString, + val requestMethod: RequestMethod, + val requestBody: HTTPRequestBody? ) interface Request { diff --git a/src/main/java/org/quantumbadger/redreader/http/okhttp/OKHTTPBackend.kt b/src/main/java/org/quantumbadger/redreader/http/okhttp/OKHTTPBackend.kt index cd05b5d4c..ee9f0a9de 100644 --- a/src/main/java/org/quantumbadger/redreader/http/okhttp/OKHTTPBackend.kt +++ b/src/main/java/org/quantumbadger/redreader/http/okhttp/OKHTTPBackend.kt @@ -28,7 +28,9 @@ import okhttp3.HttpUrl import okhttp3.MediaType.Companion.toMediaType import okhttp3.MultipartBody import okhttp3.OkHttpClient +import okhttp3.RequestBody import okhttp3.RequestBody.Companion.toRequestBody +import okhttp3.internal.EMPTY_REQUEST import org.quantumbadger.redreader.cache.CacheRequest import org.quantumbadger.redreader.common.Constants import org.quantumbadger.redreader.common.General.getGeneralErrorForFailure @@ -174,37 +176,9 @@ class OKHTTPBackend private constructor() : HTTPBackend() { val requestBody = details.requestBody - if (requestBody != null) { - reqBuilder.post( - when (requestBody) { - is HTTPRequestBody.Multipart -> { - val builder = MultipartBody.Builder().setType(MultipartBody.FORM) - - requestBody.forEachPart { part: Part -> - when (part) { - is Part.FormData -> { - builder.addFormDataPart(part.name, part.value) - } - - is Part.FormDataBinary -> { - builder.addFormDataPart( - name = part.name, - filename = null, - body = part.value.toRequestBody("application/octet-stream".toMediaType()) - ) - } - } - } - - builder.build() - } - - is HTTPRequestBody.PostFields -> requestBody.encodeFields() - .toRequestBody("application/x-www-form-urlencoded".toMediaType()) - } - ) - } else { - reqBuilder.get() + when(details.requestMethod) { + CacheRequest.RequestMethod.GET -> reqBuilder.get() + CacheRequest.RequestMethod.POST -> reqBuilder.post(prepareRequestBody(requestBody)) } reqBuilder.url(details.url.value) @@ -313,6 +287,37 @@ class OKHTTPBackend private constructor() : HTTPBackend() { } } + private fun prepareRequestBody(requestBody: HTTPRequestBody?): RequestBody { + return when (requestBody) { + is HTTPRequestBody.Multipart -> { + val builder = MultipartBody.Builder().setType(MultipartBody.FORM) + + requestBody.forEachPart { part: Part -> + when (part) { + is Part.FormData -> { + builder.addFormDataPart(part.name, part.value) + } + + is Part.FormDataBinary -> { + builder.addFormDataPart( + name = part.name, + filename = null, + body = part.value.toRequestBody("application/octet-stream".toMediaType()) + ) + } + } + } + + builder.build() + } + + is HTTPRequestBody.PostFields -> requestBody.encodeFields() + .toRequestBody("application/x-www-form-urlencoded".toMediaType()) + + null -> EMPTY_REQUEST + } + } + companion object { private const val TAG = "OKHTTPBackend" diff --git a/src/main/java/org/quantumbadger/redreader/image/DeviantArtAPI.java b/src/main/java/org/quantumbadger/redreader/image/DeviantArtAPI.java index e3064eb0b..133c0a763 100644 --- a/src/main/java/org/quantumbadger/redreader/image/DeviantArtAPI.java +++ b/src/main/java/org/quantumbadger/redreader/image/DeviantArtAPI.java @@ -66,6 +66,7 @@ public static void getImageInfo( DownloadStrategyIfNotCached.INSTANCE, Constants.FileType.IMAGE_INFO, CacheRequest.DownloadQueueType.IMMEDIATE, + CacheRequest.RequestMethod.GET, context, new CacheRequestJSONParser(context, new CacheRequestJSONParser.Listener() { @Override diff --git a/src/main/java/org/quantumbadger/redreader/image/GfycatAPI.java b/src/main/java/org/quantumbadger/redreader/image/GfycatAPI.java index 1da3f6908..95571d500 100644 --- a/src/main/java/org/quantumbadger/redreader/image/GfycatAPI.java +++ b/src/main/java/org/quantumbadger/redreader/image/GfycatAPI.java @@ -57,6 +57,7 @@ public static void getImageInfo( DownloadStrategyIfNotCached.INSTANCE, Constants.FileType.IMAGE_INFO, CacheRequest.DownloadQueueType.IMMEDIATE, + CacheRequest.RequestMethod.GET, context, new CacheRequestJSONParser(context, new CacheRequestJSONParser.Listener() { @Override diff --git a/src/main/java/org/quantumbadger/redreader/image/ImgurAPI.java b/src/main/java/org/quantumbadger/redreader/image/ImgurAPI.java index 2e706bf74..07e542d47 100644 --- a/src/main/java/org/quantumbadger/redreader/image/ImgurAPI.java +++ b/src/main/java/org/quantumbadger/redreader/image/ImgurAPI.java @@ -59,6 +59,7 @@ public static void getAlbumInfo( DownloadStrategyIfNotCached.INSTANCE, Constants.FileType.IMAGE_INFO, CacheRequest.DownloadQueueType.IMMEDIATE, + CacheRequest.RequestMethod.GET, context, new CacheRequestJSONParser( context, @@ -110,6 +111,7 @@ public static void getImageInfo( DownloadStrategyIfNotCached.INSTANCE, Constants.FileType.IMAGE_INFO, CacheRequest.DownloadQueueType.IMMEDIATE, + CacheRequest.RequestMethod.GET, context, new CacheRequestJSONParser(context, new CacheRequestJSONParser.Listener() { @Override diff --git a/src/main/java/org/quantumbadger/redreader/image/ImgurAPIV3.java b/src/main/java/org/quantumbadger/redreader/image/ImgurAPIV3.java index 40625d55e..2ac0b4758 100644 --- a/src/main/java/org/quantumbadger/redreader/image/ImgurAPIV3.java +++ b/src/main/java/org/quantumbadger/redreader/image/ImgurAPIV3.java @@ -61,6 +61,7 @@ public static void getAlbumInfo( withAuth ? CacheRequest.DownloadQueueType.IMGUR_API : CacheRequest.DownloadQueueType.IMMEDIATE, + CacheRequest.RequestMethod.GET, context, new CacheRequestJSONParser(context, new CacheRequestJSONParser.Listener() { @Override @@ -112,6 +113,7 @@ public static void getImageInfo( withAuth ? CacheRequest.DownloadQueueType.IMGUR_API : CacheRequest.DownloadQueueType.IMMEDIATE, + CacheRequest.RequestMethod.GET, context, new CacheRequestJSONParser(context, new CacheRequestJSONParser.Listener() { @Override diff --git a/src/main/java/org/quantumbadger/redreader/image/RedditGalleryAPI.kt b/src/main/java/org/quantumbadger/redreader/image/RedditGalleryAPI.kt index c36f17aad..869551860 100644 --- a/src/main/java/org/quantumbadger/redreader/image/RedditGalleryAPI.kt +++ b/src/main/java/org/quantumbadger/redreader/image/RedditGalleryAPI.kt @@ -94,6 +94,7 @@ class RedditGalleryAPI { DownloadStrategyIfNotCached.INSTANCE, Constants.FileType.IMAGE_INFO, CacheRequest.DownloadQueueType.REDDIT_API, + CacheRequest.RequestMethod.GET, context, object : CacheRequestCallbacks { diff --git a/src/main/java/org/quantumbadger/redreader/image/RedditVideosAPI.kt b/src/main/java/org/quantumbadger/redreader/image/RedditVideosAPI.kt index 8a7ec0b7f..2ab226f65 100644 --- a/src/main/java/org/quantumbadger/redreader/image/RedditVideosAPI.kt +++ b/src/main/java/org/quantumbadger/redreader/image/RedditVideosAPI.kt @@ -73,6 +73,7 @@ object RedditVideosAPI { DownloadStrategyIfNotCached.INSTANCE, Constants.FileType.IMAGE_INFO, CacheRequest.DownloadQueueType.IMMEDIATE, + CacheRequest.RequestMethod.GET, context, object : CacheRequestCallbacks { private val mNotifiedFailure = AtomicBoolean(false) diff --git a/src/main/java/org/quantumbadger/redreader/image/RedgifsAPI.java b/src/main/java/org/quantumbadger/redreader/image/RedgifsAPI.java index d32bfd469..35f1ce5f5 100644 --- a/src/main/java/org/quantumbadger/redreader/image/RedgifsAPI.java +++ b/src/main/java/org/quantumbadger/redreader/image/RedgifsAPI.java @@ -61,6 +61,7 @@ public static void getImageInfo( TimestampBound.notOlderThan(TimeDuration.minutes(10))), Constants.FileType.IMAGE_INFO, CacheRequest.DownloadQueueType.IMMEDIATE, + CacheRequest.RequestMethod.GET, context, new CacheRequestJSONParser(context, new CacheRequestJSONParser.Listener() { @Override diff --git a/src/main/java/org/quantumbadger/redreader/image/RedgifsAPIV2.java b/src/main/java/org/quantumbadger/redreader/image/RedgifsAPIV2.java index fa4a38d1f..32f857b1f 100644 --- a/src/main/java/org/quantumbadger/redreader/image/RedgifsAPIV2.java +++ b/src/main/java/org/quantumbadger/redreader/image/RedgifsAPIV2.java @@ -95,6 +95,7 @@ private static void requestMetadata( TimestampBound.notOlderThan(TimeDuration.minutes(10))), Constants.FileType.IMAGE_INFO, CacheRequest.DownloadQueueType.REDGIFS_API_V2, + CacheRequest.RequestMethod.GET, context, new CacheRequestJSONParser(context, new CacheRequestJSONParser.Listener() { @Override @@ -154,6 +155,7 @@ public static void getImageInfo( DownloadStrategyAlways.INSTANCE, Constants.FileType.IMAGE_INFO, CacheRequest.DownloadQueueType.IMMEDIATE, + CacheRequest.RequestMethod.POST, new HTTPRequestBody.PostFields( new PostField("grant_type", "client_credentials"), new PostField( diff --git a/src/main/java/org/quantumbadger/redreader/image/StreamableAPI.java b/src/main/java/org/quantumbadger/redreader/image/StreamableAPI.java index 7a23a3944..02ed0aff6 100644 --- a/src/main/java/org/quantumbadger/redreader/image/StreamableAPI.java +++ b/src/main/java/org/quantumbadger/redreader/image/StreamableAPI.java @@ -57,6 +57,7 @@ public static void getImageInfo( DownloadStrategyIfNotCached.INSTANCE, Constants.FileType.IMAGE_INFO, CacheRequest.DownloadQueueType.IMMEDIATE, + CacheRequest.RequestMethod.GET, context, new CacheRequestJSONParser(context, new CacheRequestJSONParser.Listener() { @Override diff --git a/src/main/java/org/quantumbadger/redreader/receivers/NewMessageChecker.java b/src/main/java/org/quantumbadger/redreader/receivers/NewMessageChecker.java index 07a904aa0..09f64d281 100644 --- a/src/main/java/org/quantumbadger/redreader/receivers/NewMessageChecker.java +++ b/src/main/java/org/quantumbadger/redreader/receivers/NewMessageChecker.java @@ -116,6 +116,7 @@ public static void checkForNewMessages(final Context context) { DownloadStrategyAlways.INSTANCE, Constants.FileType.INBOX_LIST, CacheRequest.DownloadQueueType.REDDIT_API, + CacheRequest.RequestMethod.GET, false, context, new CacheRequestCallbacks() { diff --git a/src/main/java/org/quantumbadger/redreader/receivers/announcements/AnnouncementDownloader.java b/src/main/java/org/quantumbadger/redreader/receivers/announcements/AnnouncementDownloader.java index cb951d282..f0476f261 100644 --- a/src/main/java/org/quantumbadger/redreader/receivers/announcements/AnnouncementDownloader.java +++ b/src/main/java/org/quantumbadger/redreader/receivers/announcements/AnnouncementDownloader.java @@ -68,6 +68,7 @@ public static void performDownload(@NonNull final Context context) { DownloadStrategyAlways.INSTANCE, Constants.FileType.POST_LIST, CacheRequest.DownloadQueueType.REDDIT_API, + CacheRequest.RequestMethod.GET, false, context, new CacheRequestJSONParser(context, new CacheRequestJSONParser.Listener() { diff --git a/src/main/java/org/quantumbadger/redreader/reddit/CommentListingRequest.java b/src/main/java/org/quantumbadger/redreader/reddit/CommentListingRequest.java index 05f25eb8e..86f81bc52 100644 --- a/src/main/java/org/quantumbadger/redreader/reddit/CommentListingRequest.java +++ b/src/main/java/org/quantumbadger/redreader/reddit/CommentListingRequest.java @@ -246,6 +246,7 @@ private CacheRequest createCommentListingCacheRequest() { mDownloadStrategy, Constants.FileType.COMMENT_LIST, CacheRequest.DownloadQueueType.REDDIT_API, + CacheRequest.RequestMethod.GET, mContext, new CacheRequestCallbacks() { @Override diff --git a/src/main/java/org/quantumbadger/redreader/reddit/RedditAPI.java b/src/main/java/org/quantumbadger/redreader/reddit/RedditAPI.java index 0fdbd5e96..1ffabfa36 100644 --- a/src/main/java/org/quantumbadger/redreader/reddit/RedditAPI.java +++ b/src/main/java/org/quantumbadger/redreader/reddit/RedditAPI.java @@ -1091,6 +1091,7 @@ private static CacheRequest createPostRequestUnprocessedResponse( DownloadStrategyAlways.INSTANCE, Constants.FileType.NOCACHE, CacheRequest.DownloadQueueType.REDDIT_API, + CacheRequest.RequestMethod.POST, new HTTPRequestBody.PostFields(postFields), context, callbacks); @@ -1114,6 +1115,7 @@ private static CacheRequest createGetRequest( downloadStrategy, fileType, CacheRequest.DownloadQueueType.REDDIT_API, + CacheRequest.RequestMethod.GET, null, context, new CacheRequestJSONParser(context, handler)); diff --git a/src/main/java/org/quantumbadger/redreader/reddit/api/RedditAPIIndividualSubredditDataRequester.java b/src/main/java/org/quantumbadger/redreader/reddit/api/RedditAPIIndividualSubredditDataRequester.java index 4320e68dd..56b02a9a0 100644 --- a/src/main/java/org/quantumbadger/redreader/reddit/api/RedditAPIIndividualSubredditDataRequester.java +++ b/src/main/java/org/quantumbadger/redreader/reddit/api/RedditAPIIndividualSubredditDataRequester.java @@ -84,6 +84,7 @@ public void performRequest( DownloadStrategyAlways.INSTANCE, Constants.FileType.SUBREDDIT_ABOUT, CacheRequest.DownloadQueueType.REDDIT_API, + CacheRequest.RequestMethod.GET, context, new CacheRequestJSONParser(context, new CacheRequestJSONParser.Listener() { @Override diff --git a/src/main/java/org/quantumbadger/redreader/reddit/api/RedditAPIIndividualSubredditListRequester.java b/src/main/java/org/quantumbadger/redreader/reddit/api/RedditAPIIndividualSubredditListRequester.java index 68a0bff55..ee6ca6900 100644 --- a/src/main/java/org/quantumbadger/redreader/reddit/api/RedditAPIIndividualSubredditListRequester.java +++ b/src/main/java/org/quantumbadger/redreader/reddit/api/RedditAPIIndividualSubredditListRequester.java @@ -189,6 +189,7 @@ private void doSubredditListRequest( DownloadStrategyAlways.INSTANCE, Constants.FileType.SUBREDDIT_LIST, CacheRequest.DownloadQueueType.REDDIT_API, + CacheRequest.RequestMethod.GET, context, new CacheRequestJSONParser(context, new CacheRequestJSONParser.Listener() { @Override diff --git a/src/main/java/org/quantumbadger/redreader/reddit/api/RedditAPIMultiredditListRequester.java b/src/main/java/org/quantumbadger/redreader/reddit/api/RedditAPIMultiredditListRequester.java index 1517176df..f7df50042 100644 --- a/src/main/java/org/quantumbadger/redreader/reddit/api/RedditAPIMultiredditListRequester.java +++ b/src/main/java/org/quantumbadger/redreader/reddit/api/RedditAPIMultiredditListRequester.java @@ -99,6 +99,7 @@ private void doRequest( DownloadStrategyAlways.INSTANCE, Constants.FileType.MULTIREDDIT_LIST, CacheRequest.DownloadQueueType.REDDIT_API, + CacheRequest.RequestMethod.GET, context, new CacheRequestJSONParser(context, new CacheRequestJSONParser.Listener() { @Override diff --git a/src/main/java/org/quantumbadger/redreader/reddit/api/RedditOAuth.kt b/src/main/java/org/quantumbadger/redreader/reddit/api/RedditOAuth.kt index 68a11a5fe..c00911df2 100644 --- a/src/main/java/org/quantumbadger/redreader/reddit/api/RedditOAuth.kt +++ b/src/main/java/org/quantumbadger/redreader/reddit/api/RedditOAuth.kt @@ -30,6 +30,7 @@ import okhttp3.internal.closeQuietly import org.quantumbadger.redreader.R import org.quantumbadger.redreader.account.RedditAccount import org.quantumbadger.redreader.account.RedditAccountManager +import org.quantumbadger.redreader.cache.CacheRequest.RequestMethod import org.quantumbadger.redreader.cache.CacheRequest.RequestFailureType import org.quantumbadger.redreader.common.AndroidCommon import org.quantumbadger.redreader.common.CachedStringHash @@ -292,6 +293,7 @@ object RedditOAuth { context, RequestDetails( uri, + RequestMethod.POST, HTTPRequestBody.PostFields(postFields) ) ) @@ -384,7 +386,9 @@ object RedditOAuth { val uri = Constants.Reddit.getUri(Constants.Reddit.PATH_ME) return try { val request = HTTPBackend.backend - .prepareRequest(context, RequestDetails(uri, null)) + .prepareRequest( + context, RequestDetails(uri, RequestMethod.GET, null) + ) request.addHeader("Authorization", "bearer " + accessToken!!.token) val result = AtomicReference() request.executeInThisThread(object : HTTPBackend.Listener { @@ -573,6 +577,7 @@ object RedditOAuth { context, RequestDetails( uri, + RequestMethod.POST, HTTPRequestBody.PostFields(postFields) ) ) @@ -684,6 +689,7 @@ object RedditOAuth { context, RequestDetails( uri, + RequestMethod.POST, HTTPRequestBody.PostFields(postFields) ) ) diff --git a/src/main/java/org/quantumbadger/redreader/reddit/prepared/RedditPreparedPost.java b/src/main/java/org/quantumbadger/redreader/reddit/prepared/RedditPreparedPost.java index ae0c90f1a..a45f4091c 100644 --- a/src/main/java/org/quantumbadger/redreader/reddit/prepared/RedditPreparedPost.java +++ b/src/main/java/org/quantumbadger/redreader/reddit/prepared/RedditPreparedPost.java @@ -713,6 +713,7 @@ private void downloadThumbnail( DownloadStrategyIfNotCached.INSTANCE, fileType, CacheRequest.DownloadQueueType.IMMEDIATE, + CacheRequest.RequestMethod.GET, context, new CacheRequestCallbacks() { diff --git a/src/main/java/org/quantumbadger/redreader/reddit/prepared/html/HtmlRawElementImg.java b/src/main/java/org/quantumbadger/redreader/reddit/prepared/html/HtmlRawElementImg.java index 71db9f635..2f53d392c 100644 --- a/src/main/java/org/quantumbadger/redreader/reddit/prepared/html/HtmlRawElementImg.java +++ b/src/main/java/org/quantumbadger/redreader/reddit/prepared/html/HtmlRawElementImg.java @@ -86,6 +86,7 @@ public final synchronized void writeTo( DownloadStrategyIfNotCached.INSTANCE, Constants.FileType.IMAGE, CacheRequest.DownloadQueueType.IMMEDIATE, + CacheRequest.RequestMethod.GET, activity, new CacheRequestCallbacks() { Bitmap image = null; diff --git a/src/main/java/org/quantumbadger/redreader/views/RedditPostView.java b/src/main/java/org/quantumbadger/redreader/views/RedditPostView.java index 6bce3e40d..9120dffc0 100644 --- a/src/main/java/org/quantumbadger/redreader/views/RedditPostView.java +++ b/src/main/java/org/quantumbadger/redreader/views/RedditPostView.java @@ -534,6 +534,7 @@ private void downloadInlinePreview( DownloadStrategyIfNotCached.INSTANCE, Constants.FileType.INLINE_IMAGE_PREVIEW, CacheRequest.DownloadQueueType.IMMEDIATE, + CacheRequest.RequestMethod.GET, mActivity, new CacheRequestCallbacks() { @Override From 81915aeaa44ca5ffe71baa9f07b077efa4925b8a Mon Sep 17 00:00:00 2001 From: Michael Boisvert Date: Sat, 30 Nov 2024 14:04:15 -0700 Subject: [PATCH 2/8] Support DELETE requests --- .../redreader/cache/CacheRequest.java | 3 ++- .../redreader/http/okhttp/OKHTTPBackend.kt | 1 + .../redreader/reddit/RedditAPI.java | 21 +++++++++++++++++++ 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/quantumbadger/redreader/cache/CacheRequest.java b/src/main/java/org/quantumbadger/redreader/cache/CacheRequest.java index d3fe3bef4..cf5a18313 100644 --- a/src/main/java/org/quantumbadger/redreader/cache/CacheRequest.java +++ b/src/main/java/org/quantumbadger/redreader/cache/CacheRequest.java @@ -66,7 +66,8 @@ public enum RequestFailureType { public enum RequestMethod { GET, - POST + POST, + DELETE } public final UriString url; diff --git a/src/main/java/org/quantumbadger/redreader/http/okhttp/OKHTTPBackend.kt b/src/main/java/org/quantumbadger/redreader/http/okhttp/OKHTTPBackend.kt index ee9f0a9de..ac5109b27 100644 --- a/src/main/java/org/quantumbadger/redreader/http/okhttp/OKHTTPBackend.kt +++ b/src/main/java/org/quantumbadger/redreader/http/okhttp/OKHTTPBackend.kt @@ -179,6 +179,7 @@ class OKHTTPBackend private constructor() : HTTPBackend() { when(details.requestMethod) { CacheRequest.RequestMethod.GET -> reqBuilder.get() CacheRequest.RequestMethod.POST -> reqBuilder.post(prepareRequestBody(requestBody)) + CacheRequest.RequestMethod.DELETE -> reqBuilder.delete(prepareRequestBody(requestBody)) } reqBuilder.url(details.url.value) diff --git a/src/main/java/org/quantumbadger/redreader/reddit/RedditAPI.java b/src/main/java/org/quantumbadger/redreader/reddit/RedditAPI.java index 1ffabfa36..eba2d395f 100644 --- a/src/main/java/org/quantumbadger/redreader/reddit/RedditAPI.java +++ b/src/main/java/org/quantumbadger/redreader/reddit/RedditAPI.java @@ -1120,4 +1120,25 @@ private static CacheRequest createGetRequest( context, new CacheRequestJSONParser(context, handler)); } + + @NonNull + private static CacheRequest createDeleteRequest( + @NonNull final UriString url, + @NonNull final RedditAccount user, + @NonNull final Context context, + @NonNull final CacheRequestCallbacks handler) { + + return new CacheRequest( + url, + user, + null, + new Priority(Constants.Priority.API_ACTION), + DownloadStrategyAlways.INSTANCE, + Constants.FileType.NOCACHE, + CacheRequest.DownloadQueueType.REDDIT_API, + CacheRequest.RequestMethod.DELETE, + null, + context, + handler); + } } From 422df9a14e279c94328e25a76d5ca460b2196d70 Mon Sep 17 00:00:00 2001 From: Michael Boisvert Date: Sun, 24 Nov 2024 21:32:42 -0700 Subject: [PATCH 3/8] Handle 404, 403, 401, and 400 errors separately --- .../java/org/quantumbadger/redreader/common/General.kt | 8 +++++++- src/main/res/values/strings.xml | 6 ++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/quantumbadger/redreader/common/General.kt b/src/main/java/org/quantumbadger/redreader/common/General.kt index 7aef2d017..c5942c827 100644 --- a/src/main/java/org/quantumbadger/redreader/common/General.kt +++ b/src/main/java/org/quantumbadger/redreader/common/General.kt @@ -308,9 +308,15 @@ object General { if(status == 404) { title = R.string.error_404_title message = R.string.error_404_message - } else { + } else if (status == 403) { title = R.string.error_403_title message = R.string.error_403_message + } else if (status == 401) { + title = R.string.error_401_title + message = R.string.error_401_message + } else { + title = R.string.error_400_title + message = R.string.error_400_message } } } diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index 4d1f752c7..fce1e1d34 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -1902,4 +1902,10 @@ Horizontal padding Compact title + + + Unauthorized + Reddit says that you are not logged in or have provided invalid credentials. + Bad Request + Reddit says that you have submitted something invalid. From 15863dc49ecf28bcafff37e44761425180e6c754 Mon Sep 17 00:00:00 2001 From: Michael Boisvert Date: Sat, 30 Nov 2024 14:18:46 -0700 Subject: [PATCH 4/8] Action menu for multireddits --- .../adapters/MainMenuListingManager.java | 8 +- .../fragments/PostListingFragment.java | 34 ++++++- .../api/RedditAPIMultiredditAction.java | 92 +++++++++++++++++++ 3 files changed, 131 insertions(+), 3 deletions(-) create mode 100644 src/main/java/org/quantumbadger/redreader/reddit/api/RedditAPIMultiredditAction.java diff --git a/src/main/java/org/quantumbadger/redreader/adapters/MainMenuListingManager.java b/src/main/java/org/quantumbadger/redreader/adapters/MainMenuListingManager.java index c2fa94d1d..7ac889520 100644 --- a/src/main/java/org/quantumbadger/redreader/adapters/MainMenuListingManager.java +++ b/src/main/java/org/quantumbadger/redreader/adapters/MainMenuListingManager.java @@ -51,6 +51,7 @@ import org.quantumbadger.redreader.fragments.MainMenuFragment; import org.quantumbadger.redreader.receivers.announcements.Announcement; import org.quantumbadger.redreader.receivers.announcements.AnnouncementDownloader; +import org.quantumbadger.redreader.reddit.api.RedditAPIMultiredditAction; import org.quantumbadger.redreader.reddit.api.RedditSubredditSubscriptionManager; import org.quantumbadger.redreader.reddit.api.SubredditSubscriptionState; import org.quantumbadger.redreader.reddit.things.SubredditCanonicalId; @@ -951,13 +952,18 @@ private GroupedRecyclerViewItemListItemView makeMultiredditItem( final View.OnClickListener clickListener = view -> mListener.onSelected( (PostListingURL)MultiredditPostListURL.getMultireddit(name)); + final View.OnLongClickListener longClickListener = view -> { + RedditAPIMultiredditAction.showActionMenu(mActivity, name); + return true; + }; + return new GroupedRecyclerViewItemListItemView( null, name, ScreenreaderPronunciation.getPronunciation(mContext, name), hideDivider, clickListener, - null, + longClickListener, Optional.empty(), Optional.empty(), Optional.empty()); diff --git a/src/main/java/org/quantumbadger/redreader/fragments/PostListingFragment.java b/src/main/java/org/quantumbadger/redreader/fragments/PostListingFragment.java index 0fa4423b0..c16e18569 100644 --- a/src/main/java/org/quantumbadger/redreader/fragments/PostListingFragment.java +++ b/src/main/java/org/quantumbadger/redreader/fragments/PostListingFragment.java @@ -74,6 +74,7 @@ import org.quantumbadger.redreader.reddit.PostSort; import org.quantumbadger.redreader.reddit.RedditPostListItem; import org.quantumbadger.redreader.reddit.RedditSubredditManager; +import org.quantumbadger.redreader.reddit.api.RedditAPIMultiredditAction; import org.quantumbadger.redreader.reddit.api.RedditSubredditSubscriptionManager; import org.quantumbadger.redreader.reddit.kthings.JsonUtils; import org.quantumbadger.redreader.reddit.kthings.MaybeParseError; @@ -275,11 +276,18 @@ public void onScrolled( break; case RedditURLParser.USER_POST_LISTING_URL: - case RedditURLParser.MULTIREDDIT_POST_LISTING_URL: setHeader( + mPostListingURL.humanReadableName(getActivity(), true), + mPostListingURL.humanReadableUrl(), + null); + CacheManager.getInstance(context).makeRequest(mRequest); + break; + + case RedditURLParser.MULTIREDDIT_POST_LISTING_URL: + setMultiredditHeader( mPostListingURL.humanReadableName(getActivity(), true), mPostListingURL.humanReadableUrl(), - null); + mPostListingURL.asMultiredditPostListURL().name); CacheManager.getInstance(context).makeRequest(mRequest); break; @@ -464,6 +472,28 @@ private void onSubredditReceived() { } + private void setMultiredditHeader( + @NonNull final String title, + @NonNull final String subtitle, + @NonNull final String multiredditName) { + + final PostListingHeader postListingHeader = new PostListingHeader( + getActivity(), + title, + subtitle, + mPostListingURL, + null); + + setHeader(postListingHeader); + + postListingHeader.setOnLongClickListener(view -> { + RedditAPIMultiredditAction.showActionMenu( + getActivity(), + multiredditName); + return true; + }); + } + private void setHeader( @NonNull final String title, @NonNull final String subtitle, diff --git a/src/main/java/org/quantumbadger/redreader/reddit/api/RedditAPIMultiredditAction.java b/src/main/java/org/quantumbadger/redreader/reddit/api/RedditAPIMultiredditAction.java new file mode 100644 index 000000000..adda0e8dc --- /dev/null +++ b/src/main/java/org/quantumbadger/redreader/reddit/api/RedditAPIMultiredditAction.java @@ -0,0 +1,92 @@ +/******************************************************************************* + * This file is part of RedReader. + * + * RedReader is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * RedReader is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with RedReader. If not, see . + ******************************************************************************/ + +package org.quantumbadger.redreader.reddit.api; + +import android.content.Context; + +import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.app.AppCompatActivity; + +import com.google.android.material.dialog.MaterialAlertDialogBuilder; + +import org.quantumbadger.redreader.account.RedditAccount; +import org.quantumbadger.redreader.account.RedditAccountManager; + +import java.util.ArrayList; + +public class RedditAPIMultiredditAction { + + public enum MultiredditAction { + } + + private static class RCVMenuItem { + public final String title; + public final MultiredditAction action; + + private RCVMenuItem( + final Context context, + final int titleRes, + final MultiredditAction action) { + + this.title = context.getString(titleRes); + this.action = action; + } + } + + public static void showActionMenu( + final AppCompatActivity activity, + final String multiredditName) { + + final RedditAccount user = + RedditAccountManager.getInstance(activity).getDefaultAccount(); + + if (user.isAnonymous()) { + return; + } + + final ArrayList menu = new ArrayList<>(); + + final String[] menuText = new String[menu.size()]; + + for(int i = 0; i < menuText.length; i++) { + menuText[i] = menu.get(i).title; + } + + final MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(activity); + + builder.setItems(menuText, (dialog, which) -> onActionMenuItemSelected( + activity, + multiredditName, + user, + menu.get(which).action)); + + final AlertDialog alert = builder.create(); + alert.setCanceledOnTouchOutside(true); + alert.show(); + } + + private static void onActionMenuItemSelected( + final AppCompatActivity activity, + final String subredditNames, + final RedditAccount user, + final MultiredditAction action) { + + switch(action) { + } + } +} From c67e0e3933342d0798cbeff4e1aabbfffacc8ed9 Mon Sep 17 00:00:00 2001 From: Michael Boisvert Date: Sat, 30 Nov 2024 14:28:11 -0700 Subject: [PATCH 5/8] Editable preferences for multireddit actions --- .../redreader/common/PrefsUtility.java | 19 +++++++++++++++++++ .../api/RedditAPIMultiredditAction.java | 9 +++++++++ src/main/res/values/arrays.xml | 5 +++++ src/main/res/values/strings.xml | 4 ++++ src/main/res/xml/prefs_menus.xml | 12 ++++++++++++ 5 files changed, 49 insertions(+) diff --git a/src/main/java/org/quantumbadger/redreader/common/PrefsUtility.java b/src/main/java/org/quantumbadger/redreader/common/PrefsUtility.java index 1262439fb..b996bd0df 100644 --- a/src/main/java/org/quantumbadger/redreader/common/PrefsUtility.java +++ b/src/main/java/org/quantumbadger/redreader/common/PrefsUtility.java @@ -37,6 +37,7 @@ import org.quantumbadger.redreader.reddit.PostSort; import org.quantumbadger.redreader.reddit.UserCommentSort; import org.quantumbadger.redreader.reddit.api.RedditAPICommentAction; +import org.quantumbadger.redreader.reddit.api.RedditAPIMultiredditAction; import org.quantumbadger.redreader.reddit.api.RedditPostActions; import org.quantumbadger.redreader.reddit.things.InvalidSubredditNameException; import org.quantumbadger.redreader.reddit.things.SubredditCanonicalId; @@ -1789,6 +1790,24 @@ public static String pref_reddit_client_id_override() { return valueTrimmed; } + public static EnumSet + pref_menus_multireddit_context_items() { + final Set strings = getStringSet( + R.string.pref_menus_multireddits_context_items_key, + R.array.pref_menus_multireddits_context_items_return); + + final EnumSet result + = EnumSet.noneOf( + RedditAPIMultiredditAction.MultiredditAction.class); + + for(final String s : strings) { + result.add(RedditAPIMultiredditAction.MultiredditAction.valueOf( + StringUtils.asciiUppercase(s))); + } + + return result; + } + private static final String REDDIT_USER_AGREEMENT_PREF = "accepted_reddit_user_agreement"; private static final int REDDIT_USER_AGREEMENT_DECLINED = -1; private static final int REDDIT_USER_AGREEMENT_APRIL_2023 = 1; diff --git a/src/main/java/org/quantumbadger/redreader/reddit/api/RedditAPIMultiredditAction.java b/src/main/java/org/quantumbadger/redreader/reddit/api/RedditAPIMultiredditAction.java index adda0e8dc..861dfb5ec 100644 --- a/src/main/java/org/quantumbadger/redreader/reddit/api/RedditAPIMultiredditAction.java +++ b/src/main/java/org/quantumbadger/redreader/reddit/api/RedditAPIMultiredditAction.java @@ -26,8 +26,10 @@ import org.quantumbadger.redreader.account.RedditAccount; import org.quantumbadger.redreader.account.RedditAccountManager; +import org.quantumbadger.redreader.common.PrefsUtility; import java.util.ArrayList; +import java.util.EnumSet; public class RedditAPIMultiredditAction { @@ -52,6 +54,13 @@ public static void showActionMenu( final AppCompatActivity activity, final String multiredditName) { + final EnumSet itemPref + = PrefsUtility.pref_menus_multireddit_context_items(); + + if(itemPref.isEmpty()) { + return; + } + final RedditAccount user = RedditAccountManager.getInstance(activity).getDefaultAccount(); diff --git a/src/main/res/values/arrays.xml b/src/main/res/values/arrays.xml index 9d3502316..65949b171 100644 --- a/src/main/res/values/arrays.xml +++ b/src/main/res/values/arrays.xml @@ -1328,4 +1328,9 @@ @string/pref_behaviour_post_tap_action_title_comments + + + + + diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index fce1e1d34..d40eb0b21 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -1908,4 +1908,8 @@ Reddit says that you are not logged in or have provided invalid credentials. Bad Request Reddit says that you have submitted something invalid. + + Multireddits + pref_menus_multireddit_context_items + Action menu items diff --git a/src/main/res/xml/prefs_menus.xml b/src/main/res/xml/prefs_menus.xml index c26752965..a1b37b1d7 100644 --- a/src/main/res/xml/prefs_menus.xml +++ b/src/main/res/xml/prefs_menus.xml @@ -132,4 +132,16 @@ + + + + + + From 7ea078b7ff350450914b73e8eec53b2f6f9352d5 Mon Sep 17 00:00:00 2001 From: Michael Boisvert Date: Sat, 30 Nov 2024 19:05:48 -0700 Subject: [PATCH 6/8] Support remove subreddit from multireddit api method --- .../redreader/common/Constants.java | 1 + .../redreader/reddit/RedditAPI.java | 41 +++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/src/main/java/org/quantumbadger/redreader/common/Constants.java b/src/main/java/org/quantumbadger/redreader/common/Constants.java index 8b5d1d629..7d858882b 100644 --- a/src/main/java/org/quantumbadger/redreader/common/Constants.java +++ b/src/main/java/org/quantumbadger/redreader/common/Constants.java @@ -149,6 +149,7 @@ public static final class Reddit { public static final String PATH_MULTIREDDITS_MINE = "/api/multi/mine.json"; public static final String PATH_COMMENTS = "/comments/"; public static final String PATH_ME = "/api/v1/me"; + public static final String PATH_MULTIREDDIT = "/api/multi"; public static String getScheme() { return SCHEME_HTTPS; diff --git a/src/main/java/org/quantumbadger/redreader/reddit/RedditAPI.java b/src/main/java/org/quantumbadger/redreader/reddit/RedditAPI.java index eba2d395f..fb24888fb 100644 --- a/src/main/java/org/quantumbadger/redreader/reddit/RedditAPI.java +++ b/src/main/java/org/quantumbadger/redreader/reddit/RedditAPI.java @@ -959,6 +959,47 @@ public void onFailure(@NonNull final RRError error) { )); } + public static void removeSubredditFromMultireddit( + final CacheManager cm, + final APIResponseHandler.ActionResponseHandler handler, + final RedditAccount user, + final String multiredditName, + final String subredditName, + final Context context) { + + final Uri.Builder builder = Constants.Reddit.getUriBuilder( + Constants.Reddit.PATH_MULTIREDDIT) + .appendPath("user") + .appendPath(user.username) + .appendPath("m") + .appendPath(multiredditName) + .appendPath("r") + .appendPath(subredditName); + + cm.makeRequest(createDeleteRequest( + UriString.from(builder.build()), + user, + context, + new CacheRequestCallbacks() { + @Override + public void onDataStreamAvailable( + @NonNull final GenericFactory + streamFactory, + final TimestampUTC timestamp, + @NonNull final UUID session, + final boolean fromCache, + @Nullable final String mimetype) { + handler.notifySuccess(); + } + + @Override + public void onFailure(@NonNull final RRError error) { + handler.notifyFailure(error); + } + })); + + } + @Nullable private static APIResponseHandler.APIFailureType findFailureType(final JsonValue response) { From 63ff94533b71cbebcbaf8d46ef98a0745cff5b19 Mon Sep 17 00:00:00 2001 From: Michael Boisvert Date: Sat, 30 Nov 2024 21:01:07 -0700 Subject: [PATCH 7/8] Support get multireddit data api method --- .../redreader/reddit/RedditAPI.java | 68 +++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/src/main/java/org/quantumbadger/redreader/reddit/RedditAPI.java b/src/main/java/org/quantumbadger/redreader/reddit/RedditAPI.java index fb24888fb..979cff0fd 100644 --- a/src/main/java/org/quantumbadger/redreader/reddit/RedditAPI.java +++ b/src/main/java/org/quantumbadger/redreader/reddit/RedditAPI.java @@ -959,6 +959,74 @@ public void onFailure(@NonNull final RRError error) { )); } + public static void requestMultiredditSubredditList( + @NonNull final CacheManager cm, + @NonNull final String multiredditName, + @NonNull final RedditAccount user, + @NonNull final Context context, + @NonNull final APIResponseHandler.ValueResponseHandler> handler, + @NonNull final DownloadStrategy downloadStrategy) { + + final UriString uriString = UriString.from(Constants.Reddit.getUriBuilder( + Constants.Reddit.PATH_MULTIREDDIT) + .appendPath("user") + .appendPath(user.username) + .appendPath("m") + .appendPath(multiredditName) + .build()); + + cm.makeRequest(createGetRequest( + uriString, + user, + new Priority(Constants.Priority.API_SUBREDDIT_LIST), + Constants.FileType.SUBREDDIT_LIST, + downloadStrategy, + context, + new CacheRequestJSONParser.Listener() { + @Override + public void onJsonParsed( + @NonNull final JsonValue result, + final TimestampUTC timestamp, + @NonNull final UUID session, + final boolean fromCache) { + + try { + final Optional subreddits + = result.getArrayAtPath("data", "subreddits"); + + final ArrayList subredditNames = new ArrayList<>(); + + if (subreddits.isPresent()) { + for(final JsonValue value : subreddits.get()) { + final Optional subredditName = value.getAtPath( + "name"); + if (subredditName.isPresent()) { + subredditNames.add(subredditName.get().asString()); + } + } + } + + handler.notifySuccess(subredditNames); + + } catch(final Exception e) { + onFailure(General.getGeneralErrorForFailure( + context, + CacheRequest.RequestFailureType.PARSE, + e, + null, + uriString, + Optional.of(new FailedRequestBody(result)))); + } + } + + @Override + public void onFailure(@NonNull final RRError error) { + handler.notifyFailure(error); + } + } + )); + } + public static void removeSubredditFromMultireddit( final CacheManager cm, final APIResponseHandler.ActionResponseHandler handler, From 48f960a33db711c35b35f1e5ac8a193d9f3b256c Mon Sep 17 00:00:00 2001 From: Michael Boisvert Date: Sat, 30 Nov 2024 21:02:03 -0700 Subject: [PATCH 8/8] Remove Subreddit action for multireddits --- .../RemoveSubredditFromMultiDialog.java | 201 ++++++++++++++++++ .../api/RedditAPIMultiredditAction.java | 14 +- .../remove_subreddit_from_multireddit.xml | 53 +++++ src/main/res/values/arrays.xml | 5 +- src/main/res/values/strings.xml | 2 + 5 files changed, 273 insertions(+), 2 deletions(-) create mode 100644 src/main/java/org/quantumbadger/redreader/fragments/RemoveSubredditFromMultiDialog.java create mode 100644 src/main/res/layout/remove_subreddit_from_multireddit.xml diff --git a/src/main/java/org/quantumbadger/redreader/fragments/RemoveSubredditFromMultiDialog.java b/src/main/java/org/quantumbadger/redreader/fragments/RemoveSubredditFromMultiDialog.java new file mode 100644 index 000000000..553870932 --- /dev/null +++ b/src/main/java/org/quantumbadger/redreader/fragments/RemoveSubredditFromMultiDialog.java @@ -0,0 +1,201 @@ +/******************************************************************************* + * This file is part of RedReader. + * + * RedReader is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * RedReader is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with RedReader. If not, see . + ******************************************************************************/ + +package org.quantumbadger.redreader.fragments; + +import android.util.Log; +import android.view.KeyEvent; +import android.view.View; +import android.view.WindowManager; +import android.view.inputmethod.EditorInfo; +import android.widget.ArrayAdapter; +import android.widget.AutoCompleteTextView; +import android.widget.Toast; + +import androidx.annotation.NonNull; +import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.app.AppCompatActivity; + +import com.google.android.material.dialog.MaterialAlertDialogBuilder; + +import org.quantumbadger.redreader.R; +import org.quantumbadger.redreader.account.RedditAccount; +import org.quantumbadger.redreader.cache.CacheManager; +import org.quantumbadger.redreader.cache.downloadstrategy.DownloadStrategyIfNotCached; +import org.quantumbadger.redreader.common.RRError; +import org.quantumbadger.redreader.reddit.APIResponseHandler; +import org.quantumbadger.redreader.reddit.RedditAPI; +import org.quantumbadger.redreader.views.liststatus.ErrorView; + +import java.util.Collections; +import java.util.List; + +public class RemoveSubredditFromMultiDialog { + + private final static String TAG = "RemoveSubFromMulti"; + + public static void show( + final AppCompatActivity activity, + final String multiredditName, + final RedditAccount user) { + + final MaterialAlertDialogBuilder alertBuilder + = new MaterialAlertDialogBuilder(activity); + + final View root = activity.getLayoutInflater().inflate( + R.layout.remove_subreddit_from_multireddit, + null); + + RedditAPI.requestMultiredditSubredditList( + CacheManager.getInstance(activity), + multiredditName, + user, + activity, + new APIResponseHandler + .ValueResponseHandler>(activity) { + @Override + protected void onSuccess(@NonNull final List subreddits) { + Collections.sort(subreddits); + activity.runOnUiThread(() -> { + showDialog( + activity, + multiredditName, + subreddits, + root, + alertBuilder, + user); + }); + } + + @Override + protected void onCallbackException(final Throwable t) { + Log.e( + TAG, + "Error while deleting multireddit", + t); + throw new RuntimeException(t); + } + + @Override + protected void onFailure(@NonNull final RRError error) { + activity.runOnUiThread(() -> { + final MaterialAlertDialogBuilder builder + = new MaterialAlertDialogBuilder(activity); + builder.setView(new ErrorView(activity, error)); + builder.create().show(); + }); + } + }, + DownloadStrategyIfNotCached.INSTANCE + ); + } + + private static void showDialog( + final AppCompatActivity activity, + final String multiredditName, + final List subreddits, + final View root, + final MaterialAlertDialogBuilder alertBuilder, + final RedditAccount user + ) { + final ArrayAdapter autocompleteAdapter = new ArrayAdapter<>( + activity, + android.R.layout.simple_dropdown_item_1line, + subreddits); + + final AutoCompleteTextView editText + = root.findViewById(R.id.selected_subreddit); + editText.setAdapter(autocompleteAdapter); + + alertBuilder.setView(root); + + alertBuilder.setNegativeButton(R.string.dialog_cancel, null); + + alertBuilder.setPositiveButton( + R.string.dialog_go, + (dialog, which) -> removeSubredditFromMultireddit( + activity, editText, multiredditName, user)); + + final AlertDialog alertDialog = alertBuilder.create(); + + editText.setOnEditorActionListener((v, actionId, event) -> { + if(actionId == EditorInfo.IME_ACTION_GO + || event.getKeyCode() == KeyEvent.KEYCODE_ENTER) { + removeSubredditFromMultireddit(activity, editText, multiredditName, user); + alertDialog.dismiss(); + } + return false; + }); + + alertDialog.getWindow() + .setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE + | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN); + alertDialog.show(); + } + + private static void removeSubredditFromMultireddit( + final AppCompatActivity activity, + final AutoCompleteTextView editText, + final String multiredditName, + final RedditAccount user) { + + final String subredditName = editText.getText() + .toString() + .trim() + .replace(" ", ""); + + RedditAPI.removeSubredditFromMultireddit( + CacheManager.getInstance(activity), + new APIResponseHandler.ActionResponseHandler(activity) { + + @Override + protected void onCallbackException(final Throwable t) { + Log.e( + TAG, "Error while removing subreddit from multireddit", t); + throw new RuntimeException(t); + } + + @Override + protected void onFailure(@NonNull final RRError error) { + activity.runOnUiThread(() -> { + final MaterialAlertDialogBuilder builder + = new MaterialAlertDialogBuilder(activity); + builder.setView(new ErrorView(activity, error)); + builder.create().show(); + }); + } + + @Override + protected void onSuccess() { + activity.runOnUiThread(() -> Toast.makeText( + activity, + String.format("Removed %s from %s", subredditName, multiredditName), + Toast.LENGTH_SHORT).show()); + } + }, + user, + multiredditName, + subredditName, + activity + ); + + Toast.makeText( + activity, + String.format("Removing %s from %s", subredditName, multiredditName), + Toast.LENGTH_SHORT).show(); + } +} diff --git a/src/main/java/org/quantumbadger/redreader/reddit/api/RedditAPIMultiredditAction.java b/src/main/java/org/quantumbadger/redreader/reddit/api/RedditAPIMultiredditAction.java index 861dfb5ec..60aaca8b3 100644 --- a/src/main/java/org/quantumbadger/redreader/reddit/api/RedditAPIMultiredditAction.java +++ b/src/main/java/org/quantumbadger/redreader/reddit/api/RedditAPIMultiredditAction.java @@ -24,9 +24,11 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder; +import org.quantumbadger.redreader.R; import org.quantumbadger.redreader.account.RedditAccount; import org.quantumbadger.redreader.account.RedditAccountManager; import org.quantumbadger.redreader.common.PrefsUtility; +import org.quantumbadger.redreader.fragments.RemoveSubredditFromMultiDialog; import java.util.ArrayList; import java.util.EnumSet; @@ -34,6 +36,7 @@ public class RedditAPIMultiredditAction { public enum MultiredditAction { + REMOVE_SUBREDDIT } private static class RCVMenuItem { @@ -70,6 +73,13 @@ public static void showActionMenu( final ArrayList menu = new ArrayList<>(); + if(itemPref.contains(MultiredditAction.REMOVE_SUBREDDIT)) { + menu.add(new RCVMenuItem( + activity, + R.string.remove_from_multireddit, + MultiredditAction.REMOVE_SUBREDDIT)); + } + final String[] menuText = new String[menu.size()]; for(int i = 0; i < menuText.length; i++) { @@ -91,11 +101,13 @@ public static void showActionMenu( private static void onActionMenuItemSelected( final AppCompatActivity activity, - final String subredditNames, + final String multiredditName, final RedditAccount user, final MultiredditAction action) { switch(action) { + case REMOVE_SUBREDDIT: + RemoveSubredditFromMultiDialog.show(activity, multiredditName, user); } } } diff --git a/src/main/res/layout/remove_subreddit_from_multireddit.xml b/src/main/res/layout/remove_subreddit_from_multireddit.xml new file mode 100644 index 000000000..f52940b8e --- /dev/null +++ b/src/main/res/layout/remove_subreddit_from_multireddit.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + diff --git a/src/main/res/values/arrays.xml b/src/main/res/values/arrays.xml index 65949b171..02bbcd3ef 100644 --- a/src/main/res/values/arrays.xml +++ b/src/main/res/values/arrays.xml @@ -1330,7 +1330,10 @@ + @string/remove_from_multireddit - + + remove_subreddit + diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index d40eb0b21..d483586f4 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -1912,4 +1912,6 @@ Multireddits pref_menus_multireddit_context_items Action menu items + + Remove Subreddit from Multireddit>