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