Loading core/api/system-current.txt +5 −0 Original line number Original line Diff line number Diff line Loading @@ -3209,6 +3209,11 @@ package android.companion { package android.companion.virtual { 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 { 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 @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") @NonNull public java.util.Set<java.lang.String> getAllPersistentDeviceIds(); method @FlaggedApi("android.companion.virtual.flags.persistent_device_id_api") @NonNull public java.util.Set<java.lang.String> getAllPersistentDeviceIds(); core/java/android/companion/virtual/VirtualDevice.java +41 −0 Original line number Original line Diff line number Diff line Loading @@ -17,11 +17,14 @@ package android.companion.virtual; package android.companion.virtual; import static android.companion.virtual.VirtualDeviceParams.DEVICE_POLICY_CUSTOM; 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 static android.companion.virtual.VirtualDeviceParams.POLICY_TYPE_SENSORS; import android.annotation.FlaggedApi; import android.annotation.FlaggedApi; import android.annotation.NonNull; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.Nullable; import android.annotation.SystemApi; import android.companion.virtual.flags.Flags; import android.companion.virtual.flags.Flags; import android.content.Context; import android.content.Context; import android.os.Parcel; import android.os.Parcel; Loading Loading @@ -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 @Override public int describeContents() { public int describeContents() { return 0; return 0; Loading services/tests/servicestests/src/com/android/server/companion/virtual/VirtualDeviceTest.java +32 −0 Original line number Original line Diff line number Diff line Loading @@ -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_CUSTOM; import static android.companion.virtual.VirtualDeviceParams.DEVICE_POLICY_DEFAULT; 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.companion.virtual.VirtualDeviceParams.POLICY_TYPE_SENSORS; import static android.content.Context.DEVICE_ID_DEFAULT; import static android.content.Context.DEVICE_ID_DEFAULT; import static android.content.Context.DEVICE_ID_INVALID; import static android.content.Context.DEVICE_ID_INVALID; Loading Loading @@ -135,4 +137,34 @@ public class VirtualDeviceTest { when(mVirtualDevice.getDevicePolicy(POLICY_TYPE_SENSORS)).thenReturn(DEVICE_POLICY_CUSTOM); when(mVirtualDevice.getDevicePolicy(POLICY_TYPE_SENSORS)).thenReturn(DEVICE_POLICY_CUSTOM); assertThat(virtualDevice.hasCustomSensorSupport()).isTrue(); 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(); } } } Loading
core/api/system-current.txt +5 −0 Original line number Original line Diff line number Diff line Loading @@ -3209,6 +3209,11 @@ package android.companion { package android.companion.virtual { 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 { 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 @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") @NonNull public java.util.Set<java.lang.String> getAllPersistentDeviceIds(); method @FlaggedApi("android.companion.virtual.flags.persistent_device_id_api") @NonNull public java.util.Set<java.lang.String> getAllPersistentDeviceIds();
core/java/android/companion/virtual/VirtualDevice.java +41 −0 Original line number Original line Diff line number Diff line Loading @@ -17,11 +17,14 @@ package android.companion.virtual; package android.companion.virtual; import static android.companion.virtual.VirtualDeviceParams.DEVICE_POLICY_CUSTOM; 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 static android.companion.virtual.VirtualDeviceParams.POLICY_TYPE_SENSORS; import android.annotation.FlaggedApi; import android.annotation.FlaggedApi; import android.annotation.NonNull; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.Nullable; import android.annotation.SystemApi; import android.companion.virtual.flags.Flags; import android.companion.virtual.flags.Flags; import android.content.Context; import android.content.Context; import android.os.Parcel; import android.os.Parcel; Loading Loading @@ -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 @Override public int describeContents() { public int describeContents() { return 0; return 0; Loading
services/tests/servicestests/src/com/android/server/companion/virtual/VirtualDeviceTest.java +32 −0 Original line number Original line Diff line number Diff line Loading @@ -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_CUSTOM; import static android.companion.virtual.VirtualDeviceParams.DEVICE_POLICY_DEFAULT; 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.companion.virtual.VirtualDeviceParams.POLICY_TYPE_SENSORS; import static android.content.Context.DEVICE_ID_DEFAULT; import static android.content.Context.DEVICE_ID_DEFAULT; import static android.content.Context.DEVICE_ID_INVALID; import static android.content.Context.DEVICE_ID_INVALID; Loading Loading @@ -135,4 +137,34 @@ public class VirtualDeviceTest { when(mVirtualDevice.getDevicePolicy(POLICY_TYPE_SENSORS)).thenReturn(DEVICE_POLICY_CUSTOM); when(mVirtualDevice.getDevicePolicy(POLICY_TYPE_SENSORS)).thenReturn(DEVICE_POLICY_CUSTOM); assertThat(virtualDevice.hasCustomSensorSupport()).isTrue(); 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(); } } }