Input.cpp revision c5ed5910c9ef066cec6a13bbb404ec57b1e92637
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
1046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#include <ui/Input.h>
1146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
1246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownnamespace android {
1346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
1446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown// class InputEvent
1546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
16c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brownvoid InputEvent::initialize(int32_t deviceId, int32_t source) {
1746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    mDeviceId = deviceId;
18c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    mSource = source;
1946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
2046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
2146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown// class KeyEvent
2246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
233c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackbornbool KeyEvent::hasDefaultAction(int32_t keyCode) {
243c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn    switch (keyCode) {
25fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown        case AKEYCODE_HOME:
26fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown        case AKEYCODE_BACK:
27fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown        case AKEYCODE_CALL:
28fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown        case AKEYCODE_ENDCALL:
29fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown        case AKEYCODE_VOLUME_UP:
30fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown        case AKEYCODE_VOLUME_DOWN:
31fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown        case AKEYCODE_POWER:
32fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown        case AKEYCODE_CAMERA:
33fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown        case AKEYCODE_HEADSETHOOK:
34fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown        case AKEYCODE_MENU:
35fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown        case AKEYCODE_NOTIFICATION:
36fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown        case AKEYCODE_FOCUS:
37fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown        case AKEYCODE_SEARCH:
38fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown        case AKEYCODE_MEDIA_PLAY_PAUSE:
39fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown        case AKEYCODE_MEDIA_STOP:
40fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown        case AKEYCODE_MEDIA_NEXT:
41fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown        case AKEYCODE_MEDIA_PREVIOUS:
42fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown        case AKEYCODE_MEDIA_REWIND:
43fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown        case AKEYCODE_MEDIA_FAST_FORWARD:
44fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown        case AKEYCODE_MUTE:
453c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn            return true;
463c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn    }
473c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn
483c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn    return false;
493c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn}
503c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn
513c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackbornbool KeyEvent::hasDefaultAction() const {
523c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn    return hasDefaultAction(getKeyCode());
533c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn}
543c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn
553c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackbornbool KeyEvent::isSystemKey(int32_t keyCode) {
563c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn    switch (keyCode) {
57fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown        case AKEYCODE_MENU:
58fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown        case AKEYCODE_SOFT_RIGHT:
59fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown        case AKEYCODE_HOME:
60fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown        case AKEYCODE_BACK:
61fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown        case AKEYCODE_CALL:
62fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown        case AKEYCODE_ENDCALL:
63fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown        case AKEYCODE_VOLUME_UP:
64fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown        case AKEYCODE_VOLUME_DOWN:
65fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown        case AKEYCODE_MUTE:
66fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown        case AKEYCODE_POWER:
67fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown        case AKEYCODE_HEADSETHOOK:
68fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown        case AKEYCODE_MEDIA_PLAY_PAUSE:
69fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown        case AKEYCODE_MEDIA_STOP:
70fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown        case AKEYCODE_MEDIA_NEXT:
71fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown        case AKEYCODE_MEDIA_PREVIOUS:
72fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown        case AKEYCODE_MEDIA_REWIND:
73fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown        case AKEYCODE_MEDIA_FAST_FORWARD:
74fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown        case AKEYCODE_CAMERA:
75fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown        case AKEYCODE_FOCUS:
76fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown        case AKEYCODE_SEARCH:
773c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn            return true;
783c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn    }
793c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn
803c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn    return false;
813c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn}
823c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn
833c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackbornbool KeyEvent::isSystemKey() const {
843c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn    return isSystemKey(getKeyCode());
853c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn}
863c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn
8746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownvoid KeyEvent::initialize(
8846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        int32_t deviceId,
89c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        int32_t source,
9046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        int32_t action,
9146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        int32_t flags,
9246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        int32_t keyCode,
9346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        int32_t scanCode,
9446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        int32_t metaState,
9546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        int32_t repeatCount,
9646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        nsecs_t downTime,
9746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        nsecs_t eventTime) {
98c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    InputEvent::initialize(deviceId, source);
9946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    mAction = action;
10046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    mFlags = flags;
10146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    mKeyCode = keyCode;
10246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    mScanCode = scanCode;
10346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    mMetaState = metaState;
10446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    mRepeatCount = repeatCount;
10546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    mDownTime = downTime;
10646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    mEventTime = eventTime;
10746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
10846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
10946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown// class MotionEvent
11046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
11146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownvoid MotionEvent::initialize(
11246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        int32_t deviceId,
113c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        int32_t source,
11446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        int32_t action,
11546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        int32_t edgeFlags,
11646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        int32_t metaState,
1175c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        float xOffset,
1185c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        float yOffset,
11946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        float xPrecision,
12046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        float yPrecision,
12146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        nsecs_t downTime,
12246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        nsecs_t eventTime,
12346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        size_t pointerCount,
12446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        const int32_t* pointerIds,
12546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        const PointerCoords* pointerCoords) {
126c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    InputEvent::initialize(deviceId, source);
12746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    mAction = action;
12846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    mEdgeFlags = edgeFlags;
12946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    mMetaState = metaState;
1305c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    mXOffset = xOffset;
1315c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    mYOffset = yOffset;
13246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    mXPrecision = xPrecision;
13346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    mYPrecision = yPrecision;
13446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    mDownTime = downTime;
13546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    mPointerIds.clear();
13646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    mPointerIds.appendArray(pointerIds, pointerCount);
13746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    mSampleEventTimes.clear();
13846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    mSamplePointerCoords.clear();
13946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    addSample(eventTime, pointerCoords);
14046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
14146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
14246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownvoid MotionEvent::addSample(
14346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        int64_t eventTime,
14446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        const PointerCoords* pointerCoords) {
14546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    mSampleEventTimes.push(eventTime);
14646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    mSamplePointerCoords.appendArray(pointerCoords, getPointerCount());
14746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
14846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
14946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownvoid MotionEvent::offsetLocation(float xOffset, float yOffset) {
1505c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    mXOffset += xOffset;
1515c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    mYOffset += yOffset;
15246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
15346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
15446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} // namespace android
155