1 /*
2 * Copyright (C) 2009 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 #define LOG_TAG "input"
18 #include <utils/Log.h>
19
20 #include <android/input.h>
21 #include <androidfw/Input.h>
22 #include <androidfw/InputTransport.h>
23 #include <utils/Looper.h>
24 #include <utils/RefBase.h>
25 #include <utils/Vector.h>
26
27 #include <android_runtime/android_app_NativeActivity.h>
28
29 #include <poll.h>
30 #include <errno.h>
31
32 using android::InputEvent;
33 using android::KeyEvent;
34 using android::MotionEvent;
35 using android::sp;
36 using android::Vector;
37
AInputEvent_getType(const AInputEvent * event)38 int32_t AInputEvent_getType(const AInputEvent* event) {
39 return static_cast<const InputEvent*>(event)->getType();
40 }
41
AInputEvent_getDeviceId(const AInputEvent * event)42 int32_t AInputEvent_getDeviceId(const AInputEvent* event) {
43 return static_cast<const InputEvent*>(event)->getDeviceId();
44 }
45
AInputEvent_getSource(const AInputEvent * event)46 int32_t AInputEvent_getSource(const AInputEvent* event) {
47 return static_cast<const InputEvent*>(event)->getSource();
48 }
49
AKeyEvent_getAction(const AInputEvent * key_event)50 int32_t AKeyEvent_getAction(const AInputEvent* key_event) {
51 return static_cast<const KeyEvent*>(key_event)->getAction();
52 }
53
AKeyEvent_getFlags(const AInputEvent * key_event)54 int32_t AKeyEvent_getFlags(const AInputEvent* key_event) {
55 return static_cast<const KeyEvent*>(key_event)->getFlags();
56 }
57
AKeyEvent_getKeyCode(const AInputEvent * key_event)58 int32_t AKeyEvent_getKeyCode(const AInputEvent* key_event) {
59 return static_cast<const KeyEvent*>(key_event)->getKeyCode();
60 }
61
AKeyEvent_getScanCode(const AInputEvent * key_event)62 int32_t AKeyEvent_getScanCode(const AInputEvent* key_event) {
63 return static_cast<const KeyEvent*>(key_event)->getScanCode();
64 }
65
AKeyEvent_getMetaState(const AInputEvent * key_event)66 int32_t AKeyEvent_getMetaState(const AInputEvent* key_event) {
67 return static_cast<const KeyEvent*>(key_event)->getMetaState();
68 }
AKeyEvent_getRepeatCount(const AInputEvent * key_event)69 int32_t AKeyEvent_getRepeatCount(const AInputEvent* key_event) {
70 return static_cast<const KeyEvent*>(key_event)->getRepeatCount();
71 }
72
AKeyEvent_getDownTime(const AInputEvent * key_event)73 int64_t AKeyEvent_getDownTime(const AInputEvent* key_event) {
74 return static_cast<const KeyEvent*>(key_event)->getDownTime();
75 }
76
77
AKeyEvent_getEventTime(const AInputEvent * key_event)78 int64_t AKeyEvent_getEventTime(const AInputEvent* key_event) {
79 return static_cast<const KeyEvent*>(key_event)->getEventTime();
80 }
81
AMotionEvent_getAction(const AInputEvent * motion_event)82 int32_t AMotionEvent_getAction(const AInputEvent* motion_event) {
83 return static_cast<const MotionEvent*>(motion_event)->getAction();
84 }
85
AMotionEvent_getFlags(const AInputEvent * motion_event)86 int32_t AMotionEvent_getFlags(const AInputEvent* motion_event) {
87 return static_cast<const MotionEvent*>(motion_event)->getFlags();
88 }
89
AMotionEvent_getMetaState(const AInputEvent * motion_event)90 int32_t AMotionEvent_getMetaState(const AInputEvent* motion_event) {
91 return static_cast<const MotionEvent*>(motion_event)->getMetaState();
92 }
93
AMotionEvent_getButtonState(const AInputEvent * motion_event)94 int32_t AMotionEvent_getButtonState(const AInputEvent* motion_event) {
95 return static_cast<const MotionEvent*>(motion_event)->getButtonState();
96 }
97
AMotionEvent_getEdgeFlags(const AInputEvent * motion_event)98 int32_t AMotionEvent_getEdgeFlags(const AInputEvent* motion_event) {
99 return reinterpret_cast<const MotionEvent*>(motion_event)->getEdgeFlags();
100 }
101
AMotionEvent_getDownTime(const AInputEvent * motion_event)102 int64_t AMotionEvent_getDownTime(const AInputEvent* motion_event) {
103 return static_cast<const MotionEvent*>(motion_event)->getDownTime();
104 }
105
AMotionEvent_getEventTime(const AInputEvent * motion_event)106 int64_t AMotionEvent_getEventTime(const AInputEvent* motion_event) {
107 return static_cast<const MotionEvent*>(motion_event)->getEventTime();
108 }
109
AMotionEvent_getXOffset(const AInputEvent * motion_event)110 float AMotionEvent_getXOffset(const AInputEvent* motion_event) {
111 return static_cast<const MotionEvent*>(motion_event)->getXOffset();
112 }
113
AMotionEvent_getYOffset(const AInputEvent * motion_event)114 float AMotionEvent_getYOffset(const AInputEvent* motion_event) {
115 return static_cast<const MotionEvent*>(motion_event)->getYOffset();
116 }
117
AMotionEvent_getXPrecision(const AInputEvent * motion_event)118 float AMotionEvent_getXPrecision(const AInputEvent* motion_event) {
119 return static_cast<const MotionEvent*>(motion_event)->getXPrecision();
120 }
121
AMotionEvent_getYPrecision(const AInputEvent * motion_event)122 float AMotionEvent_getYPrecision(const AInputEvent* motion_event) {
123 return static_cast<const MotionEvent*>(motion_event)->getYPrecision();
124 }
125
AMotionEvent_getPointerCount(const AInputEvent * motion_event)126 size_t AMotionEvent_getPointerCount(const AInputEvent* motion_event) {
127 return static_cast<const MotionEvent*>(motion_event)->getPointerCount();
128 }
129
AMotionEvent_getPointerId(const AInputEvent * motion_event,size_t pointer_index)130 int32_t AMotionEvent_getPointerId(const AInputEvent* motion_event, size_t pointer_index) {
131 return static_cast<const MotionEvent*>(motion_event)->getPointerId(pointer_index);
132 }
133
AMotionEvent_getToolType(const AInputEvent * motion_event,size_t pointer_index)134 int32_t AMotionEvent_getToolType(const AInputEvent* motion_event, size_t pointer_index) {
135 return static_cast<const MotionEvent*>(motion_event)->getToolType(pointer_index);
136 }
137
AMotionEvent_getRawX(const AInputEvent * motion_event,size_t pointer_index)138 float AMotionEvent_getRawX(const AInputEvent* motion_event, size_t pointer_index) {
139 return static_cast<const MotionEvent*>(motion_event)->getRawX(pointer_index);
140 }
141
AMotionEvent_getRawY(const AInputEvent * motion_event,size_t pointer_index)142 float AMotionEvent_getRawY(const AInputEvent* motion_event, size_t pointer_index) {
143 return static_cast<const MotionEvent*>(motion_event)->getRawY(pointer_index);
144 }
145
AMotionEvent_getX(const AInputEvent * motion_event,size_t pointer_index)146 float AMotionEvent_getX(const AInputEvent* motion_event, size_t pointer_index) {
147 return static_cast<const MotionEvent*>(motion_event)->getX(pointer_index);
148 }
149
AMotionEvent_getY(const AInputEvent * motion_event,size_t pointer_index)150 float AMotionEvent_getY(const AInputEvent* motion_event, size_t pointer_index) {
151 return static_cast<const MotionEvent*>(motion_event)->getY(pointer_index);
152 }
153
AMotionEvent_getPressure(const AInputEvent * motion_event,size_t pointer_index)154 float AMotionEvent_getPressure(const AInputEvent* motion_event, size_t pointer_index) {
155 return static_cast<const MotionEvent*>(motion_event)->getPressure(pointer_index);
156 }
157
AMotionEvent_getSize(const AInputEvent * motion_event,size_t pointer_index)158 float AMotionEvent_getSize(const AInputEvent* motion_event, size_t pointer_index) {
159 return static_cast<const MotionEvent*>(motion_event)->getSize(pointer_index);
160 }
161
AMotionEvent_getTouchMajor(const AInputEvent * motion_event,size_t pointer_index)162 float AMotionEvent_getTouchMajor(const AInputEvent* motion_event, size_t pointer_index) {
163 return static_cast<const MotionEvent*>(motion_event)->getTouchMajor(pointer_index);
164 }
165
AMotionEvent_getTouchMinor(const AInputEvent * motion_event,size_t pointer_index)166 float AMotionEvent_getTouchMinor(const AInputEvent* motion_event, size_t pointer_index) {
167 return static_cast<const MotionEvent*>(motion_event)->getTouchMinor(pointer_index);
168 }
169
AMotionEvent_getToolMajor(const AInputEvent * motion_event,size_t pointer_index)170 float AMotionEvent_getToolMajor(const AInputEvent* motion_event, size_t pointer_index) {
171 return static_cast<const MotionEvent*>(motion_event)->getToolMajor(pointer_index);
172 }
173
AMotionEvent_getToolMinor(const AInputEvent * motion_event,size_t pointer_index)174 float AMotionEvent_getToolMinor(const AInputEvent* motion_event, size_t pointer_index) {
175 return static_cast<const MotionEvent*>(motion_event)->getToolMinor(pointer_index);
176 }
177
AMotionEvent_getOrientation(const AInputEvent * motion_event,size_t pointer_index)178 float AMotionEvent_getOrientation(const AInputEvent* motion_event, size_t pointer_index) {
179 return static_cast<const MotionEvent*>(motion_event)->getOrientation(pointer_index);
180 }
181
AMotionEvent_getAxisValue(const AInputEvent * motion_event,int32_t axis,size_t pointer_index)182 float AMotionEvent_getAxisValue(const AInputEvent* motion_event,
183 int32_t axis, size_t pointer_index) {
184 return static_cast<const MotionEvent*>(motion_event)->getAxisValue(axis, pointer_index);
185 }
186
AMotionEvent_getHistorySize(const AInputEvent * motion_event)187 size_t AMotionEvent_getHistorySize(const AInputEvent* motion_event) {
188 return static_cast<const MotionEvent*>(motion_event)->getHistorySize();
189 }
190
AMotionEvent_getHistoricalEventTime(AInputEvent * motion_event,size_t history_index)191 int64_t AMotionEvent_getHistoricalEventTime(AInputEvent* motion_event,
192 size_t history_index) {
193 return static_cast<const MotionEvent*>(motion_event)->getHistoricalEventTime(
194 history_index);
195 }
196
AMotionEvent_getHistoricalRawX(AInputEvent * motion_event,size_t pointer_index,size_t history_index)197 float AMotionEvent_getHistoricalRawX(AInputEvent* motion_event, size_t pointer_index,
198 size_t history_index) {
199 return static_cast<const MotionEvent*>(motion_event)->getHistoricalRawX(
200 pointer_index, history_index);
201 }
202
AMotionEvent_getHistoricalRawY(AInputEvent * motion_event,size_t pointer_index,size_t history_index)203 float AMotionEvent_getHistoricalRawY(AInputEvent* motion_event, size_t pointer_index,
204 size_t history_index) {
205 return static_cast<const MotionEvent*>(motion_event)->getHistoricalRawY(
206 pointer_index, history_index);
207 }
208
AMotionEvent_getHistoricalX(AInputEvent * motion_event,size_t pointer_index,size_t history_index)209 float AMotionEvent_getHistoricalX(AInputEvent* motion_event, size_t pointer_index,
210 size_t history_index) {
211 return static_cast<const MotionEvent*>(motion_event)->getHistoricalX(
212 pointer_index, history_index);
213 }
214
AMotionEvent_getHistoricalY(AInputEvent * motion_event,size_t pointer_index,size_t history_index)215 float AMotionEvent_getHistoricalY(AInputEvent* motion_event, size_t pointer_index,
216 size_t history_index) {
217 return static_cast<const MotionEvent*>(motion_event)->getHistoricalY(
218 pointer_index, history_index);
219 }
220
AMotionEvent_getHistoricalPressure(AInputEvent * motion_event,size_t pointer_index,size_t history_index)221 float AMotionEvent_getHistoricalPressure(AInputEvent* motion_event, size_t pointer_index,
222 size_t history_index) {
223 return static_cast<const MotionEvent*>(motion_event)->getHistoricalPressure(
224 pointer_index, history_index);
225 }
226
AMotionEvent_getHistoricalSize(AInputEvent * motion_event,size_t pointer_index,size_t history_index)227 float AMotionEvent_getHistoricalSize(AInputEvent* motion_event, size_t pointer_index,
228 size_t history_index) {
229 return static_cast<const MotionEvent*>(motion_event)->getHistoricalSize(
230 pointer_index, history_index);
231 }
232
AMotionEvent_getHistoricalTouchMajor(AInputEvent * motion_event,size_t pointer_index,size_t history_index)233 float AMotionEvent_getHistoricalTouchMajor(AInputEvent* motion_event, size_t pointer_index,
234 size_t history_index) {
235 return static_cast<const MotionEvent*>(motion_event)->getHistoricalTouchMajor(
236 pointer_index, history_index);
237 }
238
AMotionEvent_getHistoricalTouchMinor(AInputEvent * motion_event,size_t pointer_index,size_t history_index)239 float AMotionEvent_getHistoricalTouchMinor(AInputEvent* motion_event, size_t pointer_index,
240 size_t history_index) {
241 return static_cast<const MotionEvent*>(motion_event)->getHistoricalTouchMinor(
242 pointer_index, history_index);
243 }
244
AMotionEvent_getHistoricalToolMajor(AInputEvent * motion_event,size_t pointer_index,size_t history_index)245 float AMotionEvent_getHistoricalToolMajor(AInputEvent* motion_event, size_t pointer_index,
246 size_t history_index) {
247 return static_cast<const MotionEvent*>(motion_event)->getHistoricalToolMajor(
248 pointer_index, history_index);
249 }
250
AMotionEvent_getHistoricalToolMinor(AInputEvent * motion_event,size_t pointer_index,size_t history_index)251 float AMotionEvent_getHistoricalToolMinor(AInputEvent* motion_event, size_t pointer_index,
252 size_t history_index) {
253 return static_cast<const MotionEvent*>(motion_event)->getHistoricalToolMinor(
254 pointer_index, history_index);
255 }
256
AMotionEvent_getHistoricalOrientation(AInputEvent * motion_event,size_t pointer_index,size_t history_index)257 float AMotionEvent_getHistoricalOrientation(AInputEvent* motion_event, size_t pointer_index,
258 size_t history_index) {
259 return static_cast<const MotionEvent*>(motion_event)->getHistoricalOrientation(
260 pointer_index, history_index);
261 }
262
AMotionEvent_getHistoricalAxisValue(const AInputEvent * motion_event,int32_t axis,size_t pointer_index,size_t history_index)263 float AMotionEvent_getHistoricalAxisValue(const AInputEvent* motion_event,
264 int32_t axis, size_t pointer_index, size_t history_index) {
265 return static_cast<const MotionEvent*>(motion_event)->getHistoricalAxisValue(
266 axis, pointer_index, history_index);
267 }
268
269
AInputQueue_attachLooper(AInputQueue * queue,ALooper * looper,int ident,ALooper_callbackFunc callback,void * data)270 void AInputQueue_attachLooper(AInputQueue* queue, ALooper* looper,
271 int ident, ALooper_callbackFunc callback, void* data) {
272 queue->attachLooper(looper, ident, callback, data);
273 }
274
AInputQueue_detachLooper(AInputQueue * queue)275 void AInputQueue_detachLooper(AInputQueue* queue) {
276 queue->detachLooper();
277 }
278
AInputQueue_hasEvents(AInputQueue * queue)279 int32_t AInputQueue_hasEvents(AInputQueue* queue) {
280 return queue->hasEvents();
281 }
282
AInputQueue_getEvent(AInputQueue * queue,AInputEvent ** outEvent)283 int32_t AInputQueue_getEvent(AInputQueue* queue, AInputEvent** outEvent) {
284 return queue->getEvent(outEvent);
285 }
286
AInputQueue_preDispatchEvent(AInputQueue * queue,AInputEvent * event)287 int32_t AInputQueue_preDispatchEvent(AInputQueue* queue, AInputEvent* event) {
288 return queue->preDispatchEvent(event) ? 1 : 0;
289 }
290
AInputQueue_finishEvent(AInputQueue * queue,AInputEvent * event,int handled)291 void AInputQueue_finishEvent(AInputQueue* queue, AInputEvent* event, int handled) {
292 queue->finishEvent(event, handled != 0, false);
293 }
294