diff options
| author | 2024-03-20 18:01:18 +0000 | |
|---|---|---|
| committer | 2024-03-20 18:01:18 +0000 | |
| commit | aa1a3a62e3b9e8fb4f54e4f6d65506f1f0cc0e7c (patch) | |
| tree | c6cdc6b6e6b77d5f13913edabc27566b31bdb87f | |
| parent | f1481a36b2b12798489b656dfa1650388b0789df (diff) | |
| parent | cf4dd9aed626e803baeb3a35b12f06b739276254 (diff) | |
Merge "Fully implement VirtualDevice#hasCustomAudioInputSupport" into main
4 files changed, 45 insertions, 3 deletions
diff --git a/core/java/android/companion/virtual/IVirtualDevice.aidl b/core/java/android/companion/virtual/IVirtualDevice.aidl index 6eab363c4eb1..30a1135d6be4 100644 --- a/core/java/android/companion/virtual/IVirtualDevice.aidl +++ b/core/java/android/companion/virtual/IVirtualDevice.aidl @@ -79,6 +79,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. */ @EnforcePermission("CREATE_VIRTUAL_DEVICE") diff --git a/core/java/android/companion/virtual/VirtualDevice.java b/core/java/android/companion/virtual/VirtualDevice.java index 97fa2ba2638d..b9e9afea8893 100644 --- a/core/java/android/companion/virtual/VirtualDevice.java +++ b/core/java/android/companion/virtual/VirtualDevice.java @@ -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; @@ -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(); } diff --git a/services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java b/services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java index 8244d20e8e6a..3ec6e475179a 100644 --- a/services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java +++ b/services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java @@ -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; @@ -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; @@ -1063,6 +1066,37 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub } @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 = " "; fout.println(" VirtualDevice: "); 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 a4628ee3b52b..4d1d17f184d1 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 @@ -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( @@ -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(); } |