diff options
| author | 2023-12-01 08:11:48 +0000 | |
|---|---|---|
| committer | 2023-12-01 08:11:48 +0000 | |
| commit | 1a17932b42876c6ebf08362ba2ffa07bed2f862a (patch) | |
| tree | 7e48817e9d5cfbf3404b28c2159996abc4d8d18f | |
| parent | d7d9de5a1423784eb3281b1509b5666fdf4fae2e (diff) | |
| parent | 17dd1d764ea13d2150d30651f7aaec505adccb4a (diff) | |
Merge "Report palms from firmware to gestures library" into main
| -rw-r--r-- | libs/input/input_flags.aconfig | 7 | ||||
| -rw-r--r-- | services/inputflinger/reader/mapper/gestures/HardwareStateConverter.cpp | 12 | ||||
| -rw-r--r-- | services/inputflinger/tests/HardwareStateConverter_test.cpp | 82 |
3 files changed, 98 insertions, 3 deletions
diff --git a/libs/input/input_flags.aconfig b/libs/input/input_flags.aconfig index a807d823f1..d13a2606c2 100644 --- a/libs/input/input_flags.aconfig +++ b/libs/input/input_flags.aconfig @@ -43,6 +43,13 @@ flag { } 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" description: "Enable additional palm rejection on touchpad while typing" diff --git a/services/inputflinger/reader/mapper/gestures/HardwareStateConverter.cpp b/services/inputflinger/reader/mapper/gestures/HardwareStateConverter.cpp index 6780dcedec..b89b7f38a9 100644 --- a/services/inputflinger/reader/mapper/gestures/HardwareStateConverter.cpp +++ b/services/inputflinger/reader/mapper/gestures/HardwareStateConverter.cpp @@ -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), @@ -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; } @@ -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(); diff --git a/services/inputflinger/tests/HardwareStateConverter_test.cpp b/services/inputflinger/tests/HardwareStateConverter_test.cpp index 5bea2bac18..ff9bd9e75b 100644 --- a/services/inputflinger/tests/HardwareStateConverter_test.cpp +++ b/services/inputflinger/tests/HardwareStateConverter_test.cpp @@ -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> @@ -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() @@ -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); @@ -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); @@ -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); |