show switch to video only if other party has caps

Daniel Gultsch created

fixes #4421

Change summary

src/main/java/eu/siacs/conversations/ui/RtpSessionActivity.java           |  2 
src/main/java/eu/siacs/conversations/xmpp/jingle/JingleRtpConnection.java | 22 
2 files changed, 23 insertions(+), 1 deletion(-)

Detailed changes

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

@@ -239,7 +239,7 @@ public class RtpSessionActivity extends XmppActivity
         if (connection == null) {
             return false;
         }
-        return Media.audioOnly(connection.getMedia()) && STATES_CONSIDERED_CONNECTED.contains(connection.getEndUserState());
+        return connection.isSwitchToVideoAvailable();
     }
 
     private void switchToConversation() {

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

@@ -49,10 +49,13 @@ import eu.siacs.conversations.crypto.axolotl.AxolotlService;
 import eu.siacs.conversations.crypto.axolotl.CryptoFailedException;
 import eu.siacs.conversations.crypto.axolotl.FingerprintStatus;
 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;
+import eu.siacs.conversations.entities.Presence;
 import eu.siacs.conversations.entities.RtpSessionStatus;
+import eu.siacs.conversations.entities.ServiceDiscoveryResult;
 import eu.siacs.conversations.services.AppRTCAudioManager;
 import eu.siacs.conversations.utils.IP;
 import eu.siacs.conversations.xml.Element;
@@ -2777,6 +2780,25 @@ public class JingleRtpConnection extends AbstractJingleConnection
                 id.account, id.with, id.sessionId, endUserState);
     }
 
+    public boolean isSwitchToVideoAvailable() {
+        final boolean prerequisite =
+                Media.audioOnly(getMedia())
+                        && Arrays.asList(RtpEndUserState.CONNECTED, RtpEndUserState.RECONNECTING)
+                                .contains(getEndUserState());
+        return prerequisite && remoteHasVideoFeature();
+    }
+
+    private boolean remoteHasVideoFeature() {
+        final Contact contact = id.getContact();
+        final Presence presence =
+                contact.getPresences().get(Strings.nullToEmpty(id.with.getResource()));
+        final ServiceDiscoveryResult serviceDiscoveryResult =
+                presence == null ? null : presence.getServiceDiscoveryResult();
+        final List<String> features =
+                serviceDiscoveryResult == null ? null : serviceDiscoveryResult.getFeatures();
+        return features != null && features.contains(Namespace.JINGLE_FEATURE_VIDEO);
+    }
+
     private interface OnIceServersDiscovered {
         void onIceServersDiscovered(List<PeerConnection.IceServer> iceServers);
     }