Fix virtual input device creation timeouts

This change fixes a bug where a too long device name caused a timeout
during the creation of the virtual input device. Names longer than 80
bytes where truncated.
It also adds a new check that device names must be unique. This solves
multiple problems:
- Debugging is easier as device names are logged and otherwise
  indistinguishable
- If multiple devices with the same name are created and the creation of
  one of them fails it was not possible to identify which one

Bug: 263519472
Bug: 266049753
Bug: 266049980
Test: atest FrameworksServicesTests:InputControllerTest
Test: atest CtsHardwareTestCases
Change-Id: I040f859253f4f544e23cf01a88afb9a2bac26b9f
This commit is contained in:
Sandro Meier
2023-01-24 08:57:12 +00:00
parent d2b9f813b9
commit 6c7940e4e5
3 changed files with 168 additions and 50 deletions

View File

@@ -46,6 +46,7 @@ import com.android.server.input.InputManagerInternal;
import java.io.PrintWriter;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.nio.charset.StandardCharsets;
import java.util.Iterator;
import java.util.Map;
import java.util.Objects;
@@ -79,6 +80,14 @@ class InputController {
@interface PhysType {
}
/**
* The maximum length of a device name (in bytes in UTF-8 encoding).
*
* This limitation comes directly from uinput.
* See also UINPUT_MAX_NAME_SIZE in linux/uinput.h
*/
private static final int DEVICE_NAME_MAX_LENGTH = 80;
final Object mLock;
/* Token -> file descriptor associations. */
@@ -312,6 +321,34 @@ class InputController {
}
}
/**
* Validates a device name by checking length and whether a device with the same name
* already exists. Throws exceptions if the validation fails.
* @param deviceName The name of the device to be validated
* @throws DeviceCreationException if {@code deviceName} is not valid.
*/
private void validateDeviceName(String deviceName) throws DeviceCreationException {
// Comparison is greater or equal because the device name must fit into a const char*
// including the \0-terminator. Therefore the actual number of bytes that can be used
// for device name is DEVICE_NAME_MAX_LENGTH - 1
if (deviceName.getBytes(StandardCharsets.UTF_8).length >= DEVICE_NAME_MAX_LENGTH) {
throw new DeviceCreationException(
"Input device name exceeds maximum length of " + DEVICE_NAME_MAX_LENGTH
+ "bytes: " + deviceName);
}
synchronized (mLock) {
InputDeviceDescriptor[] values = mInputDeviceDescriptors.values().toArray(
new InputDeviceDescriptor[0]);
for (InputDeviceDescriptor value : values) {
if (value.mName.equals(deviceName)) {
throw new DeviceCreationException(
"Input device name already in use: " + deviceName);
}
}
}
}
private static String createPhys(@PhysType String type) {
return String.format("virtual%s:%d", type, sNextPhysId.getAndIncrement());
}
@@ -451,10 +488,10 @@ class InputController {
@VisibleForTesting
void addDeviceForTesting(IBinder deviceToken, int fd, int type, int displayId, String phys,
int inputDeviceId) {
String deviceName, int inputDeviceId) {
synchronized (mLock) {
mInputDeviceDescriptors.put(deviceToken, new InputDeviceDescriptor(fd, () -> {
}, type, displayId, phys, inputDeviceId));
}, type, displayId, phys, deviceName, inputDeviceId));
}
}
@@ -565,6 +602,9 @@ class InputController {
private final @Type int mType;
private final int mDisplayId;
private final String mPhys;
// The name given to this device by the client. Enforced to be unique within
// InputController.
private final String mName;
// The input device id that was associated to the device by the InputReader on device
// creation.
private final int mInputDeviceId;
@@ -572,12 +612,13 @@ class InputController {
private final long mCreationOrderNumber;
InputDeviceDescriptor(int fd, IBinder.DeathRecipient deathRecipient, @Type int type,
int displayId, String phys, int inputDeviceId) {
int displayId, String phys, String name, int inputDeviceId) {
mFd = fd;
mDeathRecipient = deathRecipient;
mType = type;
mDisplayId = displayId;
mPhys = phys;
mName = name;
mInputDeviceId = inputDeviceId;
mCreationOrderNumber = sNextCreationOrderNumber.getAndIncrement();
}
@@ -733,6 +774,7 @@ class InputController {
"Virtual device creation should happen on an auxiliary thread (e.g. binder "
+ "thread) and not from the handler's thread.");
}
validateDeviceName(deviceName);
final int fd;
final BinderDeathRecipient binderDeathRecipient;
@@ -769,7 +811,7 @@ class InputController {
synchronized (mLock) {
mInputDeviceDescriptors.put(deviceToken,
new InputDeviceDescriptor(fd, binderDeathRecipient, type, displayId, phys,
inputDeviceId));
deviceName, inputDeviceId));
}
}

View File

@@ -18,12 +18,12 @@ package com.android.server.companion.virtual;
import static com.google.common.truth.Truth.assertWithMessage;
import static org.junit.Assert.assertThrows;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.ArgumentMatchers.startsWith;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import android.hardware.display.DisplayManagerInternal;
@@ -133,14 +133,14 @@ public class InputControllerTest {
@Test
public void unregisterInputDevice_anotherMouseExists_setPointerDisplayIdOverride() {
final IBinder deviceToken = new Binder();
mInputController.createMouse("name", /*vendorId= */ 1, /*productId= */ 1, deviceToken,
mInputController.createMouse("mouse1", /*vendorId= */ 1, /*productId= */ 1, deviceToken,
/* displayId= */ 1);
verify(mNativeWrapperMock).openUinputMouse(eq("name"), eq(1), eq(1), anyString());
verify(mNativeWrapperMock).openUinputMouse(eq("mouse1"), eq(1), eq(1), anyString());
verify(mInputManagerInternalMock).setVirtualMousePointerDisplayId(eq(1));
final IBinder deviceToken2 = new Binder();
mInputController.createMouse("name", /*vendorId= */ 1, /*productId= */ 1, deviceToken2,
mInputController.createMouse("mouse2", /*vendorId= */ 1, /*productId= */ 1, deviceToken2,
/* displayId= */ 2);
verify(mNativeWrapperMock, times(2)).openUinputMouse(eq("name"), eq(1), eq(1), anyString());
verify(mNativeWrapperMock).openUinputMouse(eq("mouse2"), eq(1), eq(1), anyString());
verify(mInputManagerInternalMock).setVirtualMousePointerDisplayId(eq(2));
mInputController.unregisterInputDevice(deviceToken);
verify(mInputManagerInternalMock).setVirtualMousePointerDisplayId(eq(1));
@@ -193,4 +193,68 @@ public class InputControllerTest {
mInputController.unregisterInputDevice(deviceToken);
verify(mInputManagerInternalMock).removeKeyboardLayoutAssociation(anyString());
}
@Test
public void createInputDevice_tooLongNameRaisesException() {
final IBinder deviceToken = new Binder("device");
// The underlying uinput implementation only supports device names up to 80 bytes. This
// string is all ASCII characters, therefore if we have more than 80 ASCII characters we
// will have more than 80 bytes.
String deviceName =
"This.is.a.very.long.device.name.that.exceeds.the.maximum.length.of.80.bytes"
+ ".by.a.couple.bytes";
assertThrows(RuntimeException.class, () -> {
mInputController.createDpad(deviceName, /*vendorId= */3, /*productId=*/3, deviceToken,
1);
});
}
@Test
public void createInputDevice_tooLongDeviceNameRaisesException() {
final IBinder deviceToken = new Binder("device");
// The underlying uinput implementation only supports device names up to 80 bytes (including
// a 0-byte terminator).
// This string is 79 characters and 80 bytes (including the 0-byte terminator)
String deviceName =
"This.is.a.very.long.device.name.that.exceeds.the.maximum.length01234567890123456";
assertThrows(RuntimeException.class, () -> {
mInputController.createDpad(deviceName, /*vendorId= */3, /*productId=*/3, deviceToken,
1);
});
}
@Test
public void createInputDevice_stringWithLessThanMaxCharsButMoreThanMaxBytesRaisesException() {
final IBinder deviceToken = new Binder("device1");
// Has only 39 characters but is 109 bytes as utf-8
String device_name =
"░▄▄▄▄░\n" +
"▀▀▄██►\n" +
"▀▀███►\n" +
"░▀███►░█►\n" +
"▒▄████▀▀";
assertThrows(RuntimeException.class, () -> {
mInputController.createDpad(device_name, /*vendorId= */5, /*productId=*/5,
deviceToken, 1);
});
}
@Test
public void createInputDevice_duplicateNamesAreNotAllowed() {
final IBinder deviceToken1 = new Binder("deviceToken1");
final IBinder deviceToken2 = new Binder("deviceToken2");
final String sharedDeviceName = "DeviceName";
mInputController.createDpad(sharedDeviceName, /*vendorId= */4, /*productId=*/4,
deviceToken1, 1);
assertThrows("Device names need to be unique", RuntimeException.class, () -> {
mInputController.createDpad(sharedDeviceName, /*vendorId= */5, /*productId=*/5,
deviceToken2, 2);
});
}
}

View File

@@ -135,7 +135,9 @@ public class VirtualDeviceManagerServiceTest {
private static final String VENDING_PACKAGE_NAME = "com.android.vending";
private static final String GOOGLE_DIALER_PACKAGE_NAME = "com.google.android.dialer";
private static final String GOOGLE_MAPS_PACKAGE_NAME = "com.google.android.apps.maps";
private static final String DEVICE_NAME = "device name";
private static final String DEVICE_NAME_1 = "device name 1";
private static final String DEVICE_NAME_2 = "device name 2";
private static final String DEVICE_NAME_3 = "device name 3";
private static final int DISPLAY_ID_1 = 2;
private static final int DISPLAY_ID_2 = 3;
private static final int DEVICE_OWNER_UID_1 = 50;
@@ -160,14 +162,14 @@ public class VirtualDeviceManagerServiceTest {
new VirtualDpadConfig.Builder()
.setVendorId(VENDOR_ID)
.setProductId(PRODUCT_ID)
.setInputDeviceName(DEVICE_NAME)
.setInputDeviceName(DEVICE_NAME_1)
.setAssociatedDisplayId(DISPLAY_ID_1)
.build();
private static final VirtualKeyboardConfig KEYBOARD_CONFIG =
new VirtualKeyboardConfig.Builder()
.setVendorId(VENDOR_ID)
.setProductId(PRODUCT_ID)
.setInputDeviceName(DEVICE_NAME)
.setInputDeviceName(DEVICE_NAME_1)
.setAssociatedDisplayId(DISPLAY_ID_1)
.setLanguageTag(VirtualKeyboardConfig.DEFAULT_LANGUAGE_TAG)
.setLayoutType(VirtualKeyboardConfig.DEFAULT_LAYOUT_TYPE)
@@ -176,21 +178,21 @@ public class VirtualDeviceManagerServiceTest {
new VirtualMouseConfig.Builder()
.setVendorId(VENDOR_ID)
.setProductId(PRODUCT_ID)
.setInputDeviceName(DEVICE_NAME)
.setInputDeviceName(DEVICE_NAME_1)
.setAssociatedDisplayId(DISPLAY_ID_1)
.build();
private static final VirtualTouchscreenConfig TOUCHSCREEN_CONFIG =
new VirtualTouchscreenConfig.Builder(WIDTH, HEIGHT)
.setVendorId(VENDOR_ID)
.setProductId(PRODUCT_ID)
.setInputDeviceName(DEVICE_NAME)
.setInputDeviceName(DEVICE_NAME_1)
.setAssociatedDisplayId(DISPLAY_ID_1)
.build();
private static final VirtualNavigationTouchpadConfig NAVIGATION_TOUCHPAD_CONFIG =
new VirtualNavigationTouchpadConfig.Builder(WIDTH, HEIGHT)
.setVendorId(VENDOR_ID)
.setProductId(PRODUCT_ID)
.setInputDeviceName(DEVICE_NAME)
.setInputDeviceName(DEVICE_NAME_1)
.setAssociatedDisplayId(DISPLAY_ID_1)
.build();
private static final String TEST_SITE = "http://test";
@@ -549,7 +551,7 @@ public class VirtualDeviceManagerServiceTest {
new VirtualKeyboardConfig.Builder()
.setVendorId(VENDOR_ID)
.setProductId(PRODUCT_ID)
.setInputDeviceName(DEVICE_NAME)
.setInputDeviceName(DEVICE_NAME_1)
.setAssociatedDisplayId(DISPLAY_ID_1)
.setLanguageTag("zh-CN")
.build();
@@ -557,7 +559,7 @@ public class VirtualDeviceManagerServiceTest {
new VirtualKeyboardConfig.Builder()
.setVendorId(VENDOR_ID)
.setProductId(PRODUCT_ID)
.setInputDeviceName(DEVICE_NAME)
.setInputDeviceName(DEVICE_NAME_2)
.setAssociatedDisplayId(DISPLAY_ID_2)
.setLanguageTag("fr-FR")
.build();
@@ -784,7 +786,7 @@ public class VirtualDeviceManagerServiceTest {
/* touchscrenWidth= */ 600, /* touchscreenHeight= */ 800)
.setVendorId(VENDOR_ID)
.setProductId(PRODUCT_ID)
.setInputDeviceName(DEVICE_NAME)
.setInputDeviceName(DEVICE_NAME_1)
.setAssociatedDisplayId(DISPLAY_ID_1)
.build();
mDeviceImpl.createVirtualTouchscreen(positiveConfig, BINDER);
@@ -822,7 +824,7 @@ public class VirtualDeviceManagerServiceTest {
/* touchpadHeight= */ 50, /* touchpadWidth= */ 50)
.setVendorId(VENDOR_ID)
.setProductId(PRODUCT_ID)
.setInputDeviceName(DEVICE_NAME)
.setInputDeviceName(DEVICE_NAME_1)
.setAssociatedDisplayId(DISPLAY_ID_1)
.build();
mDeviceImpl.createVirtualNavigationTouchpad(positiveConfig, BINDER);
@@ -893,7 +895,7 @@ public class VirtualDeviceManagerServiceTest {
() -> mDeviceImpl.createVirtualSensor(
BINDER,
new VirtualSensorConfig.Builder(
Sensor.TYPE_ACCELEROMETER, DEVICE_NAME).build()));
Sensor.TYPE_ACCELEROMETER, DEVICE_NAME_1).build()));
}
}
@@ -920,7 +922,7 @@ public class VirtualDeviceManagerServiceTest {
mDeviceImpl.createVirtualDpad(DPAD_CONFIG, BINDER);
assertWithMessage("Virtual dpad should register fd when the display matches").that(
mInputController.getInputDeviceDescriptors()).isNotEmpty();
verify(mNativeWrapperMock).openUinputDpad(eq(DEVICE_NAME), eq(VENDOR_ID), eq(PRODUCT_ID),
verify(mNativeWrapperMock).openUinputDpad(eq(DEVICE_NAME_1), eq(VENDOR_ID), eq(PRODUCT_ID),
anyString());
}
@@ -930,7 +932,7 @@ public class VirtualDeviceManagerServiceTest {
mDeviceImpl.createVirtualKeyboard(KEYBOARD_CONFIG, BINDER);
assertWithMessage("Virtual keyboard should register fd when the display matches").that(
mInputController.getInputDeviceDescriptors()).isNotEmpty();
verify(mNativeWrapperMock).openUinputKeyboard(eq(DEVICE_NAME), eq(VENDOR_ID),
verify(mNativeWrapperMock).openUinputKeyboard(eq(DEVICE_NAME_1), eq(VENDOR_ID),
eq(PRODUCT_ID), anyString());
}
@@ -941,7 +943,7 @@ public class VirtualDeviceManagerServiceTest {
assertWithMessage("Virtual keyboard should register fd when the display matches")
.that(mInputController.getInputDeviceDescriptors())
.isNotEmpty();
verify(mNativeWrapperMock).openUinputKeyboard(eq(DEVICE_NAME), eq(VENDOR_ID),
verify(mNativeWrapperMock).openUinputKeyboard(eq(DEVICE_NAME_1), eq(VENDOR_ID),
eq(PRODUCT_ID), anyString());
assertThat(mDeviceImpl.getDeviceLocaleList()).isEqualTo(
LocaleList.forLanguageTags(KEYBOARD_CONFIG.getLanguageTag()));
@@ -953,7 +955,7 @@ public class VirtualDeviceManagerServiceTest {
new VirtualKeyboardConfig.Builder()
.setVendorId(VENDOR_ID)
.setProductId(PRODUCT_ID)
.setInputDeviceName(DEVICE_NAME)
.setInputDeviceName(DEVICE_NAME_1)
.setAssociatedDisplayId(DISPLAY_ID_1)
.build();
@@ -962,7 +964,7 @@ public class VirtualDeviceManagerServiceTest {
assertWithMessage("Virtual keyboard should register fd when the display matches")
.that(mInputController.getInputDeviceDescriptors())
.isNotEmpty();
verify(mNativeWrapperMock).openUinputKeyboard(eq(DEVICE_NAME), eq(VENDOR_ID),
verify(mNativeWrapperMock).openUinputKeyboard(eq(DEVICE_NAME_1), eq(VENDOR_ID),
eq(PRODUCT_ID), anyString());
assertThat(mDeviceImpl.getDeviceLocaleList()).isEqualTo(
LocaleList.forLanguageTags(VirtualKeyboardConfig.DEFAULT_LANGUAGE_TAG));
@@ -982,7 +984,7 @@ public class VirtualDeviceManagerServiceTest {
mDeviceImpl.createVirtualMouse(MOUSE_CONFIG, BINDER);
assertWithMessage("Virtual mouse should register fd when the display matches").that(
mInputController.getInputDeviceDescriptors()).isNotEmpty();
verify(mNativeWrapperMock).openUinputMouse(eq(DEVICE_NAME), eq(VENDOR_ID), eq(PRODUCT_ID),
verify(mNativeWrapperMock).openUinputMouse(eq(DEVICE_NAME_1), eq(VENDOR_ID), eq(PRODUCT_ID),
anyString());
}
@@ -992,7 +994,7 @@ public class VirtualDeviceManagerServiceTest {
mDeviceImpl.createVirtualTouchscreen(TOUCHSCREEN_CONFIG, BINDER);
assertWithMessage("Virtual touchscreen should register fd when the display matches").that(
mInputController.getInputDeviceDescriptors()).isNotEmpty();
verify(mNativeWrapperMock).openUinputTouchscreen(eq(DEVICE_NAME), eq(VENDOR_ID),
verify(mNativeWrapperMock).openUinputTouchscreen(eq(DEVICE_NAME_1), eq(VENDOR_ID),
eq(PRODUCT_ID), anyString(), eq(HEIGHT), eq(WIDTH));
}
@@ -1003,15 +1005,16 @@ public class VirtualDeviceManagerServiceTest {
assertWithMessage("Virtual navigation touchpad should register fd when the display matches")
.that(
mInputController.getInputDeviceDescriptors()).isNotEmpty();
verify(mNativeWrapperMock).openUinputTouchscreen(eq(DEVICE_NAME), eq(VENDOR_ID),
verify(mNativeWrapperMock).openUinputTouchscreen(eq(DEVICE_NAME_1), eq(VENDOR_ID),
eq(PRODUCT_ID), anyString(), eq(HEIGHT), eq(WIDTH));
}
@Test
public void createVirtualKeyboard_inputDeviceId_obtainFromInputController() {
final int fd = 1;
mInputController.addDeviceForTesting(BINDER, fd, /* type= */ 1, /* displayId= */ 1, PHYS,
INPUT_DEVICE_ID);
mInputController.addDeviceForTesting(BINDER, fd,
InputController.InputDeviceDescriptor.TYPE_KEYBOARD, DISPLAY_ID_1, PHYS,
DEVICE_NAME_1, INPUT_DEVICE_ID);
assertWithMessage(
"InputController should return device id from InputDeviceDescriptor").that(
mInputController.getInputDeviceId(BINDER)).isEqualTo(INPUT_DEVICE_ID);
@@ -1052,7 +1055,7 @@ public class VirtualDeviceManagerServiceTest {
@Test
public void close_cleanSensorController() {
mSensorController.addSensorForTesting(
BINDER, SENSOR_HANDLE, Sensor.TYPE_ACCELEROMETER, DEVICE_NAME);
BINDER, SENSOR_HANDLE, Sensor.TYPE_ACCELEROMETER, DEVICE_NAME_1);
mDeviceImpl.close();
@@ -1085,8 +1088,9 @@ public class VirtualDeviceManagerServiceTest {
final int fd = 1;
final int keyCode = KeyEvent.KEYCODE_A;
final int action = VirtualKeyEvent.ACTION_UP;
mInputController.addDeviceForTesting(BINDER, fd, /* type= */1, /* displayId= */ 1, PHYS,
INPUT_DEVICE_ID);
mInputController.addDeviceForTesting(BINDER, fd,
InputController.InputDeviceDescriptor.TYPE_KEYBOARD, DISPLAY_ID_1, PHYS,
DEVICE_NAME_1, INPUT_DEVICE_ID);
mDeviceImpl.sendKeyEvent(BINDER, new VirtualKeyEvent.Builder()
.setKeyCode(keyCode)
@@ -1112,9 +1116,10 @@ public class VirtualDeviceManagerServiceTest {
final int fd = 1;
final int buttonCode = VirtualMouseButtonEvent.BUTTON_BACK;
final int action = VirtualMouseButtonEvent.ACTION_BUTTON_PRESS;
mInputController.addDeviceForTesting(BINDER, fd, /* type= */2, /* displayId= */ 1, PHYS,
INPUT_DEVICE_ID);
doReturn(1).when(mInputManagerInternalMock).getVirtualMousePointerDisplayId();
mInputController.addDeviceForTesting(BINDER, fd,
InputController.InputDeviceDescriptor.TYPE_MOUSE, DISPLAY_ID_1, PHYS,
DEVICE_NAME_1, INPUT_DEVICE_ID);
doReturn(DISPLAY_ID_1).when(mInputManagerInternalMock).getVirtualMousePointerDisplayId();
mDeviceImpl.sendButtonEvent(BINDER, new VirtualMouseButtonEvent.Builder()
.setButtonCode(buttonCode)
.setAction(action).build());
@@ -1126,7 +1131,8 @@ public class VirtualDeviceManagerServiceTest {
final int fd = 1;
final int buttonCode = VirtualMouseButtonEvent.BUTTON_BACK;
final int action = VirtualMouseButtonEvent.ACTION_BUTTON_PRESS;
mInputController.addDeviceForTesting(BINDER, fd, /* type= */2, /* displayId= */ 1, PHYS,
mInputController.addDeviceForTesting(BINDER, fd,
InputController.InputDeviceDescriptor.TYPE_MOUSE, DISPLAY_ID_1, PHYS, DEVICE_NAME_1,
INPUT_DEVICE_ID);
assertThrows(
IllegalStateException.class,
@@ -1151,9 +1157,10 @@ public class VirtualDeviceManagerServiceTest {
final int fd = 1;
final float x = -0.2f;
final float y = 0.7f;
mInputController.addDeviceForTesting(BINDER, fd, /* type= */2, /* displayId= */ 1, PHYS,
mInputController.addDeviceForTesting(BINDER, fd,
InputController.InputDeviceDescriptor.TYPE_MOUSE, DISPLAY_ID_1, PHYS, DEVICE_NAME_1,
INPUT_DEVICE_ID);
doReturn(1).when(mInputManagerInternalMock).getVirtualMousePointerDisplayId();
doReturn(DISPLAY_ID_1).when(mInputManagerInternalMock).getVirtualMousePointerDisplayId();
mDeviceImpl.sendRelativeEvent(BINDER, new VirtualMouseRelativeEvent.Builder()
.setRelativeX(x).setRelativeY(y).build());
verify(mNativeWrapperMock).writeRelativeEvent(fd, x, y);
@@ -1164,7 +1171,8 @@ public class VirtualDeviceManagerServiceTest {
final int fd = 1;
final float x = -0.2f;
final float y = 0.7f;
mInputController.addDeviceForTesting(BINDER, fd, /* type= */2, /* displayId= */ 1, PHYS,
mInputController.addDeviceForTesting(BINDER, fd,
InputController.InputDeviceDescriptor.TYPE_MOUSE, DISPLAY_ID_1, PHYS, DEVICE_NAME_1,
INPUT_DEVICE_ID);
assertThrows(
IllegalStateException.class,
@@ -1190,9 +1198,10 @@ public class VirtualDeviceManagerServiceTest {
final int fd = 1;
final float x = 0.5f;
final float y = 1f;
mInputController.addDeviceForTesting(BINDER, fd, /* type= */2, /* displayId= */ 1, PHYS,
mInputController.addDeviceForTesting(BINDER, fd,
InputController.InputDeviceDescriptor.TYPE_MOUSE, DISPLAY_ID_1, PHYS, DEVICE_NAME_1,
INPUT_DEVICE_ID);
doReturn(1).when(mInputManagerInternalMock).getVirtualMousePointerDisplayId();
doReturn(DISPLAY_ID_1).when(mInputManagerInternalMock).getVirtualMousePointerDisplayId();
mDeviceImpl.sendScrollEvent(BINDER, new VirtualMouseScrollEvent.Builder()
.setXAxisMovement(x)
.setYAxisMovement(y).build());
@@ -1204,7 +1213,8 @@ public class VirtualDeviceManagerServiceTest {
final int fd = 1;
final float x = 0.5f;
final float y = 1f;
mInputController.addDeviceForTesting(BINDER, fd, /* type= */2, /* displayId= */ 1, PHYS,
mInputController.addDeviceForTesting(BINDER, fd,
InputController.InputDeviceDescriptor.TYPE_MOUSE, DISPLAY_ID_1, PHYS, DEVICE_NAME_1,
INPUT_DEVICE_ID);
assertThrows(
IllegalStateException.class,
@@ -1236,8 +1246,9 @@ public class VirtualDeviceManagerServiceTest {
final float x = 100.5f;
final float y = 200.5f;
final int action = VirtualTouchEvent.ACTION_UP;
mInputController.addDeviceForTesting(BINDER, fd, /* type= */3, /* displayId= */ 1, PHYS,
INPUT_DEVICE_ID);
mInputController.addDeviceForTesting(BINDER, fd,
InputController.InputDeviceDescriptor.TYPE_TOUCHSCREEN, DISPLAY_ID_1, PHYS,
DEVICE_NAME_1, INPUT_DEVICE_ID);
mDeviceImpl.sendTouchEvent(BINDER, new VirtualTouchEvent.Builder()
.setX(x)
.setY(y)
@@ -1259,8 +1270,9 @@ public class VirtualDeviceManagerServiceTest {
final int action = VirtualTouchEvent.ACTION_UP;
final float pressure = 1.0f;
final float majorAxisSize = 10.0f;
mInputController.addDeviceForTesting(BINDER, fd, /* type= */3, /* displayId= */ 1, PHYS,
INPUT_DEVICE_ID);
mInputController.addDeviceForTesting(BINDER, fd,
InputController.InputDeviceDescriptor.TYPE_TOUCHSCREEN, DISPLAY_ID_1, PHYS,
DEVICE_NAME_1, INPUT_DEVICE_ID);
mDeviceImpl.sendTouchEvent(BINDER, new VirtualTouchEvent.Builder()
.setX(x)
.setY(y)
@@ -1281,19 +1293,19 @@ public class VirtualDeviceManagerServiceTest {
mDeviceImpl.mVirtualDisplayIds.add(3);
VirtualMouseConfig config1 = new VirtualMouseConfig.Builder()
.setAssociatedDisplayId(1)
.setInputDeviceName(DEVICE_NAME)
.setInputDeviceName(DEVICE_NAME_1)
.setVendorId(VENDOR_ID)
.setProductId(PRODUCT_ID)
.build();
VirtualMouseConfig config2 = new VirtualMouseConfig.Builder()
.setAssociatedDisplayId(2)
.setInputDeviceName(DEVICE_NAME)
.setInputDeviceName(DEVICE_NAME_2)
.setVendorId(VENDOR_ID)
.setProductId(PRODUCT_ID)
.build();
VirtualMouseConfig config3 = new VirtualMouseConfig.Builder()
.setAssociatedDisplayId(3)
.setInputDeviceName(DEVICE_NAME)
.setInputDeviceName(DEVICE_NAME_3)
.setVendorId(VENDOR_ID)
.setProductId(PRODUCT_ID)
.build();