/* * Copyright 2024 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. */ #define LOG_TAG "KeyboardClassifier" #include #include #include #include #include "input_cxx_bridge.rs.h" namespace input_flags = com::android::input::flags; using android::input::RustInputDeviceIdentifier; namespace android { KeyboardClassifier::KeyboardClassifier() { if (input_flags::enable_keyboard_classifier()) { mRustClassifier = android::input::keyboardClassifier::create(); } } KeyboardType KeyboardClassifier::getKeyboardType(DeviceId deviceId) { if (mRustClassifier) { return static_cast( android::input::keyboardClassifier::getKeyboardType(**mRustClassifier, deviceId)); } else { auto it = mKeyboardTypeMap.find(deviceId); if (it == mKeyboardTypeMap.end()) { return KeyboardType::NONE; } return it->second; } } // Copied from EventHub.h const uint32_t DEVICE_CLASS_KEYBOARD = android::os::IInputConstants::DEVICE_CLASS_KEYBOARD; const uint32_t DEVICE_CLASS_ALPHAKEY = android::os::IInputConstants::DEVICE_CLASS_ALPHAKEY; void KeyboardClassifier::notifyKeyboardChanged(DeviceId deviceId, const InputDeviceIdentifier& identifier, uint32_t deviceClasses) { if (mRustClassifier) { RustInputDeviceIdentifier rustIdentifier; rustIdentifier.name = identifier.name; rustIdentifier.location = identifier.location; rustIdentifier.unique_id = identifier.uniqueId; rustIdentifier.bus = identifier.bus; rustIdentifier.vendor = identifier.vendor; rustIdentifier.product = identifier.product; rustIdentifier.version = identifier.version; rustIdentifier.descriptor = identifier.descriptor; android::input::keyboardClassifier::notifyKeyboardChanged(**mRustClassifier, deviceId, rustIdentifier, deviceClasses); } else { bool isKeyboard = (deviceClasses & DEVICE_CLASS_KEYBOARD) != 0; bool hasAlphabeticKey = (deviceClasses & DEVICE_CLASS_ALPHAKEY) != 0; mKeyboardTypeMap.insert_or_assign(deviceId, isKeyboard ? (hasAlphabeticKey ? KeyboardType::ALPHABETIC : KeyboardType::NON_ALPHABETIC) : KeyboardType::NONE); } } void KeyboardClassifier::processKey(DeviceId deviceId, int32_t evdevCode, uint32_t metaState) { if (mRustClassifier && !android::input::keyboardClassifier::isFinalized(**mRustClassifier, deviceId)) { android::input::keyboardClassifier::processKey(**mRustClassifier, deviceId, evdevCode, metaState); } } } // namespace android