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