Update support for API level 36

  * Update Android SDK 36 files to revision 1 (from preview revision 5)
  * Update API database based on Android SDK 36 revision 1

Bug: b/406171119
Change-Id: I92c83edd4088425f96cac03d0d9baffe61be81cc
diff --git a/src/main/java/com/android/tools/r8/androidapi/AndroidApiLevelDatabaseHelper.java b/src/main/java/com/android/tools/r8/androidapi/AndroidApiLevelDatabaseHelper.java
index e4222dd..33de95e 100644
--- a/src/main/java/com/android/tools/r8/androidapi/AndroidApiLevelDatabaseHelper.java
+++ b/src/main/java/com/android/tools/r8/androidapi/AndroidApiLevelDatabaseHelper.java
@@ -23,11 +23,10 @@
     notModeledTypes.add("android.annotation.Nullable");
     notModeledTypes.add("android.annotation.NonNull");
     notModeledTypes.add("android.annotation.FlaggedApi");
-    notModeledTypes.add("android.adservices.customaudience.PartialCustomAudience");
-    notModeledTypes.add("android.adservices.customaudience.PartialCustomAudience$Builder");
     notModeledTypes.add(
-        "android.adservices.customaudience.ScheduleCustomAudienceUpdateRequest$Builder");
-    notModeledTypes.add("android.adservices.customaudience.ScheduleCustomAudienceUpdateRequest");
+        "android.adservices.ondevicepersonalization.FederatedComputeScheduleRequest");
+    notModeledTypes.add(
+        "android.adservices.ondevicepersonalization.FederatedComputeScheduleResponse");
     return notModeledTypes;
   }
 
@@ -36,6 +35,17 @@
     Set<String> notModeledFields = new HashSet<>();
     notModeledFields.add("int android.app.appsearch.AppSearchResult.RESULT_DENIED");
     notModeledFields.add("int android.app.appsearch.AppSearchResult.RESULT_RATE_LIMITED");
+
+    notModeledFields.add(
+        "int android.adservices.adselection.ReportEventRequest.FLAG_REPORTING_DESTINATION_COMPONENT_SELLER");
+    notModeledFields.add(
+        "int android.adservices.ondevicepersonalization.OnDevicePersonalizationManager.FEATURE_DISABLED");
+    notModeledFields.add(
+        "int android.adservices.ondevicepersonalization.OnDevicePersonalizationManager.FEATURE_ENABLED");
+    notModeledFields.add(
+        "int android.adservices.ondevicepersonalization.OnDevicePersonalizationManager.FEATURE_UNSUPPORTED");
+    notModeledFields.add(
+        "int android.adservices.ondevicepersonalization.InferenceInput$Params.MODEL_TYPE_EXECUTORCH");
     return notModeledFields;
   }
 
@@ -46,6 +56,29 @@
         "void android.adservices.customaudience.CustomAudienceManager.scheduleCustomAudienceUpdate(android.adservices.customaudience.ScheduleCustomAudienceUpdateRequest,"
             + " java.util.concurrent.Executor,"
             + " android.adservices.common.AdServicesOutcomeReceiver)");
+    notModelledMethods.add(
+        "android.adservices.ondevicepersonalization.InferenceOutput$Builder"
+            + " android.adservices.ondevicepersonalization.InferenceOutput$Builder.setData(byte[])");
+    notModelledMethods.add(
+        "android.adservices.common.AdTechIdentifier"
+            + " android.adservices.adselection.AdSelectionOutcome.getWinningSeller()");
+    notModelledMethods.add(
+        "void android.adservices.ondevicepersonalization.FederatedComputeScheduler.schedule(android.adservices.ondevicepersonalization.FederatedComputeScheduleRequest,"
+            + " java.util.concurrent.Executor, android.os.OutcomeReceiver)");
+
+    notModelledMethods.add(
+        "byte[] android.adservices.ondevicepersonalization.InferenceOutput.getData()");
+    notModelledMethods.add(
+        "byte[] android.adservices.ondevicepersonalization.InferenceInput.getData()");
+    notModelledMethods.add(
+        "void android.adservices.ondevicepersonalization.OnDevicePersonalizationManager.queryFeatureAvailability(java.lang.String,"
+            + " java.util.concurrent.Executor, android.os.OutcomeReceiver)");
+    notModelledMethods.add(
+        "void android.adservices.ondevicepersonalization.InferenceInput$Builder.<init>(android.adservices.ondevicepersonalization.InferenceInput$Params,"
+            + " byte[])");
+    notModelledMethods.add(
+        "android.adservices.ondevicepersonalization.InferenceInput$Builder"
+            + " android.adservices.ondevicepersonalization.InferenceInput$Builder.setInputData(byte[])");
     return notModelledMethods;
   }
 
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 9325826..8f0b88a 100644
--- a/src/test/java/com/android/tools/r8/apimodel/AndroidApiHashingDatabaseBuilderGenerator.java
+++ b/src/test/java/com/android/tools/r8/apimodel/AndroidApiHashingDatabaseBuilderGenerator.java
@@ -200,6 +200,32 @@
     expectedMissingMembers.add(factory.createType("Landroid/nfc/tech/NfcB;"));
     expectedMissingMembers.add(factory.createType("Landroid/nfc/tech/Ndef;"));
     expectedMissingMembers.add(factory.createType("Landroid/webkit/CookieSyncManager;"));
+    expectedMissingMembers.add(
+        factory.createType("Landroid/adservices/adselection/AdSelectionOutcome;"));
+    expectedMissingMembers.add(
+        factory.createType("Landroid/adservices/adselection/ReportEventRequest;"));
+    expectedMissingMembers.add(
+        factory.createType(
+            "Landroid/adservices/ondevicepersonalization/FederatedComputeScheduleRequest;"));
+    expectedMissingMembers.add(
+        factory.createType(
+            "Landroid/adservices/ondevicepersonalization/FederatedComputeScheduleResponse;"));
+    expectedMissingMembers.add(
+        factory.createType(
+            "Landroid/adservices/ondevicepersonalization/FederatedComputeScheduler;"));
+    expectedMissingMembers.add(
+        factory.createType("Landroid/adservices/ondevicepersonalization/InferenceInput;"));
+    expectedMissingMembers.add(
+        factory.createType("Landroid/adservices/ondevicepersonalization/InferenceInput$Builder;"));
+    expectedMissingMembers.add(
+        factory.createType("Landroid/adservices/ondevicepersonalization/InferenceInput$Params;"));
+    expectedMissingMembers.add(
+        factory.createType("Landroid/adservices/ondevicepersonalization/InferenceOutput;"));
+    expectedMissingMembers.add(
+        factory.createType("Landroid/adservices/ondevicepersonalization/InferenceOutput$Builder;"));
+    expectedMissingMembers.add(
+        factory.createType(
+            "Landroid/adservices/ondevicepersonalization/OnDevicePersonalizationManager;"));
     assertEquals(
         expectedMissingMembers.stream()
                 .map(DexType::toDescriptorString)
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 6cbb86e..1e496fe 100644
--- a/src/test/java/com/android/tools/r8/apimodel/AndroidApiHashingDatabaseBuilderGeneratorTest.java
+++ b/src/test/java/com/android/tools/r8/apimodel/AndroidApiHashingDatabaseBuilderGeneratorTest.java
@@ -127,8 +127,8 @@
         });
     // These numbers will change when updating api-versions.xml
     assertEquals(6222, parsedApiClasses.size());
-    assertEquals(31430, numberOfFields.get());
-    assertEquals(48025, numberOfMethods.get());
+    assertEquals(31431, numberOfFields.get());
+    assertEquals(48028, numberOfMethods.get());
   }
 
   private static String sampleVersion4ApiVersionsXml =
@@ -290,10 +290,16 @@
     Set<String> notModeledFields = notModeledFields();
     Set<String> notModeledMethods = notModeledMethods();
     for (DexLibraryClass clazz : appView.app().asDirect().libraryClasses()) {
-      if (notModeledTypes.contains(clazz.getClassReference().getTypeName())) {
+      String typeName = clazz.getClassReference().getTypeName();
+      if (notModeledTypes.contains(typeName)) {
+        notModeledTypes.remove(typeName);
         continue;
       }
       assertTrue(
+          "Class "
+              + clazz.toSourceString()
+              + " not found in API database. Did you forget to run main method in this"
+              + " class to regenerate it?",
           apiLevelCompute
               .computeApiLevelForLibraryReference(clazz.getReference())
               .isKnownApiLevel());
@@ -303,25 +309,42 @@
                 && !field.toSourceString().contains("this$0")
                 && !notModeledFields.contains(field.toSourceString())) {
               assertTrue(
+                  "Field "
+                      + field.toSourceString()
+                      + " not found in API database. Did you forget to run main method in this"
+                      + " class to regenerate it?",
                   apiLevelCompute
                       .computeApiLevelForLibraryReference(field.getReference())
                       .isKnownApiLevel());
             }
+            notModeledFields.remove(field.toSourceString());
           });
       clazz.forEachClassMethod(
           method -> {
             if (method.getAccessFlags().isPublic()
                 && !notModeledMethods.contains(method.toSourceString())) {
               assertTrue(
-                  method.toSourceString()
+                  "Method "
+                      + method.toSourceString()
                       + " not found in API database. Did you forget to run main method in this"
                       + " class to regenerate it?",
                   apiLevelCompute
                       .computeApiLevelForLibraryReference(method.getReference())
                       .isKnownApiLevel());
             }
+            notModeledMethods.remove(method.toSourceString());
           });
     }
+
+    assertTrue(
+        "Not modelled types actually modeled: " + String.join(", ", notModeledTypes),
+        notModeledTypes.isEmpty());
+    assertTrue(
+        "Not modelled fields actually modeled: " + String.join(", ", notModeledFields),
+        notModeledFields.isEmpty());
+    assertTrue(
+        "Not modelled methods actually modeled: " + String.join(", ", notModeledMethods),
+        notModeledMethods.isEmpty());
   }
 
   @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 6c6e251..0daf4e2 100644
--- a/src/test/java/com/android/tools/r8/apimodel/AndroidApiVersionsXmlParser.java
+++ b/src/test/java/com/android/tools/r8/apimodel/AndroidApiVersionsXmlParser.java
@@ -107,8 +107,7 @@
     }
     Set<String> removedTypeNames = new HashSet<>();
     if (maxApiLevel.isGreaterThanOrEqualTo(AndroidApiLevel.U)) {
-      if (maxApiLevel.isLessThan(AndroidApiLevel.V)
-          || maxApiLevel.equals(AndroidApiLevel.BAKLAVA)) {
+      if (maxApiLevel.isLessThan(AndroidApiLevel.V)) {
         removedTypeNames.add("com.android.internal.util.Predicate");
       }
       removedTypeNames.add("android.adservices.AdServicesVersion");
diff --git a/third_party/android_jar/lib-v36.tar.gz.sha1 b/third_party/android_jar/lib-v36.tar.gz.sha1
index 7ae4a86..e9786d8 100644
--- a/third_party/android_jar/lib-v36.tar.gz.sha1
+++ b/third_party/android_jar/lib-v36.tar.gz.sha1
@@ -1 +1 @@
-0c46498b29f843953a5e54013d0c6aa8177fc606
\ No newline at end of file
+aaf5a2a821b31939843bc0640fcf2c013df94c80
\ No newline at end of file
diff --git a/third_party/api_database/api_database.tar.gz.sha1 b/third_party/api_database/api_database.tar.gz.sha1
index a2a5acc..2e42f99 100644
--- a/third_party/api_database/api_database.tar.gz.sha1
+++ b/third_party/api_database/api_database.tar.gz.sha1
@@ -1 +1 @@
-f6cddd7abca49554f6913dc581bea9bd4c298370
\ No newline at end of file
+3beb0b295a8362fdf9d9a01d5ff2780da9a6cf88
\ No newline at end of file
diff --git a/tools/add-android-sdk.py b/tools/add-android-sdk.py
index 5b127e6..063a99c 100755
--- a/tools/add-android-sdk.py
+++ b/tools/add-android-sdk.py
@@ -15,7 +15,8 @@
     parser.add_argument('--sdk-home',
                         '--sdk_home',
                         metavar=('<SDK_HOME>'),
-                        help='SDK_HOME to use for finding SDK')
+                        help='SDK_HOME to use for finding SDK'
+                             ' (default $SDK_HOME or $HOME/Android/Sdk)')
     parser.add_argument('--sdk-name',
                         '--sdk_name',
                         required=True,
@@ -53,10 +54,14 @@
     if not args.sdk_home:
         args.sdk_home = os.environ.get('SDK_HOME')
         if not args.sdk_home:
-            print('No SDK_HOME specified')
+            if not os.environ.get('HOME'):
+                print('No SDK_HOME specified')
+                sys.exit(1)
+            args.sdk_home = os.path.join(os.environ.get('HOME'), 'Android', 'Sdk')
+        if not os.path.exists(args.sdk_home):
+            print('SDK_HOME does not exist')
             sys.exit(1)
-        else:
-            print('Using SDK_HOME: %s' % args.sdk_home)
+        print('Using SDK_HOME: %s' % args.sdk_home)
 
     source = os.path.join(args.sdk_home, 'platforms',
                           'android-%s' % args.sdk_name)