19f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown/*
29f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown * Copyright (C) 2012 The Android Open Source Project
39f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown *
49f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown * Licensed under the Apache License, Version 2.0 (the "License");
59f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown * you may not use this file except in compliance with the License.
69f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown * You may obtain a copy of the License at
79f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown *
89f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown *      http://www.apache.org/licenses/LICENSE-2.0
99f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown *
109f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown * Unless required by applicable law or agreed to in writing, software
119f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown * distributed under the License is distributed on an "AS IS" BASIS,
129f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown * See the License for the specific language governing permissions and
149f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown * limitations under the License.
159f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown */
169f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown
179f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown#ifndef _ANDROIDFW_INPUT_DEVICE_H
189f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown#define _ANDROIDFW_INPUT_DEVICE_H
199f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown
209f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown#include <androidfw/Input.h>
219f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown#include <androidfw/KeyCharacterMap.h>
229f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown
239f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brownnamespace android {
249f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown
259f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown/*
269f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown * Identifies a device.
279f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown */
289f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brownstruct InputDeviceIdentifier {
299f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    inline InputDeviceIdentifier() :
309f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown            bus(0), vendor(0), product(0), version(0) {
319f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    }
329f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown
339f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    // Information provided by the kernel.
349f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    String8 name;
359f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    String8 location;
369f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    String8 uniqueId;
379f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    uint16_t bus;
389f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    uint16_t vendor;
399f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    uint16_t product;
409f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    uint16_t version;
419f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown
429f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    // A composite input device descriptor string that uniquely identifies the device
439f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    // even across reboots or reconnections.  The value of this field is used by
449f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    // upper layers of the input system to associate settings with individual devices.
459f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    // It is hashed from whatever kernel provided information is available.
469f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    // Ideally, the way this value is computed should not change between Android releases
479f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    // because that would invalidate persistent settings that rely on it.
489f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    String8 descriptor;
499f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown};
509f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown
519f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown/*
529f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown * Describes the characteristics and capabilities of an input device.
539f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown */
549f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brownclass InputDeviceInfo {
559f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brownpublic:
569f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    InputDeviceInfo();
579f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    InputDeviceInfo(const InputDeviceInfo& other);
589f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    ~InputDeviceInfo();
599f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown
609f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    struct MotionRange {
619f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        int32_t axis;
629f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        uint32_t source;
639f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        float min;
649f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        float max;
659f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        float flat;
669f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        float fuzz;
679f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    };
689f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown
695bbd4b4f5fc19302fa017ad6afee6eb2d489d91aJeff Brown    void initialize(int32_t id, int32_t generation, const InputDeviceIdentifier& identifier,
70daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown            const String8& alias, bool isExternal);
719f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown
729f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    inline int32_t getId() const { return mId; }
73af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown    inline int32_t getGeneration() const { return mGeneration; }
745bbd4b4f5fc19302fa017ad6afee6eb2d489d91aJeff Brown    inline const InputDeviceIdentifier& getIdentifier() const { return mIdentifier; }
755bbd4b4f5fc19302fa017ad6afee6eb2d489d91aJeff Brown    inline const String8& getAlias() const { return mAlias; }
765bbd4b4f5fc19302fa017ad6afee6eb2d489d91aJeff Brown    inline const String8& getDisplayName() const {
775bbd4b4f5fc19302fa017ad6afee6eb2d489d91aJeff Brown        return mAlias.isEmpty() ? mIdentifier.name : mAlias;
785bbd4b4f5fc19302fa017ad6afee6eb2d489d91aJeff Brown    }
79daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown    inline bool isExternal() const { return mIsExternal; }
809f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    inline uint32_t getSources() const { return mSources; }
819f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown
829f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    const MotionRange* getMotionRange(int32_t axis, uint32_t source) const;
839f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown
849f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    void addSource(uint32_t source);
859f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    void addMotionRange(int32_t axis, uint32_t source,
869f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown            float min, float max, float flat, float fuzz);
879f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    void addMotionRange(const MotionRange& range);
889f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown
899f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    inline void setKeyboardType(int32_t keyboardType) { mKeyboardType = keyboardType; }
909f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    inline int32_t getKeyboardType() const { return mKeyboardType; }
919f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown
929f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    inline void setKeyCharacterMap(const sp<KeyCharacterMap>& value) {
939f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        mKeyCharacterMap = value;
949f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    }
959f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown
969f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    inline sp<KeyCharacterMap> getKeyCharacterMap() const {
979f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        return mKeyCharacterMap;
989f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    }
999f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown
100a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown    inline void setVibrator(bool hasVibrator) { mHasVibrator = hasVibrator; }
101a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown    inline bool hasVibrator() const { return mHasVibrator; }
102a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown
1039f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    inline const Vector<MotionRange>& getMotionRanges() const {
1049f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        return mMotionRanges;
1059f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    }
1069f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown
1079f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brownprivate:
1089f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    int32_t mId;
109af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown    int32_t mGeneration;
1105bbd4b4f5fc19302fa017ad6afee6eb2d489d91aJeff Brown    InputDeviceIdentifier mIdentifier;
1115bbd4b4f5fc19302fa017ad6afee6eb2d489d91aJeff Brown    String8 mAlias;
112daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown    bool mIsExternal;
1139f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    uint32_t mSources;
1149f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    int32_t mKeyboardType;
1159f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    sp<KeyCharacterMap> mKeyCharacterMap;
116a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown    bool mHasVibrator;
1179f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown
1189f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    Vector<MotionRange> mMotionRanges;
1199f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown};
1209f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown
1219f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown/* Types of input device configuration files. */
1229f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brownenum InputDeviceConfigurationFileType {
1239f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    INPUT_DEVICE_CONFIGURATION_FILE_TYPE_CONFIGURATION = 0,     /* .idc file */
1249f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    INPUT_DEVICE_CONFIGURATION_FILE_TYPE_KEY_LAYOUT = 1,        /* .kl file */
1259f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    INPUT_DEVICE_CONFIGURATION_FILE_TYPE_KEY_CHARACTER_MAP = 2, /* .kcm file */
1269f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown};
1279f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown
1289f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown/*
1299f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown * Gets the path of an input device configuration file, if one is available.
1309f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown * Considers both system provided and user installed configuration files.
1319f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown *
1329f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown * The device identifier is used to construct several default configuration file
1339f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown * names to try based on the device name, vendor, product, and version.
1349f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown *
1359f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown * Returns an empty string if not found.
1369f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown */
1379f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brownextern String8 getInputDeviceConfigurationFilePathByDeviceIdentifier(
1389f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        const InputDeviceIdentifier& deviceIdentifier,
1399f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        InputDeviceConfigurationFileType type);
1409f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown
1419f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown/*
1429f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown * Gets the path of an input device configuration file, if one is available.
1439f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown * Considers both system provided and user installed configuration files.
1449f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown *
1459f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown * The name is case-sensitive and is used to construct the filename to resolve.
1469f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown * All characters except 'a'-'z', 'A'-'Z', '0'-'9', '-', and '_' are replaced by underscores.
1479f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown *
1489f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown * Returns an empty string if not found.
1499f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown */
1509f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brownextern String8 getInputDeviceConfigurationFilePathByName(
1519f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        const String8& name, InputDeviceConfigurationFileType type);
1529f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown
1539f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown} // namespace android
1549f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown
1559f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown#endif // _ANDROIDFW_INPUT_DEVICE_H
156