diff options
3 files changed, 78 insertions, 0 deletions
diff --git a/core/api/system-current.txt b/core/api/system-current.txt index fe32bad40e1f..22370fd1ad3f 100644 --- a/core/api/system-current.txt +++ b/core/api/system-current.txt @@ -3201,6 +3201,11 @@ package android.companion { package android.companion.virtual { + public final class VirtualDevice implements android.os.Parcelable { + method @FlaggedApi("android.companion.virtual.flags.vdm_public_apis") public boolean hasCustomAudioInputSupport(); + method @FlaggedApi("android.companion.virtual.flags.vdm_public_apis") public boolean hasCustomCameraSupport(); + } + public final class VirtualDeviceManager { method @NonNull @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE) public android.companion.virtual.VirtualDeviceManager.VirtualDevice createVirtualDevice(int, @NonNull android.companion.virtual.VirtualDeviceParams); method @FlaggedApi("android.companion.virtual.flags.persistent_device_id_api") @Nullable public CharSequence getDisplayNameForPersistentDeviceId(@NonNull String); diff --git a/core/java/android/companion/virtual/VirtualDevice.java b/core/java/android/companion/virtual/VirtualDevice.java index d0c8be6ca896..97fa2ba2638d 100644 --- a/core/java/android/companion/virtual/VirtualDevice.java +++ b/core/java/android/companion/virtual/VirtualDevice.java @@ -17,11 +17,14 @@ package android.companion.virtual; import static android.companion.virtual.VirtualDeviceParams.DEVICE_POLICY_CUSTOM; +import static android.companion.virtual.VirtualDeviceParams.POLICY_TYPE_AUDIO; +import static android.companion.virtual.VirtualDeviceParams.POLICY_TYPE_CAMERA; import static android.companion.virtual.VirtualDeviceParams.POLICY_TYPE_SENSORS; import android.annotation.FlaggedApi; import android.annotation.NonNull; import android.annotation.Nullable; +import android.annotation.SystemApi; import android.companion.virtual.flags.Flags; import android.content.Context; import android.os.Parcel; @@ -164,6 +167,44 @@ public final class VirtualDevice implements Parcelable { } } + /** + * Returns whether this device may have custom audio input device. + * + * @hide + */ + @SystemApi + @FlaggedApi(Flags.FLAG_VDM_PUBLIC_APIS) + public boolean hasCustomAudioInputSupport() { + try { + return mVirtualDevice.getDevicePolicy(POLICY_TYPE_AUDIO) == DEVICE_POLICY_CUSTOM; + // TODO(b/291735254): also check for a custom audio injection mix for this device id. + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + + /** + * Returns whether this device may have custom cameras. + * + * <p>Returning {@code true} does not necessarily mean that this device has cameras, it only + * means that a {@link android.hardware.camera2.CameraManager} instance created from a + * {@link Context} associated with this device will return this device's cameras, if any.</p> + * + * @see Context#getDeviceId() + * @see Context#createDeviceContext(int) + * + * @hide + */ + @SystemApi + @FlaggedApi(Flags.FLAG_VDM_PUBLIC_APIS) + public boolean hasCustomCameraSupport() { + try { + return mVirtualDevice.getDevicePolicy(POLICY_TYPE_CAMERA) == DEVICE_POLICY_CUSTOM; + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + @Override public int describeContents() { return 0; diff --git a/services/tests/servicestests/src/com/android/server/companion/virtual/VirtualDeviceTest.java b/services/tests/servicestests/src/com/android/server/companion/virtual/VirtualDeviceTest.java index 07dd59d2e2d8..a4628ee3b52b 100644 --- a/services/tests/servicestests/src/com/android/server/companion/virtual/VirtualDeviceTest.java +++ b/services/tests/servicestests/src/com/android/server/companion/virtual/VirtualDeviceTest.java @@ -18,6 +18,8 @@ package com.android.server.companion.virtual; import static android.companion.virtual.VirtualDeviceParams.DEVICE_POLICY_CUSTOM; import static android.companion.virtual.VirtualDeviceParams.DEVICE_POLICY_DEFAULT; +import static android.companion.virtual.VirtualDeviceParams.POLICY_TYPE_AUDIO; +import static android.companion.virtual.VirtualDeviceParams.POLICY_TYPE_CAMERA; import static android.companion.virtual.VirtualDeviceParams.POLICY_TYPE_SENSORS; import static android.content.Context.DEVICE_ID_DEFAULT; import static android.content.Context.DEVICE_ID_INVALID; @@ -135,4 +137,34 @@ public class VirtualDeviceTest { when(mVirtualDevice.getDevicePolicy(POLICY_TYPE_SENSORS)).thenReturn(DEVICE_POLICY_CUSTOM); assertThat(virtualDevice.hasCustomSensorSupport()).isTrue(); } + + @Test + public void virtualDevice_hasCustomAudioInputSupport() throws Exception { + mSetFlagsRule.enableFlags(Flags.FLAG_VDM_PUBLIC_APIS); + + VirtualDevice virtualDevice = + new VirtualDevice( + mVirtualDevice, VIRTUAL_DEVICE_ID, /*persistentId=*/null, /*name=*/null); + + when(mVirtualDevice.getDevicePolicy(POLICY_TYPE_AUDIO)).thenReturn(DEVICE_POLICY_DEFAULT); + assertThat(virtualDevice.hasCustomAudioInputSupport()).isFalse(); + + when(mVirtualDevice.getDevicePolicy(POLICY_TYPE_AUDIO)).thenReturn(DEVICE_POLICY_CUSTOM); + assertThat(virtualDevice.hasCustomAudioInputSupport()).isTrue(); + } + + @Test + public void virtualDevice_hasCustomCameraSupport() throws Exception { + mSetFlagsRule.enableFlags(Flags.FLAG_VDM_PUBLIC_APIS); + + VirtualDevice virtualDevice = + new VirtualDevice( + mVirtualDevice, VIRTUAL_DEVICE_ID, /*persistentId=*/null, /*name=*/null); + + when(mVirtualDevice.getDevicePolicy(POLICY_TYPE_CAMERA)).thenReturn(DEVICE_POLICY_DEFAULT); + assertThat(virtualDevice.hasCustomCameraSupport()).isFalse(); + + when(mVirtualDevice.getDevicePolicy(POLICY_TYPE_CAMERA)).thenReturn(DEVICE_POLICY_CUSTOM); + assertThat(virtualDevice.hasCustomCameraSupport()).isTrue(); + } } |