Add API to get KeyCode produced by physical key location.
The physical key location is provided as a location KeyCode pointing to a location on a US keyboard layout.
Bug: 179812917
Test: atest KeyboardLayoutChangeTest
Test: atest android.hardware.input.cts.tests -m
Test: atest inputflinger_tests -m
Change-Id: Ib5ed41890cbbe393ee9ada1a04cbaaf82c9bb1fc
diff --git a/services/inputflinger/reader/InputDevice.cpp b/services/inputflinger/reader/InputDevice.cpp
index 7cff672..3e95fa9 100644
--- a/services/inputflinger/reader/InputDevice.cpp
+++ b/services/inputflinger/reader/InputDevice.cpp
@@ -475,6 +475,23 @@
return result;
}
+int32_t InputDevice::getKeyCodeForKeyLocation(int32_t locationKeyCode) const {
+ std::optional<int32_t> result = first_in_mappers<int32_t>(
+ [locationKeyCode](const InputMapper& mapper) -> std::optional<int32_t> const {
+ if (sourcesMatchMask(mapper.getSources(), AINPUT_SOURCE_KEYBOARD)) {
+ return std::make_optional(mapper.getKeyCodeForKeyLocation(locationKeyCode));
+ }
+ return std::nullopt;
+ });
+ if (!result) {
+ ALOGE("Failed to get key code for key location: No matching InputMapper with source mask "
+ "KEYBOARD found. The provided input device with id %d has sources %s.",
+ getId(), inputEventSourceToString(getSources()).c_str());
+ return AKEYCODE_UNKNOWN;
+ }
+ return *result;
+}
+
void InputDevice::vibrate(const VibrationSequence& sequence, ssize_t repeat, int32_t token) {
for_each_mapper([sequence, repeat, token](InputMapper& mapper) {
mapper.vibrate(sequence, repeat, token);