diff --git a/navigation/navigation-common/src/androidTest/java/androidx/navigation/NavDeepLinkTest.kt b/navigation/navigation-common/src/androidTest/java/androidx/navigation/NavDeepLinkTest.kt index 5aac8d1bfe4d7..088c60e000a38 100644 --- a/navigation/navigation-common/src/androidTest/java/androidx/navigation/NavDeepLinkTest.kt +++ b/navigation/navigation-common/src/androidTest/java/androidx/navigation/NavDeepLinkTest.kt @@ -1049,4 +1049,66 @@ class NavDeepLinkTest { .that(matchArgs?.getInt("id")) .isEqualTo(id) } + + @Test + fun deepLinkCaseInsensitiveDomainWithPath() { + val deepLinkArgument = "$DEEP_LINK_EXACT_HTTPS/users/{id}/posts" + val deepLink = NavDeepLink(deepLinkArgument) + + val id = 2 + val matchArgs = deepLink.getMatchingArguments( + Uri.parse("${DEEP_LINK_EXACT_HTTPS.toUpperCase()}/users/$id/posts"), + mapOf("id" to intArgument()) + ) + assertWithMessage("Args should not be null") + .that(matchArgs) + .isNotNull() + assertWithMessage("Args should contain the id") + .that(matchArgs?.getInt("id")) + .isEqualTo(id) + } + + @Test + fun deepLinkCaseInsensitivePath() { + val deepLinkArgument = "$DEEP_LINK_EXACT_HTTPS/users/{id}/posts" + val deepLink = NavDeepLink(deepLinkArgument) + + val id = 2 + val matchArgs = deepLink.getMatchingArguments( + Uri.parse( + deepLinkArgument + .replace("{id}", id.toString()) + .replace("users", "Users") + ), + mapOf("id" to intArgument()) + ) + assertWithMessage("Args should not be null") + .that(matchArgs) + .isNotNull() + assertWithMessage("Args should contain the id") + .that(matchArgs?.getInt("id")) + .isEqualTo(id) + } + + @Test + fun deepLinkCaseSensitiveQueryParams() { + val deepLinkString = "$DEEP_LINK_EXACT_HTTP/?myParam={param}" + val deepLink = NavDeepLink(deepLinkString) + + val param = 2 + val deepLinkUpper = deepLinkString + .replace("myParam", "MYPARAM") + .replace("{param}", param.toString()) + val matchArgs = deepLink.getMatchingArguments( + Uri.parse(deepLinkUpper), + mapOf("param" to intArgument()) + ) + + assertWithMessage("Args should be not be null") + .that(matchArgs) + .isNotNull() + assertWithMessage("Args bundle should be empty") + .that(matchArgs?.isEmpty) + .isTrue() + } } diff --git a/navigation/navigation-common/src/main/java/androidx/navigation/NavDeepLink.kt b/navigation/navigation-common/src/main/java/androidx/navigation/NavDeepLink.kt index 302b2f7afff30..42d18c177ab30 100644 --- a/navigation/navigation-common/src/main/java/androidx/navigation/NavDeepLink.kt +++ b/navigation/navigation-common/src/main/java/androidx/navigation/NavDeepLink.kt @@ -422,7 +422,7 @@ public class NavDeepLink internal constructor( // specifically escape any .* instances to ensure // they are still treated as wildcards in our final regex val finalRegex = uriRegex.toString().replace(".*", "\\E.*\\Q") - pattern = Pattern.compile(finalRegex) + pattern = Pattern.compile(finalRegex, Pattern.CASE_INSENSITIVE) } if (mimeType != null) { val mimeTypePattern = Pattern.compile("^[\\s\\S]+/[\\s\\S]+$")