com_android_server_input_InputManagerService.cpp revision 9f25b7fdf216c9ef0bd2322cd223eeaf0d60f77f
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 "InputManager-JNI" 1846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 199c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown//#define LOG_NDEBUG 0 209c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 219c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown// Log debug messages about InputReaderPolicy 22349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown#define DEBUG_INPUT_READER_POLICY 0 239c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 249c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown// Log debug messages about InputDispatcherPolicy 25349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown#define DEBUG_INPUT_DISPATCHER_POLICY 0 269c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 2783c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown 2846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#include "JNIHelp.h" 2946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#include "jni.h" 30349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown#include <limits.h> 3146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#include <android_runtime/AndroidRuntime.h> 32b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 3346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#include <utils/Log.h> 3405dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown#include <utils/Looper.h> 3546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#include <utils/threads.h> 3683c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown 37b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown#include <input/InputManager.h> 38b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown#include <input/PointerController.h> 395541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown#include <input/SpriteController.h> 40b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 4105dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown#include <android_os_MessageQueue.h> 429f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown#include <android_view_InputDevice.h> 43b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown#include <android_view_KeyEvent.h> 44b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown#include <android_view_MotionEvent.h> 45b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown#include <android_view_InputChannel.h> 462352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown#include <android_view_PointerIcon.h> 47b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown#include <android/graphics/GraphicsJNI.h> 48b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 4900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown#include "com_android_server_PowerManagerService.h" 504532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown#include "com_android_server_input_InputApplicationHandle.h" 514532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown#include "com_android_server_input_InputWindowHandle.h" 5246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 5346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownnamespace android { 5446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 551a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown// The exponent used to calculate the pointer speed scaling factor. 561a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown// The scaling factor is calculated as 2 ^ (speed * exponent), 571a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown// where the speed ranges from -7 to + 7 and is supplied by the user. 58bb3fcba0caf697f1d238a2cbefdf1efe06eded99Jeff Brownstatic const float POINTER_SPEED_EXPONENT = 1.0f / 4; 591a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown 609c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brownstatic struct { 619c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown jmethodID notifyConfigurationChanged; 629c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown jmethodID notifyLidSwitchChanged; 637fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown jmethodID notifyInputChannelBroken; 64349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown jmethodID notifyANR; 650029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown jmethodID filterInputEvent; 66349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown jmethodID interceptKeyBeforeQueueing; 6756194ebec6212e229f4ccdaa4b187166d20013efJeff Brown jmethodID interceptMotionBeforeQueueingWhenScreenOff; 68349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown jmethodID interceptKeyBeforeDispatching; 693915bb845b032dc184dba5e60970b803390ca3edJeff Brown jmethodID dispatchUnhandledKey; 70349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown jmethodID checkInjectEventsPermission; 71fe50892af3b365806a767298dfd8e86447682581Jeff Brown jmethodID getVirtualKeyQuietTimeMillis; 729c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown jmethodID getExcludedDeviceNames; 73a454767b09ecb7d25d00beae0e5a1fdd48605c63Jeff Brown jmethodID getKeyRepeatTimeout; 74a454767b09ecb7d25d00beae0e5a1fdd48605c63Jeff Brown jmethodID getKeyRepeatDelay; 75bb3fcba0caf697f1d238a2cbefdf1efe06eded99Jeff Brown jmethodID getHoverTapTimeout; 76bb3fcba0caf697f1d238a2cbefdf1efe06eded99Jeff Brown jmethodID getHoverTapSlop; 77214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown jmethodID getDoubleTapTimeout; 78214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown jmethodID getLongPressTimeout; 7983c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown jmethodID getPointerLayer; 80b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown jmethodID getPointerIcon; 814532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown} gServiceClassInfo; 829c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 839c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brownstatic struct { 849c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown jclass clazz; 856ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown} gKeyEventClassInfo; 866ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown 876ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brownstatic struct { 886ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown jclass clazz; 896ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown} gMotionEventClassInfo; 906ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown 918d60866e2100db70ecf0502c14768a384514d7e9Jeff Brownstatic struct { 9257c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown jfieldID touchscreen; 9357c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown jfieldID keyboard; 9457c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown jfieldID navigation; 9557c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown} gConfigurationClassInfo; 9657c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown 97928e054931d357326613c78e62f4d850b7c442ffJeff Brown 98928e054931d357326613c78e62f4d850b7c442ffJeff Brown// --- Global functions --- 99928e054931d357326613c78e62f4d850b7c442ffJeff Brown 100214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Browntemplate<typename T> 101214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Browninline static T min(const T& a, const T& b) { 102214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown return a < b ? a : b; 103214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown} 104214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown 105214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Browntemplate<typename T> 106214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Browninline static T max(const T& a, const T& b) { 107214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown return a > b ? a : b; 108214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown} 109214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown 110928e054931d357326613c78e62f4d850b7c442ffJeff Brownstatic jobject getInputApplicationHandleObjLocalRef(JNIEnv* env, 111928e054931d357326613c78e62f4d850b7c442ffJeff Brown const sp<InputApplicationHandle>& inputApplicationHandle) { 112928e054931d357326613c78e62f4d850b7c442ffJeff Brown if (inputApplicationHandle == NULL) { 113928e054931d357326613c78e62f4d850b7c442ffJeff Brown return NULL; 114928e054931d357326613c78e62f4d850b7c442ffJeff Brown } 115928e054931d357326613c78e62f4d850b7c442ffJeff Brown return static_cast<NativeInputApplicationHandle*>(inputApplicationHandle.get())-> 116928e054931d357326613c78e62f4d850b7c442ffJeff Brown getInputApplicationHandleObjLocalRef(env); 117928e054931d357326613c78e62f4d850b7c442ffJeff Brown} 118928e054931d357326613c78e62f4d850b7c442ffJeff Brown 119928e054931d357326613c78e62f4d850b7c442ffJeff Brownstatic jobject getInputWindowHandleObjLocalRef(JNIEnv* env, 120928e054931d357326613c78e62f4d850b7c442ffJeff Brown const sp<InputWindowHandle>& inputWindowHandle) { 121928e054931d357326613c78e62f4d850b7c442ffJeff Brown if (inputWindowHandle == NULL) { 122928e054931d357326613c78e62f4d850b7c442ffJeff Brown return NULL; 123928e054931d357326613c78e62f4d850b7c442ffJeff Brown } 124928e054931d357326613c78e62f4d850b7c442ffJeff Brown return static_cast<NativeInputWindowHandle*>(inputWindowHandle.get())-> 125928e054931d357326613c78e62f4d850b7c442ffJeff Brown getInputWindowHandleObjLocalRef(env); 126928e054931d357326613c78e62f4d850b7c442ffJeff Brown} 127928e054931d357326613c78e62f4d850b7c442ffJeff Brown 1282352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brownstatic void loadSystemIconAsSprite(JNIEnv* env, jobject contextObj, int32_t style, 1292352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown SpriteIcon* outSpriteIcon) { 1302352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown PointerIcon pointerIcon; 1312352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown status_t status = android_view_PointerIcon_loadSystemIcon(env, 1322352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown contextObj, style, &pointerIcon); 1332352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown if (!status) { 1342352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown pointerIcon.bitmap.copyTo(&outSpriteIcon->bitmap, SkBitmap::kARGB_8888_Config); 1352352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown outSpriteIcon->hotSpotX = pointerIcon.hotSpotX; 1362352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown outSpriteIcon->hotSpotY = pointerIcon.hotSpotY; 1372352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown } 1382352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown} 1392352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown 140905805ad7ce18a386076fff99264f821bbad9f83Jeff Brownenum { 141905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown WM_ACTION_PASS_TO_USER = 1, 142905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown WM_ACTION_POKE_USER_ACTIVITY = 2, 143905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown WM_ACTION_GO_TO_SLEEP = 4, 144905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown}; 145905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown 146928e054931d357326613c78e62f4d850b7c442ffJeff Brown 147928e054931d357326613c78e62f4d850b7c442ffJeff Brown// --- NativeInputManager --- 14883c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown 1499c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brownclass NativeInputManager : public virtual RefBase, 1509c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown public virtual InputReaderPolicyInterface, 1512352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown public virtual InputDispatcherPolicyInterface, 1522352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown public virtual PointerControllerPolicyInterface { 1539c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brownprotected: 1549c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown virtual ~NativeInputManager(); 1559c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 15646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownpublic: 1574532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager(jobject contextObj, jobject serviceObj, const sp<Looper>& looper); 1589c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 1599c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown inline sp<InputManager> getInputManager() const { return mInputManager; } 16046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 161b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown void dump(String8& dump); 162e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown 163bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown void setDisplaySize(int32_t displayId, int32_t width, int32_t height, 164bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown int32_t externalWidth, int32_t externalHeight); 16546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown void setDisplayOrientation(int32_t displayId, int32_t orientation); 16646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 1677fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown status_t registerInputChannel(JNIEnv* env, const sp<InputChannel>& inputChannel, 168928e054931d357326613c78e62f4d850b7c442ffJeff Brown const sp<InputWindowHandle>& inputWindowHandle, bool monitor); 1697fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown status_t unregisterInputChannel(JNIEnv* env, const sp<InputChannel>& inputChannel); 1707fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown 1719302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown void setInputWindows(JNIEnv* env, jobjectArray windowHandleObjArray); 1729302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown void setFocusedApplication(JNIEnv* env, jobject applicationHandleObj); 173349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown void setInputDispatchMode(bool enabled, bool frozen); 17405dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown void setSystemUiVisibility(int32_t visibility); 1751a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown void setPointerSpeed(int32_t speed); 176daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown void setShowTouches(bool enabled); 177349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown 1789c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown /* --- InputReaderPolicyInterface implementation --- */ 1799c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 180214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown virtual void getReaderConfiguration(InputReaderConfiguration* outConfig); 18183c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown virtual sp<PointerControllerInterface> obtainPointerController(int32_t deviceId); 18246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 1839c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown /* --- InputDispatcherPolicyInterface implementation --- */ 18446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 185e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown virtual void notifySwitch(nsecs_t when, int32_t switchCode, int32_t switchValue, 186e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown uint32_t policyFlags); 1879c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown virtual void notifyConfigurationChanged(nsecs_t when); 188519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown virtual nsecs_t notifyANR(const sp<InputApplicationHandle>& inputApplicationHandle, 189928e054931d357326613c78e62f4d850b7c442ffJeff Brown const sp<InputWindowHandle>& inputWindowHandle); 190928e054931d357326613c78e62f4d850b7c442ffJeff Brown virtual void notifyInputChannelBroken(const sp<InputWindowHandle>& inputWindowHandle); 1910029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown virtual bool filterInputEvent(const InputEvent* inputEvent, uint32_t policyFlags); 192214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown virtual void getDispatcherConfiguration(InputDispatcherConfiguration* outConfig); 193214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown virtual bool isKeyRepeatEnabled(); 1941f2451007c660091b7b090c1ea332f9044515d2dJeff Brown virtual void interceptKeyBeforeQueueing(const KeyEvent* keyEvent, uint32_t& policyFlags); 19556194ebec6212e229f4ccdaa4b187166d20013efJeff Brown virtual void interceptMotionBeforeQueueing(nsecs_t when, uint32_t& policyFlags); 196905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown virtual nsecs_t interceptKeyBeforeDispatching( 197905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown const sp<InputWindowHandle>& inputWindowHandle, 198b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown const KeyEvent* keyEvent, uint32_t policyFlags); 199928e054931d357326613c78e62f4d850b7c442ffJeff Brown virtual bool dispatchUnhandledKey(const sp<InputWindowHandle>& inputWindowHandle, 20049ed71db425c5054e3ad9526496a7e116c89556bJeff Brown const KeyEvent* keyEvent, uint32_t policyFlags, KeyEvent* outFallbackKeyEvent); 20101ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown virtual void pokeUserActivity(nsecs_t eventTime, int32_t eventType); 202b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown virtual bool checkInjectEventsPermissionNonReentrant( 203b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown int32_t injectorPid, int32_t injectorUid); 20446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 2052352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown /* --- PointerControllerPolicyInterface implementation --- */ 2062352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown 2072352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown virtual void loadPointerResources(PointerResources* outResources); 2082352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown 20946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownprivate: 2109c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown sp<InputManager> mInputManager; 21146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 2122352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown jobject mContextObj; 2134532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jobject mServiceObj; 21405dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown sp<Looper> mLooper; 21546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 21683c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown Mutex mLock; 21783c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown struct Locked { 21883c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown // Display size information. 219bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown int32_t displayWidth, displayHeight; // -1 when not initialized 220bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown int32_t displayExternalWidth, displayExternalHeight; // -1 when not initialized 22183c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown int32_t displayOrientation; 22283c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown 22305dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown // System UI visibility. 22405dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown int32_t systemUiVisibility; 22505dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown 2261a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown // Pointer speed. 2271a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown int32_t pointerSpeed; 2281a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown 229474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown // True if pointer gestures are enabled. 230474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown bool pointerGesturesEnabled; 231474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown 232daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown // Show touches feature enable/disable. 233daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown bool showTouches; 234daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown 2355541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown // Sprite controller singleton, created on first use. 2365541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown sp<SpriteController> spriteController; 2375541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown 23883c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown // Pointer controller singleton, created and destroyed as needed. 23983c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown wp<PointerController> pointerController; 24083c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown } mLocked; 24146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 2422352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown void updateInactivityTimeoutLocked(const sp<PointerController>& controller); 24356194ebec6212e229f4ccdaa4b187166d20013efJeff Brown void handleInterceptActions(jint wmActions, nsecs_t when, uint32_t& policyFlags); 2445541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown void ensureSpriteControllerLocked(); 24505dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown 24600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown // Power manager interactions. 2479c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown bool isScreenOn(); 2489c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown bool isScreenBright(); 2499c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 250b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown static bool checkAndClearExceptionFromCallback(JNIEnv* env, const char* methodName); 251a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown 2529c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown static inline JNIEnv* jniEnv() { 25346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown return AndroidRuntime::getJNIEnv(); 25446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 25546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}; 25646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 257928e054931d357326613c78e62f4d850b7c442ffJeff Brown 25846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 2592352b978a3c94cd88f41d0d908f961333fdac1e9Jeff BrownNativeInputManager::NativeInputManager(jobject contextObj, 2604532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jobject serviceObj, const sp<Looper>& looper) : 261214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown mLooper(looper) { 2629c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown JNIEnv* env = jniEnv(); 26346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 2642352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown mContextObj = env->NewGlobalRef(contextObj); 2654532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown mServiceObj = env->NewGlobalRef(serviceObj); 26646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 26783c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown { 26883c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown AutoMutex _l(mLock); 26983c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown mLocked.displayWidth = -1; 27083c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown mLocked.displayHeight = -1; 271bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown mLocked.displayExternalWidth = -1; 272bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown mLocked.displayExternalHeight = -1; 27365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown mLocked.displayOrientation = DISPLAY_ORIENTATION_0; 27405dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown 27505dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown mLocked.systemUiVisibility = ASYSTEM_UI_VISIBILITY_STATUS_BAR_VISIBLE; 2761a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown mLocked.pointerSpeed = 0; 277474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown mLocked.pointerGesturesEnabled = true; 278daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown mLocked.showTouches = false; 27983c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown } 28083c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown 2819c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown sp<EventHub> eventHub = new EventHub(); 2829c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown mInputManager = new InputManager(eventHub, this, this); 2839c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown} 28446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 2859c3cda04d969912bc46184f2b326d1db95e0aba5Jeff BrownNativeInputManager::~NativeInputManager() { 2869c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown JNIEnv* env = jniEnv(); 28746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 2882352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown env->DeleteGlobalRef(mContextObj); 2894532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown env->DeleteGlobalRef(mServiceObj); 2909c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown} 29146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 292b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brownvoid NativeInputManager::dump(String8& dump) { 293b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown mInputManager->getReader()->dump(dump); 294b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown dump.append("\n"); 2956d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown 296b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown mInputManager->getDispatcher()->dump(dump); 297b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown dump.append("\n"); 2989c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown} 29946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 3007fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brownbool NativeInputManager::checkAndClearExceptionFromCallback(JNIEnv* env, const char* methodName) { 3019c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown if (env->ExceptionCheck()) { 3023762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("An exception was thrown by callback '%s'.", methodName); 3039c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown LOGE_EX(env); 3049c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown env->ExceptionClear(); 3059c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown return true; 3069c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown } 3079c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown return false; 3089c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown} 3099c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 310bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brownvoid NativeInputManager::setDisplaySize(int32_t displayId, int32_t width, int32_t height, 311bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown int32_t externalWidth, int32_t externalHeight) { 31265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown bool changed = false; 3139c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown if (displayId == 0) { 31465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown AutoMutex _l(mLock); 3152352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown 31665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown if (mLocked.displayWidth != width || mLocked.displayHeight != height) { 31765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown changed = true; 31865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown mLocked.displayWidth = width; 31965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown mLocked.displayHeight = height; 32083c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown 32165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown sp<PointerController> controller = mLocked.pointerController.promote(); 32265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown if (controller != NULL) { 32365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown controller->setDisplaySize(width, height); 32483c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown } 32565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown } 326bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown 32765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown if (mLocked.displayExternalWidth != externalWidth 32865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown || mLocked.displayExternalHeight != externalHeight) { 32965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown changed = true; 330bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown mLocked.displayExternalWidth = externalWidth; 331bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown mLocked.displayExternalHeight = externalHeight; 33265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown } 33365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown } 33465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown 33565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown if (changed) { 33665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown mInputManager->getReader()->requestRefreshConfiguration( 33765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown InputReaderConfiguration::CHANGE_DISPLAY_INFO); 3389c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown } 3399c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown} 3409c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 3419c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brownvoid NativeInputManager::setDisplayOrientation(int32_t displayId, int32_t orientation) { 34265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown bool changed = false; 3439c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown if (displayId == 0) { 34483c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown AutoMutex _l(mLock); 34583c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown 34683c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown if (mLocked.displayOrientation != orientation) { 34765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown changed = true; 34883c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown mLocked.displayOrientation = orientation; 3499c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 35083c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown sp<PointerController> controller = mLocked.pointerController.promote(); 35183c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown if (controller != NULL) { 35283c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown controller->setDisplayOrientation(orientation); 35383c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown } 35483c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown } 3559c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown } 35665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown 35765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown if (changed) { 35865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown mInputManager->getReader()->requestRefreshConfiguration( 35965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown InputReaderConfiguration::CHANGE_DISPLAY_INFO); 36065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown } 3619c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown} 3629c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 3637fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brownstatus_t NativeInputManager::registerInputChannel(JNIEnv* env, 364928e054931d357326613c78e62f4d850b7c442ffJeff Brown const sp<InputChannel>& inputChannel, 365928e054931d357326613c78e62f4d850b7c442ffJeff Brown const sp<InputWindowHandle>& inputWindowHandle, bool monitor) { 366928e054931d357326613c78e62f4d850b7c442ffJeff Brown return mInputManager->getDispatcher()->registerInputChannel( 367928e054931d357326613c78e62f4d850b7c442ffJeff Brown inputChannel, inputWindowHandle, monitor); 3687fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown} 3697fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown 3707fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brownstatus_t NativeInputManager::unregisterInputChannel(JNIEnv* env, 3717fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown const sp<InputChannel>& inputChannel) { 372b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown return mInputManager->getDispatcher()->unregisterInputChannel(inputChannel); 3737fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown} 3747fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown 375214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brownvoid NativeInputManager::getReaderConfiguration(InputReaderConfiguration* outConfig) { 376214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown JNIEnv* env = jniEnv(); 3779c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 3784532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jint virtualKeyQuietTime = env->CallIntMethod(mServiceObj, 3794532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown gServiceClassInfo.getVirtualKeyQuietTimeMillis); 380214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown if (!checkAndClearExceptionFromCallback(env, "getVirtualKeyQuietTimeMillis")) { 381214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown outConfig->virtualKeyQuietTime = milliseconds_to_nanoseconds(virtualKeyQuietTime); 382fe50892af3b365806a767298dfd8e86447682581Jeff Brown } 3839c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 384214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown outConfig->excludedDeviceNames.clear(); 3854532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jobjectArray excludedDeviceNames = jobjectArray(env->CallObjectMethod(mServiceObj, 3864532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown gServiceClassInfo.getExcludedDeviceNames)); 387214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown if (!checkAndClearExceptionFromCallback(env, "getExcludedDeviceNames") && excludedDeviceNames) { 388214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown jsize length = env->GetArrayLength(excludedDeviceNames); 3899c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown for (jsize i = 0; i < length; i++) { 390214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown jstring item = jstring(env->GetObjectArrayElement(excludedDeviceNames, i)); 3919c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown const char* deviceNameChars = env->GetStringUTFChars(item, NULL); 392214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown outConfig->excludedDeviceNames.add(String8(deviceNameChars)); 3939c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown env->ReleaseStringUTFChars(item, deviceNameChars); 3949c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown env->DeleteLocalRef(item); 3959c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown } 396214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown env->DeleteLocalRef(excludedDeviceNames); 397214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown } 398214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown 3994532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jint hoverTapTimeout = env->CallIntMethod(mServiceObj, 4004532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown gServiceClassInfo.getHoverTapTimeout); 401bb3fcba0caf697f1d238a2cbefdf1efe06eded99Jeff Brown if (!checkAndClearExceptionFromCallback(env, "getHoverTapTimeout")) { 4024532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jint doubleTapTimeout = env->CallIntMethod(mServiceObj, 4034532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown gServiceClassInfo.getDoubleTapTimeout); 404214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown if (!checkAndClearExceptionFromCallback(env, "getDoubleTapTimeout")) { 4054532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jint longPressTimeout = env->CallIntMethod(mServiceObj, 4064532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown gServiceClassInfo.getLongPressTimeout); 407214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown if (!checkAndClearExceptionFromCallback(env, "getLongPressTimeout")) { 408bb3fcba0caf697f1d238a2cbefdf1efe06eded99Jeff Brown outConfig->pointerGestureTapInterval = milliseconds_to_nanoseconds(hoverTapTimeout); 409214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown 410214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown // We must ensure that the tap-drag interval is significantly shorter than 411214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown // the long-press timeout because the tap is held down for the entire duration 412214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown // of the double-tap timeout. 413214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown jint tapDragInterval = max(min(longPressTimeout - 100, 414bb3fcba0caf697f1d238a2cbefdf1efe06eded99Jeff Brown doubleTapTimeout), hoverTapTimeout); 415214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown outConfig->pointerGestureTapDragInterval = 416214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown milliseconds_to_nanoseconds(tapDragInterval); 417214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown } 418214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown } 419214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown } 420214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown 4214532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jint hoverTapSlop = env->CallIntMethod(mServiceObj, 4224532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown gServiceClassInfo.getHoverTapSlop); 423bb3fcba0caf697f1d238a2cbefdf1efe06eded99Jeff Brown if (!checkAndClearExceptionFromCallback(env, "getHoverTapSlop")) { 424bb3fcba0caf697f1d238a2cbefdf1efe06eded99Jeff Brown outConfig->pointerGestureTapSlop = hoverTapSlop; 4259c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown } 4261a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown 4271a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown { // acquire lock 4281a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown AutoMutex _l(mLock); 4291a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown 4301a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown outConfig->pointerVelocityControlParameters.scale = exp2f(mLocked.pointerSpeed 4311a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown * POINTER_SPEED_EXPONENT); 432474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown outConfig->pointerGesturesEnabled = mLocked.pointerGesturesEnabled; 43365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown 434daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown outConfig->showTouches = mLocked.showTouches; 435daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown 43665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown outConfig->setDisplayInfo(0, false /*external*/, 43765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown mLocked.displayWidth, mLocked.displayHeight, mLocked.displayOrientation); 43865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown outConfig->setDisplayInfo(0, true /*external*/, 43965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown mLocked.displayExternalWidth, mLocked.displayExternalHeight, 44065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown mLocked.displayOrientation); 4411a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown } // release lock 4429c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown} 4439c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 44483c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brownsp<PointerControllerInterface> NativeInputManager::obtainPointerController(int32_t deviceId) { 44583c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown AutoMutex _l(mLock); 44683c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown 44783c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown sp<PointerController> controller = mLocked.pointerController.promote(); 44883c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown if (controller == NULL) { 4495541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown ensureSpriteControllerLocked(); 45083c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown 4512352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown controller = new PointerController(this, mLooper, mLocked.spriteController); 45283c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown mLocked.pointerController = controller; 45383c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown 45483c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown controller->setDisplaySize(mLocked.displayWidth, mLocked.displayHeight); 45583c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown controller->setDisplayOrientation(mLocked.displayOrientation); 456b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 4575541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown JNIEnv* env = jniEnv(); 4584532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jobject pointerIconObj = env->CallObjectMethod(mServiceObj, 4594532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown gServiceClassInfo.getPointerIcon); 4602352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown if (!checkAndClearExceptionFromCallback(env, "getPointerIcon")) { 4612352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown PointerIcon pointerIcon; 4622352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown status_t status = android_view_PointerIcon_load(env, pointerIconObj, 4632352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown mContextObj, &pointerIcon); 4642352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown if (!status && !pointerIcon.isNullIcon()) { 4652352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown controller->setPointerIcon(SpriteIcon(pointerIcon.bitmap, 4662352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown pointerIcon.hotSpotX, pointerIcon.hotSpotY)); 4672352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown } else { 4682352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown controller->setPointerIcon(SpriteIcon()); 469b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown } 4702352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown env->DeleteLocalRef(pointerIconObj); 471b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown } 47205dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown 4732352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown updateInactivityTimeoutLocked(controller); 47483c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown } 47583c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown return controller; 47683c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown} 47783c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown 4785541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brownvoid NativeInputManager::ensureSpriteControllerLocked() { 4795541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown if (mLocked.spriteController == NULL) { 4805541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown JNIEnv* env = jniEnv(); 4814532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jint layer = env->CallIntMethod(mServiceObj, gServiceClassInfo.getPointerLayer); 4825541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown if (checkAndClearExceptionFromCallback(env, "getPointerLayer")) { 4835541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown layer = -1; 4845541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown } 4855541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown mLocked.spriteController = new SpriteController(mLooper, layer); 4865541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown } 4875541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown} 4885541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown 489e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brownvoid NativeInputManager::notifySwitch(nsecs_t when, int32_t switchCode, 490e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown int32_t switchValue, uint32_t policyFlags) { 491e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown#if DEBUG_INPUT_DISPATCHER_POLICY 4925baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("notifySwitch - when=%lld, switchCode=%d, switchValue=%d, policyFlags=0x%x", 493e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown when, switchCode, switchValue, policyFlags); 494e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown#endif 495e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown 496e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown JNIEnv* env = jniEnv(); 497e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown 498e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown switch (switchCode) { 499e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown case SW_LID: 50027fd3420ac0498ff5086f71023f443966541aa04Jeff Brown // When switch value is set indicates lid is closed. 5014532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown env->CallVoidMethod(mServiceObj, gServiceClassInfo.notifyLidSwitchChanged, 50227fd3420ac0498ff5086f71023f443966541aa04Jeff Brown when, switchValue == 0 /*lidOpen*/); 503e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown checkAndClearExceptionFromCallback(env, "notifyLidSwitchChanged"); 504e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown break; 505e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown } 506e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown} 507e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown 5089c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brownvoid NativeInputManager::notifyConfigurationChanged(nsecs_t when) { 5099c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown#if DEBUG_INPUT_DISPATCHER_POLICY 5105baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("notifyConfigurationChanged - when=%lld", when); 5119c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown#endif 5129c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 5139c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown JNIEnv* env = jniEnv(); 5149c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 5154532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown env->CallVoidMethod(mServiceObj, gServiceClassInfo.notifyConfigurationChanged, when); 5167fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown checkAndClearExceptionFromCallback(env, "notifyConfigurationChanged"); 5179c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown} 5189c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 519519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brownnsecs_t NativeInputManager::notifyANR(const sp<InputApplicationHandle>& inputApplicationHandle, 520928e054931d357326613c78e62f4d850b7c442ffJeff Brown const sp<InputWindowHandle>& inputWindowHandle) { 521b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown#if DEBUG_INPUT_DISPATCHER_POLICY 5225baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("notifyANR"); 523b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown#endif 524b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown 525b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown JNIEnv* env = jniEnv(); 526b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown 527928e054931d357326613c78e62f4d850b7c442ffJeff Brown jobject inputApplicationHandleObj = 528928e054931d357326613c78e62f4d850b7c442ffJeff Brown getInputApplicationHandleObjLocalRef(env, inputApplicationHandle); 529928e054931d357326613c78e62f4d850b7c442ffJeff Brown jobject inputWindowHandleObj = 530928e054931d357326613c78e62f4d850b7c442ffJeff Brown getInputWindowHandleObjLocalRef(env, inputWindowHandle); 531b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown 5324532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jlong newTimeout = env->CallLongMethod(mServiceObj, 5334532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown gServiceClassInfo.notifyANR, inputApplicationHandleObj, inputWindowHandleObj); 534519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown if (checkAndClearExceptionFromCallback(env, "notifyANR")) { 535b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown newTimeout = 0; // abort dispatch 536519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown } else { 537519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown assert(newTimeout >= 0); 538b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown } 539b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown 540928e054931d357326613c78e62f4d850b7c442ffJeff Brown env->DeleteLocalRef(inputWindowHandleObj); 541928e054931d357326613c78e62f4d850b7c442ffJeff Brown env->DeleteLocalRef(inputApplicationHandleObj); 542b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown return newTimeout; 543b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown} 544b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown 545928e054931d357326613c78e62f4d850b7c442ffJeff Brownvoid NativeInputManager::notifyInputChannelBroken(const sp<InputWindowHandle>& inputWindowHandle) { 5469c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown#if DEBUG_INPUT_DISPATCHER_POLICY 5475baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("notifyInputChannelBroken"); 5489c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown#endif 5499c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 5507fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown JNIEnv* env = jniEnv(); 5517fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown 552928e054931d357326613c78e62f4d850b7c442ffJeff Brown jobject inputWindowHandleObj = 553928e054931d357326613c78e62f4d850b7c442ffJeff Brown getInputWindowHandleObjLocalRef(env, inputWindowHandle); 554928e054931d357326613c78e62f4d850b7c442ffJeff Brown if (inputWindowHandleObj) { 5554532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown env->CallVoidMethod(mServiceObj, gServiceClassInfo.notifyInputChannelBroken, 556928e054931d357326613c78e62f4d850b7c442ffJeff Brown inputWindowHandleObj); 5577fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown checkAndClearExceptionFromCallback(env, "notifyInputChannelBroken"); 5587fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown 559928e054931d357326613c78e62f4d850b7c442ffJeff Brown env->DeleteLocalRef(inputWindowHandleObj); 5607fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown } 5619c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown} 5629c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 563214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brownvoid NativeInputManager::getDispatcherConfiguration(InputDispatcherConfiguration* outConfig) { 564214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown JNIEnv* env = jniEnv(); 565a454767b09ecb7d25d00beae0e5a1fdd48605c63Jeff Brown 5664532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jint keyRepeatTimeout = env->CallIntMethod(mServiceObj, 5674532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown gServiceClassInfo.getKeyRepeatTimeout); 568214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown if (!checkAndClearExceptionFromCallback(env, "getKeyRepeatTimeout")) { 569214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown outConfig->keyRepeatTimeout = milliseconds_to_nanoseconds(keyRepeatTimeout); 5709c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown } 5719c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 5724532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jint keyRepeatDelay = env->CallIntMethod(mServiceObj, 5734532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown gServiceClassInfo.getKeyRepeatDelay); 574214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown if (!checkAndClearExceptionFromCallback(env, "getKeyRepeatDelay")) { 575214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown outConfig->keyRepeatDelay = milliseconds_to_nanoseconds(keyRepeatDelay); 576214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown } 577b21fb104cc95fe7e5daf3b3626241e525c39a3f1Jeff Brown} 578b21fb104cc95fe7e5daf3b3626241e525c39a3f1Jeff Brown 579214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brownbool NativeInputManager::isKeyRepeatEnabled() { 580214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown // Only enable automatic key repeating when the screen is on. 581214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown return isScreenOn(); 582ae9fc03bdccda709101291bbcd3beaa5b6daebfcJeff Brown} 583ae9fc03bdccda709101291bbcd3beaa5b6daebfcJeff Brown 5849302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brownvoid NativeInputManager::setInputWindows(JNIEnv* env, jobjectArray windowHandleObjArray) { 5859302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown Vector<sp<InputWindowHandle> > windowHandles; 5869c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 5879302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown if (windowHandleObjArray) { 5889302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown jsize length = env->GetArrayLength(windowHandleObjArray); 5899302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown for (jsize i = 0; i < length; i++) { 5909302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown jobject windowHandleObj = env->GetObjectArrayElement(windowHandleObjArray, i); 5919302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown if (! windowHandleObj) { 5929302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown break; // found null element indicating end of used portion of the array 5939302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown } 594349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown 5959302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown sp<InputWindowHandle> windowHandle = 5969302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown android_server_InputWindowHandle_getHandle(env, windowHandleObj); 5979302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown if (windowHandle != NULL) { 5989302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown windowHandles.push(windowHandle); 599474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown } 6009302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown env->DeleteLocalRef(windowHandleObj); 601e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown } 602b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown } 603349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown 6049302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown mInputManager->getDispatcher()->setInputWindows(windowHandles); 6059302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown 6069302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown // Do this after the dispatcher has updated the window handle state. 6079302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown bool newPointerGesturesEnabled = true; 6089302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown size_t numWindows = windowHandles.size(); 6099302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown for (size_t i = 0; i < numWindows; i++) { 6109302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown const sp<InputWindowHandle>& windowHandle = windowHandles.itemAt(i); 611cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown const InputWindowInfo* windowInfo = windowHandle->getInfo(); 612cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown if (windowInfo && windowInfo->hasFocus && (windowInfo->inputFeatures 613cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown & InputWindowInfo::INPUT_FEATURE_DISABLE_TOUCH_PAD_GESTURES)) { 6149302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown newPointerGesturesEnabled = false; 6159302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown } 6169302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown } 617474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown 618474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown uint32_t changes = 0; 619474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown { // acquire lock 620474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown AutoMutex _l(mLock); 621474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown 622474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown if (mLocked.pointerGesturesEnabled != newPointerGesturesEnabled) { 623474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown mLocked.pointerGesturesEnabled = newPointerGesturesEnabled; 624474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown changes |= InputReaderConfiguration::CHANGE_POINTER_GESTURE_ENABLEMENT; 625474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown } 626474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown } // release lock 627474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown 628474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown if (changes) { 629474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown mInputManager->getReader()->requestRefreshConfiguration(changes); 630474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown } 631349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown} 632349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown 6339302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brownvoid NativeInputManager::setFocusedApplication(JNIEnv* env, jobject applicationHandleObj) { 6349302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown sp<InputApplicationHandle> applicationHandle = 6359302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown android_server_InputApplicationHandle_getHandle(env, applicationHandleObj); 6369302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown mInputManager->getDispatcher()->setFocusedApplication(applicationHandle); 6379c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown} 6389c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 639b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brownvoid NativeInputManager::setInputDispatchMode(bool enabled, bool frozen) { 640b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown mInputManager->getDispatcher()->setInputDispatchMode(enabled, frozen); 641349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown} 642349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown 64305dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brownvoid NativeInputManager::setSystemUiVisibility(int32_t visibility) { 64405dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown AutoMutex _l(mLock); 64505dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown 64605dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown if (mLocked.systemUiVisibility != visibility) { 64705dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown mLocked.systemUiVisibility = visibility; 64805dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown 64905dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown sp<PointerController> controller = mLocked.pointerController.promote(); 65005dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown if (controller != NULL) { 6512352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown updateInactivityTimeoutLocked(controller); 65205dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown } 65305dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown } 65405dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown} 65505dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown 6562352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brownvoid NativeInputManager::updateInactivityTimeoutLocked(const sp<PointerController>& controller) { 65705dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown bool lightsOut = mLocked.systemUiVisibility & ASYSTEM_UI_VISIBILITY_STATUS_BAR_HIDDEN; 6582352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown controller->setInactivityTimeout(lightsOut 6592352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown ? PointerController::INACTIVITY_TIMEOUT_SHORT 6602352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown : PointerController::INACTIVITY_TIMEOUT_NORMAL); 66105dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown} 66205dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown 6631a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brownvoid NativeInputManager::setPointerSpeed(int32_t speed) { 664474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown { // acquire lock 665474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown AutoMutex _l(mLock); 666474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown 667474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown if (mLocked.pointerSpeed == speed) { 668474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown return; 669474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown } 6701a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown 6716215d3ff4b5dfa52a5d8b9a42e343051f31066a5Steve Block ALOGI("Setting pointer speed to %d.", speed); 6721a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown mLocked.pointerSpeed = speed; 673474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown } // release lock 6741a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown 675474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown mInputManager->getReader()->requestRefreshConfiguration( 676474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown InputReaderConfiguration::CHANGE_POINTER_SPEED); 6771a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown} 6781a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown 679daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brownvoid NativeInputManager::setShowTouches(bool enabled) { 680daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown { // acquire lock 681daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown AutoMutex _l(mLock); 682daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown 683daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown if (mLocked.showTouches == enabled) { 684daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown return; 685daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown } 686daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown 6876215d3ff4b5dfa52a5d8b9a42e343051f31066a5Steve Block ALOGI("Setting show touches feature to %s.", enabled ? "enabled" : "disabled"); 688daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown mLocked.showTouches = enabled; 689daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown } // release lock 690daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown 691daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown mInputManager->getReader()->requestRefreshConfiguration( 692daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown InputReaderConfiguration::CHANGE_SHOW_TOUCHES); 693daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown} 694daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown 695e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brownbool NativeInputManager::isScreenOn() { 696e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown return android_server_PowerManagerService_isScreenOn(); 697e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown} 698e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown 699e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brownbool NativeInputManager::isScreenBright() { 700e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown return android_server_PowerManagerService_isScreenBright(); 701e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown} 702e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown 7030029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brownbool NativeInputManager::filterInputEvent(const InputEvent* inputEvent, uint32_t policyFlags) { 7040029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown jobject inputEventObj; 7050029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown 7060029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown JNIEnv* env = jniEnv(); 7070029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown switch (inputEvent->getType()) { 7080029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown case AINPUT_EVENT_TYPE_KEY: 7090029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown inputEventObj = android_view_KeyEvent_fromNative(env, 7100029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown static_cast<const KeyEvent*>(inputEvent)); 7110029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown break; 7120029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown case AINPUT_EVENT_TYPE_MOTION: 7130029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown inputEventObj = android_view_MotionEvent_obtainAsCopy(env, 7140029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown static_cast<const MotionEvent*>(inputEvent)); 7150029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown break; 7160029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown default: 7170029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown return true; // dispatch the event normally 7180029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown } 7190029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown 7200029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown if (!inputEventObj) { 7213762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("Failed to obtain input event object for filterInputEvent."); 7220029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown return true; // dispatch the event normally 7230029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown } 7240029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown 7250029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown // The callee is responsible for recycling the event. 7264532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jboolean pass = env->CallBooleanMethod(mServiceObj, gServiceClassInfo.filterInputEvent, 7270029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown inputEventObj, policyFlags); 7280029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown if (checkAndClearExceptionFromCallback(env, "filterInputEvent")) { 7290029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown pass = true; 7300029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown } 7310029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown env->DeleteLocalRef(inputEventObj); 7320029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown return pass; 7330029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown} 7340029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown 7351f2451007c660091b7b090c1ea332f9044515d2dJeff Brownvoid NativeInputManager::interceptKeyBeforeQueueing(const KeyEvent* keyEvent, 7361f2451007c660091b7b090c1ea332f9044515d2dJeff Brown uint32_t& policyFlags) { 7373122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown // Policy: 7383122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown // - Ignore untrusted events and pass them along. 7393122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown // - Ask the window manager what to do with normal events and trusted injected events. 7403122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown // - For normal events wake and brighten the screen if currently off or dim. 7413122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown if ((policyFlags & POLICY_FLAG_TRUSTED)) { 7421f2451007c660091b7b090c1ea332f9044515d2dJeff Brown nsecs_t when = keyEvent->getEventTime(); 7433122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown bool isScreenOn = this->isScreenOn(); 7443122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown bool isScreenBright = this->isScreenBright(); 745e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown 7463122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown JNIEnv* env = jniEnv(); 7471f2451007c660091b7b090c1ea332f9044515d2dJeff Brown jobject keyEventObj = android_view_KeyEvent_fromNative(env, keyEvent); 7481f2451007c660091b7b090c1ea332f9044515d2dJeff Brown jint wmActions; 7491f2451007c660091b7b090c1ea332f9044515d2dJeff Brown if (keyEventObj) { 7504532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown wmActions = env->CallIntMethod(mServiceObj, 7514532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown gServiceClassInfo.interceptKeyBeforeQueueing, 7521f2451007c660091b7b090c1ea332f9044515d2dJeff Brown keyEventObj, policyFlags, isScreenOn); 7531f2451007c660091b7b090c1ea332f9044515d2dJeff Brown if (checkAndClearExceptionFromCallback(env, "interceptKeyBeforeQueueing")) { 7541f2451007c660091b7b090c1ea332f9044515d2dJeff Brown wmActions = 0; 7551f2451007c660091b7b090c1ea332f9044515d2dJeff Brown } 7561f2451007c660091b7b090c1ea332f9044515d2dJeff Brown android_view_KeyEvent_recycle(env, keyEventObj); 7571f2451007c660091b7b090c1ea332f9044515d2dJeff Brown env->DeleteLocalRef(keyEventObj); 7581f2451007c660091b7b090c1ea332f9044515d2dJeff Brown } else { 7593762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("Failed to obtain key event object for interceptKeyBeforeQueueing."); 7603122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown wmActions = 0; 761e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown } 762e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown 7631f2451007c660091b7b090c1ea332f9044515d2dJeff Brown if (!(policyFlags & POLICY_FLAG_INJECTED)) { 7643122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown if (!isScreenOn) { 7653122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown policyFlags |= POLICY_FLAG_WOKE_HERE; 7663122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown } 7673122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown 7683122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown if (!isScreenBright) { 7693122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown policyFlags |= POLICY_FLAG_BRIGHT_HERE; 7703122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown } 771e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown } 772e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown 77356194ebec6212e229f4ccdaa4b187166d20013efJeff Brown handleInterceptActions(wmActions, when, /*byref*/ policyFlags); 7743122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown } else { 775e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown policyFlags |= POLICY_FLAG_PASS_TO_USER; 776e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown } 777e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown} 778e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown 77956194ebec6212e229f4ccdaa4b187166d20013efJeff Brownvoid NativeInputManager::interceptMotionBeforeQueueing(nsecs_t when, uint32_t& policyFlags) { 7803122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown // Policy: 7813122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown // - Ignore untrusted events and pass them along. 7823122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown // - No special filtering for injected events required at this time. 7833122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown // - Filter normal events based on screen state. 7843122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown // - For normal events brighten (but do not wake) the screen if currently dim. 7853122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown if ((policyFlags & POLICY_FLAG_TRUSTED) && !(policyFlags & POLICY_FLAG_INJECTED)) { 7863122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown if (isScreenOn()) { 7873122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown policyFlags |= POLICY_FLAG_PASS_TO_USER; 7883122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown 7893122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown if (!isScreenBright()) { 7903122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown policyFlags |= POLICY_FLAG_BRIGHT_HERE; 7913122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown } 79256194ebec6212e229f4ccdaa4b187166d20013efJeff Brown } else { 79356194ebec6212e229f4ccdaa4b187166d20013efJeff Brown JNIEnv* env = jniEnv(); 7944532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jint wmActions = env->CallIntMethod(mServiceObj, 7954532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown gServiceClassInfo.interceptMotionBeforeQueueingWhenScreenOff, 79656194ebec6212e229f4ccdaa4b187166d20013efJeff Brown policyFlags); 79756194ebec6212e229f4ccdaa4b187166d20013efJeff Brown if (checkAndClearExceptionFromCallback(env, 79856194ebec6212e229f4ccdaa4b187166d20013efJeff Brown "interceptMotionBeforeQueueingWhenScreenOff")) { 79956194ebec6212e229f4ccdaa4b187166d20013efJeff Brown wmActions = 0; 80056194ebec6212e229f4ccdaa4b187166d20013efJeff Brown } 80156194ebec6212e229f4ccdaa4b187166d20013efJeff Brown 80256194ebec6212e229f4ccdaa4b187166d20013efJeff Brown policyFlags |= POLICY_FLAG_WOKE_HERE | POLICY_FLAG_BRIGHT_HERE; 80356194ebec6212e229f4ccdaa4b187166d20013efJeff Brown handleInterceptActions(wmActions, when, /*byref*/ policyFlags); 804e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown } 8053122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown } else { 8063122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown policyFlags |= POLICY_FLAG_PASS_TO_USER; 807e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown } 808e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown} 809e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown 81056194ebec6212e229f4ccdaa4b187166d20013efJeff Brownvoid NativeInputManager::handleInterceptActions(jint wmActions, nsecs_t when, 81156194ebec6212e229f4ccdaa4b187166d20013efJeff Brown uint32_t& policyFlags) { 81256194ebec6212e229f4ccdaa4b187166d20013efJeff Brown if (wmActions & WM_ACTION_GO_TO_SLEEP) { 8139267beb8689e6febe3dd23f2a3025736c50eef01Jeff Brown#if DEBUG_INPUT_DISPATCHER_POLICY 8145baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("handleInterceptActions: Going to sleep."); 81556194ebec6212e229f4ccdaa4b187166d20013efJeff Brown#endif 81656194ebec6212e229f4ccdaa4b187166d20013efJeff Brown android_server_PowerManagerService_goToSleep(when); 81756194ebec6212e229f4ccdaa4b187166d20013efJeff Brown } 81856194ebec6212e229f4ccdaa4b187166d20013efJeff Brown 81956194ebec6212e229f4ccdaa4b187166d20013efJeff Brown if (wmActions & WM_ACTION_POKE_USER_ACTIVITY) { 8209267beb8689e6febe3dd23f2a3025736c50eef01Jeff Brown#if DEBUG_INPUT_DISPATCHER_POLICY 8215baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("handleInterceptActions: Poking user activity."); 82256194ebec6212e229f4ccdaa4b187166d20013efJeff Brown#endif 82356194ebec6212e229f4ccdaa4b187166d20013efJeff Brown android_server_PowerManagerService_userActivity(when, POWER_MANAGER_BUTTON_EVENT); 82456194ebec6212e229f4ccdaa4b187166d20013efJeff Brown } 82556194ebec6212e229f4ccdaa4b187166d20013efJeff Brown 82656194ebec6212e229f4ccdaa4b187166d20013efJeff Brown if (wmActions & WM_ACTION_PASS_TO_USER) { 82756194ebec6212e229f4ccdaa4b187166d20013efJeff Brown policyFlags |= POLICY_FLAG_PASS_TO_USER; 82856194ebec6212e229f4ccdaa4b187166d20013efJeff Brown } else { 8299267beb8689e6febe3dd23f2a3025736c50eef01Jeff Brown#if DEBUG_INPUT_DISPATCHER_POLICY 8305baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("handleInterceptActions: Not passing key to user."); 83156194ebec6212e229f4ccdaa4b187166d20013efJeff Brown#endif 83256194ebec6212e229f4ccdaa4b187166d20013efJeff Brown } 83356194ebec6212e229f4ccdaa4b187166d20013efJeff Brown} 83456194ebec6212e229f4ccdaa4b187166d20013efJeff Brown 835905805ad7ce18a386076fff99264f821bbad9f83Jeff Brownnsecs_t NativeInputManager::interceptKeyBeforeDispatching( 836928e054931d357326613c78e62f4d850b7c442ffJeff Brown const sp<InputWindowHandle>& inputWindowHandle, 837e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown const KeyEvent* keyEvent, uint32_t policyFlags) { 8383122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown // Policy: 8393122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown // - Ignore untrusted events and pass them along. 8403122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown // - Filter normal events and trusted injected events through the window manager policy to 8413122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown // handle the HOME key and the like. 842905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown nsecs_t result = 0; 8433122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown if (policyFlags & POLICY_FLAG_TRUSTED) { 8443122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown JNIEnv* env = jniEnv(); 8453122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown 846928e054931d357326613c78e62f4d850b7c442ffJeff Brown // Note: inputWindowHandle may be null. 847928e054931d357326613c78e62f4d850b7c442ffJeff Brown jobject inputWindowHandleObj = getInputWindowHandleObjLocalRef(env, inputWindowHandle); 8481f2451007c660091b7b090c1ea332f9044515d2dJeff Brown jobject keyEventObj = android_view_KeyEvent_fromNative(env, keyEvent); 8491f2451007c660091b7b090c1ea332f9044515d2dJeff Brown if (keyEventObj) { 8504532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jlong delayMillis = env->CallLongMethod(mServiceObj, 8514532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown gServiceClassInfo.interceptKeyBeforeDispatching, 852928e054931d357326613c78e62f4d850b7c442ffJeff Brown inputWindowHandleObj, keyEventObj, policyFlags); 8531f2451007c660091b7b090c1ea332f9044515d2dJeff Brown bool error = checkAndClearExceptionFromCallback(env, "interceptKeyBeforeDispatching"); 8541f2451007c660091b7b090c1ea332f9044515d2dJeff Brown android_view_KeyEvent_recycle(env, keyEventObj); 8551f2451007c660091b7b090c1ea332f9044515d2dJeff Brown env->DeleteLocalRef(keyEventObj); 856905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown if (!error) { 857905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown if (delayMillis < 0) { 858905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown result = -1; 859905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown } else if (delayMillis > 0) { 860905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown result = milliseconds_to_nanoseconds(delayMillis); 861905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown } 862905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown } 8631f2451007c660091b7b090c1ea332f9044515d2dJeff Brown } else { 8643762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("Failed to obtain key event object for interceptKeyBeforeDispatching."); 8651f2451007c660091b7b090c1ea332f9044515d2dJeff Brown } 866928e054931d357326613c78e62f4d850b7c442ffJeff Brown env->DeleteLocalRef(inputWindowHandleObj); 8673122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown } 8681f2451007c660091b7b090c1ea332f9044515d2dJeff Brown return result; 869d0097871828bb7d5d6eec06cadd92c2e3358849bJeff Brown} 870d0097871828bb7d5d6eec06cadd92c2e3358849bJeff Brown 871928e054931d357326613c78e62f4d850b7c442ffJeff Brownbool NativeInputManager::dispatchUnhandledKey(const sp<InputWindowHandle>& inputWindowHandle, 87249ed71db425c5054e3ad9526496a7e116c89556bJeff Brown const KeyEvent* keyEvent, uint32_t policyFlags, KeyEvent* outFallbackKeyEvent) { 8733915bb845b032dc184dba5e60970b803390ca3edJeff Brown // Policy: 8743915bb845b032dc184dba5e60970b803390ca3edJeff Brown // - Ignore untrusted events and do not perform default handling. 87549ed71db425c5054e3ad9526496a7e116c89556bJeff Brown bool result = false; 8763915bb845b032dc184dba5e60970b803390ca3edJeff Brown if (policyFlags & POLICY_FLAG_TRUSTED) { 8773915bb845b032dc184dba5e60970b803390ca3edJeff Brown JNIEnv* env = jniEnv(); 8783915bb845b032dc184dba5e60970b803390ca3edJeff Brown 879928e054931d357326613c78e62f4d850b7c442ffJeff Brown // Note: inputWindowHandle may be null. 880928e054931d357326613c78e62f4d850b7c442ffJeff Brown jobject inputWindowHandleObj = getInputWindowHandleObjLocalRef(env, inputWindowHandle); 8811f2451007c660091b7b090c1ea332f9044515d2dJeff Brown jobject keyEventObj = android_view_KeyEvent_fromNative(env, keyEvent); 8821f2451007c660091b7b090c1ea332f9044515d2dJeff Brown if (keyEventObj) { 8834532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jobject fallbackKeyEventObj = env->CallObjectMethod(mServiceObj, 8844532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown gServiceClassInfo.dispatchUnhandledKey, 885928e054931d357326613c78e62f4d850b7c442ffJeff Brown inputWindowHandleObj, keyEventObj, policyFlags); 886da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown if (checkAndClearExceptionFromCallback(env, "dispatchUnhandledKey")) { 887da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown fallbackKeyEventObj = NULL; 888da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown } 8891f2451007c660091b7b090c1ea332f9044515d2dJeff Brown android_view_KeyEvent_recycle(env, keyEventObj); 8901f2451007c660091b7b090c1ea332f9044515d2dJeff Brown env->DeleteLocalRef(keyEventObj); 89149ed71db425c5054e3ad9526496a7e116c89556bJeff Brown 89249ed71db425c5054e3ad9526496a7e116c89556bJeff Brown if (fallbackKeyEventObj) { 89349ed71db425c5054e3ad9526496a7e116c89556bJeff Brown // Note: outFallbackKeyEvent may be the same object as keyEvent. 89449ed71db425c5054e3ad9526496a7e116c89556bJeff Brown if (!android_view_KeyEvent_toNative(env, fallbackKeyEventObj, 89549ed71db425c5054e3ad9526496a7e116c89556bJeff Brown outFallbackKeyEvent)) { 89649ed71db425c5054e3ad9526496a7e116c89556bJeff Brown result = true; 89749ed71db425c5054e3ad9526496a7e116c89556bJeff Brown } 89849ed71db425c5054e3ad9526496a7e116c89556bJeff Brown android_view_KeyEvent_recycle(env, fallbackKeyEventObj); 89949ed71db425c5054e3ad9526496a7e116c89556bJeff Brown env->DeleteLocalRef(fallbackKeyEventObj); 90049ed71db425c5054e3ad9526496a7e116c89556bJeff Brown } 9011f2451007c660091b7b090c1ea332f9044515d2dJeff Brown } else { 9023762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("Failed to obtain key event object for dispatchUnhandledKey."); 9031f2451007c660091b7b090c1ea332f9044515d2dJeff Brown } 904928e054931d357326613c78e62f4d850b7c442ffJeff Brown env->DeleteLocalRef(inputWindowHandleObj); 9053915bb845b032dc184dba5e60970b803390ca3edJeff Brown } 9061f2451007c660091b7b090c1ea332f9044515d2dJeff Brown return result; 9073915bb845b032dc184dba5e60970b803390ca3edJeff Brown} 9083915bb845b032dc184dba5e60970b803390ca3edJeff Brown 90901ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brownvoid NativeInputManager::pokeUserActivity(nsecs_t eventTime, int32_t eventType) { 91001ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown android_server_PowerManagerService_userActivity(eventTime, eventType); 9116d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown} 9126d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown 913349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown 914b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brownbool NativeInputManager::checkInjectEventsPermissionNonReentrant( 915b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown int32_t injectorPid, int32_t injectorUid) { 916b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown JNIEnv* env = jniEnv(); 9174532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jboolean result = env->CallBooleanMethod(mServiceObj, 9184532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown gServiceClassInfo.checkInjectEventsPermission, injectorPid, injectorUid); 919da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown if (checkAndClearExceptionFromCallback(env, "checkInjectEventsPermission")) { 920da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown result = false; 921da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown } 922349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown return result; 923349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown} 924349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown 9252352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brownvoid NativeInputManager::loadPointerResources(PointerResources* outResources) { 9262352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown JNIEnv* env = jniEnv(); 9272352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown 9282352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown loadSystemIconAsSprite(env, mContextObj, POINTER_ICON_STYLE_SPOT_HOVER, 9292352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown &outResources->spotHover); 9302352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown loadSystemIconAsSprite(env, mContextObj, POINTER_ICON_STYLE_SPOT_TOUCH, 9312352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown &outResources->spotTouch); 9322352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown loadSystemIconAsSprite(env, mContextObj, POINTER_ICON_STYLE_SPOT_ANCHOR, 9332352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown &outResources->spotAnchor); 9342352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown} 9352352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown 93683c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown 9379c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown// ---------------------------------------------------------------------------- 9389c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 9394532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic jint nativeInit(JNIEnv* env, jclass clazz, 9404532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jobject serviceObj, jobject contextObj, jobject messageQueueObj) { 941603b44589682db3ff33ade172facb0c5e309f1beJeff Brown sp<MessageQueue> messageQueue = android_os_MessageQueue_getMessageQueue(env, messageQueueObj); 942603b44589682db3ff33ade172facb0c5e309f1beJeff Brown NativeInputManager* im = new NativeInputManager(contextObj, serviceObj, 943603b44589682db3ff33ade172facb0c5e309f1beJeff Brown messageQueue->getLooper()); 9444532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown im->incStrong(serviceObj); 9454532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown return reinterpret_cast<jint>(im); 94646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} 94746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 9484532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic void nativeStart(JNIEnv* env, jclass clazz, jint ptr) { 9494532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 95046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 9514532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown status_t result = im->getInputManager()->start(); 95246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown if (result) { 95346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown jniThrowRuntimeException(env, "Input manager could not be started."); 95446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 95546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} 95646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 9574532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic void nativeSetDisplaySize(JNIEnv* env, jclass clazz, jint ptr, 958bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown jint displayId, jint width, jint height, jint externalWidth, jint externalHeight) { 9594532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 96046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 96146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown // XXX we could get this from the SurfaceFlinger directly instead of requiring it 96246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown // to be passed in like this, not sure which is better but leaving it like this 96346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown // keeps the window manager in direct control of when display transitions propagate down 96446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown // to the input dispatcher 9654532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown im->setDisplaySize(displayId, width, height, externalWidth, externalHeight); 96646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} 96746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 9684532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic void nativeSetDisplayOrientation(JNIEnv* env, jclass clazz, 9694532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jint ptr, jint displayId, jint orientation) { 9704532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 97146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 9724532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown im->setDisplayOrientation(displayId, orientation); 97346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} 97446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 9754532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic jint nativeGetScanCodeState(JNIEnv* env, jclass clazz, 9764532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jint ptr, jint deviceId, jint sourceMask, jint scanCode) { 9774532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 97846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 9794532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown return im->getInputManager()->getReader()->getScanCodeState( 9806d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown deviceId, uint32_t(sourceMask), scanCode); 98146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} 98246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 9834532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic jint nativeGetKeyCodeState(JNIEnv* env, jclass clazz, 9844532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jint ptr, jint deviceId, jint sourceMask, jint keyCode) { 9854532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 98646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 9874532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown return im->getInputManager()->getReader()->getKeyCodeState( 9886d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown deviceId, uint32_t(sourceMask), keyCode); 98946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} 99046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 9914532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic jint nativeGetSwitchState(JNIEnv* env, jclass clazz, 9924532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jint ptr, jint deviceId, jint sourceMask, jint sw) { 9934532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 99446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 9954532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown return im->getInputManager()->getReader()->getSwitchState( 9966d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown deviceId, uint32_t(sourceMask), sw); 99746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} 99846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 9994532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic jboolean nativeHasKeys(JNIEnv* env, jclass clazz, 10004532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jint ptr, jint deviceId, jint sourceMask, jintArray keyCodes, jbooleanArray outFlags) { 10014532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 100246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 100346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown int32_t* codes = env->GetIntArrayElements(keyCodes, NULL); 100446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown uint8_t* flags = env->GetBooleanArrayElements(outFlags, NULL); 100546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown jsize numCodes = env->GetArrayLength(keyCodes); 100646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown jboolean result; 10076d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown if (numCodes == env->GetArrayLength(keyCodes)) { 10084532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown result = im->getInputManager()->getReader()->hasKeys( 10096d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown deviceId, uint32_t(sourceMask), numCodes, codes, flags); 101046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } else { 101146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown result = JNI_FALSE; 101246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 101346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 101446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown env->ReleaseBooleanArrayElements(outFlags, flags, 0); 101546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown env->ReleaseIntArrayElements(keyCodes, codes, 0); 101646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown return result; 101746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} 101846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 101946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownstatic void throwInputChannelNotInitialized(JNIEnv* env) { 102046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown jniThrowException(env, "java/lang/IllegalStateException", 102146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown "inputChannel is not initialized"); 102246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} 102346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 10244532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic void handleInputChannelDisposed(JNIEnv* env, 102546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown jobject inputChannelObj, const sp<InputChannel>& inputChannel, void* data) { 10264532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = static_cast<NativeInputManager*>(data); 10274532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown 10288564c8da817a845353d213acd8636b76f567b234Steve Block ALOGW("Input channel object '%s' was disposed without first being unregistered with " 102946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown "the input manager!", inputChannel->getName().string()); 10304532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown im->unregisterInputChannel(env, inputChannel); 103146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} 103246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 10334532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic void nativeRegisterInputChannel(JNIEnv* env, jclass clazz, 10344532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jint ptr, jobject inputChannelObj, jobject inputWindowHandleObj, jboolean monitor) { 10354532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 103646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 103746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown sp<InputChannel> inputChannel = android_view_InputChannel_getInputChannel(env, 103846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown inputChannelObj); 103946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown if (inputChannel == NULL) { 104046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown throwInputChannelNotInitialized(env); 104146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown return; 104246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 104346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 1044928e054931d357326613c78e62f4d850b7c442ffJeff Brown sp<InputWindowHandle> inputWindowHandle = 1045928e054931d357326613c78e62f4d850b7c442ffJeff Brown android_server_InputWindowHandle_getHandle(env, inputWindowHandleObj); 10467fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown 10474532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown status_t status = im->registerInputChannel( 1048928e054931d357326613c78e62f4d850b7c442ffJeff Brown env, inputChannel, inputWindowHandle, monitor); 104946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown if (status) { 1050cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown String8 message; 1051cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown message.appendFormat("Failed to register input channel. status=%d", status); 1052cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown jniThrowRuntimeException(env, message.string()); 105346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown return; 105446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 105546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 1056a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown if (! monitor) { 1057a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown android_view_InputChannel_setDisposeCallback(env, inputChannelObj, 10584532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown handleInputChannelDisposed, im); 1059a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown } 106046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} 106146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 10624532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic void nativeUnregisterInputChannel(JNIEnv* env, jclass clazz, 10634532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jint ptr, jobject inputChannelObj) { 10644532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 106546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 106646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown sp<InputChannel> inputChannel = android_view_InputChannel_getInputChannel(env, 106746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown inputChannelObj); 106846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown if (inputChannel == NULL) { 106946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown throwInputChannelNotInitialized(env); 107046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown return; 107146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 107246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 107346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown android_view_InputChannel_setDisposeCallback(env, inputChannelObj, NULL, NULL); 107446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 10754532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown status_t status = im->unregisterInputChannel(env, inputChannel); 1076cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown if (status && status != BAD_VALUE) { // ignore already unregistered channel 1077cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown String8 message; 1078cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown message.appendFormat("Failed to unregister input channel. status=%d", status); 1079cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown jniThrowRuntimeException(env, message.string()); 108046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 108146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} 108246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 10834532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic void nativeSetInputFilterEnabled(JNIEnv* env, jclass clazz, 10844532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jint ptr, jboolean enabled) { 10854532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 10860029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown 10874532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown im->getInputManager()->getDispatcher()->setInputFilterEnabled(enabled); 10880029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown} 10890029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown 10904532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic jint nativeInjectInputEvent(JNIEnv* env, jclass clazz, 10914532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jint ptr, jobject inputEventObj, jint injectorPid, jint injectorUid, 10920029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown jint syncMode, jint timeoutMillis, jint policyFlags) { 10934532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 10947fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown 10956ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown if (env->IsInstanceOf(inputEventObj, gKeyEventClassInfo.clazz)) { 10966ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown KeyEvent keyEvent; 10971f2451007c660091b7b090c1ea332f9044515d2dJeff Brown status_t status = android_view_KeyEvent_toNative(env, inputEventObj, & keyEvent); 10981f2451007c660091b7b090c1ea332f9044515d2dJeff Brown if (status) { 10991f2451007c660091b7b090c1ea332f9044515d2dJeff Brown jniThrowRuntimeException(env, "Could not read contents of KeyEvent object."); 11001f2451007c660091b7b090c1ea332f9044515d2dJeff Brown return INPUT_EVENT_INJECTION_FAILED; 11011f2451007c660091b7b090c1ea332f9044515d2dJeff Brown } 11027fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown 11034532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown return im->getInputManager()->getDispatcher()->injectInputEvent( 11040029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown & keyEvent, injectorPid, injectorUid, syncMode, timeoutMillis, 11050029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown uint32_t(policyFlags)); 11066ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown } else if (env->IsInstanceOf(inputEventObj, gMotionEventClassInfo.clazz)) { 11072ed2462aa29c564f5231f317c27b3188da875e52Jeff Brown const MotionEvent* motionEvent = android_view_MotionEvent_getNativePtr(env, inputEventObj); 11082ed2462aa29c564f5231f317c27b3188da875e52Jeff Brown if (!motionEvent) { 11091f2451007c660091b7b090c1ea332f9044515d2dJeff Brown jniThrowRuntimeException(env, "Could not read contents of MotionEvent object."); 11101f2451007c660091b7b090c1ea332f9044515d2dJeff Brown return INPUT_EVENT_INJECTION_FAILED; 11111f2451007c660091b7b090c1ea332f9044515d2dJeff Brown } 11127fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown 11134532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown return im->getInputManager()->getDispatcher()->injectInputEvent( 11140029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown motionEvent, injectorPid, injectorUid, syncMode, timeoutMillis, 11150029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown uint32_t(policyFlags)); 11166ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown } else { 11176ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown jniThrowRuntimeException(env, "Invalid input event type."); 11187fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown return INPUT_EVENT_INJECTION_FAILED; 11197fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown } 11207fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown} 11217fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown 11224532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic void nativeSetInputWindows(JNIEnv* env, jclass clazz, 11234532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jint ptr, jobjectArray windowHandleObjArray) { 11244532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 1125349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown 11264532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown im->setInputWindows(env, windowHandleObjArray); 1127349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown} 1128349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown 11294532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic void nativeSetFocusedApplication(JNIEnv* env, jclass clazz, 11304532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jint ptr, jobject applicationHandleObj) { 11314532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 1132349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown 11334532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown im->setFocusedApplication(env, applicationHandleObj); 1134349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown} 1135349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown 11364532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic void nativeSetInputDispatchMode(JNIEnv* env, 11374532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jclass clazz, jint ptr, jboolean enabled, jboolean frozen) { 11384532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 1139349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown 11404532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown im->setInputDispatchMode(enabled, frozen); 1141349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown} 1142349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown 11434532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic void nativeSetSystemUiVisibility(JNIEnv* env, 11444532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jclass clazz, jint ptr, jint visibility) { 11454532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 114605dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown 11474532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown im->setSystemUiVisibility(visibility); 114805dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown} 114905dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown 11504532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic jobject nativeGetInputDevice(JNIEnv* env, 11514532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jclass clazz, jint ptr, jint deviceId) { 11524532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 11538d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown 11548d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown InputDeviceInfo deviceInfo; 11554532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown status_t status = im->getInputManager()->getReader()->getInputDeviceInfo( 11568d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown deviceId, & deviceInfo); 11578d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown if (status) { 11588d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown return NULL; 11598d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown } 11608d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown 11619f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown return android_view_InputDevice_create(env, deviceInfo); 11628d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown} 11638d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown 11644532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic jintArray nativeGetInputDeviceIds(JNIEnv* env, 11654532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jclass clazz, jint ptr) { 11664532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 11678d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown 11688d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown Vector<int> deviceIds; 11694532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown im->getInputManager()->getReader()->getInputDeviceIds(deviceIds); 11708d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown 11718d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown jintArray deviceIdsObj = env->NewIntArray(deviceIds.size()); 11728d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown if (! deviceIdsObj) { 11738d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown return NULL; 11748d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown } 11758d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown 11768d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown env->SetIntArrayRegion(deviceIdsObj, 0, deviceIds.size(), deviceIds.array()); 11778d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown return deviceIdsObj; 11788d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown} 11798d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown 11804532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic void nativeGetInputConfiguration(JNIEnv* env, 11814532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jclass clazz, jint ptr, jobject configObj) { 11824532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 118357c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown 118457c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown InputConfiguration config; 11854532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown im->getInputManager()->getReader()->getInputConfiguration(& config); 118657c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown 118757c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown env->SetIntField(configObj, gConfigurationClassInfo.touchscreen, config.touchScreen); 118857c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown env->SetIntField(configObj, gConfigurationClassInfo.keyboard, config.keyboard); 118957c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown env->SetIntField(configObj, gConfigurationClassInfo.navigation, config.navigation); 119057c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown} 119157c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown 11924532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic jboolean nativeTransferTouchFocus(JNIEnv* env, 11934532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jclass clazz, jint ptr, jobject fromChannelObj, jobject toChannelObj) { 11944532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 1195e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown 1196e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown sp<InputChannel> fromChannel = 1197e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown android_view_InputChannel_getInputChannel(env, fromChannelObj); 1198e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown sp<InputChannel> toChannel = 1199e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown android_view_InputChannel_getInputChannel(env, toChannelObj); 1200e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown 1201e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown if (fromChannel == NULL || toChannel == NULL) { 1202e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown return false; 1203e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown } 1204e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown 12054532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown return im->getInputManager()->getDispatcher()-> 1206e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown transferTouchFocus(fromChannel, toChannel); 1207e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown} 1208e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown 12094532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic void nativeSetPointerSpeed(JNIEnv* env, 12104532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jclass clazz, jint ptr, jint speed) { 12114532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 12121a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown 12134532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown im->setPointerSpeed(speed); 12141a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown} 12151a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown 12164532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic void nativeSetShowTouches(JNIEnv* env, 12174532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jclass clazz, jint ptr, jboolean enabled) { 12184532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 1219daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown 12204532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown im->setShowTouches(enabled); 1221daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown} 1222daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown 12234532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic jstring nativeDump(JNIEnv* env, jclass clazz, jint ptr) { 12244532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 1225e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown 1226b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown String8 dump; 12274532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown im->dump(dump); 1228e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown return env->NewStringUTF(dump.string()); 1229e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown} 1230e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown 12314532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic void nativeMonitor(JNIEnv* env, jclass clazz, jint ptr) { 12324532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 123389ef0720ee8e0ac6ae1758faa917e4d6c9606fb4Jeff Brown 12344532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown im->getInputManager()->getReader()->monitor(); 12354532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown im->getInputManager()->getDispatcher()->monitor(); 123689ef0720ee8e0ac6ae1758faa917e4d6c9606fb4Jeff Brown} 123789ef0720ee8e0ac6ae1758faa917e4d6c9606fb4Jeff Brown 12389c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown// ---------------------------------------------------------------------------- 12399c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 124046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownstatic JNINativeMethod gInputManagerMethods[] = { 124146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown /* name, signature, funcPtr */ 12424532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown { "nativeInit", 12434532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown "(Lcom/android/server/input/InputManagerService;Landroid/content/Context;Landroid/os/MessageQueue;)I", 12444532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeInit }, 12454532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown { "nativeStart", "(I)V", 12464532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeStart }, 12474532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown { "nativeSetDisplaySize", "(IIIIII)V", 12484532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeSetDisplaySize }, 12494532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown { "nativeSetDisplayOrientation", "(III)V", 12504532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeSetDisplayOrientation }, 12514532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown { "nativeGetScanCodeState", "(IIII)I", 12524532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeGetScanCodeState }, 12534532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown { "nativeGetKeyCodeState", "(IIII)I", 12544532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeGetKeyCodeState }, 12554532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown { "nativeGetSwitchState", "(IIII)I", 12564532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeGetSwitchState }, 12574532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown { "nativeHasKeys", "(III[I[Z)Z", 12584532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeHasKeys }, 1259928e054931d357326613c78e62f4d850b7c442ffJeff Brown { "nativeRegisterInputChannel", 12604532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown "(ILandroid/view/InputChannel;Lcom/android/server/input/InputWindowHandle;Z)V", 12614532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeRegisterInputChannel }, 12624532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown { "nativeUnregisterInputChannel", "(ILandroid/view/InputChannel;)V", 12634532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeUnregisterInputChannel }, 12644532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown { "nativeSetInputFilterEnabled", "(IZ)V", 12654532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeSetInputFilterEnabled }, 12664532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown { "nativeInjectInputEvent", "(ILandroid/view/InputEvent;IIIII)I", 12674532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeInjectInputEvent }, 12684532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown { "nativeSetInputWindows", "(I[Lcom/android/server/input/InputWindowHandle;)V", 12694532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeSetInputWindows }, 12704532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown { "nativeSetFocusedApplication", "(ILcom/android/server/input/InputApplicationHandle;)V", 12714532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeSetFocusedApplication }, 12724532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown { "nativeSetInputDispatchMode", "(IZZ)V", 12734532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeSetInputDispatchMode }, 12744532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown { "nativeSetSystemUiVisibility", "(II)V", 12754532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeSetSystemUiVisibility }, 12764532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown { "nativeGetInputDevice", "(II)Landroid/view/InputDevice;", 12774532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeGetInputDevice }, 12784532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown { "nativeGetInputDeviceIds", "(I)[I", 12794532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeGetInputDeviceIds }, 12804532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown { "nativeGetInputConfiguration", "(ILandroid/content/res/Configuration;)V", 12814532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeGetInputConfiguration }, 12824532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown { "nativeTransferTouchFocus", "(ILandroid/view/InputChannel;Landroid/view/InputChannel;)Z", 12834532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeTransferTouchFocus }, 12844532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown { "nativeSetPointerSpeed", "(II)V", 12854532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeSetPointerSpeed }, 12864532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown { "nativeSetShowTouches", "(IZ)V", 12874532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeSetShowTouches }, 12884532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown { "nativeDump", "(I)Ljava/lang/String;", 12894532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeDump }, 12904532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown { "nativeMonitor", "(I)V", 12914532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeMonitor }, 129246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}; 129346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 129446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#define FIND_CLASS(var, className) \ 129546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown var = env->FindClass(className); \ 129617cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro LOG_FATAL_IF(! var, "Unable to find class " className); 129746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 129846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#define GET_METHOD_ID(var, clazz, methodName, methodDescriptor) \ 129946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown var = env->GetMethodID(clazz, methodName, methodDescriptor); \ 130046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown LOG_FATAL_IF(! var, "Unable to find method " methodName); 130146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 130246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#define GET_FIELD_ID(var, clazz, fieldName, fieldDescriptor) \ 130346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown var = env->GetFieldID(clazz, fieldName, fieldDescriptor); \ 130446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown LOG_FATAL_IF(! var, "Unable to find field " fieldName); 130546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 130646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownint register_android_server_InputManager(JNIEnv* env) { 13074532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown int res = jniRegisterNativeMethods(env, "com/android/server/input/InputManagerService", 130846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown gInputManagerMethods, NELEM(gInputManagerMethods)); 130946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown LOG_FATAL_IF(res < 0, "Unable to register native methods."); 131046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 13119c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown // Callbacks 131246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 131317cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro jclass clazz; 13144532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown FIND_CLASS(clazz, "com/android/server/input/InputManagerService"); 131546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 13164532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown GET_METHOD_ID(gServiceClassInfo.notifyConfigurationChanged, clazz, 131757c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown "notifyConfigurationChanged", "(J)V"); 131846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 13194532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown GET_METHOD_ID(gServiceClassInfo.notifyLidSwitchChanged, clazz, 132046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown "notifyLidSwitchChanged", "(JZ)V"); 132146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 13224532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown GET_METHOD_ID(gServiceClassInfo.notifyInputChannelBroken, clazz, 13234532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown "notifyInputChannelBroken", "(Lcom/android/server/input/InputWindowHandle;)V"); 13247fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown 13254532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown GET_METHOD_ID(gServiceClassInfo.notifyANR, clazz, 1326928e054931d357326613c78e62f4d850b7c442ffJeff Brown "notifyANR", 13274532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown "(Lcom/android/server/input/InputApplicationHandle;Lcom/android/server/input/InputWindowHandle;)J"); 1328349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown 13294532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown GET_METHOD_ID(gServiceClassInfo.filterInputEvent, clazz, 13300029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown "filterInputEvent", "(Landroid/view/InputEvent;I)Z"); 13310029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown 13324532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown GET_METHOD_ID(gServiceClassInfo.interceptKeyBeforeQueueing, clazz, 13331f2451007c660091b7b090c1ea332f9044515d2dJeff Brown "interceptKeyBeforeQueueing", "(Landroid/view/KeyEvent;IZ)I"); 1334349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown 13354532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown GET_METHOD_ID(gServiceClassInfo.interceptMotionBeforeQueueingWhenScreenOff, 133617cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro clazz, 133756194ebec6212e229f4ccdaa4b187166d20013efJeff Brown "interceptMotionBeforeQueueingWhenScreenOff", "(I)I"); 133856194ebec6212e229f4ccdaa4b187166d20013efJeff Brown 13394532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown GET_METHOD_ID(gServiceClassInfo.interceptKeyBeforeDispatching, clazz, 13401f2451007c660091b7b090c1ea332f9044515d2dJeff Brown "interceptKeyBeforeDispatching", 13414532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown "(Lcom/android/server/input/InputWindowHandle;Landroid/view/KeyEvent;I)J"); 1342349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown 13434532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown GET_METHOD_ID(gServiceClassInfo.dispatchUnhandledKey, clazz, 134449ed71db425c5054e3ad9526496a7e116c89556bJeff Brown "dispatchUnhandledKey", 13454532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown "(Lcom/android/server/input/InputWindowHandle;Landroid/view/KeyEvent;I)Landroid/view/KeyEvent;"); 13463915bb845b032dc184dba5e60970b803390ca3edJeff Brown 13474532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown GET_METHOD_ID(gServiceClassInfo.checkInjectEventsPermission, clazz, 1348349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown "checkInjectEventsPermission", "(II)Z"); 134946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 13504532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown GET_METHOD_ID(gServiceClassInfo.getVirtualKeyQuietTimeMillis, clazz, 1351fe50892af3b365806a767298dfd8e86447682581Jeff Brown "getVirtualKeyQuietTimeMillis", "()I"); 1352fe50892af3b365806a767298dfd8e86447682581Jeff Brown 13534532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown GET_METHOD_ID(gServiceClassInfo.getExcludedDeviceNames, clazz, 135446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown "getExcludedDeviceNames", "()[Ljava/lang/String;"); 135546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 13564532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown GET_METHOD_ID(gServiceClassInfo.getKeyRepeatTimeout, clazz, 1357a454767b09ecb7d25d00beae0e5a1fdd48605c63Jeff Brown "getKeyRepeatTimeout", "()I"); 1358a454767b09ecb7d25d00beae0e5a1fdd48605c63Jeff Brown 13594532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown GET_METHOD_ID(gServiceClassInfo.getKeyRepeatDelay, clazz, 1360a454767b09ecb7d25d00beae0e5a1fdd48605c63Jeff Brown "getKeyRepeatDelay", "()I"); 1361a454767b09ecb7d25d00beae0e5a1fdd48605c63Jeff Brown 13624532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown GET_METHOD_ID(gServiceClassInfo.getHoverTapTimeout, clazz, 1363bb3fcba0caf697f1d238a2cbefdf1efe06eded99Jeff Brown "getHoverTapTimeout", "()I"); 1364bb3fcba0caf697f1d238a2cbefdf1efe06eded99Jeff Brown 13654532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown GET_METHOD_ID(gServiceClassInfo.getHoverTapSlop, clazz, 1366bb3fcba0caf697f1d238a2cbefdf1efe06eded99Jeff Brown "getHoverTapSlop", "()I"); 1367214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown 13684532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown GET_METHOD_ID(gServiceClassInfo.getDoubleTapTimeout, clazz, 1369214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown "getDoubleTapTimeout", "()I"); 1370214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown 13714532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown GET_METHOD_ID(gServiceClassInfo.getLongPressTimeout, clazz, 1372214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown "getLongPressTimeout", "()I"); 1373214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown 13744532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown GET_METHOD_ID(gServiceClassInfo.getPointerLayer, clazz, 137583c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown "getPointerLayer", "()I"); 137683c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown 13774532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown GET_METHOD_ID(gServiceClassInfo.getPointerIcon, clazz, 13782352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown "getPointerIcon", "()Landroid/view/PointerIcon;"); 1379b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 13806ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown // KeyEvent 13816ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown 13826ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown FIND_CLASS(gKeyEventClassInfo.clazz, "android/view/KeyEvent"); 138317cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro gKeyEventClassInfo.clazz = jclass(env->NewGlobalRef(gKeyEventClassInfo.clazz)); 138417cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro 13858d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown // MotionEvent 13866ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown 13876ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown FIND_CLASS(gMotionEventClassInfo.clazz, "android/view/MotionEvent"); 138817cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro gMotionEventClassInfo.clazz = jclass(env->NewGlobalRef(gMotionEventClassInfo.clazz)); 13896ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown 139057c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown // Configuration 139157c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown 139217cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro FIND_CLASS(clazz, "android/content/res/Configuration"); 139357c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown 139417cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro GET_FIELD_ID(gConfigurationClassInfo.touchscreen, clazz, 139557c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown "touchscreen", "I"); 139657c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown 139717cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro GET_FIELD_ID(gConfigurationClassInfo.keyboard, clazz, 139857c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown "keyboard", "I"); 139957c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown 140017cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro GET_FIELD_ID(gConfigurationClassInfo.navigation, clazz, 140157c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown "navigation", "I"); 140257c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown 140346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown return 0; 140446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} 140546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 140646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} /* namespace android */ 1407