diff --git a/src/cheogram/res/menu/block_muc.xml b/src/cheogram/res/menu/block_muc.xml
new file mode 100644
index 0000000000000000000000000000000000000000..4e37f442aa5e72ef26da074cd801b9ce78d57705
--- /dev/null
+++ b/src/cheogram/res/menu/block_muc.xml
@@ -0,0 +1,12 @@
+
+
diff --git a/src/cheogram/res/values/strings.xml b/src/cheogram/res/values/strings.xml
index 225fda1b8e932591208f44ec601c27c8dc91a582..437854cd1978db8f9ec2fa6cccd79820ec659bc2 100644
--- a/src/cheogram/res/values/strings.xml
+++ b/src/cheogram/res/values/strings.xml
@@ -45,4 +45,7 @@
For example, complete emoji starting with :
Notify for mentions and replies
Moderate messages?
+ Block inviter
+ Add Chat
+ Received invite from stranger
diff --git a/src/main/java/eu/siacs/conversations/entities/Conversation.java b/src/main/java/eu/siacs/conversations/entities/Conversation.java
index e296b6daf8903c31c52c9c8ece3aa29fadf1bb0e..40e3c7c2ee60bb3cc5c4f9538bcc6d8c9d23cbe4 100644
--- a/src/main/java/eu/siacs/conversations/entities/Conversation.java
+++ b/src/main/java/eu/siacs/conversations/entities/Conversation.java
@@ -1365,6 +1365,13 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl
&& sentMessagesCount() == 0;
}
+ public boolean strangerInvited() {
+ final var inviterS = getAttribute("inviter");
+ if (inviterS == null) return false;
+ final var inviter = account.getRoster().getContact(Jid.of(inviterS));
+ return getBookmark() == null && !inviter.showInContactList() && !inviter.isSelf() && sentMessagesCount() == 0;
+ }
+
public int getReceivedMessagesCountSinceUuid(String uuid) {
if (uuid == null) {
return 0;
diff --git a/src/main/java/eu/siacs/conversations/parser/MessageParser.java b/src/main/java/eu/siacs/conversations/parser/MessageParser.java
index 83ffd0ae3088c34b107b15c19fd18c0fca02ee31..56da0db1ef18b7557a8fc49a6d5e1a279f8066aa 100644
--- a/src/main/java/eu/siacs/conversations/parser/MessageParser.java
+++ b/src/main/java/eu/siacs/conversations/parser/MessageParser.java
@@ -1348,6 +1348,7 @@ public class MessageParser extends AbstractParser implements OnMessagePacketRece
return false;
}
final Conversation conversation = mXmppConnectionService.findOrCreateConversation(account, jid, true, false);
+ conversation.setAttribute("inviter", inviter.toEscapedString());
if (conversation.getMucOptions().online()) {
Log.d(Config.LOGTAG, account.getJid().asBareJid() + ": received invite to " + jid + " but muc is considered to be online");
mXmppConnectionService.mucSelfPingAndRejoin(conversation);
diff --git a/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java b/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java
index 8dfcff0d8de59da7266fcfe9ca28a24362be2572..892a6dbeb3bc033b4fd28c72f2b3c8087c0d2f8e 100644
--- a/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java
+++ b/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java
@@ -3508,6 +3508,41 @@ public class ConversationFragment extends XmppFragment
return true;
}
+ private boolean showBlockMucSubmenu(View view) {
+ final var jid = conversation.getJid();
+ final var popupMenu = new PopupMenu(getActivity(), view);
+ popupMenu.inflate(R.menu.block_muc);
+ popupMenu.getMenu().findItem(R.id.block_contact).setVisible(jid.getLocal() != null);
+ popupMenu.setOnMenuItemClickListener(
+ menuItem -> {
+ Blockable blockable;
+ switch (menuItem.getItemId()) {
+ case R.id.reject:
+ activity.xmppConnectionService.clearConversationHistory(conversation);
+ activity.xmppConnectionService.archiveConversation(conversation);
+ return true;
+ case R.id.add_bookmark:
+ activity.xmppConnectionService.saveConversationAsBookmark(conversation, "");
+ updateSnackBar(conversation);
+ return true;
+ case R.id.block_contact:
+ blockable =
+ conversation
+ .getAccount()
+ .getRoster()
+ .getContact(Jid.of(conversation.getAttribute("inviter")));
+ break;
+ default:
+ blockable = conversation;
+ }
+ BlockContactDialog.show(activity, blockable);
+ activity.xmppConnectionService.archiveConversation(conversation);
+ return true;
+ });
+ popupMenu.show();
+ return true;
+ }
+
private void updateSnackBar(final Conversation conversation) {
final Account account = conversation.getAccount();
final XmppConnection connection = account.getXmppConnection();
@@ -3609,6 +3644,14 @@ public class ConversationFragment extends XmppFragment
}
} else if (account.hasPendingPgpIntent(conversation)) {
showSnackbar(R.string.openpgp_messages_found, R.string.decrypt, clickToDecryptListener);
+ } else if (connection != null
+ && connection.getFeatures().blocking()
+ && conversation.strangerInvited()) {
+ showSnackbar(
+ R.string.received_invite_from_stranger,
+ R.string.options,
+ (v) -> showBlockMucSubmenu(v),
+ (v) -> showBlockMucSubmenu(v));
} else if (connection != null
&& connection.getFeatures().blocking()
&& conversation.countMessages() != 0