diff options
| author | 2022-10-04 19:29:00 +0000 | |
|---|---|---|
| committer | 2022-10-04 19:29:00 +0000 | |
| commit | 624334fd63937ccf2ed84f4fb4bafad4f349fd3f (patch) | |
| tree | c852b31f0be56e2bd3b0ac9bbf291d66e7fdfb0b | |
| parent | 0eef6a958a7ce89a10ae28ba3acf41f84bf521e1 (diff) | |
| parent | 7b67b35997d6ac5b2a2b35964c43724b52044012 (diff) | |
Merge "Add a unique ID to a virtual device."
6 files changed, 75 insertions, 12 deletions
diff --git a/core/api/system-current.txt b/core/api/system-current.txt index f221eca45337..dd85daaf65c2 100644 --- a/core/api/system-current.txt +++ b/core/api/system-current.txt @@ -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); diff --git a/core/java/android/companion/virtual/IVirtualDevice.aidl b/core/java/android/companion/virtual/IVirtualDevice.aidl index 9c99da52d962..e7f191665302 100644 --- a/core/java/android/companion/virtual/IVirtualDevice.aidl +++ b/core/java/android/companion/virtual/IVirtualDevice.aidl @@ -43,6 +43,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. */ void close(); diff --git a/core/java/android/companion/virtual/VirtualDeviceManager.java b/core/java/android/companion/virtual/VirtualDeviceManager.java index fadfa5cd68a5..08bee2552a1f 100644 --- a/core/java/android/companion/virtual/VirtualDeviceManager.java +++ b/core/java/android/companion/virtual/VirtualDeviceManager.java @@ -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( @@ -204,6 +214,17 @@ public final class VirtualDeviceManager { } /** + * 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. * * @param displayId The display to launch the pending intent on. This display must be 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 4204162f3d98..5f27f598ee4e 100644 --- a/services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java +++ b/services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java @@ -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(); diff --git a/services/companion/java/com/android/server/companion/virtual/VirtualDeviceManagerService.java b/services/companion/java/com/android/server/companion/virtual/VirtualDeviceManagerService.java index 2b644fe8f7ba..06dfeabfe832 100644 --- a/services/companion/java/com/android/server/companion/virtual/VirtualDeviceManagerService.java +++ b/services/companion/java/com/android/server/companion/virtual/VirtualDeviceManagerService.java @@ -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) { diff --git a/services/tests/servicestests/src/com/android/server/companion/virtual/VirtualDeviceManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/companion/virtual/VirtualDeviceManagerServiceTest.java index 57ded9905273..6388c7d52f10 100644 --- a/services/tests/servicestests/src/com/android/server/companion/virtual/VirtualDeviceManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/companion/virtual/VirtualDeviceManagerServiceTest.java @@ -236,10 +236,9 @@ public class VirtualDeviceManagerServiceTest { .setBlockedActivities(getBlockedActivities()) .build(); mDeviceImpl = new VirtualDeviceImpl(mContext, - mAssociationInfo, new Binder(), /* uid */ 0, mInputController, - (int associationId) -> { - }, mPendingTrampolineCallback, mActivityListener, mRunningAppsChangedCallback, - params); + mAssociationInfo, new Binder(), /* ownerUid */ 0, /* uniqueId */ 1, + mInputController, (int associationId) -> {}, mPendingTrampolineCallback, + mActivityListener, mRunningAppsChangedCallback, params); } @Test |