diff options
author | 2024-10-11 22:19:28 +0000 | |
---|---|---|
committer | 2024-10-11 22:19:28 +0000 | |
commit | f7f93f5fd5afa40858ac492402ec6cc85fe89275 (patch) | |
tree | 4d39809c938d181d1c80af05b2ae44c2bcfe700a | |
parent | f6abbf4b919b121614384ab2286bcaf16bedd344 (diff) |
Revert "Reject inconsistent globally injected events"
This reverts commit f6abbf4b919b121614384ab2286bcaf16bedd344.
Reason for revert: DroidMonitor: Potential culprit for http://b/372964183 - verifying through ABTD before revert submission. This is part of the standard investigation process, and does not mean your CL will be reverted
Change-Id: I9cdb4dfb4ca14a90d7527e5f546380ea6ec1d62f
-rw-r--r-- | include/input/InputEventBuilders.h | 3 | ||||
-rw-r--r-- | services/inputflinger/dispatcher/InputDispatcher.cpp | 63 | ||||
-rw-r--r-- | services/inputflinger/dispatcher/InputDispatcher.h | 4 | ||||
-rw-r--r-- | services/inputflinger/tests/InputDispatcher_test.cpp | 16 |
4 files changed, 26 insertions, 60 deletions
diff --git a/include/input/InputEventBuilders.h b/include/input/InputEventBuilders.h index 1696a62693..1899a66159 100644 --- a/include/input/InputEventBuilders.h +++ b/include/input/InputEventBuilders.h @@ -250,9 +250,6 @@ class MotionEventBuilder { public: MotionEventBuilder(int32_t action, int32_t source) { mAction = action; - if (mAction == AMOTION_EVENT_ACTION_CANCEL) { - mFlags |= AMOTION_EVENT_FLAG_CANCELED; - } mSource = source; mEventTime = systemTime(SYSTEM_TIME_MONOTONIC); mDownTime = mEventTime; diff --git a/services/inputflinger/dispatcher/InputDispatcher.cpp b/services/inputflinger/dispatcher/InputDispatcher.cpp index f6182771fc..4b43c277b6 100644 --- a/services/inputflinger/dispatcher/InputDispatcher.cpp +++ b/services/inputflinger/dispatcher/InputDispatcher.cpp @@ -4796,39 +4796,6 @@ void InputDispatcher::notifyPointerCaptureChanged(const NotifyPointerCaptureChan } } -bool InputDispatcher::shouldRejectInjectedMotionLocked(const MotionEvent& motionEvent, - DeviceId deviceId, - ui::LogicalDisplayId displayId, - std::optional<gui::Uid> targetUid, - int32_t flags) { - // Don't verify targeted injection, since it will only affect the caller's - // window, and the windows are typically destroyed at the end of the test. - if (targetUid.has_value()) { - return false; - } - - // Verify all other injected streams, whether the injection is coming from apps or from - // input filter. Print an error if the stream becomes inconsistent with this event. - // An inconsistent injected event sent could cause a crash in the later stages of - // dispatching pipeline. - auto [it, _] = mInputFilterVerifiersByDisplay.try_emplace(displayId, - std::string("Injection on ") + - displayId.toString()); - InputVerifier& verifier = it->second; - - Result<void> result = - verifier.processMovement(deviceId, motionEvent.getSource(), motionEvent.getAction(), - motionEvent.getPointerCount(), - motionEvent.getPointerProperties(), - motionEvent.getSamplePointerCoords(), flags); - if (!result.ok()) { - logDispatchStateLocked(); - LOG(ERROR) << "Inconsistent event: " << motionEvent << ", reason: " << result.error(); - return true; - } - return false; -} - InputEventInjectionResult InputDispatcher::injectInputEvent(const InputEvent* event, std::optional<gui::Uid> targetUid, InputEventInjectionSync syncMode, @@ -4939,10 +4906,32 @@ InputEventInjectionResult InputDispatcher::injectInputEvent(const InputEvent* ev mLock.lock(); - if (shouldRejectInjectedMotionLocked(motionEvent, resolvedDeviceId, displayId, - targetUid, flags)) { - mLock.unlock(); - return InputEventInjectionResult::FAILED; + { + // Verify all injected streams, whether the injection is coming from apps or from + // input filter. Print an error if the stream becomes inconsistent with this event. + // An inconsistent injected event sent could cause a crash in the later stages of + // dispatching pipeline. + auto [it, _] = + mInputFilterVerifiersByDisplay.try_emplace(displayId, + std::string("Injection on ") + + displayId.toString()); + InputVerifier& verifier = it->second; + + Result<void> result = + verifier.processMovement(resolvedDeviceId, motionEvent.getSource(), + motionEvent.getAction(), + motionEvent.getPointerCount(), + motionEvent.getPointerProperties(), + motionEvent.getSamplePointerCoords(), flags); + if (!result.ok()) { + logDispatchStateLocked(); + LOG(ERROR) << "Inconsistent event: " << motionEvent + << ", reason: " << result.error(); + if (policyFlags & POLICY_FLAG_INJECTED_FROM_ACCESSIBILITY) { + mLock.unlock(); + return InputEventInjectionResult::FAILED; + } + } } const nsecs_t* sampleEventTimes = motionEvent.getSampleEventTimes(); diff --git a/services/inputflinger/dispatcher/InputDispatcher.h b/services/inputflinger/dispatcher/InputDispatcher.h index a6b7cc75c1..24e36ae710 100644 --- a/services/inputflinger/dispatcher/InputDispatcher.h +++ b/services/inputflinger/dispatcher/InputDispatcher.h @@ -299,10 +299,6 @@ private: // Event injection and synchronization. std::condition_variable mInjectionResultAvailable; - bool shouldRejectInjectedMotionLocked(const MotionEvent& motion, DeviceId deviceId, - ui::LogicalDisplayId displayId, - std::optional<gui::Uid> targetUid, int32_t flags) - REQUIRES(mLock); void setInjectionResult(const EventEntry& entry, android::os::InputEventInjectionResult injectionResult); void transformMotionEntryForInjectionLocked(MotionEntry&, diff --git a/services/inputflinger/tests/InputDispatcher_test.cpp b/services/inputflinger/tests/InputDispatcher_test.cpp index df8bb99520..c5702e92d9 100644 --- a/services/inputflinger/tests/InputDispatcher_test.cpp +++ b/services/inputflinger/tests/InputDispatcher_test.cpp @@ -12889,22 +12889,6 @@ TEST_F(InputDispatcherDragTests, DragAndDropFinishedWhenCancelCurrentTouch) { // Remove drag window mDispatcher->onWindowInfosChanged({{*mWindow->getInfo(), *mSecondWindow->getInfo()}, {}, 0, 0}); - // Complete the first event stream, even though the injection will fail because there aren't any - // valid targets to dispatch this event to. This is still needed to make the input stream - // consistent - ASSERT_EQ(InputEventInjectionResult::FAILED, - injectMotionEvent(*mDispatcher, - MotionEventBuilder(ACTION_CANCEL, AINPUT_SOURCE_TOUCHSCREEN) - .displayId(ui::LogicalDisplayId::DEFAULT) - .pointer(PointerBuilder(/*id=*/0, ToolType::FINGER) - .x(150) - .y(50)) - .pointer(PointerBuilder(/*id=*/1, ToolType::FINGER) - .x(50) - .y(50)) - .build(), - INJECT_EVENT_TIMEOUT, InputEventInjectionSync::WAIT_FOR_RESULT)); - // Inject a simple gesture, ensure dispatcher not crashed ASSERT_EQ(InputEventInjectionResult::SUCCEEDED, injectMotionDown(*mDispatcher, AINPUT_SOURCE_TOUCHSCREEN, |