diff options
Diffstat (limited to 'core/jni/android_app_NativeActivity.cpp')
-rw-r--r-- | core/jni/android_app_NativeActivity.cpp | 22 |
1 files changed, 13 insertions, 9 deletions
diff --git a/core/jni/android_app_NativeActivity.cpp b/core/jni/android_app_NativeActivity.cpp index a586f49..695d50a4 100644 --- a/core/jni/android_app_NativeActivity.cpp +++ b/core/jni/android_app_NativeActivity.cpp @@ -195,7 +195,7 @@ int32_t AInputQueue::getEvent(AInputEvent** outEvent) { mLock.unlock(); if (finishNow) { - finishEvent(*outEvent, true); + finishEvent(*outEvent, true, false); *outEvent = NULL; return -1; } else if (*outEvent != NULL) { @@ -215,7 +215,7 @@ int32_t AInputQueue::getEvent(AInputEvent** outEvent) { if (res != android::OK) { LOGW("channel '%s' ~ Failed to consume input event. status=%d", mConsumer.getChannel()->getName().string(), res); - mConsumer.sendFinishedSignal(); + mConsumer.sendFinishedSignal(false); return -1; } @@ -245,10 +245,12 @@ bool AInputQueue::preDispatchEvent(AInputEvent* event) { return preDispatchKey((KeyEvent*)event); } -void AInputQueue::finishEvent(AInputEvent* event, bool handled) { - LOG_TRACE("finishEvent: %p handled=%d", event, handled ? 1 : 0); +void AInputQueue::finishEvent(AInputEvent* event, bool handled, bool didDefaultHandling) { + LOG_TRACE("finishEvent: %p handled=%d, didDefaultHandling=%d", event, + handled ? 1 : 0, didDefaultHandling ? 1 : 0); - if (!handled && ((InputEvent*)event)->getType() == AINPUT_EVENT_TYPE_KEY + if (!handled && !didDefaultHandling + && ((InputEvent*)event)->getType() == AINPUT_EVENT_TYPE_KEY && ((KeyEvent*)event)->hasDefaultAction()) { // The app didn't handle this, but it may have a default action // associated with it. We need to hand this back to Java to be @@ -263,7 +265,7 @@ void AInputQueue::finishEvent(AInputEvent* event, bool handled) { const in_flight_event& inflight(mInFlightEvents[i]); if (inflight.event == event) { if (inflight.doFinish) { - int32_t res = mConsumer.sendFinishedSignal(); + int32_t res = mConsumer.sendFinishedSignal(handled); if (res != android::OK) { LOGW("Failed to send finished signal on channel '%s'. status=%d", mConsumer.getChannel()->getName().string(), res); @@ -577,10 +579,11 @@ static int mainWorkCallback(int fd, int events, void* data) { while ((keyEvent=code->nativeInputQueue->consumeUnhandledEvent()) != NULL) { jobject inputEventObj = android_view_KeyEvent_fromNative( code->env, keyEvent); - code->env->CallVoidMethod(code->clazz, + jboolean handled = code->env->CallBooleanMethod(code->clazz, gNativeActivityClassInfo.dispatchUnhandledKeyEvent, inputEventObj); checkAndClearExceptionFromCallback(code->env, "dispatchUnhandledKeyEvent"); - code->nativeInputQueue->finishEvent(keyEvent, true); + code->env->DeleteLocalRef(inputEventObj); + code->nativeInputQueue->finishEvent(keyEvent, handled, true); } int seq; while ((keyEvent=code->nativeInputQueue->consumePreDispatchingEvent(&seq)) != NULL) { @@ -589,6 +592,7 @@ static int mainWorkCallback(int fd, int events, void* data) { code->env->CallVoidMethod(code->clazz, gNativeActivityClassInfo.preDispatchKeyEvent, inputEventObj, seq); checkAndClearExceptionFromCallback(code->env, "preDispatchKeyEvent"); + code->env->DeleteLocalRef(inputEventObj); } } break; case CMD_FINISH: { @@ -1044,7 +1048,7 @@ int register_android_app_NativeActivity(JNIEnv* env) GET_METHOD_ID(gNativeActivityClassInfo.dispatchUnhandledKeyEvent, gNativeActivityClassInfo.clazz, - "dispatchUnhandledKeyEvent", "(Landroid/view/KeyEvent;)V"); + "dispatchUnhandledKeyEvent", "(Landroid/view/KeyEvent;)Z"); GET_METHOD_ID(gNativeActivityClassInfo.preDispatchKeyEvent, gNativeActivityClassInfo.clazz, "preDispatchKeyEvent", "(Landroid/view/KeyEvent;I)V"); |