diff options
| author | 2023-01-05 11:03:24 +0000 | |
|---|---|---|
| committer | 2023-01-05 11:03:24 +0000 | |
| commit | 307f157710b4a4eb8134eeaf3f2db6d1ec9857c5 (patch) | |
| tree | ca65e83fe2e531d50b665059d8be88465652b49f | |
| parent | 959842dd3146f974dc823cfa8548103968d3cc5b (diff) | |
| parent | 7fb411367ff01ef737ad6dff2dcd68d60a06a09e (diff) | |
Merge "Convert country code to Layoutinfo (Language tag + Layout type)"
| -rw-r--r-- | include/input/InputDevice.h | 7 | ||||
| -rw-r--r-- | libs/input/Android.bp | 1 | ||||
| -rw-r--r-- | libs/input/InputDevice.cpp | 5 | ||||
| -rw-r--r-- | libs/input/android/hardware/input/InputDeviceCountryCode.aidl | 212 | ||||
| -rw-r--r-- | services/inputflinger/reader/EventHub.cpp | 75 | ||||
| -rw-r--r-- | services/inputflinger/reader/InputDevice.cpp | 15 | ||||
| -rw-r--r-- | services/inputflinger/reader/include/EventHub.h | 18 | ||||
| -rw-r--r-- | services/inputflinger/reader/include/InputDevice.h | 7 | ||||
| -rw-r--r-- | services/inputflinger/reader/mapper/KeyboardInputMapper.cpp | 6 | ||||
| -rw-r--r-- | services/inputflinger/tests/FakeEventHub.cpp | 8 | ||||
| -rw-r--r-- | services/inputflinger/tests/FakeEventHub.h | 10 | ||||
| -rw-r--r-- | services/inputflinger/tests/InputReader_test.cpp | 28 | ||||
| -rw-r--r-- | services/inputflinger/tests/fuzzers/MapperHelpers.h | 47 |
13 files changed, 109 insertions, 330 deletions
diff --git a/include/input/InputDevice.h b/include/input/InputDevice.h index 5fa9fda64b..09933d32b1 100644 --- a/include/input/InputDevice.h +++ b/include/input/InputDevice.h @@ -24,7 +24,6 @@ #include <vector> #include <android/os/IInputConstants.h> -#include "android/hardware/input/InputDeviceCountryCode.h" namespace android { @@ -236,9 +235,7 @@ public: void initialize(int32_t id, int32_t generation, int32_t controllerNumber, const InputDeviceIdentifier& identifier, const std::string& alias, - bool isExternal, bool hasMic, - hardware::input::InputDeviceCountryCode countryCode = - hardware::input::InputDeviceCountryCode::INVALID); + bool isExternal, bool hasMic); inline int32_t getId() const { return mId; } inline int32_t getControllerNumber() const { return mControllerNumber; } @@ -250,7 +247,6 @@ public: } inline bool isExternal() const { return mIsExternal; } inline bool hasMic() const { return mHasMic; } - inline hardware::input::InputDeviceCountryCode getCountryCode() const { return mCountryCode; } inline uint32_t getSources() const { return mSources; } const MotionRange* getMotionRange(int32_t axis, uint32_t source) const; @@ -310,7 +306,6 @@ private: std::string mAlias; bool mIsExternal; bool mHasMic; - hardware::input::InputDeviceCountryCode mCountryCode; std::optional<KeyboardLayoutInfo> mKeyboardLayoutInfo; uint32_t mSources; int32_t mKeyboardType; diff --git a/libs/input/Android.bp b/libs/input/Android.bp index 8ddd18d84a..8f41cc1872 100644 --- a/libs/input/Android.bp +++ b/libs/input/Android.bp @@ -26,7 +26,6 @@ package { filegroup { name: "inputconstants_aidl", srcs: [ - "android/hardware/input/InputDeviceCountryCode.aidl", "android/os/IInputConstants.aidl", "android/os/InputEventInjectionResult.aidl", "android/os/InputEventInjectionSync.aidl", diff --git a/libs/input/InputDevice.cpp b/libs/input/InputDevice.cpp index fb6c590b6e..87333f2c76 100644 --- a/libs/input/InputDevice.cpp +++ b/libs/input/InputDevice.cpp @@ -26,7 +26,6 @@ #include <input/InputEventLabels.h> using android::base::StringPrintf; -using android::hardware::input::InputDeviceCountryCode; namespace android { @@ -178,7 +177,6 @@ InputDeviceInfo::InputDeviceInfo(const InputDeviceInfo& other) mAlias(other.mAlias), mIsExternal(other.mIsExternal), mHasMic(other.mHasMic), - mCountryCode(other.mCountryCode), mKeyboardLayoutInfo(other.mKeyboardLayoutInfo), mSources(other.mSources), mKeyboardType(other.mKeyboardType), @@ -197,7 +195,7 @@ InputDeviceInfo::~InputDeviceInfo() { void InputDeviceInfo::initialize(int32_t id, int32_t generation, int32_t controllerNumber, const InputDeviceIdentifier& identifier, const std::string& alias, - bool isExternal, bool hasMic, InputDeviceCountryCode countryCode) { + bool isExternal, bool hasMic) { mId = id; mGeneration = generation; mControllerNumber = controllerNumber; @@ -205,7 +203,6 @@ void InputDeviceInfo::initialize(int32_t id, int32_t generation, int32_t control mAlias = alias; mIsExternal = isExternal; mHasMic = hasMic; - mCountryCode = countryCode; mSources = 0; mKeyboardType = AINPUT_KEYBOARD_TYPE_NONE; mHasVibrator = false; diff --git a/libs/input/android/hardware/input/InputDeviceCountryCode.aidl b/libs/input/android/hardware/input/InputDeviceCountryCode.aidl deleted file mode 100644 index 6bb1a60dda..0000000000 --- a/libs/input/android/hardware/input/InputDeviceCountryCode.aidl +++ /dev/null @@ -1,212 +0,0 @@ -/* - * Copyright (C) 2022 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.hardware.input; - -/** - * Constant for HID country code declared by a HID device. These constants are declared as AIDL to - * be used by java and native input code. - * - * @hide - */ -@Backing(type="int") -enum InputDeviceCountryCode { - /** - * Used as default value where country code is not set in the device HID descriptor - */ - INVALID = -1, - - /** - * Used as default value when country code is not supported by the HID device. The HID - * descriptor sets "00" as the country code in this case. - */ - NOT_SUPPORTED = 0, - - /** - * Arabic - */ - ARABIC = 1, - - /** - * Belgian - */ - BELGIAN = 2, - - /** - * Canadian (Bilingual) - */ - CANADIAN_BILINGUAL = 3, - - /** - * Canadian (French) - */ - CANADIAN_FRENCH = 4, - - /** - * Czech Republic - */ - CZECH_REPUBLIC = 5, - - /** - * Danish - */ - DANISH = 6, - - /** - * Finnish - */ - FINNISH = 7, - - /** - * French - */ - FRENCH = 8, - - /** - * German - */ - GERMAN = 9, - - /** - * Greek - */ - GREEK = 10, - - /** - * Hebrew - */ - HEBREW = 11, - - /** - * Hungary - */ - HUNGARY = 12, - - /** - * International (ISO) - */ - INTERNATIONAL = 13, - - /** - * Italian - */ - ITALIAN = 14, - - /** - * Japan (Katakana) - */ - JAPAN = 15, - - /** - * Korean - */ - KOREAN = 16, - - /** - * Latin American - */ - LATIN_AMERICAN = 17, - - /** - * Netherlands (Dutch) - */ - DUTCH = 18, - - /** - * Norwegian - */ - NORWEGIAN = 19, - - /** - * Persian - */ - PERSIAN = 20, - - /** - * Poland - */ - POLAND = 21, - - /** - * Portuguese - */ - PORTUGUESE = 22, - - /** - * Russia - */ - RUSSIA = 23, - - /** - * Slovakia - */ - SLOVAKIA = 24, - - /** - * Spanish - */ - SPANISH = 25, - - /** - * Swedish - */ - SWEDISH = 26, - - /** - * Swiss (French) - */ - SWISS_FRENCH = 27, - - /** - * Swiss (German) - */ - SWISS_GERMAN = 28, - - /** - * Switzerland - */ - SWITZERLAND = 29, - - /** - * Taiwan - */ - TAIWAN = 30, - - /** - * Turkish_Q - */ - TURKISH_Q = 31, - - /** - * UK - */ - UK = 32, - - /** - * US - */ - US = 33, - - /** - * Yugoslavia - */ - YUGOSLAVIA = 34, - - /** - * Turkish_F - */ - TURKISH_F = 35, -}
\ No newline at end of file diff --git a/services/inputflinger/reader/EventHub.cpp b/services/inputflinger/reader/EventHub.cpp index e9fa599b33..b214750443 100644 --- a/services/inputflinger/reader/EventHub.cpp +++ b/services/inputflinger/reader/EventHub.cpp @@ -62,7 +62,6 @@ #define INDENT3 " " using android::base::StringPrintf; -using android::hardware::input::InputDeviceCountryCode; namespace android { @@ -135,6 +134,46 @@ const std::unordered_map<std::string, LightColor> LIGHT_COLORS = {{"red", LightC {"green", LightColor::GREEN}, {"blue", LightColor::BLUE}}; +// Mapping for country code to Layout info. +// See bCountryCode in 6.2.1 of https://usb.org/sites/default/files/hid1_11.pdf. +const std::unordered_map<std::int32_t, RawLayoutInfo> LAYOUT_INFOS = + {{0, RawLayoutInfo{.languageTag = "", .layoutType = ""}}, // NOT_SUPPORTED + {1, RawLayoutInfo{.languageTag = "ar-Arab", .layoutType = ""}}, // ARABIC + {2, RawLayoutInfo{.languageTag = "fr-BE", .layoutType = ""}}, // BELGIAN + {3, RawLayoutInfo{.languageTag = "fr-CA", .layoutType = ""}}, // CANADIAN_BILINGUAL + {4, RawLayoutInfo{.languageTag = "fr-CA", .layoutType = ""}}, // CANADIAN_FRENCH + {5, RawLayoutInfo{.languageTag = "cs", .layoutType = ""}}, // CZECH_REPUBLIC + {6, RawLayoutInfo{.languageTag = "da", .layoutType = ""}}, // DANISH + {7, RawLayoutInfo{.languageTag = "fi", .layoutType = ""}}, // FINNISH + {8, RawLayoutInfo{.languageTag = "fr-FR", .layoutType = ""}}, // FRENCH + {9, RawLayoutInfo{.languageTag = "de", .layoutType = ""}}, // GERMAN + {10, RawLayoutInfo{.languageTag = "el", .layoutType = ""}}, // GREEK + {11, RawLayoutInfo{.languageTag = "iw", .layoutType = ""}}, // HEBREW + {12, RawLayoutInfo{.languageTag = "hu", .layoutType = ""}}, // HUNGARY + {13, RawLayoutInfo{.languageTag = "en", .layoutType = "extended"}}, // INTERNATIONAL (ISO) + {14, RawLayoutInfo{.languageTag = "it", .layoutType = ""}}, // ITALIAN + {15, RawLayoutInfo{.languageTag = "ja", .layoutType = ""}}, // JAPAN + {16, RawLayoutInfo{.languageTag = "ko", .layoutType = ""}}, // KOREAN + {17, RawLayoutInfo{.languageTag = "es-419", .layoutType = ""}}, // LATIN_AMERICA + {18, RawLayoutInfo{.languageTag = "nl", .layoutType = ""}}, // DUTCH + {19, RawLayoutInfo{.languageTag = "nb", .layoutType = ""}}, // NORWEGIAN + {20, RawLayoutInfo{.languageTag = "fa", .layoutType = ""}}, // PERSIAN + {21, RawLayoutInfo{.languageTag = "pl", .layoutType = ""}}, // POLAND + {22, RawLayoutInfo{.languageTag = "pt", .layoutType = ""}}, // PORTUGUESE + {23, RawLayoutInfo{.languageTag = "ru", .layoutType = ""}}, // RUSSIA + {24, RawLayoutInfo{.languageTag = "sk", .layoutType = ""}}, // SLOVAKIA + {25, RawLayoutInfo{.languageTag = "es-ES", .layoutType = ""}}, // SPANISH + {26, RawLayoutInfo{.languageTag = "sv", .layoutType = ""}}, // SWEDISH + {27, RawLayoutInfo{.languageTag = "fr-CH", .layoutType = ""}}, // SWISS_FRENCH + {28, RawLayoutInfo{.languageTag = "de-CH", .layoutType = ""}}, // SWISS_GERMAN + {29, RawLayoutInfo{.languageTag = "de-CH", .layoutType = ""}}, // SWITZERLAND + {30, RawLayoutInfo{.languageTag = "zh-TW", .layoutType = ""}}, // TAIWAN + {31, RawLayoutInfo{.languageTag = "tr", .layoutType = "turkish_q"}}, // TURKISH_Q + {32, RawLayoutInfo{.languageTag = "en-GB", .layoutType = ""}}, // UK + {33, RawLayoutInfo{.languageTag = "en-US", .layoutType = ""}}, // US + {34, RawLayoutInfo{.languageTag = "", .layoutType = ""}}, // YUGOSLAVIA + {35, RawLayoutInfo{.languageTag = "tr", .layoutType = "turkish_f"}}}; // TURKISH_F + static std::string sha1(const std::string& in) { SHA_CTX ctx; SHA1_Init(&ctx); @@ -311,22 +350,27 @@ static std::optional<std::array<LightColor, COLOR_NUM>> getColorIndexArray( } /** - * Read country code information exposed through the sysfs path. + * Read country code information exposed through the sysfs path and convert it to Layout info. */ -static InputDeviceCountryCode readCountryCodeLocked(const std::filesystem::path& sysfsRootPath) { +static std::optional<RawLayoutInfo> readLayoutConfiguration( + const std::filesystem::path& sysfsRootPath) { // Check the sysfs root path - int hidCountryCode = static_cast<int>(InputDeviceCountryCode::INVALID); + int32_t hidCountryCode = -1; std::string str; if (base::ReadFileToString(sysfsRootPath / "country", &str)) { hidCountryCode = std::stoi(str, nullptr, 16); + // Update this condition if new supported country codes are added to HID spec. if (hidCountryCode > 35 || hidCountryCode < 0) { ALOGE("HID country code should be in range [0, 35], but for sysfs path %s it was %d", sysfsRootPath.c_str(), hidCountryCode); - return InputDeviceCountryCode::INVALID; } } + const auto it = LAYOUT_INFOS.find(hidCountryCode); + if (it != LAYOUT_INFOS.end()) { + return it->second; + } - return static_cast<InputDeviceCountryCode>(hidCountryCode); + return std::nullopt; } /** @@ -1299,13 +1343,13 @@ void EventHub::setLightIntensities(int32_t deviceId, int32_t lightId, } } -InputDeviceCountryCode EventHub::getCountryCode(int32_t deviceId) const { +std::optional<RawLayoutInfo> EventHub::getRawLayoutInfo(int32_t deviceId) const { std::scoped_lock _l(mLock); Device* device = getDeviceLocked(deviceId); if (device == nullptr || !device->associatedDevice) { - return InputDeviceCountryCode::INVALID; + return std::nullopt; } - return device->associatedDevice->countryCode; + return device->associatedDevice->layoutInfo; } void EventHub::setExcludedDevices(const std::vector<std::string>& devices) { @@ -1449,9 +1493,9 @@ std::shared_ptr<const EventHub::AssociatedDevice> EventHub::obtainAssociatedDevi std::shared_ptr<const AssociatedDevice> associatedDevice = std::make_shared<AssociatedDevice>( AssociatedDevice{.sysfsRootPath = path, - .countryCode = readCountryCodeLocked(path), .batteryInfos = readBatteryConfiguration(path), - .lightInfos = readLightsConfiguration(path)}); + .lightInfos = readLightsConfiguration(path), + .layoutInfo = readLayoutConfiguration(path)}); bool associatedDeviceChanged = false; for (const auto& [id, dev] : mDevices) { @@ -2686,9 +2730,12 @@ void EventHub::dump(std::string& dump) const { device->keyMap.keyLayoutFile.c_str()); dump += StringPrintf(INDENT3 "KeyCharacterMapFile: %s\n", device->keyMap.keyCharacterMapFile.c_str()); - dump += StringPrintf(INDENT3 "CountryCode: %d\n", - device->associatedDevice ? device->associatedDevice->countryCode - : InputDeviceCountryCode::INVALID); + if (device->associatedDevice && device->associatedDevice->layoutInfo) { + dump += StringPrintf(INDENT3 "LanguageTag: %s\n", + device->associatedDevice->layoutInfo->languageTag.c_str()); + dump += StringPrintf(INDENT3 "LayoutType: %s\n", + device->associatedDevice->layoutInfo->layoutType.c_str()); + } dump += StringPrintf(INDENT3 "ConfigurationFile: %s\n", device->configurationFile.c_str()); dump += StringPrintf(INDENT3 "VideoDevice: %s\n", diff --git a/services/inputflinger/reader/InputDevice.cpp b/services/inputflinger/reader/InputDevice.cpp index 13f40ee8e4..6e78e82c7e 100644 --- a/services/inputflinger/reader/InputDevice.cpp +++ b/services/inputflinger/reader/InputDevice.cpp @@ -37,8 +37,6 @@ #include "TouchpadInputMapper.h" #include "VibratorInputMapper.h" -using android::hardware::input::InputDeviceCountryCode; - namespace android { InputDevice::InputDevice(InputReaderContext* context, int32_t id, int32_t generation, @@ -256,7 +254,6 @@ std::list<NotifyArgs> InputDevice::configure(nsecs_t when, const InputReaderConf mSources = 0; mClasses = ftl::Flags<InputDeviceClass>(0); mControllerNumber = 0; - mCountryCode = InputDeviceCountryCode::INVALID; for_each_subdevice([this](InputDeviceContext& context) { mClasses |= context.getDeviceClasses(); @@ -268,16 +265,6 @@ std::list<NotifyArgs> InputDevice::configure(nsecs_t when, const InputReaderConf } mControllerNumber = controllerNumber; } - - InputDeviceCountryCode countryCode = context.getCountryCode(); - if (countryCode != InputDeviceCountryCode::INVALID) { - if (mCountryCode != InputDeviceCountryCode::INVALID && mCountryCode != countryCode) { - ALOGW("InputDevice::configure(): %s device contains multiple unique country " - "codes", - getName().c_str()); - } - mCountryCode = countryCode; - } }); mIsExternal = mClasses.test(InputDeviceClass::EXTERNAL); @@ -465,7 +452,7 @@ std::list<NotifyArgs> InputDevice::updateExternalStylusState(const StylusState& InputDeviceInfo InputDevice::getDeviceInfo() { InputDeviceInfo outDeviceInfo; outDeviceInfo.initialize(mId, mGeneration, mControllerNumber, mIdentifier, mAlias, mIsExternal, - mHasMic, mCountryCode); + mHasMic); for_each_mapper( [&outDeviceInfo](InputMapper& mapper) { mapper.populateDeviceInfo(&outDeviceInfo); }); diff --git a/services/inputflinger/reader/include/EventHub.h b/services/inputflinger/reader/include/EventHub.h index 8a844b2088..a3ecf418bb 100644 --- a/services/inputflinger/reader/include/EventHub.h +++ b/services/inputflinger/reader/include/EventHub.h @@ -42,7 +42,6 @@ #include "TouchVideoDevice.h" #include "VibrationElement.h" -#include "android/hardware/input/InputDeviceCountryCode.h" struct inotify_event; @@ -207,6 +206,15 @@ struct RawBatteryInfo { bool operator!=(const RawBatteryInfo&) const = default; }; +/* Layout information associated with the device */ +struct RawLayoutInfo { + std::string languageTag; + std::string layoutType; + + bool operator==(const RawLayoutInfo&) const = default; + bool operator!=(const RawLayoutInfo&) const = default; +}; + /* * Gets the class that owns an axis, in cases where multiple classes might claim * the same axis for different purposes. @@ -308,8 +316,8 @@ public: int32_t deviceId, int32_t lightId) const = 0; virtual void setLightIntensities(int32_t deviceId, int32_t lightId, std::unordered_map<LightColor, int32_t> intensities) = 0; - /* Query Country code associated with the input device. */ - virtual hardware::input::InputDeviceCountryCode getCountryCode(int32_t deviceId) const = 0; + /* Query Layout info associated with the input device. */ + virtual std::optional<RawLayoutInfo> getRawLayoutInfo(int32_t deviceId) const = 0; /* Query current input state. */ virtual int32_t getScanCodeState(int32_t deviceId, int32_t scanCode) const = 0; virtual int32_t getKeyCodeState(int32_t deviceId, int32_t keyCode) const = 0; @@ -493,7 +501,7 @@ public: void setLightIntensities(int32_t deviceId, int32_t lightId, std::unordered_map<LightColor, int32_t> intensities) override final; - hardware::input::InputDeviceCountryCode getCountryCode(int32_t deviceId) const override final; + std::optional<RawLayoutInfo> getRawLayoutInfo(int32_t deviceId) const override final; void setExcludedDevices(const std::vector<std::string>& devices) override final; @@ -556,9 +564,9 @@ private: struct AssociatedDevice { // The sysfs root path of the misc device. std::filesystem::path sysfsRootPath; - hardware::input::InputDeviceCountryCode countryCode; std::unordered_map<int32_t /*batteryId*/, RawBatteryInfo> batteryInfos; std::unordered_map<int32_t /*lightId*/, RawLightInfo> lightInfos; + std::optional<RawLayoutInfo> layoutInfo; bool operator==(const AssociatedDevice&) const = default; bool operator!=(const AssociatedDevice&) const = default; diff --git a/services/inputflinger/reader/include/InputDevice.h b/services/inputflinger/reader/include/InputDevice.h index b173618d87..7867029ab7 100644 --- a/services/inputflinger/reader/include/InputDevice.h +++ b/services/inputflinger/reader/include/InputDevice.h @@ -167,7 +167,6 @@ private: int32_t mId; int32_t mGeneration; int32_t mControllerNumber; - hardware::input::InputDeviceCountryCode mCountryCode; InputDeviceIdentifier mIdentifier; std::string mAlias; ftl::Flags<InputDeviceClass> mClasses; @@ -326,9 +325,6 @@ public: } inline std::vector<TouchVideoFrame> getVideoFrames() { return mEventHub->getVideoFrames(mId); } - inline hardware::input::InputDeviceCountryCode getCountryCode() const { - return mEventHub->getCountryCode(mId); - } inline int32_t getScanCodeState(int32_t scanCode) const { return mEventHub->getScanCodeState(mId, scanCode); } @@ -361,6 +357,9 @@ public: inline bool setKeyboardLayoutOverlay(std::shared_ptr<KeyCharacterMap> map) { return mEventHub->setKeyboardLayoutOverlay(mId, map); } + inline const std::optional<RawLayoutInfo> getRawLayoutInfo() { + return mEventHub->getRawLayoutInfo(mId); + } inline void vibrate(const VibrationElement& element) { return mEventHub->vibrate(mId, element); } diff --git a/services/inputflinger/reader/mapper/KeyboardInputMapper.cpp b/services/inputflinger/reader/mapper/KeyboardInputMapper.cpp index 6f01449083..d147d60f4e 100644 --- a/services/inputflinger/reader/mapper/KeyboardInputMapper.cpp +++ b/services/inputflinger/reader/mapper/KeyboardInputMapper.cpp @@ -123,6 +123,12 @@ void KeyboardInputMapper::populateDeviceInfo(InputDeviceInfo* info) { if (mKeyboardLayoutInfo) { info->setKeyboardLayoutInfo(*mKeyboardLayoutInfo); + } else { + std::optional<RawLayoutInfo> layoutInfo = getDeviceContext().getRawLayoutInfo(); + if (layoutInfo) { + info->setKeyboardLayoutInfo( + KeyboardLayoutInfo(layoutInfo->languageTag, layoutInfo->layoutType)); + } } } diff --git a/services/inputflinger/tests/FakeEventHub.cpp b/services/inputflinger/tests/FakeEventHub.cpp index 289a7809cc..6ac0bfb541 100644 --- a/services/inputflinger/tests/FakeEventHub.cpp +++ b/services/inputflinger/tests/FakeEventHub.cpp @@ -120,8 +120,8 @@ void FakeEventHub::setKeyCodeState(int32_t deviceId, int32_t keyCode, int32_t st getDevice(deviceId)->keyCodeStates.replaceValueFor(keyCode, state); } -void FakeEventHub::setCountryCode(int32_t deviceId, InputDeviceCountryCode countryCode) { - getDevice(deviceId)->countryCode = countryCode; +void FakeEventHub::setRawLayoutInfo(int32_t deviceId, RawLayoutInfo info) { + getDevice(deviceId)->layoutInfo = info; } void FakeEventHub::setScanCodeState(int32_t deviceId, int32_t scanCode, int32_t state) { @@ -389,9 +389,9 @@ int32_t FakeEventHub::getScanCodeState(int32_t deviceId, int32_t scanCode) const return AKEY_STATE_UNKNOWN; } -InputDeviceCountryCode FakeEventHub::getCountryCode(int32_t deviceId) const { +std::optional<RawLayoutInfo> FakeEventHub::getRawLayoutInfo(int32_t deviceId) const { Device* device = getDevice(deviceId); - return device ? device->countryCode : InputDeviceCountryCode::INVALID; + return device ? device->layoutInfo : std::nullopt; } int32_t FakeEventHub::getKeyCodeState(int32_t deviceId, int32_t keyCode) const { diff --git a/services/inputflinger/tests/FakeEventHub.h b/services/inputflinger/tests/FakeEventHub.h index fb3c8596c7..72f8ac03a5 100644 --- a/services/inputflinger/tests/FakeEventHub.h +++ b/services/inputflinger/tests/FakeEventHub.h @@ -30,10 +30,6 @@ #include <utils/Errors.h> #include <utils/KeyedVector.h> -#include "android/hardware/input/InputDeviceCountryCode.h" - -using android::hardware::input::InputDeviceCountryCode; - namespace android { class FakeEventHub : public EventHubInterface { @@ -67,7 +63,7 @@ class FakeEventHub : public EventHubInterface { BitArray<MSC_MAX> mscBitmask; std::vector<VirtualKeyDefinition> virtualKeys; bool enabled; - InputDeviceCountryCode countryCode; + std::optional<RawLayoutInfo> layoutInfo; status_t enable() { enabled = true; @@ -124,7 +120,7 @@ public: void addRelativeAxis(int32_t deviceId, int32_t axis); void setAbsoluteAxisValue(int32_t deviceId, int32_t axis, int32_t value); - void setCountryCode(int32_t deviceId, InputDeviceCountryCode countryCode); + void setRawLayoutInfo(int32_t deviceId, RawLayoutInfo info); void setKeyCodeState(int32_t deviceId, int32_t keyCode, int32_t state); void setScanCodeState(int32_t deviceId, int32_t scanCode, int32_t state); @@ -180,7 +176,7 @@ private: std::vector<RawEvent> getEvents(int) override; std::vector<TouchVideoFrame> getVideoFrames(int32_t deviceId) override; int32_t getScanCodeState(int32_t deviceId, int32_t scanCode) const override; - InputDeviceCountryCode getCountryCode(int32_t deviceId) const override; + std::optional<RawLayoutInfo> getRawLayoutInfo(int32_t deviceId) const override; int32_t getKeyCodeState(int32_t deviceId, int32_t keyCode) const override; int32_t getSwitchState(int32_t deviceId, int32_t sw) const override; status_t getAbsoluteAxisValue(int32_t deviceId, int32_t axis, int32_t* outValue) const override; diff --git a/services/inputflinger/tests/InputReader_test.cpp b/services/inputflinger/tests/InputReader_test.cpp index 96d27b8f11..a46463924f 100644 --- a/services/inputflinger/tests/InputReader_test.cpp +++ b/services/inputflinger/tests/InputReader_test.cpp @@ -48,12 +48,9 @@ #include "InputMapperTest.h" #include "InstrumentedInputReader.h" #include "TestConstants.h" -#include "android/hardware/input/InputDeviceCountryCode.h" #include "input/DisplayViewport.h" #include "input/Input.h" -using android::hardware::input::InputDeviceCountryCode; - namespace android { using namespace ftl::flag_operators; @@ -2240,17 +2237,6 @@ TEST_F(InputDeviceTest, ImmutableProperties) { ASSERT_EQ(ftl::Flags<InputDeviceClass>(0), mDevice->getClasses()); } -TEST_F(InputDeviceTest, CountryCodeCorrectlyMapped) { - mFakeEventHub->setCountryCode(EVENTHUB_ID, InputDeviceCountryCode::INTERNATIONAL); - - // Configuration - mDevice->addMapper<FakeInputMapper>(EVENTHUB_ID, AINPUT_SOURCE_KEYBOARD); - InputReaderConfiguration config; - std::list<NotifyArgs> unused = mDevice->configure(ARBITRARY_TIME, &config, 0); - - ASSERT_EQ(InputDeviceCountryCode::INTERNATIONAL, mDevice->getDeviceInfo().getCountryCode()); -} - TEST_F(InputDeviceTest, WhenDeviceCreated_EnabledIsFalse) { ASSERT_EQ(mDevice->isEnabled(), false); } @@ -3600,6 +3586,20 @@ TEST_F(KeyboardInputMapperTest, Configure_AssignKeyboardLayoutInfo) { deviceInfo.getKeyboardLayoutInfo()->layoutType); } +TEST_F(KeyboardInputMapperTest, LayoutInfoCorrectlyMapped) { + mFakeEventHub->setRawLayoutInfo(EVENTHUB_ID, + RawLayoutInfo{.languageTag = "en", .layoutType = "extended"}); + + // Configuration + addMapperAndConfigure<KeyboardInputMapper>(AINPUT_SOURCE_KEYBOARD, + AINPUT_KEYBOARD_TYPE_ALPHABETIC); + InputReaderConfiguration config; + std::list<NotifyArgs> unused = mDevice->configure(ARBITRARY_TIME, &config, 0); + + ASSERT_EQ("en", mDevice->getDeviceInfo().getKeyboardLayoutInfo()->languageTag); + ASSERT_EQ("extended", mDevice->getDeviceInfo().getKeyboardLayoutInfo()->layoutType); +} + // --- KeyboardInputMapperTest_ExternalDevice --- class KeyboardInputMapperTest_ExternalDevice : public InputMapperTest { diff --git a/services/inputflinger/tests/fuzzers/MapperHelpers.h b/services/inputflinger/tests/fuzzers/MapperHelpers.h index a0910ea847..7c9be5c8d4 100644 --- a/services/inputflinger/tests/fuzzers/MapperHelpers.h +++ b/services/inputflinger/tests/fuzzers/MapperHelpers.h @@ -19,9 +19,6 @@ #include <InputMapper.h> #include <InputReader.h> #include <ThreadSafeFuzzedDataProvider.h> -#include "android/hardware/input/InputDeviceCountryCode.h" - -using android::hardware::input::InputDeviceCountryCode; constexpr size_t kValidTypes[] = {EV_SW, EV_SYN, @@ -65,46 +62,6 @@ constexpr size_t kValidCodes[] = { BTN_TASK, }; -constexpr InputDeviceCountryCode kCountryCodes[] = { - InputDeviceCountryCode::INVALID, - InputDeviceCountryCode::NOT_SUPPORTED, - InputDeviceCountryCode::ARABIC, - InputDeviceCountryCode::BELGIAN, - InputDeviceCountryCode::CANADIAN_BILINGUAL, - InputDeviceCountryCode::CANADIAN_FRENCH, - InputDeviceCountryCode::CZECH_REPUBLIC, - InputDeviceCountryCode::DANISH, - InputDeviceCountryCode::FINNISH, - InputDeviceCountryCode::FRENCH, - InputDeviceCountryCode::GERMAN, - InputDeviceCountryCode::GREEK, - InputDeviceCountryCode::HEBREW, - InputDeviceCountryCode::HUNGARY, - InputDeviceCountryCode::INTERNATIONAL, - InputDeviceCountryCode::ITALIAN, - InputDeviceCountryCode::JAPAN, - InputDeviceCountryCode::KOREAN, - InputDeviceCountryCode::LATIN_AMERICAN, - InputDeviceCountryCode::DUTCH, - InputDeviceCountryCode::NORWEGIAN, - InputDeviceCountryCode::PERSIAN, - InputDeviceCountryCode::POLAND, - InputDeviceCountryCode::PORTUGUESE, - InputDeviceCountryCode::RUSSIA, - InputDeviceCountryCode::SLOVAKIA, - InputDeviceCountryCode::SPANISH, - InputDeviceCountryCode::SWEDISH, - InputDeviceCountryCode::SWISS_FRENCH, - InputDeviceCountryCode::SWISS_GERMAN, - InputDeviceCountryCode::SWITZERLAND, - InputDeviceCountryCode::TAIWAN, - InputDeviceCountryCode::TURKISH_Q, - InputDeviceCountryCode::UK, - InputDeviceCountryCode::US, - InputDeviceCountryCode::YUGOSLAVIA, - InputDeviceCountryCode::TURKISH_F, -}; - constexpr size_t kMaxSize = 256; namespace android { @@ -197,8 +154,8 @@ public: void setLightIntensities(int32_t deviceId, int32_t lightId, std::unordered_map<LightColor, int32_t> intensities) override{}; - InputDeviceCountryCode getCountryCode(int32_t deviceId) const override { - return mFdp->PickValueInArray<InputDeviceCountryCode>(kCountryCodes); + std::optional<RawLayoutInfo> getRawLayoutInfo(int32_t deviceId) const override { + return std::nullopt; }; int32_t getScanCodeState(int32_t deviceId, int32_t scanCode) const override { |