Instead of each application loading the KeyCharacterMap from the file system, get them from the input manager service as part of the InputDevice object. Refactored InputManager to be a proper singleton instead of having a bunch of static methods. InputManager now maintains a cache of all InputDevice objects that it has loaded. Currently we never invalidate the cache which can cause InputDevice to return stale motion ranges if the device is reconfigured. This will be fixed in a future change. Added a fake InputDevice with ID -1 to represent the virtual keyboard. Change-Id: If7a695839ad0972317a5aab89e9d1e42ace28eb7
144 lines
4.6 KiB
C++
144 lines
4.6 KiB
C++
/*
|
|
* Copyright (C) 2012 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.
|
|
*/
|
|
|
|
#ifndef _ANDROIDFW_INPUT_DEVICE_H
|
|
#define _ANDROIDFW_INPUT_DEVICE_H
|
|
|
|
#include <androidfw/Input.h>
|
|
#include <androidfw/KeyCharacterMap.h>
|
|
|
|
namespace android {
|
|
|
|
/*
|
|
* Identifies a device.
|
|
*/
|
|
struct InputDeviceIdentifier {
|
|
inline InputDeviceIdentifier() :
|
|
bus(0), vendor(0), product(0), version(0) {
|
|
}
|
|
|
|
// Information provided by the kernel.
|
|
String8 name;
|
|
String8 location;
|
|
String8 uniqueId;
|
|
uint16_t bus;
|
|
uint16_t vendor;
|
|
uint16_t product;
|
|
uint16_t version;
|
|
|
|
// A composite input device descriptor string that uniquely identifies the device
|
|
// even across reboots or reconnections. The value of this field is used by
|
|
// upper layers of the input system to associate settings with individual devices.
|
|
// It is hashed from whatever kernel provided information is available.
|
|
// Ideally, the way this value is computed should not change between Android releases
|
|
// because that would invalidate persistent settings that rely on it.
|
|
String8 descriptor;
|
|
};
|
|
|
|
/*
|
|
* Describes the characteristics and capabilities of an input device.
|
|
*/
|
|
class InputDeviceInfo {
|
|
public:
|
|
InputDeviceInfo();
|
|
InputDeviceInfo(const InputDeviceInfo& other);
|
|
~InputDeviceInfo();
|
|
|
|
struct MotionRange {
|
|
int32_t axis;
|
|
uint32_t source;
|
|
float min;
|
|
float max;
|
|
float flat;
|
|
float fuzz;
|
|
};
|
|
|
|
void initialize(int32_t id, const String8& name, const String8& descriptor);
|
|
|
|
inline int32_t getId() const { return mId; }
|
|
inline const String8 getName() const { return mName; }
|
|
inline const String8 getDescriptor() const { return mDescriptor; }
|
|
inline uint32_t getSources() const { return mSources; }
|
|
|
|
const MotionRange* getMotionRange(int32_t axis, uint32_t source) const;
|
|
|
|
void addSource(uint32_t source);
|
|
void addMotionRange(int32_t axis, uint32_t source,
|
|
float min, float max, float flat, float fuzz);
|
|
void addMotionRange(const MotionRange& range);
|
|
|
|
inline void setKeyboardType(int32_t keyboardType) { mKeyboardType = keyboardType; }
|
|
inline int32_t getKeyboardType() const { return mKeyboardType; }
|
|
|
|
inline void setKeyCharacterMap(const sp<KeyCharacterMap>& value) {
|
|
mKeyCharacterMap = value;
|
|
}
|
|
|
|
inline sp<KeyCharacterMap> getKeyCharacterMap() const {
|
|
return mKeyCharacterMap;
|
|
}
|
|
|
|
inline const Vector<MotionRange>& getMotionRanges() const {
|
|
return mMotionRanges;
|
|
}
|
|
|
|
private:
|
|
int32_t mId;
|
|
String8 mName;
|
|
String8 mDescriptor;
|
|
uint32_t mSources;
|
|
int32_t mKeyboardType;
|
|
sp<KeyCharacterMap> mKeyCharacterMap;
|
|
|
|
Vector<MotionRange> mMotionRanges;
|
|
};
|
|
|
|
/* Types of input device configuration files. */
|
|
enum InputDeviceConfigurationFileType {
|
|
INPUT_DEVICE_CONFIGURATION_FILE_TYPE_CONFIGURATION = 0, /* .idc file */
|
|
INPUT_DEVICE_CONFIGURATION_FILE_TYPE_KEY_LAYOUT = 1, /* .kl file */
|
|
INPUT_DEVICE_CONFIGURATION_FILE_TYPE_KEY_CHARACTER_MAP = 2, /* .kcm file */
|
|
};
|
|
|
|
/*
|
|
* Gets the path of an input device configuration file, if one is available.
|
|
* Considers both system provided and user installed configuration files.
|
|
*
|
|
* The device identifier is used to construct several default configuration file
|
|
* names to try based on the device name, vendor, product, and version.
|
|
*
|
|
* Returns an empty string if not found.
|
|
*/
|
|
extern String8 getInputDeviceConfigurationFilePathByDeviceIdentifier(
|
|
const InputDeviceIdentifier& deviceIdentifier,
|
|
InputDeviceConfigurationFileType type);
|
|
|
|
/*
|
|
* Gets the path of an input device configuration file, if one is available.
|
|
* Considers both system provided and user installed configuration files.
|
|
*
|
|
* The name is case-sensitive and is used to construct the filename to resolve.
|
|
* All characters except 'a'-'z', 'A'-'Z', '0'-'9', '-', and '_' are replaced by underscores.
|
|
*
|
|
* Returns an empty string if not found.
|
|
*/
|
|
extern String8 getInputDeviceConfigurationFilePathByName(
|
|
const String8& name, InputDeviceConfigurationFileType type);
|
|
|
|
} // namespace android
|
|
|
|
#endif // _ANDROIDFW_INPUT_DEVICE_H
|