android_view_MotionEvent.cpp revision 6f2fba428ca5e77a26d991ad728e346cc47609ee
146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown/*
246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * Copyright (C) 2010 The Android Open Source Project
346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown *
446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * Licensed under the Apache License, Version 2.0 (the "License");
546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * you may not use this file except in compliance with the License.
646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * You may obtain a copy of the License at
746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown *
846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown *      http://www.apache.org/licenses/LICENSE-2.0
946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown *
1046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * Unless required by applicable law or agreed to in writing, software
1146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * distributed under the License is distributed on an "AS IS" BASIS,
1246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * See the License for the specific language governing permissions and
1446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * limitations under the License.
1546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown */
1646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
1746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#define LOG_TAG "MotionEvent-JNI"
1846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
1946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#include "JNIHelp.h"
2046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
2146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#include <android_runtime/AndroidRuntime.h>
2246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#include <utils/Log.h>
2346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#include <ui/Input.h>
2446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#include "android_view_MotionEvent.h"
2591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown#include "android_util_Binder.h"
2620e987bfc35d0ae6cb6344ead65ed44ee7cf8750Jeff Brown#include "android/graphics/Matrix.h"
2720e987bfc35d0ae6cb6344ead65ed44ee7cf8750Jeff Brown
2820e987bfc35d0ae6cb6344ead65ed44ee7cf8750Jeff Brown#include "SkMatrix.h"
2920e987bfc35d0ae6cb6344ead65ed44ee7cf8750Jeff Brown
3020e987bfc35d0ae6cb6344ead65ed44ee7cf8750Jeff Brown
3146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownnamespace android {
3246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
3346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown// ----------------------------------------------------------------------------
3446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
3546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownstatic struct {
3646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    jclass clazz;
3746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
3846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    jmethodID obtain;
3946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    jmethodID recycle;
4046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
4191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    jfieldID mNativePtr;
4246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} gMotionEventClassInfo;
4346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
4491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownstatic struct {
4591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    jclass clazz;
4691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
4791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    jfieldID mPackedAxisBits;
4891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    jfieldID mPackedAxisValues;
4991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    jfieldID x;
5091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    jfieldID y;
5191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    jfieldID pressure;
5291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    jfieldID size;
5391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    jfieldID touchMajor;
5491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    jfieldID touchMinor;
5591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    jfieldID toolMajor;
5691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    jfieldID toolMinor;
5791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    jfieldID orientation;
5891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown} gPointerCoordsClassInfo;
5991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
6046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown// ----------------------------------------------------------------------------
6146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
6291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownstatic MotionEvent* android_view_MotionEvent_getNativePtr(JNIEnv* env, jobject eventObj) {
6391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    return reinterpret_cast<MotionEvent*>(
6491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            env->GetIntField(eventObj, gMotionEventClassInfo.mNativePtr));
6591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown}
6646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
6791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownstatic void android_view_MotionEvent_setNativePtr(JNIEnv* env, jobject eventObj,
6891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        MotionEvent* event) {
6991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    env->SetIntField(eventObj, gMotionEventClassInfo.mNativePtr,
7091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            reinterpret_cast<int>(event));
7191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown}
7291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
7391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownjobject android_view_MotionEvent_fromNative(JNIEnv* env, const MotionEvent* event) {
7446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    jobject eventObj = env->CallStaticObjectMethod(gMotionEventClassInfo.clazz,
7591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            gMotionEventClassInfo.obtain);
7646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    if (env->ExceptionCheck()) {
7746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        LOGE("An exception occurred while obtaining a motion event.");
7846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        LOGE_EX(env);
7946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        env->ExceptionClear();
8046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        return NULL;
8146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    }
8246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
8391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    MotionEvent* destEvent = android_view_MotionEvent_getNativePtr(env, eventObj);
8491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    if (!destEvent) {
8591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        destEvent = new MotionEvent();
8691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        android_view_MotionEvent_setNativePtr(env, eventObj, destEvent);
8791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    }
8891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
8991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    destEvent->copyFrom(event, true);
9046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    return eventObj;
9146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
9246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
931f2451007c660091b7b090c1ea332f9044515d2dJeff Brownstatus_t android_view_MotionEvent_toNative(JNIEnv* env, jobject eventObj,
9446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        MotionEvent* event) {
9591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    MotionEvent* srcEvent = android_view_MotionEvent_getNativePtr(env, eventObj);
9691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    if (!srcEvent) {
9791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        LOGE("MotionEvent was finalized");
981f2451007c660091b7b090c1ea332f9044515d2dJeff Brown        return BAD_VALUE;
991f2451007c660091b7b090c1ea332f9044515d2dJeff Brown    }
10091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
10191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    event->copyFrom(srcEvent, true);
10291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    return OK;
10391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown}
10491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
10591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownstatus_t android_view_MotionEvent_recycle(JNIEnv* env, jobject eventObj) {
10691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    env->CallVoidMethod(eventObj, gMotionEventClassInfo.recycle);
10791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    if (env->ExceptionCheck()) {
10891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        LOGW("An exception occurred while recycling a motion event.");
10991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        LOGW_EX(env);
11091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        env->ExceptionClear();
11191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        return UNKNOWN_ERROR;
11291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    }
11391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    return OK;
11491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown}
11591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
11691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown// ----------------------------------------------------------------------------
11791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
11891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownstatic const jint HISTORY_CURRENT = -0x80000000;
11991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
12091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownstatic bool validatePointerCount(JNIEnv* env, jint pointerCount) {
12191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    if (pointerCount < 1) {
12291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jniThrowException(env, "java/lang/IllegalArgumentException",
12391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown                "pointerCount must be at least 1");
12491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        return false;
12591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    }
12691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    return true;
12791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown}
12891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
12991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownstatic bool validatePointerIdsArray(JNIEnv* env, jintArray pointerIdsArray,
13091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        size_t pointerCount) {
13191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    if (!pointerIdsArray) {
13291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jniThrowException(env, "java/lang/IllegalArgumentException",
13391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown                "pointerIds array must not be null");
13491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        return false;
13591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    }
13691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    size_t length = size_t(env->GetArrayLength(pointerIdsArray));
13791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    if (length < pointerCount) {
13891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jniThrowException(env, "java/lang/IllegalArgumentException",
13991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown                "pointerIds array must be large enough to hold all pointers");
14091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        return false;
14191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    }
14291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    return true;
14391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown}
14491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
14591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownstatic bool validatePointerCoordsObjArray(JNIEnv* env, jobjectArray pointerCoordsObjArray,
14691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        size_t pointerCount) {
14791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    if (!pointerCoordsObjArray) {
14891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jniThrowException(env, "java/lang/IllegalArgumentException",
14991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown                "pointerCoords array must not be null");
15091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        return false;
15191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    }
15291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    size_t length = size_t(env->GetArrayLength(pointerCoordsObjArray));
15391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    if (length < pointerCount) {
15491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jniThrowException(env, "java/lang/IllegalArgumentException",
15591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown                "pointerCoords array must be large enough to hold all pointers");
15691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        return false;
15791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    }
15891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    return true;
15991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown}
16091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
16191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownstatic bool validatePointerIndex(JNIEnv* env, jint pointerIndex, size_t pointerCount) {
16291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    if (pointerIndex < 0 || size_t(pointerIndex) >= pointerCount) {
16391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jniThrowException(env, "java/lang/IllegalArgumentException",
16491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown                "pointerIndex out of range");
16591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        return false;
16691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    }
16791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    return true;
16891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown}
16991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
17091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownstatic bool validateHistoryPos(JNIEnv* env, jint historyPos, size_t historySize) {
17191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    if (historyPos < 0 || size_t(historyPos) >= historySize) {
17291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jniThrowException(env, "java/lang/IllegalArgumentException",
17391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown                "historyPos out of range");
17491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        return false;
17591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    }
17691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    return true;
17791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown}
17891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
17991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownstatic bool validatePointerCoords(JNIEnv* env, jobject pointerCoordsObj) {
18091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    if (!pointerCoordsObj) {
18191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jniThrowException(env, "java/lang/IllegalArgumentException",
18291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown                "pointerCoords must not be null");
18391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        return false;
18491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    }
18591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    return true;
18691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown}
18791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
18891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownstatic void pointerCoordsToNative(JNIEnv* env, jobject pointerCoordsObj,
18991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        float xOffset, float yOffset, PointerCoords* outRawPointerCoords) {
19091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    outRawPointerCoords->clear();
191ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown    outRawPointerCoords->setAxisValue(AMOTION_EVENT_AXIS_X,
19291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            env->GetFloatField(pointerCoordsObj, gPointerCoordsClassInfo.x) - xOffset);
193ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown    outRawPointerCoords->setAxisValue(AMOTION_EVENT_AXIS_Y,
19491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            env->GetFloatField(pointerCoordsObj, gPointerCoordsClassInfo.y) - yOffset);
195ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown    outRawPointerCoords->setAxisValue(AMOTION_EVENT_AXIS_PRESSURE,
19691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            env->GetFloatField(pointerCoordsObj, gPointerCoordsClassInfo.pressure));
197ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown    outRawPointerCoords->setAxisValue(AMOTION_EVENT_AXIS_SIZE,
19891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            env->GetFloatField(pointerCoordsObj, gPointerCoordsClassInfo.size));
199ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown    outRawPointerCoords->setAxisValue(AMOTION_EVENT_AXIS_TOUCH_MAJOR,
20091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            env->GetFloatField(pointerCoordsObj, gPointerCoordsClassInfo.touchMajor));
201ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown    outRawPointerCoords->setAxisValue(AMOTION_EVENT_AXIS_TOUCH_MINOR,
20291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            env->GetFloatField(pointerCoordsObj, gPointerCoordsClassInfo.touchMinor));
203ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown    outRawPointerCoords->setAxisValue(AMOTION_EVENT_AXIS_TOOL_MAJOR,
20491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            env->GetFloatField(pointerCoordsObj, gPointerCoordsClassInfo.toolMajor));
205ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown    outRawPointerCoords->setAxisValue(AMOTION_EVENT_AXIS_TOOL_MINOR,
20691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            env->GetFloatField(pointerCoordsObj, gPointerCoordsClassInfo.toolMinor));
207ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown    outRawPointerCoords->setAxisValue(AMOTION_EVENT_AXIS_ORIENTATION,
20891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            env->GetFloatField(pointerCoordsObj, gPointerCoordsClassInfo.orientation));
20991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
2106f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown    uint64_t bits = env->GetLongField(pointerCoordsObj, gPointerCoordsClassInfo.mPackedAxisBits);
21191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    if (bits) {
21291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jfloatArray valuesArray = jfloatArray(env->GetObjectField(pointerCoordsObj,
21391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown                gPointerCoordsClassInfo.mPackedAxisValues));
21491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        if (valuesArray) {
21591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            jfloat* values = static_cast<jfloat*>(
21691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown                    env->GetPrimitiveArrayCritical(valuesArray, NULL));
21791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
21891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            uint32_t index = 0;
21991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            do {
22091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown                uint32_t axis = __builtin_ctz(bits);
2216f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown                uint64_t axisBit = 1LL << axis;
22291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown                bits &= ~axisBit;
22391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown                outRawPointerCoords->setAxisValue(axis, values[index++]);
22491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            } while (bits);
22591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
22691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            env->ReleasePrimitiveArrayCritical(valuesArray, values, JNI_ABORT);
22791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            env->DeleteLocalRef(valuesArray);
22891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        }
22991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    }
23091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown}
23191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
23291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownstatic jfloatArray obtainPackedAxisValuesArray(JNIEnv* env, uint32_t minSize,
23391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jobject outPointerCoordsObj) {
23491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    jfloatArray outValuesArray = jfloatArray(env->GetObjectField(outPointerCoordsObj,
23591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            gPointerCoordsClassInfo.mPackedAxisValues));
23691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    if (outValuesArray) {
23791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        uint32_t size = env->GetArrayLength(outValuesArray);
23891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        if (minSize <= size) {
23991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            return outValuesArray;
24091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        }
24191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        env->DeleteLocalRef(outValuesArray);
24291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    }
24391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    uint32_t size = 8;
24491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    while (size < minSize) {
24591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        size *= 2;
24691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    }
24791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    outValuesArray = env->NewFloatArray(size);
24891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    env->SetObjectField(outPointerCoordsObj,
24991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            gPointerCoordsClassInfo.mPackedAxisValues, outValuesArray);
25091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    return outValuesArray;
25191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown}
25291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
25391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownstatic void pointerCoordsFromNative(JNIEnv* env, const PointerCoords* rawPointerCoords,
25491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        float xOffset, float yOffset, jobject outPointerCoordsObj) {
25591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    env->SetFloatField(outPointerCoordsObj, gPointerCoordsClassInfo.x,
256ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown            rawPointerCoords->getAxisValue(AMOTION_EVENT_AXIS_X) + xOffset);
25791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    env->SetFloatField(outPointerCoordsObj, gPointerCoordsClassInfo.y,
258ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown            rawPointerCoords->getAxisValue(AMOTION_EVENT_AXIS_Y) + yOffset);
25991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    env->SetFloatField(outPointerCoordsObj, gPointerCoordsClassInfo.pressure,
260ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown            rawPointerCoords->getAxisValue(AMOTION_EVENT_AXIS_PRESSURE));
26191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    env->SetFloatField(outPointerCoordsObj, gPointerCoordsClassInfo.size,
262ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown            rawPointerCoords->getAxisValue(AMOTION_EVENT_AXIS_SIZE));
26391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    env->SetFloatField(outPointerCoordsObj, gPointerCoordsClassInfo.touchMajor,
264ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown            rawPointerCoords->getAxisValue(AMOTION_EVENT_AXIS_TOUCH_MAJOR));
26591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    env->SetFloatField(outPointerCoordsObj, gPointerCoordsClassInfo.touchMinor,
266ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown            rawPointerCoords->getAxisValue(AMOTION_EVENT_AXIS_TOUCH_MINOR));
26791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    env->SetFloatField(outPointerCoordsObj, gPointerCoordsClassInfo.toolMajor,
268ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown            rawPointerCoords->getAxisValue(AMOTION_EVENT_AXIS_TOOL_MAJOR));
26991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    env->SetFloatField(outPointerCoordsObj, gPointerCoordsClassInfo.toolMinor,
270ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown            rawPointerCoords->getAxisValue(AMOTION_EVENT_AXIS_TOOL_MINOR));
27191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    env->SetFloatField(outPointerCoordsObj, gPointerCoordsClassInfo.orientation,
272ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown            rawPointerCoords->getAxisValue(AMOTION_EVENT_AXIS_ORIENTATION));
27391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
2746f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown    const uint64_t unpackedAxisBits = 0
2756f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            | (1LL << AMOTION_EVENT_AXIS_X)
2766f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            | (1LL << AMOTION_EVENT_AXIS_Y)
2776f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            | (1LL << AMOTION_EVENT_AXIS_PRESSURE)
2786f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            | (1LL << AMOTION_EVENT_AXIS_SIZE)
2796f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            | (1LL << AMOTION_EVENT_AXIS_TOUCH_MAJOR)
2806f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            | (1LL << AMOTION_EVENT_AXIS_TOUCH_MINOR)
2816f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            | (1LL << AMOTION_EVENT_AXIS_TOOL_MAJOR)
2826f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            | (1LL << AMOTION_EVENT_AXIS_TOOL_MINOR)
2836f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            | (1LL << AMOTION_EVENT_AXIS_ORIENTATION);
2846f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown
2856f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown    uint64_t outBits = 0;
2866f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown    uint64_t remainingBits = rawPointerCoords->bits & ~unpackedAxisBits;
28791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    if (remainingBits) {
2886f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        uint32_t packedAxesCount = __builtin_popcountll(remainingBits);
28991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jfloatArray outValuesArray = obtainPackedAxisValuesArray(env, packedAxesCount,
29091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown                outPointerCoordsObj);
29191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        if (!outValuesArray) {
29291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            return; // OOM
29391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        }
29491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
29591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jfloat* outValues = static_cast<jfloat*>(env->GetPrimitiveArrayCritical(
29691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown                outValuesArray, NULL));
29791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
29891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        const float* values = rawPointerCoords->values;
29991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        uint32_t index = 0;
30091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        do {
30191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            uint32_t axis = __builtin_ctz(remainingBits);
3026f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            uint64_t axisBit = 1LL << axis;
30391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            remainingBits &= ~axisBit;
30491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            outBits |= axisBit;
30591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            outValues[index++] = rawPointerCoords->getAxisValue(axis);
30691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        } while (remainingBits);
30791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
30891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        env->ReleasePrimitiveArrayCritical(outValuesArray, outValues, 0);
30991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        env->DeleteLocalRef(outValuesArray);
3101f2451007c660091b7b090c1ea332f9044515d2dJeff Brown    }
3116f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown    env->SetLongField(outPointerCoordsObj, gPointerCoordsClassInfo.mPackedAxisBits, outBits);
31291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown}
3131f2451007c660091b7b090c1ea332f9044515d2dJeff Brown
31446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
31591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown// ----------------------------------------------------------------------------
3165c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
31791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownstatic jint android_view_MotionEvent_nativeInitialize(JNIEnv* env, jclass clazz,
31891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jint nativePtr,
31991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jint deviceId, jint source, jint action, jint flags, jint edgeFlags, jint metaState,
32091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jfloat xOffset, jfloat yOffset, jfloat xPrecision, jfloat yPrecision,
32191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jlong downTimeNanos, jlong eventTimeNanos,
32291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jint pointerCount, jintArray pointerIdsArray, jobjectArray pointerCoordsObjArray) {
32391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    if (!validatePointerCount(env, pointerCount)
32491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            || !validatePointerIdsArray(env, pointerIdsArray, pointerCount)
32591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            || !validatePointerCoordsObjArray(env, pointerCoordsObjArray, pointerCount)) {
32691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        return 0;
32791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    }
32846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
32991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr);
33091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    if (!event) {
33191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        event = new MotionEvent();
33246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    }
33346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
33491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    PointerCoords rawPointerCoords[pointerCount];
33591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
33691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    for (jint i = 0; i < pointerCount; i++) {
33791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jobject pointerCoordsObj = env->GetObjectArrayElement(pointerCoordsObjArray, i);
33891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        if (!pointerCoordsObj) {
33991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            jniThrowNullPointerException(env, "pointerCoords");
34091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            if (!nativePtr) {
34191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown                delete event;
34291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            }
34391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            return 0;
34491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        }
34591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        pointerCoordsToNative(env, pointerCoordsObj, xOffset, yOffset, &rawPointerCoords[i]);
34691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        env->DeleteLocalRef(pointerCoordsObj);
34791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    }
34891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
34991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    int* pointerIds = static_cast<int*>(env->GetPrimitiveArrayCritical(pointerIdsArray, NULL));
35091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
35185a3176704b5bfbeece9bd928369fbb76eec7dc6Jeff Brown    event->initialize(deviceId, source, action, flags, edgeFlags, metaState,
35291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            xOffset, yOffset, xPrecision, yPrecision,
35391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            downTimeNanos, eventTimeNanos, pointerCount, pointerIds, rawPointerCoords);
35491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
35591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    env->ReleasePrimitiveArrayCritical(pointerIdsArray, pointerIds, JNI_ABORT);
35691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    return reinterpret_cast<jint>(event);
35791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown}
35891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
35991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownstatic jint android_view_MotionEvent_nativeCopy(JNIEnv* env, jclass clazz,
36091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jint destNativePtr, jint sourceNativePtr, jboolean keepHistory) {
36191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    MotionEvent* destEvent = reinterpret_cast<MotionEvent*>(destNativePtr);
36291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    if (!destEvent) {
36391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        destEvent = new MotionEvent();
36491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    }
36591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    MotionEvent* sourceEvent = reinterpret_cast<MotionEvent*>(sourceNativePtr);
36691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    destEvent->copyFrom(sourceEvent, keepHistory);
36791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    return reinterpret_cast<jint>(destEvent);
36891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown}
36991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
37091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownstatic void android_view_MotionEvent_nativeDispose(JNIEnv* env, jclass clazz,
37191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jint nativePtr) {
37291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr);
37391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    delete event;
37491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown}
37591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
37691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownstatic void android_view_MotionEvent_nativeAddBatch(JNIEnv* env, jclass clazz,
37791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jint nativePtr, jlong eventTimeNanos, jobjectArray pointerCoordsObjArray,
37891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jint metaState) {
37991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr);
38091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    size_t pointerCount = event->getPointerCount();
38191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    if (!validatePointerCoordsObjArray(env, pointerCoordsObjArray, pointerCount)) {
38291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        return;
38391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    }
38491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
38591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    PointerCoords rawPointerCoords[pointerCount];
38691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
38791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    for (size_t i = 0; i < pointerCount; i++) {
38891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jobject pointerCoordsObj = env->GetObjectArrayElement(pointerCoordsObjArray, i);
38991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        if (!pointerCoordsObj) {
39091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            jniThrowNullPointerException(env, "pointerCoords");
39191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            return;
39246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        }
39391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        pointerCoordsToNative(env, pointerCoordsObj,
39491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown                event->getXOffset(), event->getYOffset(), &rawPointerCoords[i]);
39591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        env->DeleteLocalRef(pointerCoordsObj);
39646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    }
39746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
39891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    event->addSample(eventTimeNanos, rawPointerCoords);
39991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    event->setMetaState(event->getMetaState() | metaState);
40091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown}
40146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
40291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownstatic jint android_view_MotionEvent_nativeGetDeviceId(JNIEnv* env, jclass clazz,
40391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jint nativePtr) {
40491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr);
40591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    return event->getDeviceId();
40646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
40746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
40891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownstatic jint android_view_MotionEvent_nativeGetSource(JNIEnv* env, jclass clazz,
40991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jint nativePtr) {
41091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr);
41191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    return event->getSource();
41291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown}
41391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
41491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownstatic void android_view_MotionEvent_nativeSetSource(JNIEnv* env, jclass clazz,
41591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jint nativePtr, jint source) {
41691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr);
41791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    event->setSource(source);
41891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown}
41991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
42091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownstatic jint android_view_MotionEvent_nativeGetAction(JNIEnv* env, jclass clazz,
42191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jint nativePtr) {
42291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr);
42391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    return event->getAction();
42491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown}
42591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
42691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownstatic void android_view_MotionEvent_nativeSetAction(JNIEnv* env, jclass clazz,
42791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jint nativePtr, jint action) {
42891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr);
42991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    event->setAction(action);
43091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown}
43191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
43291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownstatic jint android_view_MotionEvent_nativeGetFlags(JNIEnv* env, jclass clazz,
43391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jint nativePtr) {
43491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr);
43591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    return event->getFlags();
43691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown}
43791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
43891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownstatic jint android_view_MotionEvent_nativeGetEdgeFlags(JNIEnv* env, jclass clazz,
43991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jint nativePtr) {
44091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr);
44191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    return event->getEdgeFlags();
44291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown}
44391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
44491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownstatic void android_view_MotionEvent_nativeSetEdgeFlags(JNIEnv* env, jclass clazz,
44591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jint nativePtr, jint edgeFlags) {
44691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr);
44791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    event->setEdgeFlags(edgeFlags);
44891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown}
44991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
45091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownstatic jint android_view_MotionEvent_nativeGetMetaState(JNIEnv* env, jclass clazz,
45191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jint nativePtr) {
45291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr);
45391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    return event->getMetaState();
45491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown}
45591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
45691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownstatic void android_view_MotionEvent_nativeOffsetLocation(JNIEnv* env, jclass clazz,
45791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jint nativePtr, jfloat deltaX, jfloat deltaY) {
45891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr);
45991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    return event->offsetLocation(deltaX, deltaY);
46091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown}
46191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
46291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownstatic jfloat android_view_MotionEvent_nativeGetXPrecision(JNIEnv* env, jclass clazz,
46391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jint nativePtr) {
46491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr);
46591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    return event->getXPrecision();
46691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown}
46791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
46891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownstatic jfloat android_view_MotionEvent_nativeGetYPrecision(JNIEnv* env, jclass clazz,
46991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jint nativePtr) {
47091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr);
47191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    return event->getYPrecision();
47291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown}
47391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
47491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownstatic jlong android_view_MotionEvent_nativeGetDownTimeNanos(JNIEnv* env, jclass clazz,
47591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jint nativePtr) {
47691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr);
47791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    return event->getDownTime();
47891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown}
47991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
48091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownstatic jint android_view_MotionEvent_nativeGetPointerCount(JNIEnv* env, jclass clazz,
48191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jint nativePtr) {
48291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr);
48391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    return jint(event->getPointerCount());
48491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown}
48591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
48691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownstatic jint android_view_MotionEvent_nativeGetPointerId(JNIEnv* env, jclass clazz,
48791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jint nativePtr, jint pointerIndex) {
48891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr);
48991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    size_t pointerCount = event->getPointerCount();
49091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    if (!validatePointerIndex(env, pointerIndex, pointerCount)) {
49191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        return -1;
49246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    }
49391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    return event->getPointerId(pointerIndex);
49446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
49546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
49691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownstatic jint android_view_MotionEvent_nativeFindPointerIndex(JNIEnv* env, jclass clazz,
49791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jint nativePtr, jint pointerId) {
49891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr);
49991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    size_t pointerCount = event->getPointerCount();
50091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    for (size_t i = 0; i < pointerCount; i++) {
50191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        if (event->getPointerId(i) == pointerId) {
50291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            return i;
50391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        }
50491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    }
50591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    return -1;
50691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown}
50791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
50891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownstatic jint android_view_MotionEvent_nativeGetHistorySize(JNIEnv* env, jclass clazz,
50991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jint nativePtr) {
51091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr);
51191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    return jint(event->getHistorySize());
51291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown}
51320e987bfc35d0ae6cb6344ead65ed44ee7cf8750Jeff Brown
51491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownstatic jlong android_view_MotionEvent_nativeGetEventTimeNanos(JNIEnv* env, jclass clazz,
51591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jint nativePtr, jint historyPos) {
51691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr);
51791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    if (historyPos == HISTORY_CURRENT) {
51891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        return event->getEventTime();
51991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    } else {
52091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        size_t historySize = event->getHistorySize();
52191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        if (!validateHistoryPos(env, historyPos, historySize)) {
52291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            return 0;
52391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        }
52491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        return event->getHistoricalEventTime(historyPos);
52520e987bfc35d0ae6cb6344ead65ed44ee7cf8750Jeff Brown    }
52620e987bfc35d0ae6cb6344ead65ed44ee7cf8750Jeff Brown}
52720e987bfc35d0ae6cb6344ead65ed44ee7cf8750Jeff Brown
52891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownstatic jfloat android_view_MotionEvent_nativeGetRawAxisValue(JNIEnv* env, jclass clazz,
52991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jint nativePtr, jint axis, jint pointerIndex, jint historyPos) {
53091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr);
53191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    size_t pointerCount = event->getPointerCount();
53291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    if (!validatePointerIndex(env, pointerIndex, pointerCount)) {
53391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        return 0;
53491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    }
53520e987bfc35d0ae6cb6344ead65ed44ee7cf8750Jeff Brown
53691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    if (historyPos == HISTORY_CURRENT) {
53791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        return event->getRawAxisValue(axis, pointerIndex);
53891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    } else {
53991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        size_t historySize = event->getHistorySize();
54091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        if (!validateHistoryPos(env, historyPos, historySize)) {
54191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            return 0;
54220e987bfc35d0ae6cb6344ead65ed44ee7cf8750Jeff Brown        }
54391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        return event->getHistoricalRawAxisValue(axis, pointerIndex, historyPos);
54491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    }
54591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown}
54620e987bfc35d0ae6cb6344ead65ed44ee7cf8750Jeff Brown
54791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownstatic jfloat android_view_MotionEvent_nativeGetAxisValue(JNIEnv* env, jclass clazz,
54891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jint nativePtr, jint axis, jint pointerIndex, jint historyPos) {
54991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr);
55091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    size_t pointerCount = event->getPointerCount();
55191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    if (!validatePointerIndex(env, pointerIndex, pointerCount)) {
55291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        return 0;
55391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    }
55420e987bfc35d0ae6cb6344ead65ed44ee7cf8750Jeff Brown
55591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    if (historyPos == HISTORY_CURRENT) {
55691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        return event->getAxisValue(axis, pointerIndex);
55791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    } else {
55891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        size_t historySize = event->getHistorySize();
55991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        if (!validateHistoryPos(env, historyPos, historySize)) {
56091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            return 0;
56191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        }
56291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        return event->getHistoricalAxisValue(axis, pointerIndex, historyPos);
56320e987bfc35d0ae6cb6344ead65ed44ee7cf8750Jeff Brown    }
56491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown}
56520e987bfc35d0ae6cb6344ead65ed44ee7cf8750Jeff Brown
56691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownstatic void android_view_MotionEvent_nativeGetPointerCoords(JNIEnv* env, jclass clazz,
56791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jint nativePtr, jint pointerIndex, jint historyPos, jobject outPointerCoordsObj) {
56891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr);
56991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    size_t pointerCount = event->getPointerCount();
57091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    if (!validatePointerIndex(env, pointerIndex, pointerCount)
57191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            || !validatePointerCoords(env, outPointerCoordsObj)) {
57291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        return;
57391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    }
57420e987bfc35d0ae6cb6344ead65ed44ee7cf8750Jeff Brown
57591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    const PointerCoords* rawPointerCoords;
57691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    if (historyPos == HISTORY_CURRENT) {
57791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        rawPointerCoords = event->getRawPointerCoords(pointerIndex);
57891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    } else {
57991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        size_t historySize = event->getHistorySize();
58091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        if (!validateHistoryPos(env, historyPos, historySize)) {
58191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            return;
58291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        }
58391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        rawPointerCoords = event->getHistoricalRawPointerCoords(pointerIndex, historyPos);
58491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    }
58591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    pointerCoordsFromNative(env, rawPointerCoords, event->getXOffset(), event->getYOffset(),
58691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            outPointerCoordsObj);
58791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown}
58891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
58991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownstatic void android_view_MotionEvent_nativeScale(JNIEnv* env, jclass clazz,
59091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jint nativePtr, jfloat scale) {
59191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr);
59291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    event->scale(scale);
59391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown}
59491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
59591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownstatic void android_view_MotionEvent_nativeTransform(JNIEnv* env, jclass clazz,
59691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jint nativePtr, jobject matrixObj) {
59791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    SkMatrix* matrix = android_graphics_Matrix_getSkMatrix(env, matrixObj);
59891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr);
59991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    event->transform(matrix);
60091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown}
60191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
60291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownstatic jint android_view_MotionEvent_nativeReadFromParcel(JNIEnv* env, jclass clazz,
60391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jint nativePtr, jobject parcelObj) {
60491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr);
60591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    if (!event) {
60691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        event = new MotionEvent();
60791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    }
60891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
60991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    Parcel* parcel = parcelForJavaObject(env, parcelObj);
61020e987bfc35d0ae6cb6344ead65ed44ee7cf8750Jeff Brown
61191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    status_t status = event->readFromParcel(parcel);
612ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown    if (status) {
61391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        if (!nativePtr) {
61491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            delete event;
61591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        }
61691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jniThrowRuntimeException(env, "Failed to read MotionEvent parcel.");
61791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        return 0;
61891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    }
61991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    return reinterpret_cast<jint>(event);
62091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown}
62191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
62291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownstatic void android_view_MotionEvent_nativeWriteToParcel(JNIEnv* env, jclass clazz,
62391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jint nativePtr, jobject parcelObj) {
62491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr);
62591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    Parcel* parcel = parcelForJavaObject(env, parcelObj);
62691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
62791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    status_t status = event->writeToParcel(parcel);
628ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown    if (status) {
62991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jniThrowRuntimeException(env, "Failed to write MotionEvent parcel.");
63091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    }
63120e987bfc35d0ae6cb6344ead65ed44ee7cf8750Jeff Brown}
63220e987bfc35d0ae6cb6344ead65ed44ee7cf8750Jeff Brown
63346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown// ----------------------------------------------------------------------------
63446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
63520e987bfc35d0ae6cb6344ead65ed44ee7cf8750Jeff Brownstatic JNINativeMethod gMotionEventMethods[] = {
63620e987bfc35d0ae6cb6344ead65ed44ee7cf8750Jeff Brown    /* name, signature, funcPtr */
63791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    { "nativeInitialize",
63891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            "(IIIIIIIFFFFJJI[I[Landroid/view/MotionEvent$PointerCoords;)I",
63991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            (void*)android_view_MotionEvent_nativeInitialize },
64091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    { "nativeCopy",
64191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            "(IIZ)I",
64291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            (void*)android_view_MotionEvent_nativeCopy },
64391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    { "nativeDispose",
64491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            "(I)V",
64591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            (void*)android_view_MotionEvent_nativeDispose },
64691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    { "nativeAddBatch",
64791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            "(IJ[Landroid/view/MotionEvent$PointerCoords;I)V",
64891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            (void*)android_view_MotionEvent_nativeAddBatch },
64991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    { "nativeGetDeviceId",
65091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            "(I)I",
65191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            (void*)android_view_MotionEvent_nativeGetDeviceId },
65291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    { "nativeGetSource",
65391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            "(I)I",
65491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            (void*)android_view_MotionEvent_nativeGetSource },
65591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    { "nativeSetSource",
65691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            "(II)I",
65791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            (void*)android_view_MotionEvent_nativeSetSource },
65891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    { "nativeGetAction",
65991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            "(I)I",
66091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            (void*)android_view_MotionEvent_nativeGetAction },
66191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    { "nativeSetAction",
66291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            "(II)V",
66391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            (void*)android_view_MotionEvent_nativeSetAction },
66491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    { "nativeGetFlags",
66591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            "(I)I",
66691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            (void*)android_view_MotionEvent_nativeGetFlags },
66791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    { "nativeGetEdgeFlags",
66891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            "(I)I",
66991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            (void*)android_view_MotionEvent_nativeGetEdgeFlags },
67091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    { "nativeSetEdgeFlags",
67191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            "(II)V",
67291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            (void*)android_view_MotionEvent_nativeSetEdgeFlags },
67391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    { "nativeGetMetaState",
67491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            "(I)I",
67591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            (void*)android_view_MotionEvent_nativeGetMetaState },
67691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    { "nativeOffsetLocation",
67791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            "(IFF)V",
67891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            (void*)android_view_MotionEvent_nativeOffsetLocation },
67991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    { "nativeGetXPrecision",
68091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            "(I)F",
68191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            (void*)android_view_MotionEvent_nativeGetXPrecision },
68291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    { "nativeGetYPrecision",
68391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            "(I)F",
68491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            (void*)android_view_MotionEvent_nativeGetYPrecision },
68591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    { "nativeGetDownTimeNanos",
68691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            "(I)J",
68791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            (void*)android_view_MotionEvent_nativeGetDownTimeNanos },
68891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    { "nativeGetPointerCount",
68991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            "(I)I",
69091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            (void*)android_view_MotionEvent_nativeGetPointerCount },
69191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    { "nativeGetPointerId",
69291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            "(II)I",
69391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            (void*)android_view_MotionEvent_nativeGetPointerId },
69491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    { "nativeFindPointerIndex",
69591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            "(II)I",
69691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            (void*)android_view_MotionEvent_nativeFindPointerIndex },
69791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    { "nativeGetHistorySize",
69891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            "(I)I",
69991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            (void*)android_view_MotionEvent_nativeGetHistorySize },
70091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    { "nativeGetEventTimeNanos",
70191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            "(II)J",
70291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            (void*)android_view_MotionEvent_nativeGetEventTimeNanos },
70391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    { "nativeGetRawAxisValue",
70491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            "(IIII)F",
70591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            (void*)android_view_MotionEvent_nativeGetRawAxisValue },
70691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    { "nativeGetAxisValue",
70791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            "(IIII)F",
70891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            (void*)android_view_MotionEvent_nativeGetAxisValue },
70991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    { "nativeGetPointerCoords",
71091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            "(IIILandroid/view/MotionEvent$PointerCoords;)V",
71191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            (void*)android_view_MotionEvent_nativeGetPointerCoords },
71291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    { "nativeScale",
71391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            "(IF)V",
71491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            (void*)android_view_MotionEvent_nativeScale },
71520e987bfc35d0ae6cb6344ead65ed44ee7cf8750Jeff Brown    { "nativeTransform",
71691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            "(ILandroid/graphics/Matrix;)V",
71720e987bfc35d0ae6cb6344ead65ed44ee7cf8750Jeff Brown            (void*)android_view_MotionEvent_nativeTransform },
71891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    { "nativeReadFromParcel",
71991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            "(ILandroid/os/Parcel;)I",
72091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            (void*)android_view_MotionEvent_nativeReadFromParcel },
72191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    { "nativeWriteToParcel",
72291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            "(ILandroid/os/Parcel;)V",
72391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            (void*)android_view_MotionEvent_nativeWriteToParcel },
72420e987bfc35d0ae6cb6344ead65ed44ee7cf8750Jeff Brown};
72520e987bfc35d0ae6cb6344ead65ed44ee7cf8750Jeff Brown
72646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#define FIND_CLASS(var, className) \
72746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        var = env->FindClass(className); \
72846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        LOG_FATAL_IF(! var, "Unable to find class " className); \
72946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        var = jclass(env->NewGlobalRef(var));
73046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
73146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#define GET_STATIC_METHOD_ID(var, clazz, methodName, fieldDescriptor) \
73246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        var = env->GetStaticMethodID(clazz, methodName, fieldDescriptor); \
73346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        LOG_FATAL_IF(! var, "Unable to find static method" methodName);
73446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
73546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#define GET_METHOD_ID(var, clazz, methodName, fieldDescriptor) \
73646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        var = env->GetMethodID(clazz, methodName, fieldDescriptor); \
73746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        LOG_FATAL_IF(! var, "Unable to find method" methodName);
73846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
73946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#define GET_FIELD_ID(var, clazz, fieldName, fieldDescriptor) \
74046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        var = env->GetFieldID(clazz, fieldName, fieldDescriptor); \
74146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        LOG_FATAL_IF(! var, "Unable to find field " fieldName);
74246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
74346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownint register_android_view_MotionEvent(JNIEnv* env) {
74420e987bfc35d0ae6cb6344ead65ed44ee7cf8750Jeff Brown    int res = jniRegisterNativeMethods(env, "android/view/MotionEvent",
74520e987bfc35d0ae6cb6344ead65ed44ee7cf8750Jeff Brown            gMotionEventMethods, NELEM(gMotionEventMethods));
74620e987bfc35d0ae6cb6344ead65ed44ee7cf8750Jeff Brown    LOG_FATAL_IF(res < 0, "Unable to register native methods.");
74720e987bfc35d0ae6cb6344ead65ed44ee7cf8750Jeff Brown
74846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    FIND_CLASS(gMotionEventClassInfo.clazz, "android/view/MotionEvent");
74946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
75046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    GET_STATIC_METHOD_ID(gMotionEventClassInfo.obtain, gMotionEventClassInfo.clazz,
75191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            "obtain", "()Landroid/view/MotionEvent;");
75246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    GET_METHOD_ID(gMotionEventClassInfo.recycle, gMotionEventClassInfo.clazz,
75346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            "recycle", "()V");
75491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    GET_FIELD_ID(gMotionEventClassInfo.mNativePtr, gMotionEventClassInfo.clazz,
75591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            "mNativePtr", "I");
75691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
75791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    FIND_CLASS(gPointerCoordsClassInfo.clazz, "android/view/MotionEvent$PointerCoords");
75891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
75991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    GET_FIELD_ID(gPointerCoordsClassInfo.mPackedAxisBits, gPointerCoordsClassInfo.clazz,
7606f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            "mPackedAxisBits", "J");
76191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    GET_FIELD_ID(gPointerCoordsClassInfo.mPackedAxisValues, gPointerCoordsClassInfo.clazz,
76291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            "mPackedAxisValues", "[F");
76391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    GET_FIELD_ID(gPointerCoordsClassInfo.x, gPointerCoordsClassInfo.clazz,
76491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            "x", "F");
76591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    GET_FIELD_ID(gPointerCoordsClassInfo.y, gPointerCoordsClassInfo.clazz,
76691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            "y", "F");
76791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    GET_FIELD_ID(gPointerCoordsClassInfo.pressure, gPointerCoordsClassInfo.clazz,
76891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            "pressure", "F");
76991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    GET_FIELD_ID(gPointerCoordsClassInfo.size, gPointerCoordsClassInfo.clazz,
77091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            "size", "F");
77191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    GET_FIELD_ID(gPointerCoordsClassInfo.touchMajor, gPointerCoordsClassInfo.clazz,
77291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            "touchMajor", "F");
77391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    GET_FIELD_ID(gPointerCoordsClassInfo.touchMinor, gPointerCoordsClassInfo.clazz,
77491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            "touchMinor", "F");
77591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    GET_FIELD_ID(gPointerCoordsClassInfo.toolMajor, gPointerCoordsClassInfo.clazz,
77691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            "toolMajor", "F");
77791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    GET_FIELD_ID(gPointerCoordsClassInfo.toolMinor, gPointerCoordsClassInfo.clazz,
77891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            "toolMinor", "F");
77991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    GET_FIELD_ID(gPointerCoordsClassInfo.orientation, gPointerCoordsClassInfo.clazz,
78091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            "orientation", "F");
78146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
78246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    return 0;
78346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
78446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
78546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} // namespace android
786