Input.cpp revision 47e6b1b5eef8ee99872f278f66bc498c4fcca0d8
146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown//
246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown// Copyright 2010 The Android Open Source Project
346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown//
446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown// Provides a pipe-based transport for native events in the NDK.
546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown//
646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#define LOG_TAG "Input"
746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown//#define LOG_NDEBUG 0
946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
1047e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown#define DEBUG_PROBE 0
1147e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown
1247e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown#include <stdlib.h>
1347e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown#include <unistd.h>
1447e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown
1546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#include <ui/Input.h>
1646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
1746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownnamespace android {
1846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
1947e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brownstatic const char* CONFIGURATION_FILE_DIR[] = {
2047e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown        "idc/",
2147e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown        "keylayout/",
2247e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown        "keychars/",
2347e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown};
2447e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown
2547e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brownstatic const char* CONFIGURATION_FILE_EXTENSION[] = {
2647e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown        ".idc",
2747e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown        ".kl",
2847e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown        ".kcm",
2947e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown};
3047e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown
3147e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brownstatic void appendInputDeviceConfigurationFileRelativePath(String8& path,
3247e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown        const String8& name, InputDeviceConfigurationFileType type) {
3347e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown    path.append(CONFIGURATION_FILE_DIR[type]);
3447e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown    for (size_t i = 0; i < name.length(); i++) {
3547e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown        char ch = name[i];
3647e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown        if (ch == ' ') {
3747e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown            ch = '_';
3847e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown        }
3947e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown        path.append(&ch, 1);
4047e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown    }
4147e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown    path.append(CONFIGURATION_FILE_EXTENSION[type]);
4247e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown}
4347e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown
4447e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brownextern String8 getInputDeviceConfigurationFilePath(
4547e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown        const String8& name, InputDeviceConfigurationFileType type) {
4647e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown    // Search system repository.
4747e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown    String8 path;
4847e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown    path.setTo(getenv("ANDROID_ROOT"));
4947e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown    path.append("/usr/");
5047e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown    appendInputDeviceConfigurationFileRelativePath(path, name, type);
5147e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown#if DEBUG_PROBE
5247e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown    LOGD("Probing for system provided input device configuration file: path='%s'", path.string());
5347e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown#endif
5447e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown    if (!access(path.string(), R_OK)) {
5547e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown#if DEBUG_PROBE
5647e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown        LOGD("Found");
5747e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown#endif
5847e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown        return path;
5947e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown    }
6047e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown
6147e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown    // Search user repository.
6247e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown    // TODO Should only look here if not in safe mode.
6347e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown    path.setTo(getenv("ANDROID_DATA"));
6447e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown    path.append("/system/devices/");
6547e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown    appendInputDeviceConfigurationFileRelativePath(path, name, type);
6647e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown#if DEBUG_PROBE
6747e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown    LOGD("Probing for system user input device configuration file: path='%s'", path.string());
6847e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown#endif
6947e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown    if (!access(path.string(), R_OK)) {
7047e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown#if DEBUG_PROBE
7147e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown        LOGD("Found");
7247e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown#endif
7347e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown        return path;
7447e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown    }
7547e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown
7647e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown    // Not found.
7747e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown#if DEBUG_PROBE
7847e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown    LOGD("Probe failed to find input device configuration file: name='%s', type=%d",
7947e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown            name.string(), type);
8047e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown#endif
8147e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown    return String8();
8247e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown}
8347e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown
8447e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown
8547e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown// --- InputEvent ---
8646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
87c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brownvoid InputEvent::initialize(int32_t deviceId, int32_t source) {
8846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    mDeviceId = deviceId;
89c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    mSource = source;
9046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
9146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
922c6081ce3593712f30dacd990a97209c791d6cedDianne Hackbornvoid InputEvent::initialize(const InputEvent& from) {
932c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn    mDeviceId = from.mDeviceId;
942c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn    mSource = from.mSource;
952c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn}
962c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn
9747e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown// --- KeyEvent ---
9846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
993c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackbornbool KeyEvent::hasDefaultAction(int32_t keyCode) {
1003c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn    switch (keyCode) {
101fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown        case AKEYCODE_HOME:
102fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown        case AKEYCODE_BACK:
103fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown        case AKEYCODE_CALL:
104fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown        case AKEYCODE_ENDCALL:
105fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown        case AKEYCODE_VOLUME_UP:
106fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown        case AKEYCODE_VOLUME_DOWN:
107b0418da0e7594a8c2164a46985c5f1993632e010Jeff Brown        case AKEYCODE_VOLUME_MUTE:
108fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown        case AKEYCODE_POWER:
109fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown        case AKEYCODE_CAMERA:
110fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown        case AKEYCODE_HEADSETHOOK:
111fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown        case AKEYCODE_MENU:
112fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown        case AKEYCODE_NOTIFICATION:
113fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown        case AKEYCODE_FOCUS:
114fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown        case AKEYCODE_SEARCH:
115b0418da0e7594a8c2164a46985c5f1993632e010Jeff Brown        case AKEYCODE_MEDIA_PLAY:
116b0418da0e7594a8c2164a46985c5f1993632e010Jeff Brown        case AKEYCODE_MEDIA_PAUSE:
117fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown        case AKEYCODE_MEDIA_PLAY_PAUSE:
118fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown        case AKEYCODE_MEDIA_STOP:
119fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown        case AKEYCODE_MEDIA_NEXT:
120fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown        case AKEYCODE_MEDIA_PREVIOUS:
121fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown        case AKEYCODE_MEDIA_REWIND:
122b0418da0e7594a8c2164a46985c5f1993632e010Jeff Brown        case AKEYCODE_MEDIA_RECORD:
123fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown        case AKEYCODE_MEDIA_FAST_FORWARD:
124fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown        case AKEYCODE_MUTE:
1253c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn            return true;
1263c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn    }
1273c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn
1283c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn    return false;
1293c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn}
1303c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn
1313c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackbornbool KeyEvent::hasDefaultAction() const {
1323c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn    return hasDefaultAction(getKeyCode());
1333c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn}
1343c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn
1353c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackbornbool KeyEvent::isSystemKey(int32_t keyCode) {
1363c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn    switch (keyCode) {
137fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown        case AKEYCODE_MENU:
138fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown        case AKEYCODE_SOFT_RIGHT:
139fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown        case AKEYCODE_HOME:
140fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown        case AKEYCODE_BACK:
141fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown        case AKEYCODE_CALL:
142fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown        case AKEYCODE_ENDCALL:
143fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown        case AKEYCODE_VOLUME_UP:
144fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown        case AKEYCODE_VOLUME_DOWN:
145b0418da0e7594a8c2164a46985c5f1993632e010Jeff Brown        case AKEYCODE_VOLUME_MUTE:
146fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown        case AKEYCODE_MUTE:
147fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown        case AKEYCODE_POWER:
148fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown        case AKEYCODE_HEADSETHOOK:
149b0418da0e7594a8c2164a46985c5f1993632e010Jeff Brown        case AKEYCODE_MEDIA_PLAY:
150b0418da0e7594a8c2164a46985c5f1993632e010Jeff Brown        case AKEYCODE_MEDIA_PAUSE:
151fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown        case AKEYCODE_MEDIA_PLAY_PAUSE:
152fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown        case AKEYCODE_MEDIA_STOP:
153fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown        case AKEYCODE_MEDIA_NEXT:
154fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown        case AKEYCODE_MEDIA_PREVIOUS:
155fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown        case AKEYCODE_MEDIA_REWIND:
156b0418da0e7594a8c2164a46985c5f1993632e010Jeff Brown        case AKEYCODE_MEDIA_RECORD:
157fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown        case AKEYCODE_MEDIA_FAST_FORWARD:
158fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown        case AKEYCODE_CAMERA:
159fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown        case AKEYCODE_FOCUS:
160fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown        case AKEYCODE_SEARCH:
1613c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn            return true;
1623c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn    }
1633c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn
1643c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn    return false;
1653c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn}
1663c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn
1673c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackbornbool KeyEvent::isSystemKey() const {
1683c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn    return isSystemKey(getKeyCode());
1693c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn}
1703c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn
17146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownvoid KeyEvent::initialize(
17246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        int32_t deviceId,
173c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        int32_t source,
17446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        int32_t action,
17546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        int32_t flags,
17646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        int32_t keyCode,
17746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        int32_t scanCode,
17846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        int32_t metaState,
17946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        int32_t repeatCount,
18046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        nsecs_t downTime,
18146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        nsecs_t eventTime) {
182c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    InputEvent::initialize(deviceId, source);
18346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    mAction = action;
18446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    mFlags = flags;
18546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    mKeyCode = keyCode;
18646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    mScanCode = scanCode;
18746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    mMetaState = metaState;
18846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    mRepeatCount = repeatCount;
18946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    mDownTime = downTime;
19046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    mEventTime = eventTime;
19146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
19246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
1932c6081ce3593712f30dacd990a97209c791d6cedDianne Hackbornvoid KeyEvent::initialize(const KeyEvent& from) {
1942c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn    InputEvent::initialize(from);
1952c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn    mAction = from.mAction;
1962c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn    mFlags = from.mFlags;
1972c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn    mKeyCode = from.mKeyCode;
1982c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn    mScanCode = from.mScanCode;
1992c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn    mMetaState = from.mMetaState;
2002c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn    mRepeatCount = from.mRepeatCount;
2012c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn    mDownTime = from.mDownTime;
2022c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn    mEventTime = from.mEventTime;
2032c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn}
2042c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn
20547e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown// --- MotionEvent ---
20646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
20746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownvoid MotionEvent::initialize(
20846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        int32_t deviceId,
209c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        int32_t source,
21046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        int32_t action,
21185a3176704b5bfbeece9bd928369fbb76eec7dc6Jeff Brown        int32_t flags,
21246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        int32_t edgeFlags,
21346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        int32_t metaState,
2145c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        float xOffset,
2155c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        float yOffset,
21646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        float xPrecision,
21746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        float yPrecision,
21846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        nsecs_t downTime,
21946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        nsecs_t eventTime,
22046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        size_t pointerCount,
22146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        const int32_t* pointerIds,
22246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        const PointerCoords* pointerCoords) {
223c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    InputEvent::initialize(deviceId, source);
22446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    mAction = action;
22585a3176704b5bfbeece9bd928369fbb76eec7dc6Jeff Brown    mFlags = flags;
22646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    mEdgeFlags = edgeFlags;
22746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    mMetaState = metaState;
2285c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    mXOffset = xOffset;
2295c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    mYOffset = yOffset;
23046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    mXPrecision = xPrecision;
23146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    mYPrecision = yPrecision;
23246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    mDownTime = downTime;
23346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    mPointerIds.clear();
23446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    mPointerIds.appendArray(pointerIds, pointerCount);
23546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    mSampleEventTimes.clear();
23646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    mSamplePointerCoords.clear();
23746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    addSample(eventTime, pointerCoords);
23846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
23946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
24046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownvoid MotionEvent::addSample(
24146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        int64_t eventTime,
24246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        const PointerCoords* pointerCoords) {
24346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    mSampleEventTimes.push(eventTime);
24446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    mSamplePointerCoords.appendArray(pointerCoords, getPointerCount());
24546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
24646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
24746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownvoid MotionEvent::offsetLocation(float xOffset, float yOffset) {
2485c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    mXOffset += xOffset;
2495c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    mYOffset += yOffset;
25046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
25146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
25247e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown// --- InputDeviceInfo ---
2536d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
2546d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff BrownInputDeviceInfo::InputDeviceInfo() {
2556d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    initialize(-1, String8("uninitialized device info"));
2566d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown}
2576d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
2586d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff BrownInputDeviceInfo::InputDeviceInfo(const InputDeviceInfo& other) :
2596d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown        mId(other.mId), mName(other.mName), mSources(other.mSources),
2606d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown        mKeyboardType(other.mKeyboardType),
2616d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown        mMotionRanges(other.mMotionRanges) {
2626d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown}
2636d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
2646d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff BrownInputDeviceInfo::~InputDeviceInfo() {
2656d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown}
2666d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
2676d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brownvoid InputDeviceInfo::initialize(int32_t id, const String8& name) {
2686d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    mId = id;
2696d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    mName = name;
2706d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    mSources = 0;
2716d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    mKeyboardType = AINPUT_KEYBOARD_TYPE_NONE;
2726d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    mMotionRanges.clear();
2736d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown}
2746d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
2756d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brownconst InputDeviceInfo::MotionRange* InputDeviceInfo::getMotionRange(int32_t rangeType) const {
2766d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    ssize_t index = mMotionRanges.indexOfKey(rangeType);
2776d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    return index >= 0 ? & mMotionRanges.valueAt(index) : NULL;
2786d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown}
2796d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
2806d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brownvoid InputDeviceInfo::addSource(uint32_t source) {
2816d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    mSources |= source;
2826d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown}
2836d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
2846d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brownvoid InputDeviceInfo::addMotionRange(int32_t rangeType, float min, float max,
2856d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown        float flat, float fuzz) {
2866d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    MotionRange range = { min, max, flat, fuzz };
2876d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    addMotionRange(rangeType, range);
2886d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown}
2896d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
2906d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brownvoid InputDeviceInfo::addMotionRange(int32_t rangeType, const MotionRange& range) {
2916d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    mMotionRanges.add(rangeType, range);
2926d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown}
2936d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
29446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} // namespace android
295