Browse Source

Inject API version into signaling API calls

Signed-off-by: Joas Schilling <coding@schilljs.com>
Joas Schilling 4 years ago
parent
commit
cf23a3d87d

+ 25 - 3
app/src/main/java/com/nextcloud/talk/controllers/CallController.java

@@ -1104,7 +1104,14 @@ public class CallController extends BaseController {
     }
     }
 
 
     private void fetchSignalingSettings() {
     private void fetchSignalingSettings() {
-        ncApi.getSignalingSettings(credentials, ApiUtils.getUrlForSignalingSettings(baseUrl))
+        Integer apiVersion = ApiUtils.getSignalingApiVersion(conversationUser, new int[] {2, 1});
+
+        if (apiVersion == null) {
+            Log.e(TAG, "No supported API version found", new Exception("No supported API version found"));
+            return;
+        }
+
+        ncApi.getSignalingSettings(credentials, ApiUtils.getUrlForSignalingSettings(apiVersion, baseUrl))
                 .subscribeOn(Schedulers.io())
                 .subscribeOn(Schedulers.io())
                 .retry(3)
                 .retry(3)
                 .observeOn(AndroidSchedulers.mainThread())
                 .observeOn(AndroidSchedulers.mainThread())
@@ -1369,7 +1376,15 @@ public class CallController extends BaseController {
                             }
                             }
 
 
                             if (!hasExternalSignalingServer) {
                             if (!hasExternalSignalingServer) {
-                                ncApi.pullSignalingMessages(credentials, ApiUtils.getUrlForSignaling(baseUrl, urlToken))
+                                Integer apiVersion = ApiUtils.getSignalingApiVersion(conversationUser, new int[] {2, 1});
+
+                                if (apiVersion == null) {
+                                    Log.e(TAG, "No supported API version found", new Exception("No supported API version found"));
+                                    return;
+                                }
+
+                                ncApi.pullSignalingMessages(credentials, ApiUtils.getUrlForSignaling(apiVersion,
+                                                                                                     baseUrl, urlToken))
                                         .subscribeOn(Schedulers.io())
                                         .subscribeOn(Schedulers.io())
                                         .observeOn(AndroidSchedulers.mainThread())
                                         .observeOn(AndroidSchedulers.mainThread())
                                         .repeatWhen(observable -> observable)
                                         .repeatWhen(observable -> observable)
@@ -2086,7 +2101,14 @@ public class CallController extends BaseController {
                 urlToken = roomToken;
                 urlToken = roomToken;
             }
             }
 
 
-            ncApi.sendSignalingMessages(credentials, ApiUtils.getUrlForSignaling(baseUrl, urlToken),
+            Integer apiVersion = ApiUtils.getSignalingApiVersion(conversationUser, new int[] {2, 1});
+
+            if (apiVersion == null) {
+                Log.e(TAG, "No supported API version found", new Exception("No supported API version found"));
+                return;
+            }
+
+            ncApi.sendSignalingMessages(credentials, ApiUtils.getUrlForSignaling(apiVersion, baseUrl, urlToken),
                                         strings.toString())
                                         strings.toString())
                     .retry(3)
                     .retry(3)
                     .subscribeOn(Schedulers.io())
                     .subscribeOn(Schedulers.io())

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

@@ -81,8 +81,16 @@ public class SignalingSettingsWorker extends Worker {
         for (int i = 0; i < userEntityList.size(); i++) {
         for (int i = 0; i < userEntityList.size(); i++) {
             userEntity = userEntityList.get(i);
             userEntity = userEntityList.get(i);
             UserEntity finalUserEntity = userEntity;
             UserEntity finalUserEntity = userEntity;
+
+            Integer apiVersion = ApiUtils.getSignalingApiVersion(finalUserEntity, new int[] {2, 1});
+
+            if (apiVersion == null) {
+                Log.e(TAG, "No supported API version found", new Exception("No supported API version found"));
+                continue;
+            }
+
             ncApi.getSignalingSettings(ApiUtils.getCredentials(userEntity.getUsername(), userEntity.getToken()),
             ncApi.getSignalingSettings(ApiUtils.getCredentials(userEntity.getUsername(), userEntity.getToken()),
-                    ApiUtils.getUrlForSignalingSettings(userEntity.getBaseUrl()))
+                    ApiUtils.getUrlForSignalingSettings(apiVersion, userEntity.getBaseUrl()))
                     .blockingSubscribe(new Observer<SignalingSettingsOverall>() {
                     .blockingSubscribe(new Observer<SignalingSettingsOverall>() {
                         @Override
                         @Override
                         public void onSubscribe(Disposable d) {
                         public void onSubscribe(Disposable d) {

+ 30 - 21
app/src/main/java/com/nextcloud/talk/utils/ApiUtils.java

@@ -140,6 +140,20 @@ public class ApiUtils {
         return null;
         return null;
     }
     }
 
 
+    public static Integer getSignalingApiVersion(UserEntity capabilities, int[] versions) {
+        for (int version : versions) {
+            if (version == 2 && capabilities.hasSpreedFeatureCapability("sip-support")) {
+                return version;
+            }
+
+            if (version == 1) {
+                // Has no capability, we just assume it is always there for now.
+                return version;
+            }
+        }
+        return null;
+    }
+
     protected static String getUrlForApi(int version, String baseUrl) {
     protected static String getUrlForApi(int version, String baseUrl) {
         return baseUrl + spreedApiBase + version;
         return baseUrl + spreedApiBase + version;
     }
     }
@@ -200,6 +214,22 @@ public class ApiUtils {
         return getUrlForApi(version, baseUrl) + "/call/" + token;
         return getUrlForApi(version, baseUrl) + "/call/" + token;
     }
     }
 
 
+    public static String getUrlForSignaling(int version, String baseUrl) {
+        return getUrlForApi(version, baseUrl) + "/signaling";
+    }
+
+    public static String getUrlForSignalingBackend(int version, String baseUrl) {
+        return getUrlForSignaling(version, baseUrl) + "/backend";
+    }
+
+    public static String getUrlForSignalingSettings(int version, String baseUrl) {
+        return getUrlForSignaling(version, baseUrl) + "/settings";
+    }
+
+    public static String getUrlForSignaling(int version, String baseUrl, String token) {
+        return getUrlForSignaling(version, baseUrl) + "/" + token;
+    }
+
     public static RetrofitBucket getRetrofitBucketForCreateRoom(int version, String baseUrl, String roomType,
     public static RetrofitBucket getRetrofitBucketForCreateRoom(int version, String baseUrl, String roomType,
                                                                 @Nullable String invite,
                                                                 @Nullable String invite,
                                                                 @Nullable String conversationName) {
                                                                 @Nullable String conversationName) {
@@ -260,32 +290,11 @@ public class ApiUtils {
         return baseUrl + ocsApiVersion + spreedApiVersion + "/chat/" + token;
         return baseUrl + ocsApiVersion + spreedApiVersion + "/chat/" + token;
     }
     }
 
 
-    public static String getUrlForExternalServerAuthBackend(String baseUrl) {
-        // FIXME Introduce API version
-        return getUrlForSignaling(baseUrl, null) + "/backend";
-    }
-
     public static String getUrlForMentionSuggestions(String baseUrl, String token) {
     public static String getUrlForMentionSuggestions(String baseUrl, String token) {
         // FIXME Introduce API version
         // FIXME Introduce API version
         return getUrlForChat(baseUrl, token) + "/mentions";
         return getUrlForChat(baseUrl, token) + "/mentions";
     }
     }
 
 
-    public static String getUrlForSignaling(String baseUrl, @Nullable String token) {
-        // FIXME Introduce API version
-        String signalingUrl = baseUrl + ocsApiVersion + spreedApiVersion + "/signaling";
-        if (token == null) {
-            return signalingUrl;
-        } else {
-            return signalingUrl + "/" + token;
-        }
-    }
-
-    public static String getUrlForSignalingSettings(String baseUrl) {
-        // FIXME Introduce API version
-        return getUrlForSignaling(baseUrl, null) + "/settings";
-    }
-
-
     public static String getUrlForUserProfile(String baseUrl) {
     public static String getUrlForUserProfile(String baseUrl) {
         return baseUrl + ocsApiVersion + "/cloud/user";
         return baseUrl + ocsApiVersion + "/cloud/user";
     }
     }

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

@@ -20,6 +20,9 @@
 
 
 package com.nextcloud.talk.webrtc;
 package com.nextcloud.talk.webrtc;
 
 
+import android.annotation.SuppressLint;
+import android.util.Log;
+
 import autodagger.AutoInjector;
 import autodagger.AutoInjector;
 import com.nextcloud.talk.application.NextcloudTalkApplication;
 import com.nextcloud.talk.application.NextcloudTalkApplication;
 import com.nextcloud.talk.models.database.UserEntity;
 import com.nextcloud.talk.models.database.UserEntity;
@@ -34,6 +37,8 @@ import java.util.Map;
 
 
 @AutoInjector(NextcloudTalkApplication.class)
 @AutoInjector(NextcloudTalkApplication.class)
 public class WebSocketConnectionHelper {
 public class WebSocketConnectionHelper {
+    private static final String TAG = "WebSocketConnectionHelper";
+
     private static Map<Long, MagicWebSocketInstance> magicWebSocketInstanceMap = new HashMap<>();
     private static Map<Long, MagicWebSocketInstance> magicWebSocketInstanceMap = new HashMap<>();
 
 
     @Inject
     @Inject
@@ -87,13 +92,21 @@ public class WebSocketConnectionHelper {
         }
         }
     }
     }
 
 
+    @SuppressLint("LongLogTag")
     HelloOverallWebSocketMessage getAssembledHelloModel(UserEntity userEntity, String ticket) {
     HelloOverallWebSocketMessage getAssembledHelloModel(UserEntity userEntity, String ticket) {
+        Integer apiVersion = ApiUtils.getSignalingApiVersion(userEntity, new int[] {2, 1});
+
+        if (apiVersion == null) {
+            Log.e(TAG, "No supported API version found", new Exception("No supported API version found"));
+            return null;
+        }
+
         HelloOverallWebSocketMessage helloOverallWebSocketMessage = new HelloOverallWebSocketMessage();
         HelloOverallWebSocketMessage helloOverallWebSocketMessage = new HelloOverallWebSocketMessage();
         helloOverallWebSocketMessage.setType("hello");
         helloOverallWebSocketMessage.setType("hello");
         HelloWebSocketMessage helloWebSocketMessage = new HelloWebSocketMessage();
         HelloWebSocketMessage helloWebSocketMessage = new HelloWebSocketMessage();
         helloWebSocketMessage.setVersion("1.0");
         helloWebSocketMessage.setVersion("1.0");
         AuthWebSocketMessage authWebSocketMessage = new AuthWebSocketMessage();
         AuthWebSocketMessage authWebSocketMessage = new AuthWebSocketMessage();
-        authWebSocketMessage.setUrl(ApiUtils.getUrlForExternalServerAuthBackend(userEntity.getBaseUrl()));
+        authWebSocketMessage.setUrl(ApiUtils.getUrlForSignalingBackend(apiVersion, userEntity.getBaseUrl()));
         AuthParametersWebSocketMessage authParametersWebSocketMessage = new AuthParametersWebSocketMessage();
         AuthParametersWebSocketMessage authParametersWebSocketMessage = new AuthParametersWebSocketMessage();
         authParametersWebSocketMessage.setTicket(ticket);
         authParametersWebSocketMessage.setTicket(ticket);
         authParametersWebSocketMessage.setUserid(userEntity.getUserId());
         authParametersWebSocketMessage.setUserid(userEntity.getUserId());