Skip to content
Snippets Groups Projects
Commit 5d45657c authored by Android Build Role Account android-build-prod's avatar Android Build Role Account android-build-prod
Browse files

Snap for 5370280 from a42e6b0d to q-keystone-qcom-release

Change-Id: Ib43a04d0453067988145ca31a4b84030eadf8b93
parents 24b1d9d2 a42e6b0d
No related branches found
No related tags found
No related merge requests found
......@@ -301,7 +301,12 @@ class ApiAnalyzer(
}
fun generateInheritedStubs(filterEmit: Predicate<Item>, filterReference: Predicate<Item>) {
packages.allClasses().forEach {
// When analyzing libraries we may discover some new classes during traversal; these aren't
// part of the API but may be super classes or interfaces; these will then be added into the
// package class lists, which could trigger a concurrent modification, so create a snapshot
// of the class list and iterate over it:
val allClasses = packages.allClasses().toList()
allClasses.forEach {
if (filterEmit.test(it)) {
generateInheritedStubs(it, filterEmit, filterReference)
}
......
......@@ -37,6 +37,7 @@ const val ANDROID_NONNULL = "android.annotation.NonNull"
const val ANDROIDX_VISIBLE_FOR_TESTING = "androidx.annotation.VisibleForTesting"
const val ANDROID_SUPPORT_VISIBLE_FOR_TESTING = "android.support.annotation.VisibleForTesting"
const val ATTR_OTHERWISE = "otherwise"
const val CARRIER_PRIVILEGES_MARKER = "carrier privileges"
const val ENV_VAR_METALAVA_TESTS_RUNNING = "METALAVA_TESTS_RUNNING"
const val ENV_VAR_METALAVA_DUMP_ARGV = "METALAVA_DUMP_ARGV"
......
......@@ -5,6 +5,7 @@ import com.android.sdklib.SdkVersionInfo
import com.android.sdklib.repository.AndroidSdkHandler
import com.android.tools.lint.LintCliClient
import com.android.tools.lint.checks.ApiLookup
import com.android.tools.lint.detector.api.editDistance
import com.android.tools.lint.helpers.DefaultJavaEvaluator
import com.android.tools.metalava.doclava1.Errors
import com.android.tools.metalava.model.AnnotationAttributeValue
......@@ -311,13 +312,26 @@ class DocAnalyzer(
resolved
else {
val v: Any = value.value() ?: value.toSource()
if (v == CARRIER_PRIVILEGES_MARKER) {
// TODO: Warn if using allOf with carrier
sb.append("{@link android.telephony.TelephonyManager#hasCarrierPrivileges carrier privileges}")
continue
}
findPermissionField(codebase, v)
}
if (field == null) {
reporter.report(
Errors.MISSING_PERMISSION, item,
"Cannot find permission field for $value required by $item (may be hidden or removed)"
)
val v = value.value()?.toString() ?: value.toSource()
if (editDistance(CARRIER_PRIVILEGES_MARKER, v, 3) < 3) {
reporter.report(
Errors.MISSING_PERMISSION, item,
"Unrecognized permission `$v`; did you mean `$CARRIER_PRIVILEGES_MARKER`?"
)
} else {
reporter.report(
Errors.MISSING_PERMISSION, item,
"Cannot find permission field for $value required by $item (may be hidden or removed)"
)
}
sb.append(value.toSource())
} else {
if (filterReference.test(field)) {
......
......@@ -2,4 +2,4 @@
# Version definition
# This file is read by gradle build scripts, but also packaged with metalava
# as a resource for the Version classes to read.
metalavaVersion=1.2.8
metalavaVersion=1.2.9
......@@ -152,6 +152,7 @@ class DocAnalyzerTest : DriverTest() {
@Test
fun `Document Permissions`() {
check(
docStubs = true,
sourceFiles = *arrayOf(
java(
"""
......@@ -180,6 +181,15 @@ class DocAnalyzerTest : DriverTest() {
@RequiresPermission(value=Manifest.permission.WATCH_APPOPS, conditional=true) // b/73559440
public void test5() {
}
@RequiresPermission(anyOf = {Manifest.permission.ACCESS_COARSE_LOCATION, "carrier privileges"})
public void test6() {
}
// Typo in marker
@RequiresPermission(anyOf = {Manifest.permission.ACCESS_COARSE_LOCATION, "carier priviliges"})
public void test6() {
}
}
"""
),
......@@ -201,6 +211,7 @@ class DocAnalyzerTest : DriverTest() {
),
checkCompilation = false, // needs androidx.annotations in classpath
checkDoclava1 = false,
warnings = "src/test/pkg/PermissionTest.java:31: lint: Unrecognized permission `carier priviliges`; did you mean `carrier privileges`? [MissingPermission]",
stubs = arrayOf(
"""
package test.pkg;
......@@ -230,6 +241,16 @@ class DocAnalyzerTest : DriverTest() {
public void test4() { throw new RuntimeException("Stub!"); }
@androidx.annotation.RequiresPermission(value=android.Manifest.permission.WATCH_APPOPS, conditional=true)
public void test5() { throw new RuntimeException("Stub!"); }
/**
* Requires {@link android.Manifest.permission#ACCESS_COARSE_LOCATION} or {@link android.telephony.TelephonyManager#hasCarrierPrivileges carrier privileges}
*/
@androidx.annotation.RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, "carrier privileges"})
public void test6() { throw new RuntimeException("Stub!"); }
/**
* Requires {@link android.Manifest.permission#ACCESS_COARSE_LOCATION} or "carier priviliges"
*/
@androidx.annotation.RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, "carier priviliges"})
public void test6() { throw new RuntimeException("Stub!"); }
}
"""
)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment