Merge pull request #1251 from nextcloud/bugfix/noid/use-the-stun-urls-array

Use the stun urls array
This commit is contained in:
Andy Scherzinger 2021-05-20 12:32:33 +02:00 committed by GitHub
commit b2c53d5385
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 139 additions and 114 deletions

View File

@ -445,12 +445,12 @@ public class CallController extends BaseController {
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<RoomsOverall>() {
@Override
public void onSubscribe(Disposable d) {
public void onSubscribe(@io.reactivex.annotations.NonNull Disposable d) {
// unused atm
}
@Override
public void onNext(RoomsOverall roomsOverall) {
public void onNext(@io.reactivex.annotations.NonNull RoomsOverall roomsOverall) {
for (Conversation conversation : roomsOverall.getOcs().getData()) {
if (roomId.equals(conversation.getRoomId())) {
roomToken = conversation.getToken();
@ -462,13 +462,13 @@ public class CallController extends BaseController {
}
@Override
public void onError(Throwable e) {
public void onError(@io.reactivex.annotations.NonNull Throwable e) {
// unused atm
}
@Override
public void onComplete() {
// unused atm
}
});
}
@ -500,7 +500,6 @@ public class CallController extends BaseController {
pipVideoView.setScalingType(RendererCommon.ScalingType.SCALE_ASPECT_FIT);
pipVideoView.setOnTouchListener(new SelfVideoTouchListener());
}
gridView.setOnTouchListener(new View.OnTouchListener() {
@ -942,17 +941,16 @@ public class CallController extends BaseController {
}
}
if (isConnectionEstablished()) {
if (isConnectionEstablished() && magicPeerConnectionWrapperList != null) {
if (!hasMCU) {
for (int i = 0; i < magicPeerConnectionWrapperList.size(); i++) {
magicPeerConnectionWrapperList.get(i).sendChannelData(new DataChannelMessage(message));
for (MagicPeerConnectionWrapper magicPeerConnectionWrapper : magicPeerConnectionWrapperList) {
magicPeerConnectionWrapper.sendChannelData(new DataChannelMessage(message));
}
} else {
for (int i = 0; i < magicPeerConnectionWrapperList.size(); i++) {
if (magicPeerConnectionWrapperList.get(i).getSessionId().equals(webSocketClient.getSessionId())) {
magicPeerConnectionWrapperList.get(i).sendChannelData(new DataChannelMessage(message));
for (MagicPeerConnectionWrapper magicPeerConnectionWrapper : magicPeerConnectionWrapperList) {
if (magicPeerConnectionWrapper.getSessionId().equals(webSocketClient.getSessionId())) {
magicPeerConnectionWrapper.sendChannelData(new DataChannelMessage(message));
break;
}
}
}
@ -1095,7 +1093,7 @@ public class CallController extends BaseController {
}
private void fetchSignalingSettings() {
int apiVersion = ApiUtils.getSignalingApiVersion(conversationUser, new int[] {2, 1});
int apiVersion = ApiUtils.getSignalingApiVersion(conversationUser, new int[] {ApiUtils.APIv3, 2, 1});
ncApi.getSignalingSettings(credentials, ApiUtils.getUrlForSignalingSettings(apiVersion, baseUrl))
.subscribeOn(Schedulers.io())
@ -1103,13 +1101,12 @@ public class CallController extends BaseController {
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<SignalingSettingsOverall>() {
@Override
public void onSubscribe(Disposable d) {
public void onSubscribe(@io.reactivex.annotations.NonNull Disposable d) {
// unused atm
}
@Override
public void onNext(SignalingSettingsOverall signalingSettingsOverall) {
IceServer iceServer;
public void onNext(@io.reactivex.annotations.NonNull SignalingSettingsOverall signalingSettingsOverall) {
if (signalingSettingsOverall != null && signalingSettingsOverall.getOcs() != null &&
signalingSettingsOverall.getOcs().getSettings() != null) {
@ -1143,30 +1140,34 @@ public class CallController extends BaseController {
}
if (signalingSettingsOverall.getOcs().getSettings().getStunServers() != null) {
for (int i = 0; i < signalingSettingsOverall.getOcs().getSettings().getStunServers().size();
i++) {
iceServer = signalingSettingsOverall.getOcs().getSettings().getStunServers().get(i);
if (TextUtils.isEmpty(iceServer.getUsername()) || TextUtils.isEmpty(iceServer
.getCredential())) {
iceServers.add(new PeerConnection.IceServer(iceServer.getUrl()));
} else {
iceServers.add(new PeerConnection.IceServer(iceServer.getUrl(),
iceServer.getUsername(), iceServer.getCredential()));
List<IceServer> stunServers =
signalingSettingsOverall.getOcs().getSettings().getStunServers();
if (apiVersion == ApiUtils.APIv3) {
for (IceServer stunServer : stunServers) {
if (stunServer.getUrls() != null) {
for (String url : stunServer.getUrls()) {
iceServers.add(new PeerConnection.IceServer(url));
}
}
}
} else {
if (signalingSettingsOverall.getOcs().getSettings().getStunServers() != null) {
for (IceServer stunServer : stunServers) {
iceServers.add(new PeerConnection.IceServer(stunServer.getUrl()));
}
}
}
}
if (signalingSettingsOverall.getOcs().getSettings().getTurnServers() != null) {
for (int i = 0; i < signalingSettingsOverall.getOcs().getSettings().getTurnServers().size();
i++) {
iceServer = signalingSettingsOverall.getOcs().getSettings().getTurnServers().get(i);
for (int j = 0; j < iceServer.getUrls().size(); j++) {
if (TextUtils.isEmpty(iceServer.getUsername()) || TextUtils.isEmpty(iceServer
.getCredential())) {
iceServers.add(new PeerConnection.IceServer(iceServer.getUrls().get(j)));
} else {
iceServers.add(new PeerConnection.IceServer(iceServer.getUrls().get(j),
iceServer.getUsername(), iceServer.getCredential()));
List<IceServer> turnServers =
signalingSettingsOverall.getOcs().getSettings().getTurnServers();
for (IceServer turnServer : turnServers) {
if (turnServer.getUrls() != null) {
for (String url : turnServer.getUrls()) {
iceServers.add(new PeerConnection.IceServer(
url, turnServer.getUsername(), turnServer.getCredential()
));
}
}
}
@ -1177,13 +1178,13 @@ public class CallController extends BaseController {
}
@Override
public void onError(Throwable e) {
public void onError(@io.reactivex.annotations.NonNull Throwable e) {
Log.e(TAG, e.getMessage(), e);
}
@Override
public void onComplete() {
// unused atm
}
});
}
@ -1195,12 +1196,12 @@ public class CallController extends BaseController {
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<CapabilitiesOverall>() {
@Override
public void onSubscribe(Disposable d) {
public void onSubscribe(@io.reactivex.annotations.NonNull Disposable d) {
// unused atm
}
@Override
public void onNext(CapabilitiesOverall capabilitiesOverall) {
public void onNext(@io.reactivex.annotations.NonNull CapabilitiesOverall capabilitiesOverall) {
// FIXME check for compatible Call API version
if (hasExternalSignalingServer) {
setupAndInitiateWebSocketsConnection();
@ -1210,13 +1211,13 @@ public class CallController extends BaseController {
}
@Override
public void onError(Throwable e) {
public void onError(@io.reactivex.annotations.NonNull Throwable e) {
// unused atm
}
@Override
public void onComplete() {
// unused atm
}
});
}
@ -1234,12 +1235,12 @@ public class CallController extends BaseController {
.retry(3)
.subscribe(new Observer<RoomOverall>() {
@Override
public void onSubscribe(Disposable d) {
public void onSubscribe(@io.reactivex.annotations.NonNull Disposable d) {
// unused atm
}
@Override
public void onNext(RoomOverall roomOverall) {
public void onNext(@io.reactivex.annotations.NonNull RoomOverall roomOverall) {
callSession = roomOverall.getOcs().getData().getSessionId();
ApplicationWideCurrentRoomHolder.getInstance().setSession(callSession);
ApplicationWideCurrentRoomHolder.getInstance().setCurrentRoomId(roomId);
@ -1249,13 +1250,13 @@ public class CallController extends BaseController {
}
@Override
public void onError(Throwable e) {
public void onError(@io.reactivex.annotations.NonNull Throwable e) {
// unused atm
}
@Override
public void onComplete() {
// unused atm
}
});
} else {
@ -1288,26 +1289,31 @@ public class CallController extends BaseController {
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<GenericOverall>() {
@Override
public void onSubscribe(Disposable d) {
public void onSubscribe(@io.reactivex.annotations.NonNull Disposable d) {
// unused atm
}
@Override
public void onNext(GenericOverall genericOverall) {
public void onNext(@io.reactivex.annotations.NonNull GenericOverall genericOverall) {
if (!currentCallStatus.equals(CallStatus.LEAVING)) {
setCallState(CallStatus.JOINED);
ApplicationWideCurrentRoomHolder.getInstance().setInCall(true);
if (!TextUtils.isEmpty(roomToken)) {
NotificationUtils.INSTANCE.cancelExistingNotificationsForRoom(getApplicationContext(), conversationUser, roomToken);
NotificationUtils.INSTANCE.cancelExistingNotificationsForRoom(getApplicationContext(),
conversationUser,
roomToken);
}
if (!hasExternalSignalingServer) {
int apiVersion = ApiUtils.getSignalingApiVersion(conversationUser, new int[] {2, 1});
int apiVersion = ApiUtils.getSignalingApiVersion(conversationUser,
new int[] {ApiUtils.APIv3, 2, 1});
ncApi.pullSignalingMessages(credentials, ApiUtils.getUrlForSignaling(apiVersion,
baseUrl, roomToken))
ncApi.pullSignalingMessages(credentials,
ApiUtils.getUrlForSignaling(apiVersion,
baseUrl,
roomToken))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.repeatWhen(observable -> observable)
@ -1315,26 +1321,19 @@ public class CallController extends BaseController {
.retry(3, observable -> isConnectionEstablished())
.subscribe(new Observer<SignalingOverall>() {
@Override
public void onSubscribe(Disposable d) {
public void onSubscribe(@io.reactivex.annotations.NonNull Disposable d) {
signalingDisposable = d;
}
@Override
public void onNext(SignalingOverall signalingOverall) {
if (signalingOverall.getOcs().getSignalings() != null) {
for (int i = 0; i < signalingOverall.getOcs().getSignalings().size(); i++) {
try {
receivedSignalingMessage(signalingOverall.getOcs().getSignalings().get(i));
} catch (IOException e) {
Log.e(TAG, "Failed to process received signaling" +
" message");
}
}
}
public void onNext(
@io.reactivex.annotations.NonNull
SignalingOverall signalingOverall) {
receivedSignalingMessages(signalingOverall.getOcs().getSignalings());
}
@Override
public void onError(Throwable e) {
public void onError(@io.reactivex.annotations.NonNull Throwable e) {
dispose(signalingDisposable);
}
@ -1343,19 +1342,18 @@ public class CallController extends BaseController {
dispose(signalingDisposable);
}
});
}
}
}
@Override
public void onError(Throwable e) {
public void onError(@io.reactivex.annotations.NonNull Throwable e) {
// unused atm
}
@Override
public void onComplete() {
// unused atm
}
});
}
@ -1397,7 +1395,6 @@ public class CallController extends BaseController {
} else {
initiateCall();
}
} else {
}
break;
case "roomJoined":
@ -1409,14 +1406,19 @@ public class CallController extends BaseController {
break;
case "participantsUpdate":
if (webSocketCommunicationEvent.getHashMap().get("roomToken").equals(roomToken)) {
processUsersInRoom((List<HashMap<String, Object>>) webSocketClient.getJobWithId(Integer.valueOf(webSocketCommunicationEvent.getHashMap().get("jobId"))));
processUsersInRoom(
(List<HashMap<String, Object>>) webSocketClient
.getJobWithId(
Integer.valueOf(webSocketCommunicationEvent.getHashMap().get("jobId"))));
}
break;
case "signalingMessage":
processMessage((NCSignalingMessage) webSocketClient.getJobWithId(Integer.valueOf(webSocketCommunicationEvent.getHashMap().get("jobId"))));
processMessage((NCSignalingMessage) webSocketClient.getJobWithId(
Integer.valueOf(webSocketCommunicationEvent.getHashMap().get("jobId"))));
break;
case "peerReadyForRequestingOffer":
webSocketClient.requestOfferForSessionIdWithType(webSocketCommunicationEvent.getHashMap().get("sessionId"), "video");
webSocketClient.requestOfferForSessionIdWithType(
webSocketCommunicationEvent.getHashMap().get("sessionId"), "video");
break;
}
}
@ -1437,6 +1439,18 @@ public class CallController extends BaseController {
}
}
private void receivedSignalingMessages(@Nullable List<Signaling> signalingList) {
if (signalingList != null) {
for (Signaling signaling : signalingList) {
try {
receivedSignalingMessage(signaling);
} catch (IOException e) {
Log.e(TAG, "Failed to process received signaling message", e);
}
}
}
}
private void receivedSignalingMessage(Signaling signaling) throws IOException {
String messageType = signaling.getType();
@ -2000,7 +2014,7 @@ public class CallController extends BaseController {
String stringToSend = stringBuilder.toString();
strings.add(stringToSend);
int apiVersion = ApiUtils.getSignalingApiVersion(conversationUser, new int[] {2, 1});
int apiVersion = ApiUtils.getSignalingApiVersion(conversationUser, new int[] {ApiUtils.APIv3, 2, 1});
ncApi.sendSignalingMessages(credentials, ApiUtils.getUrlForSignaling(apiVersion, baseUrl, roomToken),
strings.toString())
@ -2008,31 +2022,23 @@ public class CallController extends BaseController {
.subscribeOn(Schedulers.io())
.subscribe(new Observer<SignalingOverall>() {
@Override
public void onSubscribe(Disposable d) {
public void onSubscribe(@io.reactivex.annotations.NonNull Disposable d) {
// unused atm
}
@Override
public void onNext(SignalingOverall signalingOverall) {
if (signalingOverall.getOcs().getSignalings() != null) {
for (int i = 0; i < signalingOverall.getOcs().getSignalings().size(); i++) {
try {
receivedSignalingMessage(signalingOverall.getOcs().getSignalings().get(i));
} catch (IOException e) {
Log.e(TAG, "", e);
}
}
}
public void onNext(@io.reactivex.annotations.NonNull SignalingOverall signalingOverall) {
receivedSignalingMessages(signalingOverall.getOcs().getSignalings());
}
@Override
public void onError(Throwable e) {
public void onError(@io.reactivex.annotations.NonNull Throwable e) {
Log.e(TAG, "", e);
}
@Override
public void onComplete() {
// unused atm
}
});
} else {

View File

@ -385,8 +385,11 @@ public class CallNotificationController extends BaseController {
avatarImageView.setVisibility(View.VISIBLE);
ImageRequest imageRequest =
DisplayUtils.getImageRequestForUrl(ApiUtils.getUrlForAvatarWithName(userBeingCalled.getBaseUrl(),
currentConversation.getName(), R.dimen.avatar_size_very_big), null);
DisplayUtils.getImageRequestForUrl(
ApiUtils.getUrlForAvatarWithName(userBeingCalled.getBaseUrl(),
currentConversation.getName(),
R.dimen.avatar_size_very_big),
null);
ImagePipeline imagePipeline = Fresco.getImagePipeline();
DataSource<CloseableReference<CloseableImage>> dataSource = imagePipeline.fetchDecodedImage(imageRequest, null);
@ -399,11 +402,12 @@ public class CallNotificationController extends BaseController {
true);
if (getResources() != null) {
incomingTextRelativeLayout.setBackground(getResources().getDrawable(R.drawable
.incoming_gradient));
incomingTextRelativeLayout.setBackground(
getResources().getDrawable(R.drawable.incoming_gradient));
}
if (AvatarStatusCodeHolder.getInstance().getStatusCode() == 200 || AvatarStatusCodeHolder.getInstance().getStatusCode() == 0) {
if (AvatarStatusCodeHolder.getInstance().getStatusCode() == 200 ||
AvatarStatusCodeHolder.getInstance().getStatusCode() == 0) {
if (getActivity() != null) {
Bitmap backgroundBitmap = bitmap.copy(bitmap.getConfig(), true);
new BlurPostProcessor(5, getActivity()).process(backgroundBitmap);
@ -425,6 +429,7 @@ public class CallNotificationController extends BaseController {
@Override
protected void onFailureImpl(DataSource<CloseableReference<CloseableImage>> dataSource) {
// unused atm
}
}, UiThreadImmediateExecutorService.getInstance());
@ -467,10 +472,11 @@ public class CallNotificationController extends BaseController {
}
private void dispose() {
Disposable disposable;
for (int i = 0; i < disposablesList.size(); i++) {
if (!(disposable = disposablesList.get(i)).isDisposed()) {
disposable.dispose();
if (disposablesList != null) {
for (Disposable disposable : disposablesList) {
if (!disposable.isDisposed()) {
disposable.dispose();
}
}
}
}
@ -486,7 +492,8 @@ public class CallNotificationController extends BaseController {
"/raw/librem_by_feandesign_call");
} else {
try {
RingtoneSettings ringtoneSettings = LoganSquare.parse(callRingtonePreferenceString, RingtoneSettings.class);
RingtoneSettings ringtoneSettings = LoganSquare.parse(
callRingtonePreferenceString, RingtoneSettings.class);
ringtoneUri = ringtoneSettings.getRingtoneUri();
} catch (IOException e) {
Log.e(TAG, "Failed to parse ringtone settings");
@ -501,8 +508,11 @@ public class CallNotificationController extends BaseController {
mediaPlayer.setDataSource(getActivity(), ringtoneUri);
mediaPlayer.setLooping(true);
AudioAttributes audioAttributes = new AudioAttributes.Builder().setContentType(AudioAttributes
.CONTENT_TYPE_SONIFICATION).setUsage(AudioAttributes.USAGE_NOTIFICATION_RINGTONE).build();
AudioAttributes audioAttributes = new AudioAttributes
.Builder()
.setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
.setUsage(AudioAttributes.USAGE_NOTIFICATION_RINGTONE)
.build();
mediaPlayer.setAudioAttributes(audioAttributes);
mediaPlayer.setOnPreparedListener(mp -> mediaPlayer.start());

View File

@ -565,7 +565,7 @@ public class OperationsMenuController extends BaseController {
ApiUtils.getConversationApiVersion(currentUser, new int[] {ApiUtils.APIv4, 1});
ApiUtils.getCallApiVersion(currentUser, new int[] {ApiUtils.APIv4, 1});
ApiUtils.getChatApiVersion(currentUser, new int[] {1});
ApiUtils.getSignalingApiVersion(currentUser, new int[] {2, 1});
ApiUtils.getSignalingApiVersion(currentUser, new int[] {ApiUtils.APIv3, 2, 1});
}
private void inviteUsersToAConversation() {

View File

@ -90,7 +90,7 @@ public class SignalingSettingsWorker extends Worker {
userEntity = userEntityList.get(i);
UserEntity finalUserEntity = userEntity;
int apiVersion = ApiUtils.getSignalingApiVersion(finalUserEntity, new int[] {2, 1});
int apiVersion = ApiUtils.getSignalingApiVersion(finalUserEntity, new int[] {ApiUtils.APIv3, 2, 1});
ncApi.getSignalingSettings(ApiUtils.getCredentials(userEntity.getUsername(), userEntity.getToken()),
ApiUtils.getUrlForSignalingSettings(apiVersion, userEntity.getBaseUrl()))

View File

@ -27,6 +27,7 @@ import java.util.List;
@JsonObject
public class IceServer {
@Deprecated
@JsonField(name = "url")
String url;
@ -39,6 +40,7 @@ public class IceServer {
@JsonField(name = "credential")
String credential;
@Deprecated
public String getUrl() {
return this.url;
}

View File

@ -146,12 +146,19 @@ public class ApiUtils {
public static int getSignalingApiVersion(UserEntity capabilities, int[] versions) throws NoSupportedApiException {
for (int version : versions) {
if (version == 2 && capabilities.hasSpreedFeatureCapability("sip-support")) {
if (capabilities.hasSpreedFeatureCapability("signaling-v" + version)) {
return version;
}
if (version == 1) {
// Has no capability, we just assume it is always there for now.
if (version == 2 &&
capabilities.hasSpreedFeatureCapability("sip-support") &&
!capabilities.hasSpreedFeatureCapability("signaling-v3")) {
return version;
}
if (version == 1 &&
!capabilities.hasSpreedFeatureCapability("signaling-v3")) {
// Has no capability, we just assume it is always there when there is no v3 or later
return version;
}
}

View File

@ -101,7 +101,7 @@ public class WebSocketConnectionHelper {
}
HelloOverallWebSocketMessage getAssembledHelloModel(UserEntity userEntity, String ticket) {
int apiVersion = ApiUtils.getSignalingApiVersion(userEntity, new int[] {2, 1});
int apiVersion = ApiUtils.getSignalingApiVersion(userEntity, new int[] {ApiUtils.APIv3, 2, 1});
HelloOverallWebSocketMessage helloOverallWebSocketMessage = new HelloOverallWebSocketMessage();
helloOverallWebSocketMessage.setType("hello");

View File

@ -1 +1 @@
465
458