diff options
author | Jeff Brown <jeffbrown@google.com> | 2010-11-18 20:53:46 -0800 |
---|---|---|
committer | Jeff Brown <jeffbrown@google.com> | 2010-11-30 18:50:17 -0800 |
commit | 1f2451007c660091b7b090c1ea332f9044515d2d (patch) | |
tree | eddeaa59b0443b271353cd731e9ce7ce5b1cd993 /core/jni/android_view_MotionEvent.cpp | |
parent | 47e6b1b5eef8ee99872f278f66bc498c4fcca0d8 (diff) | |
download | frameworks_base-1f2451007c660091b7b090c1ea332f9044515d2d.zip frameworks_base-1f2451007c660091b7b090c1ea332f9044515d2d.tar.gz frameworks_base-1f2451007c660091b7b090c1ea332f9044515d2d.tar.bz2 |
Ensure the ShortcutManager uses the correct key character map.
The ShortcutManager used to only receive the key code of the key event
that triggered the shortcut. This change now provides the shortcut
manager with the whole key event so it can look up the associated
character using the correct key character map.
To make this more efficient, added a mechanism for recycling
key events. At the moment it is only used by key events owned by the
system process, since clients of the existing API (such as Views)
might continue to hold on to key events after dispatch has finished so
they would break if the key event were recycled by the framework.
Deprecated KeyCharacterMap.BUILT_IN_KEYBOARD.
Change-Id: I4313725dd63f2be01c350c005a41c7fde9bc67e8
Diffstat (limited to 'core/jni/android_view_MotionEvent.cpp')
-rw-r--r-- | core/jni/android_view_MotionEvent.cpp | 28 |
1 files changed, 19 insertions, 9 deletions
diff --git a/core/jni/android_view_MotionEvent.cpp b/core/jni/android_view_MotionEvent.cpp index 537ac72..f32f0ff 100644 --- a/core/jni/android_view_MotionEvent.cpp +++ b/core/jni/android_view_MotionEvent.cpp @@ -169,7 +169,7 @@ jobject android_view_MotionEvent_fromNative(JNIEnv* env, const MotionEvent* even return eventObj; } -void android_view_MotionEvent_toNative(JNIEnv* env, jobject eventObj, +status_t android_view_MotionEvent_toNative(JNIEnv* env, jobject eventObj, MotionEvent* event) { jint deviceId = env->GetIntField(eventObj, gMotionEventClassInfo.mDeviceId); jint source = env->GetIntField(eventObj, gMotionEventClassInfo.mSource); @@ -184,6 +184,16 @@ void android_view_MotionEvent_toNative(JNIEnv* env, jobject eventObj, jint flags = env->GetIntField(eventObj, gMotionEventClassInfo.mFlags); jint numPointers = env->GetIntField(eventObj, gMotionEventClassInfo.mNumPointers); jint numSamples = env->GetIntField(eventObj, gMotionEventClassInfo.mNumSamples); + + if (numPointers == 0) { + LOGE("Malformed MotionEvent: mNumPointers was zero"); + return BAD_VALUE; + } + if (numSamples == 0) { + LOGE("Malformed MotionEvent: mNumSamples was zero"); + return BAD_VALUE; + } + jintArray pointerIdentifierArray = jintArray(env->GetObjectField(eventObj, gMotionEventClassInfo.mPointerIdentifiers)); jfloatArray dataSampleArray = jfloatArray(env->GetObjectField(eventObj, @@ -191,9 +201,6 @@ void android_view_MotionEvent_toNative(JNIEnv* env, jobject eventObj, jlongArray eventTimeNanoSampleArray = jlongArray(env->GetObjectField(eventObj, gMotionEventClassInfo.mEventTimeNanoSamples)); - LOG_FATAL_IF(numPointers == 0, "numPointers was zero"); - LOG_FATAL_IF(numSamples == 0, "numSamples was zero"); - jint* pointerIdentifiers = (jint*)env->GetPrimitiveArrayCritical(pointerIdentifierArray, NULL); jfloat* dataSamples = (jfloat*)env->GetPrimitiveArrayCritical(dataSampleArray, NULL); jlong* eventTimeNanoSamples = (jlong*)env->GetPrimitiveArrayCritical( @@ -236,22 +243,25 @@ void android_view_MotionEvent_toNative(JNIEnv* env, jobject eventObj, event->addSample(sampleEventTime, samplePointerCoords); } - env->ReleasePrimitiveArrayCritical(pointerIdentifierArray, pointerIdentifiers, JNI_ABORT); - env->ReleasePrimitiveArrayCritical(dataSampleArray, dataSamples, JNI_ABORT); env->ReleasePrimitiveArrayCritical(eventTimeNanoSampleArray, eventTimeNanoSamples, JNI_ABORT); + env->ReleasePrimitiveArrayCritical(dataSampleArray, dataSamples, JNI_ABORT); + env->ReleasePrimitiveArrayCritical(pointerIdentifierArray, pointerIdentifiers, JNI_ABORT); - env->DeleteLocalRef(pointerIdentifierArray); - env->DeleteLocalRef(dataSampleArray); env->DeleteLocalRef(eventTimeNanoSampleArray); + env->DeleteLocalRef(dataSampleArray); + env->DeleteLocalRef(pointerIdentifierArray); + return OK; } -void android_view_MotionEvent_recycle(JNIEnv* env, jobject eventObj) { +status_t android_view_MotionEvent_recycle(JNIEnv* env, jobject eventObj) { env->CallVoidMethod(eventObj, gMotionEventClassInfo.recycle); if (env->ExceptionCheck()) { LOGW("An exception occurred while recycling a motion event."); LOGW_EX(env); env->ExceptionClear(); + return UNKNOWN_ERROR; } + return OK; } static inline float transformAngle(const SkMatrix* matrix, float angleRadians) { |