Loading services/companion/java/com/android/server/companion/virtual/CameraAccessController.java +4 −0 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ package com.android.server.companion.virtual; import static android.hardware.camera2.CameraInjectionSession.InjectionStatusCallback.ERROR_INJECTION_UNSUPPORTED; import android.annotation.NonNull; import android.annotation.RequiresPermission; import android.annotation.UserIdInt; import android.content.Context; import android.content.pm.ApplicationInfo; Loading Loading @@ -146,6 +147,7 @@ class CameraAccessController extends CameraManager.AvailabilityCallback implemen * * @param runningUids uids of the application running on the virtual display */ @RequiresPermission(android.Manifest.permission.CAMERA_INJECT_EXTERNAL_CAMERA) public void blockCameraAccessIfNeeded(Set<Integer> runningUids) { synchronized (mLock) { for (int i = 0; i < mAppsToBlockOnVirtualDevice.size(); i++) { Loading Loading @@ -181,6 +183,7 @@ class CameraAccessController extends CameraManager.AvailabilityCallback implemen } @Override @RequiresPermission(android.Manifest.permission.CAMERA_INJECT_EXTERNAL_CAMERA) public void onCameraOpened(@NonNull String cameraId, @NonNull String packageName) { synchronized (mLock) { InjectionSessionData data = mPackageToSessionData.get(packageName); Loading Loading @@ -243,6 +246,7 @@ class CameraAccessController extends CameraManager.AvailabilityCallback implemen /** * Turns on blocking for a particular camera and package. */ @RequiresPermission(android.Manifest.permission.CAMERA_INJECT_EXTERNAL_CAMERA) private void startBlocking(String packageName, String cameraId) { try { Slog.d( Loading services/companion/java/com/android/server/companion/virtual/InputController.java +3 −1 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ package com.android.server.companion.virtual; import static android.text.TextUtils.formatSimple; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.StringDef; Loading Loading @@ -350,7 +352,7 @@ class InputController { } private static String createPhys(@PhysType String type) { return String.format("virtual%s:%d", type, sNextPhysId.getAndIncrement()); return formatSimple("virtual%s:%d", type, sNextPhysId.getAndIncrement()); } private void setUniqueIdAssociation(int displayId, String phys) { Loading services/companion/java/com/android/server/companion/virtual/SensorController.java +0 −3 Original line number Diff line number Diff line Loading @@ -323,8 +323,5 @@ public class SensorController { SensorCreationException(String message) { super(message); } SensorCreationException(String message, Exception cause) { super(message, cause); } } } services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java +15 −10 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ import static android.view.WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTE import android.annotation.EnforcePermission; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.RequiresPermission; import android.annotation.StringRes; import android.annotation.UserIdInt; import android.app.Activity; Loading Loading @@ -78,12 +79,14 @@ import android.os.UserHandle; import android.os.UserManager; import android.util.ArrayMap; import android.util.ArraySet; import android.util.IntArray; import android.util.Slog; import android.util.SparseArray; import android.view.Display; import android.view.WindowManager; import android.widget.Toast; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.app.BlockedAppStreamingActivity; Loading @@ -93,7 +96,6 @@ import com.android.server.companion.virtual.audio.VirtualAudioController; import java.io.FileDescriptor; import java.io.PrintWriter; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Objects; Loading Loading @@ -460,6 +462,7 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub } @Override @RequiresPermission(android.Manifest.permission.CAMERA_INJECT_EXTERNAL_CAMERA) public void onRunningAppsChanged(ArraySet<Integer> runningUids) { mCameraAccessController.blockCameraAccessIfNeeded(runningUids); mRunningAppsChangedCallback.accept(runningUids); Loading Loading @@ -718,11 +721,9 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub try { synchronized (mVirtualDeviceLock) { mDefaultShowPointerIcon = showPointerIcon; for (int i = 0; i < mVirtualDisplays.size(); i++) { final int displayId = mVirtualDisplays.keyAt(i); mInputController.setShowPointerIcon(mDefaultShowPointerIcon, displayId); } } getDisplayIds().forEach( displayId -> mInputController.setShowPointerIcon(showPointerIcon, displayId)); } finally { Binder.restoreCallingIdentity(ident); } Loading Loading @@ -830,6 +831,7 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub this, gwpc, packageName); gwpc.setDisplayId(displayId); boolean showPointer; synchronized (mVirtualDeviceLock) { if (mVirtualDisplays.contains(displayId)) { gwpc.unregisterRunningAppsChangedListener(this); Loading @@ -839,11 +841,12 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub PowerManager.WakeLock wakeLock = createAndAcquireWakeLockForDisplay(displayId); mVirtualDisplays.put(displayId, new VirtualDisplayWrapper(callback, gwpc, wakeLock)); showPointer = mDefaultShowPointerIcon; } final long token = Binder.clearCallingIdentity(); try { mInputController.setShowPointerIcon(mDefaultShowPointerIcon, displayId); mInputController.setShowPointerIcon(showPointer, displayId); mInputController.setPointerAcceleration(1f, displayId); mInputController.setDisplayEligibilityForPointerCapture(/* isEligible= */ false, displayId); Loading @@ -869,6 +872,7 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub } } @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS) private void onActivityBlocked(int displayId, ActivityInfo activityInfo) { Intent intent = BlockedAppStreamingActivity.createIntent( activityInfo, mAssociationInfo.getDisplayName()); Loading Loading @@ -950,6 +954,7 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub } } @SuppressWarnings("AndroidFrameworkRequiresPermission") private void checkVirtualInputDeviceDisplayIdAssociation(int displayId) { if (mContext.checkCallingPermission(android.Manifest.permission.INJECT_EVENTS) == PackageManager.PERMISSION_GRANTED) { Loading Loading @@ -1031,8 +1036,8 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub */ void showToastWhereUidIsRunning(int uid, String text, @Toast.Duration int duration, Looper looper) { ArrayList<Integer> displayIdsForUid = getDisplayIdsWhereUidIsRunning(uid); if (displayIdsForUid.isEmpty()) { IntArray displayIdsForUid = getDisplayIdsWhereUidIsRunning(uid); if (displayIdsForUid.size() == 0) { return; } DisplayManager displayManager = mContext.getSystemService(DisplayManager.class); Loading @@ -1045,8 +1050,8 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub } } private ArrayList<Integer> getDisplayIdsWhereUidIsRunning(int uid) { ArrayList<Integer> displayIdsForUid = new ArrayList<>(); private IntArray getDisplayIdsWhereUidIsRunning(int uid) { IntArray displayIdsForUid = new IntArray(); synchronized (mVirtualDeviceLock) { for (int i = 0; i < mVirtualDisplays.size(); i++) { if (mVirtualDisplays.valueAt(i).getWindowPolicyController().containsUid(uid)) { Loading services/companion/java/com/android/server/companion/virtual/VirtualDeviceManagerService.java +5 −0 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ import static com.android.server.wm.ActivityInterceptorCallback.VIRTUAL_DEVICE_S import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.RequiresPermission; import android.annotation.SuppressLint; import android.app.ActivityOptions; import android.companion.AssociationInfo; Loading Loading @@ -96,6 +97,7 @@ public class VirtualDeviceManagerService extends SystemService { private final CompanionDeviceManager.OnAssociationsChangedListener mCdmAssociationListener = new CompanionDeviceManager.OnAssociationsChangedListener() { @Override @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE) public void onAssociationsChanged(@NonNull List<AssociationInfo> associations) { syncVirtualDevicesToCdmAssociations(associations); } Loading Loading @@ -241,6 +243,7 @@ public class VirtualDeviceManagerService extends SystemService { return true; } @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE) private void syncVirtualDevicesToCdmAssociations(List<AssociationInfo> associations) { Set<VirtualDeviceImpl> virtualDevicesToRemove = new HashSet<>(); synchronized (mVirtualDeviceManagerLock) { Loading @@ -266,6 +269,7 @@ public class VirtualDeviceManagerService extends SystemService { } } @RequiresPermission(android.Manifest.permission.MANAGE_COMPANION_DEVICES) private void registerCdmAssociationListener() { final CompanionDeviceManager cdm = getContext().getSystemService( CompanionDeviceManager.class); Loading @@ -273,6 +277,7 @@ public class VirtualDeviceManagerService extends SystemService { mCdmAssociationListener); } @RequiresPermission(android.Manifest.permission.MANAGE_COMPANION_DEVICES) private void unregisterCdmAssociationListener() { final CompanionDeviceManager cdm = getContext().getSystemService( CompanionDeviceManager.class); Loading Loading
services/companion/java/com/android/server/companion/virtual/CameraAccessController.java +4 −0 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ package com.android.server.companion.virtual; import static android.hardware.camera2.CameraInjectionSession.InjectionStatusCallback.ERROR_INJECTION_UNSUPPORTED; import android.annotation.NonNull; import android.annotation.RequiresPermission; import android.annotation.UserIdInt; import android.content.Context; import android.content.pm.ApplicationInfo; Loading Loading @@ -146,6 +147,7 @@ class CameraAccessController extends CameraManager.AvailabilityCallback implemen * * @param runningUids uids of the application running on the virtual display */ @RequiresPermission(android.Manifest.permission.CAMERA_INJECT_EXTERNAL_CAMERA) public void blockCameraAccessIfNeeded(Set<Integer> runningUids) { synchronized (mLock) { for (int i = 0; i < mAppsToBlockOnVirtualDevice.size(); i++) { Loading Loading @@ -181,6 +183,7 @@ class CameraAccessController extends CameraManager.AvailabilityCallback implemen } @Override @RequiresPermission(android.Manifest.permission.CAMERA_INJECT_EXTERNAL_CAMERA) public void onCameraOpened(@NonNull String cameraId, @NonNull String packageName) { synchronized (mLock) { InjectionSessionData data = mPackageToSessionData.get(packageName); Loading Loading @@ -243,6 +246,7 @@ class CameraAccessController extends CameraManager.AvailabilityCallback implemen /** * Turns on blocking for a particular camera and package. */ @RequiresPermission(android.Manifest.permission.CAMERA_INJECT_EXTERNAL_CAMERA) private void startBlocking(String packageName, String cameraId) { try { Slog.d( Loading
services/companion/java/com/android/server/companion/virtual/InputController.java +3 −1 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ package com.android.server.companion.virtual; import static android.text.TextUtils.formatSimple; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.StringDef; Loading Loading @@ -350,7 +352,7 @@ class InputController { } private static String createPhys(@PhysType String type) { return String.format("virtual%s:%d", type, sNextPhysId.getAndIncrement()); return formatSimple("virtual%s:%d", type, sNextPhysId.getAndIncrement()); } private void setUniqueIdAssociation(int displayId, String phys) { Loading
services/companion/java/com/android/server/companion/virtual/SensorController.java +0 −3 Original line number Diff line number Diff line Loading @@ -323,8 +323,5 @@ public class SensorController { SensorCreationException(String message) { super(message); } SensorCreationException(String message, Exception cause) { super(message, cause); } } }
services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java +15 −10 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ import static android.view.WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTE import android.annotation.EnforcePermission; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.RequiresPermission; import android.annotation.StringRes; import android.annotation.UserIdInt; import android.app.Activity; Loading Loading @@ -78,12 +79,14 @@ import android.os.UserHandle; import android.os.UserManager; import android.util.ArrayMap; import android.util.ArraySet; import android.util.IntArray; import android.util.Slog; import android.util.SparseArray; import android.view.Display; import android.view.WindowManager; import android.widget.Toast; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.app.BlockedAppStreamingActivity; Loading @@ -93,7 +96,6 @@ import com.android.server.companion.virtual.audio.VirtualAudioController; import java.io.FileDescriptor; import java.io.PrintWriter; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Objects; Loading Loading @@ -460,6 +462,7 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub } @Override @RequiresPermission(android.Manifest.permission.CAMERA_INJECT_EXTERNAL_CAMERA) public void onRunningAppsChanged(ArraySet<Integer> runningUids) { mCameraAccessController.blockCameraAccessIfNeeded(runningUids); mRunningAppsChangedCallback.accept(runningUids); Loading Loading @@ -718,11 +721,9 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub try { synchronized (mVirtualDeviceLock) { mDefaultShowPointerIcon = showPointerIcon; for (int i = 0; i < mVirtualDisplays.size(); i++) { final int displayId = mVirtualDisplays.keyAt(i); mInputController.setShowPointerIcon(mDefaultShowPointerIcon, displayId); } } getDisplayIds().forEach( displayId -> mInputController.setShowPointerIcon(showPointerIcon, displayId)); } finally { Binder.restoreCallingIdentity(ident); } Loading Loading @@ -830,6 +831,7 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub this, gwpc, packageName); gwpc.setDisplayId(displayId); boolean showPointer; synchronized (mVirtualDeviceLock) { if (mVirtualDisplays.contains(displayId)) { gwpc.unregisterRunningAppsChangedListener(this); Loading @@ -839,11 +841,12 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub PowerManager.WakeLock wakeLock = createAndAcquireWakeLockForDisplay(displayId); mVirtualDisplays.put(displayId, new VirtualDisplayWrapper(callback, gwpc, wakeLock)); showPointer = mDefaultShowPointerIcon; } final long token = Binder.clearCallingIdentity(); try { mInputController.setShowPointerIcon(mDefaultShowPointerIcon, displayId); mInputController.setShowPointerIcon(showPointer, displayId); mInputController.setPointerAcceleration(1f, displayId); mInputController.setDisplayEligibilityForPointerCapture(/* isEligible= */ false, displayId); Loading @@ -869,6 +872,7 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub } } @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS) private void onActivityBlocked(int displayId, ActivityInfo activityInfo) { Intent intent = BlockedAppStreamingActivity.createIntent( activityInfo, mAssociationInfo.getDisplayName()); Loading Loading @@ -950,6 +954,7 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub } } @SuppressWarnings("AndroidFrameworkRequiresPermission") private void checkVirtualInputDeviceDisplayIdAssociation(int displayId) { if (mContext.checkCallingPermission(android.Manifest.permission.INJECT_EVENTS) == PackageManager.PERMISSION_GRANTED) { Loading Loading @@ -1031,8 +1036,8 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub */ void showToastWhereUidIsRunning(int uid, String text, @Toast.Duration int duration, Looper looper) { ArrayList<Integer> displayIdsForUid = getDisplayIdsWhereUidIsRunning(uid); if (displayIdsForUid.isEmpty()) { IntArray displayIdsForUid = getDisplayIdsWhereUidIsRunning(uid); if (displayIdsForUid.size() == 0) { return; } DisplayManager displayManager = mContext.getSystemService(DisplayManager.class); Loading @@ -1045,8 +1050,8 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub } } private ArrayList<Integer> getDisplayIdsWhereUidIsRunning(int uid) { ArrayList<Integer> displayIdsForUid = new ArrayList<>(); private IntArray getDisplayIdsWhereUidIsRunning(int uid) { IntArray displayIdsForUid = new IntArray(); synchronized (mVirtualDeviceLock) { for (int i = 0; i < mVirtualDisplays.size(); i++) { if (mVirtualDisplays.valueAt(i).getWindowPolicyController().containsUid(uid)) { Loading
services/companion/java/com/android/server/companion/virtual/VirtualDeviceManagerService.java +5 −0 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ import static com.android.server.wm.ActivityInterceptorCallback.VIRTUAL_DEVICE_S import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.RequiresPermission; import android.annotation.SuppressLint; import android.app.ActivityOptions; import android.companion.AssociationInfo; Loading Loading @@ -96,6 +97,7 @@ public class VirtualDeviceManagerService extends SystemService { private final CompanionDeviceManager.OnAssociationsChangedListener mCdmAssociationListener = new CompanionDeviceManager.OnAssociationsChangedListener() { @Override @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE) public void onAssociationsChanged(@NonNull List<AssociationInfo> associations) { syncVirtualDevicesToCdmAssociations(associations); } Loading Loading @@ -241,6 +243,7 @@ public class VirtualDeviceManagerService extends SystemService { return true; } @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE) private void syncVirtualDevicesToCdmAssociations(List<AssociationInfo> associations) { Set<VirtualDeviceImpl> virtualDevicesToRemove = new HashSet<>(); synchronized (mVirtualDeviceManagerLock) { Loading @@ -266,6 +269,7 @@ public class VirtualDeviceManagerService extends SystemService { } } @RequiresPermission(android.Manifest.permission.MANAGE_COMPANION_DEVICES) private void registerCdmAssociationListener() { final CompanionDeviceManager cdm = getContext().getSystemService( CompanionDeviceManager.class); Loading @@ -273,6 +277,7 @@ public class VirtualDeviceManagerService extends SystemService { mCdmAssociationListener); } @RequiresPermission(android.Manifest.permission.MANAGE_COMPANION_DEVICES) private void unregisterCdmAssociationListener() { final CompanionDeviceManager cdm = getContext().getSystemService( CompanionDeviceManager.class); Loading