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

Commit 5a230697 authored by Biswarup Pal's avatar Biswarup Pal
Browse files

Improve virtual camera VDM implementation

- Add hidden API to get virtual camera id
- Avoid binder call inside VirtualCamera constructor
- Also, add CtsVirtualDevicesCameraTestCases to VDM
postsubmit

Test: atest CtsVirtualDevicesCameraTestCases
Bug: 310857519
Change-Id: Id8fcc802ae1561f2ffd5c38f763ee665364accde
parent e53abfbf
Loading
Loading
Loading
Loading
+6 −0
Original line number Original line Diff line number Diff line
@@ -246,4 +246,10 @@ interface IVirtualDevice {
     */
     */
    @EnforcePermission("CREATE_VIRTUAL_DEVICE")
    @EnforcePermission("CREATE_VIRTUAL_DEVICE")
    void unregisterVirtualCamera(in VirtualCameraConfig camera);
    void unregisterVirtualCamera(in VirtualCameraConfig camera);

    /**
     * Returns the id of the virtual camera with given config.
     */
    @EnforcePermission("CREATE_VIRTUAL_DEVICE")
    int getVirtualCameraId(in VirtualCameraConfig camera);
}
}
+8 −2
Original line number Original line Diff line number Diff line
@@ -19,6 +19,7 @@ package android.companion.virtual;
import android.annotation.CallbackExecutor;
import android.annotation.CallbackExecutor;
import android.annotation.NonNull;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.Nullable;
import android.annotation.RequiresPermission;
import android.annotation.UserIdInt;
import android.annotation.UserIdInt;
import android.app.PendingIntent;
import android.app.PendingIntent;
import android.companion.virtual.audio.VirtualAudioDevice;
import android.companion.virtual.audio.VirtualAudioDevice;
@@ -340,12 +341,17 @@ public class VirtualDeviceInternal {
        return mVirtualAudioDevice;
        return mVirtualAudioDevice;
    }
    }


    @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
    @NonNull
    @NonNull
    VirtualCamera createVirtualCamera(@NonNull VirtualCameraConfig config) {
    VirtualCamera createVirtualCamera(@NonNull VirtualCameraConfig config) {
        try {
            mVirtualDevice.registerVirtualCamera(config);
            return new VirtualCamera(mVirtualDevice, config);
            return new VirtualCamera(mVirtualDevice, config);
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
    }
    }


    @NonNull
    void setShowPointerIcon(boolean showPointerIcon) {
    void setShowPointerIcon(boolean showPointerIcon) {
        try {
        try {
            mVirtualDevice.setShowPointerIcon(showPointerIcon);
            mVirtualDevice.setShowPointerIcon(showPointerIcon);
+15 −8
Original line number Original line Diff line number Diff line
@@ -66,15 +66,8 @@ public final class VirtualCamera implements Closeable {
    @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
    @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
    public VirtualCamera(
    public VirtualCamera(
            @NonNull IVirtualDevice virtualDevice, @NonNull VirtualCameraConfig config) {
            @NonNull IVirtualDevice virtualDevice, @NonNull VirtualCameraConfig config) {
        mVirtualDevice = virtualDevice;
        mVirtualDevice = Objects.requireNonNull(virtualDevice);
        mConfig = Objects.requireNonNull(config);
        mConfig = Objects.requireNonNull(config);
        Objects.requireNonNull(virtualDevice);
        // TODO(b/310857519): Avoid registration inside constructor.
        try {
            mVirtualDevice.registerVirtualCamera(config);
        } catch (RemoteException e) {
            e.rethrowFromSystemServer();
        }
    }
    }


    /** Returns the configuration of this virtual camera instance. */
    /** Returns the configuration of this virtual camera instance. */
@@ -83,6 +76,20 @@ public final class VirtualCamera implements Closeable {
        return mConfig;
        return mConfig;
    }
    }


    /**
     * Returns the id of this virtual camera instance.
     * @hide
     */
    @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
    @NonNull
    public String getId() {
        try {
            return Integer.toString(mVirtualDevice.getVirtualCameraId(mConfig));
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
    }

    @Override
    @Override
    @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
    @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
    public void close() {
    public void close() {
+10 −0
Original line number Original line Diff line number Diff line
@@ -55,5 +55,15 @@
        }
        }
      ]
      ]
    }
    }
  ],
  "postsubmit": [
    {
      "name": "CtsVirtualDevicesCameraTestCases",
      "options": [
        {
          "exclude-annotation": "androidx.test.filters.FlakyTest"
        }
      ]
    }
  ]
  ]
}
}
+14 −2
Original line number Original line Diff line number Diff line
@@ -960,7 +960,7 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub
        if (mVirtualCameraController == null) {
        if (mVirtualCameraController == null) {
            throw new UnsupportedOperationException("Virtual camera controller is not available");
            throw new UnsupportedOperationException("Virtual camera controller is not available");
        }
        }
        mVirtualCameraController.registerCamera(Objects.requireNonNull(cameraConfig));
        mVirtualCameraController.registerCamera(cameraConfig);
    }
    }


    @Override // Binder call
    @Override // Binder call
@@ -972,7 +972,19 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub
        if (mVirtualCameraController == null) {
        if (mVirtualCameraController == null) {
            throw new UnsupportedOperationException("Virtual camera controller is not available");
            throw new UnsupportedOperationException("Virtual camera controller is not available");
        }
        }
        mVirtualCameraController.unregisterCamera(Objects.requireNonNull(cameraConfig));
        mVirtualCameraController.unregisterCamera(cameraConfig);
    }

    @Override // Binder call
    @EnforcePermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
    public int getVirtualCameraId(@NonNull VirtualCameraConfig cameraConfig)
            throws RemoteException {
        super.getVirtualCameraId_enforcePermission();
        Objects.requireNonNull(cameraConfig);
        if (mVirtualCameraController == null) {
            throw new UnsupportedOperationException("Virtual camera controller is not available");
        }
        return mVirtualCameraController.getCameraId(cameraConfig);
    }
    }


    @Override
    @Override
Loading