diff --git a/src/main/java/eu/siacs/conversations/ui/RtpSessionActivity.java b/src/main/java/eu/siacs/conversations/ui/RtpSessionActivity.java index f8bbdbcad40df8cfbef1bd38bf675be61e9c85ce..53a31e9e3a29855df5a544e228e7c152bb6f8930 100644 --- a/src/main/java/eu/siacs/conversations/ui/RtpSessionActivity.java +++ b/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() { diff --git a/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleRtpConnection.java b/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleRtpConnection.java index 330829b1f343e1018ce432288e32b822a1e05031..e9160e6b0da32856bb473665d78683729f327d3f 100644 --- a/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleRtpConnection.java +++ b/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 features = + serviceDiscoveryResult == null ? null : serviceDiscoveryResult.getFeatures(); + return features != null && features.contains(Namespace.JINGLE_FEATURE_VIDEO); + } + private interface OnIceServersDiscovered { void onIceServersDiscovered(List iceServers); }