Loading services/inputflinger/dispatcher/InputDispatcher.cpp +26 −0 Original line number Diff line number Diff line Loading @@ -4551,6 +4551,7 @@ void InputDispatcher::notifySwitch(const NotifySwitchArgs& args) { } void InputDispatcher::notifyDeviceReset(const NotifyDeviceResetArgs& args) { // TODO(b/308677868) Remove device reset from the InputListener interface if (debugInboundEventDetails()) { ALOGD("notifyDeviceReset - eventTime=%" PRId64 ", deviceId=%d", args.eventTime, args.deviceId); Loading Loading @@ -4692,6 +4693,30 @@ InputEventInjectionResult InputDispatcher::injectInputEvent(const InputEvent* ev } mLock.lock(); if (policyFlags & POLICY_FLAG_FILTERED) { // The events from InputFilter impersonate real hardware devices. Check these // events for consistency and print an error. An inconsistent event sent from // InputFilter could cause a crash in the later stages of dispatching pipeline. auto [it, _] = mInputFilterVerifiersByDisplay .try_emplace(displayId, StringPrintf("Injection on %" PRId32, displayId)); 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(); } } const nsecs_t* sampleEventTimes = motionEvent.getSampleEventTimes(); const size_t pointerCount = motionEvent.getPointerCount(); const std::vector<PointerProperties> Loading Loading @@ -6756,6 +6781,7 @@ void InputDispatcher::displayRemoved(int32_t displayId) { // Remove the associated touch mode state. mTouchModePerDisplay.erase(displayId); mVerifiersByDisplay.erase(displayId); mInputFilterVerifiersByDisplay.erase(displayId); } // release lock // Wake up poll loop since it may need to make new input dispatching choices. Loading services/inputflinger/dispatcher/InputDispatcher.h +2 −1 Original line number Diff line number Diff line Loading @@ -286,7 +286,8 @@ private: void transformMotionEntryForInjectionLocked(MotionEntry&, const ui::Transform& injectedTransform) const REQUIRES(mLock); // Per-display correction of injected events std::map</*displayId*/ int32_t, InputVerifier> mInputFilterVerifiersByDisplay GUARDED_BY(mLock); std::condition_variable mInjectionSyncFinished; void incrementPendingForegroundDispatches(EventEntry& entry); void decrementPendingForegroundDispatches(EventEntry& entry); Loading Loading
services/inputflinger/dispatcher/InputDispatcher.cpp +26 −0 Original line number Diff line number Diff line Loading @@ -4551,6 +4551,7 @@ void InputDispatcher::notifySwitch(const NotifySwitchArgs& args) { } void InputDispatcher::notifyDeviceReset(const NotifyDeviceResetArgs& args) { // TODO(b/308677868) Remove device reset from the InputListener interface if (debugInboundEventDetails()) { ALOGD("notifyDeviceReset - eventTime=%" PRId64 ", deviceId=%d", args.eventTime, args.deviceId); Loading Loading @@ -4692,6 +4693,30 @@ InputEventInjectionResult InputDispatcher::injectInputEvent(const InputEvent* ev } mLock.lock(); if (policyFlags & POLICY_FLAG_FILTERED) { // The events from InputFilter impersonate real hardware devices. Check these // events for consistency and print an error. An inconsistent event sent from // InputFilter could cause a crash in the later stages of dispatching pipeline. auto [it, _] = mInputFilterVerifiersByDisplay .try_emplace(displayId, StringPrintf("Injection on %" PRId32, displayId)); 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(); } } const nsecs_t* sampleEventTimes = motionEvent.getSampleEventTimes(); const size_t pointerCount = motionEvent.getPointerCount(); const std::vector<PointerProperties> Loading Loading @@ -6756,6 +6781,7 @@ void InputDispatcher::displayRemoved(int32_t displayId) { // Remove the associated touch mode state. mTouchModePerDisplay.erase(displayId); mVerifiersByDisplay.erase(displayId); mInputFilterVerifiersByDisplay.erase(displayId); } // release lock // Wake up poll loop since it may need to make new input dispatching choices. Loading
services/inputflinger/dispatcher/InputDispatcher.h +2 −1 Original line number Diff line number Diff line Loading @@ -286,7 +286,8 @@ private: void transformMotionEntryForInjectionLocked(MotionEntry&, const ui::Transform& injectedTransform) const REQUIRES(mLock); // Per-display correction of injected events std::map</*displayId*/ int32_t, InputVerifier> mInputFilterVerifiersByDisplay GUARDED_BY(mLock); std::condition_variable mInjectionSyncFinished; void incrementPendingForegroundDispatches(EventEntry& entry); void decrementPendingForegroundDispatches(EventEntry& entry); Loading