android_view_KeyEvent.cpp revision 3c80a4a044865bdf1289c7896baffa1c082d835c
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 "KeyEvent-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_KeyEvent.h"
2546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
2646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownnamespace android {
2746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
2846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown// ----------------------------------------------------------------------------
2946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
3046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownstatic struct {
3146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    jclass clazz;
3246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
3346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    jmethodID ctor;
3446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
3546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    jfieldID mMetaState;
3646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    jfieldID mAction;
3746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    jfieldID mKeyCode;
3846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    jfieldID mScanCode;
3946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    jfieldID mRepeatCount;
4046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    jfieldID mDeviceId;
4146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    jfieldID mFlags;
4246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    jfieldID mDownTime;
4346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    jfieldID mEventTime;
4446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    jfieldID mCharacters;
4546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} gKeyEventClassInfo;
4646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
4746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown// ----------------------------------------------------------------------------
4846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
4946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownjobject android_view_KeyEvent_fromNative(JNIEnv* env, const KeyEvent* event) {
5046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    return env->NewObject(gKeyEventClassInfo.clazz, gKeyEventClassInfo.ctor,
5146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            nanoseconds_to_milliseconds(event->getDownTime()),
5246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            nanoseconds_to_milliseconds(event->getEventTime()),
5346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            event->getAction(),
5446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            event->getKeyCode(),
5546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            event->getRepeatCount(),
5646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            event->getMetaState(),
5746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            event->getDeviceId(),
5846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            event->getScanCode(),
5946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            event->getFlags());
6046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
6146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
6246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownvoid android_view_KeyEvent_toNative(JNIEnv* env, jobject eventObj, int32_t nature,
6346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        KeyEvent* event) {
6446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    jint metaState = env->GetIntField(eventObj, gKeyEventClassInfo.mMetaState);
6546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    jint action = env->GetIntField(eventObj, gKeyEventClassInfo.mAction);
6646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    jint keyCode = env->GetIntField(eventObj, gKeyEventClassInfo.mKeyCode);
6746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    jint scanCode = env->GetIntField(eventObj, gKeyEventClassInfo.mScanCode);
6846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    jint repeatCount = env->GetIntField(eventObj, gKeyEventClassInfo.mRepeatCount);
6946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    jint deviceId = env->GetIntField(eventObj, gKeyEventClassInfo.mDeviceId);
7046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    jint flags = env->GetIntField(eventObj, gKeyEventClassInfo.mFlags);
7146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    jlong downTime = env->GetLongField(eventObj, gKeyEventClassInfo.mDownTime);
7246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    jlong eventTime = env->GetLongField(eventObj, gKeyEventClassInfo.mEventTime);
7346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
7446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    event->initialize(deviceId, nature, action, flags, keyCode, scanCode, metaState, repeatCount,
7546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            milliseconds_to_nanoseconds(downTime),
7646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            milliseconds_to_nanoseconds(eventTime));
7746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
7846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
793c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackbornstatic jboolean native_isSystemKey(JNIEnv* env, jobject clazz, jint keyCode) {
803c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn    return KeyEvent::isSystemKey(keyCode);
813c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn}
823c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn
833c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackbornstatic jboolean native_hasDefaultAction(JNIEnv* env, jobject clazz, jint keyCode) {
843c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn    return KeyEvent::hasDefaultAction(keyCode);
853c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn}
863c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn
8746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown// ----------------------------------------------------------------------------
8846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
893c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackbornstatic const JNINativeMethod g_methods[] = {
903c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn    { "native_isSystemKey", "(I)Z", (void*)native_isSystemKey },
913c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn    { "native_hasDefaultAction", "(I)Z", (void*)native_hasDefaultAction },
923c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn};
933c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn
943c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackbornstatic const char* const kKeyEventPathName = "android/view/KeyEvent";
953c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn
9646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#define FIND_CLASS(var, className) \
9746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        var = env->FindClass(className); \
9846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        LOG_FATAL_IF(! var, "Unable to find class " className); \
9946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        var = jclass(env->NewGlobalRef(var));
10046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
10146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#define GET_METHOD_ID(var, clazz, methodName, fieldDescriptor) \
10246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        var = env->GetMethodID(clazz, methodName, fieldDescriptor); \
10346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        LOG_FATAL_IF(! var, "Unable to find method" methodName);
10446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
10546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#define GET_FIELD_ID(var, clazz, fieldName, fieldDescriptor) \
10646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        var = env->GetFieldID(clazz, fieldName, fieldDescriptor); \
10746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        LOG_FATAL_IF(! var, "Unable to find field " fieldName);
10846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
10946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownint register_android_view_KeyEvent(JNIEnv* env) {
1103c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn    FIND_CLASS(gKeyEventClassInfo.clazz, kKeyEventPathName);
1113c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn
11246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    GET_METHOD_ID(gKeyEventClassInfo.ctor, gKeyEventClassInfo.clazz,
11346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            "<init>", "(JJIIIIIII)V");
11446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
11546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    GET_FIELD_ID(gKeyEventClassInfo.mMetaState, gKeyEventClassInfo.clazz,
11646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            "mMetaState", "I");
11746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    GET_FIELD_ID(gKeyEventClassInfo.mAction, gKeyEventClassInfo.clazz,
11846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            "mAction", "I");
11946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    GET_FIELD_ID(gKeyEventClassInfo.mKeyCode, gKeyEventClassInfo.clazz,
12046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            "mKeyCode", "I");
12146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    GET_FIELD_ID(gKeyEventClassInfo.mScanCode, gKeyEventClassInfo.clazz,
12246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            "mScanCode", "I");
12346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    GET_FIELD_ID(gKeyEventClassInfo.mRepeatCount, gKeyEventClassInfo.clazz,
12446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            "mRepeatCount", "I");
12546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    GET_FIELD_ID(gKeyEventClassInfo.mDeviceId, gKeyEventClassInfo.clazz,
12646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            "mDeviceId", "I");
12746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    GET_FIELD_ID(gKeyEventClassInfo.mFlags, gKeyEventClassInfo.clazz,
12846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            "mFlags", "I");
12946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    GET_FIELD_ID(gKeyEventClassInfo.mDownTime, gKeyEventClassInfo.clazz,
13046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            "mDownTime", "J");
13146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    GET_FIELD_ID(gKeyEventClassInfo.mEventTime, gKeyEventClassInfo.clazz,
13246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            "mEventTime", "J");
13346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    GET_FIELD_ID(gKeyEventClassInfo.mCharacters, gKeyEventClassInfo.clazz,
13446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            "mCharacters", "Ljava/lang/String;");
13546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
1363c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn    return AndroidRuntime::registerNativeMethods(
1373c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn        env, kKeyEventPathName,
1383c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn        g_methods, NELEM(g_methods));
13946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
14046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
14146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} // namespace android
142