summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Timothy Yiu <tyiu@google.com> 2024-06-20 14:37:27 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2024-06-20 14:37:27 +0000
commit28632ca3383014be2b9f93228265bf9abc04e4a2 (patch)
tree26c1a953c57a27e6c79cba5396b4e8fdfcabe828
parent2f77941d3a019346220cb08e37f35ee975857322 (diff)
parent9ac1adbd17278fc5eeac074d5a75c09e20f8ec03 (diff)
Merge "Add support for disabling VDM" into main
-rw-r--r--core/java/android/app/ContextImpl.java32
-rw-r--r--core/java/android/hardware/Camera.java4
-rw-r--r--core/java/android/hardware/camera2/CameraManager.java4
-rw-r--r--core/java/android/permission/PermissionUsageHelper.java24
-rw-r--r--media/java/android/media/AudioManager.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/display/domain/interactor/ConnectedDisplayInteractor.kt3
-rw-r--r--services/companion/java/com/android/server/companion/virtual/CameraAccessController.java3
-rw-r--r--services/companion/java/com/android/server/companion/virtual/SensorController.java8
-rw-r--r--services/core/java/com/android/server/clipboard/ClipboardService.java11
-rw-r--r--services/core/java/com/android/server/display/DisplayManagerService.java20
-rw-r--r--services/core/java/com/android/server/pm/permission/PermissionManagerService.java4
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