Snap for 8828152 from 18c56963fb123a33d85f51b4c5dbdbf35e059b0e to mainline-adbd-release

Change-Id: Id1344cb07d833577a76a0c3d37f526c7adcc95fd
diff --git a/TEST_MAPPING b/TEST_MAPPING
index da9469c..18355d5 100644
--- a/TEST_MAPPING
+++ b/TEST_MAPPING
@@ -1,4 +1,9 @@
 {
+  "mainline-presubmit": [
+    {
+      "name": "derive_sdk_test[com.google.android.sdkext.apex]"
+    }
+  ],
   "presubmit": [
     {
       "name": "CtsSdkExtensionsTestCases"
diff --git a/derive_sdk/Android.bp b/derive_sdk/Android.bp
index 66ba7bc..7cb5be4 100644
--- a/derive_sdk/Android.bp
+++ b/derive_sdk/Android.bp
@@ -68,7 +68,8 @@
     srcs: ["derive_sdk_test.cpp"],
     require_root: true,
     static_libs: ["libderive_sdk"],
-    test_suites: ["device-tests"],
+    test_suites: ["general-tests"],
+    test_mainline_modules: ["com.google.android.sdkext.apex"],
 }
 
 prebuilt_etc {
diff --git a/derive_sdk/derive_sdk.cpp b/derive_sdk/derive_sdk.cpp
index a4a1251..a6eaeb2 100644
--- a/derive_sdk/derive_sdk.cpp
+++ b/derive_sdk/derive_sdk.cpp
@@ -203,6 +203,14 @@
     }
   }
 
+  relevant_modules.clear();
+  relevant_modules.insert(SdkModule::AD_SERVICES);
+  if (android::modules::sdklevel::IsAtLeastT()) {
+    if (!SetExtension("ad_services", db, relevant_modules, versions)) {
+      return false;
+    }
+  }
+
   return true;
 }
 
diff --git a/derive_sdk/derive_sdk_test.cpp b/derive_sdk/derive_sdk_test.cpp
index 51e703e..e7fe5ba 100644
--- a/derive_sdk/derive_sdk_test.cpp
+++ b/derive_sdk/derive_sdk_test.cpp
@@ -91,6 +91,12 @@
     EXPECT_EQ(T, android::modules::sdklevel::IsAtLeastT() ? n : -1);
   }
 
+  void EXPECT_ADSERVICES(int n) {
+    int A = android::base::GetIntProperty("build.version.extensions.ad_services", -1);
+    // Only expect the AdServices extension level to be set on T+ devices.
+    EXPECT_EQ(A, android::modules::sdklevel::IsAtLeastT() ? n : -1);
+  }
+
   void EXPECT_ALL(int n) {
     EXPECT_R(n);
     EXPECT_S(n);
@@ -220,6 +226,43 @@
   ASSERT_FALSE(android::derivesdk::SetSdkLevels(dir()));
 }
 
+TEST_F(DeriveSdkTest, AdServices) {
+  AddExtensionVersion(1, {
+                             {SdkModule::TETHERING, 1},
+                         });
+  EXPECT_ALL(0);
+  EXPECT_ADSERVICES(1);
+
+  SetApexVersion("com.android.tethering", 1);
+  EXPECT_ALL(1);
+
+  // V2 defined
+  AddExtensionVersion(2, {
+                             {SdkModule::AD_SERVICES, 2},
+                             {SdkModule::TETHERING, 2},
+                         });
+  EXPECT_ALL(1);
+  EXPECT_ADSERVICES(1);
+
+  // Only adservices v2
+  SetApexVersion("com.android.adservices", 2);
+  EXPECT_ALL(1);
+  EXPECT_ADSERVICES(2);
+
+  // Both v2
+  SetApexVersion("com.android.tethering", 2);
+  EXPECT_ALL(2);
+  EXPECT_ADSERVICES(2);
+
+  // Only tethering v2. R and S extension are bumped, but T requires adserices.
+  SetApexVersion("com.android.adservices", 0);
+  SetApexVersion("com.android.tethering", 2);
+  EXPECT_R(2);
+  EXPECT_S(2);
+  EXPECT_T(1);
+  EXPECT_ADSERVICES(1);
+}
+
 int main(int argc, char** argv) {
   ::testing::InitGoogleTest(&argc, argv);
   return RUN_ALL_TESTS();
diff --git a/java/android/os/ext/SdkExtensions.java b/java/android/os/ext/SdkExtensions.java
index 3ce6a5a..df68e0b 100644
--- a/java/android/os/ext/SdkExtensions.java
+++ b/java/android/os/ext/SdkExtensions.java
@@ -42,14 +42,20 @@
  */
 public class SdkExtensions {
 
+    // TODO(b/234007262): Decide on the right final value for this.
+    public static final int AD_SERVICES = 1_000_000;
+
     private static final int R_EXTENSION_INT;
     private static final int S_EXTENSION_INT;
     private static final int T_EXTENSION_INT;
+    private static final int AD_SERVICES_EXTENSION_INT;
     private static final Map<Integer, Integer> ALL_EXTENSION_INTS;
     static {
         R_EXTENSION_INT = SystemProperties.getInt("build.version.extensions.r", 0);
         S_EXTENSION_INT = SystemProperties.getInt("build.version.extensions.s", 0);
         T_EXTENSION_INT = SystemProperties.getInt("build.version.extensions.t", 0);
+        AD_SERVICES_EXTENSION_INT =
+                SystemProperties.getInt("build.version.extensions.ad_services", 0);
         Map<Integer, Integer> extensions = new HashMap<Integer, Integer>();
         extensions.put(VERSION_CODES.R, R_EXTENSION_INT);
         if (SdkLevel.isAtLeastS()) {
@@ -58,6 +64,7 @@
         if (SdkLevel.isAtLeastT()) {
             extensions.put(VERSION_CODES.TIRAMISU, T_EXTENSION_INT);
         }
+        extensions.put(AD_SERVICES, AD_SERVICES_EXTENSION_INT);
         ALL_EXTENSION_INTS = Collections.unmodifiableMap(extensions);
     }
 
@@ -65,7 +72,7 @@
      * Values suitable as parameters for {@link #getExtensionVersion(int)}.
      * @hide
      */
-    @IntDef(value = { VERSION_CODES.R, VERSION_CODES.S, VERSION_CODES.TIRAMISU })
+    @IntDef(value = { VERSION_CODES.R, VERSION_CODES.S, VERSION_CODES.TIRAMISU, AD_SERVICES })
     @Retention(RetentionPolicy.SOURCE)
     public @interface Extension {}
 
@@ -99,6 +106,9 @@
         if (extension == VERSION_CODES.TIRAMISU) {
             return T_EXTENSION_INT;
         }
+        if (extension == AD_SERVICES) {
+            return AD_SERVICES_EXTENSION_INT;
+        }
         return 0;
     }
 
diff --git a/java/android/os/ext/api/current.txt b/java/android/os/ext/api/current.txt
index 180afea..75b43ba 100644
--- a/java/android/os/ext/api/current.txt
+++ b/java/android/os/ext/api/current.txt
@@ -4,6 +4,7 @@
   public class SdkExtensions {
     method @NonNull public static java.util.Map<java.lang.Integer,java.lang.Integer> getAllExtensionVersions();
     method public static int getExtensionVersion(int);
+    field public static final int AD_SERVICES = 1000000; // 0xf4240
   }
 
 }
diff --git a/javatests/com/android/os/ext/SdkExtensionsTest.java b/javatests/com/android/os/ext/SdkExtensionsTest.java
index 29f570b..571e439 100644
--- a/javatests/com/android/os/ext/SdkExtensionsTest.java
+++ b/javatests/com/android/os/ext/SdkExtensionsTest.java
@@ -17,6 +17,11 @@
 package com.android.os.ext;
 
 import static android.os.Build.VERSION_CODES;
+import static android.os.Build.VERSION_CODES.R;
+import static android.os.Build.VERSION_CODES.S;
+import static android.os.Build.VERSION_CODES.TIRAMISU;
+import static android.os.ext.SdkExtensions.AD_SERVICES;
+import static android.os.ext.SdkExtensions.getExtensionVersion;
 import static com.android.os.ext.testing.CurrentVersion.ALLOWED_VERSIONS_CTS;
 import static com.google.common.truth.Truth.assertThat;
 
@@ -63,14 +68,16 @@
 
     /** Verifies that getExtensionVersion only return existing versions */
     public void testValidValues() throws Exception {
-        assertCorrectVersion(true, SdkExtensions.getExtensionVersion(VERSION_CODES.R));
-        assertCorrectVersion(
-            SdkLevel.isAtLeastS(), SdkExtensions.getExtensionVersion(VERSION_CODES.S));
-        assertCorrectVersion(
-            SdkLevel.isAtLeastT(), SdkExtensions.getExtensionVersion(VERSION_CODES.TIRAMISU));
+        assertCorrectVersion(true, getExtensionVersion(R));
+        assertCorrectVersion(SdkLevel.isAtLeastS(), getExtensionVersion(S));
+        assertCorrectVersion(SdkLevel.isAtLeastT(), getExtensionVersion(TIRAMISU));
+        assertCorrectVersion(SdkLevel.isAtLeastT(), getExtensionVersion(AD_SERVICES));
 
-        int firstUnassigned = VERSION_CODES.TIRAMISU + 1;
-        for (int sdk = firstUnassigned; sdk <= 1_000_000; sdk++) {
+        Set<Integer> assignedCodes = Set.of(R, S, TIRAMISU, AD_SERVICES);
+        for (int sdk = VERSION_CODES.R; sdk <= 1_000_000; sdk++) {
+            if (assignedCodes.contains(sdk)) {
+                continue;
+            }
             // No extension SDKs yet.
             assertEquals(0, SdkExtensions.getExtensionVersion(sdk));
         }
@@ -97,6 +104,8 @@
         if (SdkLevel.isAtLeastT()) {
             assertCorrectVersion(versions.get(VERSION_CODES.TIRAMISU));
             expectedSize++;
+            assertCorrectVersion(versions.get(SdkExtensions.AD_SERVICES));
+            expectedSize++;
         }
         assertEquals(expectedSize, versions.size());
     }
diff --git a/manifest.json b/manifest.json
index 3aabdf0..53bcecd 100644
--- a/manifest.json
+++ b/manifest.json
@@ -1,4 +1,7 @@
 {
   "name": "com.android.sdkext",
-  "version": 339990000
+
+  // Placeholder module version to be replaced during build.
+  // Do not change!
+  "version": 0
 }