diff options
| author | 2024-06-20 14:37:27 +0000 | |
|---|---|---|
| committer | 2024-06-20 14:37:27 +0000 | |
| commit | 28632ca3383014be2b9f93228265bf9abc04e4a2 (patch) | |
| tree | 26c1a953c57a27e6c79cba5396b4e8fdfcabe828 | |
| parent | 2f77941d3a019346220cb08e37f35ee975857322 (diff) | |
| parent | 9ac1adbd17278fc5eeac074d5a75c09e20f8ec03 (diff) | |
Merge "Add support for disabling VDM" into main
11 files changed, 78 insertions, 41 deletions
diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java index 3b9a5d3b2cf2..baed4fd02e5b 100644 --- a/core/java/android/app/ContextImpl.java +++ b/core/java/android/app/ContextImpl.java @@ -2303,19 +2303,26 @@ class ContextImpl extends Context { && PermissionManager.DEVICE_AWARE_PERMISSIONS.contains(permission)) { VirtualDeviceManager virtualDeviceManager = getSystemService(VirtualDeviceManager.class); - VirtualDevice virtualDevice = virtualDeviceManager.getVirtualDevice(deviceId); - if (virtualDevice != null) { - if ((Objects.equals(permission, Manifest.permission.RECORD_AUDIO) - && !virtualDevice.hasCustomAudioInputSupport()) - || (Objects.equals(permission, Manifest.permission.CAMERA) - && !virtualDevice.hasCustomCameraSupport())) { - deviceId = Context.DEVICE_ID_DEFAULT; - } - } else { + if (virtualDeviceManager == null) { Slog.e( TAG, - "virtualDevice is not found when device id is not default. deviceId = " + "VDM is not enabled when device id is not default. deviceId = " + deviceId); + } else { + VirtualDevice virtualDevice = virtualDeviceManager.getVirtualDevice(deviceId); + if (virtualDevice != null) { + if ((Objects.equals(permission, Manifest.permission.RECORD_AUDIO) + && !virtualDevice.hasCustomAudioInputSupport()) + || (Objects.equals(permission, Manifest.permission.CAMERA) + && !virtualDevice.hasCustomCameraSupport())) { + deviceId = Context.DEVICE_ID_DEFAULT; + } + } else { + Slog.e( + TAG, + "virtualDevice is not found when device id is not default. deviceId = " + + deviceId); + } } } @@ -3169,6 +3176,11 @@ class ContextImpl extends Context { public void updateDeviceId(int updatedDeviceId) { if (updatedDeviceId != Context.DEVICE_ID_DEFAULT) { VirtualDeviceManager vdm = getSystemService(VirtualDeviceManager.class); + if (vdm == null) { + throw new IllegalArgumentException( + "VDM is not enabled when updating to non-default device id: " + + updatedDeviceId); + } if (!vdm.isValidVirtualDeviceId(updatedDeviceId)) { throw new IllegalArgumentException( "Not a valid ID of the default device or any virtual device: " diff --git a/core/java/android/hardware/Camera.java b/core/java/android/hardware/Camera.java index 32d2a6f803d6..c2424e8a6529 100644 --- a/core/java/android/hardware/Camera.java +++ b/core/java/android/hardware/Camera.java @@ -347,7 +347,9 @@ public class Camera { VirtualDeviceManager virtualDeviceManager = context.getSystemService(VirtualDeviceManager.class); - return virtualDeviceManager.getDevicePolicy(context.getDeviceId(), POLICY_TYPE_CAMERA); + return virtualDeviceManager == null + ? DEVICE_POLICY_DEFAULT + : virtualDeviceManager.getDevicePolicy(context.getDeviceId(), POLICY_TYPE_CAMERA); } /** diff --git a/core/java/android/hardware/camera2/CameraManager.java b/core/java/android/hardware/camera2/CameraManager.java index 708f8a173aba..9eb97452444f 100644 --- a/core/java/android/hardware/camera2/CameraManager.java +++ b/core/java/android/hardware/camera2/CameraManager.java @@ -581,7 +581,9 @@ public final class CameraManager { if (mVirtualDeviceManager == null) { mVirtualDeviceManager = context.getSystemService(VirtualDeviceManager.class); } - return mVirtualDeviceManager.getDevicePolicy(context.getDeviceId(), POLICY_TYPE_CAMERA); + return mVirtualDeviceManager == null + ? DEVICE_POLICY_DEFAULT + : mVirtualDeviceManager.getDevicePolicy(context.getDeviceId(), POLICY_TYPE_CAMERA); } // TODO(b/147726300): Investigate how to support foldables/multi-display devices. diff --git a/core/java/android/permission/PermissionUsageHelper.java b/core/java/android/permission/PermissionUsageHelper.java index 141ffc9a491a..a698b180dbe0 100644 --- a/core/java/android/permission/PermissionUsageHelper.java +++ b/core/java/android/permission/PermissionUsageHelper.java @@ -374,20 +374,22 @@ public class PermissionUsageHelper implements AppOpsManager.OnOpActiveChangedLis public @NonNull List<PermissionGroupUsage> getOpUsageDataForAllDevices( boolean includeMicrophoneUsage) { List<PermissionGroupUsage> allUsages = new ArrayList<>(); - List<VirtualDevice> virtualDevices = mVirtualDeviceManager.getVirtualDevices(); - ArraySet<String> persistentDeviceIds = new ArraySet<>(); - for (int num = 0; num < virtualDevices.size(); num++) { - persistentDeviceIds.add(virtualDevices.get(num).getPersistentDeviceId()); - } - persistentDeviceIds.add(VirtualDeviceManager.PERSISTENT_DEVICE_ID_DEFAULT); + if (mVirtualDeviceManager != null) { + List<VirtualDevice> virtualDevices = mVirtualDeviceManager.getVirtualDevices(); + ArraySet<String> persistentDeviceIds = new ArraySet<>(); - for (int index = 0; index < persistentDeviceIds.size(); index++) { - allUsages.addAll( - getOpUsageDataByDevice(includeMicrophoneUsage, - persistentDeviceIds.valueAt(index))); - } + for (int num = 0; num < virtualDevices.size(); num++) { + persistentDeviceIds.add(virtualDevices.get(num).getPersistentDeviceId()); + } + persistentDeviceIds.add(VirtualDeviceManager.PERSISTENT_DEVICE_ID_DEFAULT); + for (int index = 0; index < persistentDeviceIds.size(); index++) { + allUsages.addAll( + getOpUsageDataByDevice(includeMicrophoneUsage, + persistentDeviceIds.valueAt(index))); + } + } return allUsages; } diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java index 386a606c61c6..e134c23dfbca 100644 --- a/media/java/android/media/AudioManager.java +++ b/media/java/android/media/AudioManager.java @@ -4069,8 +4069,10 @@ public class AudioManager { private boolean delegateSoundEffectToVdm(@SystemSoundEffect int effectType) { if (hasCustomPolicyVirtualDeviceContext()) { VirtualDeviceManager vdm = getVirtualDeviceManager(); - vdm.playSoundEffect(mOriginalContextDeviceId, effectType); - return true; + if (vdm != null) { + vdm.playSoundEffect(mOriginalContextDeviceId, effectType); + return true; + } } return false; } diff --git a/packages/SystemUI/src/com/android/systemui/display/domain/interactor/ConnectedDisplayInteractor.kt b/packages/SystemUI/src/com/android/systemui/display/domain/interactor/ConnectedDisplayInteractor.kt index 73b7a8ac7bd3..e4b290d7d10e 100644 --- a/packages/SystemUI/src/com/android/systemui/display/domain/interactor/ConnectedDisplayInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/display/domain/interactor/ConnectedDisplayInteractor.kt @@ -85,7 +85,7 @@ interface ConnectedDisplayInteractor { class ConnectedDisplayInteractorImpl @Inject constructor( - private val virtualDeviceManager: VirtualDeviceManager, + private val virtualDeviceManager: VirtualDeviceManager?, keyguardRepository: KeyguardRepository, displayRepository: DisplayRepository, deviceStateRepository: DeviceStateRepository, @@ -156,6 +156,7 @@ constructor( private fun isVirtualDeviceOwnedMirrorDisplay(display: Display): Boolean { return Flags.interactiveScreenMirror() && + virtualDeviceManager != null && virtualDeviceManager.isVirtualDeviceOwnedMirrorDisplay(display.displayId) } } diff --git a/services/companion/java/com/android/server/companion/virtual/CameraAccessController.java b/services/companion/java/com/android/server/companion/virtual/CameraAccessController.java index ce4067cf3786..ef39846f4750 100644 --- a/services/companion/java/com/android/server/companion/virtual/CameraAccessController.java +++ b/services/companion/java/com/android/server/companion/virtual/CameraAccessController.java @@ -192,7 +192,8 @@ class CameraAccessController extends CameraManager.AvailabilityCallback implemen for (UserInfo user : aliveUsers) { int userId = user.getUserHandle().getIdentifier(); int appUid = queryUidFromPackageName(userId, packageName); - if (mVirtualDeviceManagerInternal.isAppRunningOnAnyVirtualDevice(appUid)) { + if (mVirtualDeviceManagerInternal != null + && mVirtualDeviceManagerInternal.isAppRunningOnAnyVirtualDevice(appUid)) { if (data == null) { data = new InjectionSessionData(); data.appUid = appUid; diff --git a/services/companion/java/com/android/server/companion/virtual/SensorController.java b/services/companion/java/com/android/server/companion/virtual/SensorController.java index cf4818060aa8..065568573558 100644 --- a/services/companion/java/com/android/server/companion/virtual/SensorController.java +++ b/services/companion/java/com/android/server/companion/virtual/SensorController.java @@ -229,6 +229,10 @@ public class SensorController { Slog.e(TAG, "No sensor callback configured for sensor handle " + handle); return BAD_VALUE; } + if (mVdmInternal == null) { + Slog.e(TAG, "Virtual Device Manager is not enabled."); + return BAD_VALUE; + } VirtualSensor sensor = mVdmInternal.getVirtualSensor(mVirtualDeviceId, handle); if (sensor == null) { Slog.e(TAG, "No sensor found for deviceId=" + mVirtualDeviceId @@ -285,6 +289,10 @@ public class SensorController { Slog.e(TAG, "No runtime sensor callback configured."); return BAD_VALUE; } + if (mVdmInternal == null) { + Slog.e(TAG, "Virtual Device Manager is not enabled."); + return BAD_VALUE; + } VirtualSensor sensor = mVdmInternal.getVirtualSensor(mVirtualDeviceId, sensorHandle); if (sensor == null) { Slog.e(TAG, "No sensor found for deviceId=" + mVirtualDeviceId diff --git a/services/core/java/com/android/server/clipboard/ClipboardService.java b/services/core/java/com/android/server/clipboard/ClipboardService.java index 0afca92d78f7..73aa14ba016f 100644 --- a/services/core/java/com/android/server/clipboard/ClipboardService.java +++ b/services/core/java/com/android/server/clipboard/ClipboardService.java @@ -251,7 +251,7 @@ public class ClipboardService extends SystemService { } private void registerVirtualDeviceListener() { - if (mVirtualDeviceListener != null) { + if (mVdm == null || mVirtualDeviceListener != null) { return; } mVirtualDeviceListener = new VirtualDeviceManager.VirtualDeviceListener() { @@ -891,7 +891,8 @@ public class ClipboardService extends SystemService { Slog.e(TAG, "RemoteException calling UserManager: " + e); return null; } - if (deviceId != DEVICE_ID_DEFAULT && !mVdm.isValidVirtualDeviceId(deviceId)) { + if (deviceId != DEVICE_ID_DEFAULT + && mVdm != null && !mVdm.isValidVirtualDeviceId(deviceId)) { Slog.w(TAG, "getClipboardLocked called with invalid (possibly released) deviceId " + deviceId); return null; @@ -1467,8 +1468,8 @@ public class ClipboardService extends SystemService { return; } // Don't notify if this access is coming from the privileged app which owns the device. - if (clipboard.deviceId != DEVICE_ID_DEFAULT && mVdmInternal.getDeviceOwnerUid( - clipboard.deviceId) == uid) { + if (clipboard.deviceId != DEVICE_ID_DEFAULT && mVdmInternal != null + && mVdmInternal.getDeviceOwnerUid(clipboard.deviceId) == uid) { return; } // Don't notify if already notified for this uid and clip. @@ -1519,7 +1520,7 @@ public class ClipboardService extends SystemService { private ArraySet<Context> getToastContexts(Clipboard clipboard) throws IllegalStateException { ArraySet<Context> contexts = new ArraySet<>(); - if (clipboard.deviceId != DEVICE_ID_DEFAULT) { + if (mVdmInternal != null && clipboard.deviceId != DEVICE_ID_DEFAULT) { DisplayManager displayManager = getContext().getSystemService(DisplayManager.class); int topFocusedDisplayId = mWm.getTopFocusedDisplayId(); diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java index 2d5f38e2dd8c..e686779e4ccd 100644 --- a/services/core/java/com/android/server/display/DisplayManagerService.java +++ b/services/core/java/com/android/server/display/DisplayManagerService.java @@ -1548,16 +1548,20 @@ public final class DisplayManagerService extends SystemService { int flags = virtualDisplayConfig.getFlags(); if (virtualDevice != null) { final VirtualDeviceManager vdm = mContext.getSystemService(VirtualDeviceManager.class); - try { - if (!vdm.isValidVirtualDeviceId(virtualDevice.getDeviceId())) { - throw new SecurityException("Invalid virtual device"); + if (vdm != null) { + try { + if (!vdm.isValidVirtualDeviceId(virtualDevice.getDeviceId())) { + throw new SecurityException("Invalid virtual device"); + } + } catch (RemoteException ex) { + throw new SecurityException("Unable to validate virtual device"); + } + final VirtualDeviceManagerInternal localVdm = + getLocalService(VirtualDeviceManagerInternal.class); + if (localVdm != null) { + flags |= localVdm.getBaseVirtualDisplayFlags(virtualDevice); } - } catch (RemoteException ex) { - throw new SecurityException("Unable to validate virtual device"); } - final VirtualDeviceManagerInternal localVdm = - getLocalService(VirtualDeviceManagerInternal.class); - flags |= localVdm.getBaseVirtualDisplayFlags(virtualDevice); } if (surface != null && surface.isSingleBuffered()) { diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java index 28254d0d863e..46e6546bbfca 100644 --- a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java +++ b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java @@ -274,7 +274,9 @@ public class PermissionManagerService extends IPermissionManager.Stub { mVirtualDeviceManagerInternal = LocalServices.getService(VirtualDeviceManagerInternal.class); } - return mVirtualDeviceManagerInternal.getPersistentIdForDevice(deviceId); + return mVirtualDeviceManagerInternal == null + ? VirtualDeviceManager.PERSISTENT_DEVICE_ID_DEFAULT + : mVirtualDeviceManagerInternal.getPersistentIdForDevice(deviceId); } @Override |