Ask to moderate recent when banning if MUC supports it

Stephen Paul Weber created

Change summary

src/cheogram/res/values/strings.xml                                           |  1 
src/main/java/eu/siacs/conversations/entities/Conversation.java               | 14 
src/main/java/eu/siacs/conversations/ui/util/MucDetailsContextMenuHelper.java | 21 
3 files changed, 36 insertions(+)

Detailed changes

src/cheogram/res/values/strings.xml 🔗

@@ -42,4 +42,5 @@
     <string name="pref_follow_thread_in_channel">Auto-follow thread in channels</string>
     <string name="pref_follow_thread_in_channel_summary">Set the thread marker to match the message currently being looked at</string>
     <string name="notify_only_when_highlighted_or_replied">Notify for mentions and replies</string>
+    <string name="moderate_recent">Moderate messages?</string>
 </resources>

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<Message> findMessagesBy(MucOptions.User user) {
+        List<Message> 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<String> findReactionsTo(String id, Jid reactor) {
         Set<String> reactionEmoji = new HashSet<>();
         Message reactM = findMessageReactingTo(id, reactor);

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: