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 fbde9e0ea5d1b..d83c80fcca6a4 100644 --- a/services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java +++ b/services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java @@ -480,6 +480,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 c715a217f221d..09dc367cceb4a 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 @@ -471,6 +471,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,