diff options
| author | 2024-03-11 21:47:45 +0000 | |
|---|---|---|
| committer | 2024-03-11 21:47:45 +0000 | |
| commit | 90604a430980b2ea07f58a92ef00980d1363c651 (patch) | |
| tree | f4fae33337d5c18cf738fdd9026fcf8ff4c68417 | |
| parent | a115f28e7b0b4e6c5dbb20e1cf30bbfe8f7fcf09 (diff) | |
| parent | fe3c8f189605472c6d9c567be7170c649f162ef6 (diff) | |
Merge "Fix incorrect repeatCount sent to app when injecting repeat event" into main
| -rw-r--r-- | services/inputflinger/dispatcher/InputDispatcher.cpp | 2 | ||||
| -rw-r--r-- | services/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 f06caa6a40..16875dfebd 100644 --- a/services/inputflinger/dispatcher/InputDispatcher.cpp +++ b/services/inputflinger/dispatcher/InputDispatcher.cpp @@ -1813,7 +1813,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 && 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=*/{}, |