feat: add mute conversations menu item

This commit is contained in:
LucasGGamerM
2023-09-19 12:13:03 -03:00
parent 6cab15b4c6
commit 851fa70563
8 changed files with 107 additions and 0 deletions

View File

@@ -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<String, SetStatusFavorited> runningFavoriteRequests=new HashMap<>();
private final HashMap<String, SetStatusReblogged> runningReblogRequests=new HashMap<>();
private final HashMap<String, SetStatusBookmarked> runningBookmarkRequests=new HashMap<>();
private final HashMap<String, SetStatusMuted> 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<Status> 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));
}
}

View File

@@ -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<Status>{
public SetStatusMuted(String id, boolean muted){
super(HttpMethod.POST, "/statuses/"+id+"/"+(muted ? "mute" : "unmute"), Status.class);
setRequestBody(new Object());
}
}

View File

@@ -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);

View File

@@ -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<Status>(){
@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,

View File

@@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:pathData="M5.219,6.28L2.22,3.28C1.927,2.987 1.927,2.512 2.22,2.22C2.513,1.927 2.987,1.927 3.28,2.22L21.78,20.72C22.073,21.013 22.073,21.487 21.78,21.78C21.487,22.073 21.012,22.073 20.719,21.78L17.44,18.501L15,18.501C15,20.158 13.657,21.501 12,21.501C10.402,21.501 9.096,20.252 9.005,18.678L9,18.499L4.275,18.5C4.104,18.5 3.934,18.465 3.777,18.396C3.144,18.121 2.853,17.385 3.128,16.752L4.5,13.594V9.496C4.5,8.344 4.758,7.254 5.219,6.28ZM15.939,17L6.365,7.425C6.129,8.07 6,8.767 6,9.496V13.906L4.656,17H15.939ZM13.5,18.499L10.5,18.501C10.5,19.33 11.172,20.001 12,20.001C12.78,20.001 13.421,19.406 13.493,18.646L13.5,18.499ZM18,13.907L18.708,15.527L20.896,17.714C20.953,17.57 20.985,17.414 20.985,17.25C20.985,17.077 20.949,16.907 20.88,16.749L19.5,13.593V9.496L19.496,9.245C19.357,5.191 16.05,1.996 12,1.996C10.098,1.996 8.364,2.699 7.043,3.861L8.107,4.925C9.154,4.033 10.513,3.496 12,3.496C15.242,3.496 17.885,6.05 17.997,9.284L18,9.509L18,13.907Z"
android:fillColor="@color/fluent_default_icon_tint"/>
</vector>

View File

@@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="28dp"
android:height="28dp"
android:viewportWidth="28"
android:viewportHeight="28">
<path
android:pathData="M3.28,2.22C2.987,1.927 2.513,1.927 2.22,2.22C1.927,2.513 1.927,2.987 2.22,3.28L6.477,7.538C5.852,8.721 5.499,10.07 5.499,11.501L5.498,16.112L4.082,19.756L4.04,19.88C3.868,20.506 4.193,21.173 4.811,21.413C4.959,21.471 5.116,21.5 5.275,21.5L10.498,21.499L10.504,21.693C10.603,23.538 12.131,25.003 14,25.003C15.934,25.003 17.501,23.435 17.501,21.501L20.44,21.5L24.719,25.781C25.012,26.073 25.487,26.073 25.78,25.781C26.073,25.488 26.073,25.013 25.78,24.72L3.28,2.22ZM18.938,19.999H5.596L6.948,16.525L6.976,16.437C6.991,16.377 6.999,16.315 6.999,16.253V11.501L7.003,11.261C7.034,10.337 7.244,9.459 7.599,8.66L18.938,19.999ZM15.996,21.65C15.92,22.686 15.055,23.503 14,23.503C12.895,23.503 11.998,22.606 11.998,21.501L16,21.499L15.996,21.65ZM8.34,5.158L9.403,6.221C10.632,5.149 12.24,4.5 14,4.5C17.867,4.5 21.001,7.635 21.001,11.501V16.253L21.007,16.346C21.014,16.407 21.03,16.467 21.052,16.525L21.905,18.723L23.901,20.719C23.966,20.566 24.002,20.397 24.002,20.22L23.992,20.062C23.979,19.958 23.953,19.855 23.915,19.757L22.501,16.113L22.501,11.501L22.497,11.246C22.362,6.669 18.61,3 14,3C11.826,3 9.843,3.816 8.34,5.158Z"
android:fillColor="@color/fluent_default_icon_tint"/>
</vector>

View File

@@ -11,6 +11,8 @@
<item android:id="@+id/manage_user_lists" android:title="@string/sk_lists_with_user" android:icon="@drawable/ic_fluent_people_24_regular"/>
<item android:id="@+id/follow" android:title="@string/follow_user" android:icon="@drawable/ic_fluent_person_add_24_regular"/>
<item android:id="@+id/mute" android:title="@string/mute_user" android:icon="@drawable/ic_fluent_speaker_off_24_regular"/>
<item android:id="@+id/mute_conversation" android:title="@string/mo_mute_conversation" android:icon="@drawable/ic_fluent_alert_off_24_regular" />
<item android:id="@+id/unmute_conversation" android:title="@string/mo_unmute_conversation" android:icon="@drawable/ic_fluent_alert_24_regular" />
<item android:id="@+id/block" android:title="@string/block_user" android:icon="@drawable/ic_fluent_person_prohibited_24_regular"/>
<item android:id="@+id/block_domain" android:title="@string/block_domain" android:icon="@drawable/ic_fluent_shield_prohibited_24_regular"/>
<item android:id="@+id/report" android:title="@string/report_user" android:icon="@drawable/ic_fluent_warning_24_regular"/>

View File

@@ -35,6 +35,12 @@
<string name="mo_notification_management_settings">Manage Notifications</string>
<string name="mo_open_camera">Take picture</string>
<string name="mo_camera_not_available">No camera available!</string>
<string name="mo_muting">Muting…</string>
<string name="mo_unmuting">Unmuting…</string>
<string name="mo_mute_conversation">Mute conversation</string>
<string name="mo_unmute_conversation">Unmute conversation</string>
<string name="mo_confirm_to_mute_conversation">Confirm to mute conversation</string>
<string name="mo_confirm_to_unmute_conversation">Confirm to unmute conversation</string>
<!-- accessibility labels-->
<string name="mo_poll_option_add">Add new poll option</string>