From fe3c8f189605472c6d9c567be7170c649f162ef6 Mon Sep 17 00:00:00 2001 From: Hu Guo Date: Fri, 22 Sep 2023 17:20:15 +0800 Subject: 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 --- .../inputflinger/dispatcher/InputDispatcher.cpp | 2 +- .../inputflinger/tests/InputDispatcher_test.cpp | 22 ++++++++++++++++++++-- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/services/inputflinger/dispatcher/InputDispatcher.cpp b/services/inputflinger/dispatcher/InputDispatcher.cpp index 057b996a23..d06881d962 100644 --- a/services/inputflinger/dispatcher/InputDispatcher.cpp +++ b/services/inputflinger/dispatcher/InputDispatcher.cpp @@ -1780,7 +1780,7 @@ bool InputDispatcher::dispatchKeyLocked(nsecs_t currentTime, std::shared_ptrdispatchInProgress) { - 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 && diff --git a/services/inputflinger/tests/InputDispatcher_test.cpp b/services/inputflinger/tests/InputDispatcher_test.cpp index f0f4d93ecd..60d598ff80 100644 --- a/services/inputflinger/tests/InputDispatcher_test.cpp +++ b/services/inputflinger/tests/InputDispatcher_test.cpp @@ -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=*/{}, -- cgit v1.2.3-59-g8ed1b