Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 560d0d15 authored by Prabir Pradhan's avatar Prabir Pradhan
Browse files

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
parent eaa9fde9
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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,
+6 −1
Original line number Diff line number Diff line
@@ -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) {
+1 −0
Original line number Diff line number Diff line
@@ -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;
};
+2 −2
Original line number Diff line number Diff line
@@ -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;
}