Change summary
src/cheogram/res/menu/block_muc.xml | 12
src/cheogram/res/values/strings.xml | 3
src/main/java/eu/siacs/conversations/entities/Conversation.java | 7
src/main/java/eu/siacs/conversations/parser/MessageParser.java | 1
src/main/java/eu/siacs/conversations/ui/ConversationFragment.java | 43 +
5 files changed, 66 insertions(+)
Detailed changes
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu xmlns:android="http://schemas.android.com/apk/res/android">
+ <item
+ android:id="@+id/reject"
+ android:title="@string/delete_and_close"/>
+ <item
+ android:id="@+id/block_contact"
+ android:title="@string/block_inviter" />
+ <item
+ android:id="@+id/add_bookmark"
+ android:title="@string/add_bookmark" />
+</menu>
@@ -45,4 +45,7 @@
<string name="pref_message_autocomplete_summary">For example, complete emoji starting with :</string>
<string name="notify_only_when_highlighted_or_replied">Notify for mentions and replies</string>
<string name="moderate_recent">Moderate messages?</string>
+ <string name="block_inviter">Block inviter</string>
+ <string name="add_bookmark">Add Chat</string>
+ <string name="received_invite_from_stranger">Received invite from stranger</string>
</resources>
@@ -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;
@@ -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);
@@ -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