Don't reference non-public fields in annotations

Metalava would previously only consider whether a field was explicitly
hidden, and not whether it would have been visible if it wasn't hidden.

Note that this check is still incomplete. The full logic for whether a
symbol is visible or not is in ApiPredicate.test(), but that method
is not usable in this context as it results in an infinite loop. This
change however does fix an immediate problem of a hidden API being
included in the api txt.

Bug: 188527836
Test: m checkapi
Change-Id: I426f0b04e576e7411544d448937afaaf13f8a11a
diff --git a/src/main/java/com/android/tools/metalava/model/psi/PsiAnnotationItem.kt b/src/main/java/com/android/tools/metalava/model/psi/PsiAnnotationItem.kt
index 533d32f..c9665b2 100644
--- a/src/main/java/com/android/tools/metalava/model/psi/PsiAnnotationItem.kt
+++ b/src/main/java/com/android/tools/metalava/model/psi/PsiAnnotationItem.kt
@@ -217,7 +217,8 @@
                                 val initializer = resolved.initializer
                                 if (initializer != null) {
                                     val fieldItem = cls.findField(resolved.name)
-                                    if (fieldItem == null || fieldItem.isHiddenOrRemoved()) {
+                                    if (fieldItem == null || fieldItem.isHiddenOrRemoved() ||
+                                            !fieldItem.isPublic) {
                                         // Use the literal value instead
                                         val source = getConstantSource(initializer)
                                         if (source != null) {
diff --git a/src/test/java/com/android/tools/metalava/ApiFileTest.kt b/src/test/java/com/android/tools/metalava/ApiFileTest.kt
index 20d16c6..05d72ae 100644
--- a/src/test/java/com/android/tools/metalava/ApiFileTest.kt
+++ b/src/test/java/com/android/tools/metalava/ApiFileTest.kt
@@ -4299,6 +4299,38 @@
     }
 
     @Test
+    fun `Annotation value visibility`() {
+        check(
+            format = FileFormat.V2,
+            sourceFiles = arrayOf(
+                java("""
+                    package test.pkg
+
+                    import androidx.annotation.IntRange
+
+                    public final class ApiClass {
+                        private int hiddenConstant = 1;
+                        public ApiClass(@IntRange(from=1) int x) {}
+                        public void method(@IntRange(from = hiddenConstant) int x) {}
+                    }
+                """
+                ),
+                androidxIntRangeSource
+            ),
+            extraArguments = arrayOf(ARG_HIDE_PACKAGE, "androidx.annotation"),
+            api = """
+                // Signature format: 2.0
+                package test.pkg {
+                  public final class ApiClass {
+                    ctor public ApiClass(@IntRange(from=1) int);
+                    method public void method(@IntRange(from=0x1) int);
+                  }
+                }
+            """
+        )
+    }
+
+    @Test
     fun `Kotlin properties with overriding get`() {
         check(
             format = FileFormat.V3,