diff --git a/src/cheogram/res/values/strings.xml b/src/cheogram/res/values/strings.xml index 5cdf4014fe495aa22dea82396f08da8482f1db28..b6b9524b9955d602800d07b1c3b49c1f5adc1ca5 100644 --- a/src/cheogram/res/values/strings.xml +++ b/src/cheogram/res/values/strings.xml @@ -42,4 +42,5 @@ Auto-follow thread in channels Set the thread marker to match the message currently being looked at Notify for mentions and replies + Moderate messages? diff --git a/src/main/java/eu/siacs/conversations/entities/Conversation.java b/src/main/java/eu/siacs/conversations/entities/Conversation.java index 0759f189e5401d19c987b5e042d34073370aac93..c33913b2a62a6f83ae02cb3bfeee5a9e9921e032 100644 --- a/src/main/java/eu/siacs/conversations/entities/Conversation.java +++ b/src/main/java/eu/siacs/conversations/entities/Conversation.java @@ -586,6 +586,20 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl return null; } + public List findMessagesBy(MucOptions.User user) { + List result = new ArrayList<>(); + synchronized (this.messages) { + for (Message m : this.messages) { + // occupant id? + final Jid trueCp = m.getTrueCounterpart(); + if (m.getCounterpart().equals(user.getFullJid()) || (trueCp != null && trueCp.equals(user.getRealJid()))) { + result.add(m); + } + } + } + return result; + } + public Set findReactionsTo(String id, Jid reactor) { Set reactionEmoji = new HashSet<>(); Message reactM = findMessageReactingTo(id, reactor); diff --git a/src/main/java/eu/siacs/conversations/ui/util/MucDetailsContextMenuHelper.java b/src/main/java/eu/siacs/conversations/ui/util/MucDetailsContextMenuHelper.java index d0d28526c5135c464d36a52dd74681568e2a9547..de26ab5ceac1f2702c11bb27a0e1a578d4c7ff60 100644 --- a/src/main/java/eu/siacs/conversations/ui/util/MucDetailsContextMenuHelper.java +++ b/src/main/java/eu/siacs/conversations/ui/util/MucDetailsContextMenuHelper.java @@ -12,14 +12,17 @@ import android.view.MenuItem; import android.view.View; import androidx.appcompat.app.AlertDialog; +import androidx.databinding.DataBindingUtil; import java.util.ArrayList; import eu.siacs.conversations.Config; import eu.siacs.conversations.R; +import eu.siacs.conversations.databinding.DialogQuickeditBinding; import eu.siacs.conversations.entities.Account; import eu.siacs.conversations.entities.Contact; import eu.siacs.conversations.entities.Conversation; +import eu.siacs.conversations.entities.Message; import eu.siacs.conversations.entities.MucOptions; import eu.siacs.conversations.entities.MucOptions.User; import eu.siacs.conversations.services.XmppConnectionService; @@ -160,6 +163,23 @@ public final class MucDetailsContextMenuHelper { return onContextItemSelected(item, user, activity, null); } + public static void maybeModerateRecent(XmppActivity activity, Conversation conversation, User user) { + if (!conversation.getMucOptions().getSelf().getRole().ranks(MucOptions.Role.MODERATOR) || !conversation.getMucOptions().hasFeature("urn:xmpp:message-moderate:0")) return; + + DialogQuickeditBinding binding = DataBindingUtil.inflate(activity.getLayoutInflater(), R.layout.dialog_quickedit, null, false); + binding.inputEditText.setText("Spam"); + new AlertDialog.Builder(activity) + .setTitle(R.string.moderate_recent) + .setMessage("Do you want to moderate all recent messages from this user?") + .setView(binding.getRoot()) + .setPositiveButton(R.string.yes, (dialog, whichButton) -> { + for (Message m : conversation.findMessagesBy(user)) { + activity.xmppConnectionService.moderateMessage(conversation.getAccount(), m, binding.inputEditText.getText().toString()); + } + }) + .setNegativeButton(R.string.no, null).show(); + } + public static boolean onContextItemSelected(MenuItem item, User user, XmppActivity activity, final String fingerprint) { final Conversation conversation = user.getConversation(); final XmppConnectionService.OnAffiliationChanged onAffiliationChanged = activity instanceof XmppConnectionService.OnAffiliationChanged ? (XmppConnectionService.OnAffiliationChanged) activity : null; @@ -207,6 +227,7 @@ public final class MucDetailsContextMenuHelper { if (user.getRole() != MucOptions.Role.NONE) { activity.xmppConnectionService.changeRoleInConference(conversation, user.getName(), MucOptions.Role.NONE); } + maybeModerateRecent(activity, conversation, user); break; case ACTION_GRANT_MEMBERSHIP: case ACTION_REMOVE_ADMIN: