automatically reject/ignore calls from strangers if the setting is set

Daniel Gultsch created

Change summary

src/main/java/eu/siacs/conversations/services/NotificationService.java        |  2 
src/main/java/eu/siacs/conversations/xmpp/jingle/JingleConnectionManager.java | 22 
2 files changed, 20 insertions(+), 4 deletions(-)

Detailed changes

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

@@ -224,7 +224,7 @@ public class NotificationService {
                 && (!conversation.isWithStranger() || notificationsFromStrangers());
     }
 
-    private boolean notificationsFromStrangers() {
+    public boolean notificationsFromStrangers() {
         return mXmppConnectionService.getBooleanPreference("notifications_from_strangers", R.bool.notifications_from_strangers);
     }
 

src/main/java/eu/siacs/conversations/xmpp/jingle/JingleConnectionManager.java 🔗

@@ -27,6 +27,7 @@ import java.util.concurrent.TimeUnit;
 
 import eu.siacs.conversations.Config;
 import eu.siacs.conversations.entities.Account;
+import eu.siacs.conversations.entities.Contact;
 import eu.siacs.conversations.entities.Conversation;
 import eu.siacs.conversations.entities.Conversational;
 import eu.siacs.conversations.entities.Message;
@@ -87,8 +88,9 @@ public class JingleConnectionManager extends AbstractConnectionManager {
                 connection = new JingleFileTransferConnection(this, id, from);
             } else if (Namespace.JINGLE_APPS_RTP.equals(descriptionNamespace) && !usesTor(account)) {
                 final boolean sessionEnded = this.endedSessions.asMap().containsKey(PersistableSessionId.of(id));
-                if (isBusy() || sessionEnded) {
-                    Log.d(Config.LOGTAG, id.account.getJid().asBareJid() + ": rejected session with " + id.with + " because busy. sessionEnded=" + sessionEnded);
+                final boolean stranger = isWithStrangerAndStrangerNotificationsAreOff(account, id.with);
+                if (isBusy() || sessionEnded || stranger) {
+                    Log.d(Config.LOGTAG, id.account.getJid().asBareJid() + ": rejected session with " + id.with + " because busy. sessionEnded=" + sessionEnded+", stranger="+stranger);
                     mXmppConnectionService.sendIqPacket(account, packet.generateResponse(IqPacket.TYPE.RESULT), null);
                     final JinglePacket sessionTermination = new JinglePacket(JinglePacket.Action.SESSION_TERMINATE, id.sessionId);
                     sessionTermination.setTo(id.with);
@@ -124,6 +126,15 @@ public class JingleConnectionManager extends AbstractConnectionManager {
         }
     }
 
+    private boolean isWithStrangerAndStrangerNotificationsAreOff(final Account account, Jid with) {
+        final boolean notifyForStrangers = mXmppConnectionService.getNotificationService().notificationsFromStrangers();
+        if (notifyForStrangers) {
+            return false;
+        }
+        final Contact contact = account.getRoster().getContact(with);
+        return !contact.showInContactList();
+    }
+
     public void respondWithJingleError(final Account account, final IqPacket original, String jingleCondition, String condition, String conditionType) {
         final IqPacket response = original.generateResponse(IqPacket.TYPE.ERROR);
         final Element error = response.addChild("error");
@@ -205,8 +216,13 @@ public class JingleConnectionManager extends AbstractConnectionManager {
                     Log.d(Config.LOGTAG, account.getJid().asBareJid() + ": encountered unknown media in session proposal. " + propose);
                     return;
                 }
-                if (isBusy()) {
+                final boolean stranger = isWithStrangerAndStrangerNotificationsAreOff(account, id.with);
+                if (isBusy() || stranger) {
                     writeLogMissedIncoming(account, id.with.asBareJid(), id.sessionId, serverMsgId, timestamp);
+                    if (stranger) {
+                        Log.d(Config.LOGTAG,id.account.getJid().asBareJid()+": ignoring call proposal from stranger "+id.with);
+                        return;
+                    }
                     final int activeDevices = account.countPresences();
                     Log.d(Config.LOGTAG, "active devices: " + activeDevices);
                     if (activeDevices == 0) {