Merge "Add a unique ID to a virtual device."

This commit is contained in:
Vladimir Komsiyski
2022-10-04 19:29:00 +00:00
committed by Android (Google) Code Review
6 changed files with 75 additions and 12 deletions

View File

@@ -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);

View File

@@ -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.
*/

View File

@@ -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.
*

View File

@@ -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();

View File

@@ -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) {

View File

@@ -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