Skip to content

Commit 6501473

Browse files
Vaibhav DevmurariAndroid (Google) Code Review
authored andcommitted
Merge "Allow resetting locked modifier state" into main
2 parents a1343ba + d3795b5 commit 6501473

5 files changed

Lines changed: 40 additions & 0 deletions

File tree

services/inputflinger/include/InputReaderBase.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -362,6 +362,9 @@ class InputReaderInterface {
362362
/* Toggle Caps Lock */
363363
virtual void toggleCapsLockState(int32_t deviceId) = 0;
364364

365+
/* Resets locked modifier state */
366+
virtual void resetLockedModifierState() = 0;
367+
365368
/* Determine whether physical keys exist for the given framework-domain key codes. */
366369
virtual bool hasKeys(int32_t deviceId, uint32_t sourceMask,
367370
const std::vector<int32_t>& keyCodes, uint8_t* outFlags) = 0;

services/inputflinger/reader/InputReader.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -590,6 +590,11 @@ void InputReader::toggleCapsLockState(int32_t deviceId) {
590590
}
591591
}
592592

593+
void InputReader::resetLockedModifierState() {
594+
std::scoped_lock _l(mLock);
595+
updateLedMetaStateLocked(0);
596+
}
597+
593598
bool InputReader::hasKeys(int32_t deviceId, uint32_t sourceMask,
594599
const std::vector<int32_t>& keyCodes, uint8_t* outFlags) {
595600
std::scoped_lock _l(mLock);

services/inputflinger/reader/include/InputReader.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,8 @@ class InputReader : public InputReaderInterface {
6969

7070
void toggleCapsLockState(int32_t deviceId) override;
7171

72+
void resetLockedModifierState() override;
73+
7274
bool hasKeys(int32_t deviceId, uint32_t sourceMask, const std::vector<int32_t>& keyCodes,
7375
uint8_t* outFlags) override;
7476

services/inputflinger/tests/KeyboardInputMapper_test.cpp

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -926,6 +926,33 @@ TEST_F(KeyboardInputMapperTest, Process_toggleCapsLockState) {
926926
ASSERT_EQ(AMETA_CAPS_LOCK_ON, mapper.getMetaState());
927927
}
928928

929+
TEST_F(KeyboardInputMapperTest, Process_ResetLockedModifierState) {
930+
mFakeEventHub->addKey(EVENTHUB_ID, KEY_CAPSLOCK, 0, AKEYCODE_CAPS_LOCK, 0);
931+
mFakeEventHub->addKey(EVENTHUB_ID, KEY_NUMLOCK, 0, AKEYCODE_NUM_LOCK, 0);
932+
mFakeEventHub->addKey(EVENTHUB_ID, KEY_SCROLLLOCK, 0, AKEYCODE_SCROLL_LOCK, 0);
933+
934+
KeyboardInputMapper& mapper =
935+
constructAndAddMapper<KeyboardInputMapper>(AINPUT_SOURCE_KEYBOARD);
936+
// Initial metastate is AMETA_NONE.
937+
ASSERT_EQ(AMETA_NONE, mapper.getMetaState());
938+
939+
// Toggle caps lock on.
940+
process(mapper, ARBITRARY_TIME, READ_TIME, EV_KEY, KEY_CAPSLOCK, 1);
941+
process(mapper, ARBITRARY_TIME, READ_TIME, EV_KEY, KEY_CAPSLOCK, 0);
942+
943+
// Toggle num lock on.
944+
process(mapper, ARBITRARY_TIME, READ_TIME, EV_KEY, KEY_NUMLOCK, 1);
945+
process(mapper, ARBITRARY_TIME, READ_TIME, EV_KEY, KEY_NUMLOCK, 0);
946+
947+
// Toggle scroll lock on.
948+
process(mapper, ARBITRARY_TIME, READ_TIME, EV_KEY, KEY_SCROLLLOCK, 1);
949+
process(mapper, ARBITRARY_TIME, READ_TIME, EV_KEY, KEY_SCROLLLOCK, 0);
950+
ASSERT_EQ(AMETA_CAPS_LOCK_ON | AMETA_NUM_LOCK_ON | AMETA_SCROLL_LOCK_ON, mapper.getMetaState());
951+
952+
mReader->resetLockedModifierState();
953+
ASSERT_EQ(AMETA_NONE, mapper.getMetaState());
954+
}
955+
929956
TEST_F(KeyboardInputMapperTest, Process_LockedKeysShouldToggleInMultiDevices) {
930957
// keyboard 1.
931958
mFakeEventHub->addLed(EVENTHUB_ID, LED_CAPSL, true /*initially on*/);

services/inputflinger/tests/fuzzers/InputReaderFuzzer.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,8 @@ class FuzzInputReader : public InputReaderInterface {
7575

7676
void toggleCapsLockState(int32_t deviceId) { reader->toggleCapsLockState(deviceId); }
7777

78+
void resetLockedModifierState() { reader->resetLockedModifierState(); }
79+
7880
bool hasKeys(int32_t deviceId, uint32_t sourceMask, const std::vector<int32_t>& keyCodes,
7981
uint8_t* outFlags) {
8082
return reader->hasKeys(deviceId, sourceMask, keyCodes, outFlags);
@@ -226,6 +228,7 @@ extern "C" int LLVMFuzzerTestOneInput(uint8_t* data, size_t size) {
226228
fdp->ConsumeIntegral<int32_t>());
227229
},
228230
[&]() -> void { reader->toggleCapsLockState(fdp->ConsumeIntegral<int32_t>()); },
231+
[&]() -> void { reader->resetLockedModifierState(); },
229232
[&]() -> void {
230233
size_t count = fdp->ConsumeIntegralInRange<size_t>(1, 1024);
231234
std::vector<uint8_t> outFlags(count);

0 commit comments

Comments
 (0)