provide option to reject subscription request when long pressing 'allow'

Daniel Gultsch created

Change summary

src/main/java/eu/siacs/conversations/services/XmppConnectionService.java | 12 
src/main/java/eu/siacs/conversations/ui/ContactDetailsActivity.java      |  2 
src/main/java/eu/siacs/conversations/ui/ConversationFragment.java        | 41 
src/main/res/menu/block.xml                                              |  3 
src/main/res/values/strings.xml                                          |  1 
5 files changed, 34 insertions(+), 25 deletions(-)

Detailed changes

src/main/java/eu/siacs/conversations/services/XmppConnectionService.java 🔗

@@ -1839,11 +1839,7 @@ public class XmppConnectionService extends Service {
 				leaveMuc(conversation);
 			} else {
 				if (conversation.getContact().getOption(Contact.Options.PENDING_SUBSCRIPTION_REQUEST)) {
-					Log.d(Config.LOGTAG, "Canceling presence request from " + conversation.getJid().toString());
-					sendPresencePacket(
-							conversation.getAccount(),
-							mPresenceGenerator.stopPresenceUpdatesTo(conversation.getContact())
-					);
+				    stopPresenceUpdatesTo(conversation.getContact());
 				}
 			}
 			updateConversation(conversation);
@@ -1852,6 +1848,12 @@ public class XmppConnectionService extends Service {
 		}
 	}
 
+	public void stopPresenceUpdatesTo(Contact contact) {
+        Log.d(Config.LOGTAG, "Canceling presence request from " + contact.getJid().toString());
+        sendPresencePacket(contact.getAccount(), mPresenceGenerator.stopPresenceUpdatesTo(contact));
+        contact.resetOption(Contact.Options.PENDING_SUBSCRIPTION_REQUEST);
+    }
+
 	public void createAccount(final Account account) {
 		account.initAccountServices(this);
 		databaseBackend.createAccount(account);

src/main/java/eu/siacs/conversations/ui/ContactDetailsActivity.java 🔗

@@ -77,7 +77,7 @@ public class ContactDetailsActivity extends OmemoActivity implements OnAccountUp
         public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
             if (isChecked) {
                 if (contact.getOption(Contact.Options.PENDING_SUBSCRIPTION_REQUEST)) {
-                    xmppConnectionService.sendPresencePacket(contact.getAccount(), xmppConnectionService.getPresenceGenerator().sendPresenceUpdatesTo(contact));
+                    xmppConnectionService.stopPresenceUpdatesTo(contact);
                 } else {
                     contact.setOption(Contact.Options.PREEMPTIVE_GRANT);
                 }

src/main/java/eu/siacs/conversations/ui/ConversationFragment.java 🔗

@@ -2071,25 +2071,28 @@ public class ConversationFragment extends XmppFragment implements EditMessage.Ke
 
     private boolean showBlockSubmenu(View view) {
         final Jid jid = conversation.getJid();
-        if (jid.getLocal() == null) {
-            BlockContactDialog.show(activity, conversation);
-        } else {
-            PopupMenu popupMenu = new PopupMenu(getActivity(), view);
-            popupMenu.inflate(R.menu.block);
-            popupMenu.setOnMenuItemClickListener(menuItem -> {
-                Blockable blockable;
-                switch (menuItem.getItemId()) {
-                    case R.id.block_domain:
-                        blockable = conversation.getAccount().getRoster().getContact(Jid.ofDomain(jid.getDomain()));
-                        break;
-                    default:
-                        blockable = conversation;
-                }
-                BlockContactDialog.show(activity, blockable);
-                return true;
-            });
-            popupMenu.show();
-        }
+        final boolean showReject = !conversation.isWithStranger() && conversation.getContact().getOption(Contact.Options.PENDING_SUBSCRIPTION_REQUEST);
+        PopupMenu popupMenu = new PopupMenu(getActivity(), view);
+        popupMenu.inflate(R.menu.block);
+        popupMenu.getMenu().findItem(R.id.block_contact).setVisible(jid.getLocal() != null);
+        popupMenu.getMenu().findItem(R.id.reject).setVisible(showReject);
+        popupMenu.setOnMenuItemClickListener(menuItem -> {
+            Blockable blockable;
+            switch (menuItem.getItemId()) {
+                case R.id.reject:
+                    activity.xmppConnectionService.stopPresenceUpdatesTo(conversation.getContact());
+                    updateSnackBar(conversation);
+                    return true;
+                case R.id.block_domain:
+                    blockable = conversation.getAccount().getRoster().getContact(Jid.ofDomain(jid.getDomain()));
+                    break;
+                default:
+                    blockable = conversation;
+            }
+            BlockContactDialog.show(activity, blockable);
+            return true;
+        });
+        popupMenu.show();
         return true;
     }
 

src/main/res/menu/block.xml 🔗

@@ -1,5 +1,8 @@
 <?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/reject_request"/>
     <item
         android:id="@+id/block_domain"
         android:title="@string/block_entire_domain" />

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

@@ -797,4 +797,5 @@
     <string name="your_name">Your name</string>
     <string name="enter_your_name">Enter your name</string>
     <string name="no_name_set_instructions">Use the edit button to set your name.</string>
+    <string name="reject_request">Reject request</string>
 </resources>