diff options
author | Treehugger Robot <android-test-infra-autosubmit@system.gserviceaccount.com> | 2023-11-30 05:56:56 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2023-11-30 05:56:56 +0000 |
commit | cd168880f42778932e40f92a8aa06c204a9bb90d (patch) | |
tree | 206adb799e66bc1ccc728cac0f0826a4a36ebfa9 | |
parent | fd27110269d6f4cf327dfcb3aeefae373b78b9fe (diff) | |
parent | 314e7abd233049fff633fb9fca3adfcf7e28046e (diff) | |
download | native-cd168880f42778932e40f92a8aa06c204a9bb90d.tar.gz |
Merge "Add test to ensure a keyboard with HID usage support is not a stylus" into android14-gsi
-rw-r--r-- | services/inputflinger/tests/InputReader_test.cpp | 22 | ||||
-rw-r--r-- | services/inputflinger/tests/UinputDevice.cpp | 12 | ||||
-rw-r--r-- | services/inputflinger/tests/UinputDevice.h | 19 |
3 files changed, 52 insertions, 1 deletions
diff --git a/services/inputflinger/tests/InputReader_test.cpp b/services/inputflinger/tests/InputReader_test.cpp index a70f10b81c..38b32b3632 100644 --- a/services/inputflinger/tests/InputReader_test.cpp +++ b/services/inputflinger/tests/InputReader_test.cpp @@ -1494,6 +1494,28 @@ TEST_F(InputReaderIntegrationTest, KeyboardWithStylusButtons) { ASSERT_EQ(AINPUT_KEYBOARD_TYPE_ALPHABETIC, device->getKeyboardType()); } +TEST_F(InputReaderIntegrationTest, HidUsageKeyboardIsNotAStylus) { + // Create a Uinput keyboard that simulates a keyboard that can report HID usage codes. The + // hid-input driver reports HID usage codes using the value for EV_MSC MSC_SCAN event. + std::unique_ptr<UinputKeyboardWithHidUsage> keyboard = + createUinputDevice<UinputKeyboardWithHidUsage>( + std::initializer_list<int>{KEY_VOLUMEUP, KEY_VOLUMEDOWN}); + ASSERT_NO_FATAL_FAILURE(mFakePolicy->assertInputDevicesChanged()); + + const auto device = findDeviceByName(keyboard->getName()); + ASSERT_TRUE(device.has_value()); + + ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, device->getSources()) + << "Unexpected source " << inputEventSourceToString(device->getSources()).c_str(); + + // If a device supports reporting HID usage codes, it shouldn't automatically support + // stylus keys. + const std::vector<int> keycodes{AKEYCODE_STYLUS_BUTTON_PRIMARY}; + uint8_t outFlags[] = {0}; + ASSERT_TRUE(mReader->hasKeys(device->getId(), AINPUT_SOURCE_KEYBOARD, keycodes, outFlags)); + ASSERT_EQ(0, outFlags[0]) << "Keyboard should not have stylus button"; +} + /** * 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 diff --git a/services/inputflinger/tests/UinputDevice.cpp b/services/inputflinger/tests/UinputDevice.cpp index 97a26141e0..5a654c907d 100644 --- a/services/inputflinger/tests/UinputDevice.cpp +++ b/services/inputflinger/tests/UinputDevice.cpp @@ -157,6 +157,18 @@ void UinputExternalStylusWithPressure::setPressure(int32_t pressure) { injectEvent(EV_SYN, SYN_REPORT, 0); } +// --- UinputKeyboardWithHidUsage --- + +UinputKeyboardWithHidUsage::UinputKeyboardWithHidUsage(std::initializer_list<int> keys) + : UinputKeyboard(DEVICE_NAME, PRODUCT_ID, keys) {} + +void UinputKeyboardWithHidUsage::configureDevice(int fd, uinput_user_dev* device) { + UinputKeyboard::configureDevice(fd, device); + + ioctl(fd, UI_SET_EVBIT, EV_MSC); + ioctl(fd, UI_SET_MSCBIT, MSC_SCAN); +} + // --- UinputTouchScreen --- UinputTouchScreen::UinputTouchScreen(const Rect& size) diff --git a/services/inputflinger/tests/UinputDevice.h b/services/inputflinger/tests/UinputDevice.h index 51e331df8f..55996b8bfe 100644 --- a/services/inputflinger/tests/UinputDevice.h +++ b/services/inputflinger/tests/UinputDevice.h @@ -165,13 +165,30 @@ private: explicit UinputExternalStylusWithPressure(); }; +// --- UinputKeyboardWithUsage --- +// A keyboard that supports EV_MSC MSC_SCAN through which it can report HID usage codes. + +class UinputKeyboardWithHidUsage : public UinputKeyboard { +public: + static constexpr const char* DEVICE_NAME = "Test Uinput Keyboard With Usage"; + static constexpr int16_t PRODUCT_ID = 47; + + template <class D, class... Ts> + friend std::unique_ptr<D> createUinputDevice(Ts... args); + +protected: + explicit UinputKeyboardWithHidUsage(std::initializer_list<int> keys); + + void configureDevice(int fd, uinput_user_dev* device) override; +}; + // --- UinputTouchScreen --- // A multi-touch touchscreen device with specific size that also supports styluses. class UinputTouchScreen : public UinputKeyboard { public: static constexpr const char* DEVICE_NAME = "Test Uinput Touch Screen"; - static constexpr int16_t PRODUCT_ID = 47; + static constexpr int16_t PRODUCT_ID = 48; static const int32_t RAW_TOUCH_MIN = 0; static const int32_t RAW_TOUCH_MAX = 31; |