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_app_NativeActivity.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_app_NativeActivity.cpp')
-rw-r--r-- | core/jni/android_app_NativeActivity.cpp | 33 |
1 files changed, 24 insertions, 9 deletions
diff --git a/core/jni/android_app_NativeActivity.cpp b/core/jni/android_app_NativeActivity.cpp index 695d50a4..b033878 100644 --- a/core/jni/android_app_NativeActivity.cpp +++ b/core/jni/android_app_NativeActivity.cpp @@ -579,20 +579,30 @@ static int mainWorkCallback(int fd, int events, void* data) { while ((keyEvent=code->nativeInputQueue->consumeUnhandledEvent()) != NULL) { jobject inputEventObj = android_view_KeyEvent_fromNative( code->env, keyEvent); - jboolean handled = code->env->CallBooleanMethod(code->clazz, - gNativeActivityClassInfo.dispatchUnhandledKeyEvent, inputEventObj); - checkAndClearExceptionFromCallback(code->env, "dispatchUnhandledKeyEvent"); - code->env->DeleteLocalRef(inputEventObj); + jboolean handled; + if (inputEventObj) { + handled = code->env->CallBooleanMethod(code->clazz, + gNativeActivityClassInfo.dispatchUnhandledKeyEvent, inputEventObj); + checkAndClearExceptionFromCallback(code->env, "dispatchUnhandledKeyEvent"); + code->env->DeleteLocalRef(inputEventObj); + } else { + LOGE("Failed to obtain key event for dispatchUnhandledKeyEvent."); + handled = false; + } code->nativeInputQueue->finishEvent(keyEvent, handled, true); } int seq; while ((keyEvent=code->nativeInputQueue->consumePreDispatchingEvent(&seq)) != NULL) { jobject inputEventObj = android_view_KeyEvent_fromNative( code->env, keyEvent); - code->env->CallVoidMethod(code->clazz, - gNativeActivityClassInfo.preDispatchKeyEvent, inputEventObj, seq); - checkAndClearExceptionFromCallback(code->env, "preDispatchKeyEvent"); - code->env->DeleteLocalRef(inputEventObj); + if (inputEventObj) { + code->env->CallVoidMethod(code->clazz, + gNativeActivityClassInfo.preDispatchKeyEvent, inputEventObj, seq); + checkAndClearExceptionFromCallback(code->env, "preDispatchKeyEvent"); + code->env->DeleteLocalRef(inputEventObj); + } else { + LOGE("Failed to obtain key event for preDispatchKeyEvent."); + } } } break; case CMD_FINISH: { @@ -987,7 +997,12 @@ dispatchKeyEvent_native(JNIEnv* env, jobject clazz, jint handle, jobject eventOb NativeCode* code = (NativeCode*)handle; if (code->nativeInputQueue != NULL) { KeyEvent* event = code->nativeInputQueue->createKeyEvent(); - android_view_KeyEvent_toNative(env, eventObj, event); + status_t status = android_view_KeyEvent_toNative(env, eventObj, event); + if (status) { + delete event; + jniThrowRuntimeException(env, "Could not read contents of KeyEvent object."); + return; + } code->nativeInputQueue->dispatchEvent(event); } } |