Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e58ffb9d authored by Vaibhav Devmurari's avatar Vaibhav Devmurari
Browse files

Implement KeyboardClassifier interface in rust

DD: go/project-imposter-android
This CL includes:
- Rust interface setup

Next CL to include:
- Basic categorization into alphabetic and non-alphabetic
- Updating categorization based on key presses

Test: atest --host libinput_rust_test
Test: atest inputflinger_tests
Bug: 263559234
Flag: com.android.input.flags.enable_keyboard_classifier_rust_impl
Change-Id: I52773be992ddd8efaa9546e0af8b0a78515d931c
parent e2741319
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -1002,7 +1002,6 @@ enum {
 * Keyboard types.
 *
 * Refer to the documentation on android.view.InputDevice for more details.
 * Note: When adding a new keyboard type here InputDeviceInfo::setKeyboardType needs to be updated.
 */
enum {
    /** none */
+10 −0
Original line number Diff line number Diff line
@@ -258,6 +258,16 @@ enum class KeyState {
    ftl_last = VIRTUAL,
};

/**
 * The keyboard type. This should have 1:1 correspondence with the values of anonymous enum
 * defined in input.h
 */
enum class KeyboardType {
    NONE = AINPUT_KEYBOARD_TYPE_NONE,
    NON_ALPHABETIC = AINPUT_KEYBOARD_TYPE_NON_ALPHABETIC,
    ALPHABETIC = AINPUT_KEYBOARD_TYPE_ALPHABETIC,
};

bool isStylusToolType(ToolType toolType);

struct PointerProperties;
+53 −0
Original line number Diff line number Diff line
/*
 * 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.
 */

#pragma once

#include <android-base/result.h>
#include <input/Input.h>
#include <input/InputDevice.h>

#include "rust/cxx.h"

namespace android {

namespace input {
namespace keyboardClassifier {
struct KeyboardClassifier;
}
} // namespace input

/*
 * Keyboard classifier to classify keyboard into alphabetic and non-alphabetic keyboards
 */
class KeyboardClassifier {
public:
    KeyboardClassifier();
    /**
     * Get the type of keyboard that the classifier currently believes the device to be.
     */
    KeyboardType getKeyboardType(DeviceId deviceId);
    void notifyKeyboardChanged(DeviceId deviceId, const InputDeviceIdentifier& identifier,
                               uint32_t deviceClasses);
    void processKey(DeviceId deviceId, int32_t evdevCode, uint32_t metaState);

private:
    std::optional<rust::Box<android::input::keyboardClassifier::KeyboardClassifier>>
            mRustClassifier;
    std::unordered_map<DeviceId, KeyboardType> mKeyboardTypeMap;
};

} // namespace android
+22 −0
Original line number Diff line number Diff line
@@ -117,6 +117,27 @@ rust_bindgen {
        "--allowlist-var=AINPUT_SOURCE_HDMI",
        "--allowlist-var=AINPUT_SOURCE_SENSOR",
        "--allowlist-var=AINPUT_SOURCE_ROTARY_ENCODER",
        "--allowlist-var=AINPUT_KEYBOARD_TYPE_NONE",
        "--allowlist-var=AINPUT_KEYBOARD_TYPE_NON_ALPHABETIC",
        "--allowlist-var=AINPUT_KEYBOARD_TYPE_ALPHABETIC",
        "--allowlist-var=AMETA_NONE",
        "--allowlist-var=AMETA_ALT_ON",
        "--allowlist-var=AMETA_ALT_LEFT_ON",
        "--allowlist-var=AMETA_ALT_RIGHT_ON",
        "--allowlist-var=AMETA_SHIFT_ON",
        "--allowlist-var=AMETA_SHIFT_LEFT_ON",
        "--allowlist-var=AMETA_SHIFT_RIGHT_ON",
        "--allowlist-var=AMETA_SYM_ON",
        "--allowlist-var=AMETA_FUNCTION_ON",
        "--allowlist-var=AMETA_CTRL_ON",
        "--allowlist-var=AMETA_CTRL_LEFT_ON",
        "--allowlist-var=AMETA_CTRL_RIGHT_ON",
        "--allowlist-var=AMETA_META_ON",
        "--allowlist-var=AMETA_META_LEFT_ON",
        "--allowlist-var=AMETA_META_RIGHT_ON",
        "--allowlist-var=AMETA_CAPS_LOCK_ON",
        "--allowlist-var=AMETA_NUM_LOCK_ON",
        "--allowlist-var=AMETA_SCROLL_LOCK_ON",
    ],

    static_libs: [
@@ -208,6 +229,7 @@ cc_library {
        "InputVerifier.cpp",
        "Keyboard.cpp",
        "KeyCharacterMap.cpp",
        "KeyboardClassifier.cpp",
        "KeyLayoutMap.cpp",
        "MotionPredictor.cpp",
        "MotionPredictorMetricsManager.cpp",
+1 −4
Original line number Diff line number Diff line
@@ -273,10 +273,7 @@ void InputDeviceInfo::addLightInfo(const InputDeviceLightInfo& info) {
}

void InputDeviceInfo::setKeyboardType(int32_t keyboardType) {
    static_assert(AINPUT_KEYBOARD_TYPE_NONE < AINPUT_KEYBOARD_TYPE_NON_ALPHABETIC);
    static_assert(AINPUT_KEYBOARD_TYPE_NON_ALPHABETIC < AINPUT_KEYBOARD_TYPE_ALPHABETIC);
    // There can be multiple subdevices with different keyboard types, set it to the highest type
    mKeyboardType = std::max(mKeyboardType, keyboardType);
    mKeyboardType = keyboardType;
}

void InputDeviceInfo::setKeyboardLayoutInfo(KeyboardLayoutInfo layoutInfo) {
Loading