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

Commit fe3c8f18 authored by Hu Guo's avatar Hu Guo Committed by Prabir Pradhan
Browse files

Fix incorrect repeatCount sent to app when injecting repeat event

When the injected repeat event occurs after the repeat event synthesized
by the InputDispatcher, the repeatCount of the event sent to the app is
incorrect. For example, the repeatCount sequence of the event received
by the app might be 0,1,2,1,2,3,4,....

Test: atest inputflinger_tests
Change-Id: I13574a77896583bb0062bab17395d27585315e6b
parent 560d0d15
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -1780,7 +1780,7 @@ bool InputDispatcher::dispatchKeyLocked(nsecs_t currentTime, std::shared_ptr<con
                                        DropReason* dropReason, nsecs_t& nextWakeupTime) {
    // Preprocessing.
    if (!entry->dispatchInProgress) {
        if (entry->repeatCount == 0 && entry->action == AKEY_EVENT_ACTION_DOWN &&
        if (!entry->syntheticRepeat && entry->action == AKEY_EVENT_ACTION_DOWN &&
            (entry->policyFlags & POLICY_FLAG_TRUSTED) &&
            (!(entry->policyFlags & POLICY_FLAG_DISABLE_KEY_REPEAT))) {
            if (mKeyRepeatState.lastKeyEntry &&
+20 −2
Original line number Diff line number Diff line
@@ -7477,6 +7477,12 @@ protected:
        mWindow->consumeKeyUp(ADISPLAY_ID_DEFAULT,
                              /*expectedFlags=*/0);
    }
    void injectKeyRepeat(int32_t repeatCount) {
        ASSERT_EQ(InputEventInjectionResult::SUCCEEDED,
                  injectKey(*mDispatcher, AKEY_EVENT_ACTION_DOWN, repeatCount, ADISPLAY_ID_DEFAULT))
                << "Inject key event should return InputEventInjectionResult::SUCCEEDED";
    }
};
TEST_F(InputDispatcherKeyRepeatTest, FocusedWindow_ReceivesKeyRepeat) {
@@ -7565,6 +7571,17 @@ TEST_F(InputDispatcherKeyRepeatTest, FocusedWindow_RepeatKeyEventsUseUniqueEvent
    }
}
TEST_F(InputDispatcherKeyRepeatTest, FocusedWindow_CorrectRepeatCountWhenInjectKeyRepeat) {
    injectKeyRepeat(0);
    mWindow->consumeKeyDown(ADISPLAY_ID_DEFAULT);
    for (int32_t repeatCount = 1; repeatCount <= 2; ++repeatCount) {
        expectKeyRepeatOnce(repeatCount);
    }
    injectKeyRepeat(1);
    // Expect repeatCount to be 3 instead of 1
    expectKeyRepeatOnce(3);
}
/* Test InputDispatcher for MultiDisplay */
class InputDispatcherFocusOnTwoDisplaysTest : public InputDispatcherTest {
public:
@@ -8709,9 +8726,10 @@ TEST_F(InputDispatcherSingleWindowAnr, StaleKeyEventDoesNotAnr) {
    // Define a valid key down event that is stale (too old).
    event.initialize(InputEvent::nextId(), DEVICE_ID, AINPUT_SOURCE_KEYBOARD, ADISPLAY_ID_NONE,
                     INVALID_HMAC, AKEY_EVENT_ACTION_DOWN, /*flags=*/0, AKEYCODE_A, KEY_A,
                     AMETA_NONE, /*repeatCount=*/1, eventTime, eventTime);
                     AMETA_NONE, /*repeatCount=*/0, eventTime, eventTime);
    const int32_t policyFlags = POLICY_FLAG_FILTERED | POLICY_FLAG_PASS_TO_USER;
    const int32_t policyFlags =
            POLICY_FLAG_FILTERED | POLICY_FLAG_PASS_TO_USER | POLICY_FLAG_DISABLE_KEY_REPEAT;
    InputEventInjectionResult result =
            mDispatcher->injectInputEvent(&event, /*targetUid=*/{},