diff --git a/src/main/java/eu/siacs/conversations/ui/RtpSessionActivity.java b/src/main/java/eu/siacs/conversations/ui/RtpSessionActivity.java index b91269c25ef54fec6a430a9fa212058608685bf2..a052f8b39063f7767664b55c03451c2834a2fc9b 100644 --- a/src/main/java/eu/siacs/conversations/ui/RtpSessionActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/RtpSessionActivity.java @@ -217,7 +217,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 2581088ca53ae7a4b860c3b6de0f09ee28d8f159..4c327a31f9a58847f05b41227153198e798a5744 100644 --- a/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleRtpConnection.java +++ b/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleRtpConnection.java @@ -45,10 +45,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; @@ -2763,6 +2766,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); }