android_view_MotionEvent.cpp revision 21bc5c917d4ee2a9b2b8173091e6bba85eaff899
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    jfieldID mPackedAxisBits;
4691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    jfieldID mPackedAxisValues;
4791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    jfieldID x;
4891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    jfieldID y;
4991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    jfieldID pressure;
5091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    jfieldID size;
5191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    jfieldID touchMajor;
5291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    jfieldID touchMinor;
5391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    jfieldID toolMajor;
5491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    jfieldID toolMinor;
5591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    jfieldID orientation;
5691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown} gPointerCoordsClassInfo;
5791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
5846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown// ----------------------------------------------------------------------------
5946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
602ed2462aa29c564f5231f317c27b3188da875e52Jeff BrownMotionEvent* android_view_MotionEvent_getNativePtr(JNIEnv* env, jobject eventObj) {
612ed2462aa29c564f5231f317c27b3188da875e52Jeff Brown    if (!eventObj) {
622ed2462aa29c564f5231f317c27b3188da875e52Jeff Brown        return NULL;
632ed2462aa29c564f5231f317c27b3188da875e52Jeff Brown    }
6491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    return reinterpret_cast<MotionEvent*>(
6591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            env->GetIntField(eventObj, gMotionEventClassInfo.mNativePtr));
6691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown}
6746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
6891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownstatic void android_view_MotionEvent_setNativePtr(JNIEnv* env, jobject eventObj,
6991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        MotionEvent* event) {
7091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    env->SetIntField(eventObj, gMotionEventClassInfo.mNativePtr,
7191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            reinterpret_cast<int>(event));
7291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown}
7391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
742ed2462aa29c564f5231f317c27b3188da875e52Jeff Brownjobject android_view_MotionEvent_obtainAsCopy(JNIEnv* env, const MotionEvent* event) {
7546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    jobject eventObj = env->CallStaticObjectMethod(gMotionEventClassInfo.clazz,
7691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            gMotionEventClassInfo.obtain);
772ed2462aa29c564f5231f317c27b3188da875e52Jeff Brown    if (env->ExceptionCheck() || !eventObj) {
7846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        LOGE("An exception occurred while obtaining a motion event.");
7946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        LOGE_EX(env);
8046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        env->ExceptionClear();
8146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        return NULL;
8246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    }
8346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
8491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    MotionEvent* destEvent = android_view_MotionEvent_getNativePtr(env, eventObj);
8591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    if (!destEvent) {
8691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        destEvent = new MotionEvent();
8791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        android_view_MotionEvent_setNativePtr(env, eventObj, destEvent);
8891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    }
8991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
9091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    destEvent->copyFrom(event, true);
9146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    return eventObj;
9246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
9346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
9491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownstatus_t android_view_MotionEvent_recycle(JNIEnv* env, jobject eventObj) {
9591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    env->CallVoidMethod(eventObj, gMotionEventClassInfo.recycle);
9691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    if (env->ExceptionCheck()) {
9791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        LOGW("An exception occurred while recycling a motion event.");
9891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        LOGW_EX(env);
9991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        env->ExceptionClear();
10091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        return UNKNOWN_ERROR;
10191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    }
10291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    return OK;
10391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown}
10491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
10591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown// ----------------------------------------------------------------------------
10691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
10791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownstatic const jint HISTORY_CURRENT = -0x80000000;
10891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
10991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownstatic bool validatePointerCount(JNIEnv* env, jint pointerCount) {
11091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    if (pointerCount < 1) {
11191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jniThrowException(env, "java/lang/IllegalArgumentException",
11291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown                "pointerCount must be at least 1");
11391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        return false;
11491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    }
11591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    return true;
11691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown}
11791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
11891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownstatic bool validatePointerIdsArray(JNIEnv* env, jintArray pointerIdsArray,
11991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        size_t pointerCount) {
12091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    if (!pointerIdsArray) {
12191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jniThrowException(env, "java/lang/IllegalArgumentException",
12291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown                "pointerIds array must not be null");
12391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        return false;
12491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    }
12591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    size_t length = size_t(env->GetArrayLength(pointerIdsArray));
12691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    if (length < pointerCount) {
12791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jniThrowException(env, "java/lang/IllegalArgumentException",
12891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown                "pointerIds array must be large enough to hold all pointers");
12991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        return false;
13091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    }
13191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    return true;
13291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown}
13391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
13491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownstatic bool validatePointerCoordsObjArray(JNIEnv* env, jobjectArray pointerCoordsObjArray,
13591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        size_t pointerCount) {
13691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    if (!pointerCoordsObjArray) {
13791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jniThrowException(env, "java/lang/IllegalArgumentException",
13891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown                "pointerCoords array must not be null");
13991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        return false;
14091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    }
14191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    size_t length = size_t(env->GetArrayLength(pointerCoordsObjArray));
14291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    if (length < pointerCount) {
14391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jniThrowException(env, "java/lang/IllegalArgumentException",
14491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown                "pointerCoords array must be large enough to hold all pointers");
14591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        return false;
14691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    }
14791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    return true;
14891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown}
14991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
15091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownstatic bool validatePointerIndex(JNIEnv* env, jint pointerIndex, size_t pointerCount) {
15191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    if (pointerIndex < 0 || size_t(pointerIndex) >= pointerCount) {
15291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jniThrowException(env, "java/lang/IllegalArgumentException",
15391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown                "pointerIndex out of range");
15491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        return false;
15591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    }
15691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    return true;
15791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown}
15891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
15991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownstatic bool validateHistoryPos(JNIEnv* env, jint historyPos, size_t historySize) {
16091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    if (historyPos < 0 || size_t(historyPos) >= historySize) {
16191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jniThrowException(env, "java/lang/IllegalArgumentException",
16291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown                "historyPos out of range");
16391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        return false;
16491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    }
16591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    return true;
16691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown}
16791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
16891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownstatic bool validatePointerCoords(JNIEnv* env, jobject pointerCoordsObj) {
16991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    if (!pointerCoordsObj) {
17091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jniThrowException(env, "java/lang/IllegalArgumentException",
17191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown                "pointerCoords must not be null");
17291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        return false;
17391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    }
17491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    return true;
17591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown}
17691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
17791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownstatic void pointerCoordsToNative(JNIEnv* env, jobject pointerCoordsObj,
17891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        float xOffset, float yOffset, PointerCoords* outRawPointerCoords) {
17991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    outRawPointerCoords->clear();
180ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown    outRawPointerCoords->setAxisValue(AMOTION_EVENT_AXIS_X,
18191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            env->GetFloatField(pointerCoordsObj, gPointerCoordsClassInfo.x) - xOffset);
182ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown    outRawPointerCoords->setAxisValue(AMOTION_EVENT_AXIS_Y,
18391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            env->GetFloatField(pointerCoordsObj, gPointerCoordsClassInfo.y) - yOffset);
184ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown    outRawPointerCoords->setAxisValue(AMOTION_EVENT_AXIS_PRESSURE,
18591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            env->GetFloatField(pointerCoordsObj, gPointerCoordsClassInfo.pressure));
186ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown    outRawPointerCoords->setAxisValue(AMOTION_EVENT_AXIS_SIZE,
18791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            env->GetFloatField(pointerCoordsObj, gPointerCoordsClassInfo.size));
188ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown    outRawPointerCoords->setAxisValue(AMOTION_EVENT_AXIS_TOUCH_MAJOR,
18991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            env->GetFloatField(pointerCoordsObj, gPointerCoordsClassInfo.touchMajor));
190ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown    outRawPointerCoords->setAxisValue(AMOTION_EVENT_AXIS_TOUCH_MINOR,
19191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            env->GetFloatField(pointerCoordsObj, gPointerCoordsClassInfo.touchMinor));
192ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown    outRawPointerCoords->setAxisValue(AMOTION_EVENT_AXIS_TOOL_MAJOR,
19391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            env->GetFloatField(pointerCoordsObj, gPointerCoordsClassInfo.toolMajor));
194ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown    outRawPointerCoords->setAxisValue(AMOTION_EVENT_AXIS_TOOL_MINOR,
19591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            env->GetFloatField(pointerCoordsObj, gPointerCoordsClassInfo.toolMinor));
196ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown    outRawPointerCoords->setAxisValue(AMOTION_EVENT_AXIS_ORIENTATION,
19791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            env->GetFloatField(pointerCoordsObj, gPointerCoordsClassInfo.orientation));
19891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
1996f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown    uint64_t bits = env->GetLongField(pointerCoordsObj, gPointerCoordsClassInfo.mPackedAxisBits);
20091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    if (bits) {
20191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jfloatArray valuesArray = jfloatArray(env->GetObjectField(pointerCoordsObj,
20291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown                gPointerCoordsClassInfo.mPackedAxisValues));
20391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        if (valuesArray) {
20491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            jfloat* values = static_cast<jfloat*>(
20591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown                    env->GetPrimitiveArrayCritical(valuesArray, NULL));
20691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
20791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            uint32_t index = 0;
20891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            do {
209cc0c159e9b3dd4e0f48da0ce3e33d2c68a651413Jeff Brown                uint32_t axis = __builtin_ctzll(bits);
2106f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown                uint64_t axisBit = 1LL << axis;
21191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown                bits &= ~axisBit;
21291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown                outRawPointerCoords->setAxisValue(axis, values[index++]);
21391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            } while (bits);
21491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
21591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            env->ReleasePrimitiveArrayCritical(valuesArray, values, JNI_ABORT);
21691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            env->DeleteLocalRef(valuesArray);
21791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        }
21891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    }
21991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown}
22091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
22191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownstatic jfloatArray obtainPackedAxisValuesArray(JNIEnv* env, uint32_t minSize,
22291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jobject outPointerCoordsObj) {
22391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    jfloatArray outValuesArray = jfloatArray(env->GetObjectField(outPointerCoordsObj,
22491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            gPointerCoordsClassInfo.mPackedAxisValues));
22591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    if (outValuesArray) {
22691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        uint32_t size = env->GetArrayLength(outValuesArray);
22791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        if (minSize <= size) {
22891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            return outValuesArray;
22991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        }
23091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        env->DeleteLocalRef(outValuesArray);
23191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    }
23291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    uint32_t size = 8;
23391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    while (size < minSize) {
23491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        size *= 2;
23591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    }
23691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    outValuesArray = env->NewFloatArray(size);
23791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    env->SetObjectField(outPointerCoordsObj,
23891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            gPointerCoordsClassInfo.mPackedAxisValues, outValuesArray);
23991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    return outValuesArray;
24091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown}
24191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
24291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownstatic void pointerCoordsFromNative(JNIEnv* env, const PointerCoords* rawPointerCoords,
24391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        float xOffset, float yOffset, jobject outPointerCoordsObj) {
24491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    env->SetFloatField(outPointerCoordsObj, gPointerCoordsClassInfo.x,
245ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown            rawPointerCoords->getAxisValue(AMOTION_EVENT_AXIS_X) + xOffset);
24691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    env->SetFloatField(outPointerCoordsObj, gPointerCoordsClassInfo.y,
247ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown            rawPointerCoords->getAxisValue(AMOTION_EVENT_AXIS_Y) + yOffset);
24891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    env->SetFloatField(outPointerCoordsObj, gPointerCoordsClassInfo.pressure,
249ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown            rawPointerCoords->getAxisValue(AMOTION_EVENT_AXIS_PRESSURE));
25091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    env->SetFloatField(outPointerCoordsObj, gPointerCoordsClassInfo.size,
251ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown            rawPointerCoords->getAxisValue(AMOTION_EVENT_AXIS_SIZE));
25291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    env->SetFloatField(outPointerCoordsObj, gPointerCoordsClassInfo.touchMajor,
253ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown            rawPointerCoords->getAxisValue(AMOTION_EVENT_AXIS_TOUCH_MAJOR));
25491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    env->SetFloatField(outPointerCoordsObj, gPointerCoordsClassInfo.touchMinor,
255ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown            rawPointerCoords->getAxisValue(AMOTION_EVENT_AXIS_TOUCH_MINOR));
25691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    env->SetFloatField(outPointerCoordsObj, gPointerCoordsClassInfo.toolMajor,
257ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown            rawPointerCoords->getAxisValue(AMOTION_EVENT_AXIS_TOOL_MAJOR));
25891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    env->SetFloatField(outPointerCoordsObj, gPointerCoordsClassInfo.toolMinor,
259ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown            rawPointerCoords->getAxisValue(AMOTION_EVENT_AXIS_TOOL_MINOR));
26091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    env->SetFloatField(outPointerCoordsObj, gPointerCoordsClassInfo.orientation,
261ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown            rawPointerCoords->getAxisValue(AMOTION_EVENT_AXIS_ORIENTATION));
26291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
2636f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown    const uint64_t unpackedAxisBits = 0
2646f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            | (1LL << AMOTION_EVENT_AXIS_X)
2656f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            | (1LL << AMOTION_EVENT_AXIS_Y)
2666f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            | (1LL << AMOTION_EVENT_AXIS_PRESSURE)
2676f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            | (1LL << AMOTION_EVENT_AXIS_SIZE)
2686f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            | (1LL << AMOTION_EVENT_AXIS_TOUCH_MAJOR)
2696f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            | (1LL << AMOTION_EVENT_AXIS_TOUCH_MINOR)
2706f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            | (1LL << AMOTION_EVENT_AXIS_TOOL_MAJOR)
2716f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            | (1LL << AMOTION_EVENT_AXIS_TOOL_MINOR)
2726f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            | (1LL << AMOTION_EVENT_AXIS_ORIENTATION);
2736f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown
2746f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown    uint64_t outBits = 0;
2756f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown    uint64_t remainingBits = rawPointerCoords->bits & ~unpackedAxisBits;
27691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    if (remainingBits) {
2776f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        uint32_t packedAxesCount = __builtin_popcountll(remainingBits);
27891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jfloatArray outValuesArray = obtainPackedAxisValuesArray(env, packedAxesCount,
27991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown                outPointerCoordsObj);
28091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        if (!outValuesArray) {
28191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            return; // OOM
28291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        }
28391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
28491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jfloat* outValues = static_cast<jfloat*>(env->GetPrimitiveArrayCritical(
28591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown                outValuesArray, NULL));
28691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
28791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        const float* values = rawPointerCoords->values;
28891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        uint32_t index = 0;
28991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        do {
290cc0c159e9b3dd4e0f48da0ce3e33d2c68a651413Jeff Brown            uint32_t axis = __builtin_ctzll(remainingBits);
2916f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            uint64_t axisBit = 1LL << axis;
29291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            remainingBits &= ~axisBit;
29391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            outBits |= axisBit;
29491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            outValues[index++] = rawPointerCoords->getAxisValue(axis);
29591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        } while (remainingBits);
29691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
29791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        env->ReleasePrimitiveArrayCritical(outValuesArray, outValues, 0);
29891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        env->DeleteLocalRef(outValuesArray);
2991f2451007c660091b7b090c1ea332f9044515d2dJeff Brown    }
3006f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown    env->SetLongField(outPointerCoordsObj, gPointerCoordsClassInfo.mPackedAxisBits, outBits);
30191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown}
3021f2451007c660091b7b090c1ea332f9044515d2dJeff Brown
30346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
30491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown// ----------------------------------------------------------------------------
3055c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
30691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownstatic jint android_view_MotionEvent_nativeInitialize(JNIEnv* env, jclass clazz,
30791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jint nativePtr,
30891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jint deviceId, jint source, jint action, jint flags, jint edgeFlags, jint metaState,
30991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jfloat xOffset, jfloat yOffset, jfloat xPrecision, jfloat yPrecision,
31091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jlong downTimeNanos, jlong eventTimeNanos,
31191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jint pointerCount, jintArray pointerIdsArray, jobjectArray pointerCoordsObjArray) {
31291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    if (!validatePointerCount(env, pointerCount)
31391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            || !validatePointerIdsArray(env, pointerIdsArray, pointerCount)
31491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            || !validatePointerCoordsObjArray(env, pointerCoordsObjArray, pointerCount)) {
31591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        return 0;
31691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    }
31746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
31891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr);
31991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    if (!event) {
32091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        event = new MotionEvent();
32146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    }
32246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
32391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    PointerCoords rawPointerCoords[pointerCount];
32491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
32591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    for (jint i = 0; i < pointerCount; i++) {
32691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jobject pointerCoordsObj = env->GetObjectArrayElement(pointerCoordsObjArray, i);
32791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        if (!pointerCoordsObj) {
32891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            jniThrowNullPointerException(env, "pointerCoords");
32991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            if (!nativePtr) {
33091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown                delete event;
33191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            }
33291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            return 0;
33391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        }
33491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        pointerCoordsToNative(env, pointerCoordsObj, xOffset, yOffset, &rawPointerCoords[i]);
33591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        env->DeleteLocalRef(pointerCoordsObj);
33691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    }
33791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
33891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    int* pointerIds = static_cast<int*>(env->GetPrimitiveArrayCritical(pointerIdsArray, NULL));
33991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
34085a3176704b5bfbeece9bd928369fbb76eec7dc6Jeff Brown    event->initialize(deviceId, source, action, flags, edgeFlags, metaState,
34191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            xOffset, yOffset, xPrecision, yPrecision,
34291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            downTimeNanos, eventTimeNanos, pointerCount, pointerIds, rawPointerCoords);
34391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
34491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    env->ReleasePrimitiveArrayCritical(pointerIdsArray, pointerIds, JNI_ABORT);
34591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    return reinterpret_cast<jint>(event);
34691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown}
34791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
34891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownstatic jint android_view_MotionEvent_nativeCopy(JNIEnv* env, jclass clazz,
34991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jint destNativePtr, jint sourceNativePtr, jboolean keepHistory) {
35091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    MotionEvent* destEvent = reinterpret_cast<MotionEvent*>(destNativePtr);
35191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    if (!destEvent) {
35291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        destEvent = new MotionEvent();
35391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    }
35491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    MotionEvent* sourceEvent = reinterpret_cast<MotionEvent*>(sourceNativePtr);
35591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    destEvent->copyFrom(sourceEvent, keepHistory);
35691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    return reinterpret_cast<jint>(destEvent);
35791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown}
35891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
35991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownstatic void android_view_MotionEvent_nativeDispose(JNIEnv* env, jclass clazz,
36091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jint nativePtr) {
36191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr);
36291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    delete event;
36391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown}
36491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
36591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownstatic void android_view_MotionEvent_nativeAddBatch(JNIEnv* env, jclass clazz,
36691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jint nativePtr, jlong eventTimeNanos, jobjectArray pointerCoordsObjArray,
36791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jint metaState) {
36891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr);
36991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    size_t pointerCount = event->getPointerCount();
37091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    if (!validatePointerCoordsObjArray(env, pointerCoordsObjArray, pointerCount)) {
37191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        return;
37291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    }
37391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
37491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    PointerCoords rawPointerCoords[pointerCount];
37591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
37691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    for (size_t i = 0; i < pointerCount; i++) {
37791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jobject pointerCoordsObj = env->GetObjectArrayElement(pointerCoordsObjArray, i);
37891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        if (!pointerCoordsObj) {
37991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            jniThrowNullPointerException(env, "pointerCoords");
38091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            return;
38146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        }
38291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        pointerCoordsToNative(env, pointerCoordsObj,
38391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown                event->getXOffset(), event->getYOffset(), &rawPointerCoords[i]);
38491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        env->DeleteLocalRef(pointerCoordsObj);
38546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    }
38646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
38791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    event->addSample(eventTimeNanos, rawPointerCoords);
38891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    event->setMetaState(event->getMetaState() | metaState);
38991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown}
39046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
39191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownstatic jint android_view_MotionEvent_nativeGetDeviceId(JNIEnv* env, jclass clazz,
39291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jint nativePtr) {
39391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr);
39491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    return event->getDeviceId();
39546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
39646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
39791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownstatic jint android_view_MotionEvent_nativeGetSource(JNIEnv* env, jclass clazz,
39891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jint nativePtr) {
39991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr);
40091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    return event->getSource();
40191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown}
40291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
40391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownstatic void android_view_MotionEvent_nativeSetSource(JNIEnv* env, jclass clazz,
40491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jint nativePtr, jint source) {
40591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr);
40691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    event->setSource(source);
40791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown}
40891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
40991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownstatic jint android_view_MotionEvent_nativeGetAction(JNIEnv* env, jclass clazz,
41091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jint nativePtr) {
41191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr);
41291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    return event->getAction();
41391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown}
41491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
41591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownstatic void android_view_MotionEvent_nativeSetAction(JNIEnv* env, jclass clazz,
41691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jint nativePtr, jint action) {
41791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr);
41891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    event->setAction(action);
41991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown}
42091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
42156194ebec6212e229f4ccdaa4b187166d20013efJeff Brownstatic jboolean android_view_MotionEvent_nativeIsTouchEvent(JNIEnv* env, jclass clazz,
42256194ebec6212e229f4ccdaa4b187166d20013efJeff Brown        jint nativePtr) {
42356194ebec6212e229f4ccdaa4b187166d20013efJeff Brown    MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr);
42456194ebec6212e229f4ccdaa4b187166d20013efJeff Brown    return event->isTouchEvent();
42556194ebec6212e229f4ccdaa4b187166d20013efJeff Brown}
42656194ebec6212e229f4ccdaa4b187166d20013efJeff Brown
42791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownstatic jint android_view_MotionEvent_nativeGetFlags(JNIEnv* env, jclass clazz,
42891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jint nativePtr) {
42991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr);
43091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    return event->getFlags();
43191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown}
43291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
43321bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brownstatic void android_view_MotionEvent_nativeSetFlags(JNIEnv* env, jclass clazz,
43421bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown        jint nativePtr, jint flags) {
43521bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown    MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr);
43621bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown    event->setFlags(flags);
43721bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown}
43821bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown
43991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownstatic jint android_view_MotionEvent_nativeGetEdgeFlags(JNIEnv* env, jclass clazz,
44091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jint nativePtr) {
44191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr);
44291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    return event->getEdgeFlags();
44391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown}
44491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
44591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownstatic void android_view_MotionEvent_nativeSetEdgeFlags(JNIEnv* env, jclass clazz,
44691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jint nativePtr, jint edgeFlags) {
44791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr);
44891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    event->setEdgeFlags(edgeFlags);
44991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown}
45091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
45191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownstatic jint android_view_MotionEvent_nativeGetMetaState(JNIEnv* env, jclass clazz,
45291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jint nativePtr) {
45391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr);
45491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    return event->getMetaState();
45591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown}
45691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
45791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownstatic void android_view_MotionEvent_nativeOffsetLocation(JNIEnv* env, jclass clazz,
45891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jint nativePtr, jfloat deltaX, jfloat deltaY) {
45991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr);
46091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    return event->offsetLocation(deltaX, deltaY);
46191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown}
46291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
46391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownstatic jfloat android_view_MotionEvent_nativeGetXPrecision(JNIEnv* env, jclass clazz,
46491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jint nativePtr) {
46591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr);
46691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    return event->getXPrecision();
46791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown}
46891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
46991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownstatic jfloat android_view_MotionEvent_nativeGetYPrecision(JNIEnv* env, jclass clazz,
47091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jint nativePtr) {
47191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr);
47291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    return event->getYPrecision();
47391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown}
47491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
47591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownstatic jlong android_view_MotionEvent_nativeGetDownTimeNanos(JNIEnv* env, jclass clazz,
47691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jint nativePtr) {
47791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr);
47891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    return event->getDownTime();
47991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown}
48091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
48191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownstatic jint android_view_MotionEvent_nativeGetPointerCount(JNIEnv* env, jclass clazz,
48291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jint nativePtr) {
48391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr);
48491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    return jint(event->getPointerCount());
48591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown}
48691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
48791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownstatic jint android_view_MotionEvent_nativeGetPointerId(JNIEnv* env, jclass clazz,
48891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jint nativePtr, jint pointerIndex) {
48991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr);
49091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    size_t pointerCount = event->getPointerCount();
49191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    if (!validatePointerIndex(env, pointerIndex, pointerCount)) {
49291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        return -1;
49346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    }
49491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    return event->getPointerId(pointerIndex);
49546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
49646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
49791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownstatic jint android_view_MotionEvent_nativeFindPointerIndex(JNIEnv* env, jclass clazz,
49891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jint nativePtr, jint pointerId) {
49991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr);
5002ed2462aa29c564f5231f317c27b3188da875e52Jeff Brown    return jint(event->findPointerIndex(pointerId));
50191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown}
50291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
50391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownstatic jint android_view_MotionEvent_nativeGetHistorySize(JNIEnv* env, jclass clazz,
50491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jint nativePtr) {
50591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr);
50691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    return jint(event->getHistorySize());
50791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown}
50820e987bfc35d0ae6cb6344ead65ed44ee7cf8750Jeff Brown
50991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownstatic jlong android_view_MotionEvent_nativeGetEventTimeNanos(JNIEnv* env, jclass clazz,
51091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jint nativePtr, jint historyPos) {
51191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr);
51291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    if (historyPos == HISTORY_CURRENT) {
51391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        return event->getEventTime();
51491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    } else {
51591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        size_t historySize = event->getHistorySize();
51691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        if (!validateHistoryPos(env, historyPos, historySize)) {
51791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            return 0;
51891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        }
51991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        return event->getHistoricalEventTime(historyPos);
52020e987bfc35d0ae6cb6344ead65ed44ee7cf8750Jeff Brown    }
52120e987bfc35d0ae6cb6344ead65ed44ee7cf8750Jeff Brown}
52220e987bfc35d0ae6cb6344ead65ed44ee7cf8750Jeff Brown
52391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownstatic jfloat android_view_MotionEvent_nativeGetRawAxisValue(JNIEnv* env, jclass clazz,
52491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jint nativePtr, jint axis, jint pointerIndex, jint historyPos) {
52591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr);
52691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    size_t pointerCount = event->getPointerCount();
52791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    if (!validatePointerIndex(env, pointerIndex, pointerCount)) {
52891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        return 0;
52991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    }
53020e987bfc35d0ae6cb6344ead65ed44ee7cf8750Jeff Brown
53191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    if (historyPos == HISTORY_CURRENT) {
53291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        return event->getRawAxisValue(axis, pointerIndex);
53391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    } else {
53491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        size_t historySize = event->getHistorySize();
53591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        if (!validateHistoryPos(env, historyPos, historySize)) {
53691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            return 0;
53720e987bfc35d0ae6cb6344ead65ed44ee7cf8750Jeff Brown        }
53891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        return event->getHistoricalRawAxisValue(axis, pointerIndex, historyPos);
53991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    }
54091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown}
54120e987bfc35d0ae6cb6344ead65ed44ee7cf8750Jeff Brown
54291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownstatic jfloat android_view_MotionEvent_nativeGetAxisValue(JNIEnv* env, jclass clazz,
54391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jint nativePtr, jint axis, jint pointerIndex, jint historyPos) {
54491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr);
54591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    size_t pointerCount = event->getPointerCount();
54691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    if (!validatePointerIndex(env, pointerIndex, pointerCount)) {
54791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        return 0;
54891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    }
54920e987bfc35d0ae6cb6344ead65ed44ee7cf8750Jeff Brown
55091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    if (historyPos == HISTORY_CURRENT) {
55191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        return event->getAxisValue(axis, pointerIndex);
55291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    } else {
55391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        size_t historySize = event->getHistorySize();
55491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        if (!validateHistoryPos(env, historyPos, historySize)) {
55591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            return 0;
55691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        }
55791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        return event->getHistoricalAxisValue(axis, pointerIndex, historyPos);
55820e987bfc35d0ae6cb6344ead65ed44ee7cf8750Jeff Brown    }
55991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown}
56020e987bfc35d0ae6cb6344ead65ed44ee7cf8750Jeff Brown
56191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownstatic void android_view_MotionEvent_nativeGetPointerCoords(JNIEnv* env, jclass clazz,
56291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jint nativePtr, jint pointerIndex, jint historyPos, jobject outPointerCoordsObj) {
56391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr);
56491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    size_t pointerCount = event->getPointerCount();
56591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    if (!validatePointerIndex(env, pointerIndex, pointerCount)
56691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            || !validatePointerCoords(env, outPointerCoordsObj)) {
56791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        return;
56891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    }
56920e987bfc35d0ae6cb6344ead65ed44ee7cf8750Jeff Brown
57091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    const PointerCoords* rawPointerCoords;
57191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    if (historyPos == HISTORY_CURRENT) {
57291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        rawPointerCoords = event->getRawPointerCoords(pointerIndex);
57391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    } else {
57491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        size_t historySize = event->getHistorySize();
57591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        if (!validateHistoryPos(env, historyPos, historySize)) {
57691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            return;
57791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        }
57891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        rawPointerCoords = event->getHistoricalRawPointerCoords(pointerIndex, historyPos);
57991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    }
58091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    pointerCoordsFromNative(env, rawPointerCoords, event->getXOffset(), event->getYOffset(),
58191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            outPointerCoordsObj);
58291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown}
58391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
58491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownstatic void android_view_MotionEvent_nativeScale(JNIEnv* env, jclass clazz,
58591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jint nativePtr, jfloat scale) {
58691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr);
58791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    event->scale(scale);
58891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown}
58991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
59091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownstatic void android_view_MotionEvent_nativeTransform(JNIEnv* env, jclass clazz,
59191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jint nativePtr, jobject matrixObj) {
59291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    SkMatrix* matrix = android_graphics_Matrix_getSkMatrix(env, matrixObj);
59391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr);
59491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    event->transform(matrix);
59591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown}
59691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
59791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownstatic jint android_view_MotionEvent_nativeReadFromParcel(JNIEnv* env, jclass clazz,
59891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jint nativePtr, jobject parcelObj) {
59991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr);
60091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    if (!event) {
60191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        event = new MotionEvent();
60291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    }
60391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
60491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    Parcel* parcel = parcelForJavaObject(env, parcelObj);
60520e987bfc35d0ae6cb6344ead65ed44ee7cf8750Jeff Brown
60691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    status_t status = event->readFromParcel(parcel);
607ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown    if (status) {
60891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        if (!nativePtr) {
60991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            delete event;
61091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        }
61191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jniThrowRuntimeException(env, "Failed to read MotionEvent parcel.");
61291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        return 0;
61391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    }
61491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    return reinterpret_cast<jint>(event);
61591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown}
61691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
61791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownstatic void android_view_MotionEvent_nativeWriteToParcel(JNIEnv* env, jclass clazz,
61891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jint nativePtr, jobject parcelObj) {
61991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr);
62091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    Parcel* parcel = parcelForJavaObject(env, parcelObj);
62191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
62291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    status_t status = event->writeToParcel(parcel);
623ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown    if (status) {
62491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        jniThrowRuntimeException(env, "Failed to write MotionEvent parcel.");
62591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    }
62620e987bfc35d0ae6cb6344ead65ed44ee7cf8750Jeff Brown}
62720e987bfc35d0ae6cb6344ead65ed44ee7cf8750Jeff Brown
62846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown// ----------------------------------------------------------------------------
62946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
63020e987bfc35d0ae6cb6344ead65ed44ee7cf8750Jeff Brownstatic JNINativeMethod gMotionEventMethods[] = {
63120e987bfc35d0ae6cb6344ead65ed44ee7cf8750Jeff Brown    /* name, signature, funcPtr */
63291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    { "nativeInitialize",
63391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            "(IIIIIIIFFFFJJI[I[Landroid/view/MotionEvent$PointerCoords;)I",
63491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            (void*)android_view_MotionEvent_nativeInitialize },
63591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    { "nativeCopy",
63691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            "(IIZ)I",
63791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            (void*)android_view_MotionEvent_nativeCopy },
63891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    { "nativeDispose",
63991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            "(I)V",
64091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            (void*)android_view_MotionEvent_nativeDispose },
64191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    { "nativeAddBatch",
64291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            "(IJ[Landroid/view/MotionEvent$PointerCoords;I)V",
64391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            (void*)android_view_MotionEvent_nativeAddBatch },
64491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    { "nativeGetDeviceId",
64591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            "(I)I",
64691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            (void*)android_view_MotionEvent_nativeGetDeviceId },
64791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    { "nativeGetSource",
64891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            "(I)I",
64991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            (void*)android_view_MotionEvent_nativeGetSource },
65091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    { "nativeSetSource",
65191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            "(II)I",
65291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            (void*)android_view_MotionEvent_nativeSetSource },
65391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    { "nativeGetAction",
65491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            "(I)I",
65591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            (void*)android_view_MotionEvent_nativeGetAction },
65691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    { "nativeSetAction",
65791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            "(II)V",
65891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            (void*)android_view_MotionEvent_nativeSetAction },
65956194ebec6212e229f4ccdaa4b187166d20013efJeff Brown    { "nativeIsTouchEvent",
66056194ebec6212e229f4ccdaa4b187166d20013efJeff Brown            "(I)Z",
66156194ebec6212e229f4ccdaa4b187166d20013efJeff Brown            (void*)android_view_MotionEvent_nativeIsTouchEvent },
66291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    { "nativeGetFlags",
66391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            "(I)I",
66491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            (void*)android_view_MotionEvent_nativeGetFlags },
66521bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown    { "nativeSetFlags",
66621bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown            "(II)V",
66721bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown            (void*)android_view_MotionEvent_nativeSetFlags },
66891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    { "nativeGetEdgeFlags",
66991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            "(I)I",
67091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            (void*)android_view_MotionEvent_nativeGetEdgeFlags },
67191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    { "nativeSetEdgeFlags",
67291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            "(II)V",
67391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            (void*)android_view_MotionEvent_nativeSetEdgeFlags },
67491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    { "nativeGetMetaState",
67591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            "(I)I",
67691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            (void*)android_view_MotionEvent_nativeGetMetaState },
67791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    { "nativeOffsetLocation",
67891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            "(IFF)V",
67991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            (void*)android_view_MotionEvent_nativeOffsetLocation },
68091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    { "nativeGetXPrecision",
68191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            "(I)F",
68291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            (void*)android_view_MotionEvent_nativeGetXPrecision },
68391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    { "nativeGetYPrecision",
68491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            "(I)F",
68591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            (void*)android_view_MotionEvent_nativeGetYPrecision },
68691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    { "nativeGetDownTimeNanos",
68791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            "(I)J",
68891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            (void*)android_view_MotionEvent_nativeGetDownTimeNanos },
68991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    { "nativeGetPointerCount",
69091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            "(I)I",
69191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            (void*)android_view_MotionEvent_nativeGetPointerCount },
69291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    { "nativeGetPointerId",
69391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            "(II)I",
69491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            (void*)android_view_MotionEvent_nativeGetPointerId },
69591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    { "nativeFindPointerIndex",
69691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            "(II)I",
69791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            (void*)android_view_MotionEvent_nativeFindPointerIndex },
69891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    { "nativeGetHistorySize",
69991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            "(I)I",
70091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            (void*)android_view_MotionEvent_nativeGetHistorySize },
70191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    { "nativeGetEventTimeNanos",
70291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            "(II)J",
70391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            (void*)android_view_MotionEvent_nativeGetEventTimeNanos },
70491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    { "nativeGetRawAxisValue",
70591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            "(IIII)F",
70691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            (void*)android_view_MotionEvent_nativeGetRawAxisValue },
70791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    { "nativeGetAxisValue",
70891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            "(IIII)F",
70991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            (void*)android_view_MotionEvent_nativeGetAxisValue },
71091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    { "nativeGetPointerCoords",
71191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            "(IIILandroid/view/MotionEvent$PointerCoords;)V",
71291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            (void*)android_view_MotionEvent_nativeGetPointerCoords },
71391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    { "nativeScale",
71491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            "(IF)V",
71591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            (void*)android_view_MotionEvent_nativeScale },
71620e987bfc35d0ae6cb6344ead65ed44ee7cf8750Jeff Brown    { "nativeTransform",
71791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            "(ILandroid/graphics/Matrix;)V",
71820e987bfc35d0ae6cb6344ead65ed44ee7cf8750Jeff Brown            (void*)android_view_MotionEvent_nativeTransform },
71991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    { "nativeReadFromParcel",
72091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            "(ILandroid/os/Parcel;)I",
72191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            (void*)android_view_MotionEvent_nativeReadFromParcel },
72291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    { "nativeWriteToParcel",
72391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            "(ILandroid/os/Parcel;)V",
72491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            (void*)android_view_MotionEvent_nativeWriteToParcel },
72520e987bfc35d0ae6cb6344ead65ed44ee7cf8750Jeff Brown};
72620e987bfc35d0ae6cb6344ead65ed44ee7cf8750Jeff Brown
72746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#define FIND_CLASS(var, className) \
72846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        var = env->FindClass(className); \
72917cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro        LOG_FATAL_IF(! var, "Unable to find class " className);
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");
74917cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro    gMotionEventClassInfo.clazz = jclass(env->NewGlobalRef(gMotionEventClassInfo.clazz));
75046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
75146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    GET_STATIC_METHOD_ID(gMotionEventClassInfo.obtain, gMotionEventClassInfo.clazz,
75291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            "obtain", "()Landroid/view/MotionEvent;");
75346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    GET_METHOD_ID(gMotionEventClassInfo.recycle, gMotionEventClassInfo.clazz,
75446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            "recycle", "()V");
75591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    GET_FIELD_ID(gMotionEventClassInfo.mNativePtr, gMotionEventClassInfo.clazz,
75691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            "mNativePtr", "I");
75791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
75817cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro    jclass clazz;
75917cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro    FIND_CLASS(clazz, "android/view/MotionEvent$PointerCoords");
76091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
76117cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro    GET_FIELD_ID(gPointerCoordsClassInfo.mPackedAxisBits, clazz,
7626f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            "mPackedAxisBits", "J");
76317cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro    GET_FIELD_ID(gPointerCoordsClassInfo.mPackedAxisValues, clazz,
76491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            "mPackedAxisValues", "[F");
76517cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro    GET_FIELD_ID(gPointerCoordsClassInfo.x, clazz,
76691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            "x", "F");
76717cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro    GET_FIELD_ID(gPointerCoordsClassInfo.y, clazz,
76891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            "y", "F");
76917cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro    GET_FIELD_ID(gPointerCoordsClassInfo.pressure, clazz,
77091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            "pressure", "F");
77117cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro    GET_FIELD_ID(gPointerCoordsClassInfo.size, clazz,
77291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            "size", "F");
77317cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro    GET_FIELD_ID(gPointerCoordsClassInfo.touchMajor, clazz,
77491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            "touchMajor", "F");
77517cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro    GET_FIELD_ID(gPointerCoordsClassInfo.touchMinor, clazz,
77691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            "touchMinor", "F");
77717cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro    GET_FIELD_ID(gPointerCoordsClassInfo.toolMajor, clazz,
77891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            "toolMajor", "F");
77917cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro    GET_FIELD_ID(gPointerCoordsClassInfo.toolMinor, clazz,
78091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            "toolMinor", "F");
78117cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro    GET_FIELD_ID(gPointerCoordsClassInfo.orientation, clazz,
78291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            "orientation", "F");
78346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
78446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    return 0;
78546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
78646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
78746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} // namespace android
788