Loading core/java/android/companion/virtual/flags/flags.aconfig +8 −0 Original line number Diff line number Diff line Loading @@ -29,3 +29,11 @@ flag { bug: "291737188" is_fixed_read_only: true } flag { namespace: "virtual_devices" name: "metrics_collection" description: "Enable collection of VDM-related metrics" bug: "324842215" is_fixed_read_only: true } services/companion/java/com/android/server/companion/virtual/GenericWindowPolicyController.java +13 −0 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ import android.app.compat.CompatChanges; import android.companion.virtual.VirtualDeviceManager.ActivityListener; import android.compat.annotation.ChangeId; import android.compat.annotation.EnabledSince; import android.content.AttributionSource; import android.content.ComponentName; import android.content.Intent; import android.content.pm.ActivityInfo; Loading @@ -44,6 +45,7 @@ import android.window.DisplayWindowPolicyController; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.app.BlockedAppStreamingActivity; import com.android.modules.expresslog.Counter; import java.util.Set; Loading Loading @@ -104,6 +106,8 @@ public class GenericWindowPolicyController extends DisplayWindowPolicyController @EnabledSince(targetSdkVersion = Build.VERSION_CODES.TIRAMISU) public static final long ALLOW_SECURE_ACTIVITY_DISPLAY_ON_REMOTE_DEVICE = 201712607L; @NonNull private final AttributionSource mAttributionSource; @NonNull private final ArraySet<UserHandle> mAllowedUsers; @GuardedBy("mGenericWindowPolicyControllerLock") private boolean mActivityLaunchAllowedByDefault; Loading Loading @@ -144,6 +148,7 @@ public class GenericWindowPolicyController extends DisplayWindowPolicyController * * @param windowFlags The window flags that this controller is interested in. * @param systemWindowFlags The system window flags that this controller is interested in. * @param attributionSource The AttributionSource of the VirtualDevice owner application. * @param allowedUsers The set of users that are allowed to stream in this display. * @param activityLaunchAllowedByDefault Whether activities are default allowed to be launched * or blocked. Loading @@ -169,6 +174,7 @@ public class GenericWindowPolicyController extends DisplayWindowPolicyController public GenericWindowPolicyController( int windowFlags, int systemWindowFlags, AttributionSource attributionSource, @NonNull ArraySet<UserHandle> allowedUsers, boolean activityLaunchAllowedByDefault, @NonNull Set<ComponentName> activityPolicyExemptions, Loading @@ -184,6 +190,7 @@ public class GenericWindowPolicyController extends DisplayWindowPolicyController boolean showTasksInHostDeviceRecents, @Nullable ComponentName customHomeComponent) { super(); mAttributionSource = attributionSource; mAllowedUsers = allowedUsers; mActivityLaunchAllowedByDefault = activityLaunchAllowedByDefault; mActivityPolicyExemptions = activityPolicyExemptions; Loading Loading @@ -436,6 +443,12 @@ public class GenericWindowPolicyController extends DisplayWindowPolicyController if (!mIsMirrorDisplay && mActivityBlockedCallback != null) { mActivityBlockedCallback.onActivityBlocked(mDisplayId, activityInfo); } if (android.companion.virtualdevice.flags.Flags.metricsCollection()) { Counter.logIncrementWithUid( "virtual_devices.value_activity_blocked_count", mAttributionSource.getUid()); } } private static boolean isAllowedByPolicy(boolean allowedByDefault, Loading services/companion/java/com/android/server/companion/virtual/InputController.java +35 −2 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ import static android.text.TextUtils.formatSimple; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.StringDef; import android.content.AttributionSource; import android.graphics.PointF; import android.hardware.display.DisplayManagerInternal; import android.hardware.input.InputDeviceIdentifier; Loading @@ -38,6 +39,7 @@ import android.os.IBinder; import android.os.IInputConstants; import android.os.RemoteException; import android.util.ArrayMap; import android.util.Log; import android.util.Slog; import android.view.Display; import android.view.InputDevice; Loading @@ -45,6 +47,7 @@ import android.view.WindowManager; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.modules.expresslog.Counter; import com.android.server.LocalServices; import com.android.server.input.InputManagerInternal; Loading Loading @@ -98,11 +101,12 @@ class InputController { private final DisplayManagerInternal mDisplayManagerInternal; private final InputManagerInternal mInputManagerInternal; private final WindowManager mWindowManager; private final AttributionSource mAttributionSource; private final DeviceCreationThreadVerifier mThreadVerifier; InputController(@NonNull Handler handler, @NonNull WindowManager windowManager) { this(new NativeWrapper(), handler, windowManager, @NonNull WindowManager windowManager, AttributionSource attributionSource) { this(new NativeWrapper(), handler, windowManager, attributionSource, // Verify that virtual devices are not created on the handler thread. () -> !handler.getLooper().isCurrentThread()); } Loading @@ -110,12 +114,14 @@ class InputController { @VisibleForTesting InputController(@NonNull NativeWrapper nativeWrapper, @NonNull Handler handler, @NonNull WindowManager windowManager, AttributionSource attributionSource, @NonNull DeviceCreationThreadVerifier threadVerifier) { mHandler = handler; mNativeWrapper = nativeWrapper; mDisplayManagerInternal = LocalServices.getService(DisplayManagerInternal.class); mInputManagerInternal = LocalServices.getService(InputManagerInternal.class); mWindowManager = windowManager; mAttributionSource = attributionSource; mThreadVerifier = threadVerifier; } Loading Loading @@ -838,6 +844,33 @@ class InputController { new InputDeviceDescriptor(ptr, binderDeathRecipient, type, displayId, phys, deviceName, inputDeviceId)); } if (android.companion.virtualdevice.flags.Flags.metricsCollection()) { String metricId = getMetricIdForInputType(type); if (metricId != null) { Counter.logIncrementWithUid(metricId, mAttributionSource.getUid()); } } } private static String getMetricIdForInputType(@InputDeviceDescriptor.Type int type) { switch (type) { case InputDeviceDescriptor.TYPE_KEYBOARD: return "virtual_devices.value_virtual_keyboard_created_count"; case InputDeviceDescriptor.TYPE_MOUSE: return "virtual_devices.value_virtual_mouse_created_count"; case InputDeviceDescriptor.TYPE_TOUCHSCREEN: return "virtual_devices.value_virtual_touchscreen_created_count"; case InputDeviceDescriptor.TYPE_DPAD: return "virtual_devices.value_virtual_dpad_created_count"; case InputDeviceDescriptor.TYPE_NAVIGATION_TOUCHPAD: return "virtual_devices.value_virtual_navigationtouchpad_created_count"; case InputDeviceDescriptor.TYPE_STYLUS: return "virtual_devices.value_virtual_stylus_created_count"; default: Log.e(TAG, "No metric known for input type: " + type); return null; } } @VisibleForTesting Loading services/companion/java/com/android/server/companion/virtual/SensorController.java +11 −0 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ import android.companion.virtual.sensor.IVirtualSensorCallback; import android.companion.virtual.sensor.VirtualSensor; import android.companion.virtual.sensor.VirtualSensorConfig; import android.companion.virtual.sensor.VirtualSensorEvent; import android.content.AttributionSource; import android.hardware.SensorDirectChannel; import android.os.Binder; import android.os.IBinder; Loading @@ -35,6 +36,7 @@ import android.util.SparseArray; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.modules.expresslog.Counter; import com.android.server.LocalServices; import com.android.server.sensors.SensorManagerInternal; Loading Loading @@ -70,15 +72,19 @@ public class SensorController { @GuardedBy("mLock") private List<VirtualSensor> mVirtualSensorList = null; @NonNull private final AttributionSource mAttributionSource; @NonNull private final SensorManagerInternal.RuntimeSensorCallback mRuntimeSensorCallback; private final SensorManagerInternal mSensorManagerInternal; private final VirtualDeviceManagerInternal mVdmInternal; public SensorController(@NonNull IVirtualDevice virtualDevice, int virtualDeviceId, @NonNull AttributionSource attributionSource, @Nullable IVirtualSensorCallback virtualSensorCallback, @NonNull List<VirtualSensorConfig> sensors) { mVirtualDeviceId = virtualDeviceId; mAttributionSource = attributionSource; mRuntimeSensorCallback = new RuntimeSensorCallbackWrapper(virtualSensorCallback); mSensorManagerInternal = LocalServices.getService(SensorManagerInternal.class); mVdmInternal = LocalServices.getService(VirtualDeviceManagerInternal.class); Loading Loading @@ -139,6 +145,11 @@ public class SensorController { mSensorDescriptors.put(sensorToken, sensorDescriptor); mVirtualSensors.put(handle, sensor); } if (android.companion.virtualdevice.flags.Flags.metricsCollection()) { Counter.logIncrementWithUid( "virtual_devices.value_virtual_sensors_created_count", mAttributionSource.getUid()); } } boolean sendSensorEvent(@NonNull IBinder token, @NonNull VirtualSensorEvent event) { Loading services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java +20 −4 Original line number Diff line number Diff line Loading @@ -104,6 +104,7 @@ import android.widget.Toast; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.app.BlockedAppStreamingActivity; import com.android.modules.expresslog.Counter; import com.android.server.LocalServices; import com.android.server.companion.virtual.GenericWindowPolicyController.RunningAppsChangedListener; import com.android.server.companion.virtual.audio.VirtualAudioController; Loading Loading @@ -152,6 +153,8 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub private final int mOwnerUid; private final VirtualDeviceLog mVirtualDeviceLog; private final String mOwnerPackageName; @NonNull private final AttributionSource mAttributionSource; private final int mDeviceId; @Nullable private final String mPersistentDeviceId; Loading Loading @@ -288,6 +291,7 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub super(PermissionEnforcer.fromContext(context)); mVirtualDeviceLog = virtualDeviceLog; mOwnerPackageName = attributionSource.getPackageName(); mAttributionSource = attributionSource; UserHandle ownerUserHandle = UserHandle.getUserHandleForUid(attributionSource.getUid()); mContext = context.createContextAsUser(ownerUserHandle, 0); mAssociationInfo = associationInfo; Loading @@ -307,11 +311,11 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub if (inputController == null) { mInputController = new InputController( context.getMainThreadHandler(), context.getSystemService(WindowManager.class)); context.getSystemService(WindowManager.class), mAttributionSource); } else { mInputController = inputController; } mSensorController = new SensorController(this, mDeviceId, mSensorController = new SensorController(this, mDeviceId, mAttributionSource, mParams.getVirtualSensorCallback(), mParams.getVirtualSensorConfigs()); mCameraAccessController = cameraAccessController; if (mCameraAccessController != null) { Loading Loading @@ -620,7 +624,7 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub } if (mVirtualAudioController == null) { mVirtualAudioController = new VirtualAudioController(mContext); mVirtualAudioController = new VirtualAudioController(mContext, mAttributionSource); GenericWindowPolicyController gwpc = mVirtualDisplays.get( displayId).getWindowPolicyController(); mVirtualAudioController.startListening(gwpc, routingCallback, Loading Loading @@ -1028,7 +1032,7 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub if (mVirtualCameraController == null) { throw new UnsupportedOperationException("Virtual camera controller is not available"); } mVirtualCameraController.registerCamera(cameraConfig); mVirtualCameraController.registerCamera(cameraConfig, mAttributionSource); } @Override // Binder call Loading Loading @@ -1110,6 +1114,7 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub final GenericWindowPolicyController gwpc = new GenericWindowPolicyController( FLAG_SECURE, SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS, mAttributionSource, getAllowedUserHandles(), activityLaunchAllowedByDefault, mActivityPolicyExemptions, Loading Loading @@ -1179,6 +1184,11 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub Binder.restoreCallingIdentity(token); } if (android.companion.virtualdevice.flags.Flags.metricsCollection()) { Counter.logIncrementWithUid( "virtual_devices.value_virtual_display_created_count", mAttributionSource.getUid()); } return displayId; } Loading Loading @@ -1220,6 +1230,12 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub if ((display.getFlags() & FLAG_SECURE) == 0) { showToastWhereUidIsRunning(uid, com.android.internal.R.string.vdm_secure_window, Toast.LENGTH_LONG, mContext.getMainLooper()); if (android.companion.virtualdevice.flags.Flags.metricsCollection()) { Counter.logIncrementWithUid( "virtual_devices.value_secure_window_blocked_count", mAttributionSource.getUid()); } } } Loading Loading
core/java/android/companion/virtual/flags/flags.aconfig +8 −0 Original line number Diff line number Diff line Loading @@ -29,3 +29,11 @@ flag { bug: "291737188" is_fixed_read_only: true } flag { namespace: "virtual_devices" name: "metrics_collection" description: "Enable collection of VDM-related metrics" bug: "324842215" is_fixed_read_only: true }
services/companion/java/com/android/server/companion/virtual/GenericWindowPolicyController.java +13 −0 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ import android.app.compat.CompatChanges; import android.companion.virtual.VirtualDeviceManager.ActivityListener; import android.compat.annotation.ChangeId; import android.compat.annotation.EnabledSince; import android.content.AttributionSource; import android.content.ComponentName; import android.content.Intent; import android.content.pm.ActivityInfo; Loading @@ -44,6 +45,7 @@ import android.window.DisplayWindowPolicyController; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.app.BlockedAppStreamingActivity; import com.android.modules.expresslog.Counter; import java.util.Set; Loading Loading @@ -104,6 +106,8 @@ public class GenericWindowPolicyController extends DisplayWindowPolicyController @EnabledSince(targetSdkVersion = Build.VERSION_CODES.TIRAMISU) public static final long ALLOW_SECURE_ACTIVITY_DISPLAY_ON_REMOTE_DEVICE = 201712607L; @NonNull private final AttributionSource mAttributionSource; @NonNull private final ArraySet<UserHandle> mAllowedUsers; @GuardedBy("mGenericWindowPolicyControllerLock") private boolean mActivityLaunchAllowedByDefault; Loading Loading @@ -144,6 +148,7 @@ public class GenericWindowPolicyController extends DisplayWindowPolicyController * * @param windowFlags The window flags that this controller is interested in. * @param systemWindowFlags The system window flags that this controller is interested in. * @param attributionSource The AttributionSource of the VirtualDevice owner application. * @param allowedUsers The set of users that are allowed to stream in this display. * @param activityLaunchAllowedByDefault Whether activities are default allowed to be launched * or blocked. Loading @@ -169,6 +174,7 @@ public class GenericWindowPolicyController extends DisplayWindowPolicyController public GenericWindowPolicyController( int windowFlags, int systemWindowFlags, AttributionSource attributionSource, @NonNull ArraySet<UserHandle> allowedUsers, boolean activityLaunchAllowedByDefault, @NonNull Set<ComponentName> activityPolicyExemptions, Loading @@ -184,6 +190,7 @@ public class GenericWindowPolicyController extends DisplayWindowPolicyController boolean showTasksInHostDeviceRecents, @Nullable ComponentName customHomeComponent) { super(); mAttributionSource = attributionSource; mAllowedUsers = allowedUsers; mActivityLaunchAllowedByDefault = activityLaunchAllowedByDefault; mActivityPolicyExemptions = activityPolicyExemptions; Loading Loading @@ -436,6 +443,12 @@ public class GenericWindowPolicyController extends DisplayWindowPolicyController if (!mIsMirrorDisplay && mActivityBlockedCallback != null) { mActivityBlockedCallback.onActivityBlocked(mDisplayId, activityInfo); } if (android.companion.virtualdevice.flags.Flags.metricsCollection()) { Counter.logIncrementWithUid( "virtual_devices.value_activity_blocked_count", mAttributionSource.getUid()); } } private static boolean isAllowedByPolicy(boolean allowedByDefault, Loading
services/companion/java/com/android/server/companion/virtual/InputController.java +35 −2 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ import static android.text.TextUtils.formatSimple; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.StringDef; import android.content.AttributionSource; import android.graphics.PointF; import android.hardware.display.DisplayManagerInternal; import android.hardware.input.InputDeviceIdentifier; Loading @@ -38,6 +39,7 @@ import android.os.IBinder; import android.os.IInputConstants; import android.os.RemoteException; import android.util.ArrayMap; import android.util.Log; import android.util.Slog; import android.view.Display; import android.view.InputDevice; Loading @@ -45,6 +47,7 @@ import android.view.WindowManager; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.modules.expresslog.Counter; import com.android.server.LocalServices; import com.android.server.input.InputManagerInternal; Loading Loading @@ -98,11 +101,12 @@ class InputController { private final DisplayManagerInternal mDisplayManagerInternal; private final InputManagerInternal mInputManagerInternal; private final WindowManager mWindowManager; private final AttributionSource mAttributionSource; private final DeviceCreationThreadVerifier mThreadVerifier; InputController(@NonNull Handler handler, @NonNull WindowManager windowManager) { this(new NativeWrapper(), handler, windowManager, @NonNull WindowManager windowManager, AttributionSource attributionSource) { this(new NativeWrapper(), handler, windowManager, attributionSource, // Verify that virtual devices are not created on the handler thread. () -> !handler.getLooper().isCurrentThread()); } Loading @@ -110,12 +114,14 @@ class InputController { @VisibleForTesting InputController(@NonNull NativeWrapper nativeWrapper, @NonNull Handler handler, @NonNull WindowManager windowManager, AttributionSource attributionSource, @NonNull DeviceCreationThreadVerifier threadVerifier) { mHandler = handler; mNativeWrapper = nativeWrapper; mDisplayManagerInternal = LocalServices.getService(DisplayManagerInternal.class); mInputManagerInternal = LocalServices.getService(InputManagerInternal.class); mWindowManager = windowManager; mAttributionSource = attributionSource; mThreadVerifier = threadVerifier; } Loading Loading @@ -838,6 +844,33 @@ class InputController { new InputDeviceDescriptor(ptr, binderDeathRecipient, type, displayId, phys, deviceName, inputDeviceId)); } if (android.companion.virtualdevice.flags.Flags.metricsCollection()) { String metricId = getMetricIdForInputType(type); if (metricId != null) { Counter.logIncrementWithUid(metricId, mAttributionSource.getUid()); } } } private static String getMetricIdForInputType(@InputDeviceDescriptor.Type int type) { switch (type) { case InputDeviceDescriptor.TYPE_KEYBOARD: return "virtual_devices.value_virtual_keyboard_created_count"; case InputDeviceDescriptor.TYPE_MOUSE: return "virtual_devices.value_virtual_mouse_created_count"; case InputDeviceDescriptor.TYPE_TOUCHSCREEN: return "virtual_devices.value_virtual_touchscreen_created_count"; case InputDeviceDescriptor.TYPE_DPAD: return "virtual_devices.value_virtual_dpad_created_count"; case InputDeviceDescriptor.TYPE_NAVIGATION_TOUCHPAD: return "virtual_devices.value_virtual_navigationtouchpad_created_count"; case InputDeviceDescriptor.TYPE_STYLUS: return "virtual_devices.value_virtual_stylus_created_count"; default: Log.e(TAG, "No metric known for input type: " + type); return null; } } @VisibleForTesting Loading
services/companion/java/com/android/server/companion/virtual/SensorController.java +11 −0 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ import android.companion.virtual.sensor.IVirtualSensorCallback; import android.companion.virtual.sensor.VirtualSensor; import android.companion.virtual.sensor.VirtualSensorConfig; import android.companion.virtual.sensor.VirtualSensorEvent; import android.content.AttributionSource; import android.hardware.SensorDirectChannel; import android.os.Binder; import android.os.IBinder; Loading @@ -35,6 +36,7 @@ import android.util.SparseArray; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.modules.expresslog.Counter; import com.android.server.LocalServices; import com.android.server.sensors.SensorManagerInternal; Loading Loading @@ -70,15 +72,19 @@ public class SensorController { @GuardedBy("mLock") private List<VirtualSensor> mVirtualSensorList = null; @NonNull private final AttributionSource mAttributionSource; @NonNull private final SensorManagerInternal.RuntimeSensorCallback mRuntimeSensorCallback; private final SensorManagerInternal mSensorManagerInternal; private final VirtualDeviceManagerInternal mVdmInternal; public SensorController(@NonNull IVirtualDevice virtualDevice, int virtualDeviceId, @NonNull AttributionSource attributionSource, @Nullable IVirtualSensorCallback virtualSensorCallback, @NonNull List<VirtualSensorConfig> sensors) { mVirtualDeviceId = virtualDeviceId; mAttributionSource = attributionSource; mRuntimeSensorCallback = new RuntimeSensorCallbackWrapper(virtualSensorCallback); mSensorManagerInternal = LocalServices.getService(SensorManagerInternal.class); mVdmInternal = LocalServices.getService(VirtualDeviceManagerInternal.class); Loading Loading @@ -139,6 +145,11 @@ public class SensorController { mSensorDescriptors.put(sensorToken, sensorDescriptor); mVirtualSensors.put(handle, sensor); } if (android.companion.virtualdevice.flags.Flags.metricsCollection()) { Counter.logIncrementWithUid( "virtual_devices.value_virtual_sensors_created_count", mAttributionSource.getUid()); } } boolean sendSensorEvent(@NonNull IBinder token, @NonNull VirtualSensorEvent event) { Loading
services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java +20 −4 Original line number Diff line number Diff line Loading @@ -104,6 +104,7 @@ import android.widget.Toast; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.app.BlockedAppStreamingActivity; import com.android.modules.expresslog.Counter; import com.android.server.LocalServices; import com.android.server.companion.virtual.GenericWindowPolicyController.RunningAppsChangedListener; import com.android.server.companion.virtual.audio.VirtualAudioController; Loading Loading @@ -152,6 +153,8 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub private final int mOwnerUid; private final VirtualDeviceLog mVirtualDeviceLog; private final String mOwnerPackageName; @NonNull private final AttributionSource mAttributionSource; private final int mDeviceId; @Nullable private final String mPersistentDeviceId; Loading Loading @@ -288,6 +291,7 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub super(PermissionEnforcer.fromContext(context)); mVirtualDeviceLog = virtualDeviceLog; mOwnerPackageName = attributionSource.getPackageName(); mAttributionSource = attributionSource; UserHandle ownerUserHandle = UserHandle.getUserHandleForUid(attributionSource.getUid()); mContext = context.createContextAsUser(ownerUserHandle, 0); mAssociationInfo = associationInfo; Loading @@ -307,11 +311,11 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub if (inputController == null) { mInputController = new InputController( context.getMainThreadHandler(), context.getSystemService(WindowManager.class)); context.getSystemService(WindowManager.class), mAttributionSource); } else { mInputController = inputController; } mSensorController = new SensorController(this, mDeviceId, mSensorController = new SensorController(this, mDeviceId, mAttributionSource, mParams.getVirtualSensorCallback(), mParams.getVirtualSensorConfigs()); mCameraAccessController = cameraAccessController; if (mCameraAccessController != null) { Loading Loading @@ -620,7 +624,7 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub } if (mVirtualAudioController == null) { mVirtualAudioController = new VirtualAudioController(mContext); mVirtualAudioController = new VirtualAudioController(mContext, mAttributionSource); GenericWindowPolicyController gwpc = mVirtualDisplays.get( displayId).getWindowPolicyController(); mVirtualAudioController.startListening(gwpc, routingCallback, Loading Loading @@ -1028,7 +1032,7 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub if (mVirtualCameraController == null) { throw new UnsupportedOperationException("Virtual camera controller is not available"); } mVirtualCameraController.registerCamera(cameraConfig); mVirtualCameraController.registerCamera(cameraConfig, mAttributionSource); } @Override // Binder call Loading Loading @@ -1110,6 +1114,7 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub final GenericWindowPolicyController gwpc = new GenericWindowPolicyController( FLAG_SECURE, SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS, mAttributionSource, getAllowedUserHandles(), activityLaunchAllowedByDefault, mActivityPolicyExemptions, Loading Loading @@ -1179,6 +1184,11 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub Binder.restoreCallingIdentity(token); } if (android.companion.virtualdevice.flags.Flags.metricsCollection()) { Counter.logIncrementWithUid( "virtual_devices.value_virtual_display_created_count", mAttributionSource.getUid()); } return displayId; } Loading Loading @@ -1220,6 +1230,12 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub if ((display.getFlags() & FLAG_SECURE) == 0) { showToastWhereUidIsRunning(uid, com.android.internal.R.string.vdm_secure_window, Toast.LENGTH_LONG, mContext.getMainLooper()); if (android.companion.virtualdevice.flags.Flags.metricsCollection()) { Counter.logIncrementWithUid( "virtual_devices.value_secure_window_blocked_count", mAttributionSource.getUid()); } } } Loading