xref: /aosp_15_r20/frameworks/base/native/android/input.cpp (revision d57664e9bc4670b3ecf6748a746a57c557b6bc9e)
1*d57664e9SAndroid Build Coastguard Worker /*
2*d57664e9SAndroid Build Coastguard Worker  * Copyright (C) 2009 The Android Open Source Project
3*d57664e9SAndroid Build Coastguard Worker  *
4*d57664e9SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*d57664e9SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*d57664e9SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*d57664e9SAndroid Build Coastguard Worker  *
8*d57664e9SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*d57664e9SAndroid Build Coastguard Worker  *
10*d57664e9SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*d57664e9SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*d57664e9SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*d57664e9SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*d57664e9SAndroid Build Coastguard Worker  * limitations under the License.
15*d57664e9SAndroid Build Coastguard Worker  */
16*d57664e9SAndroid Build Coastguard Worker 
17*d57664e9SAndroid Build Coastguard Worker #define LOG_TAG "input"
18*d57664e9SAndroid Build Coastguard Worker #include <utils/Log.h>
19*d57664e9SAndroid Build Coastguard Worker 
20*d57664e9SAndroid Build Coastguard Worker #include <android/input.h>
21*d57664e9SAndroid Build Coastguard Worker #include <input/Input.h>
22*d57664e9SAndroid Build Coastguard Worker #include <input/InputTransport.h>
23*d57664e9SAndroid Build Coastguard Worker #include <utils/Looper.h>
24*d57664e9SAndroid Build Coastguard Worker #include <utils/RefBase.h>
25*d57664e9SAndroid Build Coastguard Worker #include <utils/Vector.h>
26*d57664e9SAndroid Build Coastguard Worker 
27*d57664e9SAndroid Build Coastguard Worker #include <android_runtime/android_app_NativeActivity.h>
28*d57664e9SAndroid Build Coastguard Worker #include <android_runtime/android_view_InputQueue.h>
29*d57664e9SAndroid Build Coastguard Worker #include <android_view_MotionEvent.h>
30*d57664e9SAndroid Build Coastguard Worker #include <android_view_KeyEvent.h>
31*d57664e9SAndroid Build Coastguard Worker 
32*d57664e9SAndroid Build Coastguard Worker #include <poll.h>
33*d57664e9SAndroid Build Coastguard Worker #include <errno.h>
34*d57664e9SAndroid Build Coastguard Worker 
35*d57664e9SAndroid Build Coastguard Worker using android::InputEvent;
36*d57664e9SAndroid Build Coastguard Worker using android::InputEventType;
37*d57664e9SAndroid Build Coastguard Worker using android::InputQueue;
38*d57664e9SAndroid Build Coastguard Worker using android::KeyEvent;
39*d57664e9SAndroid Build Coastguard Worker using android::Looper;
40*d57664e9SAndroid Build Coastguard Worker using android::MotionEvent;
41*d57664e9SAndroid Build Coastguard Worker using android::sp;
42*d57664e9SAndroid Build Coastguard Worker using android::Vector;
43*d57664e9SAndroid Build Coastguard Worker 
AInputEvent_getType(const AInputEvent * event)44*d57664e9SAndroid Build Coastguard Worker int32_t AInputEvent_getType(const AInputEvent* event) {
45*d57664e9SAndroid Build Coastguard Worker     const InputEventType eventType = static_cast<const InputEvent*>(event)->getType();
46*d57664e9SAndroid Build Coastguard Worker     return static_cast<int32_t>(eventType);
47*d57664e9SAndroid Build Coastguard Worker }
48*d57664e9SAndroid Build Coastguard Worker 
AInputEvent_getDeviceId(const AInputEvent * event)49*d57664e9SAndroid Build Coastguard Worker int32_t AInputEvent_getDeviceId(const AInputEvent* event) {
50*d57664e9SAndroid Build Coastguard Worker     return static_cast<const InputEvent*>(event)->getDeviceId();
51*d57664e9SAndroid Build Coastguard Worker }
52*d57664e9SAndroid Build Coastguard Worker 
AInputEvent_getSource(const AInputEvent * event)53*d57664e9SAndroid Build Coastguard Worker int32_t AInputEvent_getSource(const AInputEvent* event) {
54*d57664e9SAndroid Build Coastguard Worker     return static_cast<const InputEvent*>(event)->getSource();
55*d57664e9SAndroid Build Coastguard Worker }
56*d57664e9SAndroid Build Coastguard Worker 
AInputEvent_release(const AInputEvent * event)57*d57664e9SAndroid Build Coastguard Worker void AInputEvent_release(const AInputEvent* event) {
58*d57664e9SAndroid Build Coastguard Worker     delete event;
59*d57664e9SAndroid Build Coastguard Worker }
60*d57664e9SAndroid Build Coastguard Worker 
AKeyEvent_getAction(const AInputEvent * key_event)61*d57664e9SAndroid Build Coastguard Worker int32_t AKeyEvent_getAction(const AInputEvent* key_event) {
62*d57664e9SAndroid Build Coastguard Worker     return static_cast<const KeyEvent*>(key_event)->getAction();
63*d57664e9SAndroid Build Coastguard Worker }
64*d57664e9SAndroid Build Coastguard Worker 
AKeyEvent_getFlags(const AInputEvent * key_event)65*d57664e9SAndroid Build Coastguard Worker int32_t AKeyEvent_getFlags(const AInputEvent* key_event) {
66*d57664e9SAndroid Build Coastguard Worker     return static_cast<const KeyEvent*>(key_event)->getFlags();
67*d57664e9SAndroid Build Coastguard Worker }
68*d57664e9SAndroid Build Coastguard Worker 
AKeyEvent_getKeyCode(const AInputEvent * key_event)69*d57664e9SAndroid Build Coastguard Worker int32_t AKeyEvent_getKeyCode(const AInputEvent* key_event) {
70*d57664e9SAndroid Build Coastguard Worker     return static_cast<const KeyEvent*>(key_event)->getKeyCode();
71*d57664e9SAndroid Build Coastguard Worker }
72*d57664e9SAndroid Build Coastguard Worker 
AKeyEvent_getScanCode(const AInputEvent * key_event)73*d57664e9SAndroid Build Coastguard Worker int32_t AKeyEvent_getScanCode(const AInputEvent* key_event) {
74*d57664e9SAndroid Build Coastguard Worker     return static_cast<const KeyEvent*>(key_event)->getScanCode();
75*d57664e9SAndroid Build Coastguard Worker }
76*d57664e9SAndroid Build Coastguard Worker 
AKeyEvent_getMetaState(const AInputEvent * key_event)77*d57664e9SAndroid Build Coastguard Worker int32_t AKeyEvent_getMetaState(const AInputEvent* key_event) {
78*d57664e9SAndroid Build Coastguard Worker     return static_cast<const KeyEvent*>(key_event)->getMetaState();
79*d57664e9SAndroid Build Coastguard Worker }
AKeyEvent_getRepeatCount(const AInputEvent * key_event)80*d57664e9SAndroid Build Coastguard Worker int32_t AKeyEvent_getRepeatCount(const AInputEvent* key_event) {
81*d57664e9SAndroid Build Coastguard Worker     return static_cast<const KeyEvent*>(key_event)->getRepeatCount();
82*d57664e9SAndroid Build Coastguard Worker }
83*d57664e9SAndroid Build Coastguard Worker 
AKeyEvent_getDownTime(const AInputEvent * key_event)84*d57664e9SAndroid Build Coastguard Worker int64_t AKeyEvent_getDownTime(const AInputEvent* key_event) {
85*d57664e9SAndroid Build Coastguard Worker     return static_cast<const KeyEvent*>(key_event)->getDownTime();
86*d57664e9SAndroid Build Coastguard Worker }
87*d57664e9SAndroid Build Coastguard Worker 
AKeyEvent_fromJava(JNIEnv * env,jobject keyEvent)88*d57664e9SAndroid Build Coastguard Worker const AInputEvent* AKeyEvent_fromJava(JNIEnv* env, jobject keyEvent) {
89*d57664e9SAndroid Build Coastguard Worker     std::unique_ptr<KeyEvent> event = std::make_unique<KeyEvent>();
90*d57664e9SAndroid Build Coastguard Worker     *event = android::android_view_KeyEvent_obtainAsCopy(env, keyEvent);
91*d57664e9SAndroid Build Coastguard Worker     return event.release();
92*d57664e9SAndroid Build Coastguard Worker }
93*d57664e9SAndroid Build Coastguard Worker 
AKeyEvent_getEventTime(const AInputEvent * key_event)94*d57664e9SAndroid Build Coastguard Worker int64_t AKeyEvent_getEventTime(const AInputEvent* key_event) {
95*d57664e9SAndroid Build Coastguard Worker     return static_cast<const KeyEvent*>(key_event)->getEventTime();
96*d57664e9SAndroid Build Coastguard Worker }
97*d57664e9SAndroid Build Coastguard Worker 
AMotionEvent_getAction(const AInputEvent * motion_event)98*d57664e9SAndroid Build Coastguard Worker int32_t AMotionEvent_getAction(const AInputEvent* motion_event) {
99*d57664e9SAndroid Build Coastguard Worker     return static_cast<const MotionEvent*>(motion_event)->getAction();
100*d57664e9SAndroid Build Coastguard Worker }
101*d57664e9SAndroid Build Coastguard Worker 
AMotionEvent_getFlags(const AInputEvent * motion_event)102*d57664e9SAndroid Build Coastguard Worker int32_t AMotionEvent_getFlags(const AInputEvent* motion_event) {
103*d57664e9SAndroid Build Coastguard Worker     return static_cast<const MotionEvent*>(motion_event)->getFlags() &
104*d57664e9SAndroid Build Coastguard Worker             ~AMOTION_EVENT_PRIVATE_FLAG_MASK;
105*d57664e9SAndroid Build Coastguard Worker }
106*d57664e9SAndroid Build Coastguard Worker 
AMotionEvent_getMetaState(const AInputEvent * motion_event)107*d57664e9SAndroid Build Coastguard Worker int32_t AMotionEvent_getMetaState(const AInputEvent* motion_event) {
108*d57664e9SAndroid Build Coastguard Worker     return static_cast<const MotionEvent*>(motion_event)->getMetaState();
109*d57664e9SAndroid Build Coastguard Worker }
110*d57664e9SAndroid Build Coastguard Worker 
AMotionEvent_getButtonState(const AInputEvent * motion_event)111*d57664e9SAndroid Build Coastguard Worker int32_t AMotionEvent_getButtonState(const AInputEvent* motion_event) {
112*d57664e9SAndroid Build Coastguard Worker     return static_cast<const MotionEvent*>(motion_event)->getButtonState();
113*d57664e9SAndroid Build Coastguard Worker }
114*d57664e9SAndroid Build Coastguard Worker 
AMotionEvent_getEdgeFlags(const AInputEvent * motion_event)115*d57664e9SAndroid Build Coastguard Worker int32_t AMotionEvent_getEdgeFlags(const AInputEvent* motion_event) {
116*d57664e9SAndroid Build Coastguard Worker     return reinterpret_cast<const MotionEvent*>(motion_event)->getEdgeFlags();
117*d57664e9SAndroid Build Coastguard Worker }
118*d57664e9SAndroid Build Coastguard Worker 
AMotionEvent_getDownTime(const AInputEvent * motion_event)119*d57664e9SAndroid Build Coastguard Worker int64_t AMotionEvent_getDownTime(const AInputEvent* motion_event) {
120*d57664e9SAndroid Build Coastguard Worker     return static_cast<const MotionEvent*>(motion_event)->getDownTime();
121*d57664e9SAndroid Build Coastguard Worker }
122*d57664e9SAndroid Build Coastguard Worker 
AMotionEvent_getEventTime(const AInputEvent * motion_event)123*d57664e9SAndroid Build Coastguard Worker int64_t AMotionEvent_getEventTime(const AInputEvent* motion_event) {
124*d57664e9SAndroid Build Coastguard Worker     return static_cast<const MotionEvent*>(motion_event)->getEventTime();
125*d57664e9SAndroid Build Coastguard Worker }
126*d57664e9SAndroid Build Coastguard Worker 
AMotionEvent_getXOffset(const AInputEvent * motion_event)127*d57664e9SAndroid Build Coastguard Worker float AMotionEvent_getXOffset(const AInputEvent* motion_event) {
128*d57664e9SAndroid Build Coastguard Worker     return static_cast<const MotionEvent*>(motion_event)->getRawXOffset();
129*d57664e9SAndroid Build Coastguard Worker }
130*d57664e9SAndroid Build Coastguard Worker 
AMotionEvent_getYOffset(const AInputEvent * motion_event)131*d57664e9SAndroid Build Coastguard Worker float AMotionEvent_getYOffset(const AInputEvent* motion_event) {
132*d57664e9SAndroid Build Coastguard Worker     return static_cast<const MotionEvent*>(motion_event)->getRawYOffset();
133*d57664e9SAndroid Build Coastguard Worker }
134*d57664e9SAndroid Build Coastguard Worker 
AMotionEvent_getXPrecision(const AInputEvent * motion_event)135*d57664e9SAndroid Build Coastguard Worker float AMotionEvent_getXPrecision(const AInputEvent* motion_event) {
136*d57664e9SAndroid Build Coastguard Worker     return static_cast<const MotionEvent*>(motion_event)->getXPrecision();
137*d57664e9SAndroid Build Coastguard Worker }
138*d57664e9SAndroid Build Coastguard Worker 
AMotionEvent_getYPrecision(const AInputEvent * motion_event)139*d57664e9SAndroid Build Coastguard Worker float AMotionEvent_getYPrecision(const AInputEvent* motion_event) {
140*d57664e9SAndroid Build Coastguard Worker     return static_cast<const MotionEvent*>(motion_event)->getYPrecision();
141*d57664e9SAndroid Build Coastguard Worker }
142*d57664e9SAndroid Build Coastguard Worker 
AMotionEvent_getPointerCount(const AInputEvent * motion_event)143*d57664e9SAndroid Build Coastguard Worker size_t AMotionEvent_getPointerCount(const AInputEvent* motion_event) {
144*d57664e9SAndroid Build Coastguard Worker     return static_cast<const MotionEvent*>(motion_event)->getPointerCount();
145*d57664e9SAndroid Build Coastguard Worker }
146*d57664e9SAndroid Build Coastguard Worker 
AMotionEvent_getPointerId(const AInputEvent * motion_event,size_t pointer_index)147*d57664e9SAndroid Build Coastguard Worker int32_t AMotionEvent_getPointerId(const AInputEvent* motion_event, size_t pointer_index) {
148*d57664e9SAndroid Build Coastguard Worker     return static_cast<const MotionEvent*>(motion_event)->getPointerId(pointer_index);
149*d57664e9SAndroid Build Coastguard Worker }
150*d57664e9SAndroid Build Coastguard Worker 
AMotionEvent_getToolType(const AInputEvent * motion_event,size_t pointer_index)151*d57664e9SAndroid Build Coastguard Worker int32_t AMotionEvent_getToolType(const AInputEvent* motion_event, size_t pointer_index) {
152*d57664e9SAndroid Build Coastguard Worker     const MotionEvent& motion = static_cast<const MotionEvent&>(*motion_event);
153*d57664e9SAndroid Build Coastguard Worker     return static_cast<int32_t>(motion.getToolType(pointer_index));
154*d57664e9SAndroid Build Coastguard Worker }
155*d57664e9SAndroid Build Coastguard Worker 
AMotionEvent_getRawX(const AInputEvent * motion_event,size_t pointer_index)156*d57664e9SAndroid Build Coastguard Worker float AMotionEvent_getRawX(const AInputEvent* motion_event, size_t pointer_index) {
157*d57664e9SAndroid Build Coastguard Worker     return static_cast<const MotionEvent*>(motion_event)->getRawX(pointer_index);
158*d57664e9SAndroid Build Coastguard Worker }
159*d57664e9SAndroid Build Coastguard Worker 
AMotionEvent_getRawY(const AInputEvent * motion_event,size_t pointer_index)160*d57664e9SAndroid Build Coastguard Worker float AMotionEvent_getRawY(const AInputEvent* motion_event, size_t pointer_index) {
161*d57664e9SAndroid Build Coastguard Worker     return static_cast<const MotionEvent*>(motion_event)->getRawY(pointer_index);
162*d57664e9SAndroid Build Coastguard Worker }
163*d57664e9SAndroid Build Coastguard Worker 
AMotionEvent_getX(const AInputEvent * motion_event,size_t pointer_index)164*d57664e9SAndroid Build Coastguard Worker float AMotionEvent_getX(const AInputEvent* motion_event, size_t pointer_index) {
165*d57664e9SAndroid Build Coastguard Worker     return static_cast<const MotionEvent*>(motion_event)->getX(pointer_index);
166*d57664e9SAndroid Build Coastguard Worker }
167*d57664e9SAndroid Build Coastguard Worker 
AMotionEvent_getY(const AInputEvent * motion_event,size_t pointer_index)168*d57664e9SAndroid Build Coastguard Worker float AMotionEvent_getY(const AInputEvent* motion_event, size_t pointer_index) {
169*d57664e9SAndroid Build Coastguard Worker     return static_cast<const MotionEvent*>(motion_event)->getY(pointer_index);
170*d57664e9SAndroid Build Coastguard Worker }
171*d57664e9SAndroid Build Coastguard Worker 
AMotionEvent_getPressure(const AInputEvent * motion_event,size_t pointer_index)172*d57664e9SAndroid Build Coastguard Worker float AMotionEvent_getPressure(const AInputEvent* motion_event, size_t pointer_index) {
173*d57664e9SAndroid Build Coastguard Worker     return static_cast<const MotionEvent*>(motion_event)->getPressure(pointer_index);
174*d57664e9SAndroid Build Coastguard Worker }
175*d57664e9SAndroid Build Coastguard Worker 
AMotionEvent_getSize(const AInputEvent * motion_event,size_t pointer_index)176*d57664e9SAndroid Build Coastguard Worker float AMotionEvent_getSize(const AInputEvent* motion_event, size_t pointer_index) {
177*d57664e9SAndroid Build Coastguard Worker     return static_cast<const MotionEvent*>(motion_event)->getSize(pointer_index);
178*d57664e9SAndroid Build Coastguard Worker }
179*d57664e9SAndroid Build Coastguard Worker 
AMotionEvent_getTouchMajor(const AInputEvent * motion_event,size_t pointer_index)180*d57664e9SAndroid Build Coastguard Worker float AMotionEvent_getTouchMajor(const AInputEvent* motion_event, size_t pointer_index) {
181*d57664e9SAndroid Build Coastguard Worker     return static_cast<const MotionEvent*>(motion_event)->getTouchMajor(pointer_index);
182*d57664e9SAndroid Build Coastguard Worker }
183*d57664e9SAndroid Build Coastguard Worker 
AMotionEvent_getTouchMinor(const AInputEvent * motion_event,size_t pointer_index)184*d57664e9SAndroid Build Coastguard Worker float AMotionEvent_getTouchMinor(const AInputEvent* motion_event, size_t pointer_index) {
185*d57664e9SAndroid Build Coastguard Worker     return static_cast<const MotionEvent*>(motion_event)->getTouchMinor(pointer_index);
186*d57664e9SAndroid Build Coastguard Worker }
187*d57664e9SAndroid Build Coastguard Worker 
AMotionEvent_getToolMajor(const AInputEvent * motion_event,size_t pointer_index)188*d57664e9SAndroid Build Coastguard Worker float AMotionEvent_getToolMajor(const AInputEvent* motion_event, size_t pointer_index) {
189*d57664e9SAndroid Build Coastguard Worker     return static_cast<const MotionEvent*>(motion_event)->getToolMajor(pointer_index);
190*d57664e9SAndroid Build Coastguard Worker }
191*d57664e9SAndroid Build Coastguard Worker 
AMotionEvent_getToolMinor(const AInputEvent * motion_event,size_t pointer_index)192*d57664e9SAndroid Build Coastguard Worker float AMotionEvent_getToolMinor(const AInputEvent* motion_event, size_t pointer_index) {
193*d57664e9SAndroid Build Coastguard Worker     return static_cast<const MotionEvent*>(motion_event)->getToolMinor(pointer_index);
194*d57664e9SAndroid Build Coastguard Worker }
195*d57664e9SAndroid Build Coastguard Worker 
AMotionEvent_getOrientation(const AInputEvent * motion_event,size_t pointer_index)196*d57664e9SAndroid Build Coastguard Worker float AMotionEvent_getOrientation(const AInputEvent* motion_event, size_t pointer_index) {
197*d57664e9SAndroid Build Coastguard Worker     return static_cast<const MotionEvent*>(motion_event)->getOrientation(pointer_index);
198*d57664e9SAndroid Build Coastguard Worker }
199*d57664e9SAndroid Build Coastguard Worker 
AMotionEvent_getAxisValue(const AInputEvent * motion_event,int32_t axis,size_t pointer_index)200*d57664e9SAndroid Build Coastguard Worker float AMotionEvent_getAxisValue(const AInputEvent* motion_event,
201*d57664e9SAndroid Build Coastguard Worker         int32_t axis, size_t pointer_index) {
202*d57664e9SAndroid Build Coastguard Worker     return static_cast<const MotionEvent*>(motion_event)->getAxisValue(axis, pointer_index);
203*d57664e9SAndroid Build Coastguard Worker }
204*d57664e9SAndroid Build Coastguard Worker 
AMotionEvent_getHistorySize(const AInputEvent * motion_event)205*d57664e9SAndroid Build Coastguard Worker size_t AMotionEvent_getHistorySize(const AInputEvent* motion_event) {
206*d57664e9SAndroid Build Coastguard Worker     return static_cast<const MotionEvent*>(motion_event)->getHistorySize();
207*d57664e9SAndroid Build Coastguard Worker }
208*d57664e9SAndroid Build Coastguard Worker 
AMotionEvent_getHistoricalEventTime(const AInputEvent * motion_event,size_t history_index)209*d57664e9SAndroid Build Coastguard Worker int64_t AMotionEvent_getHistoricalEventTime(const AInputEvent* motion_event,
210*d57664e9SAndroid Build Coastguard Worker         size_t history_index) {
211*d57664e9SAndroid Build Coastguard Worker     return static_cast<const MotionEvent*>(motion_event)->getHistoricalEventTime(
212*d57664e9SAndroid Build Coastguard Worker             history_index);
213*d57664e9SAndroid Build Coastguard Worker }
214*d57664e9SAndroid Build Coastguard Worker 
AMotionEvent_getHistoricalRawX(const AInputEvent * motion_event,size_t pointer_index,size_t history_index)215*d57664e9SAndroid Build Coastguard Worker float AMotionEvent_getHistoricalRawX(const AInputEvent* motion_event, size_t pointer_index,
216*d57664e9SAndroid Build Coastguard Worker         size_t history_index) {
217*d57664e9SAndroid Build Coastguard Worker     return static_cast<const MotionEvent*>(motion_event)->getHistoricalRawX(
218*d57664e9SAndroid Build Coastguard Worker             pointer_index, history_index);
219*d57664e9SAndroid Build Coastguard Worker }
220*d57664e9SAndroid Build Coastguard Worker 
AMotionEvent_getHistoricalRawY(const AInputEvent * motion_event,size_t pointer_index,size_t history_index)221*d57664e9SAndroid Build Coastguard Worker float AMotionEvent_getHistoricalRawY(const AInputEvent* motion_event, size_t pointer_index,
222*d57664e9SAndroid Build Coastguard Worker         size_t history_index) {
223*d57664e9SAndroid Build Coastguard Worker     return static_cast<const MotionEvent*>(motion_event)->getHistoricalRawY(
224*d57664e9SAndroid Build Coastguard Worker             pointer_index, history_index);
225*d57664e9SAndroid Build Coastguard Worker }
226*d57664e9SAndroid Build Coastguard Worker 
AMotionEvent_getHistoricalX(const AInputEvent * motion_event,size_t pointer_index,size_t history_index)227*d57664e9SAndroid Build Coastguard Worker float AMotionEvent_getHistoricalX(const AInputEvent* motion_event, size_t pointer_index,
228*d57664e9SAndroid Build Coastguard Worker         size_t history_index) {
229*d57664e9SAndroid Build Coastguard Worker     return static_cast<const MotionEvent*>(motion_event)->getHistoricalX(
230*d57664e9SAndroid Build Coastguard Worker             pointer_index, history_index);
231*d57664e9SAndroid Build Coastguard Worker }
232*d57664e9SAndroid Build Coastguard Worker 
AMotionEvent_getHistoricalY(const AInputEvent * motion_event,size_t pointer_index,size_t history_index)233*d57664e9SAndroid Build Coastguard Worker float AMotionEvent_getHistoricalY(const AInputEvent* motion_event, size_t pointer_index,
234*d57664e9SAndroid Build Coastguard Worker         size_t history_index) {
235*d57664e9SAndroid Build Coastguard Worker     return static_cast<const MotionEvent*>(motion_event)->getHistoricalY(
236*d57664e9SAndroid Build Coastguard Worker             pointer_index, history_index);
237*d57664e9SAndroid Build Coastguard Worker }
238*d57664e9SAndroid Build Coastguard Worker 
AMotionEvent_getHistoricalPressure(const AInputEvent * motion_event,size_t pointer_index,size_t history_index)239*d57664e9SAndroid Build Coastguard Worker float AMotionEvent_getHistoricalPressure(const AInputEvent* motion_event, size_t pointer_index,
240*d57664e9SAndroid Build Coastguard Worker         size_t history_index) {
241*d57664e9SAndroid Build Coastguard Worker     return static_cast<const MotionEvent*>(motion_event)->getHistoricalPressure(
242*d57664e9SAndroid Build Coastguard Worker             pointer_index, history_index);
243*d57664e9SAndroid Build Coastguard Worker }
244*d57664e9SAndroid Build Coastguard Worker 
AMotionEvent_getHistoricalSize(const AInputEvent * motion_event,size_t pointer_index,size_t history_index)245*d57664e9SAndroid Build Coastguard Worker float AMotionEvent_getHistoricalSize(const AInputEvent* motion_event, size_t pointer_index,
246*d57664e9SAndroid Build Coastguard Worker         size_t history_index) {
247*d57664e9SAndroid Build Coastguard Worker     return static_cast<const MotionEvent*>(motion_event)->getHistoricalSize(
248*d57664e9SAndroid Build Coastguard Worker             pointer_index, history_index);
249*d57664e9SAndroid Build Coastguard Worker }
250*d57664e9SAndroid Build Coastguard Worker 
AMotionEvent_getHistoricalTouchMajor(const AInputEvent * motion_event,size_t pointer_index,size_t history_index)251*d57664e9SAndroid Build Coastguard Worker float AMotionEvent_getHistoricalTouchMajor(const AInputEvent* motion_event, size_t pointer_index,
252*d57664e9SAndroid Build Coastguard Worker         size_t history_index) {
253*d57664e9SAndroid Build Coastguard Worker     return static_cast<const MotionEvent*>(motion_event)->getHistoricalTouchMajor(
254*d57664e9SAndroid Build Coastguard Worker             pointer_index, history_index);
255*d57664e9SAndroid Build Coastguard Worker }
256*d57664e9SAndroid Build Coastguard Worker 
AMotionEvent_getHistoricalTouchMinor(const AInputEvent * motion_event,size_t pointer_index,size_t history_index)257*d57664e9SAndroid Build Coastguard Worker float AMotionEvent_getHistoricalTouchMinor(const AInputEvent* motion_event, size_t pointer_index,
258*d57664e9SAndroid Build Coastguard Worker         size_t history_index) {
259*d57664e9SAndroid Build Coastguard Worker     return static_cast<const MotionEvent*>(motion_event)->getHistoricalTouchMinor(
260*d57664e9SAndroid Build Coastguard Worker             pointer_index, history_index);
261*d57664e9SAndroid Build Coastguard Worker }
262*d57664e9SAndroid Build Coastguard Worker 
AMotionEvent_getHistoricalToolMajor(const AInputEvent * motion_event,size_t pointer_index,size_t history_index)263*d57664e9SAndroid Build Coastguard Worker float AMotionEvent_getHistoricalToolMajor(const AInputEvent* motion_event, size_t pointer_index,
264*d57664e9SAndroid Build Coastguard Worker         size_t history_index) {
265*d57664e9SAndroid Build Coastguard Worker     return static_cast<const MotionEvent*>(motion_event)->getHistoricalToolMajor(
266*d57664e9SAndroid Build Coastguard Worker             pointer_index, history_index);
267*d57664e9SAndroid Build Coastguard Worker }
268*d57664e9SAndroid Build Coastguard Worker 
AMotionEvent_getHistoricalToolMinor(const AInputEvent * motion_event,size_t pointer_index,size_t history_index)269*d57664e9SAndroid Build Coastguard Worker float AMotionEvent_getHistoricalToolMinor(const AInputEvent* motion_event, size_t pointer_index,
270*d57664e9SAndroid Build Coastguard Worker         size_t history_index) {
271*d57664e9SAndroid Build Coastguard Worker     return static_cast<const MotionEvent*>(motion_event)->getHistoricalToolMinor(
272*d57664e9SAndroid Build Coastguard Worker             pointer_index, history_index);
273*d57664e9SAndroid Build Coastguard Worker }
274*d57664e9SAndroid Build Coastguard Worker 
AMotionEvent_getHistoricalOrientation(const AInputEvent * motion_event,size_t pointer_index,size_t history_index)275*d57664e9SAndroid Build Coastguard Worker float AMotionEvent_getHistoricalOrientation(const AInputEvent* motion_event, size_t pointer_index,
276*d57664e9SAndroid Build Coastguard Worker         size_t history_index) {
277*d57664e9SAndroid Build Coastguard Worker     return static_cast<const MotionEvent*>(motion_event)->getHistoricalOrientation(
278*d57664e9SAndroid Build Coastguard Worker             pointer_index, history_index);
279*d57664e9SAndroid Build Coastguard Worker }
280*d57664e9SAndroid Build Coastguard Worker 
AMotionEvent_getHistoricalAxisValue(const AInputEvent * motion_event,int32_t axis,size_t pointer_index,size_t history_index)281*d57664e9SAndroid Build Coastguard Worker float AMotionEvent_getHistoricalAxisValue(const AInputEvent* motion_event,
282*d57664e9SAndroid Build Coastguard Worker         int32_t axis, size_t pointer_index, size_t history_index) {
283*d57664e9SAndroid Build Coastguard Worker     return static_cast<const MotionEvent*>(motion_event)->getHistoricalAxisValue(
284*d57664e9SAndroid Build Coastguard Worker             axis, pointer_index, history_index);
285*d57664e9SAndroid Build Coastguard Worker }
286*d57664e9SAndroid Build Coastguard Worker 
AMotionEvent_getActionButton(const AInputEvent * motion_event)287*d57664e9SAndroid Build Coastguard Worker int32_t AMotionEvent_getActionButton(const AInputEvent* motion_event) {
288*d57664e9SAndroid Build Coastguard Worker     return static_cast<const MotionEvent*>(motion_event)->getActionButton();
289*d57664e9SAndroid Build Coastguard Worker }
290*d57664e9SAndroid Build Coastguard Worker 
AMotionEvent_getClassification(const AInputEvent * motion_event)291*d57664e9SAndroid Build Coastguard Worker int32_t AMotionEvent_getClassification(const AInputEvent* motion_event) {
292*d57664e9SAndroid Build Coastguard Worker     switch (static_cast<const MotionEvent*>(motion_event)->getClassification()) {
293*d57664e9SAndroid Build Coastguard Worker         case android::MotionClassification::NONE:
294*d57664e9SAndroid Build Coastguard Worker             return AMOTION_EVENT_CLASSIFICATION_NONE;
295*d57664e9SAndroid Build Coastguard Worker         case android::MotionClassification::AMBIGUOUS_GESTURE:
296*d57664e9SAndroid Build Coastguard Worker             return AMOTION_EVENT_CLASSIFICATION_AMBIGUOUS_GESTURE;
297*d57664e9SAndroid Build Coastguard Worker         case android::MotionClassification::DEEP_PRESS:
298*d57664e9SAndroid Build Coastguard Worker             return AMOTION_EVENT_CLASSIFICATION_DEEP_PRESS;
299*d57664e9SAndroid Build Coastguard Worker         case android::MotionClassification::TWO_FINGER_SWIPE:
300*d57664e9SAndroid Build Coastguard Worker             return AMOTION_EVENT_CLASSIFICATION_TWO_FINGER_SWIPE;
301*d57664e9SAndroid Build Coastguard Worker         case android::MotionClassification::MULTI_FINGER_SWIPE:
302*d57664e9SAndroid Build Coastguard Worker             return AMOTION_EVENT_CLASSIFICATION_MULTI_FINGER_SWIPE;
303*d57664e9SAndroid Build Coastguard Worker         case android::MotionClassification::PINCH:
304*d57664e9SAndroid Build Coastguard Worker             return AMOTION_EVENT_CLASSIFICATION_PINCH;
305*d57664e9SAndroid Build Coastguard Worker     }
306*d57664e9SAndroid Build Coastguard Worker }
307*d57664e9SAndroid Build Coastguard Worker 
AMotionEvent_fromJava(JNIEnv * env,jobject motionEvent)308*d57664e9SAndroid Build Coastguard Worker const AInputEvent* AMotionEvent_fromJava(JNIEnv* env, jobject motionEvent) {
309*d57664e9SAndroid Build Coastguard Worker     MotionEvent* eventSrc = android::android_view_MotionEvent_getNativePtr(env, motionEvent);
310*d57664e9SAndroid Build Coastguard Worker     if (eventSrc == nullptr) {
311*d57664e9SAndroid Build Coastguard Worker         return nullptr;
312*d57664e9SAndroid Build Coastguard Worker     }
313*d57664e9SAndroid Build Coastguard Worker     MotionEvent* event = new MotionEvent();
314*d57664e9SAndroid Build Coastguard Worker     event->copyFrom(eventSrc, true);
315*d57664e9SAndroid Build Coastguard Worker     return event;
316*d57664e9SAndroid Build Coastguard Worker }
317*d57664e9SAndroid Build Coastguard Worker 
AInputEvent_toJava(JNIEnv * env,const AInputEvent * aInputEvent)318*d57664e9SAndroid Build Coastguard Worker jobject AInputEvent_toJava(JNIEnv* env, const AInputEvent* aInputEvent) {
319*d57664e9SAndroid Build Coastguard Worker     LOG_ALWAYS_FATAL_IF(aInputEvent == nullptr, "Expected aInputEvent to be non-null");
320*d57664e9SAndroid Build Coastguard Worker     const int32_t eventType = AInputEvent_getType(aInputEvent);
321*d57664e9SAndroid Build Coastguard Worker     switch (eventType) {
322*d57664e9SAndroid Build Coastguard Worker         case AINPUT_EVENT_TYPE_MOTION:
323*d57664e9SAndroid Build Coastguard Worker             return android::android_view_MotionEvent_obtainAsCopy(env,
324*d57664e9SAndroid Build Coastguard Worker                                                                   static_cast<const MotionEvent&>(
325*d57664e9SAndroid Build Coastguard Worker                                                                           *aInputEvent))
326*d57664e9SAndroid Build Coastguard Worker                     .release();
327*d57664e9SAndroid Build Coastguard Worker         case AINPUT_EVENT_TYPE_KEY:
328*d57664e9SAndroid Build Coastguard Worker             return android::android_view_KeyEvent_obtainAsCopy(env,
329*d57664e9SAndroid Build Coastguard Worker                                                                static_cast<const KeyEvent&>(
330*d57664e9SAndroid Build Coastguard Worker                                                                        *aInputEvent))
331*d57664e9SAndroid Build Coastguard Worker                     .release();
332*d57664e9SAndroid Build Coastguard Worker         default:
333*d57664e9SAndroid Build Coastguard Worker             LOG_ALWAYS_FATAL("Unexpected event type %d in AInputEvent_toJava.", eventType);
334*d57664e9SAndroid Build Coastguard Worker     }
335*d57664e9SAndroid Build Coastguard Worker }
336*d57664e9SAndroid Build Coastguard Worker 
AInputQueue_attachLooper(AInputQueue * queue,ALooper * looper,int ident,ALooper_callbackFunc callback,void * data)337*d57664e9SAndroid Build Coastguard Worker void AInputQueue_attachLooper(AInputQueue* queue, ALooper* looper,
338*d57664e9SAndroid Build Coastguard Worker         int ident, ALooper_callbackFunc callback, void* data) {
339*d57664e9SAndroid Build Coastguard Worker     InputQueue* iq = static_cast<InputQueue*>(queue);
340*d57664e9SAndroid Build Coastguard Worker     Looper* l = reinterpret_cast<Looper*>(looper);
341*d57664e9SAndroid Build Coastguard Worker     iq->attachLooper(l, ident, callback, data);
342*d57664e9SAndroid Build Coastguard Worker }
343*d57664e9SAndroid Build Coastguard Worker 
AInputQueue_detachLooper(AInputQueue * queue)344*d57664e9SAndroid Build Coastguard Worker void AInputQueue_detachLooper(AInputQueue* queue) {
345*d57664e9SAndroid Build Coastguard Worker     InputQueue* iq = static_cast<InputQueue*>(queue);
346*d57664e9SAndroid Build Coastguard Worker     iq->detachLooper();
347*d57664e9SAndroid Build Coastguard Worker }
348*d57664e9SAndroid Build Coastguard Worker 
AInputQueue_hasEvents(AInputQueue * queue)349*d57664e9SAndroid Build Coastguard Worker int32_t AInputQueue_hasEvents(AInputQueue* queue) {
350*d57664e9SAndroid Build Coastguard Worker     InputQueue* iq = static_cast<InputQueue*>(queue);
351*d57664e9SAndroid Build Coastguard Worker     return iq->hasEvents();
352*d57664e9SAndroid Build Coastguard Worker }
353*d57664e9SAndroid Build Coastguard Worker 
AInputQueue_getEvent(AInputQueue * queue,AInputEvent ** outEvent)354*d57664e9SAndroid Build Coastguard Worker int32_t AInputQueue_getEvent(AInputQueue* queue, AInputEvent** outEvent) {
355*d57664e9SAndroid Build Coastguard Worker     InputQueue* iq = static_cast<InputQueue*>(queue);
356*d57664e9SAndroid Build Coastguard Worker     InputEvent* event;
357*d57664e9SAndroid Build Coastguard Worker     int32_t res = iq->getEvent(&event);
358*d57664e9SAndroid Build Coastguard Worker     *outEvent = event;
359*d57664e9SAndroid Build Coastguard Worker     return res;
360*d57664e9SAndroid Build Coastguard Worker }
361*d57664e9SAndroid Build Coastguard Worker 
AInputQueue_preDispatchEvent(AInputQueue * queue,AInputEvent * event)362*d57664e9SAndroid Build Coastguard Worker int32_t AInputQueue_preDispatchEvent(AInputQueue* queue, AInputEvent* event) {
363*d57664e9SAndroid Build Coastguard Worker     InputQueue* iq = static_cast<InputQueue*>(queue);
364*d57664e9SAndroid Build Coastguard Worker     InputEvent* e = static_cast<InputEvent*>(event);
365*d57664e9SAndroid Build Coastguard Worker     return iq->preDispatchEvent(e) ? 1 : 0;
366*d57664e9SAndroid Build Coastguard Worker }
367*d57664e9SAndroid Build Coastguard Worker 
AInputQueue_finishEvent(AInputQueue * queue,AInputEvent * event,int handled)368*d57664e9SAndroid Build Coastguard Worker void AInputQueue_finishEvent(AInputQueue* queue, AInputEvent* event, int handled) {
369*d57664e9SAndroid Build Coastguard Worker     InputQueue* iq = static_cast<InputQueue*>(queue);
370*d57664e9SAndroid Build Coastguard Worker     InputEvent* e = static_cast<InputEvent*>(event);
371*d57664e9SAndroid Build Coastguard Worker     iq->finishEvent(e, handled != 0);
372*d57664e9SAndroid Build Coastguard Worker }
373*d57664e9SAndroid Build Coastguard Worker 
AInputQueue_fromJava(JNIEnv * env,jobject inputQueue)374*d57664e9SAndroid Build Coastguard Worker AInputQueue* AInputQueue_fromJava(JNIEnv* env, jobject inputQueue) {
375*d57664e9SAndroid Build Coastguard Worker     return android::android_view_InputQueue_getNativePtr(env, inputQueue);
376*d57664e9SAndroid Build Coastguard Worker }
377