android_view_KeyEvent.cpp revision 87eac99a21772ae56018cb81db6966557b459554
193a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein/* 293a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein * Copyright (C) 2010 The Android Open Source Project 393a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein * 493a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein * Licensed under the Apache License, Version 2.0 (the "License"); 593a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein * you may not use this file except in compliance with the License. 693a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein * You may obtain a copy of the License at 793a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein * 893a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein * http://www.apache.org/licenses/LICENSE-2.0 993a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein * 1093a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein * Unless required by applicable law or agreed to in writing, software 1193a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein * distributed under the License is distributed on an "AS IS" BASIS, 1293a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1393a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein * See the License for the specific language governing permissions and 1493a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein * limitations under the License. 1593a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein */ 1693a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein 1793a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein#define LOG_TAG "KeyEvent-JNI" 1893a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein 1993a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein#include "JNIHelp.h" 2093a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein 2193a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein#include <android_runtime/AndroidRuntime.h> 2293a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein#include <android_runtime/Log.h> 2393a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein#include <utils/Log.h> 2493a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein#include <input/Input.h> 2593a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein#include "android_view_KeyEvent.h" 2693a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein 275030ae34cd5978a8ab8a06f6c3b69b8645873122Mark Weinamespace android { 285030ae34cd5978a8ab8a06f6c3b69b8645873122Mark Wei 2993a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein// ---------------------------------------------------------------------------- 3093a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein 3193a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzsteinstatic struct { 3293a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein jclass clazz; 3393a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein 3493a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein jmethodID obtain; 3593a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein jmethodID recycle; 365030ae34cd5978a8ab8a06f6c3b69b8645873122Mark Wei 3793a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein jfieldID mDeviceId; 3893a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein jfieldID mSource; 3993a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein jfieldID mMetaState; 4093a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein jfieldID mAction; 4193a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein jfieldID mKeyCode; 4293a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein jfieldID mScanCode; 4393a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein jfieldID mRepeatCount; 445030ae34cd5978a8ab8a06f6c3b69b8645873122Mark Wei jfieldID mFlags; 455030ae34cd5978a8ab8a06f6c3b69b8645873122Mark Wei jfieldID mDownTime; 465030ae34cd5978a8ab8a06f6c3b69b8645873122Mark Wei jfieldID mEventTime; 475030ae34cd5978a8ab8a06f6c3b69b8645873122Mark Wei jfieldID mCharacters; 4893a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein} gKeyEventClassInfo; 4993a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein 505030ae34cd5978a8ab8a06f6c3b69b8645873122Mark Wei// ---------------------------------------------------------------------------- 515030ae34cd5978a8ab8a06f6c3b69b8645873122Mark Wei 525030ae34cd5978a8ab8a06f6c3b69b8645873122Mark Weijobject android_view_KeyEvent_fromNative(JNIEnv* env, const KeyEvent* event) { 5393a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein jobject eventObj = env->CallStaticObjectMethod(gKeyEventClassInfo.clazz, 5493a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein gKeyEventClassInfo.obtain, 5593a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein nanoseconds_to_milliseconds(event->getDownTime()), 5693a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein nanoseconds_to_milliseconds(event->getEventTime()), 5793a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein event->getAction(), 5893a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein event->getKeyCode(), 5993a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein event->getRepeatCount(), 6093a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein event->getMetaState(), 6193a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein event->getDeviceId(), 6293a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein event->getScanCode(), 6393a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein event->getFlags(), 6493a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein event->getSource(), 6593a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein NULL); 6693a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein if (env->ExceptionCheck()) { 6793a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein ALOGE("An exception occurred while obtaining a key event."); 6893a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein LOGE_EX(env); 6993a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein env->ExceptionClear(); 7093a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein return NULL; 7109f46006437e7de33afdb51192bf0bdc08e97040Mark Wei } 7209f46006437e7de33afdb51192bf0bdc08e97040Mark Wei return eventObj; 7309f46006437e7de33afdb51192bf0bdc08e97040Mark Wei} 7409f46006437e7de33afdb51192bf0bdc08e97040Mark Wei 7593a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzsteinstatus_t android_view_KeyEvent_toNative(JNIEnv* env, jobject eventObj, 7693a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein KeyEvent* event) { 7793a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein jint deviceId = env->GetIntField(eventObj, gKeyEventClassInfo.mDeviceId); 7893a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein jint source = env->GetIntField(eventObj, gKeyEventClassInfo.mSource); 795030ae34cd5978a8ab8a06f6c3b69b8645873122Mark Wei jint metaState = env->GetIntField(eventObj, gKeyEventClassInfo.mMetaState); 805030ae34cd5978a8ab8a06f6c3b69b8645873122Mark Wei jint action = env->GetIntField(eventObj, gKeyEventClassInfo.mAction); 815030ae34cd5978a8ab8a06f6c3b69b8645873122Mark Wei jint keyCode = env->GetIntField(eventObj, gKeyEventClassInfo.mKeyCode); 825030ae34cd5978a8ab8a06f6c3b69b8645873122Mark Wei jint scanCode = env->GetIntField(eventObj, gKeyEventClassInfo.mScanCode); 8393a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein jint repeatCount = env->GetIntField(eventObj, gKeyEventClassInfo.mRepeatCount); 8493a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein jint flags = env->GetIntField(eventObj, gKeyEventClassInfo.mFlags); 8593a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein jlong downTime = env->GetLongField(eventObj, gKeyEventClassInfo.mDownTime); 8693a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein jlong eventTime = env->GetLongField(eventObj, gKeyEventClassInfo.mEventTime); 8793a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein 8893a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein event->initialize(deviceId, source, action, flags, keyCode, scanCode, metaState, repeatCount, 8993a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein milliseconds_to_nanoseconds(downTime), 9093a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein milliseconds_to_nanoseconds(eventTime)); 9193a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein return OK; 9293a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein} 9393a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein 9493a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzsteinstatus_t android_view_KeyEvent_recycle(JNIEnv* env, jobject eventObj) { 9593a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein env->CallVoidMethod(eventObj, gKeyEventClassInfo.recycle); 9693a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein if (env->ExceptionCheck()) { 975030ae34cd5978a8ab8a06f6c3b69b8645873122Mark Wei ALOGW("An exception occurred while recycling a key event."); 98df3da61c8f2f54604376d9761649bdba54aa858bMark Wei LOGW_EX(env); 99cd728097ff189542877a2952879a3aa3c6cb5666Mark Wei env->ExceptionClear(); 100df3da61c8f2f54604376d9761649bdba54aa858bMark Wei return UNKNOWN_ERROR; 1015030ae34cd5978a8ab8a06f6c3b69b8645873122Mark Wei } 10293a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein return OK; 10393a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein} 10493a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein 10593a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzsteinstatic jboolean native_isSystemKey(JNIEnv* env, jobject clazz, jint keyCode) { 10693a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein return KeyEvent::isSystemKey(keyCode); 10793a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein} 10893a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein 10993a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzsteinstatic jboolean native_hasDefaultAction(JNIEnv* env, jobject clazz, jint keyCode) { 11093a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein return KeyEvent::hasDefaultAction(keyCode); 11193a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein} 11293a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein 11393a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein 11493a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein// ---------------------------------------------------------------------------- 11593a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein 11693a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzsteinstatic const JNINativeMethod g_methods[] = { 1175030ae34cd5978a8ab8a06f6c3b69b8645873122Mark Wei { "native_isSystemKey", "(I)Z", (void*)native_isSystemKey }, 11893a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein { "native_hasDefaultAction", "(I)Z", (void*)native_hasDefaultAction }, 11993a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein}; 12093a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein 12193a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein#define FIND_CLASS(var, className) \ 12293a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein var = env->FindClass(className); \ 12393a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein LOG_FATAL_IF(! var, "Unable to find class " className); \ 12493a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein var = jclass(env->NewGlobalRef(var)); 12593a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein 12693a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein#define GET_STATIC_METHOD_ID(var, clazz, methodName, fieldDescriptor) \ 12793a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein var = env->GetStaticMethodID(clazz, methodName, fieldDescriptor); \ 12893a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein LOG_FATAL_IF(! var, "Unable to find static method" methodName); 12993a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein 13093a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein#define GET_METHOD_ID(var, clazz, methodName, fieldDescriptor) \ 13193a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein var = env->GetMethodID(clazz, methodName, fieldDescriptor); \ 13293a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein LOG_FATAL_IF(! var, "Unable to find method" methodName); 13393a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein 13493a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein#define GET_FIELD_ID(var, clazz, fieldName, fieldDescriptor) \ 1355030ae34cd5978a8ab8a06f6c3b69b8645873122Mark Wei var = env->GetFieldID(clazz, fieldName, fieldDescriptor); \ 13693a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein LOG_FATAL_IF(! var, "Unable to find field " fieldName); 13793a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein 13893a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzsteinint register_android_view_KeyEvent(JNIEnv* env) { 13993a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein FIND_CLASS(gKeyEventClassInfo.clazz, "android/view/KeyEvent"); 14093a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein 14193a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein GET_STATIC_METHOD_ID(gKeyEventClassInfo.obtain, gKeyEventClassInfo.clazz, 14293a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein "obtain", "(JJIIIIIIIILjava/lang/String;)Landroid/view/KeyEvent;"); 14393a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein GET_METHOD_ID(gKeyEventClassInfo.recycle, gKeyEventClassInfo.clazz, 14493a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein "recycle", "()V"); 145d732a611bd661fc2ac3c801a545cfbba0f179484Mark Wei 14693a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein GET_FIELD_ID(gKeyEventClassInfo.mDeviceId, gKeyEventClassInfo.clazz, 14793a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein "mDeviceId", "I"); 14893a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein GET_FIELD_ID(gKeyEventClassInfo.mSource, gKeyEventClassInfo.clazz, 14993a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein "mSource", "I"); 15093a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein GET_FIELD_ID(gKeyEventClassInfo.mMetaState, gKeyEventClassInfo.clazz, 15193a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein "mMetaState", "I"); 15293a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein GET_FIELD_ID(gKeyEventClassInfo.mAction, gKeyEventClassInfo.clazz, 15393a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein "mAction", "I"); 15493a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein GET_FIELD_ID(gKeyEventClassInfo.mKeyCode, gKeyEventClassInfo.clazz, 1555030ae34cd5978a8ab8a06f6c3b69b8645873122Mark Wei "mKeyCode", "I"); 1565030ae34cd5978a8ab8a06f6c3b69b8645873122Mark Wei GET_FIELD_ID(gKeyEventClassInfo.mScanCode, gKeyEventClassInfo.clazz, 1575030ae34cd5978a8ab8a06f6c3b69b8645873122Mark Wei "mScanCode", "I"); 1585030ae34cd5978a8ab8a06f6c3b69b8645873122Mark Wei GET_FIELD_ID(gKeyEventClassInfo.mRepeatCount, gKeyEventClassInfo.clazz, 1595030ae34cd5978a8ab8a06f6c3b69b8645873122Mark Wei "mRepeatCount", "I"); 16093a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein GET_FIELD_ID(gKeyEventClassInfo.mFlags, gKeyEventClassInfo.clazz, 16193a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein "mFlags", "I"); 16293a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein GET_FIELD_ID(gKeyEventClassInfo.mDownTime, gKeyEventClassInfo.clazz, 16393a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein "mDownTime", "J"); 16493a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein GET_FIELD_ID(gKeyEventClassInfo.mEventTime, gKeyEventClassInfo.clazz, 16593a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein "mEventTime", "J"); 1665030ae34cd5978a8ab8a06f6c3b69b8645873122Mark Wei GET_FIELD_ID(gKeyEventClassInfo.mCharacters, gKeyEventClassInfo.clazz, 16793a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein "mCharacters", "Ljava/lang/String;"); 16893a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein 16993a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein return AndroidRuntime::registerNativeMethods( 17093a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein env, "android/view/KeyEvent", g_methods, NELEM(g_methods)); 17193a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein} 17293a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein 17393a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein} // namespace android 17493a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein