[ApiModel] Update api database to be api level 34 (preview)

Bug: b/267957385
Change-Id: Ia35d9a84bbbb1da112ad95f23b2649e6b4e6016e
diff --git a/src/main/java/com/android/tools/r8/androidapi/AndroidApiLevelCompute.java b/src/main/java/com/android/tools/r8/androidapi/AndroidApiLevelCompute.java
index 35eb379..fb97359 100644
--- a/src/main/java/com/android/tools/r8/androidapi/AndroidApiLevelCompute.java
+++ b/src/main/java/com/android/tools/r8/androidapi/AndroidApiLevelCompute.java
@@ -19,7 +19,7 @@
   private final KnownApiLevel[] knownApiLevelCache;
 
   public AndroidApiLevelCompute() {
-    knownApiLevelCache = new KnownApiLevel[AndroidApiLevel.LATEST.getLevel() + 1];
+    knownApiLevelCache = new KnownApiLevel[AndroidApiLevel.API_DATABASE_LEVEL.getLevel() + 1];
     for (AndroidApiLevel value : AndroidApiLevel.values()) {
       if (value != AndroidApiLevel.ANDROID_PLATFORM && value != AndroidApiLevel.MASTER) {
         knownApiLevelCache[value.getLevel()] = new KnownApiLevel(value);
diff --git a/src/main/java/com/android/tools/r8/utils/AndroidApiLevel.java b/src/main/java/com/android/tools/r8/utils/AndroidApiLevel.java
index 69c9714..5be322e 100644
--- a/src/main/java/com/android/tools/r8/utils/AndroidApiLevel.java
+++ b/src/main/java/com/android/tools/r8/utils/AndroidApiLevel.java
@@ -43,14 +43,17 @@
   S(31),
   Sv2(32),
   T(33),
-  MASTER(34), // API level for master is tentative.
+  U(34),
+  MASTER(35), // API level for master is tentative.
   ANDROID_PLATFORM(10000);
 
   // When updating LATEST and a new version goes stable, add a new api-versions.xml to third_party
   // and update the version and generated jar in AndroidApiDatabaseBuilderGeneratorTest.
-  // TODO(b/204738868): Update API database for Sv2 / T when they are ready.
   public static final AndroidApiLevel LATEST = T;
 
+  // TODO(b/268601605): When adding U to the test matrix, set this to LATEST.
+  public static final AndroidApiLevel API_DATABASE_LEVEL = U;
+
   private final int level;
 
   AndroidApiLevel(int level) {
@@ -174,6 +177,8 @@
       case 33:
         return T;
       case 34:
+        return U;
+      case 35:
         return MASTER;
       case 10000:
         return ANDROID_PLATFORM;
diff --git a/src/test/java/com/android/tools/r8/apimodel/AndroidApiHashingDatabaseBuilderGenerator.java b/src/test/java/com/android/tools/r8/apimodel/AndroidApiHashingDatabaseBuilderGenerator.java
index 423850e..b8d3f1f 100644
--- a/src/test/java/com/android/tools/r8/apimodel/AndroidApiHashingDatabaseBuilderGenerator.java
+++ b/src/test/java/com/android/tools/r8/apimodel/AndroidApiHashingDatabaseBuilderGenerator.java
@@ -143,6 +143,7 @@
       Map<DexReference, AndroidApiLevel> referenceMap,
       Path androidJar) {
     Map<DexType, String> missingMemberInformation = new IdentityHashMap<>();
+    DexItemFactory factory = appView.dexItemFactory();
     for (DexLibraryClass clazz : appView.app().asDirect().libraryClasses()) {
       ParsedApiClass parsedApiClass = lookupMap.get(clazz.getClassReference());
       if (parsedApiClass == null) {
@@ -168,7 +169,7 @@
           method -> {
             if (method.getAccessFlags().isPublic()
                 && referenceMap.get(method.getReference()) == null
-                && !appView.dexItemFactory().objectMembers.isObjectMember(method.getReference())) {
+                && !factory.objectMembers.isObjectMember(method.getReference())) {
               classBuilder.append("  ").append(method).append(" is missing\n");
             }
           });
@@ -177,22 +178,30 @@
       }
     }
 
+    Set<DexType> expectedMissingMembers = new HashSet<>();
     // api-versions.xml do not encode all members of StringBuffers and StringBuilders, check that we
     // only have missing definitions for those two classes.
-    assert missingMemberInformation.size() == 7;
-    assert missingMemberInformation.containsKey(appView.dexItemFactory().stringBufferType);
-    assert missingMemberInformation.containsKey(appView.dexItemFactory().stringBuilderType);
+    expectedMissingMembers.add(factory.stringBufferType);
+    expectedMissingMembers.add(factory.stringBuilderType);
     // TODO(b/231126636): api-versions.xml has missing definitions for the below classes.
-    assert missingMemberInformation.containsKey(
-        appView.dexItemFactory().createType("Ljava/util/concurrent/ConcurrentHashMap$KeySetView;"));
-    assert missingMemberInformation.containsKey(
-        appView.dexItemFactory().createType("Ljava/time/chrono/ThaiBuddhistDate;"));
-    assert missingMemberInformation.containsKey(
-        appView.dexItemFactory().createType("Ljava/time/chrono/HijrahDate;"));
-    assert missingMemberInformation.containsKey(
-        appView.dexItemFactory().createType("Ljava/time/chrono/JapaneseDate;"));
-    assert missingMemberInformation.containsKey(
-        appView.dexItemFactory().createType("Ljava/time/chrono/MinguoDate;"));
+    expectedMissingMembers.add(
+        factory.createType("Ljava/util/concurrent/ConcurrentHashMap$KeySetView;"));
+    expectedMissingMembers.add(factory.createType("Ljava/time/chrono/ThaiBuddhistDate;"));
+    expectedMissingMembers.add(factory.createType("Ljava/time/chrono/HijrahDate;"));
+    expectedMissingMembers.add(factory.createType("Ljava/time/chrono/JapaneseDate;"));
+    expectedMissingMembers.add(factory.createType("Ljava/time/chrono/MinguoDate;"));
+    expectedMissingMembers.add(factory.createType("Landroid/nfc/tech/NfcV;"));
+    expectedMissingMembers.add(factory.createType("Landroid/nfc/tech/IsoDep;"));
+    expectedMissingMembers.add(factory.createType("Landroid/nfc/tech/MifareUltralight;"));
+    expectedMissingMembers.add(factory.createType("Landroid/nfc/tech/MifareClassic;"));
+    expectedMissingMembers.add(factory.createType("Landroid/nfc/tech/NdefFormatable;"));
+    expectedMissingMembers.add(factory.createType("Landroid/nfc/tech/NfcA;"));
+    expectedMissingMembers.add(factory.createType("Landroid/nfc/tech/NfcBarcode;"));
+    expectedMissingMembers.add(factory.createType("Landroid/nfc/tech/NfcF;"));
+    expectedMissingMembers.add(factory.createType("Landroid/nfc/tech/NfcB;"));
+    expectedMissingMembers.add(factory.createType("Landroid/nfc/tech/Ndef;"));
+    expectedMissingMembers.add(factory.createType("Landroid/webkit/CookieSyncManager;"));
+    assertEquals(expectedMissingMembers, missingMemberInformation.keySet());
     return true;
   }
 
diff --git a/src/test/java/com/android/tools/r8/apimodel/AndroidApiHashingDatabaseBuilderGeneratorTest.java b/src/test/java/com/android/tools/r8/apimodel/AndroidApiHashingDatabaseBuilderGeneratorTest.java
index 29c9709..285d96a 100644
--- a/src/test/java/com/android/tools/r8/apimodel/AndroidApiHashingDatabaseBuilderGeneratorTest.java
+++ b/src/test/java/com/android/tools/r8/apimodel/AndroidApiHashingDatabaseBuilderGeneratorTest.java
@@ -19,6 +19,7 @@
 import com.android.tools.r8.graph.DexItemFactory;
 import com.android.tools.r8.graph.DexMethod;
 import com.android.tools.r8.graph.DexType;
+import com.android.tools.r8.references.MethodReference;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.IntBox;
 import com.android.tools.r8.utils.InternalOptions;
@@ -46,7 +47,7 @@
           .resolve("new_api_database.ser");
 
   // Update the API_LEVEL below to have the database generated for a new api level.
-  private static final AndroidApiLevel API_LEVEL = AndroidApiLevel.LATEST;
+  private static final AndroidApiLevel API_LEVEL = AndroidApiLevel.API_DATABASE_LEVEL;
 
   @Parameters(name = "{0}")
   public static TestParametersCollection data() {
@@ -94,18 +95,16 @@
     parsedApiClasses.forEach(
         apiClass -> {
           apiClass.visitFieldReferences(
-              ((apiLevel, fieldReferences) -> {
-                fieldReferences.forEach(field -> numberOfFields.increment());
-              }));
+              ((apiLevel, fieldReferences) ->
+                  fieldReferences.forEach(field -> numberOfFields.increment())));
           apiClass.visitMethodReferences(
-              ((apiLevel, methodReferences) -> {
-                methodReferences.forEach(field -> numberOfMethods.increment());
-              }));
+              ((AndroidApiLevel apiLevel, List<MethodReference> methodReferences) ->
+                  methodReferences.forEach(field -> numberOfMethods.increment())));
         });
     // These numbers will change when updating api-versions.xml
-    assertEquals(5272, parsedApiClasses.size());
-    assertEquals(27868, numberOfFields.get());
-    assertEquals(42268, numberOfMethods.get());
+    assertEquals(5635, parsedApiClasses.size());
+    assertEquals(29017, numberOfFields.get());
+    assertEquals(44107, numberOfMethods.get());
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/apimodel/AndroidApiVersionsXmlParser.java b/src/test/java/com/android/tools/r8/apimodel/AndroidApiVersionsXmlParser.java
index 97f6cd0..9f80832 100644
--- a/src/test/java/com/android/tools/r8/apimodel/AndroidApiVersionsXmlParser.java
+++ b/src/test/java/com/android/tools/r8/apimodel/AndroidApiVersionsXmlParser.java
@@ -19,9 +19,11 @@
 import java.io.File;
 import java.util.ArrayList;
 import java.util.Comparator;
+import java.util.HashSet;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.TreeMap;
 import java.util.function.BiConsumer;
 import javax.xml.parsers.DocumentBuilderFactory;
@@ -48,11 +50,20 @@
     return parsedApiClass;
   }
 
+  private Set<String> getDeletedTypesMissingRemovedAttribute() {
+    Set<String> removedTypeNames = new HashSet<>();
+    if (maxApiLevel.isGreaterThanOrEqualTo(AndroidApiLevel.U)) {
+      removedTypeNames.add("com.android.internal.util.Predicate");
+    }
+    return removedTypeNames;
+  }
+
   private void readApiVersionsXmlFile() throws Exception {
     CodeInspector inspector = new CodeInspector(ToolHelper.getAndroidJar(maxApiLevel));
     DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
     Document document = factory.newDocumentBuilder().parse(apiVersionsXml);
     NodeList classes = document.getElementsByTagName("class");
+    Set<String> exemptionList = getDeletedTypesMissingRemovedAttribute();
     for (int i = 0; i < classes.getLength(); i++) {
       Node node = classes.item(i);
       assert node.getNodeType() == Node.ELEMENT_NODE;
@@ -61,9 +72,10 @@
       ClassSubject clazz = inspector.clazz(type);
       if (!clazz.isPresent()) {
         if (!clazz.getOriginalName().startsWith("android.test")
-            && !clazz.getOriginalName().startsWith("junit")) {
-          assert hasRemoved(node);
-          assert getRemoved(node).isLessThanOrEqualTo(maxApiLevel);
+            && !clazz.getOriginalName().startsWith("junit")
+            && node.getAttributes().getNamedItem("module") == null) {
+          assert exemptionList.contains(type) || hasRemoved(node);
+          assert exemptionList.contains(type) || getRemoved(node).isLessThanOrEqualTo(maxApiLevel);
         }
         continue;
       }
diff --git a/third_party/api_database/api_database.tar.gz.sha1 b/third_party/api_database/api_database.tar.gz.sha1
index 275471b..9883fe5 100644
--- a/third_party/api_database/api_database.tar.gz.sha1
+++ b/third_party/api_database/api_database.tar.gz.sha1
@@ -1 +1 @@
-f081c538df68649432fa8e45ec511d43d5548396
\ No newline at end of file
+29b5c8dfdccf33e7a540d5de29476805a7d5c2f0
\ No newline at end of file