Merge "Implement VDMInternal.isAppRunningOnAnyVirtualDevice"

This commit is contained in:
TreeHugger Robot
2021-12-16 22:07:08 +00:00
committed by Android (Google) Code Review
3 changed files with 50 additions and 5 deletions

View File

@@ -29,6 +29,7 @@ import android.os.Build;
import android.os.UserHandle;
import android.window.DisplayWindowPolicyController;
import java.util.HashSet;
import java.util.List;
@@ -45,6 +46,8 @@ class GenericWindowPolicyController extends DisplayWindowPolicyController {
@EnabledSince(targetSdkVersion = Build.VERSION_CODES.TIRAMISU)
public static final long ALLOW_SECURE_ACTIVITY_DISPLAY_ON_REMOTE_DEVICE = 201712607L;
@NonNull final HashSet<Integer> mRunningUids = new HashSet<>();
GenericWindowPolicyController(int windowFlags, int systemWindowFlags) {
setInterestedWindowFlags(windowFlags, systemWindowFlags);
}
@@ -89,6 +92,17 @@ class GenericWindowPolicyController extends DisplayWindowPolicyController {
@Override
public void onRunningAppsChanged(int[] runningUids) {
mRunningUids.clear();
for (int i = 0; i < runningUids.length; i++) {
mRunningUids.add(runningUids[i]);
}
}
/**
* Returns true if an app with the given UID has an activity running on the virtual display for
* this controller.
*/
boolean containsUid(int uid) {
return mRunningUids.contains(uid);
}
}

View File

@@ -32,6 +32,7 @@ import android.hardware.input.VirtualTouchEvent;
import android.os.Binder;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.SparseArray;
import android.window.DisplayWindowPolicyController;
import com.android.internal.annotations.VisibleForTesting;
@@ -50,12 +51,18 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub
private final Context mContext;
private final AssociationInfo mAssociationInfo;
private final int mOwnerUid;
private final GenericWindowPolicyController mGenericWindowPolicyController;
private final InputController mInputController;
@VisibleForTesting
final List<Integer> mVirtualDisplayIds = new ArrayList<>();
private final OnDeviceCloseListener mListener;
/**
* A mapping from the virtual display ID to its corresponding
* {@link GenericWindowPolicyController}.
*/
private final SparseArray<GenericWindowPolicyController> mWindowPolicyControllers =
new SparseArray<>();
VirtualDeviceImpl(Context context, AssociationInfo associationInfo,
IBinder token, int ownerUid, OnDeviceCloseListener listener) {
this(context, associationInfo, token, ownerUid, /* inputController= */ null, listener);
@@ -66,8 +73,6 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub
int ownerUid, InputController inputController, OnDeviceCloseListener listener) {
mContext = context;
mAssociationInfo = associationInfo;
mGenericWindowPolicyController = new GenericWindowPolicyController(FLAG_SECURE,
SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS);
mOwnerUid = ownerUid;
if (inputController == null) {
mInputController = new InputController(mVirtualDeviceLock);
@@ -257,7 +262,11 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub
"Virtual device already have a virtual display with ID " + displayId);
}
mVirtualDisplayIds.add(displayId);
return mGenericWindowPolicyController;
final GenericWindowPolicyController dwpc =
new GenericWindowPolicyController(FLAG_SECURE,
SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS);
mWindowPolicyControllers.put(displayId, dwpc);
return dwpc;
}
void onVirtualDisplayRemovedLocked(int displayId) {
@@ -266,12 +275,27 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub
"Virtual device doesn't have a virtual display with ID " + displayId);
}
mVirtualDisplayIds.remove(displayId);
mWindowPolicyControllers.remove(displayId);
}
int getOwnerUid() {
return mOwnerUid;
}
/**
* Returns true if an app with the given {@code uid} is currently running on this virtual
* device.
*/
boolean isAppRunningOnVirtualDevice(int uid) {
final int size = mWindowPolicyControllers.size();
for (int i = 0; i < size; i++) {
if (mWindowPolicyControllers.valueAt(i).containsUid(uid)) {
return true;
}
}
return false;
}
interface OnDeviceCloseListener {
void onClose(int associationId);
}

View File

@@ -252,7 +252,14 @@ public class VirtualDeviceManagerService extends SystemService {
@Override
public boolean isAppRunningOnAnyVirtualDevice(int uid) {
// TODO(yukl): Implement this using DWPC.onRunningAppsChanged
synchronized (mVirtualDeviceManagerLock) {
int size = mVirtualDevices.size();
for (int i = 0; i < size; i++) {
if (mVirtualDevices.valueAt(i).isAppRunningOnVirtualDevice(uid)) {
return true;
}
}
}
return false;
}
}