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