diff --git a/services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java b/services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java index be2107529f8b4..524f13cba4d14 100644 --- a/services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java +++ b/services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java @@ -474,6 +474,13 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub + "this virtual device"); } } + + if (screenSize.x <= 0 || screenSize.y <= 0) { + throw new IllegalArgumentException( + "Cannot create a virtual touchscreen, screen dimensions must be positive. Got: " + + screenSize); + } + final long token = Binder.clearCallingIdentity(); try { mInputController.createTouchscreen(deviceName, vendorId, productId, diff --git a/services/tests/servicestests/src/com/android/server/companion/virtual/VirtualDeviceManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/companion/virtual/VirtualDeviceManagerServiceTest.java index 5fda3d6b36ab5..5373ab591cc16 100644 --- a/services/tests/servicestests/src/com/android/server/companion/virtual/VirtualDeviceManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/companion/virtual/VirtualDeviceManagerServiceTest.java @@ -418,6 +418,35 @@ public class VirtualDeviceManagerServiceTest { VENDOR_ID, PRODUCT_ID, BINDER, new Point(WIDTH, HEIGHT))); } + @Test + public void createVirtualTouchscreen_zeroDisplayDimension_failsIllegalArgumentException() { + mDeviceImpl.mVirtualDisplayIds.add(DISPLAY_ID); + Point size = new Point(0, 0); + assertThrows(IllegalArgumentException.class, + () -> mDeviceImpl.createVirtualTouchscreen(DISPLAY_ID, DEVICE_NAME, VENDOR_ID, + PRODUCT_ID, BINDER, size)); + } + + @Test + public void createVirtualTouchscreen_negativeDisplayDimension_failsIllegalArgumentException() { + mDeviceImpl.mVirtualDisplayIds.add(DISPLAY_ID); + Point size = new Point(-100, -100); + assertThrows(IllegalArgumentException.class, + () -> mDeviceImpl.createVirtualTouchscreen(DISPLAY_ID, DEVICE_NAME, VENDOR_ID, + PRODUCT_ID, BINDER, size)); + } + + @Test + public void createVirtualTouchscreen_positiveDisplayDimension_successful() { + mDeviceImpl.mVirtualDisplayIds.add(DISPLAY_ID); + Point size = new Point(600, 800); + mDeviceImpl.createVirtualTouchscreen(DISPLAY_ID, DEVICE_NAME, VENDOR_ID, PRODUCT_ID, BINDER, + size); + assertWithMessage( + "Virtual touchscreen should create input device descriptor on successful creation.") + .that(mInputController.mInputDeviceDescriptors).isNotEmpty(); + } + @Test public void onAudioSessionStarting_noDisplay_failsSecurityException() { assertThrows(SecurityException.class,