Loading core/java/android/companion/virtual/IVirtualDevice.aidl +5 −0 Original line number Diff line number Diff line Loading @@ -78,6 +78,11 @@ interface IVirtualDevice { */ int getDevicePolicy(int policyType); /** * Returns whether the device has a valid microphone. */ boolean hasCustomAudioInputSupport(); /** * Closes the virtual device and frees all associated resources. */ Loading core/java/android/companion/virtual/VirtualDevice.java +1 −3 Original line number Diff line number Diff line Loading @@ -17,7 +17,6 @@ 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; Loading Loading @@ -176,8 +175,7 @@ public final class VirtualDevice implements Parcelable { @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. return mVirtualDevice.hasCustomAudioInputSupport(); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } Loading services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java +34 −0 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ import static android.companion.virtual.VirtualDeviceParams.ACTIVITY_POLICY_DEFA import static android.companion.virtual.VirtualDeviceParams.DEVICE_POLICY_DEFAULT; import static android.companion.virtual.VirtualDeviceParams.NAVIGATION_POLICY_DEFAULT_ALLOWED; import static android.companion.virtual.VirtualDeviceParams.POLICY_TYPE_ACTIVITY; 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_CLIPBOARD; import static android.companion.virtual.VirtualDeviceParams.POLICY_TYPE_RECENTS; Loading Loading @@ -82,6 +83,8 @@ import android.hardware.input.VirtualStylusConfig; import android.hardware.input.VirtualStylusMotionEvent; import android.hardware.input.VirtualTouchEvent; import android.hardware.input.VirtualTouchscreenConfig; import android.media.AudioManager; import android.media.audiopolicy.AudioMix; import android.os.Binder; import android.os.IBinder; import android.os.LocaleList; Loading Loading @@ -1062,6 +1065,37 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub return mVirtualCameraController.getCameraId(cameraConfig); } @Override public boolean hasCustomAudioInputSupport() throws RemoteException { if (!Flags.vdmPublicApis()) { return false; } if (!android.media.audiopolicy.Flags.audioMixTestApi()) { return false; } if (!android.media.audiopolicy.Flags.recordAudioDeviceAwarePermission()) { return false; } if (getDevicePolicy(POLICY_TYPE_AUDIO) == VirtualDeviceParams.DEVICE_POLICY_DEFAULT) { return false; } final long token = Binder.clearCallingIdentity(); try { AudioManager audioManager = mContext.getSystemService(AudioManager.class); for (AudioMix mix : audioManager.getRegisteredPolicyMixes()) { if (mix.matchesVirtualDeviceId(getDeviceId()) && mix.getMixType() == AudioMix.MIX_TYPE_RECORDERS) { return true; } } } finally { Binder.restoreCallingIdentity(token); } return false; } @Override protected void dump(FileDescriptor fd, PrintWriter fout, String[] args) { String indent = " "; Loading services/tests/servicestests/src/com/android/server/companion/virtual/VirtualDeviceTest.java +5 −0 Original line number Diff line number Diff line Loading @@ -141,6 +141,7 @@ public class VirtualDeviceTest { @Test public void virtualDevice_hasCustomAudioInputSupport() throws Exception { mSetFlagsRule.enableFlags(Flags.FLAG_VDM_PUBLIC_APIS); mSetFlagsRule.enableFlags(android.media.audiopolicy.Flags.FLAG_AUDIO_MIX_TEST_API); VirtualDevice virtualDevice = new VirtualDevice( Loading @@ -150,6 +151,10 @@ public class VirtualDeviceTest { assertThat(virtualDevice.hasCustomAudioInputSupport()).isFalse(); when(mVirtualDevice.getDevicePolicy(POLICY_TYPE_AUDIO)).thenReturn(DEVICE_POLICY_CUSTOM); when(mVirtualDevice.hasCustomAudioInputSupport()).thenReturn(false); assertThat(virtualDevice.hasCustomAudioInputSupport()).isFalse(); when(mVirtualDevice.hasCustomAudioInputSupport()).thenReturn(true); assertThat(virtualDevice.hasCustomAudioInputSupport()).isTrue(); } Loading Loading
core/java/android/companion/virtual/IVirtualDevice.aidl +5 −0 Original line number Diff line number Diff line Loading @@ -78,6 +78,11 @@ interface IVirtualDevice { */ int getDevicePolicy(int policyType); /** * Returns whether the device has a valid microphone. */ boolean hasCustomAudioInputSupport(); /** * Closes the virtual device and frees all associated resources. */ Loading
core/java/android/companion/virtual/VirtualDevice.java +1 −3 Original line number Diff line number Diff line Loading @@ -17,7 +17,6 @@ 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; Loading Loading @@ -176,8 +175,7 @@ public final class VirtualDevice implements Parcelable { @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. return mVirtualDevice.hasCustomAudioInputSupport(); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } Loading
services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java +34 −0 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ import static android.companion.virtual.VirtualDeviceParams.ACTIVITY_POLICY_DEFA import static android.companion.virtual.VirtualDeviceParams.DEVICE_POLICY_DEFAULT; import static android.companion.virtual.VirtualDeviceParams.NAVIGATION_POLICY_DEFAULT_ALLOWED; import static android.companion.virtual.VirtualDeviceParams.POLICY_TYPE_ACTIVITY; 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_CLIPBOARD; import static android.companion.virtual.VirtualDeviceParams.POLICY_TYPE_RECENTS; Loading Loading @@ -82,6 +83,8 @@ import android.hardware.input.VirtualStylusConfig; import android.hardware.input.VirtualStylusMotionEvent; import android.hardware.input.VirtualTouchEvent; import android.hardware.input.VirtualTouchscreenConfig; import android.media.AudioManager; import android.media.audiopolicy.AudioMix; import android.os.Binder; import android.os.IBinder; import android.os.LocaleList; Loading Loading @@ -1062,6 +1065,37 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub return mVirtualCameraController.getCameraId(cameraConfig); } @Override public boolean hasCustomAudioInputSupport() throws RemoteException { if (!Flags.vdmPublicApis()) { return false; } if (!android.media.audiopolicy.Flags.audioMixTestApi()) { return false; } if (!android.media.audiopolicy.Flags.recordAudioDeviceAwarePermission()) { return false; } if (getDevicePolicy(POLICY_TYPE_AUDIO) == VirtualDeviceParams.DEVICE_POLICY_DEFAULT) { return false; } final long token = Binder.clearCallingIdentity(); try { AudioManager audioManager = mContext.getSystemService(AudioManager.class); for (AudioMix mix : audioManager.getRegisteredPolicyMixes()) { if (mix.matchesVirtualDeviceId(getDeviceId()) && mix.getMixType() == AudioMix.MIX_TYPE_RECORDERS) { return true; } } } finally { Binder.restoreCallingIdentity(token); } return false; } @Override protected void dump(FileDescriptor fd, PrintWriter fout, String[] args) { String indent = " "; Loading
services/tests/servicestests/src/com/android/server/companion/virtual/VirtualDeviceTest.java +5 −0 Original line number Diff line number Diff line Loading @@ -141,6 +141,7 @@ public class VirtualDeviceTest { @Test public void virtualDevice_hasCustomAudioInputSupport() throws Exception { mSetFlagsRule.enableFlags(Flags.FLAG_VDM_PUBLIC_APIS); mSetFlagsRule.enableFlags(android.media.audiopolicy.Flags.FLAG_AUDIO_MIX_TEST_API); VirtualDevice virtualDevice = new VirtualDevice( Loading @@ -150,6 +151,10 @@ public class VirtualDeviceTest { assertThat(virtualDevice.hasCustomAudioInputSupport()).isFalse(); when(mVirtualDevice.getDevicePolicy(POLICY_TYPE_AUDIO)).thenReturn(DEVICE_POLICY_CUSTOM); when(mVirtualDevice.hasCustomAudioInputSupport()).thenReturn(false); assertThat(virtualDevice.hasCustomAudioInputSupport()).isFalse(); when(mVirtualDevice.hasCustomAudioInputSupport()).thenReturn(true); assertThat(virtualDevice.hasCustomAudioInputSupport()).isTrue(); } Loading