diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/SignalCallManager.java b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/SignalCallManager.java index cda5859fb6..21abe02856 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/SignalCallManager.java +++ b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/SignalCallManager.java @@ -89,11 +89,11 @@ import org.whispersystems.signalservice.api.push.exceptions.UnregisteredUserExce import org.whispersystems.signalservice.internal.push.SyncMessage; import java.io.IOException; +import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; -import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Objects; @@ -410,9 +410,9 @@ public final class SignalCallManager implements CallManager.Observer, GroupCall. CallLinkAuthCredentialPresentation callLinkAuthCredentialPresentation = AppDependencies.getGroupsV2Authorization() .getCallLinkAuthorizationForToday( - genericServerPublicParams, - CallLinkSecretParams.deriveFromRootKey(callLinkRootKey.getKeyBytes()) - ); + genericServerPublicParams, + CallLinkSecretParams.deriveFromRootKey(callLinkRootKey.getKeyBytes()) + ); callManager.peekCallLinkCall(SignalStore.internal().groupCallingServer(), callLinkAuthCredentialPresentation.serialize(), callLinkRootKey, peekInfo -> { PeekInfo info = peekInfo.getValue(); @@ -1023,31 +1023,13 @@ public final class SignalCallManager implements CallManager.Observer, GroupCall. try { TurnServerInfo turnServerInfo = AppDependencies.getSignalServiceAccountManager().getTurnServerInfo(); - List iceServers = new LinkedList<>(); - for (String url : ListUtil.emptyIfNull(turnServerInfo.getUrlsWithIps())) { - if (url.startsWith("turn")) { - iceServers.add(PeerConnection.IceServer.builder(url) - .setUsername(turnServerInfo.getUsername()) - .setPassword(turnServerInfo.getPassword()) - .setHostname(turnServerInfo.getHostname()) - .createIceServer()); - } else { - iceServers.add(PeerConnection.IceServer.builder(url) - .setHostname(turnServerInfo.getHostname()) - .createIceServer()); - } - } - for (String url : ListUtil.emptyIfNull(turnServerInfo.getUrls())) { - if (url.startsWith("turn")) { - iceServers.add(PeerConnection.IceServer.builder(url) - .setUsername(turnServerInfo.getUsername()) - .setPassword(turnServerInfo.getPassword()) - .createIceServer()); - } else { - iceServers.add(PeerConnection.IceServer.builder(url).createIceServer()); - } + List turnServerInfos = new ArrayList<>(); + if (turnServerInfo != null) { + turnServerInfos.add(turnServerInfo); + turnServerInfos.addAll(turnServerInfo.getIceServers()); } + List iceServers = mapToIceServers(turnServerInfos); process((s, p) -> { RemotePeer activePeer = s.getCallInfoState().getActivePeer(); if (activePeer != null && activePeer.getCallId().equals(remotePeer.getCallId())) { @@ -1064,6 +1046,39 @@ public final class SignalCallManager implements CallManager.Observer, GroupCall. }); } + private static List mapToIceServers(@NonNull List turnServerInfos) { + List iceServers = new ArrayList<>(); + + for (TurnServerInfo turnServerInfo: turnServerInfos) { + if (turnServerInfo.getUrls() != null) { + iceServers.addAll( + turnServerInfo.getUrlsWithIps() + .stream() + .map(url -> + PeerConnection.IceServer.builder(url) + .setUsername(turnServerInfo.getUsername()) + .setPassword(turnServerInfo.getPassword()) + .setHostname(turnServerInfo.getHostname()) + .createIceServer() + ).toList()); + } + if (turnServerInfo.getUrlsWithIps() != null) { + iceServers.addAll( + turnServerInfo.getUrls() + .stream() + .map(url -> + PeerConnection.IceServer.builder(url) + .setUsername(turnServerInfo.getUsername()) + .setPassword(turnServerInfo.getPassword()) + .createIceServer() + ).toList() + ); + } + } + + return iceServers; + } + public void sendGroupCallUpdateMessage(@NonNull Recipient recipient, @Nullable String groupCallEraId, final @Nullable CallId callId, boolean isIncoming, boolean isJoinEvent) { Log.i(TAG, "sendGroupCallUpdateMessage id: " + recipient.getId() + " era: " + groupCallEraId + " isIncoming: " + isIncoming + " isJoinEvent: " + isJoinEvent); diff --git a/libsignal-service/src/main/java/org/whispersystems/signalservice/api/messages/calls/TurnServerInfo.java b/libsignal-service/src/main/java/org/whispersystems/signalservice/api/messages/calls/TurnServerInfo.java index 5833d512c7..8e9f9737fc 100644 --- a/libsignal-service/src/main/java/org/whispersystems/signalservice/api/messages/calls/TurnServerInfo.java +++ b/libsignal-service/src/main/java/org/whispersystems/signalservice/api/messages/calls/TurnServerInfo.java @@ -3,6 +3,7 @@ package org.whispersystems.signalservice.api.messages.calls; import com.fasterxml.jackson.annotation.JsonProperty; +import java.util.Collections; import java.util.List; public class TurnServerInfo { @@ -22,6 +23,9 @@ public class TurnServerInfo { @JsonProperty private List urlsWithIps; + @JsonProperty + private List iceServers; + public String getUsername() { return username; } @@ -42,4 +46,8 @@ public class TurnServerInfo { public List getUrlsWithIps() { return urlsWithIps; } + + public List getIceServers() { + return (iceServers != null) ? iceServers : Collections.emptyList(); + } }