diff options
| author | 2023-08-18 20:02:01 +0000 | |
|---|---|---|
| committer | 2023-08-22 15:34:55 +0000 | |
| commit | 05f6c605e2a1af6baf1fe9df1ff3b0383dfa0116 (patch) | |
| tree | fe43342e630fd7c8ffe9ff49adbd93c001b8df15 | |
| parent | 19603058f849e776277e7fa7ff20e48bc8acf2db (diff) | |
Prevent keyboards from being recognized as a stylus
We are getting reports of keyboards and other peripherals being
misconfigured as a stylus, because they report support for stylus
buttons.
To eliminate some of these misconfigurations, prevent anything detected
as a alphabetical keyboard from being categorized as a stylus.
Bug: 293996865
Test: None
Change-Id: I3f071d2ac6a2b70abc1130b4d5df1509452bb63b
(cherry picked from commit 3c28b94505b5c6edaeb7e0df3ace7cf3f8125887)
| -rw-r--r-- | services/inputflinger/reader/EventHub.cpp | 1 | ||||
| -rw-r--r-- | services/inputflinger/tests/InputReader_test.cpp | 18 |
2 files changed, 19 insertions, 0 deletions
diff --git a/services/inputflinger/reader/EventHub.cpp b/services/inputflinger/reader/EventHub.cpp index 4d0e13ed2f..44e80a732c 100644 --- a/services/inputflinger/reader/EventHub.cpp +++ b/services/inputflinger/reader/EventHub.cpp @@ -2403,6 +2403,7 @@ void EventHub::openDeviceLocked(const std::string& devicePath) { // See if this device has any stylus buttons that we would want to fuse with touch data. if (!device->classes.any(InputDeviceClass::TOUCH | InputDeviceClass::TOUCH_MT) && + !device->classes.any(InputDeviceClass::ALPHAKEY) && std::any_of(STYLUS_BUTTON_KEYCODES.begin(), STYLUS_BUTTON_KEYCODES.end(), [&](int32_t keycode) { return device->hasKeycodeLocked(keycode); })) { device->classes |= InputDeviceClass::EXTERNAL_STYLUS; diff --git a/services/inputflinger/tests/InputReader_test.cpp b/services/inputflinger/tests/InputReader_test.cpp index d1c3f7d156..dd93e93a86 100644 --- a/services/inputflinger/tests/InputReader_test.cpp +++ b/services/inputflinger/tests/InputReader_test.cpp @@ -1476,6 +1476,24 @@ TEST_F(InputReaderIntegrationTest, ExternalStylusesButtons) { AllOf(UP, WithKeyCode(AKEYCODE_STYLUS_BUTTON_TERTIARY)))); } +TEST_F(InputReaderIntegrationTest, KeyboardWithStylusButtons) { + std::unique_ptr<UinputKeyboard> keyboard = + createUinputDevice<UinputKeyboard>("KeyboardWithStylusButtons", /*productId=*/99, + std::initializer_list<int>{KEY_Q, KEY_W, KEY_E, + KEY_R, KEY_T, KEY_Y, + BTN_STYLUS, BTN_STYLUS2, + BTN_STYLUS3}); + ASSERT_NO_FATAL_FAILURE(mFakePolicy->assertInputDevicesChanged()); + + const auto device = findDeviceByName(keyboard->getName()); + ASSERT_TRUE(device.has_value()); + + // An alphabetical keyboard that reports stylus buttons should not be recognized as a stylus. + ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, device->getSources()) + << "Unexpected source " << inputEventSourceToString(device->getSources()).c_str(); + ASSERT_EQ(AINPUT_KEYBOARD_TYPE_ALPHABETIC, device->getKeyboardType()); +} + /** * The Steam controller sends BTN_GEAR_DOWN and BTN_GEAR_UP for the two "paddle" buttons * on the back. In this test, we make sure that BTN_GEAR_DOWN / BTN_WHEEL and BTN_GEAR_UP |