Setting apex version to the placeholder value am: d03b7b48c6

Original change: https://android-review.googlesource.com/c/platform/packages/modules/SdkExtensions/+/2145794

Change-Id: I943317f26085f14749a5783e5707f237aac4eff8
Signed-off-by: Automerger Merge Worker <[email protected]>
diff --git a/derive_sdk/derive_sdk.cpp b/derive_sdk/derive_sdk.cpp
index 3d3efdb..a6eaeb2 100644
--- a/derive_sdk/derive_sdk.cpp
+++ b/derive_sdk/derive_sdk.cpp
@@ -35,11 +35,14 @@
 namespace derivesdk {
 
 static const std::unordered_map<std::string, SdkModule> kApexNameToModule = {
+    {"com.android.adservices", SdkModule::AD_SERVICES},
+    {"com.android.appsearch", SdkModule::APPSEARCH},
     {"com.android.art", SdkModule::ART},
     {"com.android.conscrypt", SdkModule::CONSCRYPT},
     {"com.android.ipsec", SdkModule::IPSEC},
     {"com.android.media", SdkModule::MEDIA},
     {"com.android.mediaprovider", SdkModule::MEDIA_PROVIDER},
+    {"com.android.ondevicepersonalization", SdkModule::ON_DEVICE_PERSONALIZATION},
     {"com.android.permission", SdkModule::PERMISSIONS},
     {"com.android.scheduling", SdkModule::SCHEDULING},
     {"com.android.sdkext", SdkModule::SDK_EXTENSIONS},
@@ -54,6 +57,9 @@
 
 static const std::unordered_set<SdkModule> kSModules = {SdkModule::ART, SdkModule::SCHEDULING};
 
+static const std::unordered_set<SdkModule> kTModules = {
+    SdkModule::AD_SERVICES, SdkModule::APPSEARCH, SdkModule::ON_DEVICE_PERSONALIZATION};
+
 bool ReadDatabase(const std::string& db_path, ExtensionDatabase& db) {
   std::string contents;
   if (!android::base::ReadFileToString(db_path, &contents, true)) {
@@ -179,6 +185,13 @@
     }
   }
 
+  relevant_modules.insert(kTModules.begin(), kTModules.end());
+  if (android::modules::sdklevel::IsAtLeastT()) {
+    if (!SetExtension("t", db, relevant_modules, versions)) {
+      return false;
+    }
+  }
+
   // Consistency check: verify all modules with requirements is included in some dessert
   for (const auto& ext_version : db.versions()) {
     for (const auto& requirement : ext_version.requirements()) {
@@ -190,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 015d887..e7fe5ba 100644
--- a/derive_sdk/derive_sdk_test.cpp
+++ b/derive_sdk/derive_sdk_test.cpp
@@ -85,9 +85,22 @@
     EXPECT_EQ(S, android::modules::sdklevel::IsAtLeastS() ? n : -1);
   }
 
+  void EXPECT_T(int n) {
+    int T = android::base::GetIntProperty("build.version.extensions.t", -1);
+    // Only expect the T extension level to be set on T+ devices.
+    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);
+    EXPECT_T(n);
   }
 
   ExtensionDatabase db_;
@@ -213,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/gen_sdk/bump_sdk.sh b/gen_sdk/bump_sdk.sh
new file mode 100755
index 0000000..4015324
--- /dev/null
+++ b/gen_sdk/bump_sdk.sh
@@ -0,0 +1,39 @@
+#!/bin/bash
+if ! [ -e build/soong ]; then
+  echo "This script must be run from the top of the tree"
+  exit 1
+fi
+
+sdk="$1"
+if [[ -z "$sdk" ]]; then
+  echo "usage: $0 <new-sdk-int> [bug-id]"
+  exit 1
+fi
+
+bug_text=$(test -n "$2" && echo "\nBug: $2")
+
+SDKEXT="packages/modules/SdkExtensions/"
+
+TARGET_PRODUCT=aosp_arm64 build/soong/soong_ui.bash --make-mode --soong-only gen_sdk
+out/soong/host/linux-x86/bin/gen_sdk \
+    --database ${SDKEXT}/gen_sdk/extensions_db.textpb \
+    --action new_sdk \
+    --sdk "$sdk"
+sed -E -i -e "/CurrentSystemImageValue/{n;s/[0-9]+/${sdk}/}" \
+    ${SDKEXT}/derive_sdk/derive_sdk_test.cpp
+sed -E -i -e "/public static final int V = /{s/\S+;/${sdk};/}" \
+    ${SDKEXT}/java/com/android/os/ext/testing/CurrentVersion.java
+repo start bump-ext ${SDKEXT}
+
+message="Bump SDK Extension version to ${sdk}
+
+Generated with:
+$ $0 $@
+
+Database update generated with:
+$ gen_sdk --action new_sdk --sdk $sdk
+"
+message+=$(test -n "$2" && echo -e "\nBug: $2")
+message+=$(echo -e "\nTest: presubmit")
+
+git -C ${SDKEXT} commit -a -m "$message"
\ No newline at end of file
diff --git a/gen_sdk/extensions_db.textpb b/gen_sdk/extensions_db.textpb
index 5d54a58..3c060c9 100644
--- a/gen_sdk/extensions_db.textpb
+++ b/gen_sdk/extensions_db.textpb
@@ -61,3 +61,147 @@
     }
   }
 }
+versions {
+  version: 2
+  requirements {
+    module: ART
+    version {
+      version: 1
+    }
+  }
+  requirements {
+    module: CONSCRYPT
+    version {
+      version: 1
+    }
+  }
+  requirements {
+    module: IPSEC
+    version {
+      version: 1
+    }
+  }
+  requirements {
+    module: MEDIA
+    version {
+      version: 1
+    }
+  }
+  requirements {
+    module: MEDIA_PROVIDER
+    version {
+      version: 2
+    }
+  }
+  requirements {
+    module: PERMISSIONS
+    version {
+      version: 1
+    }
+  }
+  requirements {
+    module: SCHEDULING
+    version {
+      version: 1
+    }
+  }
+  requirements {
+    module: SDK_EXTENSIONS
+    version {
+      version: 2
+    }
+  }
+  requirements {
+    module: STATSD
+    version {
+      version: 1
+    }
+  }
+  requirements {
+    module: TETHERING
+    version {
+      version: 1
+    }
+  }
+}
+versions {
+  version: 3
+  requirements {
+    module: ART
+    version {
+      version: 3
+    }
+  }
+  requirements {
+    module: CONSCRYPT
+    version {
+      version: 3
+    }
+  }
+  requirements {
+    module: IPSEC
+    version {
+      version: 3
+    }
+  }
+  requirements {
+    module: MEDIA
+    version {
+      version: 3
+    }
+  }
+  requirements {
+    module: MEDIA_PROVIDER
+    version {
+      version: 3
+    }
+  }
+  requirements {
+    module: PERMISSIONS
+    version {
+      version: 3
+    }
+  }
+  requirements {
+    module: SCHEDULING
+    version {
+      version: 3
+    }
+  }
+  requirements {
+    module: SDK_EXTENSIONS
+    version {
+      version: 3
+    }
+  }
+  requirements {
+    module: STATSD
+    version {
+      version: 3
+    }
+  }
+  requirements {
+    module: TETHERING
+    version {
+      version: 3
+    }
+  }
+  requirements {
+    module: AD_SERVICES
+    version {
+      version: 3
+    }
+  }
+  requirements {
+    module: APPSEARCH
+    version {
+      version: 3
+    }
+  }
+  requirements {
+    module: ON_DEVICE_PERSONALIZATION
+    version {
+      version: 3
+    }
+  }
+}
diff --git a/java/android/os/ext/SdkExtensions.java b/java/android/os/ext/SdkExtensions.java
index cb4c541..df68e0b 100644
--- a/java/android/os/ext/SdkExtensions.java
+++ b/java/android/os/ext/SdkExtensions.java
@@ -42,17 +42,29 @@
  */
 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()) {
             extensions.put(VERSION_CODES.S, S_EXTENSION_INT);
         }
+        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);
     }
 
@@ -60,7 +72,7 @@
      * Values suitable as parameters for {@link #getExtensionVersion(int)}.
      * @hide
      */
-    @IntDef(value = { VERSION_CODES.R, VERSION_CODES.S })
+    @IntDef(value = { VERSION_CODES.R, VERSION_CODES.S, VERSION_CODES.TIRAMISU, AD_SERVICES })
     @Retention(RetentionPolicy.SOURCE)
     public @interface Extension {}
 
@@ -91,6 +103,12 @@
         if (extension == VERSION_CODES.S) {
             return S_EXTENSION_INT;
         }
+        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/java/com/android/os/ext/testing/CurrentVersion.java b/java/com/android/os/ext/testing/CurrentVersion.java
index 1a6c93a..e0dbfb7 100644
--- a/java/com/android/os/ext/testing/CurrentVersion.java
+++ b/java/com/android/os/ext/testing/CurrentVersion.java
@@ -15,7 +15,6 @@
  */
 package com.android.os.ext.testing;
 
-import java.util.Collections;
 import java.util.Set;
 
 /**
@@ -37,7 +36,7 @@
     public static final int T_BASE_VERSION = 3;
 
     /** The current platform's version */
-    public static final int CURRENT_BASE_VERSION = S_BASE_VERSION;
+    public static final int CURRENT_BASE_VERSION = CURRENT_TRAIN_VERSION;
 
     /**
      * The current SDK Extension versions to expect / allow in CTS.
diff --git a/javatests/com/android/os/ext/SdkExtensionsTest.java b/javatests/com/android/os/ext/SdkExtensionsTest.java
index 649eb29..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,12 +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(true, getExtensionVersion(R));
+        assertCorrectVersion(SdkLevel.isAtLeastS(), getExtensionVersion(S));
+        assertCorrectVersion(SdkLevel.isAtLeastT(), getExtensionVersion(TIRAMISU));
+        assertCorrectVersion(SdkLevel.isAtLeastT(), getExtensionVersion(AD_SERVICES));
 
-        int firstUnassigned = VERSION_CODES.S + 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));
         }
@@ -79,6 +88,8 @@
         assertCorrectVersion(true, SystemProperties.get("build.version.extensions.r"));
         assertCorrectVersion(
             SdkLevel.isAtLeastS(), SystemProperties.get("build.version.extensions.s"));
+        assertCorrectVersion(
+            SdkLevel.isAtLeastT(), SystemProperties.get("build.version.extensions.t"));
     }
 
     public void testExtensionVersions() throws Exception {
@@ -90,6 +101,12 @@
             assertCorrectVersion(versions.get(VERSION_CODES.S));
             expectedSize++;
         }
+        if (SdkLevel.isAtLeastT()) {
+            assertCorrectVersion(versions.get(VERSION_CODES.TIRAMISU));
+            expectedSize++;
+            assertCorrectVersion(versions.get(SdkExtensions.AD_SERVICES));
+            expectedSize++;
+        }
         assertEquals(expectedSize, versions.size());
     }
 
diff --git a/javatests/com/android/sdkext/extensions/SdkExtensionsHostTest.java b/javatests/com/android/sdkext/extensions/SdkExtensionsHostTest.java
index ec06578..083f3a4 100644
--- a/javatests/com/android/sdkext/extensions/SdkExtensionsHostTest.java
+++ b/javatests/com/android/sdkext/extensions/SdkExtensionsHostTest.java
@@ -105,7 +105,8 @@
         // Version 45 requires sdkext + media, which isn't fulfilled
         assertRVersionEquals(12);
         assertSVersionEquals(12);
-        assertTrue(broadcastForBoolean("MAKE_CALLS_45", null)); // 45 APIs are available on 12 too.
+        assertTVersionEquals(12);
+        assertTestMethodsPresent(); // 45 APIs are available on 12 too.
     }
 
     @Test
@@ -175,16 +176,19 @@
     }
 
     private void assertVersionDefault() throws Exception {
-        int expected = isAtLeastS() ? CurrentVersion.S_BASE_VERSION
+        int expected = isAtLeastT() ? CurrentVersion.T_BASE_VERSION
+            : isAtLeastS() ? CurrentVersion.S_BASE_VERSION
             : CurrentVersion.R_BASE_VERSION;
         assertRVersionEquals(expected);
         assertSVersionEquals(expected);
+        assertTVersionEquals(expected);
         assertTestMethodsNotPresent();
     }
 
     private void assertVersion45() throws Exception {
         assertRVersionEquals(45);
         assertSVersionEquals(45);
+        assertTVersionEquals(45);
         assertTestMethodsPresent();
     }
 
@@ -217,6 +221,10 @@
         assertExtensionVersionEquals("s", version, apps, isAtLeastS());
     }
 
+    private void assertTVersionEquals(int version) throws Exception {
+        assertExtensionVersionEquals("t", version, new String[]{}, isAtLeastT());
+    }
+
     private void assertExtensionVersionEquals(String extension, int version, String[] apps,
             boolean expected) throws Exception {
         int appValue = broadcastForInt("GET_SDK_VERSION", extension);