summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Vladimir Komsiyski <vladokom@google.com> 2022-10-04 19:29:00 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2022-10-04 19:29:00 +0000
commit624334fd63937ccf2ed84f4fb4bafad4f349fd3f (patch)
treec852b31f0be56e2bd3b0ac9bbf291d66e7fdfb0b
parent0eef6a958a7ce89a10ae28ba3acf41f84bf521e1 (diff)
parent7b67b35997d6ac5b2a2b35964c43724b52044012 (diff)
Merge "Add a unique ID to a virtual device."
-rw-r--r--core/api/system-current.txt3
-rw-r--r--core/java/android/companion/virtual/IVirtualDevice.aidl5
-rw-r--r--core/java/android/companion/virtual/VirtualDeviceManager.java21
-rw-r--r--services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java41
-rw-r--r--services/companion/java/com/android/server/companion/virtual/VirtualDeviceManagerService.java10
-rw-r--r--services/tests/servicestests/src/com/android/server/companion/virtual/VirtualDeviceManagerServiceTest.java7
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