Эх сурвалжийг харах

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

Use the stun urls array
Andy Scherzinger 4 жил өмнө
parent
commit
b2c53d5385

+ 101 - 95
app/src/main/java/com/nextcloud/talk/controllers/CallController.java

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

+ 22 - 12
app/src/main/java/com/nextcloud/talk/controllers/CallNotificationController.java

@@ -385,8 +385,11 @@ public class CallNotificationController extends BaseController {
                 avatarImageView.setVisibility(View.VISIBLE);
                 avatarImageView.setVisibility(View.VISIBLE);
 
 
                 ImageRequest imageRequest =
                 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();
                 ImagePipeline imagePipeline = Fresco.getImagePipeline();
                 DataSource<CloseableReference<CloseableImage>> dataSource = imagePipeline.fetchDecodedImage(imageRequest, null);
                 DataSource<CloseableReference<CloseableImage>> dataSource = imagePipeline.fetchDecodedImage(imageRequest, null);
@@ -399,11 +402,12 @@ public class CallNotificationController extends BaseController {
                                                                     true);
                                                                     true);
 
 
                             if (getResources() != null) {
                             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) {
                                 if (getActivity() != null) {
                                     Bitmap backgroundBitmap = bitmap.copy(bitmap.getConfig(), true);
                                     Bitmap backgroundBitmap = bitmap.copy(bitmap.getConfig(), true);
                                     new BlurPostProcessor(5, getActivity()).process(backgroundBitmap);
                                     new BlurPostProcessor(5, getActivity()).process(backgroundBitmap);
@@ -425,6 +429,7 @@ public class CallNotificationController extends BaseController {
 
 
                     @Override
                     @Override
                     protected void onFailureImpl(DataSource<CloseableReference<CloseableImage>> dataSource) {
                     protected void onFailureImpl(DataSource<CloseableReference<CloseableImage>> dataSource) {
+                        // unused atm
                     }
                     }
                 }, UiThreadImmediateExecutorService.getInstance());
                 }, UiThreadImmediateExecutorService.getInstance());
 
 
@@ -467,10 +472,11 @@ public class CallNotificationController extends BaseController {
     }
     }
 
 
     private void dispose() {
     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");
                                             "/raw/librem_by_feandesign_call");
         } else {
         } else {
             try {
             try {
-                RingtoneSettings ringtoneSettings = LoganSquare.parse(callRingtonePreferenceString, RingtoneSettings.class);
+                RingtoneSettings ringtoneSettings = LoganSquare.parse(
+                        callRingtonePreferenceString, RingtoneSettings.class);
                 ringtoneUri = ringtoneSettings.getRingtoneUri();
                 ringtoneUri = ringtoneSettings.getRingtoneUri();
             } catch (IOException e) {
             } catch (IOException e) {
                 Log.e(TAG, "Failed to parse ringtone settings");
                 Log.e(TAG, "Failed to parse ringtone settings");
@@ -501,8 +508,11 @@ public class CallNotificationController extends BaseController {
                 mediaPlayer.setDataSource(getActivity(), ringtoneUri);
                 mediaPlayer.setDataSource(getActivity(), ringtoneUri);
 
 
                 mediaPlayer.setLooping(true);
                 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.setAudioAttributes(audioAttributes);
 
 
                 mediaPlayer.setOnPreparedListener(mp -> mediaPlayer.start());
                 mediaPlayer.setOnPreparedListener(mp -> mediaPlayer.start());

+ 1 - 1
app/src/main/java/com/nextcloud/talk/controllers/bottomsheet/OperationsMenuController.java

@@ -565,7 +565,7 @@ public class OperationsMenuController extends BaseController {
         ApiUtils.getConversationApiVersion(currentUser, new int[] {ApiUtils.APIv4, 1});
         ApiUtils.getConversationApiVersion(currentUser, new int[] {ApiUtils.APIv4, 1});
         ApiUtils.getCallApiVersion(currentUser, new int[] {ApiUtils.APIv4, 1});
         ApiUtils.getCallApiVersion(currentUser, new int[] {ApiUtils.APIv4, 1});
         ApiUtils.getChatApiVersion(currentUser, new int[] {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() {
     private void inviteUsersToAConversation() {

+ 1 - 1
app/src/main/java/com/nextcloud/talk/jobs/SignalingSettingsWorker.java

@@ -90,7 +90,7 @@ public class SignalingSettingsWorker extends Worker {
             userEntity = userEntityList.get(i);
             userEntity = userEntityList.get(i);
             UserEntity finalUserEntity = userEntity;
             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()),
             ncApi.getSignalingSettings(ApiUtils.getCredentials(userEntity.getUsername(), userEntity.getToken()),
                     ApiUtils.getUrlForSignalingSettings(apiVersion, userEntity.getBaseUrl()))
                     ApiUtils.getUrlForSignalingSettings(apiVersion, userEntity.getBaseUrl()))

+ 2 - 0
app/src/main/java/com/nextcloud/talk/models/json/signaling/settings/IceServer.java

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

+ 10 - 3
app/src/main/java/com/nextcloud/talk/utils/ApiUtils.java

@@ -146,12 +146,19 @@ public class ApiUtils {
 
 
     public static int getSignalingApiVersion(UserEntity capabilities, int[] versions) throws NoSupportedApiException {
     public static int getSignalingApiVersion(UserEntity capabilities, int[] versions) throws NoSupportedApiException {
         for (int version : versions) {
         for (int version : versions) {
-            if (version == 2 && capabilities.hasSpreedFeatureCapability("sip-support")) {
+            if (capabilities.hasSpreedFeatureCapability("signaling-v" + version)) {
                 return 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;
                 return version;
             }
             }
         }
         }

+ 1 - 1
app/src/main/java/com/nextcloud/talk/webrtc/WebSocketConnectionHelper.java

@@ -101,7 +101,7 @@ public class WebSocketConnectionHelper {
     }
     }
 
 
     HelloOverallWebSocketMessage getAssembledHelloModel(UserEntity userEntity, String ticket) {
     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 helloOverallWebSocketMessage = new HelloOverallWebSocketMessage();
         helloOverallWebSocketMessage.setType("hello");
         helloOverallWebSocketMessage.setType("hello");

+ 1 - 1
scripts/analysis/findbugs-results.txt

@@ -1 +1 @@
-465
+458