diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/PostModerationActionHandler.kt b/app/src/main/java/ml/docilealligator/infinityforreddit/PostModerationActionHandler.kt index 0b15abf5..440d185d 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/PostModerationActionHandler.kt +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/PostModerationActionHandler.kt @@ -9,4 +9,5 @@ interface PostModerationActionHandler { fun toggleLock(post: Post, position: Int) fun toggleNSFW(post: Post, position: Int) fun toggleSpoiler(post: Post, position: Int) + fun toggleMod(post: Post, position: Int) } \ No newline at end of file diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/apis/RedditAPI.java b/app/src/main/java/ml/docilealligator/infinityforreddit/apis/RedditAPI.java index db0c0a54..efa2e4f7 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/apis/RedditAPI.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/apis/RedditAPI.java @@ -449,4 +449,8 @@ public interface RedditAPI { @FormUrlEncoded @POST("/api/unlock") Call unLockThing(@HeaderMap Map headers, @FieldMap Map params); + + @FormUrlEncoded + @POST("/api/distinguish") + Call toggleDistinguishedThing(@HeaderMap Map headers, @FieldMap Map params); } diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/bottomsheetfragments/ModerationActionBottomSheetFragment.kt b/app/src/main/java/ml/docilealligator/infinityforreddit/bottomsheetfragments/ModerationActionBottomSheetFragment.kt index c0108db7..ab2f8936 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/bottomsheetfragments/ModerationActionBottomSheetFragment.kt +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/bottomsheetfragments/ModerationActionBottomSheetFragment.kt @@ -67,7 +67,10 @@ class ModerationActionBottomSheetFragment : LandscapeExpandedRoundedBottomSheetD AppCompatResources.getDrawable(it, if (post.isNSFW) R.drawable.ic_unmark_nsfw_24dp else R.drawable.ic_mark_nsfw_24dp), null, null, null ) binding.toggleSpoilerTextViewModerationActionBottomSheetFragment.setCompoundDrawablesWithIntrinsicBounds( - AppCompatResources.getDrawable(it, if (post.isLocked) R.drawable.ic_unmark_spoiler_24dp else R.drawable.ic_spoiler_24dp), null, null, null + AppCompatResources.getDrawable(it, if (post.isSpoiler) R.drawable.ic_unmark_spoiler_24dp else R.drawable.ic_spoiler_24dp), null, null, null + ) + binding.toggleModTextViewModerationActionBottomSheetFragment.setCompoundDrawablesWithIntrinsicBounds( + AppCompatResources.getDrawable(it, if (post.isModerator) R.drawable.ic_undistinguish_as_mod_24dp else R.drawable.ic_distinguish_as_mod_24dp), null, null, null ) } @@ -94,6 +97,12 @@ class ModerationActionBottomSheetFragment : LandscapeExpandedRoundedBottomSheetD (parentFragment as PostModerationActionHandler).toggleSpoiler(post, position) dismiss() } + + binding.toggleModTextViewModerationActionBottomSheetFragment.setText(if (post.isModerator) R.string.undistinguish_as_mod else R.string.distinguish_as_mod) + binding.toggleModTextViewModerationActionBottomSheetFragment.setOnClickListener { + (parentFragment as PostModerationActionHandler).toggleMod(post, position) + dismiss() + } } } return binding.root diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/fragments/PostFragment.java b/app/src/main/java/ml/docilealligator/infinityforreddit/fragments/PostFragment.java index 3f608887..3e42a498 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/fragments/PostFragment.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/fragments/PostFragment.java @@ -1420,4 +1420,9 @@ public class PostFragment extends PostFragmentBase implements FragmentCommunicat public void toggleSpoiler(@NonNull Post post, int position) { mPostViewModel.toggleSpoiler(post, position); } + + @Override + public void toggleMod(@NonNull Post post, int position) { + mPostViewModel.toggleMod(post, position); + } } diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/fragments/PostFragmentBase.java b/app/src/main/java/ml/docilealligator/infinityforreddit/fragments/PostFragmentBase.java index 0d96ae72..ad54adcc 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/fragments/PostFragmentBase.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/fragments/PostFragmentBase.java @@ -624,6 +624,7 @@ public abstract class PostFragmentBase extends Fragment { post.setSaved(event.post.isSaved()); post.setIsStickied(event.post.isStickied()); post.setIsLocked(event.post.isLocked()); + post.setIsModerator(event.post.isModerator()); if (event.post.isRead()) { post.markAsRead(); } diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/moderation/ModerationEvent.kt b/app/src/main/java/ml/docilealligator/infinityforreddit/moderation/ModerationEvent.kt index ccb8eb46..08b32ced 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/moderation/ModerationEvent.kt +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/moderation/ModerationEvent.kt @@ -36,4 +36,10 @@ sealed class ModerationEvent(open val post: Post, open val position: Int, val to data class UnmarkedSpoiler(override val post: Post, override val position: Int) : ModerationEvent(post, position, R.string.unmark_spoiler_success) data class UnmarkSpoilerFailed(override val post: Post, override val position: Int) : ModerationEvent(post, position, R.string.unmark_spoiler_failed) + + data class DistinguishedAsMod(override val post: Post, override val position: Int) : ModerationEvent(post, position, R.string.distinguished_as_mod) + data class DistinguishAsModFailed(override val post: Post, override val position: Int) : ModerationEvent(post, position, R.string.distinguish_as_mod_failed) + + data class UndistinguishedAsMod(override val post: Post, override val position: Int) : ModerationEvent(post, position, R.string.undistinguished_as_mod) + data class UndistinguishAsModFailed(override val post: Post, override val position: Int) : ModerationEvent(post, position, R.string.undistinguish_as_mod_failed) } \ No newline at end of file diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/post/Post.java b/app/src/main/java/ml/docilealligator/infinityforreddit/post/Post.java index 24aa8498..ed3a7fff 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/post/Post.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/post/Post.java @@ -69,7 +69,7 @@ public class Post implements Parcelable { private final boolean isCrosspost; private boolean isRead; private String crosspostParentId; - private final String distinguished; + private String distinguished; private final String suggestedSort; private String mp4Variant; private ArrayList previews = new ArrayList<>(); @@ -408,6 +408,10 @@ public class Post implements Parcelable { return distinguished != null && distinguished.equals("moderator"); } + public void setIsModerator(boolean value) { + distinguished = value ? "moderator" : null; + } + public boolean isAdmin() { return distinguished != null && distinguished.equals("admin"); } diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/post/PostViewModel.java b/app/src/main/java/ml/docilealligator/infinityforreddit/post/PostViewModel.java index 82827782..64ca9140 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/post/PostViewModel.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/post/PostViewModel.java @@ -623,4 +623,26 @@ public class PostViewModel extends ViewModel { } }); } + + public void toggleMod(@NonNull Post post, int position) { + Map params = new HashMap<>(); + params.put(APIUtils.ID_KEY, post.getFullName()); + params.put(APIUtils.HOW_KEY, post.isModerator() ? APIUtils.HOW_NO : APIUtils.HOW_YES); + retrofit.create(RedditAPI.class).toggleDistinguishedThing(APIUtils.getOAuthHeader(accessToken), params).enqueue(new Callback<>() { + @Override + public void onResponse(@NonNull Call call, @NonNull Response response) { + if (response.isSuccessful()) { + post.setIsModerator(!post.isModerator()); + moderationEventLiveData.postValue(post.isModerator() ? new ModerationEvent.DistinguishedAsMod(post, position): new ModerationEvent.UndistinguishedAsMod(post, position)); + } else { + moderationEventLiveData.postValue(post.isModerator() ? new ModerationEvent.UndistinguishAsModFailed(post, position) : new ModerationEvent.DistinguishAsModFailed(post, position)); + } + } + + @Override + public void onFailure(@NonNull Call call, @NonNull Throwable throwable) { + moderationEventLiveData.postValue(post.isModerator() ? new ModerationEvent.UndistinguishAsModFailed(post, position) : new ModerationEvent.DistinguishAsModFailed(post, position)); + } + }); + } } diff --git a/app/src/main/res/drawable/ic_distinguish_as_mod_24dp.xml b/app/src/main/res/drawable/ic_distinguish_as_mod_24dp.xml new file mode 100644 index 00000000..0867ae67 --- /dev/null +++ b/app/src/main/res/drawable/ic_distinguish_as_mod_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_undistinguish_as_mod_24dp.xml b/app/src/main/res/drawable/ic_undistinguish_as_mod_24dp.xml new file mode 100644 index 00000000..f97ee68d --- /dev/null +++ b/app/src/main/res/drawable/ic_undistinguish_as_mod_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/fragment_moderation_action_bottom_sheet.xml b/app/src/main/res/layout/fragment_moderation_action_bottom_sheet.xml index 643514ab..c65c5cfd 100644 --- a/app/src/main/res/layout/fragment_moderation_action_bottom_sheet.xml +++ b/app/src/main/res/layout/fragment_moderation_action_bottom_sheet.xml @@ -144,6 +144,24 @@ android:textSize="?attr/font_default" app:drawableTint="?attr/primaryTextColor" /> + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 4a32195b..7470aae9 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1566,4 +1566,10 @@ Lock failed Unlocked Unlock failed + Distinguish as moderator + Undistinguish as moderator + Distinguished as mod + Distinguish as moderator failed + Undistinguished as moderator + Undistinguish as moderator failed