1928e054931d357326613c78e62f4d850b7c442ffJeff Brown/*
2928e054931d357326613c78e62f4d850b7c442ffJeff Brown * Copyright (C) 2011 The Android Open Source Project
3928e054931d357326613c78e62f4d850b7c442ffJeff Brown *
4928e054931d357326613c78e62f4d850b7c442ffJeff Brown * Licensed under the Apache License, Version 2.0 (the "License");
5928e054931d357326613c78e62f4d850b7c442ffJeff Brown * you may not use this file except in compliance with the License.
6928e054931d357326613c78e62f4d850b7c442ffJeff Brown * You may obtain a copy of the License at
7928e054931d357326613c78e62f4d850b7c442ffJeff Brown *
8928e054931d357326613c78e62f4d850b7c442ffJeff Brown *      http://www.apache.org/licenses/LICENSE-2.0
9928e054931d357326613c78e62f4d850b7c442ffJeff Brown *
10928e054931d357326613c78e62f4d850b7c442ffJeff Brown * Unless required by applicable law or agreed to in writing, software
11928e054931d357326613c78e62f4d850b7c442ffJeff Brown * distributed under the License is distributed on an "AS IS" BASIS,
12928e054931d357326613c78e62f4d850b7c442ffJeff Brown * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13928e054931d357326613c78e62f4d850b7c442ffJeff Brown * See the License for the specific language governing permissions and
14928e054931d357326613c78e62f4d850b7c442ffJeff Brown * limitations under the License.
15928e054931d357326613c78e62f4d850b7c442ffJeff Brown */
16928e054931d357326613c78e62f4d850b7c442ffJeff Brown
17928e054931d357326613c78e62f4d850b7c442ffJeff Brown#define LOG_TAG "InputWindowHandle"
18928e054931d357326613c78e62f4d850b7c442ffJeff Brown
19928e054931d357326613c78e62f4d850b7c442ffJeff Brown#include "JNIHelp.h"
20928e054931d357326613c78e62f4d850b7c442ffJeff Brown#include "jni.h"
21928e054931d357326613c78e62f4d850b7c442ffJeff Brown#include <android_runtime/AndroidRuntime.h>
22928e054931d357326613c78e62f4d850b7c442ffJeff Brown#include <utils/threads.h>
23928e054931d357326613c78e62f4d850b7c442ffJeff Brown
249302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown#include <android_view_InputChannel.h>
259302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown#include <android/graphics/Region.h>
269302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown
274532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown#include "com_android_server_input_InputWindowHandle.h"
284532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown#include "com_android_server_input_InputApplicationHandle.h"
29928e054931d357326613c78e62f4d850b7c442ffJeff Brown
30928e054931d357326613c78e62f4d850b7c442ffJeff Brownnamespace android {
31928e054931d357326613c78e62f4d850b7c442ffJeff Brown
32928e054931d357326613c78e62f4d850b7c442ffJeff Brownstatic struct {
33928e054931d357326613c78e62f4d850b7c442ffJeff Brown    jfieldID ptr;
34928e054931d357326613c78e62f4d850b7c442ffJeff Brown    jfieldID inputApplicationHandle;
359302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    jfieldID inputChannel;
369302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    jfieldID name;
379302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    jfieldID layoutParamsFlags;
389302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    jfieldID layoutParamsType;
399302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    jfieldID dispatchingTimeoutNanos;
409302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    jfieldID frameLeft;
419302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    jfieldID frameTop;
429302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    jfieldID frameRight;
439302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    jfieldID frameBottom;
449302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    jfieldID scaleFactor;
459302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    jfieldID touchableRegion;
469302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    jfieldID visible;
479302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    jfieldID canReceiveKeys;
489302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    jfieldID hasFocus;
499302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    jfieldID hasWallpaper;
509302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    jfieldID paused;
519302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    jfieldID layer;
529302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    jfieldID ownerPid;
539302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    jfieldID ownerUid;
549302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    jfieldID inputFeatures;
5583d616a9c7b9505153d258511eb5c16b552e268dJeff Brown    jfieldID displayId;
56928e054931d357326613c78e62f4d850b7c442ffJeff Brown} gInputWindowHandleClassInfo;
57928e054931d357326613c78e62f4d850b7c442ffJeff Brown
58928e054931d357326613c78e62f4d850b7c442ffJeff Brownstatic Mutex gHandleMutex;
59928e054931d357326613c78e62f4d850b7c442ffJeff Brown
60928e054931d357326613c78e62f4d850b7c442ffJeff Brown
61928e054931d357326613c78e62f4d850b7c442ffJeff Brown// --- NativeInputWindowHandle ---
62928e054931d357326613c78e62f4d850b7c442ffJeff Brown
63928e054931d357326613c78e62f4d850b7c442ffJeff BrownNativeInputWindowHandle::NativeInputWindowHandle(
64928e054931d357326613c78e62f4d850b7c442ffJeff Brown        const sp<InputApplicationHandle>& inputApplicationHandle, jweak objWeak) :
65928e054931d357326613c78e62f4d850b7c442ffJeff Brown        InputWindowHandle(inputApplicationHandle),
66928e054931d357326613c78e62f4d850b7c442ffJeff Brown        mObjWeak(objWeak) {
67928e054931d357326613c78e62f4d850b7c442ffJeff Brown}
68928e054931d357326613c78e62f4d850b7c442ffJeff Brown
69928e054931d357326613c78e62f4d850b7c442ffJeff BrownNativeInputWindowHandle::~NativeInputWindowHandle() {
70928e054931d357326613c78e62f4d850b7c442ffJeff Brown    JNIEnv* env = AndroidRuntime::getJNIEnv();
71928e054931d357326613c78e62f4d850b7c442ffJeff Brown    env->DeleteWeakGlobalRef(mObjWeak);
72928e054931d357326613c78e62f4d850b7c442ffJeff Brown}
73928e054931d357326613c78e62f4d850b7c442ffJeff Brown
74928e054931d357326613c78e62f4d850b7c442ffJeff Brownjobject NativeInputWindowHandle::getInputWindowHandleObjLocalRef(JNIEnv* env) {
75928e054931d357326613c78e62f4d850b7c442ffJeff Brown    return env->NewLocalRef(mObjWeak);
76928e054931d357326613c78e62f4d850b7c442ffJeff Brown}
77928e054931d357326613c78e62f4d850b7c442ffJeff Brown
78cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brownbool NativeInputWindowHandle::updateInfo() {
799302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    JNIEnv* env = AndroidRuntime::getJNIEnv();
809302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    jobject obj = env->NewLocalRef(mObjWeak);
819302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    if (!obj) {
82cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        releaseInfo();
839302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        return false;
849302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    }
859302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown
86cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown    if (!mInfo) {
87cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        mInfo = new InputWindowInfo();
88cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown    }
89cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown
909302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    jobject inputChannelObj = env->GetObjectField(obj,
919302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            gInputWindowHandleClassInfo.inputChannel);
929302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    if (inputChannelObj) {
93cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        mInfo->inputChannel = android_view_InputChannel_getInputChannel(env, inputChannelObj);
949302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        env->DeleteLocalRef(inputChannelObj);
959302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    } else {
96cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        mInfo->inputChannel.clear();
979302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    }
989302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown
999302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    jstring nameObj = jstring(env->GetObjectField(obj,
1009302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            gInputWindowHandleClassInfo.name));
1019302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    if (nameObj) {
1029302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        const char* nameStr = env->GetStringUTFChars(nameObj, NULL);
103cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        mInfo->name.setTo(nameStr);
1049302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        env->ReleaseStringUTFChars(nameObj, nameStr);
1059302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        env->DeleteLocalRef(nameObj);
1069302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    } else {
107cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        mInfo->name.setTo("<null>");
1089302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    }
1099302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown
110cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown    mInfo->layoutParamsFlags = env->GetIntField(obj,
1119302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            gInputWindowHandleClassInfo.layoutParamsFlags);
112cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown    mInfo->layoutParamsType = env->GetIntField(obj,
1139302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            gInputWindowHandleClassInfo.layoutParamsType);
114cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown    mInfo->dispatchingTimeout = env->GetLongField(obj,
1159302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            gInputWindowHandleClassInfo.dispatchingTimeoutNanos);
116cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown    mInfo->frameLeft = env->GetIntField(obj,
1179302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            gInputWindowHandleClassInfo.frameLeft);
118cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown    mInfo->frameTop = env->GetIntField(obj,
1199302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            gInputWindowHandleClassInfo.frameTop);
120cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown    mInfo->frameRight = env->GetIntField(obj,
1219302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            gInputWindowHandleClassInfo.frameRight);
122cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown    mInfo->frameBottom = env->GetIntField(obj,
1239302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            gInputWindowHandleClassInfo.frameBottom);
124cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown    mInfo->scaleFactor = env->GetFloatField(obj,
1259302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            gInputWindowHandleClassInfo.scaleFactor);
1269302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown
1279302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    jobject regionObj = env->GetObjectField(obj,
1289302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            gInputWindowHandleClassInfo.touchableRegion);
1299302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    if (regionObj) {
1309302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        SkRegion* region = android_graphics_Region_getSkRegion(env, regionObj);
131cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        mInfo->touchableRegion.set(*region);
1329302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        env->DeleteLocalRef(regionObj);
1339302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    } else {
134cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        mInfo->touchableRegion.setEmpty();
1359302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    }
1369302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown
137cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown    mInfo->visible = env->GetBooleanField(obj,
1389302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            gInputWindowHandleClassInfo.visible);
139cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown    mInfo->canReceiveKeys = env->GetBooleanField(obj,
1409302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            gInputWindowHandleClassInfo.canReceiveKeys);
141cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown    mInfo->hasFocus = env->GetBooleanField(obj,
1429302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            gInputWindowHandleClassInfo.hasFocus);
143cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown    mInfo->hasWallpaper = env->GetBooleanField(obj,
1449302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            gInputWindowHandleClassInfo.hasWallpaper);
145cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown    mInfo->paused = env->GetBooleanField(obj,
1469302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            gInputWindowHandleClassInfo.paused);
147cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown    mInfo->layer = env->GetIntField(obj,
1489302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            gInputWindowHandleClassInfo.layer);
149cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown    mInfo->ownerPid = env->GetIntField(obj,
1509302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            gInputWindowHandleClassInfo.ownerPid);
151cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown    mInfo->ownerUid = env->GetIntField(obj,
1529302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            gInputWindowHandleClassInfo.ownerUid);
153cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown    mInfo->inputFeatures = env->GetIntField(obj,
1549302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            gInputWindowHandleClassInfo.inputFeatures);
15583d616a9c7b9505153d258511eb5c16b552e268dJeff Brown    mInfo->displayId = env->GetIntField(obj,
15683d616a9c7b9505153d258511eb5c16b552e268dJeff Brown            gInputWindowHandleClassInfo.displayId);
1579302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown
1589302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    env->DeleteLocalRef(obj);
1599302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    return true;
1609302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown}
1619302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown
162928e054931d357326613c78e62f4d850b7c442ffJeff Brown
163928e054931d357326613c78e62f4d850b7c442ffJeff Brown// --- Global functions ---
164928e054931d357326613c78e62f4d850b7c442ffJeff Brown
165928e054931d357326613c78e62f4d850b7c442ffJeff Brownsp<NativeInputWindowHandle> android_server_InputWindowHandle_getHandle(
166928e054931d357326613c78e62f4d850b7c442ffJeff Brown        JNIEnv* env, jobject inputWindowHandleObj) {
167928e054931d357326613c78e62f4d850b7c442ffJeff Brown    if (!inputWindowHandleObj) {
168928e054931d357326613c78e62f4d850b7c442ffJeff Brown        return NULL;
169928e054931d357326613c78e62f4d850b7c442ffJeff Brown    }
170928e054931d357326613c78e62f4d850b7c442ffJeff Brown
171928e054931d357326613c78e62f4d850b7c442ffJeff Brown    AutoMutex _l(gHandleMutex);
172928e054931d357326613c78e62f4d850b7c442ffJeff Brown
173928e054931d357326613c78e62f4d850b7c442ffJeff Brown    int ptr = env->GetIntField(inputWindowHandleObj, gInputWindowHandleClassInfo.ptr);
174928e054931d357326613c78e62f4d850b7c442ffJeff Brown    NativeInputWindowHandle* handle;
175928e054931d357326613c78e62f4d850b7c442ffJeff Brown    if (ptr) {
176928e054931d357326613c78e62f4d850b7c442ffJeff Brown        handle = reinterpret_cast<NativeInputWindowHandle*>(ptr);
177928e054931d357326613c78e62f4d850b7c442ffJeff Brown    } else {
178928e054931d357326613c78e62f4d850b7c442ffJeff Brown        jobject inputApplicationHandleObj = env->GetObjectField(inputWindowHandleObj,
179928e054931d357326613c78e62f4d850b7c442ffJeff Brown                gInputWindowHandleClassInfo.inputApplicationHandle);
180928e054931d357326613c78e62f4d850b7c442ffJeff Brown        sp<InputApplicationHandle> inputApplicationHandle =
181928e054931d357326613c78e62f4d850b7c442ffJeff Brown                android_server_InputApplicationHandle_getHandle(env, inputApplicationHandleObj);
182928e054931d357326613c78e62f4d850b7c442ffJeff Brown        env->DeleteLocalRef(inputApplicationHandleObj);
183928e054931d357326613c78e62f4d850b7c442ffJeff Brown
184928e054931d357326613c78e62f4d850b7c442ffJeff Brown        jweak objWeak = env->NewWeakGlobalRef(inputWindowHandleObj);
185928e054931d357326613c78e62f4d850b7c442ffJeff Brown        handle = new NativeInputWindowHandle(inputApplicationHandle, objWeak);
186928e054931d357326613c78e62f4d850b7c442ffJeff Brown        handle->incStrong(inputWindowHandleObj);
187928e054931d357326613c78e62f4d850b7c442ffJeff Brown        env->SetIntField(inputWindowHandleObj, gInputWindowHandleClassInfo.ptr,
188928e054931d357326613c78e62f4d850b7c442ffJeff Brown                reinterpret_cast<int>(handle));
189928e054931d357326613c78e62f4d850b7c442ffJeff Brown    }
190928e054931d357326613c78e62f4d850b7c442ffJeff Brown    return handle;
191928e054931d357326613c78e62f4d850b7c442ffJeff Brown}
192928e054931d357326613c78e62f4d850b7c442ffJeff Brown
193928e054931d357326613c78e62f4d850b7c442ffJeff Brown
194928e054931d357326613c78e62f4d850b7c442ffJeff Brown// --- JNI ---
195928e054931d357326613c78e62f4d850b7c442ffJeff Brown
196928e054931d357326613c78e62f4d850b7c442ffJeff Brownstatic void android_server_InputWindowHandle_nativeDispose(JNIEnv* env, jobject obj) {
197928e054931d357326613c78e62f4d850b7c442ffJeff Brown    AutoMutex _l(gHandleMutex);
198928e054931d357326613c78e62f4d850b7c442ffJeff Brown
199928e054931d357326613c78e62f4d850b7c442ffJeff Brown    int ptr = env->GetIntField(obj, gInputWindowHandleClassInfo.ptr);
200928e054931d357326613c78e62f4d850b7c442ffJeff Brown    if (ptr) {
201928e054931d357326613c78e62f4d850b7c442ffJeff Brown        env->SetIntField(obj, gInputWindowHandleClassInfo.ptr, 0);
202928e054931d357326613c78e62f4d850b7c442ffJeff Brown
203928e054931d357326613c78e62f4d850b7c442ffJeff Brown        NativeInputWindowHandle* handle = reinterpret_cast<NativeInputWindowHandle*>(ptr);
204928e054931d357326613c78e62f4d850b7c442ffJeff Brown        handle->decStrong(obj);
205928e054931d357326613c78e62f4d850b7c442ffJeff Brown    }
206928e054931d357326613c78e62f4d850b7c442ffJeff Brown}
207928e054931d357326613c78e62f4d850b7c442ffJeff Brown
208928e054931d357326613c78e62f4d850b7c442ffJeff Brown
209928e054931d357326613c78e62f4d850b7c442ffJeff Brownstatic JNINativeMethod gInputWindowHandleMethods[] = {
210928e054931d357326613c78e62f4d850b7c442ffJeff Brown    /* name, signature, funcPtr */
211928e054931d357326613c78e62f4d850b7c442ffJeff Brown    { "nativeDispose", "()V",
212928e054931d357326613c78e62f4d850b7c442ffJeff Brown            (void*) android_server_InputWindowHandle_nativeDispose },
213928e054931d357326613c78e62f4d850b7c442ffJeff Brown};
214928e054931d357326613c78e62f4d850b7c442ffJeff Brown
215928e054931d357326613c78e62f4d850b7c442ffJeff Brown#define FIND_CLASS(var, className) \
216928e054931d357326613c78e62f4d850b7c442ffJeff Brown        var = env->FindClass(className); \
21717cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro        LOG_FATAL_IF(! var, "Unable to find class " className);
218928e054931d357326613c78e62f4d850b7c442ffJeff Brown
219928e054931d357326613c78e62f4d850b7c442ffJeff Brown#define GET_FIELD_ID(var, clazz, fieldName, fieldDescriptor) \
220928e054931d357326613c78e62f4d850b7c442ffJeff Brown        var = env->GetFieldID(clazz, fieldName, fieldDescriptor); \
221928e054931d357326613c78e62f4d850b7c442ffJeff Brown        LOG_FATAL_IF(! var, "Unable to find field " fieldName);
222928e054931d357326613c78e62f4d850b7c442ffJeff Brown
223928e054931d357326613c78e62f4d850b7c442ffJeff Brownint register_android_server_InputWindowHandle(JNIEnv* env) {
2244532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    int res = jniRegisterNativeMethods(env, "com/android/server/input/InputWindowHandle",
225928e054931d357326613c78e62f4d850b7c442ffJeff Brown            gInputWindowHandleMethods, NELEM(gInputWindowHandleMethods));
226928e054931d357326613c78e62f4d850b7c442ffJeff Brown    LOG_FATAL_IF(res < 0, "Unable to register native methods.");
227928e054931d357326613c78e62f4d850b7c442ffJeff Brown
22817cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro    jclass clazz;
2294532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    FIND_CLASS(clazz, "com/android/server/input/InputWindowHandle");
230928e054931d357326613c78e62f4d850b7c442ffJeff Brown
23117cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro    GET_FIELD_ID(gInputWindowHandleClassInfo.ptr, clazz,
232928e054931d357326613c78e62f4d850b7c442ffJeff Brown            "ptr", "I");
233928e054931d357326613c78e62f4d850b7c442ffJeff Brown
234928e054931d357326613c78e62f4d850b7c442ffJeff Brown    GET_FIELD_ID(gInputWindowHandleClassInfo.inputApplicationHandle,
23517cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro            clazz,
2364532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown            "inputApplicationHandle", "Lcom/android/server/input/InputApplicationHandle;");
237928e054931d357326613c78e62f4d850b7c442ffJeff Brown
2389302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    GET_FIELD_ID(gInputWindowHandleClassInfo.inputChannel, clazz,
2399302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            "inputChannel", "Landroid/view/InputChannel;");
2409302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown
2419302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    GET_FIELD_ID(gInputWindowHandleClassInfo.name, clazz,
2429302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            "name", "Ljava/lang/String;");
2439302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown
2449302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    GET_FIELD_ID(gInputWindowHandleClassInfo.layoutParamsFlags, clazz,
2459302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            "layoutParamsFlags", "I");
2469302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown
2479302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    GET_FIELD_ID(gInputWindowHandleClassInfo.layoutParamsType, clazz,
2489302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            "layoutParamsType", "I");
2499302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown
2509302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    GET_FIELD_ID(gInputWindowHandleClassInfo.dispatchingTimeoutNanos, clazz,
2519302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            "dispatchingTimeoutNanos", "J");
2529302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown
2539302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    GET_FIELD_ID(gInputWindowHandleClassInfo.frameLeft, clazz,
2549302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            "frameLeft", "I");
2559302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown
2569302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    GET_FIELD_ID(gInputWindowHandleClassInfo.frameTop, clazz,
2579302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            "frameTop", "I");
2589302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown
2599302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    GET_FIELD_ID(gInputWindowHandleClassInfo.frameRight, clazz,
2609302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            "frameRight", "I");
2619302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown
2629302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    GET_FIELD_ID(gInputWindowHandleClassInfo.frameBottom, clazz,
2639302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            "frameBottom", "I");
2649302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown
2659302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    GET_FIELD_ID(gInputWindowHandleClassInfo.scaleFactor, clazz,
2669302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            "scaleFactor", "F");
2679302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown
2689302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    GET_FIELD_ID(gInputWindowHandleClassInfo.touchableRegion, clazz,
2699302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            "touchableRegion", "Landroid/graphics/Region;");
2709302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown
2719302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    GET_FIELD_ID(gInputWindowHandleClassInfo.visible, clazz,
2729302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            "visible", "Z");
2739302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown
2749302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    GET_FIELD_ID(gInputWindowHandleClassInfo.canReceiveKeys, clazz,
2759302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            "canReceiveKeys", "Z");
2769302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown
2779302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    GET_FIELD_ID(gInputWindowHandleClassInfo.hasFocus, clazz,
2789302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            "hasFocus", "Z");
2799302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown
2809302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    GET_FIELD_ID(gInputWindowHandleClassInfo.hasWallpaper, clazz,
2819302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            "hasWallpaper", "Z");
2829302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown
2839302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    GET_FIELD_ID(gInputWindowHandleClassInfo.paused, clazz,
2849302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            "paused", "Z");
2859302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown
2869302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    GET_FIELD_ID(gInputWindowHandleClassInfo.layer, clazz,
2879302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            "layer", "I");
2889302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown
2899302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    GET_FIELD_ID(gInputWindowHandleClassInfo.ownerPid, clazz,
2909302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            "ownerPid", "I");
2919302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown
2929302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    GET_FIELD_ID(gInputWindowHandleClassInfo.ownerUid, clazz,
2939302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            "ownerUid", "I");
2949302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown
2959302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    GET_FIELD_ID(gInputWindowHandleClassInfo.inputFeatures, clazz,
2969302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            "inputFeatures", "I");
29783d616a9c7b9505153d258511eb5c16b552e268dJeff Brown
29883d616a9c7b9505153d258511eb5c16b552e268dJeff Brown    GET_FIELD_ID(gInputWindowHandleClassInfo.displayId, clazz,
29983d616a9c7b9505153d258511eb5c16b552e268dJeff Brown            "displayId", "I");
300928e054931d357326613c78e62f4d850b7c442ffJeff Brown    return 0;
301928e054931d357326613c78e62f4d850b7c442ffJeff Brown}
302928e054931d357326613c78e62f4d850b7c442ffJeff Brown
303928e054931d357326613c78e62f4d850b7c442ffJeff Brown} /* namespace android */
304