add isAtLeastV()

Basing this on the state from before:
  https://android-review.googlesource.com/c/platform/frameworks/libs/modules-utils/+/2535803

but with U/UpsideDownCake replaced with V/VanillaIceCream

I assume we don't yet know if V will be 35 or higher.

Bug: 277813952
Test: TreeHugger
Signed-off-by: Maciej Żenczykowski <maze@google.com>
(cherry picked from https://android-review.googlesource.com/q/commit:600ca498ae054d2a6919378d59c8da471748edc1)
Merged-In: Ie2fe7b0bc8b82f8049e51ac7f85b0d9722e9f5ed
Change-Id: Ie2fe7b0bc8b82f8049e51ac7f85b0d9722e9f5ed
diff --git a/build/include/android-modules-utils/sdk_level.h b/build/include/android-modules-utils/sdk_level.h
index bbb6b46..bbb1cfb 100644
--- a/build/include/android-modules-utils/sdk_level.h
+++ b/build/include/android-modules-utils/sdk_level.h
@@ -60,6 +60,12 @@
           detail::IsAtLeastPreReleaseCodename("U"));
 }
 
+// Checks if the device is running on release version of Android V or newer.
+inline bool IsAtLeastV() {
+  return android_get_device_api_level() >= 34 &&
+         detail::IsAtLeastPreReleaseCodename("VanillaIceCream");
+}
+
 } // namespace sdklevel
 } // namespace modules
 } // namespace android
diff --git a/java/com/android/modules/utils/build/SdkLevel.java b/java/com/android/modules/utils/build/SdkLevel.java
index 4612785..42a1e4f 100644
--- a/java/com/android/modules/utils/build/SdkLevel.java
+++ b/java/com/android/modules/utils/build/SdkLevel.java
@@ -64,6 +64,12 @@
                 (SDK_INT == 33 && isAtLeastPreReleaseCodename("UpsideDownCake"));
     }
 
+    /** Checks if the device is running on a pre-release version of Android V or newer */
+    @ChecksSdkIntAtLeast(codename = "VanillaIceCream")
+    public static boolean isAtLeastV() {
+        return SDK_INT >= 34 && isAtLeastPreReleaseCodename("VanillaIceCream");
+    }
+
     private static boolean isAtLeastPreReleaseCodename(@NonNull String codename) {
         // Special case "REL", which means the build is not a pre-release build.
         if ("REL".equals(CODENAME)) {
diff --git a/java/com/android/modules/utils/build/testing/DeviceSdkLevel.java b/java/com/android/modules/utils/build/testing/DeviceSdkLevel.java
index 6e32e44..041d6a5 100644
--- a/java/com/android/modules/utils/build/testing/DeviceSdkLevel.java
+++ b/java/com/android/modules/utils/build/testing/DeviceSdkLevel.java
@@ -44,22 +44,20 @@
         return device.getApiLevel() >= 31;
     }
 
-    /**
-     * Checks if the device is running on a pre-release version of Android T or a release version of
-     * Android T or newer.
-     */
+    /** Checks if the device is running on a release version of Android T or newer. */
     public boolean isDeviceAtLeastT() throws DeviceNotAvailableException {
         return device.getApiLevel() >= 33;
     }
 
-    /**
-     * Checks if the device is running on a pre-release or release version of Android
-     * UpsideDownCake or newer
-     */
+    /** Checks if the device is running on a (pre-)release version of Android U or newer. */
     public boolean isDeviceAtLeastU() throws DeviceNotAvailableException {
         return device.getApiLevel() >= 34 ||
-                (device.getApiLevel() == 33 &&
-                        isDeviceAtLeastPreReleaseCodename("UpsideDownCake"));
+               (device.getApiLevel() == 33 && isDeviceAtLeastPreReleaseCodename("UpsideDownCake"));
+    }
+
+    /** Checks if the device is running on a (pre-)release version of Android V or newer. */
+    public boolean isDeviceAtLeastV() throws DeviceNotAvailableException {
+        return device.getApiLevel() >= 34 && isDeviceAtLeastPreReleaseCodename("VanillaIceCream");
     }
 
     private boolean isDeviceAtLeastPreReleaseCodename(@NonNull String codename)