@@ -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'
@@ -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);
@@ -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<SessionDescription> 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(