Loading services/inputflinger/UnwantedInteractionBlocker.cpp +29 −20 Original line number Diff line number Diff line Loading @@ -616,23 +616,7 @@ std::vector<::ui::InProgressTouchEvdev> getTouches(const NotifyMotionArgs& args, return touches; } std::vector<NotifyMotionArgs> PalmRejector::processMotion(const NotifyMotionArgs& args) { if (mPalmDetectionFilter == nullptr) { return {args}; } const bool skipThisEvent = args.action == AMOTION_EVENT_ACTION_HOVER_ENTER || args.action == AMOTION_EVENT_ACTION_HOVER_MOVE || args.action == AMOTION_EVENT_ACTION_HOVER_EXIT || args.action == AMOTION_EVENT_ACTION_BUTTON_PRESS || args.action == AMOTION_EVENT_ACTION_BUTTON_RELEASE || args.action == AMOTION_EVENT_ACTION_SCROLL; if (skipThisEvent) { // Lets not process hover events, button events, or scroll for now. return {args}; } if (args.action == AMOTION_EVENT_ACTION_DOWN) { mSuppressedPointerIds.clear(); } std::set<int32_t> PalmRejector::detectPalmPointers(const NotifyMotionArgs& args) { std::bitset<::ui::kNumTouchEvdevSlots> slotsToHold; std::bitset<::ui::kNumTouchEvdevSlots> slotsToSuppress; Loading @@ -640,6 +624,7 @@ std::vector<NotifyMotionArgs> PalmRejector::processMotion(const NotifyMotionArgs // the slots that have been removed due to the incoming event. SlotState oldSlotState = mSlotState; mSlotState.update(args); std::vector<::ui::InProgressTouchEvdev> touches = getTouches(args, mDeviceInfo, oldSlotState, mSlotState); ::base::TimeTicks chromeTimestamp = toChromeTimestamp(args.eventTime); Loading @@ -651,14 +636,14 @@ std::vector<NotifyMotionArgs> PalmRejector::processMotion(const NotifyMotionArgs } ALOGD("Filter: touches = %s", touchesStream.str().c_str()); } mPalmDetectionFilter->Filter(touches, chromeTimestamp, &slotsToHold, &slotsToSuppress); ALOGD_IF(DEBUG_MODEL, "Response: slotsToHold = %s, slotsToSuppress = %s", slotsToHold.to_string().c_str(), slotsToSuppress.to_string().c_str()); // Now that we know which slots should be suppressed, let's convert those to pointer id's. std::set<int32_t> oldSuppressedIds; std::swap(oldSuppressedIds, mSuppressedPointerIds); std::set<int32_t> newSuppressedIds; for (size_t i = 0; i < args.pointerCount; i++) { const int32_t pointerId = args.pointerProperties[i].id; std::optional<size_t> slot = oldSlotState.getSlotForPointerId(pointerId); Loading @@ -667,10 +652,34 @@ std::vector<NotifyMotionArgs> PalmRejector::processMotion(const NotifyMotionArgs LOG_ALWAYS_FATAL_IF(!slot, "Could not find slot for pointer id %" PRId32, pointerId); } if (slotsToSuppress.test(*slot)) { mSuppressedPointerIds.insert(pointerId); newSuppressedIds.insert(pointerId); } } return newSuppressedIds; } std::vector<NotifyMotionArgs> PalmRejector::processMotion(const NotifyMotionArgs& args) { if (mPalmDetectionFilter == nullptr) { return {args}; } const bool skipThisEvent = args.action == AMOTION_EVENT_ACTION_HOVER_ENTER || args.action == AMOTION_EVENT_ACTION_HOVER_MOVE || args.action == AMOTION_EVENT_ACTION_HOVER_EXIT || args.action == AMOTION_EVENT_ACTION_BUTTON_PRESS || args.action == AMOTION_EVENT_ACTION_BUTTON_RELEASE || args.action == AMOTION_EVENT_ACTION_SCROLL; if (skipThisEvent) { // Lets not process hover events, button events, or scroll for now. return {args}; } if (args.action == AMOTION_EVENT_ACTION_DOWN) { mSuppressedPointerIds.clear(); } std::set<int32_t> oldSuppressedIds; std::swap(oldSuppressedIds, mSuppressedPointerIds); mSuppressedPointerIds = detectPalmPointers(args); std::vector<NotifyMotionArgs> argsWithoutUnwantedPointers = cancelSuppressedPointers(args, oldSuppressedIds, mSuppressedPointerIds); for (const NotifyMotionArgs& checkArgs : argsWithoutUnwantedPointers) { Loading services/inputflinger/UnwantedInteractionBlocker.h +8 −0 Original line number Diff line number Diff line Loading @@ -154,6 +154,14 @@ private: PalmRejector(const PalmRejector&) = delete; PalmRejector& operator=(const PalmRejector&) = delete; /** * Update the slot state and send this event to the palm rejection model for palm detection. * Return the pointer ids that should be suppressed. * * This function is not const because it has side-effects. It will update the slot state using * the incoming args! Also, it will call Filter(..), which has side-effects. */ std::set<int32_t> detectPalmPointers(const NotifyMotionArgs& args); std::unique_ptr<::ui::SharedPalmDetectionFilterState> mSharedPalmState; AndroidPalmFilterDeviceInfo mDeviceInfo; std::unique_ptr<::ui::PalmDetectionFilter> mPalmDetectionFilter; Loading Loading
services/inputflinger/UnwantedInteractionBlocker.cpp +29 −20 Original line number Diff line number Diff line Loading @@ -616,23 +616,7 @@ std::vector<::ui::InProgressTouchEvdev> getTouches(const NotifyMotionArgs& args, return touches; } std::vector<NotifyMotionArgs> PalmRejector::processMotion(const NotifyMotionArgs& args) { if (mPalmDetectionFilter == nullptr) { return {args}; } const bool skipThisEvent = args.action == AMOTION_EVENT_ACTION_HOVER_ENTER || args.action == AMOTION_EVENT_ACTION_HOVER_MOVE || args.action == AMOTION_EVENT_ACTION_HOVER_EXIT || args.action == AMOTION_EVENT_ACTION_BUTTON_PRESS || args.action == AMOTION_EVENT_ACTION_BUTTON_RELEASE || args.action == AMOTION_EVENT_ACTION_SCROLL; if (skipThisEvent) { // Lets not process hover events, button events, or scroll for now. return {args}; } if (args.action == AMOTION_EVENT_ACTION_DOWN) { mSuppressedPointerIds.clear(); } std::set<int32_t> PalmRejector::detectPalmPointers(const NotifyMotionArgs& args) { std::bitset<::ui::kNumTouchEvdevSlots> slotsToHold; std::bitset<::ui::kNumTouchEvdevSlots> slotsToSuppress; Loading @@ -640,6 +624,7 @@ std::vector<NotifyMotionArgs> PalmRejector::processMotion(const NotifyMotionArgs // the slots that have been removed due to the incoming event. SlotState oldSlotState = mSlotState; mSlotState.update(args); std::vector<::ui::InProgressTouchEvdev> touches = getTouches(args, mDeviceInfo, oldSlotState, mSlotState); ::base::TimeTicks chromeTimestamp = toChromeTimestamp(args.eventTime); Loading @@ -651,14 +636,14 @@ std::vector<NotifyMotionArgs> PalmRejector::processMotion(const NotifyMotionArgs } ALOGD("Filter: touches = %s", touchesStream.str().c_str()); } mPalmDetectionFilter->Filter(touches, chromeTimestamp, &slotsToHold, &slotsToSuppress); ALOGD_IF(DEBUG_MODEL, "Response: slotsToHold = %s, slotsToSuppress = %s", slotsToHold.to_string().c_str(), slotsToSuppress.to_string().c_str()); // Now that we know which slots should be suppressed, let's convert those to pointer id's. std::set<int32_t> oldSuppressedIds; std::swap(oldSuppressedIds, mSuppressedPointerIds); std::set<int32_t> newSuppressedIds; for (size_t i = 0; i < args.pointerCount; i++) { const int32_t pointerId = args.pointerProperties[i].id; std::optional<size_t> slot = oldSlotState.getSlotForPointerId(pointerId); Loading @@ -667,10 +652,34 @@ std::vector<NotifyMotionArgs> PalmRejector::processMotion(const NotifyMotionArgs LOG_ALWAYS_FATAL_IF(!slot, "Could not find slot for pointer id %" PRId32, pointerId); } if (slotsToSuppress.test(*slot)) { mSuppressedPointerIds.insert(pointerId); newSuppressedIds.insert(pointerId); } } return newSuppressedIds; } std::vector<NotifyMotionArgs> PalmRejector::processMotion(const NotifyMotionArgs& args) { if (mPalmDetectionFilter == nullptr) { return {args}; } const bool skipThisEvent = args.action == AMOTION_EVENT_ACTION_HOVER_ENTER || args.action == AMOTION_EVENT_ACTION_HOVER_MOVE || args.action == AMOTION_EVENT_ACTION_HOVER_EXIT || args.action == AMOTION_EVENT_ACTION_BUTTON_PRESS || args.action == AMOTION_EVENT_ACTION_BUTTON_RELEASE || args.action == AMOTION_EVENT_ACTION_SCROLL; if (skipThisEvent) { // Lets not process hover events, button events, or scroll for now. return {args}; } if (args.action == AMOTION_EVENT_ACTION_DOWN) { mSuppressedPointerIds.clear(); } std::set<int32_t> oldSuppressedIds; std::swap(oldSuppressedIds, mSuppressedPointerIds); mSuppressedPointerIds = detectPalmPointers(args); std::vector<NotifyMotionArgs> argsWithoutUnwantedPointers = cancelSuppressedPointers(args, oldSuppressedIds, mSuppressedPointerIds); for (const NotifyMotionArgs& checkArgs : argsWithoutUnwantedPointers) { Loading
services/inputflinger/UnwantedInteractionBlocker.h +8 −0 Original line number Diff line number Diff line Loading @@ -154,6 +154,14 @@ private: PalmRejector(const PalmRejector&) = delete; PalmRejector& operator=(const PalmRejector&) = delete; /** * Update the slot state and send this event to the palm rejection model for palm detection. * Return the pointer ids that should be suppressed. * * This function is not const because it has side-effects. It will update the slot state using * the incoming args! Also, it will call Filter(..), which has side-effects. */ std::set<int32_t> detectPalmPointers(const NotifyMotionArgs& args); std::unique_ptr<::ui::SharedPalmDetectionFilterState> mSharedPalmState; AndroidPalmFilterDeviceInfo mDeviceInfo; std::unique_ptr<::ui::PalmDetectionFilter> mPalmDetectionFilter; Loading