19f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown/* 29f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown * Copyright (C) 2012 The Android Open Source Project 39f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown * 49f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown * Licensed under the Apache License, Version 2.0 (the "License"); 59f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown * you may not use this file except in compliance with the License. 69f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown * You may obtain a copy of the License at 79f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown * 89f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown * http://www.apache.org/licenses/LICENSE-2.0 99f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown * 109f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown * Unless required by applicable law or agreed to in writing, software 119f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown * distributed under the License is distributed on an "AS IS" BASIS, 129f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown * See the License for the specific language governing permissions and 149f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown * limitations under the License. 159f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown */ 169f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown 179d3b1a424c5c61e24e9659d15fb353026a00d925Jeff Brown#include <input/Input.h> 189f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown 199f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown#include <android_runtime/AndroidRuntime.h> 209f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown#include <nativehelper/jni.h> 219f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown#include <nativehelper/JNIHelp.h> 229f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown 239f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown#include <ScopedLocalRef.h> 249f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown 259f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown#include "android_view_InputDevice.h" 269f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown#include "android_view_KeyCharacterMap.h" 279f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown 28987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe#include "core_jni_helpers.h" 29987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe 309f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brownnamespace android { 319f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown 329f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brownstatic struct { 339f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown jclass clazz; 349f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown 359f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown jmethodID ctor; 369f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown jmethodID addMotionRange; 379f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown} gInputDeviceClassInfo; 389f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown 399f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brownjobject android_view_InputDevice_create(JNIEnv* env, const InputDeviceInfo& deviceInfo) { 405bbd4b4f5fc19302fa017ad6afee6eb2d489d91aJeff Brown ScopedLocalRef<jstring> nameObj(env, env->NewStringUTF(deviceInfo.getDisplayName().string())); 419f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown if (!nameObj.get()) { 429f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown return NULL; 439f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown } 449f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown 459f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown ScopedLocalRef<jstring> descriptorObj(env, 465bbd4b4f5fc19302fa017ad6afee6eb2d489d91aJeff Brown env->NewStringUTF(deviceInfo.getIdentifier().descriptor.string())); 479f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown if (!descriptorObj.get()) { 489f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown return NULL; 499f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown } 509f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown 519f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown ScopedLocalRef<jobject> kcmObj(env, 529f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown android_view_KeyCharacterMap_create(env, deviceInfo.getId(), 539f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown deviceInfo.getKeyCharacterMap())); 549f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown if (!kcmObj.get()) { 559f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown return NULL; 569f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown } 579f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown 5854e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright const InputDeviceIdentifier& ident = deviceInfo.getIdentifier(); 5954e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright 606d85cf2bd7cba6890f1b2bb26073105c3b8fc432Tim Kilbourn // Not sure why, but JNI is complaining when I pass this through directly. 616d85cf2bd7cba6890f1b2bb26073105c3b8fc432Tim Kilbourn jboolean hasMic = deviceInfo.hasMic() ? JNI_TRUE : JNI_FALSE; 626d85cf2bd7cba6890f1b2bb26073105c3b8fc432Tim Kilbourn 639f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown ScopedLocalRef<jobject> inputDeviceObj(env, env->NewObject(gInputDeviceClassInfo.clazz, 6454e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright gInputDeviceClassInfo.ctor, deviceInfo.getId(), deviceInfo.getGeneration(), 6554e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright deviceInfo.getControllerNumber(), nameObj.get(), 6654e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright static_cast<int32_t>(ident.vendor), static_cast<int32_t>(ident.product), 676d85cf2bd7cba6890f1b2bb26073105c3b8fc432Tim Kilbourn descriptorObj.get(), deviceInfo.isExternal(), deviceInfo.getSources(), 686d85cf2bd7cba6890f1b2bb26073105c3b8fc432Tim Kilbourn deviceInfo.getKeyboardType(), kcmObj.get(), deviceInfo.hasVibrator(), 696d85cf2bd7cba6890f1b2bb26073105c3b8fc432Tim Kilbourn hasMic, deviceInfo.hasButtonUnderPad())); 709f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown 719f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown const Vector<InputDeviceInfo::MotionRange>& ranges = deviceInfo.getMotionRanges(); 729f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown for (size_t i = 0; i < ranges.size(); i++) { 739f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown const InputDeviceInfo::MotionRange& range = ranges.itemAt(i); 74c6091c64c90e9557ea58e0d7cf75915aea7c6c3eMichael Wright env->CallVoidMethod(inputDeviceObj.get(), gInputDeviceClassInfo.addMotionRange, range.axis, 75c6091c64c90e9557ea58e0d7cf75915aea7c6c3eMichael Wright range.source, range.min, range.max, range.flat, range.fuzz, range.resolution); 769f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown if (env->ExceptionCheck()) { 779f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown return NULL; 789f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown } 799f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown } 809f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown 819f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown return env->NewLocalRef(inputDeviceObj.get()); 829f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown} 839f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown 849f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown 859f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brownint register_android_view_InputDevice(JNIEnv* env) 869f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown{ 87987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe gInputDeviceClassInfo.clazz = FindClassOrDie(env, "android/view/InputDevice"); 88987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe gInputDeviceClassInfo.clazz = MakeGlobalRefOrDie(env, gInputDeviceClassInfo.clazz); 899f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown 90987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe gInputDeviceClassInfo.ctor = GetMethodIDOrDie(env, gInputDeviceClassInfo.clazz, "<init>", 916d85cf2bd7cba6890f1b2bb26073105c3b8fc432Tim Kilbourn "(IIILjava/lang/String;IILjava/lang/String;ZIILandroid/view/KeyCharacterMap;ZZZ)V"); 929f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown 93987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe gInputDeviceClassInfo.addMotionRange = GetMethodIDOrDie(env, gInputDeviceClassInfo.clazz, 94c6091c64c90e9557ea58e0d7cf75915aea7c6c3eMichael Wright "addMotionRange", "(IIFFFFF)V"); 959f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown 969f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown return 0; 979f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown} 989f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown 999f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown}; // namespace android 100