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

Commit 7b67b359 authored by Phill Hayers's avatar Phill Hayers Committed by Vladimir Komsiyski
Browse files

Add a unique ID to a virtual device.

This will be used in a later CL to allow virtual displays to be
associated with their virtual device.

Bug: 205343547
Test: atest VirtualDeviceManagerServiceTest

Change-Id: Ibbf5a8c834d5d7a7bac4816a0ea151adad4e7ea7
parent c65a42f8
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -2789,6 +2789,8 @@ package android.companion.virtual {
  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);
    field public static final int DEFAULT_DEVICE_ID = 0; // 0x0
    field public static final int INVALID_DEVICE_ID = -1; // 0xffffffff
    field public static final int LAUNCH_FAILURE_NO_ACTIVITY = 2; // 0x2
    field public static final int LAUNCH_FAILURE_PENDING_INTENT_CANCELED = 1; // 0x1
    field public static final int LAUNCH_SUCCESS = 0; // 0x0
@@ -2808,6 +2810,7 @@ package android.companion.virtual {
    method @NonNull @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE) public android.hardware.input.VirtualKeyboard createVirtualKeyboard(@NonNull android.hardware.display.VirtualDisplay, @NonNull String, int, int);
    method @NonNull @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE) public android.hardware.input.VirtualMouse createVirtualMouse(@NonNull android.hardware.display.VirtualDisplay, @NonNull String, int, int);
    method @NonNull @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE) public android.hardware.input.VirtualTouchscreen createVirtualTouchscreen(@NonNull android.hardware.display.VirtualDisplay, @NonNull String, int, int);
    method public int getDeviceId();
    method public void launchPendingIntent(int, @NonNull android.app.PendingIntent, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.IntConsumer);
    method public void removeActivityListener(@NonNull android.companion.virtual.VirtualDeviceManager.ActivityListener);
    method @NonNull @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE) public void setShowPointerIcon(boolean);
+5 −0
Original line number Diff line number Diff line
@@ -42,6 +42,11 @@ interface IVirtualDevice {
     */
    int getAssociationId();

    /**
     * Returns the unique device ID for this virtual device.
     */
    int getDeviceId();

    /**
     * Closes the virtual device and frees all associated resources.
     */
+21 −0
Original line number Diff line number Diff line
@@ -78,6 +78,16 @@ public final class VirtualDeviceManager {
                    | DisplayManager.VIRTUAL_DISPLAY_FLAG_SUPPORTS_TOUCH
                    | DisplayManager.VIRTUAL_DISPLAY_FLAG_OWN_DISPLAY_GROUP;

    /**
     * The default device ID, which is the ID of the primary (non-virtual) device.
     */
    public static final int DEFAULT_DEVICE_ID = 0;

    /**
     * Invalid device ID.
     */
    public static final int INVALID_DEVICE_ID = -1;

    /** @hide */
    @Retention(RetentionPolicy.SOURCE)
    @IntDef(
@@ -203,6 +213,17 @@ public final class VirtualDeviceManager {
                    mActivityListenerBinder);
        }

        /**
         * Returns the unique ID of this virtual device.
         */
        public int getDeviceId() {
            try {
                return mVirtualDevice.getDeviceId();
            } catch (RemoteException e) {
                throw e.rethrowFromSystemServer();
            }
        }

        /**
         * Launches a given pending intent on the give display ID.
         *
+35 −6
Original line number Diff line number Diff line
@@ -95,6 +95,7 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub
    private final AssociationInfo mAssociationInfo;
    private final PendingTrampolineCallback mPendingTrampolineCallback;
    private final int mOwnerUid;
    private final int mDeviceId;
    private final InputController mInputController;
    private VirtualAudioController mVirtualAudioController;
    @VisibleForTesting
@@ -140,19 +141,40 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub
    private final SparseArray<GenericWindowPolicyController> mWindowPolicyControllers =
            new SparseArray<>();

    VirtualDeviceImpl(Context context, AssociationInfo associationInfo,
            IBinder token, int ownerUid, OnDeviceCloseListener listener,
    VirtualDeviceImpl(
            Context context,
            AssociationInfo associationInfo,
            IBinder token,
            int ownerUid,
            int deviceId,
            OnDeviceCloseListener listener,
            PendingTrampolineCallback pendingTrampolineCallback,
            IVirtualDeviceActivityListener activityListener,
            Consumer<ArraySet<Integer>> runningAppsChangedCallback,
            VirtualDeviceParams params) {
        this(context, associationInfo, token, ownerUid, /* inputController= */ null, listener,
                pendingTrampolineCallback, activityListener, runningAppsChangedCallback, params);
        this(
                context,
                associationInfo,
                token,
                ownerUid,
                deviceId,
                /* inputController= */ null,
                listener,
                pendingTrampolineCallback,
                activityListener,
                runningAppsChangedCallback,
                params);
    }

    @VisibleForTesting
    VirtualDeviceImpl(Context context, AssociationInfo associationInfo, IBinder token,
            int ownerUid, InputController inputController, OnDeviceCloseListener listener,
    VirtualDeviceImpl(
            Context context,
            AssociationInfo associationInfo,
            IBinder token,
            int ownerUid,
            int deviceId,
            InputController inputController,
            OnDeviceCloseListener listener,
            PendingTrampolineCallback pendingTrampolineCallback,
            IVirtualDeviceActivityListener activityListener,
            Consumer<ArraySet<Integer>> runningAppsChangedCallback,
@@ -164,6 +186,7 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub
        mActivityListener = activityListener;
        mRunningAppsChangedCallback = runningAppsChangedCallback;
        mOwnerUid = ownerUid;
        mDeviceId = deviceId;
        mAppToken = token;
        mParams = params;
        if (inputController == null) {
@@ -199,6 +222,12 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub
        return mAssociationInfo.getDisplayName();
    }

    /** Returns the unique device ID of this device. */
    @Override // Binder call
    public int getDeviceId() {
        return mDeviceId;
    }

    @Override // Binder call
    public int getAssociationId() {
        return mAssociationInfo.getId();
+8 −2
Original line number Diff line number Diff line
@@ -60,12 +60,12 @@ import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicInteger;


@SuppressLint("LongLogTag")
public class VirtualDeviceManagerService extends SystemService {

    private static final boolean DEBUG = false;
    private static final String TAG = "VirtualDeviceManagerService";

    private final Object mVirtualDeviceManagerLock = new Object();
@@ -73,6 +73,10 @@ public class VirtualDeviceManagerService extends SystemService {
    private final VirtualDeviceManagerInternal mLocalService;
    private final Handler mHandler = new Handler(Looper.getMainLooper());
    private final PendingTrampolineMap mPendingTrampolines = new PendingTrampolineMap(mHandler);

    private static AtomicInteger sNextUniqueIndex = new AtomicInteger(
            VirtualDeviceManager.DEFAULT_DEVICE_ID + 1);

    /**
     * Mapping from user IDs to CameraAccessControllers.
     */
@@ -260,8 +264,10 @@ public class VirtualDeviceManagerService extends SystemService {
                final int userId = UserHandle.getUserId(callingUid);
                final CameraAccessController cameraAccessController =
                        mCameraAccessControllers.get(userId);
                final int uniqueId = sNextUniqueIndex.getAndIncrement();

                VirtualDeviceImpl virtualDevice = new VirtualDeviceImpl(getContext(),
                        associationInfo, token, callingUid,
                        associationInfo, token, callingUid, uniqueId,
                        new VirtualDeviceImpl.OnDeviceCloseListener() {
                            @Override
                            public void onClose(int associationId) {
Loading