Loading services/companion/java/com/android/server/companion/virtual/GenericWindowPolicyController.java +14 −0 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ import android.os.Build; import android.os.UserHandle; import android.window.DisplayWindowPolicyController; import java.util.HashSet; import java.util.List; Loading @@ -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); } Loading Loading @@ -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); } } services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java +28 −4 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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); Loading @@ -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); Loading Loading @@ -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) { Loading @@ -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); } Loading services/companion/java/com/android/server/companion/virtual/VirtualDeviceManagerService.java +8 −1 Original line number Diff line number Diff line Loading @@ -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; } } Loading Loading
services/companion/java/com/android/server/companion/virtual/GenericWindowPolicyController.java +14 −0 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ import android.os.Build; import android.os.UserHandle; import android.window.DisplayWindowPolicyController; import java.util.HashSet; import java.util.List; Loading @@ -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); } Loading Loading @@ -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); } }
services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java +28 −4 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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); Loading @@ -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); Loading Loading @@ -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) { Loading @@ -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); } Loading
services/companion/java/com/android/server/companion/virtual/VirtualDeviceManagerService.java +8 −1 Original line number Diff line number Diff line Loading @@ -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; } } Loading