Jeff Brown | 928e054 | 2011-01-10 11:17:36 -0800 | [diff] [blame] | 1 | /* |
| 2 | * Copyright (C) 2011 The Android Open Source Project |
| 3 | * |
| 4 | * Licensed under the Apache License, Version 2.0 (the "License"); |
| 5 | * you may not use this file except in compliance with the License. |
| 6 | * You may obtain a copy of the License at |
| 7 | * |
| 8 | * http://www.apache.org/licenses/LICENSE-2.0 |
| 9 | * |
| 10 | * Unless required by applicable law or agreed to in writing, software |
| 11 | * distributed under the License is distributed on an "AS IS" BASIS, |
| 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 13 | * See the License for the specific language governing permissions and |
| 14 | * limitations under the License. |
| 15 | */ |
| 16 | |
| 17 | #define LOG_TAG "InputWindowHandle" |
| 18 | |
Steven Moreland | 2279b25 | 2017-07-19 09:50:45 -0700 | [diff] [blame] | 19 | #include <nativehelper/JNIHelp.h> |
Siarhei Vishniakou | e890f59 | 2018-10-15 18:53:06 -0700 | [diff] [blame] | 20 | #include "core_jni_helpers.h" |
Jeff Brown | 928e054 | 2011-01-10 11:17:36 -0800 | [diff] [blame] | 21 | #include "jni.h" |
| 22 | #include <android_runtime/AndroidRuntime.h> |
| 23 | #include <utils/threads.h> |
| 24 | |
Derek Sollenberger | 40d7813 | 2019-08-12 11:06:08 -0400 | [diff] [blame] | 25 | #include <android/graphics/region.h> |
Vishnu Nair | bc9beab | 2019-06-25 17:28:58 -0700 | [diff] [blame] | 26 | #include <gui/SurfaceControl.h> |
Michael Wright | a407d6a | 2014-02-05 18:02:40 -0800 | [diff] [blame] | 27 | #include <ui/Region.h> |
Jeff Brown | 9302c87 | 2011-07-13 22:51:29 -0700 | [diff] [blame] | 28 | |
Robert Carr | e1db320 | 2018-07-23 15:24:59 -0700 | [diff] [blame] | 29 | #include "android_hardware_input_InputWindowHandle.h" |
| 30 | #include "android_hardware_input_InputApplicationHandle.h" |
Robert Carr | 0bcbe64 | 2018-10-11 19:07:43 -0700 | [diff] [blame] | 31 | #include "android_util_Binder.h" |
Vishnu Nair | c06ec08 | 2019-08-20 09:12:26 -0700 | [diff] [blame] | 32 | #include <binder/IPCThreadState.h> |
Jeff Brown | 928e054 | 2011-01-10 11:17:36 -0800 | [diff] [blame] | 33 | |
| 34 | namespace android { |
| 35 | |
Vishnu Nair | 40efb71 | 2019-03-12 13:37:51 -0700 | [diff] [blame] | 36 | struct WeakRefHandleField { |
Vishnu Nair | bc9beab | 2019-06-25 17:28:58 -0700 | [diff] [blame] | 37 | jfieldID ctrl; |
Vishnu Nair | 40efb71 | 2019-03-12 13:37:51 -0700 | [diff] [blame] | 38 | jmethodID get; |
Vishnu Nair | bc9beab | 2019-06-25 17:28:58 -0700 | [diff] [blame] | 39 | jfieldID mNativeObject; |
Vishnu Nair | 40efb71 | 2019-03-12 13:37:51 -0700 | [diff] [blame] | 40 | }; |
| 41 | |
Jeff Brown | 928e054 | 2011-01-10 11:17:36 -0800 | [diff] [blame] | 42 | static struct { |
Jeff Brown | 928e054 | 2011-01-10 11:17:36 -0800 | [diff] [blame] | 43 | jfieldID ptr; |
| 44 | jfieldID inputApplicationHandle; |
Robert Carr | eadae82 | 2018-10-11 19:07:03 -0700 | [diff] [blame] | 45 | jfieldID token; |
Jeff Brown | 9302c87 | 2011-07-13 22:51:29 -0700 | [diff] [blame] | 46 | jfieldID name; |
| 47 | jfieldID layoutParamsFlags; |
| 48 | jfieldID layoutParamsType; |
| 49 | jfieldID dispatchingTimeoutNanos; |
| 50 | jfieldID frameLeft; |
| 51 | jfieldID frameTop; |
| 52 | jfieldID frameRight; |
| 53 | jfieldID frameBottom; |
Robert Carr | fcc0852 | 2018-11-14 14:02:52 -0800 | [diff] [blame] | 54 | jfieldID surfaceInset; |
Jeff Brown | 9302c87 | 2011-07-13 22:51:29 -0700 | [diff] [blame] | 55 | jfieldID scaleFactor; |
| 56 | jfieldID touchableRegion; |
| 57 | jfieldID visible; |
| 58 | jfieldID canReceiveKeys; |
| 59 | jfieldID hasFocus; |
| 60 | jfieldID hasWallpaper; |
| 61 | jfieldID paused; |
| 62 | jfieldID layer; |
| 63 | jfieldID ownerPid; |
| 64 | jfieldID ownerUid; |
| 65 | jfieldID inputFeatures; |
Jeff Brown | 83d616a | 2012-09-09 20:33:43 -0700 | [diff] [blame] | 66 | jfieldID displayId; |
Tiger Huang | 04dc4cc | 2019-01-17 18:41:41 +0800 | [diff] [blame] | 67 | jfieldID portalToDisplayId; |
Vishnu Nair | 40efb71 | 2019-03-12 13:37:51 -0700 | [diff] [blame] | 68 | jfieldID replaceTouchableRegionWithCrop; |
Vishnu Nair | bc9beab | 2019-06-25 17:28:58 -0700 | [diff] [blame] | 69 | WeakRefHandleField touchableRegionSurfaceControl; |
Jeff Brown | 928e054 | 2011-01-10 11:17:36 -0800 | [diff] [blame] | 70 | } gInputWindowHandleClassInfo; |
| 71 | |
| 72 | static Mutex gHandleMutex; |
| 73 | |
| 74 | |
| 75 | // --- NativeInputWindowHandle --- |
| 76 | |
Robert Carr | 0bcbe64 | 2018-10-11 19:07:43 -0700 | [diff] [blame] | 77 | NativeInputWindowHandle::NativeInputWindowHandle(jweak objWeak) : |
Jeff Brown | 928e054 | 2011-01-10 11:17:36 -0800 | [diff] [blame] | 78 | mObjWeak(objWeak) { |
| 79 | } |
| 80 | |
| 81 | NativeInputWindowHandle::~NativeInputWindowHandle() { |
| 82 | JNIEnv* env = AndroidRuntime::getJNIEnv(); |
| 83 | env->DeleteWeakGlobalRef(mObjWeak); |
Vishnu Nair | c06ec08 | 2019-08-20 09:12:26 -0700 | [diff] [blame] | 84 | |
| 85 | // Clear the weak reference to the layer handle and flush any binder ref count operations so we |
| 86 | // do not hold on to any binder references. |
| 87 | // TODO(b/139697085) remove this after it can be flushed automatically |
| 88 | mInfo.touchableRegionCropHandle.clear(); |
| 89 | IPCThreadState::self()->flushCommands(); |
Jeff Brown | 928e054 | 2011-01-10 11:17:36 -0800 | [diff] [blame] | 90 | } |
| 91 | |
| 92 | jobject NativeInputWindowHandle::getInputWindowHandleObjLocalRef(JNIEnv* env) { |
| 93 | return env->NewLocalRef(mObjWeak); |
| 94 | } |
| 95 | |
Jeff Brown | cc4f7db | 2011-08-30 20:34:48 -0700 | [diff] [blame] | 96 | bool NativeInputWindowHandle::updateInfo() { |
Jeff Brown | 9302c87 | 2011-07-13 22:51:29 -0700 | [diff] [blame] | 97 | JNIEnv* env = AndroidRuntime::getJNIEnv(); |
| 98 | jobject obj = env->NewLocalRef(mObjWeak); |
| 99 | if (!obj) { |
Arthur Hung | 06ad38d | 2018-11-05 19:23:21 +0800 | [diff] [blame] | 100 | releaseChannel(); |
Jeff Brown | 9302c87 | 2011-07-13 22:51:29 -0700 | [diff] [blame] | 101 | return false; |
| 102 | } |
| 103 | |
Arthur Hung | 06ad38d | 2018-11-05 19:23:21 +0800 | [diff] [blame] | 104 | mInfo.touchableRegion.clear(); |
Jeff Brown | cc4f7db | 2011-08-30 20:34:48 -0700 | [diff] [blame] | 105 | |
Siarhei Vishniakou | e890f59 | 2018-10-15 18:53:06 -0700 | [diff] [blame] | 106 | jobject tokenObj = env->GetObjectField(obj, gInputWindowHandleClassInfo.token); |
Robert Carr | eadae82 | 2018-10-11 19:07:03 -0700 | [diff] [blame] | 107 | if (tokenObj) { |
| 108 | mInfo.token = ibinderForJavaObject(env, tokenObj); |
Vishnu Nair | 40efb71 | 2019-03-12 13:37:51 -0700 | [diff] [blame] | 109 | env->DeleteLocalRef(tokenObj); |
Jeff Brown | 9302c87 | 2011-07-13 22:51:29 -0700 | [diff] [blame] | 110 | } else { |
Robert Carr | eadae82 | 2018-10-11 19:07:03 -0700 | [diff] [blame] | 111 | mInfo.token.clear(); |
Jeff Brown | 9302c87 | 2011-07-13 22:51:29 -0700 | [diff] [blame] | 112 | } |
| 113 | |
Siarhei Vishniakou | e890f59 | 2018-10-15 18:53:06 -0700 | [diff] [blame] | 114 | mInfo.name = getStringField(env, obj, gInputWindowHandleClassInfo.name, "<null>"); |
Jeff Brown | 9302c87 | 2011-07-13 22:51:29 -0700 | [diff] [blame] | 115 | |
Arthur Hung | 06ad38d | 2018-11-05 19:23:21 +0800 | [diff] [blame] | 116 | mInfo.layoutParamsFlags = env->GetIntField(obj, |
Jeff Brown | 9302c87 | 2011-07-13 22:51:29 -0700 | [diff] [blame] | 117 | gInputWindowHandleClassInfo.layoutParamsFlags); |
Arthur Hung | 06ad38d | 2018-11-05 19:23:21 +0800 | [diff] [blame] | 118 | mInfo.layoutParamsType = env->GetIntField(obj, |
Jeff Brown | 9302c87 | 2011-07-13 22:51:29 -0700 | [diff] [blame] | 119 | gInputWindowHandleClassInfo.layoutParamsType); |
Arthur Hung | 06ad38d | 2018-11-05 19:23:21 +0800 | [diff] [blame] | 120 | mInfo.dispatchingTimeout = env->GetLongField(obj, |
Jeff Brown | 9302c87 | 2011-07-13 22:51:29 -0700 | [diff] [blame] | 121 | gInputWindowHandleClassInfo.dispatchingTimeoutNanos); |
Arthur Hung | 06ad38d | 2018-11-05 19:23:21 +0800 | [diff] [blame] | 122 | mInfo.frameLeft = env->GetIntField(obj, |
Jeff Brown | 9302c87 | 2011-07-13 22:51:29 -0700 | [diff] [blame] | 123 | gInputWindowHandleClassInfo.frameLeft); |
Arthur Hung | 06ad38d | 2018-11-05 19:23:21 +0800 | [diff] [blame] | 124 | mInfo.frameTop = env->GetIntField(obj, |
Jeff Brown | 9302c87 | 2011-07-13 22:51:29 -0700 | [diff] [blame] | 125 | gInputWindowHandleClassInfo.frameTop); |
Arthur Hung | 06ad38d | 2018-11-05 19:23:21 +0800 | [diff] [blame] | 126 | mInfo.frameRight = env->GetIntField(obj, |
Jeff Brown | 9302c87 | 2011-07-13 22:51:29 -0700 | [diff] [blame] | 127 | gInputWindowHandleClassInfo.frameRight); |
Arthur Hung | 06ad38d | 2018-11-05 19:23:21 +0800 | [diff] [blame] | 128 | mInfo.frameBottom = env->GetIntField(obj, |
Jeff Brown | 9302c87 | 2011-07-13 22:51:29 -0700 | [diff] [blame] | 129 | gInputWindowHandleClassInfo.frameBottom); |
Robert Carr | fcc0852 | 2018-11-14 14:02:52 -0800 | [diff] [blame] | 130 | mInfo.surfaceInset = env->GetIntField(obj, |
| 131 | gInputWindowHandleClassInfo.surfaceInset); |
Robert Carr | 51141c0 | 2018-11-26 13:11:05 -0800 | [diff] [blame] | 132 | mInfo.globalScaleFactor = env->GetFloatField(obj, |
Jeff Brown | 9302c87 | 2011-07-13 22:51:29 -0700 | [diff] [blame] | 133 | gInputWindowHandleClassInfo.scaleFactor); |
| 134 | |
| 135 | jobject regionObj = env->GetObjectField(obj, |
| 136 | gInputWindowHandleClassInfo.touchableRegion); |
| 137 | if (regionObj) { |
Derek Sollenberger | 40d7813 | 2019-08-12 11:06:08 -0400 | [diff] [blame] | 138 | for (graphics::RegionIterator it(env, regionObj); !it.isDone(); it.next()) { |
| 139 | ARect rect = it.getRect(); |
| 140 | mInfo.addTouchableRegion(Rect(rect.left, rect.top, rect.right, rect.bottom)); |
Michael Wright | a407d6a | 2014-02-05 18:02:40 -0800 | [diff] [blame] | 141 | } |
Jeff Brown | 9302c87 | 2011-07-13 22:51:29 -0700 | [diff] [blame] | 142 | env->DeleteLocalRef(regionObj); |
Jeff Brown | 9302c87 | 2011-07-13 22:51:29 -0700 | [diff] [blame] | 143 | } |
| 144 | |
Arthur Hung | 06ad38d | 2018-11-05 19:23:21 +0800 | [diff] [blame] | 145 | mInfo.visible = env->GetBooleanField(obj, |
Jeff Brown | 9302c87 | 2011-07-13 22:51:29 -0700 | [diff] [blame] | 146 | gInputWindowHandleClassInfo.visible); |
Arthur Hung | 06ad38d | 2018-11-05 19:23:21 +0800 | [diff] [blame] | 147 | mInfo.canReceiveKeys = env->GetBooleanField(obj, |
Jeff Brown | 9302c87 | 2011-07-13 22:51:29 -0700 | [diff] [blame] | 148 | gInputWindowHandleClassInfo.canReceiveKeys); |
Arthur Hung | 06ad38d | 2018-11-05 19:23:21 +0800 | [diff] [blame] | 149 | mInfo.hasFocus = env->GetBooleanField(obj, |
Jeff Brown | 9302c87 | 2011-07-13 22:51:29 -0700 | [diff] [blame] | 150 | gInputWindowHandleClassInfo.hasFocus); |
Arthur Hung | 06ad38d | 2018-11-05 19:23:21 +0800 | [diff] [blame] | 151 | mInfo.hasWallpaper = env->GetBooleanField(obj, |
Jeff Brown | 9302c87 | 2011-07-13 22:51:29 -0700 | [diff] [blame] | 152 | gInputWindowHandleClassInfo.hasWallpaper); |
Arthur Hung | 06ad38d | 2018-11-05 19:23:21 +0800 | [diff] [blame] | 153 | mInfo.paused = env->GetBooleanField(obj, |
Jeff Brown | 9302c87 | 2011-07-13 22:51:29 -0700 | [diff] [blame] | 154 | gInputWindowHandleClassInfo.paused); |
Arthur Hung | 06ad38d | 2018-11-05 19:23:21 +0800 | [diff] [blame] | 155 | mInfo.layer = env->GetIntField(obj, |
Jeff Brown | 9302c87 | 2011-07-13 22:51:29 -0700 | [diff] [blame] | 156 | gInputWindowHandleClassInfo.layer); |
Arthur Hung | 06ad38d | 2018-11-05 19:23:21 +0800 | [diff] [blame] | 157 | mInfo.ownerPid = env->GetIntField(obj, |
Jeff Brown | 9302c87 | 2011-07-13 22:51:29 -0700 | [diff] [blame] | 158 | gInputWindowHandleClassInfo.ownerPid); |
Arthur Hung | 06ad38d | 2018-11-05 19:23:21 +0800 | [diff] [blame] | 159 | mInfo.ownerUid = env->GetIntField(obj, |
Jeff Brown | 9302c87 | 2011-07-13 22:51:29 -0700 | [diff] [blame] | 160 | gInputWindowHandleClassInfo.ownerUid); |
Arthur Hung | 06ad38d | 2018-11-05 19:23:21 +0800 | [diff] [blame] | 161 | mInfo.inputFeatures = env->GetIntField(obj, |
Jeff Brown | 9302c87 | 2011-07-13 22:51:29 -0700 | [diff] [blame] | 162 | gInputWindowHandleClassInfo.inputFeatures); |
Arthur Hung | 06ad38d | 2018-11-05 19:23:21 +0800 | [diff] [blame] | 163 | mInfo.displayId = env->GetIntField(obj, |
Jeff Brown | 83d616a | 2012-09-09 20:33:43 -0700 | [diff] [blame] | 164 | gInputWindowHandleClassInfo.displayId); |
Tiger Huang | 04dc4cc | 2019-01-17 18:41:41 +0800 | [diff] [blame] | 165 | mInfo.portalToDisplayId = env->GetIntField(obj, |
| 166 | gInputWindowHandleClassInfo.portalToDisplayId); |
Jeff Brown | 9302c87 | 2011-07-13 22:51:29 -0700 | [diff] [blame] | 167 | |
Robert Carr | 0bcbe64 | 2018-10-11 19:07:43 -0700 | [diff] [blame] | 168 | jobject inputApplicationHandleObj = env->GetObjectField(obj, |
| 169 | gInputWindowHandleClassInfo.inputApplicationHandle); |
| 170 | if (inputApplicationHandleObj) { |
| 171 | sp<InputApplicationHandle> inputApplicationHandle = |
Riddle Hsu | cd958bc | 2019-01-23 15:40:26 +0800 | [diff] [blame] | 172 | android_view_InputApplicationHandle_getHandle(env, inputApplicationHandleObj); |
Robert Carr | 0bcbe64 | 2018-10-11 19:07:43 -0700 | [diff] [blame] | 173 | if (inputApplicationHandle != nullptr) { |
| 174 | inputApplicationHandle->updateInfo(); |
| 175 | mInfo.applicationInfo = *(inputApplicationHandle->getInfo()); |
| 176 | } |
| 177 | env->DeleteLocalRef(inputApplicationHandleObj); |
| 178 | } |
| 179 | |
Vishnu Nair | 40efb71 | 2019-03-12 13:37:51 -0700 | [diff] [blame] | 180 | mInfo.replaceTouchableRegionWithCrop = env->GetBooleanField(obj, |
| 181 | gInputWindowHandleClassInfo.replaceTouchableRegionWithCrop); |
| 182 | |
Vishnu Nair | bc9beab | 2019-06-25 17:28:58 -0700 | [diff] [blame] | 183 | jobject weakSurfaceCtrl = env->GetObjectField(obj, |
| 184 | gInputWindowHandleClassInfo.touchableRegionSurfaceControl.ctrl); |
| 185 | bool touchableRegionCropHandleSet = false; |
| 186 | if (weakSurfaceCtrl) { |
Vishnu Nair | 40efb71 | 2019-03-12 13:37:51 -0700 | [diff] [blame] | 187 | // Promote java weak reference. |
Vishnu Nair | bc9beab | 2019-06-25 17:28:58 -0700 | [diff] [blame] | 188 | jobject strongSurfaceCtrl = env->CallObjectMethod(weakSurfaceCtrl, |
| 189 | gInputWindowHandleClassInfo.touchableRegionSurfaceControl.get); |
| 190 | if (strongSurfaceCtrl) { |
| 191 | jlong mNativeObject = env->GetLongField(strongSurfaceCtrl, |
| 192 | gInputWindowHandleClassInfo.touchableRegionSurfaceControl.mNativeObject); |
| 193 | if (mNativeObject) { |
| 194 | auto ctrl = reinterpret_cast<SurfaceControl *>(mNativeObject); |
| 195 | mInfo.touchableRegionCropHandle = ctrl->getHandle(); |
| 196 | touchableRegionCropHandleSet = true; |
| 197 | } |
| 198 | env->DeleteLocalRef(strongSurfaceCtrl); |
Vishnu Nair | 40efb71 | 2019-03-12 13:37:51 -0700 | [diff] [blame] | 199 | } |
Vishnu Nair | bc9beab | 2019-06-25 17:28:58 -0700 | [diff] [blame] | 200 | env->DeleteLocalRef(weakSurfaceCtrl); |
| 201 | } |
| 202 | if (!touchableRegionCropHandleSet) { |
| 203 | mInfo.touchableRegionCropHandle.clear(); |
Vishnu Nair | 40efb71 | 2019-03-12 13:37:51 -0700 | [diff] [blame] | 204 | } |
| 205 | |
Jeff Brown | 9302c87 | 2011-07-13 22:51:29 -0700 | [diff] [blame] | 206 | env->DeleteLocalRef(obj); |
| 207 | return true; |
| 208 | } |
| 209 | |
Jeff Brown | 928e054 | 2011-01-10 11:17:36 -0800 | [diff] [blame] | 210 | |
| 211 | // --- Global functions --- |
| 212 | |
Riddle Hsu | cd958bc | 2019-01-23 15:40:26 +0800 | [diff] [blame] | 213 | sp<NativeInputWindowHandle> android_view_InputWindowHandle_getHandle( |
Jeff Brown | 928e054 | 2011-01-10 11:17:36 -0800 | [diff] [blame] | 214 | JNIEnv* env, jobject inputWindowHandleObj) { |
| 215 | if (!inputWindowHandleObj) { |
| 216 | return NULL; |
| 217 | } |
| 218 | |
| 219 | AutoMutex _l(gHandleMutex); |
| 220 | |
Ashok Bhat | 7e2a9dc | 2014-01-02 19:43:30 +0000 | [diff] [blame] | 221 | jlong ptr = env->GetLongField(inputWindowHandleObj, gInputWindowHandleClassInfo.ptr); |
Jeff Brown | 928e054 | 2011-01-10 11:17:36 -0800 | [diff] [blame] | 222 | NativeInputWindowHandle* handle; |
| 223 | if (ptr) { |
| 224 | handle = reinterpret_cast<NativeInputWindowHandle*>(ptr); |
| 225 | } else { |
Jeff Brown | 928e054 | 2011-01-10 11:17:36 -0800 | [diff] [blame] | 226 | jweak objWeak = env->NewWeakGlobalRef(inputWindowHandleObj); |
Robert Carr | 0bcbe64 | 2018-10-11 19:07:43 -0700 | [diff] [blame] | 227 | handle = new NativeInputWindowHandle(objWeak); |
Riddle Hsu | cd958bc | 2019-01-23 15:40:26 +0800 | [diff] [blame] | 228 | handle->incStrong((void*)android_view_InputWindowHandle_getHandle); |
Ashok Bhat | 7e2a9dc | 2014-01-02 19:43:30 +0000 | [diff] [blame] | 229 | env->SetLongField(inputWindowHandleObj, gInputWindowHandleClassInfo.ptr, |
| 230 | reinterpret_cast<jlong>(handle)); |
Jeff Brown | 928e054 | 2011-01-10 11:17:36 -0800 | [diff] [blame] | 231 | } |
| 232 | return handle; |
| 233 | } |
| 234 | |
| 235 | |
| 236 | // --- JNI --- |
| 237 | |
Riddle Hsu | cd958bc | 2019-01-23 15:40:26 +0800 | [diff] [blame] | 238 | static void android_view_InputWindowHandle_nativeDispose(JNIEnv* env, jobject obj) { |
Jeff Brown | 928e054 | 2011-01-10 11:17:36 -0800 | [diff] [blame] | 239 | AutoMutex _l(gHandleMutex); |
| 240 | |
Ashok Bhat | 7e2a9dc | 2014-01-02 19:43:30 +0000 | [diff] [blame] | 241 | jlong ptr = env->GetLongField(obj, gInputWindowHandleClassInfo.ptr); |
Jeff Brown | 928e054 | 2011-01-10 11:17:36 -0800 | [diff] [blame] | 242 | if (ptr) { |
Ashok Bhat | 7e2a9dc | 2014-01-02 19:43:30 +0000 | [diff] [blame] | 243 | env->SetLongField(obj, gInputWindowHandleClassInfo.ptr, 0); |
Jeff Brown | 928e054 | 2011-01-10 11:17:36 -0800 | [diff] [blame] | 244 | |
| 245 | NativeInputWindowHandle* handle = reinterpret_cast<NativeInputWindowHandle*>(ptr); |
Riddle Hsu | cd958bc | 2019-01-23 15:40:26 +0800 | [diff] [blame] | 246 | handle->decStrong((void*)android_view_InputWindowHandle_getHandle); |
Jeff Brown | 928e054 | 2011-01-10 11:17:36 -0800 | [diff] [blame] | 247 | } |
| 248 | } |
| 249 | |
| 250 | |
Daniel Micay | 76f6a86 | 2015-09-19 17:31:01 -0400 | [diff] [blame] | 251 | static const JNINativeMethod gInputWindowHandleMethods[] = { |
Jeff Brown | 928e054 | 2011-01-10 11:17:36 -0800 | [diff] [blame] | 252 | /* name, signature, funcPtr */ |
| 253 | { "nativeDispose", "()V", |
Riddle Hsu | cd958bc | 2019-01-23 15:40:26 +0800 | [diff] [blame] | 254 | (void*) android_view_InputWindowHandle_nativeDispose }, |
Jeff Brown | 928e054 | 2011-01-10 11:17:36 -0800 | [diff] [blame] | 255 | }; |
| 256 | |
| 257 | #define FIND_CLASS(var, className) \ |
| 258 | var = env->FindClass(className); \ |
Chih-Hung Hsieh | 6c89616 | 2016-05-19 15:29:38 -0700 | [diff] [blame] | 259 | LOG_FATAL_IF(! (var), "Unable to find class " className); |
Jeff Brown | 928e054 | 2011-01-10 11:17:36 -0800 | [diff] [blame] | 260 | |
| 261 | #define GET_FIELD_ID(var, clazz, fieldName, fieldDescriptor) \ |
| 262 | var = env->GetFieldID(clazz, fieldName, fieldDescriptor); \ |
Chih-Hung Hsieh | 6c89616 | 2016-05-19 15:29:38 -0700 | [diff] [blame] | 263 | LOG_FATAL_IF(! (var), "Unable to find field " fieldName); |
Jeff Brown | 928e054 | 2011-01-10 11:17:36 -0800 | [diff] [blame] | 264 | |
Vishnu Nair | 40efb71 | 2019-03-12 13:37:51 -0700 | [diff] [blame] | 265 | #define GET_METHOD_ID(var, clazz, methodName, methodSignature) \ |
| 266 | var = env->GetMethodID(clazz, methodName, methodSignature); \ |
| 267 | LOG_FATAL_IF(! (var), "Unable to find method " methodName); |
| 268 | |
Riddle Hsu | cd958bc | 2019-01-23 15:40:26 +0800 | [diff] [blame] | 269 | int register_android_view_InputWindowHandle(JNIEnv* env) { |
Robert Carr | 788f574 | 2018-07-30 17:46:45 -0700 | [diff] [blame] | 270 | int res = jniRegisterNativeMethods(env, "android/view/InputWindowHandle", |
Jeff Brown | 928e054 | 2011-01-10 11:17:36 -0800 | [diff] [blame] | 271 | gInputWindowHandleMethods, NELEM(gInputWindowHandleMethods)); |
Bernhard Rosenkränzer | 9c1c90e | 2014-11-12 14:45:58 +0100 | [diff] [blame] | 272 | (void) res; // Faked use when LOG_NDEBUG. |
Jeff Brown | 928e054 | 2011-01-10 11:17:36 -0800 | [diff] [blame] | 273 | LOG_FATAL_IF(res < 0, "Unable to register native methods."); |
| 274 | |
Carl Shapiro | 17cc33a | 2011-03-05 20:53:16 -0800 | [diff] [blame] | 275 | jclass clazz; |
Robert Carr | 788f574 | 2018-07-30 17:46:45 -0700 | [diff] [blame] | 276 | FIND_CLASS(clazz, "android/view/InputWindowHandle"); |
Jeff Brown | 928e054 | 2011-01-10 11:17:36 -0800 | [diff] [blame] | 277 | |
Carl Shapiro | 17cc33a | 2011-03-05 20:53:16 -0800 | [diff] [blame] | 278 | GET_FIELD_ID(gInputWindowHandleClassInfo.ptr, clazz, |
Ashok Bhat | 7e2a9dc | 2014-01-02 19:43:30 +0000 | [diff] [blame] | 279 | "ptr", "J"); |
Jeff Brown | 928e054 | 2011-01-10 11:17:36 -0800 | [diff] [blame] | 280 | |
Siarhei Vishniakou | e890f59 | 2018-10-15 18:53:06 -0700 | [diff] [blame] | 281 | GET_FIELD_ID(gInputWindowHandleClassInfo.inputApplicationHandle, clazz, |
Robert Carr | 788f574 | 2018-07-30 17:46:45 -0700 | [diff] [blame] | 282 | "inputApplicationHandle", "Landroid/view/InputApplicationHandle;"); |
Jeff Brown | 928e054 | 2011-01-10 11:17:36 -0800 | [diff] [blame] | 283 | |
Robert Carr | eadae82 | 2018-10-11 19:07:03 -0700 | [diff] [blame] | 284 | GET_FIELD_ID(gInputWindowHandleClassInfo.token, clazz, |
| 285 | "token", "Landroid/os/IBinder;"); |
Jeff Brown | 9302c87 | 2011-07-13 22:51:29 -0700 | [diff] [blame] | 286 | |
| 287 | GET_FIELD_ID(gInputWindowHandleClassInfo.name, clazz, |
| 288 | "name", "Ljava/lang/String;"); |
| 289 | |
| 290 | GET_FIELD_ID(gInputWindowHandleClassInfo.layoutParamsFlags, clazz, |
| 291 | "layoutParamsFlags", "I"); |
| 292 | |
| 293 | GET_FIELD_ID(gInputWindowHandleClassInfo.layoutParamsType, clazz, |
| 294 | "layoutParamsType", "I"); |
| 295 | |
| 296 | GET_FIELD_ID(gInputWindowHandleClassInfo.dispatchingTimeoutNanos, clazz, |
| 297 | "dispatchingTimeoutNanos", "J"); |
| 298 | |
| 299 | GET_FIELD_ID(gInputWindowHandleClassInfo.frameLeft, clazz, |
| 300 | "frameLeft", "I"); |
| 301 | |
| 302 | GET_FIELD_ID(gInputWindowHandleClassInfo.frameTop, clazz, |
| 303 | "frameTop", "I"); |
| 304 | |
| 305 | GET_FIELD_ID(gInputWindowHandleClassInfo.frameRight, clazz, |
| 306 | "frameRight", "I"); |
| 307 | |
| 308 | GET_FIELD_ID(gInputWindowHandleClassInfo.frameBottom, clazz, |
| 309 | "frameBottom", "I"); |
| 310 | |
Robert Carr | fcc0852 | 2018-11-14 14:02:52 -0800 | [diff] [blame] | 311 | GET_FIELD_ID(gInputWindowHandleClassInfo.surfaceInset, clazz, |
| 312 | "surfaceInset", "I"); |
| 313 | |
Jeff Brown | 9302c87 | 2011-07-13 22:51:29 -0700 | [diff] [blame] | 314 | GET_FIELD_ID(gInputWindowHandleClassInfo.scaleFactor, clazz, |
| 315 | "scaleFactor", "F"); |
| 316 | |
| 317 | GET_FIELD_ID(gInputWindowHandleClassInfo.touchableRegion, clazz, |
| 318 | "touchableRegion", "Landroid/graphics/Region;"); |
| 319 | |
| 320 | GET_FIELD_ID(gInputWindowHandleClassInfo.visible, clazz, |
| 321 | "visible", "Z"); |
| 322 | |
| 323 | GET_FIELD_ID(gInputWindowHandleClassInfo.canReceiveKeys, clazz, |
| 324 | "canReceiveKeys", "Z"); |
| 325 | |
| 326 | GET_FIELD_ID(gInputWindowHandleClassInfo.hasFocus, clazz, |
| 327 | "hasFocus", "Z"); |
| 328 | |
| 329 | GET_FIELD_ID(gInputWindowHandleClassInfo.hasWallpaper, clazz, |
| 330 | "hasWallpaper", "Z"); |
| 331 | |
| 332 | GET_FIELD_ID(gInputWindowHandleClassInfo.paused, clazz, |
| 333 | "paused", "Z"); |
| 334 | |
| 335 | GET_FIELD_ID(gInputWindowHandleClassInfo.layer, clazz, |
| 336 | "layer", "I"); |
| 337 | |
| 338 | GET_FIELD_ID(gInputWindowHandleClassInfo.ownerPid, clazz, |
| 339 | "ownerPid", "I"); |
| 340 | |
| 341 | GET_FIELD_ID(gInputWindowHandleClassInfo.ownerUid, clazz, |
| 342 | "ownerUid", "I"); |
| 343 | |
| 344 | GET_FIELD_ID(gInputWindowHandleClassInfo.inputFeatures, clazz, |
| 345 | "inputFeatures", "I"); |
Jeff Brown | 83d616a | 2012-09-09 20:33:43 -0700 | [diff] [blame] | 346 | |
| 347 | GET_FIELD_ID(gInputWindowHandleClassInfo.displayId, clazz, |
| 348 | "displayId", "I"); |
Tiger Huang | 04dc4cc | 2019-01-17 18:41:41 +0800 | [diff] [blame] | 349 | |
| 350 | GET_FIELD_ID(gInputWindowHandleClassInfo.portalToDisplayId, clazz, |
| 351 | "portalToDisplayId", "I"); |
Vishnu Nair | 40efb71 | 2019-03-12 13:37:51 -0700 | [diff] [blame] | 352 | |
| 353 | GET_FIELD_ID(gInputWindowHandleClassInfo.replaceTouchableRegionWithCrop, clazz, |
| 354 | "replaceTouchableRegionWithCrop", "Z"); |
| 355 | |
| 356 | jclass weakRefClazz; |
| 357 | FIND_CLASS(weakRefClazz, "java/lang/ref/Reference"); |
| 358 | |
Vishnu Nair | bc9beab | 2019-06-25 17:28:58 -0700 | [diff] [blame] | 359 | GET_METHOD_ID(gInputWindowHandleClassInfo.touchableRegionSurfaceControl.get, weakRefClazz, |
Vishnu Nair | 40efb71 | 2019-03-12 13:37:51 -0700 | [diff] [blame] | 360 | "get", "()Ljava/lang/Object;") |
| 361 | |
Vishnu Nair | bc9beab | 2019-06-25 17:28:58 -0700 | [diff] [blame] | 362 | GET_FIELD_ID(gInputWindowHandleClassInfo.touchableRegionSurfaceControl.ctrl, clazz, |
| 363 | "touchableRegionSurfaceControl", "Ljava/lang/ref/WeakReference;"); |
| 364 | |
| 365 | jclass surfaceControlClazz; |
| 366 | FIND_CLASS(surfaceControlClazz, "android/view/SurfaceControl"); |
| 367 | GET_FIELD_ID(gInputWindowHandleClassInfo.touchableRegionSurfaceControl.mNativeObject, |
| 368 | surfaceControlClazz, "mNativeObject", "J"); |
| 369 | |
Jeff Brown | 928e054 | 2011-01-10 11:17:36 -0800 | [diff] [blame] | 370 | return 0; |
| 371 | } |
| 372 | |
| 373 | } /* namespace android */ |