Move appPrompt and confineToRoom to the fragment part of the URL
This commit is contained in:
parent
aef707ab25
commit
13941a20dd
2 changed files with 71 additions and 11 deletions
|
|
@ -54,21 +54,50 @@ class CallIntentDataParser @Inject constructor() {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Ensure the uri has the following parameters and value:
|
* Ensure the uri has the following parameters and value in the fragment:
|
||||||
* - appPrompt=false
|
* - appPrompt=false
|
||||||
* - confineToRoom=true
|
* - confineToRoom=true
|
||||||
* to ensure that the rendering will bo correct on the embedded Webview.
|
* to ensure that the rendering will bo correct on the embedded Webview.
|
||||||
*/
|
*/
|
||||||
private fun Uri.withCustomParameters(): String {
|
private fun Uri.withCustomParameters(): String {
|
||||||
val builder = buildUpon()
|
val builder = buildUpon()
|
||||||
|
// Remove the existing query parameters
|
||||||
builder.clearQuery()
|
builder.clearQuery()
|
||||||
queryParameterNames.forEach {
|
queryParameterNames.forEach {
|
||||||
if (it == APP_PROMPT_PARAMETER || it == CONFINE_TO_ROOM_PARAMETER) return@forEach
|
if (it == APP_PROMPT_PARAMETER || it == CONFINE_TO_ROOM_PARAMETER) return@forEach
|
||||||
builder.appendQueryParameter(it, getQueryParameter(it))
|
builder.appendQueryParameter(it, getQueryParameter(it))
|
||||||
}
|
}
|
||||||
builder.appendQueryParameter(APP_PROMPT_PARAMETER, "false")
|
// Remove the existing fragment parameters, and build the new fragment
|
||||||
builder.appendQueryParameter(CONFINE_TO_ROOM_PARAMETER, "true")
|
val currentFragment = fragment ?: ""
|
||||||
return builder.build().toString()
|
// Reset the current fragment
|
||||||
|
builder.fragment("")
|
||||||
|
val queryFragmentPosition = currentFragment.lastIndexOf("?")
|
||||||
|
val newFragment = if (queryFragmentPosition == -1) {
|
||||||
|
// No existing query, build it.
|
||||||
|
"$currentFragment?$APP_PROMPT_PARAMETER=false&$CONFINE_TO_ROOM_PARAMETER=true"
|
||||||
|
} else {
|
||||||
|
buildString {
|
||||||
|
append(currentFragment.substring(0, queryFragmentPosition + 1))
|
||||||
|
val queryFragment = currentFragment.substring(queryFragmentPosition + 1)
|
||||||
|
// Replace the existing parameters
|
||||||
|
val newQueryFragment = queryFragment
|
||||||
|
.replace("$APP_PROMPT_PARAMETER=true", "$APP_PROMPT_PARAMETER=false")
|
||||||
|
.replace("$CONFINE_TO_ROOM_PARAMETER=false", "$CONFINE_TO_ROOM_PARAMETER=true")
|
||||||
|
append(newQueryFragment)
|
||||||
|
// Ensure the parameters are there
|
||||||
|
if (!newQueryFragment.contains("$APP_PROMPT_PARAMETER=false")) {
|
||||||
|
if (newQueryFragment.isNotEmpty()) {
|
||||||
|
append("&")
|
||||||
|
}
|
||||||
|
append("$APP_PROMPT_PARAMETER=false")
|
||||||
|
}
|
||||||
|
if (!newQueryFragment.contains("$CONFINE_TO_ROOM_PARAMETER=true")) {
|
||||||
|
append("&$CONFINE_TO_ROOM_PARAMETER=true")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// We do not want to encode the Fragment part, so append it manually
|
||||||
|
return builder.build().toString() + "#" + newFragment
|
||||||
}
|
}
|
||||||
|
|
||||||
private const val APP_PROMPT_PARAMETER = "appPrompt"
|
private const val APP_PROMPT_PARAMETER = "appPrompt"
|
||||||
|
|
|
||||||
|
|
@ -63,8 +63,8 @@ class CallIntentDataParserTests {
|
||||||
fun `Element Call urls will be returned as is`() {
|
fun `Element Call urls will be returned as is`() {
|
||||||
val httpsBaseUrl = "https://call.element.io"
|
val httpsBaseUrl = "https://call.element.io"
|
||||||
val httpsCallUrl = VALID_CALL_URL_WITH_PARAM
|
val httpsCallUrl = VALID_CALL_URL_WITH_PARAM
|
||||||
assertThat(callIntentDataParser.parse(httpsBaseUrl)).isEqualTo("$httpsBaseUrl?$EXTRA_PARAMS")
|
assertThat(callIntentDataParser.parse(httpsBaseUrl)).isEqualTo("$httpsBaseUrl#?$EXTRA_PARAMS")
|
||||||
assertThat(callIntentDataParser.parse(httpsCallUrl)).isEqualTo("$httpsCallUrl&$EXTRA_PARAMS")
|
assertThat(callIntentDataParser.parse(httpsCallUrl)).isEqualTo("$httpsCallUrl#?$EXTRA_PARAMS")
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
@ -92,7 +92,7 @@ class CallIntentDataParserTests {
|
||||||
val embeddedUrl = VALID_CALL_URL_WITH_PARAM
|
val embeddedUrl = VALID_CALL_URL_WITH_PARAM
|
||||||
val encodedUrl = URLEncoder.encode(embeddedUrl, "utf-8")
|
val encodedUrl = URLEncoder.encode(embeddedUrl, "utf-8")
|
||||||
val url = "element://call?url=$encodedUrl"
|
val url = "element://call?url=$encodedUrl"
|
||||||
assertThat(callIntentDataParser.parse(url)).isEqualTo("$VALID_CALL_URL_WITH_PARAM&$EXTRA_PARAMS")
|
assertThat(callIntentDataParser.parse(url)).isEqualTo("$VALID_CALL_URL_WITH_PARAM#?$EXTRA_PARAMS")
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
@ -108,7 +108,7 @@ class CallIntentDataParserTests {
|
||||||
val embeddedUrl = VALID_CALL_URL_WITH_PARAM
|
val embeddedUrl = VALID_CALL_URL_WITH_PARAM
|
||||||
val encodedUrl = URLEncoder.encode(embeddedUrl, "utf-8")
|
val encodedUrl = URLEncoder.encode(embeddedUrl, "utf-8")
|
||||||
val url = "io.element.call:/?url=$encodedUrl"
|
val url = "io.element.call:/?url=$encodedUrl"
|
||||||
assertThat(callIntentDataParser.parse(url)).isEqualTo("$VALID_CALL_URL_WITH_PARAM&$EXTRA_PARAMS")
|
assertThat(callIntentDataParser.parse(url)).isEqualTo("$VALID_CALL_URL_WITH_PARAM#?$EXTRA_PARAMS")
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
@ -160,7 +160,15 @@ class CallIntentDataParserTests {
|
||||||
val embeddedUrl = "${VALID_CALL_URL_WITH_PARAM}&appPrompt=true"
|
val embeddedUrl = "${VALID_CALL_URL_WITH_PARAM}&appPrompt=true"
|
||||||
val encodedUrl = URLEncoder.encode(embeddedUrl, "utf-8")
|
val encodedUrl = URLEncoder.encode(embeddedUrl, "utf-8")
|
||||||
val url = "io.element.call:/?url=$encodedUrl"
|
val url = "io.element.call:/?url=$encodedUrl"
|
||||||
assertThat(callIntentDataParser.parse(url)).isEqualTo("$VALID_CALL_URL_WITH_PARAM&$EXTRA_PARAMS")
|
assertThat(callIntentDataParser.parse(url)).isEqualTo("$VALID_CALL_URL_WITH_PARAM#?$EXTRA_PARAMS")
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `element scheme 2 with url extra param in fragment appPrompt gets url extracted`() {
|
||||||
|
val embeddedUrl = "${VALID_CALL_URL_WITH_PARAM}#?appPrompt=true"
|
||||||
|
val encodedUrl = URLEncoder.encode(embeddedUrl, "utf-8")
|
||||||
|
val url = "io.element.call:/?url=$encodedUrl"
|
||||||
|
assertThat(callIntentDataParser.parse(url)).isEqualTo("$VALID_CALL_URL_WITH_PARAM#?appPrompt=false&confineToRoom=true")
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
@ -168,7 +176,15 @@ class CallIntentDataParserTests {
|
||||||
val embeddedUrl = "${VALID_CALL_URL_WITH_PARAM}&confineToRoom=false"
|
val embeddedUrl = "${VALID_CALL_URL_WITH_PARAM}&confineToRoom=false"
|
||||||
val encodedUrl = URLEncoder.encode(embeddedUrl, "utf-8")
|
val encodedUrl = URLEncoder.encode(embeddedUrl, "utf-8")
|
||||||
val url = "io.element.call:/?url=$encodedUrl"
|
val url = "io.element.call:/?url=$encodedUrl"
|
||||||
assertThat(callIntentDataParser.parse(url)).isEqualTo("$VALID_CALL_URL_WITH_PARAM&$EXTRA_PARAMS")
|
assertThat(callIntentDataParser.parse(url)).isEqualTo("$VALID_CALL_URL_WITH_PARAM#?$EXTRA_PARAMS")
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `element scheme 2 with url extra param in fragment confineToRoom gets url extracted`() {
|
||||||
|
val embeddedUrl = "${VALID_CALL_URL_WITH_PARAM}#?confineToRoom=false"
|
||||||
|
val encodedUrl = URLEncoder.encode(embeddedUrl, "utf-8")
|
||||||
|
val url = "io.element.call:/?url=$encodedUrl"
|
||||||
|
assertThat(callIntentDataParser.parse(url)).isEqualTo("$VALID_CALL_URL_WITH_PARAM#?confineToRoom=true&appPrompt=false")
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
@ -176,9 +192,24 @@ class CallIntentDataParserTests {
|
||||||
val embeddedUrl = "${VALID_CALL_URL_WITH_PARAM}#fragment"
|
val embeddedUrl = "${VALID_CALL_URL_WITH_PARAM}#fragment"
|
||||||
val encodedUrl = URLEncoder.encode(embeddedUrl, "utf-8")
|
val encodedUrl = URLEncoder.encode(embeddedUrl, "utf-8")
|
||||||
val url = "io.element.call:/?url=$encodedUrl"
|
val url = "io.element.call:/?url=$encodedUrl"
|
||||||
assertThat(callIntentDataParser.parse(url)).isEqualTo("$VALID_CALL_URL_WITH_PARAM&$EXTRA_PARAMS#fragment")
|
assertThat(callIntentDataParser.parse(url)).isEqualTo("$VALID_CALL_URL_WITH_PARAM#fragment?$EXTRA_PARAMS")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `element scheme 2 with empty fragment`() {
|
||||||
|
val embeddedUrl = "${VALID_CALL_URL_WITH_PARAM}#"
|
||||||
|
val encodedUrl = URLEncoder.encode(embeddedUrl, "utf-8")
|
||||||
|
val url = "io.element.call:/?url=$encodedUrl"
|
||||||
|
assertThat(callIntentDataParser.parse(url)).isEqualTo("$VALID_CALL_URL_WITH_PARAM#?$EXTRA_PARAMS")
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `element scheme 2 with empty fragment and fragment query`() {
|
||||||
|
val embeddedUrl = "${VALID_CALL_URL_WITH_PARAM}#?"
|
||||||
|
val encodedUrl = URLEncoder.encode(embeddedUrl, "utf-8")
|
||||||
|
val url = "io.element.call:/?url=$encodedUrl"
|
||||||
|
assertThat(callIntentDataParser.parse(url)).isEqualTo("$VALID_CALL_URL_WITH_PARAM#?$EXTRA_PARAMS")
|
||||||
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
const val VALID_CALL_URL_WITH_PARAM = "https://call.element.io/some-actual-call?with=parameters"
|
const val VALID_CALL_URL_WITH_PARAM = "https://call.element.io/some-actual-call?with=parameters"
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue