diff options
author | 2024-03-07 18:08:27 +0000 | |
---|---|---|
committer | 2024-03-07 18:08:27 +0000 | |
commit | 560d0d1599df555e69eec23d423cc4b8c4820c4f (patch) | |
tree | 7f972b4bd7f7bc6e22191f1bf458a2022ad19a65 | |
parent | eaa9fde906b02a87155f54963eb659b6a70830ae (diff) |
InputTracer: Trace resolved key repeat count during dispatch
Since the repeatCount in KeyEntry is mutable, it can change after an
event is traced, which is not ideal.
Until we change this behavior, we should trace the resolved repeat count
during dispatch to account for changed repeat counts.
Bug: 210460522
Test: atest inputflinger_tests
Change-Id: I86cdb2cbbd77b7bb834b9d8e66176837c113c1ca
4 files changed, 10 insertions, 3 deletions
diff --git a/services/inputflinger/dispatcher/Entry.h b/services/inputflinger/dispatcher/Entry.h index 1298b5d511..06d5c7dd4b 100644 --- a/services/inputflinger/dispatcher/Entry.h +++ b/services/inputflinger/dispatcher/Entry.h @@ -140,6 +140,7 @@ struct KeyEntry : EventEntry { mutable InterceptKeyResult interceptKeyResult; // set based on the interception result mutable nsecs_t interceptKeyWakeupTime; // used with INTERCEPT_KEY_RESULT_TRY_AGAIN_LATER mutable int32_t flags; + // TODO(b/328618922): Refactor key repeat generation to make repeatCount non-mutable. mutable int32_t repeatCount; KeyEntry(int32_t id, std::shared_ptr<InjectionState> injectionState, nsecs_t eventTime, diff --git a/services/inputflinger/dispatcher/trace/InputTracer.cpp b/services/inputflinger/dispatcher/trace/InputTracer.cpp index 0be64e67ca..10f6b0f768 100644 --- a/services/inputflinger/dispatcher/trace/InputTracer.cpp +++ b/services/inputflinger/dispatcher/trace/InputTracer.cpp @@ -107,6 +107,10 @@ void InputTracer::eventProcessingComplete(const EventTrackerInterface& cookie) { void InputTracer::traceEventDispatch(const DispatchEntry& dispatchEntry, const EventTrackerInterface* cookie) { const EventEntry& entry = *dispatchEntry.eventEntry; + // TODO(b/328618922): Remove resolved key repeats after making repeatCount non-mutable. + // The KeyEntry's repeatCount is mutable and can be modified after an event is initially traced, + // so we need to find the repeatCount at the time of dispatching to trace it accurately. + int32_t resolvedKeyRepeatCount = 0; TracedEvent traced; if (entry.type == EventEntry::Type::MOTION) { @@ -114,6 +118,7 @@ void InputTracer::traceEventDispatch(const DispatchEntry& dispatchEntry, traced = createTracedEvent(motion); } else if (entry.type == EventEntry::Type::KEY) { const auto& key = static_cast<const KeyEntry&>(entry); + resolvedKeyRepeatCount = key.repeatCount; traced = createTracedEvent(key); } else { LOG(FATAL) << "Cannot trace EventEntry of type: " << ftl::enum_string(entry.type); @@ -133,7 +138,7 @@ void InputTracer::traceEventDispatch(const DispatchEntry& dispatchEntry, mBackend->traceWindowDispatch({std::move(traced), dispatchEntry.deliveryTime, dispatchEntry.resolvedFlags, dispatchEntry.targetUid, vsyncId, windowId, dispatchEntry.transform, dispatchEntry.rawTransform, - /*hmac=*/{}}); + /*hmac=*/{}, resolvedKeyRepeatCount}); } InputTracer::EventState& InputTracer::getState(const EventTrackerInterface& cookie) { diff --git a/services/inputflinger/dispatcher/trace/InputTracingBackendInterface.h b/services/inputflinger/dispatcher/trace/InputTracingBackendInterface.h index b0eadfe51f..94a86b94a2 100644 --- a/services/inputflinger/dispatcher/trace/InputTracingBackendInterface.h +++ b/services/inputflinger/dispatcher/trace/InputTracingBackendInterface.h @@ -98,6 +98,7 @@ public: ui::Transform transform; ui::Transform rawTransform; std::array<uint8_t, 32> hmac; + int32_t resolvedKeyRepeatCount; }; virtual void traceWindowDispatch(const WindowDispatchArgs&) = 0; }; diff --git a/services/inputflinger/tests/FakeInputTracingBackend.cpp b/services/inputflinger/tests/FakeInputTracingBackend.cpp index 4655ee8458..08738e3973 100644 --- a/services/inputflinger/tests/FakeInputTracingBackend.cpp +++ b/services/inputflinger/tests/FakeInputTracingBackend.cpp @@ -56,8 +56,8 @@ KeyEvent toInputEvent(const trace::TracedKeyEvent& e, const std::array<uint8_t, 32>& hmac) { KeyEvent traced; traced.initialize(e.id, e.deviceId, e.source, e.displayId, hmac, e.action, - dispatchArgs.resolvedFlags, e.keyCode, e.scanCode, e.metaState, e.repeatCount, - e.downTime, e.eventTime); + dispatchArgs.resolvedFlags, e.keyCode, e.scanCode, e.metaState, + dispatchArgs.resolvedKeyRepeatCount, e.downTime, e.eventTime); return traced; } |