Fix the API level calculation for release builds am: fec148af88 am: 6dd12642d7 am: e438d5e923 am: 95d99b823c

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

Bug: 208738814
Test: manual, built api and docs and verified the new symbols
      have correct API level
Test: metalava unit tests
Ignore-AOSP-First: merge conflict resolution

Merged-In: I1afcbe58f4c5f0f440b931b8d6a5630bee74e428
Merged-In: I174fc126233e2229071102b5816b98cc5b1e8e26
Change-Id: I1afcbe58f4c5f0f440b931b8d6a5630bee74e428
(cherry picked from commit b4a298b6d8a7f1e2b21739d327e10de921aff75b)
diff --git a/src/main/java/com/android/tools/metalava/Driver.kt b/src/main/java/com/android/tools/metalava/Driver.kt
index 47dac44..dd861dd 100644
--- a/src/main/java/com/android/tools/metalava/Driver.kt
+++ b/src/main/java/com/android/tools/metalava/Driver.kt
@@ -883,7 +883,8 @@
     javaLanguageLevel: LanguageLevel = options.javaLanguageLevel,
     kotlinLanguageLevel: LanguageVersionSettings = options.kotlinLanguageLevel,
     manifest: File? = options.manifest,
-    currentApiLevel: Int = options.currentApiLevel + if (options.currentCodeName != null) 1 else 0
+    currentApiLevel: Int = options.currentApiLevel +
+        if (options.currentCodeName != null && "REL" != options.currentCodeName) 1 else 0
 ): PsiBasedCodebase {
     val sourceRoots = mutableListOf<File>()
     sourcePath.filterTo(sourceRoots) { it.path.isNotBlank() }
diff --git a/src/test/java/com/android/tools/metalava/apilevels/ApiGeneratorTest.kt b/src/test/java/com/android/tools/metalava/apilevels/ApiGeneratorTest.kt
index 9c4da1e..7c2c9dc 100644
--- a/src/test/java/com/android/tools/metalava/apilevels/ApiGeneratorTest.kt
+++ b/src/test/java/com/android/tools/metalava/apilevels/ApiGeneratorTest.kt
@@ -67,7 +67,7 @@
                 ARG_CURRENT_CODENAME,
                 "Z",
                 ARG_CURRENT_VERSION,
-                "35" // not real api level of Z
+                "89" // not real api level of Z
             ),
             sourceFiles = arrayOf(
                 java(
@@ -85,7 +85,7 @@
         val xml = output.readText(UTF_8)
         assertTrue(xml.contains("<class name=\"android/Manifest\$permission\" since=\"1\">"))
         assertTrue(xml.contains("<field name=\"BIND_CARRIER_MESSAGING_SERVICE\" since=\"22\" deprecated=\"23\"/>"))
-        assertTrue(xml.contains("<class name=\"android/pkg/MyTest\" since=\"36\""))
+        assertTrue(xml.contains("<class name=\"android/pkg/MyTest\" since=\"90\""))
         assertFalse(xml.contains("<implements name=\"java/lang/annotation/Annotation\" removed=\""))
         assertFalse(xml.contains("<extends name=\"java/lang/Enum\" removed=\""))
         assertFalse(xml.contains("<method name=\"append(C)Ljava/lang/AbstractStringBuilder;\""))
@@ -118,4 +118,110 @@
         val methodVersion = apiLookup.getMethodVersion("android/icu/util/CopticCalendar", "computeTime", "()")
         assertEquals(24, methodVersion)
     }
+
+    @Test
+    fun `Correct API Level for release`() {
+        var oldSdkJars = File("prebuilts/tools/common/api-versions")
+        if (!oldSdkJars.isDirectory) {
+            oldSdkJars = File("../../prebuilts/tools/common/api-versions")
+            if (!oldSdkJars.isDirectory) {
+                println("Ignoring ${ApiGeneratorTest::class.java}: prebuilts not found - is \$PWD set to an Android source tree?")
+                return
+            }
+        }
+
+        var platformJars = File("prebuilts/sdk")
+        if (!platformJars.isDirectory) {
+            platformJars = File("../../prebuilts/sdk")
+            if (!platformJars.isDirectory) {
+                println("Ignoring ${ApiGeneratorTest::class.java}: prebuilts not found: $platformJars")
+                return
+            }
+        }
+        val output = File.createTempFile("api-info", "xml")
+        output.deleteOnExit()
+        val outputPath = output.path
+
+        check(
+            extraArguments = arrayOf(
+                ARG_GENERATE_API_LEVELS,
+                outputPath,
+                ARG_ANDROID_JAR_PATTERN,
+                "${oldSdkJars.path}/android-%/android.jar",
+                ARG_ANDROID_JAR_PATTERN,
+                "${platformJars.path}/%/public/android.jar",
+                ARG_CURRENT_CODENAME,
+                "REL",
+                ARG_CURRENT_VERSION,
+                "89" // not real api level
+            ),
+            sourceFiles = arrayOf(
+                java(
+                    """
+                        package android.pkg;
+                        public class MyTest {
+                        }
+                        """
+                )
+            )
+        )
+
+        assertTrue(output.isFile)
+        // Anything with a REL codename is in the current API level
+        val xml = output.readText(UTF_8)
+        assertTrue(xml.contains("<class name=\"android/pkg/MyTest\" since=\"89\""))
+    }
+
+    @Test
+    fun `Correct API Level for non-release`() {
+        var oldSdkJars = File("prebuilts/tools/common/api-versions")
+        if (!oldSdkJars.isDirectory) {
+            oldSdkJars = File("../../prebuilts/tools/common/api-versions")
+            if (!oldSdkJars.isDirectory) {
+                println("Ignoring ${ApiGeneratorTest::class.java}: prebuilts not found - is \$PWD set to an Android source tree?")
+                return
+            }
+        }
+
+        var platformJars = File("prebuilts/sdk")
+        if (!platformJars.isDirectory) {
+            platformJars = File("../../prebuilts/sdk")
+            if (!platformJars.isDirectory) {
+                println("Ignoring ${ApiGeneratorTest::class.java}: prebuilts not found: $platformJars")
+                return
+            }
+        }
+        val output = File.createTempFile("api-info", "xml")
+        output.deleteOnExit()
+        val outputPath = output.path
+
+        check(
+            extraArguments = arrayOf(
+                ARG_GENERATE_API_LEVELS,
+                outputPath,
+                ARG_ANDROID_JAR_PATTERN,
+                "${oldSdkJars.path}/android-%/android.jar",
+                ARG_ANDROID_JAR_PATTERN,
+                "${platformJars.path}/%/public/android.jar",
+                ARG_CURRENT_CODENAME,
+                "ZZZ", // not just Z, but very ZZZ
+                ARG_CURRENT_VERSION,
+                "89" // not real api level
+            ),
+            sourceFiles = arrayOf(
+                java(
+                    """
+                        package android.pkg;
+                        public class MyTest {
+                        }
+                        """
+                )
+            )
+        )
+
+        assertTrue(output.isFile)
+        // Metalava should understand that a codename means "current api + 1"
+        val xml = output.readText(UTF_8)
+        assertTrue(xml.contains("<class name=\"android/pkg/MyTest\" since=\"90\""))
+    }
 }