Loading services/inputflinger/reader/mapper/JoystickInputMapper.cpp +7 −4 Original line number Diff line number Diff line Loading @@ -335,12 +335,15 @@ void JoystickInputMapper::sync(nsecs_t when, nsecs_t readTime, bool force) { // button will likely wake the device. // TODO: Use the input device configuration to control this behavior more finely. uint32_t policyFlags = 0; int32_t displayId = ADISPLAY_ID_NONE; if (getDeviceContext().getAssociatedViewport()) { displayId = getDeviceContext().getAssociatedViewport()->displayId; } NotifyMotionArgs args(getContext()->getNextId(), when, readTime, getDeviceId(), AINPUT_SOURCE_JOYSTICK, ADISPLAY_ID_NONE, policyFlags, AMOTION_EVENT_ACTION_MOVE, 0, 0, metaState, buttonState, MotionClassification::NONE, AMOTION_EVENT_EDGE_FLAG_NONE, 1, &pointerProperties, &pointerCoords, 0, 0, AINPUT_SOURCE_JOYSTICK, displayId, policyFlags, AMOTION_EVENT_ACTION_MOVE, 0, 0, metaState, buttonState, MotionClassification::NONE, AMOTION_EVENT_EDGE_FLAG_NONE, 1, &pointerProperties, &pointerCoords, 0, 0, AMOTION_EVENT_INVALID_CURSOR_POSITION, AMOTION_EVENT_INVALID_CURSOR_POSITION, 0, /* videoFrames */ {}); getListener().notifyMotion(&args); Loading services/inputflinger/reader/mapper/TouchInputMapper.cpp +4 −7 Original line number Diff line number Diff line Loading @@ -550,18 +550,15 @@ bool TouchInputMapper::hasExternalStylus() const { /** * Determine which DisplayViewport to use. * 1. If display port is specified, return the matching viewport. If matching viewport not * found, then return. * 1. If a device has associated display, get the matching viewport. * 2. Always use the suggested viewport from WindowManagerService for pointers. * 3. If a device has associated display, get the matching viewport by either unique id or by * the display type (internal or external). * 3. Get the matching viewport by either unique id in idc file or by the display type * (internal or external). * 4. Otherwise, use a non-display viewport. */ std::optional<DisplayViewport> TouchInputMapper::findViewport() { if (mParameters.hasAssociatedDisplay && mDeviceMode != DeviceMode::UNSCALED) { const std::optional<uint8_t> displayPort = getDeviceContext().getAssociatedDisplayPort(); if (displayPort) { // Find the viewport that contains the same port if (getDeviceContext().getAssociatedViewport()) { return getDeviceContext().getAssociatedViewport(); } Loading services/inputflinger/tests/InputReader_test.cpp +81 −0 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ #include <InputReader.h> #include <InputReaderBase.h> #include <InputReaderFactory.h> #include <JoystickInputMapper.h> #include <KeyboardInputMapper.h> #include <MultiTouchInputMapper.h> #include <PeripheralController.h> Loading Loading @@ -8251,6 +8252,25 @@ TEST_F(MultiTouchInputMapperTest, Configure_AssignsDisplayPort) { ASSERT_EQ(DISPLAY_ID, args.displayId); } TEST_F(MultiTouchInputMapperTest, Configure_AssignsDisplayUniqueId) { addConfigurationProperty("touch.deviceType", "touchScreen"); prepareAxes(POSITION); MultiTouchInputMapper& mapper = addMapperAndConfigure<MultiTouchInputMapper>(); mFakePolicy->addInputUniqueIdAssociation(DEVICE_LOCATION, VIRTUAL_DISPLAY_UNIQUE_ID); prepareDisplay(DISPLAY_ORIENTATION_0); prepareVirtualDisplay(DISPLAY_ORIENTATION_0); // Send a touch event processPosition(mapper, 100, 100); processSync(mapper); NotifyMotionArgs args; ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args)); ASSERT_EQ(VIRTUAL_DISPLAY_ID, args.displayId); } TEST_F(MultiTouchInputMapperTest, Process_Pointer_ShouldHandleDisplayId) { // Setup for second display. std::shared_ptr<FakePointerController> fakePointerController = Loading Loading @@ -9260,6 +9280,67 @@ TEST_F(MultiTouchInputMapperTest, WhenCapturedAndNotCaptured_GetSources) { ASSERT_EQ(AINPUT_SOURCE_TOUCHPAD, mapper.getSources()); } // --- JoystickInputMapperTest --- class JoystickInputMapperTest : public InputMapperTest { protected: static const int32_t RAW_X_MIN; static const int32_t RAW_X_MAX; static const int32_t RAW_Y_MIN; static const int32_t RAW_Y_MAX; void SetUp() override { InputMapperTest::SetUp(InputDeviceClass::JOYSTICK | InputDeviceClass::EXTERNAL); } void prepareAxes() { mFakeEventHub->addAbsoluteAxis(EVENTHUB_ID, ABS_X, RAW_X_MIN, RAW_X_MAX, 0, 0); mFakeEventHub->addAbsoluteAxis(EVENTHUB_ID, ABS_Y, RAW_Y_MIN, RAW_Y_MAX, 0, 0); } void processAxis(JoystickInputMapper& mapper, int32_t axis, int32_t value) { process(mapper, ARBITRARY_TIME, READ_TIME, EV_ABS, axis, value); } void processSync(JoystickInputMapper& mapper) { process(mapper, ARBITRARY_TIME, READ_TIME, EV_SYN, SYN_REPORT, 0); } void prepareVirtualDisplay(int32_t orientation) { setDisplayInfoAndReconfigure(VIRTUAL_DISPLAY_ID, VIRTUAL_DISPLAY_WIDTH, VIRTUAL_DISPLAY_HEIGHT, orientation, VIRTUAL_DISPLAY_UNIQUE_ID, NO_PORT, ViewportType::VIRTUAL); } }; const int32_t JoystickInputMapperTest::RAW_X_MIN = -32767; const int32_t JoystickInputMapperTest::RAW_X_MAX = 32767; const int32_t JoystickInputMapperTest::RAW_Y_MIN = -32767; const int32_t JoystickInputMapperTest::RAW_Y_MAX = 32767; TEST_F(JoystickInputMapperTest, Configure_AssignsDisplayUniqueId) { prepareAxes(); JoystickInputMapper& mapper = addMapperAndConfigure<JoystickInputMapper>(); mFakePolicy->addInputUniqueIdAssociation(DEVICE_LOCATION, VIRTUAL_DISPLAY_UNIQUE_ID); prepareVirtualDisplay(DISPLAY_ORIENTATION_0); // Send an axis event processAxis(mapper, ABS_X, 100); processSync(mapper); NotifyMotionArgs args; ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args)); ASSERT_EQ(VIRTUAL_DISPLAY_ID, args.displayId); // Send another axis event processAxis(mapper, ABS_Y, 100); processSync(mapper); ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args)); ASSERT_EQ(VIRTUAL_DISPLAY_ID, args.displayId); } // --- PeripheralControllerTest --- class PeripheralControllerTest : public testing::Test { Loading Loading
services/inputflinger/reader/mapper/JoystickInputMapper.cpp +7 −4 Original line number Diff line number Diff line Loading @@ -335,12 +335,15 @@ void JoystickInputMapper::sync(nsecs_t when, nsecs_t readTime, bool force) { // button will likely wake the device. // TODO: Use the input device configuration to control this behavior more finely. uint32_t policyFlags = 0; int32_t displayId = ADISPLAY_ID_NONE; if (getDeviceContext().getAssociatedViewport()) { displayId = getDeviceContext().getAssociatedViewport()->displayId; } NotifyMotionArgs args(getContext()->getNextId(), when, readTime, getDeviceId(), AINPUT_SOURCE_JOYSTICK, ADISPLAY_ID_NONE, policyFlags, AMOTION_EVENT_ACTION_MOVE, 0, 0, metaState, buttonState, MotionClassification::NONE, AMOTION_EVENT_EDGE_FLAG_NONE, 1, &pointerProperties, &pointerCoords, 0, 0, AINPUT_SOURCE_JOYSTICK, displayId, policyFlags, AMOTION_EVENT_ACTION_MOVE, 0, 0, metaState, buttonState, MotionClassification::NONE, AMOTION_EVENT_EDGE_FLAG_NONE, 1, &pointerProperties, &pointerCoords, 0, 0, AMOTION_EVENT_INVALID_CURSOR_POSITION, AMOTION_EVENT_INVALID_CURSOR_POSITION, 0, /* videoFrames */ {}); getListener().notifyMotion(&args); Loading
services/inputflinger/reader/mapper/TouchInputMapper.cpp +4 −7 Original line number Diff line number Diff line Loading @@ -550,18 +550,15 @@ bool TouchInputMapper::hasExternalStylus() const { /** * Determine which DisplayViewport to use. * 1. If display port is specified, return the matching viewport. If matching viewport not * found, then return. * 1. If a device has associated display, get the matching viewport. * 2. Always use the suggested viewport from WindowManagerService for pointers. * 3. If a device has associated display, get the matching viewport by either unique id or by * the display type (internal or external). * 3. Get the matching viewport by either unique id in idc file or by the display type * (internal or external). * 4. Otherwise, use a non-display viewport. */ std::optional<DisplayViewport> TouchInputMapper::findViewport() { if (mParameters.hasAssociatedDisplay && mDeviceMode != DeviceMode::UNSCALED) { const std::optional<uint8_t> displayPort = getDeviceContext().getAssociatedDisplayPort(); if (displayPort) { // Find the viewport that contains the same port if (getDeviceContext().getAssociatedViewport()) { return getDeviceContext().getAssociatedViewport(); } Loading
services/inputflinger/tests/InputReader_test.cpp +81 −0 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ #include <InputReader.h> #include <InputReaderBase.h> #include <InputReaderFactory.h> #include <JoystickInputMapper.h> #include <KeyboardInputMapper.h> #include <MultiTouchInputMapper.h> #include <PeripheralController.h> Loading Loading @@ -8251,6 +8252,25 @@ TEST_F(MultiTouchInputMapperTest, Configure_AssignsDisplayPort) { ASSERT_EQ(DISPLAY_ID, args.displayId); } TEST_F(MultiTouchInputMapperTest, Configure_AssignsDisplayUniqueId) { addConfigurationProperty("touch.deviceType", "touchScreen"); prepareAxes(POSITION); MultiTouchInputMapper& mapper = addMapperAndConfigure<MultiTouchInputMapper>(); mFakePolicy->addInputUniqueIdAssociation(DEVICE_LOCATION, VIRTUAL_DISPLAY_UNIQUE_ID); prepareDisplay(DISPLAY_ORIENTATION_0); prepareVirtualDisplay(DISPLAY_ORIENTATION_0); // Send a touch event processPosition(mapper, 100, 100); processSync(mapper); NotifyMotionArgs args; ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args)); ASSERT_EQ(VIRTUAL_DISPLAY_ID, args.displayId); } TEST_F(MultiTouchInputMapperTest, Process_Pointer_ShouldHandleDisplayId) { // Setup for second display. std::shared_ptr<FakePointerController> fakePointerController = Loading Loading @@ -9260,6 +9280,67 @@ TEST_F(MultiTouchInputMapperTest, WhenCapturedAndNotCaptured_GetSources) { ASSERT_EQ(AINPUT_SOURCE_TOUCHPAD, mapper.getSources()); } // --- JoystickInputMapperTest --- class JoystickInputMapperTest : public InputMapperTest { protected: static const int32_t RAW_X_MIN; static const int32_t RAW_X_MAX; static const int32_t RAW_Y_MIN; static const int32_t RAW_Y_MAX; void SetUp() override { InputMapperTest::SetUp(InputDeviceClass::JOYSTICK | InputDeviceClass::EXTERNAL); } void prepareAxes() { mFakeEventHub->addAbsoluteAxis(EVENTHUB_ID, ABS_X, RAW_X_MIN, RAW_X_MAX, 0, 0); mFakeEventHub->addAbsoluteAxis(EVENTHUB_ID, ABS_Y, RAW_Y_MIN, RAW_Y_MAX, 0, 0); } void processAxis(JoystickInputMapper& mapper, int32_t axis, int32_t value) { process(mapper, ARBITRARY_TIME, READ_TIME, EV_ABS, axis, value); } void processSync(JoystickInputMapper& mapper) { process(mapper, ARBITRARY_TIME, READ_TIME, EV_SYN, SYN_REPORT, 0); } void prepareVirtualDisplay(int32_t orientation) { setDisplayInfoAndReconfigure(VIRTUAL_DISPLAY_ID, VIRTUAL_DISPLAY_WIDTH, VIRTUAL_DISPLAY_HEIGHT, orientation, VIRTUAL_DISPLAY_UNIQUE_ID, NO_PORT, ViewportType::VIRTUAL); } }; const int32_t JoystickInputMapperTest::RAW_X_MIN = -32767; const int32_t JoystickInputMapperTest::RAW_X_MAX = 32767; const int32_t JoystickInputMapperTest::RAW_Y_MIN = -32767; const int32_t JoystickInputMapperTest::RAW_Y_MAX = 32767; TEST_F(JoystickInputMapperTest, Configure_AssignsDisplayUniqueId) { prepareAxes(); JoystickInputMapper& mapper = addMapperAndConfigure<JoystickInputMapper>(); mFakePolicy->addInputUniqueIdAssociation(DEVICE_LOCATION, VIRTUAL_DISPLAY_UNIQUE_ID); prepareVirtualDisplay(DISPLAY_ORIENTATION_0); // Send an axis event processAxis(mapper, ABS_X, 100); processSync(mapper); NotifyMotionArgs args; ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args)); ASSERT_EQ(VIRTUAL_DISPLAY_ID, args.displayId); // Send another axis event processAxis(mapper, ABS_Y, 100); processSync(mapper); ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args)); ASSERT_EQ(VIRTUAL_DISPLAY_ID, args.displayId); } // --- PeripheralControllerTest --- class PeripheralControllerTest : public testing::Test { Loading