Loading libs/input/input_flags.aconfig +7 −0 Original line number Diff line number Diff line Loading @@ -42,6 +42,13 @@ flag { bug: "299977100" } flag { name: "report_palms_to_gestures_library" namespace: "input" description: "Report touches marked as palm by firmware to gestures library" bug: "302505955" } flag { name: "enable_touchpad_typing_palm_rejection" namespace: "input" Loading services/inputflinger/reader/mapper/gestures/HardwareStateConverter.cpp +11 −1 Original line number Diff line number Diff line Loading @@ -22,10 +22,15 @@ #include <chrono> #include <vector> #include <com_android_input_flags.h> #include <linux/input-event-codes.h> namespace input_flags = com::android::input::flags; namespace android { const bool REPORT_PALMS_TO_GESTURES_LIBRARY = input_flags::report_palms_to_gestures_library(); HardwareStateConverter::HardwareStateConverter(const InputDeviceContext& deviceContext, MultiTouchMotionAccumulator& motionAccumulator) : mDeviceContext(deviceContext), Loading Loading @@ -84,7 +89,7 @@ SelfContainedHardwareState HardwareStateConverter::produceHardwareState(nsecs_t } // Some touchpads continue to report contacts even after they've identified them as palms. // We want to exclude these contacts from the HardwareStates. if (slot.getToolType() == ToolType::PALM) { if (!REPORT_PALMS_TO_GESTURES_LIBRARY && slot.getToolType() == ToolType::PALM) { numPalms++; continue; } Loading @@ -100,6 +105,11 @@ SelfContainedHardwareState HardwareStateConverter::produceHardwareState(nsecs_t fingerState.position_x = slot.getX(); fingerState.position_y = slot.getY(); fingerState.tracking_id = slot.getTrackingId(); if (REPORT_PALMS_TO_GESTURES_LIBRARY) { fingerState.tool_type = slot.getToolType() == ToolType::PALM ? FingerState::ToolType::kPalm : FingerState::ToolType::kFinger; } } schs.state.fingers = schs.fingers.data(); schs.state.finger_cnt = schs.fingers.size(); Loading services/inputflinger/tests/HardwareStateConverter_test.cpp +80 −2 Original line number Diff line number Diff line Loading @@ -18,6 +18,8 @@ #include <memory> #include <EventHub.h> #include <com_android_input_flags.h> #include <flag_macros.h> #include <gtest/gtest.h> #include <linux/input-event-codes.h> #include <utils/StrongPointer.h> Loading @@ -31,6 +33,13 @@ namespace android { namespace { const auto REPORT_PALMS = ACONFIG_FLAG(com::android::input::flags, report_palms_to_gestures_library); } // namespace class HardwareStateConverterTest : public testing::Test { public: HardwareStateConverterTest() Loading Loading @@ -192,7 +201,8 @@ TEST_F(HardwareStateConverterTest, TwoFingers) { EXPECT_EQ(0u, finger2.flags); } TEST_F(HardwareStateConverterTest, OnePalm) { TEST_F_WITH_FLAGS(HardwareStateConverterTest, OnePalmDisableReportPalms, REQUIRES_FLAGS_DISABLED(REPORT_PALMS)) { processAxis(ARBITRARY_TIME, EV_ABS, ABS_MT_SLOT, 0); processAxis(ARBITRARY_TIME, EV_ABS, ABS_MT_TOOL_TYPE, MT_TOOL_PALM); processAxis(ARBITRARY_TIME, EV_ABS, ABS_MT_TRACKING_ID, 123); Loading @@ -207,7 +217,25 @@ TEST_F(HardwareStateConverterTest, OnePalm) { EXPECT_EQ(0, schs->state.finger_cnt); } TEST_F(HardwareStateConverterTest, OneFingerTurningIntoAPalm) { TEST_F_WITH_FLAGS(HardwareStateConverterTest, OnePalmEnableReportPalms, REQUIRES_FLAGS_ENABLED(REPORT_PALMS)) { processAxis(ARBITRARY_TIME, EV_ABS, ABS_MT_SLOT, 0); processAxis(ARBITRARY_TIME, EV_ABS, ABS_MT_TOOL_TYPE, MT_TOOL_PALM); processAxis(ARBITRARY_TIME, EV_ABS, ABS_MT_TRACKING_ID, 123); processAxis(ARBITRARY_TIME, EV_ABS, ABS_MT_POSITION_X, 50); processAxis(ARBITRARY_TIME, EV_ABS, ABS_MT_POSITION_Y, 100); processAxis(ARBITRARY_TIME, EV_KEY, BTN_TOUCH, 1); processAxis(ARBITRARY_TIME, EV_KEY, BTN_TOOL_FINGER, 1); std::optional<SelfContainedHardwareState> schs = processSync(ARBITRARY_TIME); ASSERT_TRUE(schs.has_value()); EXPECT_EQ(1, schs->state.touch_cnt); EXPECT_EQ(1, schs->state.finger_cnt); EXPECT_EQ(FingerState::ToolType::kPalm, schs->state.fingers[0].tool_type); } TEST_F_WITH_FLAGS(HardwareStateConverterTest, OneFingerTurningIntoAPalmDisableReportPalms, REQUIRES_FLAGS_DISABLED(REPORT_PALMS)) { processAxis(ARBITRARY_TIME, EV_ABS, ABS_MT_SLOT, 0); processAxis(ARBITRARY_TIME, EV_ABS, ABS_MT_TOOL_TYPE, MT_TOOL_FINGER); processAxis(ARBITRARY_TIME, EV_ABS, ABS_MT_TRACKING_ID, 123); Loading Loading @@ -252,6 +280,56 @@ TEST_F(HardwareStateConverterTest, OneFingerTurningIntoAPalm) { EXPECT_NEAR(95, newFinger.position_y, EPSILON); } TEST_F_WITH_FLAGS(HardwareStateConverterTest, OneFingerTurningIntoAPalmEnableReportPalms, REQUIRES_FLAGS_ENABLED(REPORT_PALMS)) { processAxis(ARBITRARY_TIME, EV_ABS, ABS_MT_SLOT, 0); processAxis(ARBITRARY_TIME, EV_ABS, ABS_MT_TOOL_TYPE, MT_TOOL_FINGER); processAxis(ARBITRARY_TIME, EV_ABS, ABS_MT_TRACKING_ID, 123); processAxis(ARBITRARY_TIME, EV_ABS, ABS_MT_POSITION_X, 50); processAxis(ARBITRARY_TIME, EV_ABS, ABS_MT_POSITION_Y, 100); processAxis(ARBITRARY_TIME, EV_KEY, BTN_TOUCH, 1); processAxis(ARBITRARY_TIME, EV_KEY, BTN_TOOL_FINGER, 1); std::optional<SelfContainedHardwareState> schs = processSync(ARBITRARY_TIME); ASSERT_TRUE(schs.has_value()); EXPECT_EQ(1, schs->state.touch_cnt); EXPECT_EQ(1, schs->state.finger_cnt); EXPECT_EQ(FingerState::ToolType::kFinger, schs->state.fingers[0].tool_type); processAxis(ARBITRARY_TIME, EV_ABS, ABS_MT_TOOL_TYPE, MT_TOOL_PALM); processAxis(ARBITRARY_TIME, EV_ABS, ABS_MT_POSITION_X, 51); processAxis(ARBITRARY_TIME, EV_ABS, ABS_MT_POSITION_Y, 99); schs = processSync(ARBITRARY_TIME); ASSERT_TRUE(schs.has_value()); EXPECT_EQ(1, schs->state.touch_cnt); ASSERT_EQ(1, schs->state.finger_cnt); EXPECT_EQ(FingerState::ToolType::kPalm, schs->state.fingers[0].tool_type); processAxis(ARBITRARY_TIME, EV_ABS, ABS_MT_POSITION_X, 53); processAxis(ARBITRARY_TIME, EV_ABS, ABS_MT_POSITION_Y, 97); schs = processSync(ARBITRARY_TIME); ASSERT_TRUE(schs.has_value()); EXPECT_EQ(1, schs->state.touch_cnt); EXPECT_EQ(1, schs->state.finger_cnt); EXPECT_EQ(FingerState::ToolType::kPalm, schs->state.fingers[0].tool_type); processAxis(ARBITRARY_TIME, EV_ABS, ABS_MT_TOOL_TYPE, MT_TOOL_FINGER); processAxis(ARBITRARY_TIME, EV_ABS, ABS_MT_POSITION_X, 55); processAxis(ARBITRARY_TIME, EV_ABS, ABS_MT_POSITION_Y, 95); schs = processSync(ARBITRARY_TIME); ASSERT_TRUE(schs.has_value()); EXPECT_EQ(1, schs->state.touch_cnt); ASSERT_EQ(1, schs->state.finger_cnt); const FingerState& newFinger = schs->state.fingers[0]; EXPECT_EQ(FingerState::ToolType::kFinger, newFinger.tool_type); EXPECT_EQ(123, newFinger.tracking_id); EXPECT_NEAR(55, newFinger.position_x, EPSILON); EXPECT_NEAR(95, newFinger.position_y, EPSILON); } TEST_F(HardwareStateConverterTest, ButtonPressed) { processAxis(ARBITRARY_TIME, EV_KEY, BTN_LEFT, 1); std::optional<SelfContainedHardwareState> schs = processSync(ARBITRARY_TIME); Loading Loading
libs/input/input_flags.aconfig +7 −0 Original line number Diff line number Diff line Loading @@ -42,6 +42,13 @@ flag { bug: "299977100" } flag { name: "report_palms_to_gestures_library" namespace: "input" description: "Report touches marked as palm by firmware to gestures library" bug: "302505955" } flag { name: "enable_touchpad_typing_palm_rejection" namespace: "input" Loading
services/inputflinger/reader/mapper/gestures/HardwareStateConverter.cpp +11 −1 Original line number Diff line number Diff line Loading @@ -22,10 +22,15 @@ #include <chrono> #include <vector> #include <com_android_input_flags.h> #include <linux/input-event-codes.h> namespace input_flags = com::android::input::flags; namespace android { const bool REPORT_PALMS_TO_GESTURES_LIBRARY = input_flags::report_palms_to_gestures_library(); HardwareStateConverter::HardwareStateConverter(const InputDeviceContext& deviceContext, MultiTouchMotionAccumulator& motionAccumulator) : mDeviceContext(deviceContext), Loading Loading @@ -84,7 +89,7 @@ SelfContainedHardwareState HardwareStateConverter::produceHardwareState(nsecs_t } // Some touchpads continue to report contacts even after they've identified them as palms. // We want to exclude these contacts from the HardwareStates. if (slot.getToolType() == ToolType::PALM) { if (!REPORT_PALMS_TO_GESTURES_LIBRARY && slot.getToolType() == ToolType::PALM) { numPalms++; continue; } Loading @@ -100,6 +105,11 @@ SelfContainedHardwareState HardwareStateConverter::produceHardwareState(nsecs_t fingerState.position_x = slot.getX(); fingerState.position_y = slot.getY(); fingerState.tracking_id = slot.getTrackingId(); if (REPORT_PALMS_TO_GESTURES_LIBRARY) { fingerState.tool_type = slot.getToolType() == ToolType::PALM ? FingerState::ToolType::kPalm : FingerState::ToolType::kFinger; } } schs.state.fingers = schs.fingers.data(); schs.state.finger_cnt = schs.fingers.size(); Loading
services/inputflinger/tests/HardwareStateConverter_test.cpp +80 −2 Original line number Diff line number Diff line Loading @@ -18,6 +18,8 @@ #include <memory> #include <EventHub.h> #include <com_android_input_flags.h> #include <flag_macros.h> #include <gtest/gtest.h> #include <linux/input-event-codes.h> #include <utils/StrongPointer.h> Loading @@ -31,6 +33,13 @@ namespace android { namespace { const auto REPORT_PALMS = ACONFIG_FLAG(com::android::input::flags, report_palms_to_gestures_library); } // namespace class HardwareStateConverterTest : public testing::Test { public: HardwareStateConverterTest() Loading Loading @@ -192,7 +201,8 @@ TEST_F(HardwareStateConverterTest, TwoFingers) { EXPECT_EQ(0u, finger2.flags); } TEST_F(HardwareStateConverterTest, OnePalm) { TEST_F_WITH_FLAGS(HardwareStateConverterTest, OnePalmDisableReportPalms, REQUIRES_FLAGS_DISABLED(REPORT_PALMS)) { processAxis(ARBITRARY_TIME, EV_ABS, ABS_MT_SLOT, 0); processAxis(ARBITRARY_TIME, EV_ABS, ABS_MT_TOOL_TYPE, MT_TOOL_PALM); processAxis(ARBITRARY_TIME, EV_ABS, ABS_MT_TRACKING_ID, 123); Loading @@ -207,7 +217,25 @@ TEST_F(HardwareStateConverterTest, OnePalm) { EXPECT_EQ(0, schs->state.finger_cnt); } TEST_F(HardwareStateConverterTest, OneFingerTurningIntoAPalm) { TEST_F_WITH_FLAGS(HardwareStateConverterTest, OnePalmEnableReportPalms, REQUIRES_FLAGS_ENABLED(REPORT_PALMS)) { processAxis(ARBITRARY_TIME, EV_ABS, ABS_MT_SLOT, 0); processAxis(ARBITRARY_TIME, EV_ABS, ABS_MT_TOOL_TYPE, MT_TOOL_PALM); processAxis(ARBITRARY_TIME, EV_ABS, ABS_MT_TRACKING_ID, 123); processAxis(ARBITRARY_TIME, EV_ABS, ABS_MT_POSITION_X, 50); processAxis(ARBITRARY_TIME, EV_ABS, ABS_MT_POSITION_Y, 100); processAxis(ARBITRARY_TIME, EV_KEY, BTN_TOUCH, 1); processAxis(ARBITRARY_TIME, EV_KEY, BTN_TOOL_FINGER, 1); std::optional<SelfContainedHardwareState> schs = processSync(ARBITRARY_TIME); ASSERT_TRUE(schs.has_value()); EXPECT_EQ(1, schs->state.touch_cnt); EXPECT_EQ(1, schs->state.finger_cnt); EXPECT_EQ(FingerState::ToolType::kPalm, schs->state.fingers[0].tool_type); } TEST_F_WITH_FLAGS(HardwareStateConverterTest, OneFingerTurningIntoAPalmDisableReportPalms, REQUIRES_FLAGS_DISABLED(REPORT_PALMS)) { processAxis(ARBITRARY_TIME, EV_ABS, ABS_MT_SLOT, 0); processAxis(ARBITRARY_TIME, EV_ABS, ABS_MT_TOOL_TYPE, MT_TOOL_FINGER); processAxis(ARBITRARY_TIME, EV_ABS, ABS_MT_TRACKING_ID, 123); Loading Loading @@ -252,6 +280,56 @@ TEST_F(HardwareStateConverterTest, OneFingerTurningIntoAPalm) { EXPECT_NEAR(95, newFinger.position_y, EPSILON); } TEST_F_WITH_FLAGS(HardwareStateConverterTest, OneFingerTurningIntoAPalmEnableReportPalms, REQUIRES_FLAGS_ENABLED(REPORT_PALMS)) { processAxis(ARBITRARY_TIME, EV_ABS, ABS_MT_SLOT, 0); processAxis(ARBITRARY_TIME, EV_ABS, ABS_MT_TOOL_TYPE, MT_TOOL_FINGER); processAxis(ARBITRARY_TIME, EV_ABS, ABS_MT_TRACKING_ID, 123); processAxis(ARBITRARY_TIME, EV_ABS, ABS_MT_POSITION_X, 50); processAxis(ARBITRARY_TIME, EV_ABS, ABS_MT_POSITION_Y, 100); processAxis(ARBITRARY_TIME, EV_KEY, BTN_TOUCH, 1); processAxis(ARBITRARY_TIME, EV_KEY, BTN_TOOL_FINGER, 1); std::optional<SelfContainedHardwareState> schs = processSync(ARBITRARY_TIME); ASSERT_TRUE(schs.has_value()); EXPECT_EQ(1, schs->state.touch_cnt); EXPECT_EQ(1, schs->state.finger_cnt); EXPECT_EQ(FingerState::ToolType::kFinger, schs->state.fingers[0].tool_type); processAxis(ARBITRARY_TIME, EV_ABS, ABS_MT_TOOL_TYPE, MT_TOOL_PALM); processAxis(ARBITRARY_TIME, EV_ABS, ABS_MT_POSITION_X, 51); processAxis(ARBITRARY_TIME, EV_ABS, ABS_MT_POSITION_Y, 99); schs = processSync(ARBITRARY_TIME); ASSERT_TRUE(schs.has_value()); EXPECT_EQ(1, schs->state.touch_cnt); ASSERT_EQ(1, schs->state.finger_cnt); EXPECT_EQ(FingerState::ToolType::kPalm, schs->state.fingers[0].tool_type); processAxis(ARBITRARY_TIME, EV_ABS, ABS_MT_POSITION_X, 53); processAxis(ARBITRARY_TIME, EV_ABS, ABS_MT_POSITION_Y, 97); schs = processSync(ARBITRARY_TIME); ASSERT_TRUE(schs.has_value()); EXPECT_EQ(1, schs->state.touch_cnt); EXPECT_EQ(1, schs->state.finger_cnt); EXPECT_EQ(FingerState::ToolType::kPalm, schs->state.fingers[0].tool_type); processAxis(ARBITRARY_TIME, EV_ABS, ABS_MT_TOOL_TYPE, MT_TOOL_FINGER); processAxis(ARBITRARY_TIME, EV_ABS, ABS_MT_POSITION_X, 55); processAxis(ARBITRARY_TIME, EV_ABS, ABS_MT_POSITION_Y, 95); schs = processSync(ARBITRARY_TIME); ASSERT_TRUE(schs.has_value()); EXPECT_EQ(1, schs->state.touch_cnt); ASSERT_EQ(1, schs->state.finger_cnt); const FingerState& newFinger = schs->state.fingers[0]; EXPECT_EQ(FingerState::ToolType::kFinger, newFinger.tool_type); EXPECT_EQ(123, newFinger.tracking_id); EXPECT_NEAR(55, newFinger.position_x, EPSILON); EXPECT_NEAR(95, newFinger.position_y, EPSILON); } TEST_F(HardwareStateConverterTest, ButtonPressed) { processAxis(ARBITRARY_TIME, EV_KEY, BTN_LEFT, 1); std::optional<SelfContainedHardwareState> schs = processSync(ARBITRARY_TIME); Loading