Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 784f9d32 authored by Vladimir Komsiyski's avatar Vladimir Komsiyski
Browse files

System API for virtual device's audio input and camera capabilities

Test: atest VirtualDeviceTest
Bug: 321033559
Change-Id: Ifb5753186c0da0ac9be49f6d5629bfe4de4bb2ab
parent 00d85796
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -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);
+41 −0
Original line number Diff line number Diff line
@@ -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;
+32 −0
Original line number Diff line number Diff line
@@ -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();
    }
}