fix feature discovery in jingle file transfer for empty resources

Daniel Gultsch created

Change summary

src/main/java/eu/siacs/conversations/entities/Message.java                         | 18 
src/main/java/eu/siacs/conversations/ui/util/PresenceSelector.java                 |  9 
src/main/java/eu/siacs/conversations/xmpp/jingle/JingleFileTransferConnection.java | 14 
3 files changed, 18 insertions(+), 23 deletions(-)

Detailed changes

src/main/java/eu/siacs/conversations/entities/Message.java 🔗

@@ -6,6 +6,8 @@ import android.graphics.Color;
 import android.text.SpannableStringBuilder;
 import android.util.Log;
 
+import com.google.common.base.Strings;
+
 import org.json.JSONException;
 
 import java.lang.ref.WeakReference;
@@ -21,6 +23,7 @@ import java.util.Set;
 import eu.siacs.conversations.Config;
 import eu.siacs.conversations.crypto.axolotl.FingerprintStatus;
 import eu.siacs.conversations.services.AvatarService;
+import eu.siacs.conversations.ui.util.PresenceSelector;
 import eu.siacs.conversations.utils.CryptoHelper;
 import eu.siacs.conversations.utils.Emoticons;
 import eu.siacs.conversations.utils.GeoHelper;
@@ -745,19 +748,12 @@ public class Message extends AbstractEntity implements AvatarService.Avatarable
 	}
 
 	public boolean fixCounterpart() {
-		Presences presences = conversation.getContact().getPresences();
-		if (counterpart != null && presences.has(counterpart.getResource())) {
+		final Presences presences = conversation.getContact().getPresences();
+		if (counterpart != null && presences.has(Strings.nullToEmpty(counterpart.getResource()))) {
 			return true;
 		} else if (presences.size() >= 1) {
-			try {
-				counterpart = Jid.of(conversation.getJid().getLocal(),
-						conversation.getJid().getDomain(),
-						presences.toResourceArray()[0]);
-				return true;
-			} catch (IllegalArgumentException e) {
-				counterpart = null;
-				return false;
-			}
+			counterpart = PresenceSelector.getNextCounterpart(getContact(),presences.toResourceArray()[0]);
+			return true;
 		} else {
 			counterpart = null;
 			return false;

src/main/java/eu/siacs/conversations/ui/util/PresenceSelector.java 🔗

@@ -112,12 +112,15 @@ public class PresenceSelector {
         builder.create().show();
     }
 
-
     public static Jid getNextCounterpart(final Contact contact, final String resource) {
+        return getNextCounterpart(contact.getJid(), resource);
+    }
+
+    public static Jid getNextCounterpart(final Jid jid, final String resource) {
         if (resource.isEmpty()) {
-            return contact.getJid().asBareJid();
+            return jid.asBareJid();
         } else {
-            return contact.getJid().withResource(resource);
+            return jid.withResource(resource);
         }
     }
 

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

@@ -4,6 +4,7 @@ import android.util.Base64;
 import android.util.Log;
 
 import com.google.common.base.Preconditions;
+import com.google.common.base.Strings;
 import com.google.common.collect.Collections2;
 import com.google.common.collect.FluentIterable;
 import com.google.common.collect.Iterables;
@@ -416,15 +417,10 @@ public class JingleFileTransferConnection extends AbstractJingleConnection imple
     }
 
     private List<String> getRemoteFeatures() {
-        final Jid jid = this.id.with;
-        String resource = jid != null ? jid.getResource() : null;
-        if (resource != null) {
-            Presence presence = this.id.account.getRoster().getContact(jid).getPresences().get(resource);
-            ServiceDiscoveryResult result = presence != null ? presence.getServiceDiscoveryResult() : null;
-            return result == null ? Collections.emptyList() : result.getFeatures();
-        } else {
-            return Collections.emptyList();
-        }
+        final String resource = Strings.nullToEmpty(this.id.with.getResource());
+        final Presence presence = this.id.account.getRoster().getContact(id.with).getPresences().get(resource);
+        final ServiceDiscoveryResult result = presence != null ? presence.getServiceDiscoveryResult() : null;
+        return result == null ? Collections.emptyList() : result.getFeatures();
     }
 
     private void init(JinglePacket packet) { //should move to deliverPacket