blob: 0c2c7be582b7a741dd618b06b0ff5ffa5014147a [file] [log] [blame] [edit]
/*
* 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 <android-base/logging.h>
#include <com_android_input_flags.h>
#include <ftl/flags.h>
#include <input/KeyboardClassifier.h>
#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<KeyboardType>(
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