blob: 944a79b66f81f5ceb12d322bf3fa5540aaaa39ab [file] [log] [blame]
Jeff Browne839a582010-04-22 18:58:52 -07001//
2// Copyright 2010 The Android Open Source Project
3//
4// Provides a pipe-based transport for native events in the NDK.
5//
6#define LOG_TAG "Input"
7
8//#define LOG_NDEBUG 0
9
10#include <ui/Input.h>
11
12namespace android {
13
14// class InputEvent
15
Jeff Brown5c1ed842010-07-14 18:48:53 -070016void InputEvent::initialize(int32_t deviceId, int32_t source) {
Jeff Browne839a582010-04-22 18:58:52 -070017 mDeviceId = deviceId;
Jeff Brown5c1ed842010-07-14 18:48:53 -070018 mSource = source;
Jeff Browne839a582010-04-22 18:58:52 -070019}
20
Dianne Hackborn0e885272010-07-15 17:44:53 -070021void InputEvent::initialize(const InputEvent& from) {
22 mDeviceId = from.mDeviceId;
23 mSource = from.mSource;
24}
25
Jeff Browne839a582010-04-22 18:58:52 -070026// class KeyEvent
27
Dianne Hackborn189ed232010-06-29 19:20:40 -070028bool KeyEvent::hasDefaultAction(int32_t keyCode) {
29 switch (keyCode) {
Jeff Brown8575a872010-06-30 16:10:35 -070030 case AKEYCODE_HOME:
31 case AKEYCODE_BACK:
32 case AKEYCODE_CALL:
33 case AKEYCODE_ENDCALL:
34 case AKEYCODE_VOLUME_UP:
35 case AKEYCODE_VOLUME_DOWN:
Jeff Brown7e5660f2010-11-01 15:24:01 -070036 case AKEYCODE_VOLUME_MUTE:
Jeff Brown8575a872010-06-30 16:10:35 -070037 case AKEYCODE_POWER:
38 case AKEYCODE_CAMERA:
39 case AKEYCODE_HEADSETHOOK:
40 case AKEYCODE_MENU:
41 case AKEYCODE_NOTIFICATION:
42 case AKEYCODE_FOCUS:
43 case AKEYCODE_SEARCH:
Jeff Brown7e5660f2010-11-01 15:24:01 -070044 case AKEYCODE_MEDIA_PLAY:
45 case AKEYCODE_MEDIA_PAUSE:
Jeff Brown8575a872010-06-30 16:10:35 -070046 case AKEYCODE_MEDIA_PLAY_PAUSE:
47 case AKEYCODE_MEDIA_STOP:
48 case AKEYCODE_MEDIA_NEXT:
49 case AKEYCODE_MEDIA_PREVIOUS:
50 case AKEYCODE_MEDIA_REWIND:
Jeff Brown7e5660f2010-11-01 15:24:01 -070051 case AKEYCODE_MEDIA_RECORD:
Jeff Brown8575a872010-06-30 16:10:35 -070052 case AKEYCODE_MEDIA_FAST_FORWARD:
53 case AKEYCODE_MUTE:
Dianne Hackborn189ed232010-06-29 19:20:40 -070054 return true;
55 }
56
57 return false;
58}
59
60bool KeyEvent::hasDefaultAction() const {
61 return hasDefaultAction(getKeyCode());
62}
63
64bool KeyEvent::isSystemKey(int32_t keyCode) {
65 switch (keyCode) {
Jeff Brown8575a872010-06-30 16:10:35 -070066 case AKEYCODE_MENU:
67 case AKEYCODE_SOFT_RIGHT:
68 case AKEYCODE_HOME:
69 case AKEYCODE_BACK:
70 case AKEYCODE_CALL:
71 case AKEYCODE_ENDCALL:
72 case AKEYCODE_VOLUME_UP:
73 case AKEYCODE_VOLUME_DOWN:
Jeff Brown7e5660f2010-11-01 15:24:01 -070074 case AKEYCODE_VOLUME_MUTE:
Jeff Brown8575a872010-06-30 16:10:35 -070075 case AKEYCODE_MUTE:
76 case AKEYCODE_POWER:
77 case AKEYCODE_HEADSETHOOK:
Jeff Brown7e5660f2010-11-01 15:24:01 -070078 case AKEYCODE_MEDIA_PLAY:
79 case AKEYCODE_MEDIA_PAUSE:
Jeff Brown8575a872010-06-30 16:10:35 -070080 case AKEYCODE_MEDIA_PLAY_PAUSE:
81 case AKEYCODE_MEDIA_STOP:
82 case AKEYCODE_MEDIA_NEXT:
83 case AKEYCODE_MEDIA_PREVIOUS:
84 case AKEYCODE_MEDIA_REWIND:
Jeff Brown7e5660f2010-11-01 15:24:01 -070085 case AKEYCODE_MEDIA_RECORD:
Jeff Brown8575a872010-06-30 16:10:35 -070086 case AKEYCODE_MEDIA_FAST_FORWARD:
87 case AKEYCODE_CAMERA:
88 case AKEYCODE_FOCUS:
89 case AKEYCODE_SEARCH:
Dianne Hackborn189ed232010-06-29 19:20:40 -070090 return true;
91 }
92
93 return false;
94}
95
96bool KeyEvent::isSystemKey() const {
97 return isSystemKey(getKeyCode());
98}
99
Jeff Browne839a582010-04-22 18:58:52 -0700100void KeyEvent::initialize(
101 int32_t deviceId,
Jeff Brown5c1ed842010-07-14 18:48:53 -0700102 int32_t source,
Jeff Browne839a582010-04-22 18:58:52 -0700103 int32_t action,
104 int32_t flags,
105 int32_t keyCode,
106 int32_t scanCode,
107 int32_t metaState,
108 int32_t repeatCount,
109 nsecs_t downTime,
110 nsecs_t eventTime) {
Jeff Brown5c1ed842010-07-14 18:48:53 -0700111 InputEvent::initialize(deviceId, source);
Jeff Browne839a582010-04-22 18:58:52 -0700112 mAction = action;
113 mFlags = flags;
114 mKeyCode = keyCode;
115 mScanCode = scanCode;
116 mMetaState = metaState;
117 mRepeatCount = repeatCount;
118 mDownTime = downTime;
119 mEventTime = eventTime;
120}
121
Dianne Hackborn0e885272010-07-15 17:44:53 -0700122void KeyEvent::initialize(const KeyEvent& from) {
123 InputEvent::initialize(from);
124 mAction = from.mAction;
125 mFlags = from.mFlags;
126 mKeyCode = from.mKeyCode;
127 mScanCode = from.mScanCode;
128 mMetaState = from.mMetaState;
129 mRepeatCount = from.mRepeatCount;
130 mDownTime = from.mDownTime;
131 mEventTime = from.mEventTime;
132}
133
Jeff Browne839a582010-04-22 18:58:52 -0700134// class MotionEvent
135
136void MotionEvent::initialize(
137 int32_t deviceId,
Jeff Brown5c1ed842010-07-14 18:48:53 -0700138 int32_t source,
Jeff Browne839a582010-04-22 18:58:52 -0700139 int32_t action,
Jeff Brownaf30ff62010-09-01 17:01:00 -0700140 int32_t flags,
Jeff Browne839a582010-04-22 18:58:52 -0700141 int32_t edgeFlags,
142 int32_t metaState,
Jeff Brownf4a4ec22010-06-16 01:53:36 -0700143 float xOffset,
144 float yOffset,
Jeff Browne839a582010-04-22 18:58:52 -0700145 float xPrecision,
146 float yPrecision,
147 nsecs_t downTime,
148 nsecs_t eventTime,
149 size_t pointerCount,
150 const int32_t* pointerIds,
151 const PointerCoords* pointerCoords) {
Jeff Brown5c1ed842010-07-14 18:48:53 -0700152 InputEvent::initialize(deviceId, source);
Jeff Browne839a582010-04-22 18:58:52 -0700153 mAction = action;
Jeff Brownaf30ff62010-09-01 17:01:00 -0700154 mFlags = flags;
Jeff Browne839a582010-04-22 18:58:52 -0700155 mEdgeFlags = edgeFlags;
156 mMetaState = metaState;
Jeff Brownf4a4ec22010-06-16 01:53:36 -0700157 mXOffset = xOffset;
158 mYOffset = yOffset;
Jeff Browne839a582010-04-22 18:58:52 -0700159 mXPrecision = xPrecision;
160 mYPrecision = yPrecision;
161 mDownTime = downTime;
162 mPointerIds.clear();
163 mPointerIds.appendArray(pointerIds, pointerCount);
164 mSampleEventTimes.clear();
165 mSamplePointerCoords.clear();
166 addSample(eventTime, pointerCoords);
167}
168
169void MotionEvent::addSample(
170 int64_t eventTime,
171 const PointerCoords* pointerCoords) {
172 mSampleEventTimes.push(eventTime);
173 mSamplePointerCoords.appendArray(pointerCoords, getPointerCount());
174}
175
176void MotionEvent::offsetLocation(float xOffset, float yOffset) {
Jeff Brownf4a4ec22010-06-16 01:53:36 -0700177 mXOffset += xOffset;
178 mYOffset += yOffset;
Jeff Browne839a582010-04-22 18:58:52 -0700179}
180
Jeff Browne57e8952010-07-23 21:28:06 -0700181// class InputDeviceInfo
182
183InputDeviceInfo::InputDeviceInfo() {
184 initialize(-1, String8("uninitialized device info"));
185}
186
187InputDeviceInfo::InputDeviceInfo(const InputDeviceInfo& other) :
188 mId(other.mId), mName(other.mName), mSources(other.mSources),
189 mKeyboardType(other.mKeyboardType),
190 mMotionRanges(other.mMotionRanges) {
191}
192
193InputDeviceInfo::~InputDeviceInfo() {
194}
195
196void InputDeviceInfo::initialize(int32_t id, const String8& name) {
197 mId = id;
198 mName = name;
199 mSources = 0;
200 mKeyboardType = AINPUT_KEYBOARD_TYPE_NONE;
201 mMotionRanges.clear();
202}
203
204const InputDeviceInfo::MotionRange* InputDeviceInfo::getMotionRange(int32_t rangeType) const {
205 ssize_t index = mMotionRanges.indexOfKey(rangeType);
206 return index >= 0 ? & mMotionRanges.valueAt(index) : NULL;
207}
208
209void InputDeviceInfo::addSource(uint32_t source) {
210 mSources |= source;
211}
212
213void InputDeviceInfo::addMotionRange(int32_t rangeType, float min, float max,
214 float flat, float fuzz) {
215 MotionRange range = { min, max, flat, fuzz };
216 addMotionRange(rangeType, range);
217}
218
219void InputDeviceInfo::addMotionRange(int32_t rangeType, const MotionRange& range) {
220 mMotionRanges.add(rangeType, range);
221}
222
Jeff Browne839a582010-04-22 18:58:52 -0700223} // namespace android