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;
3895c42974f719d1fac90fc0438eac778e9795681fAdam Lesinski    jfieldID layoutParamsPrivateFlags;
399302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    jfieldID layoutParamsType;
409302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    jfieldID dispatchingTimeoutNanos;
419302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    jfieldID frameLeft;
429302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    jfieldID frameTop;
439302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    jfieldID frameRight;
449302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    jfieldID frameBottom;
459302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    jfieldID scaleFactor;
469302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    jfieldID touchableRegion;
479302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    jfieldID visible;
489302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    jfieldID canReceiveKeys;
499302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    jfieldID hasFocus;
509302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    jfieldID hasWallpaper;
519302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    jfieldID paused;
529302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    jfieldID layer;
539302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    jfieldID ownerPid;
549302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    jfieldID ownerUid;
559302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    jfieldID inputFeatures;
5683d616a9c7b9505153d258511eb5c16b552e268dJeff Brown    jfieldID displayId;
57928e054931d357326613c78e62f4d850b7c442ffJeff Brown} gInputWindowHandleClassInfo;
58928e054931d357326613c78e62f4d850b7c442ffJeff Brown
59928e054931d357326613c78e62f4d850b7c442ffJeff Brownstatic Mutex gHandleMutex;
60928e054931d357326613c78e62f4d850b7c442ffJeff Brown
61928e054931d357326613c78e62f4d850b7c442ffJeff Brown
62928e054931d357326613c78e62f4d850b7c442ffJeff Brown// --- NativeInputWindowHandle ---
63928e054931d357326613c78e62f4d850b7c442ffJeff Brown
64928e054931d357326613c78e62f4d850b7c442ffJeff BrownNativeInputWindowHandle::NativeInputWindowHandle(
65928e054931d357326613c78e62f4d850b7c442ffJeff Brown        const sp<InputApplicationHandle>& inputApplicationHandle, jweak objWeak) :
66928e054931d357326613c78e62f4d850b7c442ffJeff Brown        InputWindowHandle(inputApplicationHandle),
67928e054931d357326613c78e62f4d850b7c442ffJeff Brown        mObjWeak(objWeak) {
68928e054931d357326613c78e62f4d850b7c442ffJeff Brown}
69928e054931d357326613c78e62f4d850b7c442ffJeff Brown
70928e054931d357326613c78e62f4d850b7c442ffJeff BrownNativeInputWindowHandle::~NativeInputWindowHandle() {
71928e054931d357326613c78e62f4d850b7c442ffJeff Brown    JNIEnv* env = AndroidRuntime::getJNIEnv();
72928e054931d357326613c78e62f4d850b7c442ffJeff Brown    env->DeleteWeakGlobalRef(mObjWeak);
73928e054931d357326613c78e62f4d850b7c442ffJeff Brown}
74928e054931d357326613c78e62f4d850b7c442ffJeff Brown
75928e054931d357326613c78e62f4d850b7c442ffJeff Brownjobject NativeInputWindowHandle::getInputWindowHandleObjLocalRef(JNIEnv* env) {
76928e054931d357326613c78e62f4d850b7c442ffJeff Brown    return env->NewLocalRef(mObjWeak);
77928e054931d357326613c78e62f4d850b7c442ffJeff Brown}
78928e054931d357326613c78e62f4d850b7c442ffJeff Brown
79cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brownbool NativeInputWindowHandle::updateInfo() {
809302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    JNIEnv* env = AndroidRuntime::getJNIEnv();
819302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    jobject obj = env->NewLocalRef(mObjWeak);
829302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    if (!obj) {
83cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        releaseInfo();
849302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        return false;
859302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    }
869302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown
87cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown    if (!mInfo) {
88cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        mInfo = new InputWindowInfo();
89cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown    }
90cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown
919302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    jobject inputChannelObj = env->GetObjectField(obj,
929302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            gInputWindowHandleClassInfo.inputChannel);
939302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    if (inputChannelObj) {
94cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        mInfo->inputChannel = android_view_InputChannel_getInputChannel(env, inputChannelObj);
959302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        env->DeleteLocalRef(inputChannelObj);
969302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    } else {
97cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        mInfo->inputChannel.clear();
989302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    }
999302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown
1009302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    jstring nameObj = jstring(env->GetObjectField(obj,
1019302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            gInputWindowHandleClassInfo.name));
1029302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    if (nameObj) {
1039302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        const char* nameStr = env->GetStringUTFChars(nameObj, NULL);
104cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        mInfo->name.setTo(nameStr);
1059302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        env->ReleaseStringUTFChars(nameObj, nameStr);
1069302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        env->DeleteLocalRef(nameObj);
1079302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    } else {
108cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        mInfo->name.setTo("<null>");
1099302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    }
1109302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown
111cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown    mInfo->layoutParamsFlags = env->GetIntField(obj,
1129302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            gInputWindowHandleClassInfo.layoutParamsFlags);
11395c42974f719d1fac90fc0438eac778e9795681fAdam Lesinski    mInfo->layoutParamsPrivateFlags = env->GetIntField(obj,
11495c42974f719d1fac90fc0438eac778e9795681fAdam Lesinski            gInputWindowHandleClassInfo.layoutParamsPrivateFlags);
115cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown    mInfo->layoutParamsType = env->GetIntField(obj,
1169302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            gInputWindowHandleClassInfo.layoutParamsType);
117cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown    mInfo->dispatchingTimeout = env->GetLongField(obj,
1189302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            gInputWindowHandleClassInfo.dispatchingTimeoutNanos);
119cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown    mInfo->frameLeft = env->GetIntField(obj,
1209302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            gInputWindowHandleClassInfo.frameLeft);
121cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown    mInfo->frameTop = env->GetIntField(obj,
1229302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            gInputWindowHandleClassInfo.frameTop);
123cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown    mInfo->frameRight = env->GetIntField(obj,
1249302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            gInputWindowHandleClassInfo.frameRight);
125cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown    mInfo->frameBottom = env->GetIntField(obj,
1269302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            gInputWindowHandleClassInfo.frameBottom);
127cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown    mInfo->scaleFactor = env->GetFloatField(obj,
1289302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            gInputWindowHandleClassInfo.scaleFactor);
1299302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown
1309302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    jobject regionObj = env->GetObjectField(obj,
1319302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            gInputWindowHandleClassInfo.touchableRegion);
1329302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    if (regionObj) {
1339302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        SkRegion* region = android_graphics_Region_getSkRegion(env, regionObj);
134cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        mInfo->touchableRegion.set(*region);
1359302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        env->DeleteLocalRef(regionObj);
1369302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    } else {
137cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        mInfo->touchableRegion.setEmpty();
1389302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    }
1399302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown
140cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown    mInfo->visible = env->GetBooleanField(obj,
1419302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            gInputWindowHandleClassInfo.visible);
142cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown    mInfo->canReceiveKeys = env->GetBooleanField(obj,
1439302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            gInputWindowHandleClassInfo.canReceiveKeys);
144cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown    mInfo->hasFocus = env->GetBooleanField(obj,
1459302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            gInputWindowHandleClassInfo.hasFocus);
146cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown    mInfo->hasWallpaper = env->GetBooleanField(obj,
1479302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            gInputWindowHandleClassInfo.hasWallpaper);
148cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown    mInfo->paused = env->GetBooleanField(obj,
1499302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            gInputWindowHandleClassInfo.paused);
150cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown    mInfo->layer = env->GetIntField(obj,
1519302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            gInputWindowHandleClassInfo.layer);
152cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown    mInfo->ownerPid = env->GetIntField(obj,
1539302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            gInputWindowHandleClassInfo.ownerPid);
154cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown    mInfo->ownerUid = env->GetIntField(obj,
1559302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            gInputWindowHandleClassInfo.ownerUid);
156cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown    mInfo->inputFeatures = env->GetIntField(obj,
1579302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            gInputWindowHandleClassInfo.inputFeatures);
15883d616a9c7b9505153d258511eb5c16b552e268dJeff Brown    mInfo->displayId = env->GetIntField(obj,
15983d616a9c7b9505153d258511eb5c16b552e268dJeff Brown            gInputWindowHandleClassInfo.displayId);
1609302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown
1619302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    env->DeleteLocalRef(obj);
1629302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    return true;
1639302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown}
1649302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown
165928e054931d357326613c78e62f4d850b7c442ffJeff Brown
166928e054931d357326613c78e62f4d850b7c442ffJeff Brown// --- Global functions ---
167928e054931d357326613c78e62f4d850b7c442ffJeff Brown
168928e054931d357326613c78e62f4d850b7c442ffJeff Brownsp<NativeInputWindowHandle> android_server_InputWindowHandle_getHandle(
169928e054931d357326613c78e62f4d850b7c442ffJeff Brown        JNIEnv* env, jobject inputWindowHandleObj) {
170928e054931d357326613c78e62f4d850b7c442ffJeff Brown    if (!inputWindowHandleObj) {
171928e054931d357326613c78e62f4d850b7c442ffJeff Brown        return NULL;
172928e054931d357326613c78e62f4d850b7c442ffJeff Brown    }
173928e054931d357326613c78e62f4d850b7c442ffJeff Brown
174928e054931d357326613c78e62f4d850b7c442ffJeff Brown    AutoMutex _l(gHandleMutex);
175928e054931d357326613c78e62f4d850b7c442ffJeff Brown
176928e054931d357326613c78e62f4d850b7c442ffJeff Brown    int ptr = env->GetIntField(inputWindowHandleObj, gInputWindowHandleClassInfo.ptr);
177928e054931d357326613c78e62f4d850b7c442ffJeff Brown    NativeInputWindowHandle* handle;
178928e054931d357326613c78e62f4d850b7c442ffJeff Brown    if (ptr) {
179928e054931d357326613c78e62f4d850b7c442ffJeff Brown        handle = reinterpret_cast<NativeInputWindowHandle*>(ptr);
180928e054931d357326613c78e62f4d850b7c442ffJeff Brown    } else {
181928e054931d357326613c78e62f4d850b7c442ffJeff Brown        jobject inputApplicationHandleObj = env->GetObjectField(inputWindowHandleObj,
182928e054931d357326613c78e62f4d850b7c442ffJeff Brown                gInputWindowHandleClassInfo.inputApplicationHandle);
183928e054931d357326613c78e62f4d850b7c442ffJeff Brown        sp<InputApplicationHandle> inputApplicationHandle =
184928e054931d357326613c78e62f4d850b7c442ffJeff Brown                android_server_InputApplicationHandle_getHandle(env, inputApplicationHandleObj);
185928e054931d357326613c78e62f4d850b7c442ffJeff Brown        env->DeleteLocalRef(inputApplicationHandleObj);
186928e054931d357326613c78e62f4d850b7c442ffJeff Brown
187928e054931d357326613c78e62f4d850b7c442ffJeff Brown        jweak objWeak = env->NewWeakGlobalRef(inputWindowHandleObj);
188928e054931d357326613c78e62f4d850b7c442ffJeff Brown        handle = new NativeInputWindowHandle(inputApplicationHandle, objWeak);
189b1d90c8f60f71422196c337f1d078b68867f5710Mathias Agopian        handle->incStrong((void*)android_server_InputWindowHandle_getHandle);
190928e054931d357326613c78e62f4d850b7c442ffJeff Brown        env->SetIntField(inputWindowHandleObj, gInputWindowHandleClassInfo.ptr,
191928e054931d357326613c78e62f4d850b7c442ffJeff Brown                reinterpret_cast<int>(handle));
192928e054931d357326613c78e62f4d850b7c442ffJeff Brown    }
193928e054931d357326613c78e62f4d850b7c442ffJeff Brown    return handle;
194928e054931d357326613c78e62f4d850b7c442ffJeff Brown}
195928e054931d357326613c78e62f4d850b7c442ffJeff Brown
196928e054931d357326613c78e62f4d850b7c442ffJeff Brown
197928e054931d357326613c78e62f4d850b7c442ffJeff Brown// --- JNI ---
198928e054931d357326613c78e62f4d850b7c442ffJeff Brown
199928e054931d357326613c78e62f4d850b7c442ffJeff Brownstatic void android_server_InputWindowHandle_nativeDispose(JNIEnv* env, jobject obj) {
200928e054931d357326613c78e62f4d850b7c442ffJeff Brown    AutoMutex _l(gHandleMutex);
201928e054931d357326613c78e62f4d850b7c442ffJeff Brown
202928e054931d357326613c78e62f4d850b7c442ffJeff Brown    int ptr = env->GetIntField(obj, gInputWindowHandleClassInfo.ptr);
203928e054931d357326613c78e62f4d850b7c442ffJeff Brown    if (ptr) {
204928e054931d357326613c78e62f4d850b7c442ffJeff Brown        env->SetIntField(obj, gInputWindowHandleClassInfo.ptr, 0);
205928e054931d357326613c78e62f4d850b7c442ffJeff Brown
206928e054931d357326613c78e62f4d850b7c442ffJeff Brown        NativeInputWindowHandle* handle = reinterpret_cast<NativeInputWindowHandle*>(ptr);
207b1d90c8f60f71422196c337f1d078b68867f5710Mathias Agopian        handle->decStrong((void*)android_server_InputWindowHandle_getHandle);
208928e054931d357326613c78e62f4d850b7c442ffJeff Brown    }
209928e054931d357326613c78e62f4d850b7c442ffJeff Brown}
210928e054931d357326613c78e62f4d850b7c442ffJeff Brown
211928e054931d357326613c78e62f4d850b7c442ffJeff Brown
212928e054931d357326613c78e62f4d850b7c442ffJeff Brownstatic JNINativeMethod gInputWindowHandleMethods[] = {
213928e054931d357326613c78e62f4d850b7c442ffJeff Brown    /* name, signature, funcPtr */
214928e054931d357326613c78e62f4d850b7c442ffJeff Brown    { "nativeDispose", "()V",
215928e054931d357326613c78e62f4d850b7c442ffJeff Brown            (void*) android_server_InputWindowHandle_nativeDispose },
216928e054931d357326613c78e62f4d850b7c442ffJeff Brown};
217928e054931d357326613c78e62f4d850b7c442ffJeff Brown
218928e054931d357326613c78e62f4d850b7c442ffJeff Brown#define FIND_CLASS(var, className) \
219928e054931d357326613c78e62f4d850b7c442ffJeff Brown        var = env->FindClass(className); \
22017cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro        LOG_FATAL_IF(! var, "Unable to find class " className);
221928e054931d357326613c78e62f4d850b7c442ffJeff Brown
222928e054931d357326613c78e62f4d850b7c442ffJeff Brown#define GET_FIELD_ID(var, clazz, fieldName, fieldDescriptor) \
223928e054931d357326613c78e62f4d850b7c442ffJeff Brown        var = env->GetFieldID(clazz, fieldName, fieldDescriptor); \
224928e054931d357326613c78e62f4d850b7c442ffJeff Brown        LOG_FATAL_IF(! var, "Unable to find field " fieldName);
225928e054931d357326613c78e62f4d850b7c442ffJeff Brown
226928e054931d357326613c78e62f4d850b7c442ffJeff Brownint register_android_server_InputWindowHandle(JNIEnv* env) {
2274532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    int res = jniRegisterNativeMethods(env, "com/android/server/input/InputWindowHandle",
228928e054931d357326613c78e62f4d850b7c442ffJeff Brown            gInputWindowHandleMethods, NELEM(gInputWindowHandleMethods));
229928e054931d357326613c78e62f4d850b7c442ffJeff Brown    LOG_FATAL_IF(res < 0, "Unable to register native methods.");
230928e054931d357326613c78e62f4d850b7c442ffJeff Brown
23117cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro    jclass clazz;
2324532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    FIND_CLASS(clazz, "com/android/server/input/InputWindowHandle");
233928e054931d357326613c78e62f4d850b7c442ffJeff Brown
23417cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro    GET_FIELD_ID(gInputWindowHandleClassInfo.ptr, clazz,
235928e054931d357326613c78e62f4d850b7c442ffJeff Brown            "ptr", "I");
236928e054931d357326613c78e62f4d850b7c442ffJeff Brown
237928e054931d357326613c78e62f4d850b7c442ffJeff Brown    GET_FIELD_ID(gInputWindowHandleClassInfo.inputApplicationHandle,
23817cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro            clazz,
2394532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown            "inputApplicationHandle", "Lcom/android/server/input/InputApplicationHandle;");
240928e054931d357326613c78e62f4d850b7c442ffJeff Brown
2419302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    GET_FIELD_ID(gInputWindowHandleClassInfo.inputChannel, clazz,
2429302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            "inputChannel", "Landroid/view/InputChannel;");
2439302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown
2449302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    GET_FIELD_ID(gInputWindowHandleClassInfo.name, clazz,
2459302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            "name", "Ljava/lang/String;");
2469302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown
2479302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    GET_FIELD_ID(gInputWindowHandleClassInfo.layoutParamsFlags, clazz,
2489302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            "layoutParamsFlags", "I");
2499302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown
25095c42974f719d1fac90fc0438eac778e9795681fAdam Lesinski    GET_FIELD_ID(gInputWindowHandleClassInfo.layoutParamsPrivateFlags, clazz,
25195c42974f719d1fac90fc0438eac778e9795681fAdam Lesinski            "layoutParamsPrivateFlags", "I");
25295c42974f719d1fac90fc0438eac778e9795681fAdam Lesinski
2539302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    GET_FIELD_ID(gInputWindowHandleClassInfo.layoutParamsType, clazz,
2549302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            "layoutParamsType", "I");
2559302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown
2569302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    GET_FIELD_ID(gInputWindowHandleClassInfo.dispatchingTimeoutNanos, clazz,
2579302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            "dispatchingTimeoutNanos", "J");
2589302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown
2599302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    GET_FIELD_ID(gInputWindowHandleClassInfo.frameLeft, clazz,
2609302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            "frameLeft", "I");
2619302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown
2629302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    GET_FIELD_ID(gInputWindowHandleClassInfo.frameTop, clazz,
2639302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            "frameTop", "I");
2649302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown
2659302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    GET_FIELD_ID(gInputWindowHandleClassInfo.frameRight, clazz,
2669302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            "frameRight", "I");
2679302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown
2689302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    GET_FIELD_ID(gInputWindowHandleClassInfo.frameBottom, clazz,
2699302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            "frameBottom", "I");
2709302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown
2719302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    GET_FIELD_ID(gInputWindowHandleClassInfo.scaleFactor, clazz,
2729302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            "scaleFactor", "F");
2739302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown
2749302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    GET_FIELD_ID(gInputWindowHandleClassInfo.touchableRegion, clazz,
2759302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            "touchableRegion", "Landroid/graphics/Region;");
2769302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown
2779302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    GET_FIELD_ID(gInputWindowHandleClassInfo.visible, clazz,
2789302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            "visible", "Z");
2799302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown
2809302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    GET_FIELD_ID(gInputWindowHandleClassInfo.canReceiveKeys, clazz,
2819302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            "canReceiveKeys", "Z");
2829302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown
2839302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    GET_FIELD_ID(gInputWindowHandleClassInfo.hasFocus, clazz,
2849302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            "hasFocus", "Z");
2859302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown
2869302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    GET_FIELD_ID(gInputWindowHandleClassInfo.hasWallpaper, clazz,
2879302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            "hasWallpaper", "Z");
2889302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown
2899302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    GET_FIELD_ID(gInputWindowHandleClassInfo.paused, clazz,
2909302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            "paused", "Z");
2919302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown
2929302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    GET_FIELD_ID(gInputWindowHandleClassInfo.layer, clazz,
2939302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            "layer", "I");
2949302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown
2959302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    GET_FIELD_ID(gInputWindowHandleClassInfo.ownerPid, clazz,
2969302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            "ownerPid", "I");
2979302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown
2989302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    GET_FIELD_ID(gInputWindowHandleClassInfo.ownerUid, clazz,
2999302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            "ownerUid", "I");
3009302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown
3019302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    GET_FIELD_ID(gInputWindowHandleClassInfo.inputFeatures, clazz,
3029302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            "inputFeatures", "I");
30383d616a9c7b9505153d258511eb5c16b552e268dJeff Brown
30483d616a9c7b9505153d258511eb5c16b552e268dJeff Brown    GET_FIELD_ID(gInputWindowHandleClassInfo.displayId, clazz,
30583d616a9c7b9505153d258511eb5c16b552e268dJeff Brown            "displayId", "I");
306928e054931d357326613c78e62f4d850b7c442ffJeff Brown    return 0;
307928e054931d357326613c78e62f4d850b7c442ffJeff Brown}
308928e054931d357326613c78e62f4d850b7c442ffJeff Brown
309928e054931d357326613c78e62f4d850b7c442ffJeff Brown} /* namespace android */
310