From 851fa705633836d450f3b4196ccc70f21ca73f8e Mon Sep 17 00:00:00 2001 From: LucasGGamerM Date: Tue, 19 Sep 2023 12:13:03 -0300 Subject: [PATCH] feat: add mute conversations menu item --- .../api/StatusInteractionController.java | 34 +++++++++++++++++++ .../api/requests/statuses/SetStatusMuted.java | 11 ++++++ .../displayitems/HeaderStatusDisplayItem.java | 10 ++++++ .../android/ui/utils/UiUtils.java | 26 ++++++++++++++ .../ic_fluent_alert_off_24_regular.xml | 9 +++++ .../ic_fluent_alert_off_28_regular.xml | 9 +++++ mastodon/src/main/res/menu/post.xml | 2 ++ mastodon/src/main/res/values/strings_mo.xml | 6 ++++ 8 files changed, 107 insertions(+) create mode 100644 mastodon/src/main/java/org/joinmastodon/android/api/requests/statuses/SetStatusMuted.java create mode 100644 mastodon/src/main/res/drawable/ic_fluent_alert_off_24_regular.xml create mode 100644 mastodon/src/main/res/drawable/ic_fluent_alert_off_28_regular.xml diff --git a/mastodon/src/main/java/org/joinmastodon/android/api/StatusInteractionController.java b/mastodon/src/main/java/org/joinmastodon/android/api/StatusInteractionController.java index 8baabf20a..69d96cd42 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/api/StatusInteractionController.java +++ b/mastodon/src/main/java/org/joinmastodon/android/api/StatusInteractionController.java @@ -6,6 +6,7 @@ import org.joinmastodon.android.E; import org.joinmastodon.android.MastodonApp; import org.joinmastodon.android.api.requests.statuses.SetStatusBookmarked; import org.joinmastodon.android.api.requests.statuses.SetStatusFavorited; +import org.joinmastodon.android.api.requests.statuses.SetStatusMuted; import org.joinmastodon.android.api.requests.statuses.SetStatusReblogged; import org.joinmastodon.android.events.StatusCountersUpdatedEvent; import org.joinmastodon.android.model.Status; @@ -23,6 +24,7 @@ public class StatusInteractionController{ private final HashMap runningFavoriteRequests=new HashMap<>(); private final HashMap runningReblogRequests=new HashMap<>(); private final HashMap runningBookmarkRequests=new HashMap<>(); + private final HashMap runningMuteRequests=new HashMap<>(); public StatusInteractionController(String accountID, boolean updateCounters) { this.accountID=accountID; @@ -135,4 +137,36 @@ public class StatusInteractionController{ status.bookmarked=bookmarked; if (updateCounters) E.post(new StatusCountersUpdatedEvent(status)); } + + public void setMuted(Status status, boolean muted, Consumer cb){ + if(!Looper.getMainLooper().isCurrentThread()) + throw new IllegalStateException("Can only be called from main thread"); + + SetStatusMuted current=runningMuteRequests.remove(status.id); + if(current!=null){ + current.cancel(); + } + SetStatusMuted req=(SetStatusMuted) new SetStatusMuted(status.id, muted) + .setCallback(new Callback<>(){ + @Override + public void onSuccess(Status result){ + runningMuteRequests.remove(status.id); + cb.accept(result); + if (updateCounters) E.post(new StatusCountersUpdatedEvent(result)); + } + + @Override + public void onError(ErrorResponse error){ + runningMuteRequests.remove(status.id); + error.showToast(MastodonApp.context); + status.muted=!muted; + cb.accept(status); + if (updateCounters) E.post(new StatusCountersUpdatedEvent(status)); + } + }) + .exec(accountID); + runningMuteRequests.put(status.id, req); + status.muted=muted; + if (updateCounters) E.post(new StatusCountersUpdatedEvent(status)); + } } diff --git a/mastodon/src/main/java/org/joinmastodon/android/api/requests/statuses/SetStatusMuted.java b/mastodon/src/main/java/org/joinmastodon/android/api/requests/statuses/SetStatusMuted.java new file mode 100644 index 000000000..6164b2244 --- /dev/null +++ b/mastodon/src/main/java/org/joinmastodon/android/api/requests/statuses/SetStatusMuted.java @@ -0,0 +1,11 @@ +package org.joinmastodon.android.api.requests.statuses; + +import org.joinmastodon.android.api.MastodonAPIRequest; +import org.joinmastodon.android.model.Status; + +public class SetStatusMuted extends MastodonAPIRequest{ + public SetStatusMuted(String id, boolean muted){ + super(HttpMethod.POST, "/statuses/"+id+"/"+(muted ? "mute" : "unmute"), Status.class); + setRequestBody(new Object()); + } +} diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/HeaderStatusDisplayItem.java b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/HeaderStatusDisplayItem.java index 37fda6082..9ff8ec178 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/HeaderStatusDisplayItem.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/HeaderStatusDisplayItem.java @@ -38,6 +38,7 @@ import org.joinmastodon.android.fragments.ThreadFragment; import org.joinmastodon.android.fragments.report.ReportReasonChoiceFragment; import org.joinmastodon.android.model.Account; import org.joinmastodon.android.model.Announcement; +import org.joinmastodon.android.model.Mention; import org.joinmastodon.android.model.Notification; import org.joinmastodon.android.model.Relationship; import org.joinmastodon.android.model.ScheduledStatus; @@ -56,6 +57,7 @@ import java.time.format.FormatStyle; import java.util.Collections; import java.util.List; import java.util.Locale; +import java.util.Objects; import java.util.function.Consumer; import androidx.annotation.LayoutRes; @@ -248,6 +250,8 @@ public class HeaderStatusDisplayItem extends StatusDisplayItem{ UiUtils.confirmPinPost(item.parentFragment.getActivity(), item.parentFragment.getAccountID(), item.status, !item.status.pinned, s->{}); }else if(id==R.id.mute){ UiUtils.confirmToggleMuteUser(item.parentFragment.getActivity(), item.parentFragment.getAccountID(), account, relationship!=null && relationship.muting, r->{}); + }else if (id==R.id.mute_conversation) { + UiUtils.confirmToggleMuteConversation(item.parentFragment.getActivity(), item.parentFragment.getAccountID(), item.status, ()->{}); }else if(id==R.id.block){ UiUtils.confirmToggleBlockUser(item.parentFragment.getActivity(), item.parentFragment.getAccountID(), account, relationship!=null && relationship.blocking, r->{}); }else if(id==R.id.report){ @@ -507,6 +511,12 @@ public class HeaderStatusDisplayItem extends StatusDisplayItem{ menu.findItem(R.id.delete_and_redraft).setVisible(!isPostScheduled && item.status!=null && isOwnPost); menu.findItem(R.id.pin).setVisible(!isPostScheduled && item.status!=null && isOwnPost && !item.status.pinned); menu.findItem(R.id.unpin).setVisible(!isPostScheduled && item.status!=null && isOwnPost && item.status.pinned); + menu.findItem(R.id.mute_conversation).setVisible((item.status!=null && !item.status.muted) && (isOwnPost || item.status.mentions.stream().anyMatch(m->{ + if(m==null) + return false; + return m.id.equals(AccountSessionManager.get(item.parentFragment.getAccountID()).self.id); + }))); + menu.findItem(R.id.unmute_conversation).setVisible(item.status!=null && item.status.muted); menu.findItem(R.id.open_in_browser).setVisible(!isPostScheduled && item.status!=null); menu.findItem(R.id.copy_link).setVisible(!isPostScheduled && item.status!=null); MenuItem blockDomain=menu.findItem(R.id.block_domain); diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/utils/UiUtils.java b/mastodon/src/main/java/org/joinmastodon/android/ui/utils/UiUtils.java index ab0b391ec..75c1deeef 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/utils/UiUtils.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/utils/UiUtils.java @@ -85,6 +85,7 @@ import org.joinmastodon.android.api.requests.search.GetSearchResults; import org.joinmastodon.android.api.requests.statuses.CreateStatus; import org.joinmastodon.android.api.requests.statuses.DeleteStatus; import org.joinmastodon.android.api.requests.statuses.GetStatusByID; +import org.joinmastodon.android.api.requests.statuses.SetStatusMuted; import org.joinmastodon.android.api.requests.statuses.SetStatusPinned; import org.joinmastodon.android.api.session.AccountSession; import org.joinmastodon.android.api.session.AccountSessionManager; @@ -666,6 +667,31 @@ public class UiUtils { ); } + public static void confirmToggleMuteConversation(Activity activity, String accountID, Status status, Runnable resultCallback) { + showConfirmationAlert(activity, + status.muted ? R.string.mo_unmute_conversation : R.string.mo_mute_conversation, + status.muted ? R.string.mo_confirm_to_unmute_conversation : R.string.mo_confirm_to_mute_conversation, + status.muted ? R.string.do_unmute : R.string.do_mute, + status.muted ? R.drawable.ic_fluent_alert_28_regular : R.drawable.ic_fluent_alert_off_28_regular, + () -> new SetStatusMuted(status.id, !status.muted) + .setCallback(new Callback(){ + @Override + public void onSuccess(Status result){ + resultCallback.run(); + //TODO make an event for this + } + + @Override + public void onError(ErrorResponse error){ + error.showToast(activity); + } + }) + .wrapProgress(activity, status.muted ? R.string.mo_unmuting : R.string.mo_muting, false) + .exec(accountID) + + ); + } + public static void confirmDeleteScheduledPost(Activity activity, String accountID, ScheduledStatus status, Runnable resultCallback) { boolean isDraft = status.scheduledAt.isAfter(CreateStatus.DRAFTS_AFTER_INSTANT); showConfirmationAlert(activity, diff --git a/mastodon/src/main/res/drawable/ic_fluent_alert_off_24_regular.xml b/mastodon/src/main/res/drawable/ic_fluent_alert_off_24_regular.xml new file mode 100644 index 000000000..9a652f86b --- /dev/null +++ b/mastodon/src/main/res/drawable/ic_fluent_alert_off_24_regular.xml @@ -0,0 +1,9 @@ + + + diff --git a/mastodon/src/main/res/drawable/ic_fluent_alert_off_28_regular.xml b/mastodon/src/main/res/drawable/ic_fluent_alert_off_28_regular.xml new file mode 100644 index 000000000..149dcf7c9 --- /dev/null +++ b/mastodon/src/main/res/drawable/ic_fluent_alert_off_28_regular.xml @@ -0,0 +1,9 @@ + + + diff --git a/mastodon/src/main/res/menu/post.xml b/mastodon/src/main/res/menu/post.xml index 595a7e351..4aae0c04b 100644 --- a/mastodon/src/main/res/menu/post.xml +++ b/mastodon/src/main/res/menu/post.xml @@ -11,6 +11,8 @@ + + diff --git a/mastodon/src/main/res/values/strings_mo.xml b/mastodon/src/main/res/values/strings_mo.xml index e78bddaca..48505af5d 100644 --- a/mastodon/src/main/res/values/strings_mo.xml +++ b/mastodon/src/main/res/values/strings_mo.xml @@ -35,6 +35,12 @@ Manage Notifications Take picture No camera available! + Muting… + Unmuting… + Mute conversation + Unmute conversation + Confirm to mute conversation + Confirm to unmute conversation Add new poll option