Merge remote-tracking branch 'aosp/metalava-main' into 'aosp/main' am: 7235bb6d2a

Original change: https://android-review.googlesource.com/c/platform/tools/metalava/+/3272611

Change-Id: I77495e97c5d1b361730fa29c5e504d3eaba6416a
Signed-off-by: Automerger Merge Worker <[email protected]>
diff --git a/metalava/src/main/java/com/android/tools/metalava/AndroidApiChecks.kt b/metalava/src/main/java/com/android/tools/metalava/AndroidApiChecks.kt
index 552fc8e..70925b4 100644
--- a/metalava/src/main/java/com/android/tools/metalava/AndroidApiChecks.kt
+++ b/metalava/src/main/java/com/android/tools/metalava/AndroidApiChecks.kt
@@ -212,9 +212,10 @@
                 }
             }
             for (item in permissions) {
-                var perm = item
-                if (perm.indexOf('.') >= 0) perm = perm.substring(perm.lastIndexOf('.') + 1)
-                val mentioned = text.contains(perm)
+                val perm = item.substringAfterLast('.')
+                // Search for the permission name as a whole word.
+                val regex = Regex("""\b\Q$perm\E\b""")
+                val mentioned = text.contains(regex)
                 if (mentioned && !conditional) {
                     reporter.report(
                         Issues.REQUIRES_PERMISSION,
diff --git a/metalava/src/test/java/com/android/tools/metalava/AndroidApiChecksTest.kt b/metalava/src/test/java/com/android/tools/metalava/AndroidApiChecksTest.kt
index 3fab285..ff1d791 100644
--- a/metalava/src/test/java/com/android/tools/metalava/AndroidApiChecksTest.kt
+++ b/metalava/src/test/java/com/android/tools/metalava/AndroidApiChecksTest.kt
@@ -149,6 +149,55 @@
     }
 
     @Test
+    fun `Document Permissions ignore when permission is subset of a word`() {
+        check(
+            sourceFiles =
+                arrayOf(
+                    java(
+                        """
+                            package android;
+
+                            public abstract class Manifest {
+                                public static final class permission {
+                                    public static final String PERMISSION = "android.permission.PERMISSION";
+                                }
+                            }
+                        """
+                    ),
+                    requiresPermissionSource,
+                    java(
+                        """
+                            package android.pkg;
+
+                            import android.Manifest;
+                            import android.annotation.RequiresPermission;
+
+                            public class PermissionTest {
+                                /**
+                                 * While this contains the name of the permission it is not actually
+                                 * referring to the permission ARG_PERMISSION.
+                                 */
+                                @RequiresPermission(Manifest.permission.PERMISSION)
+                                public void test0() {
+                                }
+
+                                /**
+                                 * While this contains the name of the permission it is not actually
+                                 * referring to the permission PERMISSION_ARG.
+                                 */
+                                @RequiresPermission(Manifest.permission.PERMISSION)
+                                public void test0() {
+                                }
+                            }
+                        """
+                    ),
+                ),
+            extraArguments =
+                arrayOf(ARG_WARNING, Issues.CONDITIONAL_REQUIRES_PERMISSION_NOT_EXPLAINED.name),
+        )
+    }
+
+    @Test
     fun `Document Intent Actions`() {
         check(
             expectedFail = DefaultLintErrorMessage,