diff --git a/features/call/src/main/AndroidManifest.xml b/features/call/src/main/AndroidManifest.xml
index 1aed77cd95..d106d4e7b8 100644
--- a/features/call/src/main/AndroidManifest.xml
+++ b/features/call/src/main/AndroidManifest.xml
@@ -53,6 +53,14 @@
+
+
+
+
+
+
+
+
diff --git a/features/call/src/main/kotlin/io/element/android/features/call/CallIntentDataParser.kt b/features/call/src/main/kotlin/io/element/android/features/call/CallIntentDataParser.kt
index a664e562f3..cac211cdc1 100644
--- a/features/call/src/main/kotlin/io/element/android/features/call/CallIntentDataParser.kt
+++ b/features/call/src/main/kotlin/io/element/android/features/call/CallIntentDataParser.kt
@@ -38,6 +38,16 @@ object CallIntentDataParser {
internalUri.scheme in validHttpSchemes && !internalUri.host.isNullOrBlank()
}
}
+ scheme == "io.element.call" && parsedUrl.host == null -> {
+ // We use this custom scheme to load arbitrary URLs for other instances of Element Call,
+ // so we can only verify it's an HTTP/HTTPs URL with a non-empty host
+ parsedUrl.getQueryParameter("url")
+ ?.let { URLDecoder.decode(it, "utf-8") }
+ ?.takeIf {
+ val internalUri = Uri.parse(it)
+ internalUri.scheme in validHttpSchemes && !internalUri.host.isNullOrBlank()
+ }
+ }
// This should never be possible, but we still need to take into account the possibility
else -> null
}
diff --git a/tools/adb/callLinkCustomScheme2.sh b/tools/adb/callLinkCustomScheme2.sh
new file mode 100755
index 0000000000..d6dabd595c
--- /dev/null
+++ b/tools/adb/callLinkCustomScheme2.sh
@@ -0,0 +1,23 @@
+#! /bin/bash
+#
+# Copyright (c) 2023 New Vector Ltd
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+# Format is:
+# io.element.call:/?url=some-encoded-url
+# For instance
+# io.element.call:/?url=https%3A%2F%2Fcall.element.io%2FTestElementCall
+
+adb shell am start -a android.intent.action.VIEW -d io.element.call:/?url=https%3A%2F%2Fcall.element.io%2FTestElementCall