diff --git a/build.gradle b/build.gradle index e7126a8e09c1c94d062791a501288116e2ca2d01..7d517e3d549328fc30209bf703ef82817ce0c399 100644 --- a/build.gradle +++ b/build.gradle @@ -114,7 +114,7 @@ dependencies { implementation 'com.splitwise:tokenautocomplete:3.0.2' implementation 'com.github.singpolyma:Better-Link-Movement-Method:4df081e1e4' implementation 'com.github.singpolyma:android-identicons:3361281bd4' - implementation 'im.conversations.webrtc:webrtc-android:104.0.0' + implementation 'im.conversations.webrtc:webrtc-android:117.1.0' implementation 'com.github.woltapp:blurhash:master' implementation 'com.caverock:androidsvg-aar:1.4' implementation 'org.tomlj:tomlj:1.1.0' 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 693429a1163c962ae88ec9ed4ea68361b3597f7a..4aa7691f0b1d101ff06b0d54828516d26ddf96f0 100644 --- a/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleRtpConnection.java +++ b/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleRtpConnection.java @@ -2632,6 +2632,10 @@ public class JingleRtpConnection extends AbstractJingleConnection if (port < 0 || port > 65535) { continue; } + + + + if (Arrays.asList("stun", "stuns", "turn", "turns") .contains(type) && Arrays.asList("udp", "tcp").contains(transport)) { @@ -2643,20 +2647,22 @@ public class JingleRtpConnection extends AbstractJingleConnection + ": skipping invalid combination of udp/tls in external services"); continue; } - // TODO Starting on milestone 110, Chromium will perform - // stricter validation of TURN and STUN URLs passed to the - // constructor of an RTCPeerConnection. More specifically, - // STUN URLs will not support a query section, and TURN URLs - // will support only a transport parameter in their query - // section. + + // STUN URLs do not support a query section since M110 + final String uri; + if (Arrays.asList("stun","stuns").contains(type)) { + uri = String.format("%s:%s%s", type, IP.wrapIPv6(host),port); + } else { + uri = String.format( + "%s:%s:%s?transport=%s", + type, + IP.wrapIPv6(host), + port, + transport); + } + final PeerConnection.IceServer.Builder iceServerBuilder = - PeerConnection.IceServer.builder( - String.format( - "%s:%s:%s?transport=%s", - type, - IP.wrapIPv6(host), - port, - transport)); + PeerConnection.IceServer.builder(uri); iceServerBuilder.setTlsCertPolicy( PeerConnection.TlsCertPolicy .TLS_CERT_POLICY_INSECURE_NO_CHECK); diff --git a/src/main/java/eu/siacs/conversations/xmpp/jingle/WebRTCWrapper.java b/src/main/java/eu/siacs/conversations/xmpp/jingle/WebRTCWrapper.java index 13725fde419fcb562f7a6f023bf63f5c14c0e8aa..e0cb6a91ed2f23d29a2c2d967f3b0957eb576754 100644 --- a/src/main/java/eu/siacs/conversations/xmpp/jingle/WebRTCWrapper.java +++ b/src/main/java/eu/siacs/conversations/xmpp/jingle/WebRTCWrapper.java @@ -36,13 +36,13 @@ import org.webrtc.SdpObserver; import org.webrtc.SessionDescription; import org.webrtc.VideoTrack; import org.webrtc.audio.JavaAudioDeviceModule; -import org.webrtc.voiceengine.WebRtcAudioEffects; import java.util.LinkedList; import java.util.List; import java.util.Queue; import java.util.Map; import java.util.Set; +import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.atomic.AtomicBoolean; @@ -283,9 +283,7 @@ public class WebRTCWrapper { Preconditions.checkNotNull(media); Preconditions.checkArgument( media.size() > 0, "media can not be empty when initializing peer connection"); - final boolean setUseHardwareAcousticEchoCanceler = - WebRtcAudioEffects.canUseAcousticEchoCanceler() - && !HARDWARE_AEC_BLACKLIST.contains(Build.MODEL); + final boolean setUseHardwareAcousticEchoCanceler = !HARDWARE_AEC_BLACKLIST.contains(Build.MODEL); Log.d( Config.LOGTAG, String.format( @@ -609,11 +607,7 @@ public class WebRTCWrapper { new SetSdpObserver() { @Override public void onSetSuccess() { - final SessionDescription description = - peerConnection.getLocalDescription(); - Log.d(EXTENDED_LOGGING_TAG, "set local description:"); - logDescription(description); - future.set(description); + future.setFuture(getLocalDescriptionFuture()); } @Override @@ -627,6 +621,15 @@ public class WebRTCWrapper { MoreExecutors.directExecutor()); } + private ListenableFuture getLocalDescriptionFuture() { + return Futures.submit(() -> { + final SessionDescription description = requirePeerConnection().getLocalDescription(); + Log.d(EXTENDED_LOGGING_TAG, "local description:"); + logDescription(description); + return description; + },executorService); + } + public static void logDescription(final SessionDescription sessionDescription) { for (final String line : sessionDescription.description.split(