com_android_server_input_InputManagerService.cpp revision 4532e6158474a263d9d26c2b42240bcf7ce9b172
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> 42b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown#include <android_view_KeyEvent.h> 43b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown#include <android_view_MotionEvent.h> 44b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown#include <android_view_InputChannel.h> 452352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown#include <android_view_PointerIcon.h> 46b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown#include <android/graphics/GraphicsJNI.h> 47b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 4800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown#include "com_android_server_PowerManagerService.h" 494532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown#include "com_android_server_input_InputApplicationHandle.h" 504532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown#include "com_android_server_input_InputWindowHandle.h" 5146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 5246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownnamespace android { 5346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 541a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown// The exponent used to calculate the pointer speed scaling factor. 551a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown// The scaling factor is calculated as 2 ^ (speed * exponent), 561a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown// where the speed ranges from -7 to + 7 and is supplied by the user. 57bb3fcba0caf697f1d238a2cbefdf1efe06eded99Jeff Brownstatic const float POINTER_SPEED_EXPONENT = 1.0f / 4; 581a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown 599c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brownstatic struct { 609c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown jmethodID notifyConfigurationChanged; 619c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown jmethodID notifyLidSwitchChanged; 627fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown jmethodID notifyInputChannelBroken; 63349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown jmethodID notifyANR; 640029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown jmethodID filterInputEvent; 65349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown jmethodID interceptKeyBeforeQueueing; 6656194ebec6212e229f4ccdaa4b187166d20013efJeff Brown jmethodID interceptMotionBeforeQueueingWhenScreenOff; 67349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown jmethodID interceptKeyBeforeDispatching; 683915bb845b032dc184dba5e60970b803390ca3edJeff Brown jmethodID dispatchUnhandledKey; 69349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown jmethodID checkInjectEventsPermission; 70fe50892af3b365806a767298dfd8e86447682581Jeff Brown jmethodID getVirtualKeyQuietTimeMillis; 719c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown jmethodID getExcludedDeviceNames; 72a454767b09ecb7d25d00beae0e5a1fdd48605c63Jeff Brown jmethodID getKeyRepeatTimeout; 73a454767b09ecb7d25d00beae0e5a1fdd48605c63Jeff Brown jmethodID getKeyRepeatDelay; 74bb3fcba0caf697f1d238a2cbefdf1efe06eded99Jeff Brown jmethodID getHoverTapTimeout; 75bb3fcba0caf697f1d238a2cbefdf1efe06eded99Jeff Brown jmethodID getHoverTapSlop; 76214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown jmethodID getDoubleTapTimeout; 77214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown jmethodID getLongPressTimeout; 7883c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown jmethodID getPointerLayer; 79b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown jmethodID getPointerIcon; 804532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown} gServiceClassInfo; 819c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 829c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brownstatic struct { 839c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown jclass clazz; 846ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown} gKeyEventClassInfo; 856ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown 866ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brownstatic struct { 876ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown jclass clazz; 886ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown} gMotionEventClassInfo; 896ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown 908d60866e2100db70ecf0502c14768a384514d7e9Jeff Brownstatic struct { 918d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown jclass clazz; 928d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown 938d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown jmethodID ctor; 948d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown jmethodID addMotionRange; 958d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown 968d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown jfieldID mId; 978d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown jfieldID mName; 988d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown jfieldID mSources; 998d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown jfieldID mKeyboardType; 1001e08fe90df18930691b0c2ec22e5db25d7fcb4cfJeff Brown jfieldID mKeyCharacterMapFile; 1018d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown} gInputDeviceClassInfo; 1028d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown 10357c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brownstatic struct { 10457c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown jfieldID touchscreen; 10557c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown jfieldID keyboard; 10657c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown jfieldID navigation; 10757c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown} gConfigurationClassInfo; 10857c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown 109928e054931d357326613c78e62f4d850b7c442ffJeff Brown 110928e054931d357326613c78e62f4d850b7c442ffJeff Brown// --- Global functions --- 111928e054931d357326613c78e62f4d850b7c442ffJeff Brown 112214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Browntemplate<typename T> 113214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Browninline static T min(const T& a, const T& b) { 114214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown return a < b ? a : b; 115214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown} 116214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown 117214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Browntemplate<typename T> 118214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Browninline static T max(const T& a, const T& b) { 119214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown return a > b ? a : b; 120214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown} 121214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown 122928e054931d357326613c78e62f4d850b7c442ffJeff Brownstatic jobject getInputApplicationHandleObjLocalRef(JNIEnv* env, 123928e054931d357326613c78e62f4d850b7c442ffJeff Brown const sp<InputApplicationHandle>& inputApplicationHandle) { 124928e054931d357326613c78e62f4d850b7c442ffJeff Brown if (inputApplicationHandle == NULL) { 125928e054931d357326613c78e62f4d850b7c442ffJeff Brown return NULL; 126928e054931d357326613c78e62f4d850b7c442ffJeff Brown } 127928e054931d357326613c78e62f4d850b7c442ffJeff Brown return static_cast<NativeInputApplicationHandle*>(inputApplicationHandle.get())-> 128928e054931d357326613c78e62f4d850b7c442ffJeff Brown getInputApplicationHandleObjLocalRef(env); 129928e054931d357326613c78e62f4d850b7c442ffJeff Brown} 130928e054931d357326613c78e62f4d850b7c442ffJeff Brown 131928e054931d357326613c78e62f4d850b7c442ffJeff Brownstatic jobject getInputWindowHandleObjLocalRef(JNIEnv* env, 132928e054931d357326613c78e62f4d850b7c442ffJeff Brown const sp<InputWindowHandle>& inputWindowHandle) { 133928e054931d357326613c78e62f4d850b7c442ffJeff Brown if (inputWindowHandle == NULL) { 134928e054931d357326613c78e62f4d850b7c442ffJeff Brown return NULL; 135928e054931d357326613c78e62f4d850b7c442ffJeff Brown } 136928e054931d357326613c78e62f4d850b7c442ffJeff Brown return static_cast<NativeInputWindowHandle*>(inputWindowHandle.get())-> 137928e054931d357326613c78e62f4d850b7c442ffJeff Brown getInputWindowHandleObjLocalRef(env); 138928e054931d357326613c78e62f4d850b7c442ffJeff Brown} 139928e054931d357326613c78e62f4d850b7c442ffJeff Brown 1402352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brownstatic void loadSystemIconAsSprite(JNIEnv* env, jobject contextObj, int32_t style, 1412352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown SpriteIcon* outSpriteIcon) { 1422352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown PointerIcon pointerIcon; 1432352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown status_t status = android_view_PointerIcon_loadSystemIcon(env, 1442352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown contextObj, style, &pointerIcon); 1452352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown if (!status) { 1462352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown pointerIcon.bitmap.copyTo(&outSpriteIcon->bitmap, SkBitmap::kARGB_8888_Config); 1472352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown outSpriteIcon->hotSpotX = pointerIcon.hotSpotX; 1482352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown outSpriteIcon->hotSpotY = pointerIcon.hotSpotY; 1492352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown } 1502352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown} 1512352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown 152905805ad7ce18a386076fff99264f821bbad9f83Jeff Brownenum { 153905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown WM_ACTION_PASS_TO_USER = 1, 154905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown WM_ACTION_POKE_USER_ACTIVITY = 2, 155905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown WM_ACTION_GO_TO_SLEEP = 4, 156905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown}; 157905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown 158928e054931d357326613c78e62f4d850b7c442ffJeff Brown 159928e054931d357326613c78e62f4d850b7c442ffJeff Brown// --- NativeInputManager --- 16083c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown 1619c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brownclass NativeInputManager : public virtual RefBase, 1629c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown public virtual InputReaderPolicyInterface, 1632352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown public virtual InputDispatcherPolicyInterface, 1642352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown public virtual PointerControllerPolicyInterface { 1659c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brownprotected: 1669c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown virtual ~NativeInputManager(); 1679c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 16846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownpublic: 1694532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager(jobject contextObj, jobject serviceObj, const sp<Looper>& looper); 1709c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 1719c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown inline sp<InputManager> getInputManager() const { return mInputManager; } 17246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 173b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown void dump(String8& dump); 174e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown 175bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown void setDisplaySize(int32_t displayId, int32_t width, int32_t height, 176bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown int32_t externalWidth, int32_t externalHeight); 17746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown void setDisplayOrientation(int32_t displayId, int32_t orientation); 17846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 1797fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown status_t registerInputChannel(JNIEnv* env, const sp<InputChannel>& inputChannel, 180928e054931d357326613c78e62f4d850b7c442ffJeff Brown const sp<InputWindowHandle>& inputWindowHandle, bool monitor); 1817fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown status_t unregisterInputChannel(JNIEnv* env, const sp<InputChannel>& inputChannel); 1827fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown 1839302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown void setInputWindows(JNIEnv* env, jobjectArray windowHandleObjArray); 1849302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown void setFocusedApplication(JNIEnv* env, jobject applicationHandleObj); 185349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown void setInputDispatchMode(bool enabled, bool frozen); 18605dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown void setSystemUiVisibility(int32_t visibility); 1871a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown void setPointerSpeed(int32_t speed); 188daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown void setShowTouches(bool enabled); 189349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown 1909c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown /* --- InputReaderPolicyInterface implementation --- */ 1919c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 192214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown virtual void getReaderConfiguration(InputReaderConfiguration* outConfig); 19383c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown virtual sp<PointerControllerInterface> obtainPointerController(int32_t deviceId); 19446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 1959c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown /* --- InputDispatcherPolicyInterface implementation --- */ 19646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 197e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown virtual void notifySwitch(nsecs_t when, int32_t switchCode, int32_t switchValue, 198e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown uint32_t policyFlags); 1999c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown virtual void notifyConfigurationChanged(nsecs_t when); 200519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown virtual nsecs_t notifyANR(const sp<InputApplicationHandle>& inputApplicationHandle, 201928e054931d357326613c78e62f4d850b7c442ffJeff Brown const sp<InputWindowHandle>& inputWindowHandle); 202928e054931d357326613c78e62f4d850b7c442ffJeff Brown virtual void notifyInputChannelBroken(const sp<InputWindowHandle>& inputWindowHandle); 2030029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown virtual bool filterInputEvent(const InputEvent* inputEvent, uint32_t policyFlags); 204214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown virtual void getDispatcherConfiguration(InputDispatcherConfiguration* outConfig); 205214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown virtual bool isKeyRepeatEnabled(); 2061f2451007c660091b7b090c1ea332f9044515d2dJeff Brown virtual void interceptKeyBeforeQueueing(const KeyEvent* keyEvent, uint32_t& policyFlags); 20756194ebec6212e229f4ccdaa4b187166d20013efJeff Brown virtual void interceptMotionBeforeQueueing(nsecs_t when, uint32_t& policyFlags); 208905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown virtual nsecs_t interceptKeyBeforeDispatching( 209905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown const sp<InputWindowHandle>& inputWindowHandle, 210b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown const KeyEvent* keyEvent, uint32_t policyFlags); 211928e054931d357326613c78e62f4d850b7c442ffJeff Brown virtual bool dispatchUnhandledKey(const sp<InputWindowHandle>& inputWindowHandle, 21249ed71db425c5054e3ad9526496a7e116c89556bJeff Brown const KeyEvent* keyEvent, uint32_t policyFlags, KeyEvent* outFallbackKeyEvent); 21301ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown virtual void pokeUserActivity(nsecs_t eventTime, int32_t eventType); 214b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown virtual bool checkInjectEventsPermissionNonReentrant( 215b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown int32_t injectorPid, int32_t injectorUid); 21646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 2172352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown /* --- PointerControllerPolicyInterface implementation --- */ 2182352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown 2192352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown virtual void loadPointerResources(PointerResources* outResources); 2202352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown 22146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownprivate: 2229c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown sp<InputManager> mInputManager; 22346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 2242352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown jobject mContextObj; 2254532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jobject mServiceObj; 22605dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown sp<Looper> mLooper; 22746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 22883c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown Mutex mLock; 22983c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown struct Locked { 23083c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown // Display size information. 231bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown int32_t displayWidth, displayHeight; // -1 when not initialized 232bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown int32_t displayExternalWidth, displayExternalHeight; // -1 when not initialized 23383c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown int32_t displayOrientation; 23483c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown 23505dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown // System UI visibility. 23605dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown int32_t systemUiVisibility; 23705dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown 2381a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown // Pointer speed. 2391a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown int32_t pointerSpeed; 2401a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown 241474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown // True if pointer gestures are enabled. 242474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown bool pointerGesturesEnabled; 243474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown 244daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown // Show touches feature enable/disable. 245daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown bool showTouches; 246daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown 2475541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown // Sprite controller singleton, created on first use. 2485541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown sp<SpriteController> spriteController; 2495541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown 25083c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown // Pointer controller singleton, created and destroyed as needed. 25183c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown wp<PointerController> pointerController; 25283c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown } mLocked; 25346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 2542352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown void updateInactivityTimeoutLocked(const sp<PointerController>& controller); 25556194ebec6212e229f4ccdaa4b187166d20013efJeff Brown void handleInterceptActions(jint wmActions, nsecs_t when, uint32_t& policyFlags); 2565541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown void ensureSpriteControllerLocked(); 25705dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown 25800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown // Power manager interactions. 2599c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown bool isScreenOn(); 2609c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown bool isScreenBright(); 2619c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 262b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown static bool checkAndClearExceptionFromCallback(JNIEnv* env, const char* methodName); 263a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown 2649c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown static inline JNIEnv* jniEnv() { 26546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown return AndroidRuntime::getJNIEnv(); 26646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 26746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}; 26846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 269928e054931d357326613c78e62f4d850b7c442ffJeff Brown 27046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 2712352b978a3c94cd88f41d0d908f961333fdac1e9Jeff BrownNativeInputManager::NativeInputManager(jobject contextObj, 2724532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jobject serviceObj, const sp<Looper>& looper) : 273214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown mLooper(looper) { 2749c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown JNIEnv* env = jniEnv(); 27546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 2762352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown mContextObj = env->NewGlobalRef(contextObj); 2774532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown mServiceObj = env->NewGlobalRef(serviceObj); 27846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 27983c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown { 28083c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown AutoMutex _l(mLock); 28183c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown mLocked.displayWidth = -1; 28283c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown mLocked.displayHeight = -1; 283bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown mLocked.displayExternalWidth = -1; 284bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown mLocked.displayExternalHeight = -1; 28565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown mLocked.displayOrientation = DISPLAY_ORIENTATION_0; 28605dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown 28705dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown mLocked.systemUiVisibility = ASYSTEM_UI_VISIBILITY_STATUS_BAR_VISIBLE; 2881a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown mLocked.pointerSpeed = 0; 289474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown mLocked.pointerGesturesEnabled = true; 290daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown mLocked.showTouches = false; 29183c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown } 29283c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown 2939c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown sp<EventHub> eventHub = new EventHub(); 2949c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown mInputManager = new InputManager(eventHub, this, this); 2959c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown} 29646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 2979c3cda04d969912bc46184f2b326d1db95e0aba5Jeff BrownNativeInputManager::~NativeInputManager() { 2989c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown JNIEnv* env = jniEnv(); 29946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 3002352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown env->DeleteGlobalRef(mContextObj); 3014532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown env->DeleteGlobalRef(mServiceObj); 3029c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown} 30346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 304b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brownvoid NativeInputManager::dump(String8& dump) { 305b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown mInputManager->getReader()->dump(dump); 306b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown dump.append("\n"); 3076d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown 308b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown mInputManager->getDispatcher()->dump(dump); 309b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown dump.append("\n"); 3109c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown} 31146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 3127fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brownbool NativeInputManager::checkAndClearExceptionFromCallback(JNIEnv* env, const char* methodName) { 3139c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown if (env->ExceptionCheck()) { 3143762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("An exception was thrown by callback '%s'.", methodName); 3159c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown LOGE_EX(env); 3169c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown env->ExceptionClear(); 3179c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown return true; 3189c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown } 3199c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown return false; 3209c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown} 3219c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 322bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brownvoid NativeInputManager::setDisplaySize(int32_t displayId, int32_t width, int32_t height, 323bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown int32_t externalWidth, int32_t externalHeight) { 32465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown bool changed = false; 3259c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown if (displayId == 0) { 32665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown AutoMutex _l(mLock); 3272352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown 32865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown if (mLocked.displayWidth != width || mLocked.displayHeight != height) { 32965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown changed = true; 33065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown mLocked.displayWidth = width; 33165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown mLocked.displayHeight = height; 33283c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown 33365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown sp<PointerController> controller = mLocked.pointerController.promote(); 33465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown if (controller != NULL) { 33565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown controller->setDisplaySize(width, height); 33683c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown } 33765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown } 338bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown 33965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown if (mLocked.displayExternalWidth != externalWidth 34065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown || mLocked.displayExternalHeight != externalHeight) { 34165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown changed = true; 342bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown mLocked.displayExternalWidth = externalWidth; 343bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown mLocked.displayExternalHeight = externalHeight; 34465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown } 34565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown } 34665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown 34765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown if (changed) { 34865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown mInputManager->getReader()->requestRefreshConfiguration( 34965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown InputReaderConfiguration::CHANGE_DISPLAY_INFO); 3509c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown } 3519c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown} 3529c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 3539c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brownvoid NativeInputManager::setDisplayOrientation(int32_t displayId, int32_t orientation) { 35465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown bool changed = false; 3559c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown if (displayId == 0) { 35683c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown AutoMutex _l(mLock); 35783c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown 35883c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown if (mLocked.displayOrientation != orientation) { 35965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown changed = true; 36083c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown mLocked.displayOrientation = orientation; 3619c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 36283c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown sp<PointerController> controller = mLocked.pointerController.promote(); 36383c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown if (controller != NULL) { 36483c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown controller->setDisplayOrientation(orientation); 36583c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown } 36683c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown } 3679c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown } 36865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown 36965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown if (changed) { 37065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown mInputManager->getReader()->requestRefreshConfiguration( 37165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown InputReaderConfiguration::CHANGE_DISPLAY_INFO); 37265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown } 3739c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown} 3749c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 3757fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brownstatus_t NativeInputManager::registerInputChannel(JNIEnv* env, 376928e054931d357326613c78e62f4d850b7c442ffJeff Brown const sp<InputChannel>& inputChannel, 377928e054931d357326613c78e62f4d850b7c442ffJeff Brown const sp<InputWindowHandle>& inputWindowHandle, bool monitor) { 378928e054931d357326613c78e62f4d850b7c442ffJeff Brown return mInputManager->getDispatcher()->registerInputChannel( 379928e054931d357326613c78e62f4d850b7c442ffJeff Brown inputChannel, inputWindowHandle, monitor); 3807fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown} 3817fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown 3827fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brownstatus_t NativeInputManager::unregisterInputChannel(JNIEnv* env, 3837fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown const sp<InputChannel>& inputChannel) { 384b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown return mInputManager->getDispatcher()->unregisterInputChannel(inputChannel); 3857fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown} 3867fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown 387214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brownvoid NativeInputManager::getReaderConfiguration(InputReaderConfiguration* outConfig) { 388214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown JNIEnv* env = jniEnv(); 3899c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 3904532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jint virtualKeyQuietTime = env->CallIntMethod(mServiceObj, 3914532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown gServiceClassInfo.getVirtualKeyQuietTimeMillis); 392214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown if (!checkAndClearExceptionFromCallback(env, "getVirtualKeyQuietTimeMillis")) { 393214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown outConfig->virtualKeyQuietTime = milliseconds_to_nanoseconds(virtualKeyQuietTime); 394fe50892af3b365806a767298dfd8e86447682581Jeff Brown } 3959c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 396214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown outConfig->excludedDeviceNames.clear(); 3974532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jobjectArray excludedDeviceNames = jobjectArray(env->CallObjectMethod(mServiceObj, 3984532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown gServiceClassInfo.getExcludedDeviceNames)); 399214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown if (!checkAndClearExceptionFromCallback(env, "getExcludedDeviceNames") && excludedDeviceNames) { 400214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown jsize length = env->GetArrayLength(excludedDeviceNames); 4019c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown for (jsize i = 0; i < length; i++) { 402214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown jstring item = jstring(env->GetObjectArrayElement(excludedDeviceNames, i)); 4039c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown const char* deviceNameChars = env->GetStringUTFChars(item, NULL); 404214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown outConfig->excludedDeviceNames.add(String8(deviceNameChars)); 4059c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown env->ReleaseStringUTFChars(item, deviceNameChars); 4069c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown env->DeleteLocalRef(item); 4079c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown } 408214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown env->DeleteLocalRef(excludedDeviceNames); 409214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown } 410214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown 4114532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jint hoverTapTimeout = env->CallIntMethod(mServiceObj, 4124532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown gServiceClassInfo.getHoverTapTimeout); 413bb3fcba0caf697f1d238a2cbefdf1efe06eded99Jeff Brown if (!checkAndClearExceptionFromCallback(env, "getHoverTapTimeout")) { 4144532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jint doubleTapTimeout = env->CallIntMethod(mServiceObj, 4154532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown gServiceClassInfo.getDoubleTapTimeout); 416214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown if (!checkAndClearExceptionFromCallback(env, "getDoubleTapTimeout")) { 4174532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jint longPressTimeout = env->CallIntMethod(mServiceObj, 4184532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown gServiceClassInfo.getLongPressTimeout); 419214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown if (!checkAndClearExceptionFromCallback(env, "getLongPressTimeout")) { 420bb3fcba0caf697f1d238a2cbefdf1efe06eded99Jeff Brown outConfig->pointerGestureTapInterval = milliseconds_to_nanoseconds(hoverTapTimeout); 421214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown 422214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown // We must ensure that the tap-drag interval is significantly shorter than 423214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown // the long-press timeout because the tap is held down for the entire duration 424214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown // of the double-tap timeout. 425214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown jint tapDragInterval = max(min(longPressTimeout - 100, 426bb3fcba0caf697f1d238a2cbefdf1efe06eded99Jeff Brown doubleTapTimeout), hoverTapTimeout); 427214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown outConfig->pointerGestureTapDragInterval = 428214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown milliseconds_to_nanoseconds(tapDragInterval); 429214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown } 430214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown } 431214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown } 432214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown 4334532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jint hoverTapSlop = env->CallIntMethod(mServiceObj, 4344532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown gServiceClassInfo.getHoverTapSlop); 435bb3fcba0caf697f1d238a2cbefdf1efe06eded99Jeff Brown if (!checkAndClearExceptionFromCallback(env, "getHoverTapSlop")) { 436bb3fcba0caf697f1d238a2cbefdf1efe06eded99Jeff Brown outConfig->pointerGestureTapSlop = hoverTapSlop; 4379c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown } 4381a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown 4391a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown { // acquire lock 4401a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown AutoMutex _l(mLock); 4411a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown 4421a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown outConfig->pointerVelocityControlParameters.scale = exp2f(mLocked.pointerSpeed 4431a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown * POINTER_SPEED_EXPONENT); 444474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown outConfig->pointerGesturesEnabled = mLocked.pointerGesturesEnabled; 44565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown 446daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown outConfig->showTouches = mLocked.showTouches; 447daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown 44865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown outConfig->setDisplayInfo(0, false /*external*/, 44965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown mLocked.displayWidth, mLocked.displayHeight, mLocked.displayOrientation); 45065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown outConfig->setDisplayInfo(0, true /*external*/, 45165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown mLocked.displayExternalWidth, mLocked.displayExternalHeight, 45265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown mLocked.displayOrientation); 4531a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown } // release lock 4549c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown} 4559c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 45683c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brownsp<PointerControllerInterface> NativeInputManager::obtainPointerController(int32_t deviceId) { 45783c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown AutoMutex _l(mLock); 45883c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown 45983c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown sp<PointerController> controller = mLocked.pointerController.promote(); 46083c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown if (controller == NULL) { 4615541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown ensureSpriteControllerLocked(); 46283c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown 4632352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown controller = new PointerController(this, mLooper, mLocked.spriteController); 46483c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown mLocked.pointerController = controller; 46583c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown 46683c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown controller->setDisplaySize(mLocked.displayWidth, mLocked.displayHeight); 46783c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown controller->setDisplayOrientation(mLocked.displayOrientation); 468b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 4695541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown JNIEnv* env = jniEnv(); 4704532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jobject pointerIconObj = env->CallObjectMethod(mServiceObj, 4714532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown gServiceClassInfo.getPointerIcon); 4722352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown if (!checkAndClearExceptionFromCallback(env, "getPointerIcon")) { 4732352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown PointerIcon pointerIcon; 4742352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown status_t status = android_view_PointerIcon_load(env, pointerIconObj, 4752352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown mContextObj, &pointerIcon); 4762352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown if (!status && !pointerIcon.isNullIcon()) { 4772352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown controller->setPointerIcon(SpriteIcon(pointerIcon.bitmap, 4782352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown pointerIcon.hotSpotX, pointerIcon.hotSpotY)); 4792352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown } else { 4802352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown controller->setPointerIcon(SpriteIcon()); 481b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown } 4822352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown env->DeleteLocalRef(pointerIconObj); 483b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown } 48405dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown 4852352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown updateInactivityTimeoutLocked(controller); 48683c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown } 48783c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown return controller; 48883c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown} 48983c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown 4905541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brownvoid NativeInputManager::ensureSpriteControllerLocked() { 4915541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown if (mLocked.spriteController == NULL) { 4925541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown JNIEnv* env = jniEnv(); 4934532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jint layer = env->CallIntMethod(mServiceObj, gServiceClassInfo.getPointerLayer); 4945541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown if (checkAndClearExceptionFromCallback(env, "getPointerLayer")) { 4955541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown layer = -1; 4965541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown } 4975541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown mLocked.spriteController = new SpriteController(mLooper, layer); 4985541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown } 4995541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown} 5005541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown 501e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brownvoid NativeInputManager::notifySwitch(nsecs_t when, int32_t switchCode, 502e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown int32_t switchValue, uint32_t policyFlags) { 503e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown#if DEBUG_INPUT_DISPATCHER_POLICY 5045baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("notifySwitch - when=%lld, switchCode=%d, switchValue=%d, policyFlags=0x%x", 505e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown when, switchCode, switchValue, policyFlags); 506e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown#endif 507e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown 508e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown JNIEnv* env = jniEnv(); 509e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown 510e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown switch (switchCode) { 511e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown case SW_LID: 5124532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown env->CallVoidMethod(mServiceObj, gServiceClassInfo.notifyLidSwitchChanged, 513e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown when, switchValue == 0); 514e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown checkAndClearExceptionFromCallback(env, "notifyLidSwitchChanged"); 515e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown break; 516e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown } 517e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown} 518e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown 5199c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brownvoid NativeInputManager::notifyConfigurationChanged(nsecs_t when) { 5209c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown#if DEBUG_INPUT_DISPATCHER_POLICY 5215baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("notifyConfigurationChanged - when=%lld", when); 5229c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown#endif 5239c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 5249c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown JNIEnv* env = jniEnv(); 5259c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 5264532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown env->CallVoidMethod(mServiceObj, gServiceClassInfo.notifyConfigurationChanged, when); 5277fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown checkAndClearExceptionFromCallback(env, "notifyConfigurationChanged"); 5289c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown} 5299c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 530519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brownnsecs_t NativeInputManager::notifyANR(const sp<InputApplicationHandle>& inputApplicationHandle, 531928e054931d357326613c78e62f4d850b7c442ffJeff Brown const sp<InputWindowHandle>& inputWindowHandle) { 532b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown#if DEBUG_INPUT_DISPATCHER_POLICY 5335baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("notifyANR"); 534b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown#endif 535b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown 536b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown JNIEnv* env = jniEnv(); 537b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown 538928e054931d357326613c78e62f4d850b7c442ffJeff Brown jobject inputApplicationHandleObj = 539928e054931d357326613c78e62f4d850b7c442ffJeff Brown getInputApplicationHandleObjLocalRef(env, inputApplicationHandle); 540928e054931d357326613c78e62f4d850b7c442ffJeff Brown jobject inputWindowHandleObj = 541928e054931d357326613c78e62f4d850b7c442ffJeff Brown getInputWindowHandleObjLocalRef(env, inputWindowHandle); 542b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown 5434532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jlong newTimeout = env->CallLongMethod(mServiceObj, 5444532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown gServiceClassInfo.notifyANR, inputApplicationHandleObj, inputWindowHandleObj); 545519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown if (checkAndClearExceptionFromCallback(env, "notifyANR")) { 546b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown newTimeout = 0; // abort dispatch 547519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown } else { 548519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown assert(newTimeout >= 0); 549b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown } 550b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown 551928e054931d357326613c78e62f4d850b7c442ffJeff Brown env->DeleteLocalRef(inputWindowHandleObj); 552928e054931d357326613c78e62f4d850b7c442ffJeff Brown env->DeleteLocalRef(inputApplicationHandleObj); 553b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown return newTimeout; 554b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown} 555b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown 556928e054931d357326613c78e62f4d850b7c442ffJeff Brownvoid NativeInputManager::notifyInputChannelBroken(const sp<InputWindowHandle>& inputWindowHandle) { 5579c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown#if DEBUG_INPUT_DISPATCHER_POLICY 5585baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("notifyInputChannelBroken"); 5599c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown#endif 5609c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 5617fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown JNIEnv* env = jniEnv(); 5627fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown 563928e054931d357326613c78e62f4d850b7c442ffJeff Brown jobject inputWindowHandleObj = 564928e054931d357326613c78e62f4d850b7c442ffJeff Brown getInputWindowHandleObjLocalRef(env, inputWindowHandle); 565928e054931d357326613c78e62f4d850b7c442ffJeff Brown if (inputWindowHandleObj) { 5664532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown env->CallVoidMethod(mServiceObj, gServiceClassInfo.notifyInputChannelBroken, 567928e054931d357326613c78e62f4d850b7c442ffJeff Brown inputWindowHandleObj); 5687fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown checkAndClearExceptionFromCallback(env, "notifyInputChannelBroken"); 5697fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown 570928e054931d357326613c78e62f4d850b7c442ffJeff Brown env->DeleteLocalRef(inputWindowHandleObj); 5717fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown } 5729c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown} 5739c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 574214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brownvoid NativeInputManager::getDispatcherConfiguration(InputDispatcherConfiguration* outConfig) { 575214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown JNIEnv* env = jniEnv(); 576a454767b09ecb7d25d00beae0e5a1fdd48605c63Jeff Brown 5774532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jint keyRepeatTimeout = env->CallIntMethod(mServiceObj, 5784532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown gServiceClassInfo.getKeyRepeatTimeout); 579214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown if (!checkAndClearExceptionFromCallback(env, "getKeyRepeatTimeout")) { 580214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown outConfig->keyRepeatTimeout = milliseconds_to_nanoseconds(keyRepeatTimeout); 5819c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown } 5829c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 5834532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jint keyRepeatDelay = env->CallIntMethod(mServiceObj, 5844532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown gServiceClassInfo.getKeyRepeatDelay); 585214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown if (!checkAndClearExceptionFromCallback(env, "getKeyRepeatDelay")) { 586214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown outConfig->keyRepeatDelay = milliseconds_to_nanoseconds(keyRepeatDelay); 587214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown } 588b21fb104cc95fe7e5daf3b3626241e525c39a3f1Jeff Brown} 589b21fb104cc95fe7e5daf3b3626241e525c39a3f1Jeff Brown 590214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brownbool NativeInputManager::isKeyRepeatEnabled() { 591214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown // Only enable automatic key repeating when the screen is on. 592214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown return isScreenOn(); 593ae9fc03bdccda709101291bbcd3beaa5b6daebfcJeff Brown} 594ae9fc03bdccda709101291bbcd3beaa5b6daebfcJeff Brown 5959302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brownvoid NativeInputManager::setInputWindows(JNIEnv* env, jobjectArray windowHandleObjArray) { 5969302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown Vector<sp<InputWindowHandle> > windowHandles; 5979c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 5989302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown if (windowHandleObjArray) { 5999302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown jsize length = env->GetArrayLength(windowHandleObjArray); 6009302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown for (jsize i = 0; i < length; i++) { 6019302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown jobject windowHandleObj = env->GetObjectArrayElement(windowHandleObjArray, i); 6029302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown if (! windowHandleObj) { 6039302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown break; // found null element indicating end of used portion of the array 6049302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown } 605349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown 6069302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown sp<InputWindowHandle> windowHandle = 6079302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown android_server_InputWindowHandle_getHandle(env, windowHandleObj); 6089302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown if (windowHandle != NULL) { 6099302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown windowHandles.push(windowHandle); 610474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown } 6119302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown env->DeleteLocalRef(windowHandleObj); 612e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown } 613b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown } 614349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown 6159302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown mInputManager->getDispatcher()->setInputWindows(windowHandles); 6169302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown 6179302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown // Do this after the dispatcher has updated the window handle state. 6189302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown bool newPointerGesturesEnabled = true; 6199302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown size_t numWindows = windowHandles.size(); 6209302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown for (size_t i = 0; i < numWindows; i++) { 6219302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown const sp<InputWindowHandle>& windowHandle = windowHandles.itemAt(i); 622cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown const InputWindowInfo* windowInfo = windowHandle->getInfo(); 623cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown if (windowInfo && windowInfo->hasFocus && (windowInfo->inputFeatures 624cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown & InputWindowInfo::INPUT_FEATURE_DISABLE_TOUCH_PAD_GESTURES)) { 6259302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown newPointerGesturesEnabled = false; 6269302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown } 6279302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown } 628474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown 629474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown uint32_t changes = 0; 630474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown { // acquire lock 631474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown AutoMutex _l(mLock); 632474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown 633474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown if (mLocked.pointerGesturesEnabled != newPointerGesturesEnabled) { 634474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown mLocked.pointerGesturesEnabled = newPointerGesturesEnabled; 635474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown changes |= InputReaderConfiguration::CHANGE_POINTER_GESTURE_ENABLEMENT; 636474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown } 637474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown } // release lock 638474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown 639474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown if (changes) { 640474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown mInputManager->getReader()->requestRefreshConfiguration(changes); 641474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown } 642349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown} 643349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown 6449302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brownvoid NativeInputManager::setFocusedApplication(JNIEnv* env, jobject applicationHandleObj) { 6459302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown sp<InputApplicationHandle> applicationHandle = 6469302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown android_server_InputApplicationHandle_getHandle(env, applicationHandleObj); 6479302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown mInputManager->getDispatcher()->setFocusedApplication(applicationHandle); 6489c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown} 6499c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 650b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brownvoid NativeInputManager::setInputDispatchMode(bool enabled, bool frozen) { 651b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown mInputManager->getDispatcher()->setInputDispatchMode(enabled, frozen); 652349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown} 653349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown 65405dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brownvoid NativeInputManager::setSystemUiVisibility(int32_t visibility) { 65505dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown AutoMutex _l(mLock); 65605dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown 65705dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown if (mLocked.systemUiVisibility != visibility) { 65805dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown mLocked.systemUiVisibility = visibility; 65905dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown 66005dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown sp<PointerController> controller = mLocked.pointerController.promote(); 66105dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown if (controller != NULL) { 6622352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown updateInactivityTimeoutLocked(controller); 66305dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown } 66405dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown } 66505dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown} 66605dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown 6672352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brownvoid NativeInputManager::updateInactivityTimeoutLocked(const sp<PointerController>& controller) { 66805dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown bool lightsOut = mLocked.systemUiVisibility & ASYSTEM_UI_VISIBILITY_STATUS_BAR_HIDDEN; 6692352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown controller->setInactivityTimeout(lightsOut 6702352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown ? PointerController::INACTIVITY_TIMEOUT_SHORT 6712352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown : PointerController::INACTIVITY_TIMEOUT_NORMAL); 67205dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown} 67305dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown 6741a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brownvoid NativeInputManager::setPointerSpeed(int32_t speed) { 675474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown { // acquire lock 676474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown AutoMutex _l(mLock); 677474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown 678474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown if (mLocked.pointerSpeed == speed) { 679474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown return; 680474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown } 6811a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown 6826215d3ff4b5dfa52a5d8b9a42e343051f31066a5Steve Block ALOGI("Setting pointer speed to %d.", speed); 6831a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown mLocked.pointerSpeed = speed; 684474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown } // release lock 6851a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown 686474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown mInputManager->getReader()->requestRefreshConfiguration( 687474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown InputReaderConfiguration::CHANGE_POINTER_SPEED); 6881a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown} 6891a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown 690daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brownvoid NativeInputManager::setShowTouches(bool enabled) { 691daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown { // acquire lock 692daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown AutoMutex _l(mLock); 693daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown 694daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown if (mLocked.showTouches == enabled) { 695daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown return; 696daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown } 697daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown 6986215d3ff4b5dfa52a5d8b9a42e343051f31066a5Steve Block ALOGI("Setting show touches feature to %s.", enabled ? "enabled" : "disabled"); 699daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown mLocked.showTouches = enabled; 700daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown } // release lock 701daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown 702daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown mInputManager->getReader()->requestRefreshConfiguration( 703daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown InputReaderConfiguration::CHANGE_SHOW_TOUCHES); 704daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown} 705daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown 706e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brownbool NativeInputManager::isScreenOn() { 707e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown return android_server_PowerManagerService_isScreenOn(); 708e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown} 709e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown 710e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brownbool NativeInputManager::isScreenBright() { 711e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown return android_server_PowerManagerService_isScreenBright(); 712e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown} 713e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown 7140029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brownbool NativeInputManager::filterInputEvent(const InputEvent* inputEvent, uint32_t policyFlags) { 7150029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown jobject inputEventObj; 7160029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown 7170029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown JNIEnv* env = jniEnv(); 7180029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown switch (inputEvent->getType()) { 7190029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown case AINPUT_EVENT_TYPE_KEY: 7200029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown inputEventObj = android_view_KeyEvent_fromNative(env, 7210029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown static_cast<const KeyEvent*>(inputEvent)); 7220029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown break; 7230029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown case AINPUT_EVENT_TYPE_MOTION: 7240029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown inputEventObj = android_view_MotionEvent_obtainAsCopy(env, 7250029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown static_cast<const MotionEvent*>(inputEvent)); 7260029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown break; 7270029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown default: 7280029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown return true; // dispatch the event normally 7290029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown } 7300029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown 7310029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown if (!inputEventObj) { 7323762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("Failed to obtain input event object for filterInputEvent."); 7330029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown return true; // dispatch the event normally 7340029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown } 7350029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown 7360029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown // The callee is responsible for recycling the event. 7374532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jboolean pass = env->CallBooleanMethod(mServiceObj, gServiceClassInfo.filterInputEvent, 7380029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown inputEventObj, policyFlags); 7390029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown if (checkAndClearExceptionFromCallback(env, "filterInputEvent")) { 7400029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown pass = true; 7410029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown } 7420029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown env->DeleteLocalRef(inputEventObj); 7430029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown return pass; 7440029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown} 7450029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown 7461f2451007c660091b7b090c1ea332f9044515d2dJeff Brownvoid NativeInputManager::interceptKeyBeforeQueueing(const KeyEvent* keyEvent, 7471f2451007c660091b7b090c1ea332f9044515d2dJeff Brown uint32_t& policyFlags) { 7483122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown // Policy: 7493122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown // - Ignore untrusted events and pass them along. 7503122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown // - Ask the window manager what to do with normal events and trusted injected events. 7513122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown // - For normal events wake and brighten the screen if currently off or dim. 7523122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown if ((policyFlags & POLICY_FLAG_TRUSTED)) { 7531f2451007c660091b7b090c1ea332f9044515d2dJeff Brown nsecs_t when = keyEvent->getEventTime(); 7543122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown bool isScreenOn = this->isScreenOn(); 7553122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown bool isScreenBright = this->isScreenBright(); 756e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown 7573122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown JNIEnv* env = jniEnv(); 7581f2451007c660091b7b090c1ea332f9044515d2dJeff Brown jobject keyEventObj = android_view_KeyEvent_fromNative(env, keyEvent); 7591f2451007c660091b7b090c1ea332f9044515d2dJeff Brown jint wmActions; 7601f2451007c660091b7b090c1ea332f9044515d2dJeff Brown if (keyEventObj) { 7614532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown wmActions = env->CallIntMethod(mServiceObj, 7624532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown gServiceClassInfo.interceptKeyBeforeQueueing, 7631f2451007c660091b7b090c1ea332f9044515d2dJeff Brown keyEventObj, policyFlags, isScreenOn); 7641f2451007c660091b7b090c1ea332f9044515d2dJeff Brown if (checkAndClearExceptionFromCallback(env, "interceptKeyBeforeQueueing")) { 7651f2451007c660091b7b090c1ea332f9044515d2dJeff Brown wmActions = 0; 7661f2451007c660091b7b090c1ea332f9044515d2dJeff Brown } 7671f2451007c660091b7b090c1ea332f9044515d2dJeff Brown android_view_KeyEvent_recycle(env, keyEventObj); 7681f2451007c660091b7b090c1ea332f9044515d2dJeff Brown env->DeleteLocalRef(keyEventObj); 7691f2451007c660091b7b090c1ea332f9044515d2dJeff Brown } else { 7703762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("Failed to obtain key event object for interceptKeyBeforeQueueing."); 7713122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown wmActions = 0; 772e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown } 773e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown 7741f2451007c660091b7b090c1ea332f9044515d2dJeff Brown if (!(policyFlags & POLICY_FLAG_INJECTED)) { 7753122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown if (!isScreenOn) { 7763122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown policyFlags |= POLICY_FLAG_WOKE_HERE; 7773122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown } 7783122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown 7793122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown if (!isScreenBright) { 7803122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown policyFlags |= POLICY_FLAG_BRIGHT_HERE; 7813122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown } 782e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown } 783e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown 78456194ebec6212e229f4ccdaa4b187166d20013efJeff Brown handleInterceptActions(wmActions, when, /*byref*/ policyFlags); 7853122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown } else { 786e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown policyFlags |= POLICY_FLAG_PASS_TO_USER; 787e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown } 788e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown} 789e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown 79056194ebec6212e229f4ccdaa4b187166d20013efJeff Brownvoid NativeInputManager::interceptMotionBeforeQueueing(nsecs_t when, uint32_t& policyFlags) { 7913122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown // Policy: 7923122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown // - Ignore untrusted events and pass them along. 7933122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown // - No special filtering for injected events required at this time. 7943122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown // - Filter normal events based on screen state. 7953122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown // - For normal events brighten (but do not wake) the screen if currently dim. 7963122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown if ((policyFlags & POLICY_FLAG_TRUSTED) && !(policyFlags & POLICY_FLAG_INJECTED)) { 7973122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown if (isScreenOn()) { 7983122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown policyFlags |= POLICY_FLAG_PASS_TO_USER; 7993122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown 8003122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown if (!isScreenBright()) { 8013122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown policyFlags |= POLICY_FLAG_BRIGHT_HERE; 8023122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown } 80356194ebec6212e229f4ccdaa4b187166d20013efJeff Brown } else { 80456194ebec6212e229f4ccdaa4b187166d20013efJeff Brown JNIEnv* env = jniEnv(); 8054532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jint wmActions = env->CallIntMethod(mServiceObj, 8064532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown gServiceClassInfo.interceptMotionBeforeQueueingWhenScreenOff, 80756194ebec6212e229f4ccdaa4b187166d20013efJeff Brown policyFlags); 80856194ebec6212e229f4ccdaa4b187166d20013efJeff Brown if (checkAndClearExceptionFromCallback(env, 80956194ebec6212e229f4ccdaa4b187166d20013efJeff Brown "interceptMotionBeforeQueueingWhenScreenOff")) { 81056194ebec6212e229f4ccdaa4b187166d20013efJeff Brown wmActions = 0; 81156194ebec6212e229f4ccdaa4b187166d20013efJeff Brown } 81256194ebec6212e229f4ccdaa4b187166d20013efJeff Brown 81356194ebec6212e229f4ccdaa4b187166d20013efJeff Brown policyFlags |= POLICY_FLAG_WOKE_HERE | POLICY_FLAG_BRIGHT_HERE; 81456194ebec6212e229f4ccdaa4b187166d20013efJeff Brown handleInterceptActions(wmActions, when, /*byref*/ policyFlags); 815e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown } 8163122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown } else { 8173122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown policyFlags |= POLICY_FLAG_PASS_TO_USER; 818e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown } 819e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown} 820e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown 82156194ebec6212e229f4ccdaa4b187166d20013efJeff Brownvoid NativeInputManager::handleInterceptActions(jint wmActions, nsecs_t when, 82256194ebec6212e229f4ccdaa4b187166d20013efJeff Brown uint32_t& policyFlags) { 82356194ebec6212e229f4ccdaa4b187166d20013efJeff Brown if (wmActions & WM_ACTION_GO_TO_SLEEP) { 8249267beb8689e6febe3dd23f2a3025736c50eef01Jeff Brown#if DEBUG_INPUT_DISPATCHER_POLICY 8255baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("handleInterceptActions: Going to sleep."); 82656194ebec6212e229f4ccdaa4b187166d20013efJeff Brown#endif 82756194ebec6212e229f4ccdaa4b187166d20013efJeff Brown android_server_PowerManagerService_goToSleep(when); 82856194ebec6212e229f4ccdaa4b187166d20013efJeff Brown } 82956194ebec6212e229f4ccdaa4b187166d20013efJeff Brown 83056194ebec6212e229f4ccdaa4b187166d20013efJeff Brown if (wmActions & WM_ACTION_POKE_USER_ACTIVITY) { 8319267beb8689e6febe3dd23f2a3025736c50eef01Jeff Brown#if DEBUG_INPUT_DISPATCHER_POLICY 8325baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("handleInterceptActions: Poking user activity."); 83356194ebec6212e229f4ccdaa4b187166d20013efJeff Brown#endif 83456194ebec6212e229f4ccdaa4b187166d20013efJeff Brown android_server_PowerManagerService_userActivity(when, POWER_MANAGER_BUTTON_EVENT); 83556194ebec6212e229f4ccdaa4b187166d20013efJeff Brown } 83656194ebec6212e229f4ccdaa4b187166d20013efJeff Brown 83756194ebec6212e229f4ccdaa4b187166d20013efJeff Brown if (wmActions & WM_ACTION_PASS_TO_USER) { 83856194ebec6212e229f4ccdaa4b187166d20013efJeff Brown policyFlags |= POLICY_FLAG_PASS_TO_USER; 83956194ebec6212e229f4ccdaa4b187166d20013efJeff Brown } else { 8409267beb8689e6febe3dd23f2a3025736c50eef01Jeff Brown#if DEBUG_INPUT_DISPATCHER_POLICY 8415baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("handleInterceptActions: Not passing key to user."); 84256194ebec6212e229f4ccdaa4b187166d20013efJeff Brown#endif 84356194ebec6212e229f4ccdaa4b187166d20013efJeff Brown } 84456194ebec6212e229f4ccdaa4b187166d20013efJeff Brown} 84556194ebec6212e229f4ccdaa4b187166d20013efJeff Brown 846905805ad7ce18a386076fff99264f821bbad9f83Jeff Brownnsecs_t NativeInputManager::interceptKeyBeforeDispatching( 847928e054931d357326613c78e62f4d850b7c442ffJeff Brown const sp<InputWindowHandle>& inputWindowHandle, 848e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown const KeyEvent* keyEvent, uint32_t policyFlags) { 8493122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown // Policy: 8503122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown // - Ignore untrusted events and pass them along. 8513122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown // - Filter normal events and trusted injected events through the window manager policy to 8523122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown // handle the HOME key and the like. 853905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown nsecs_t result = 0; 8543122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown if (policyFlags & POLICY_FLAG_TRUSTED) { 8553122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown JNIEnv* env = jniEnv(); 8563122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown 857928e054931d357326613c78e62f4d850b7c442ffJeff Brown // Note: inputWindowHandle may be null. 858928e054931d357326613c78e62f4d850b7c442ffJeff Brown jobject inputWindowHandleObj = getInputWindowHandleObjLocalRef(env, inputWindowHandle); 8591f2451007c660091b7b090c1ea332f9044515d2dJeff Brown jobject keyEventObj = android_view_KeyEvent_fromNative(env, keyEvent); 8601f2451007c660091b7b090c1ea332f9044515d2dJeff Brown if (keyEventObj) { 8614532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jlong delayMillis = env->CallLongMethod(mServiceObj, 8624532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown gServiceClassInfo.interceptKeyBeforeDispatching, 863928e054931d357326613c78e62f4d850b7c442ffJeff Brown inputWindowHandleObj, keyEventObj, policyFlags); 8641f2451007c660091b7b090c1ea332f9044515d2dJeff Brown bool error = checkAndClearExceptionFromCallback(env, "interceptKeyBeforeDispatching"); 8651f2451007c660091b7b090c1ea332f9044515d2dJeff Brown android_view_KeyEvent_recycle(env, keyEventObj); 8661f2451007c660091b7b090c1ea332f9044515d2dJeff Brown env->DeleteLocalRef(keyEventObj); 867905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown if (!error) { 868905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown if (delayMillis < 0) { 869905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown result = -1; 870905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown } else if (delayMillis > 0) { 871905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown result = milliseconds_to_nanoseconds(delayMillis); 872905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown } 873905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown } 8741f2451007c660091b7b090c1ea332f9044515d2dJeff Brown } else { 8753762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("Failed to obtain key event object for interceptKeyBeforeDispatching."); 8761f2451007c660091b7b090c1ea332f9044515d2dJeff Brown } 877928e054931d357326613c78e62f4d850b7c442ffJeff Brown env->DeleteLocalRef(inputWindowHandleObj); 8783122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown } 8791f2451007c660091b7b090c1ea332f9044515d2dJeff Brown return result; 880d0097871828bb7d5d6eec06cadd92c2e3358849bJeff Brown} 881d0097871828bb7d5d6eec06cadd92c2e3358849bJeff Brown 882928e054931d357326613c78e62f4d850b7c442ffJeff Brownbool NativeInputManager::dispatchUnhandledKey(const sp<InputWindowHandle>& inputWindowHandle, 88349ed71db425c5054e3ad9526496a7e116c89556bJeff Brown const KeyEvent* keyEvent, uint32_t policyFlags, KeyEvent* outFallbackKeyEvent) { 8843915bb845b032dc184dba5e60970b803390ca3edJeff Brown // Policy: 8853915bb845b032dc184dba5e60970b803390ca3edJeff Brown // - Ignore untrusted events and do not perform default handling. 88649ed71db425c5054e3ad9526496a7e116c89556bJeff Brown bool result = false; 8873915bb845b032dc184dba5e60970b803390ca3edJeff Brown if (policyFlags & POLICY_FLAG_TRUSTED) { 8883915bb845b032dc184dba5e60970b803390ca3edJeff Brown JNIEnv* env = jniEnv(); 8893915bb845b032dc184dba5e60970b803390ca3edJeff Brown 890928e054931d357326613c78e62f4d850b7c442ffJeff Brown // Note: inputWindowHandle may be null. 891928e054931d357326613c78e62f4d850b7c442ffJeff Brown jobject inputWindowHandleObj = getInputWindowHandleObjLocalRef(env, inputWindowHandle); 8921f2451007c660091b7b090c1ea332f9044515d2dJeff Brown jobject keyEventObj = android_view_KeyEvent_fromNative(env, keyEvent); 8931f2451007c660091b7b090c1ea332f9044515d2dJeff Brown if (keyEventObj) { 8944532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jobject fallbackKeyEventObj = env->CallObjectMethod(mServiceObj, 8954532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown gServiceClassInfo.dispatchUnhandledKey, 896928e054931d357326613c78e62f4d850b7c442ffJeff Brown inputWindowHandleObj, keyEventObj, policyFlags); 897da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown if (checkAndClearExceptionFromCallback(env, "dispatchUnhandledKey")) { 898da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown fallbackKeyEventObj = NULL; 899da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown } 9001f2451007c660091b7b090c1ea332f9044515d2dJeff Brown android_view_KeyEvent_recycle(env, keyEventObj); 9011f2451007c660091b7b090c1ea332f9044515d2dJeff Brown env->DeleteLocalRef(keyEventObj); 90249ed71db425c5054e3ad9526496a7e116c89556bJeff Brown 90349ed71db425c5054e3ad9526496a7e116c89556bJeff Brown if (fallbackKeyEventObj) { 90449ed71db425c5054e3ad9526496a7e116c89556bJeff Brown // Note: outFallbackKeyEvent may be the same object as keyEvent. 90549ed71db425c5054e3ad9526496a7e116c89556bJeff Brown if (!android_view_KeyEvent_toNative(env, fallbackKeyEventObj, 90649ed71db425c5054e3ad9526496a7e116c89556bJeff Brown outFallbackKeyEvent)) { 90749ed71db425c5054e3ad9526496a7e116c89556bJeff Brown result = true; 90849ed71db425c5054e3ad9526496a7e116c89556bJeff Brown } 90949ed71db425c5054e3ad9526496a7e116c89556bJeff Brown android_view_KeyEvent_recycle(env, fallbackKeyEventObj); 91049ed71db425c5054e3ad9526496a7e116c89556bJeff Brown env->DeleteLocalRef(fallbackKeyEventObj); 91149ed71db425c5054e3ad9526496a7e116c89556bJeff Brown } 9121f2451007c660091b7b090c1ea332f9044515d2dJeff Brown } else { 9133762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("Failed to obtain key event object for dispatchUnhandledKey."); 9141f2451007c660091b7b090c1ea332f9044515d2dJeff Brown } 915928e054931d357326613c78e62f4d850b7c442ffJeff Brown env->DeleteLocalRef(inputWindowHandleObj); 9163915bb845b032dc184dba5e60970b803390ca3edJeff Brown } 9171f2451007c660091b7b090c1ea332f9044515d2dJeff Brown return result; 9183915bb845b032dc184dba5e60970b803390ca3edJeff Brown} 9193915bb845b032dc184dba5e60970b803390ca3edJeff Brown 92001ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brownvoid NativeInputManager::pokeUserActivity(nsecs_t eventTime, int32_t eventType) { 92101ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown android_server_PowerManagerService_userActivity(eventTime, eventType); 9226d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown} 9236d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown 924349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown 925b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brownbool NativeInputManager::checkInjectEventsPermissionNonReentrant( 926b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown int32_t injectorPid, int32_t injectorUid) { 927b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown JNIEnv* env = jniEnv(); 9284532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jboolean result = env->CallBooleanMethod(mServiceObj, 9294532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown gServiceClassInfo.checkInjectEventsPermission, injectorPid, injectorUid); 930da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown if (checkAndClearExceptionFromCallback(env, "checkInjectEventsPermission")) { 931da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown result = false; 932da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown } 933349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown return result; 934349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown} 935349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown 9362352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brownvoid NativeInputManager::loadPointerResources(PointerResources* outResources) { 9372352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown JNIEnv* env = jniEnv(); 9382352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown 9392352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown loadSystemIconAsSprite(env, mContextObj, POINTER_ICON_STYLE_SPOT_HOVER, 9402352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown &outResources->spotHover); 9412352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown loadSystemIconAsSprite(env, mContextObj, POINTER_ICON_STYLE_SPOT_TOUCH, 9422352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown &outResources->spotTouch); 9432352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown loadSystemIconAsSprite(env, mContextObj, POINTER_ICON_STYLE_SPOT_ANCHOR, 9442352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown &outResources->spotAnchor); 9452352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown} 9462352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown 94783c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown 9489c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown// ---------------------------------------------------------------------------- 9499c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 9504532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic jint nativeInit(JNIEnv* env, jclass clazz, 9514532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jobject serviceObj, jobject contextObj, jobject messageQueueObj) { 9524532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown sp<Looper> looper = android_os_MessageQueue_getLooper(env, messageQueueObj); 9534532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = new NativeInputManager(contextObj, serviceObj, looper); 9544532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown im->incStrong(serviceObj); 9554532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown return reinterpret_cast<jint>(im); 95646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} 95746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 9584532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic void nativeStart(JNIEnv* env, jclass clazz, jint ptr) { 9594532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 96046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 9614532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown status_t result = im->getInputManager()->start(); 96246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown if (result) { 96346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown jniThrowRuntimeException(env, "Input manager could not be started."); 96446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 96546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} 96646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 9674532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic void nativeSetDisplaySize(JNIEnv* env, jclass clazz, jint ptr, 968bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown jint displayId, jint width, jint height, jint externalWidth, jint externalHeight) { 9694532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 97046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 97146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown // XXX we could get this from the SurfaceFlinger directly instead of requiring it 97246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown // to be passed in like this, not sure which is better but leaving it like this 97346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown // keeps the window manager in direct control of when display transitions propagate down 97446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown // to the input dispatcher 9754532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown im->setDisplaySize(displayId, width, height, externalWidth, externalHeight); 97646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} 97746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 9784532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic void nativeSetDisplayOrientation(JNIEnv* env, jclass clazz, 9794532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jint ptr, jint displayId, jint orientation) { 9804532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 98146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 9824532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown im->setDisplayOrientation(displayId, orientation); 98346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} 98446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 9854532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic jint nativeGetScanCodeState(JNIEnv* env, jclass clazz, 9864532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jint ptr, jint deviceId, jint sourceMask, jint scanCode) { 9874532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 98846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 9894532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown return im->getInputManager()->getReader()->getScanCodeState( 9906d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown deviceId, uint32_t(sourceMask), scanCode); 99146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} 99246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 9934532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic jint nativeGetKeyCodeState(JNIEnv* env, jclass clazz, 9944532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jint ptr, jint deviceId, jint sourceMask, jint keyCode) { 9954532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 99646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 9974532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown return im->getInputManager()->getReader()->getKeyCodeState( 9986d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown deviceId, uint32_t(sourceMask), keyCode); 99946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} 100046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 10014532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic jint nativeGetSwitchState(JNIEnv* env, jclass clazz, 10024532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jint ptr, jint deviceId, jint sourceMask, jint sw) { 10034532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 100446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 10054532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown return im->getInputManager()->getReader()->getSwitchState( 10066d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown deviceId, uint32_t(sourceMask), sw); 100746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} 100846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 10094532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic jboolean nativeHasKeys(JNIEnv* env, jclass clazz, 10104532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jint ptr, jint deviceId, jint sourceMask, jintArray keyCodes, jbooleanArray outFlags) { 10114532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 101246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 101346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown int32_t* codes = env->GetIntArrayElements(keyCodes, NULL); 101446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown uint8_t* flags = env->GetBooleanArrayElements(outFlags, NULL); 101546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown jsize numCodes = env->GetArrayLength(keyCodes); 101646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown jboolean result; 10176d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown if (numCodes == env->GetArrayLength(keyCodes)) { 10184532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown result = im->getInputManager()->getReader()->hasKeys( 10196d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown deviceId, uint32_t(sourceMask), numCodes, codes, flags); 102046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } else { 102146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown result = JNI_FALSE; 102246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 102346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 102446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown env->ReleaseBooleanArrayElements(outFlags, flags, 0); 102546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown env->ReleaseIntArrayElements(keyCodes, codes, 0); 102646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown return result; 102746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} 102846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 102946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownstatic void throwInputChannelNotInitialized(JNIEnv* env) { 103046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown jniThrowException(env, "java/lang/IllegalStateException", 103146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown "inputChannel is not initialized"); 103246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} 103346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 10344532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic void handleInputChannelDisposed(JNIEnv* env, 103546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown jobject inputChannelObj, const sp<InputChannel>& inputChannel, void* data) { 10364532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = static_cast<NativeInputManager*>(data); 10374532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown 10388564c8da817a845353d213acd8636b76f567b234Steve Block ALOGW("Input channel object '%s' was disposed without first being unregistered with " 103946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown "the input manager!", inputChannel->getName().string()); 10404532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown im->unregisterInputChannel(env, inputChannel); 104146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} 104246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 10434532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic void nativeRegisterInputChannel(JNIEnv* env, jclass clazz, 10444532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jint ptr, jobject inputChannelObj, jobject inputWindowHandleObj, jboolean monitor) { 10454532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 104646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 104746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown sp<InputChannel> inputChannel = android_view_InputChannel_getInputChannel(env, 104846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown inputChannelObj); 104946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown if (inputChannel == NULL) { 105046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown throwInputChannelNotInitialized(env); 105146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown return; 105246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 105346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 1054928e054931d357326613c78e62f4d850b7c442ffJeff Brown sp<InputWindowHandle> inputWindowHandle = 1055928e054931d357326613c78e62f4d850b7c442ffJeff Brown android_server_InputWindowHandle_getHandle(env, inputWindowHandleObj); 10567fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown 10574532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown status_t status = im->registerInputChannel( 1058928e054931d357326613c78e62f4d850b7c442ffJeff Brown env, inputChannel, inputWindowHandle, monitor); 105946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown if (status) { 1060cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown String8 message; 1061cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown message.appendFormat("Failed to register input channel. status=%d", status); 1062cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown jniThrowRuntimeException(env, message.string()); 106346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown return; 106446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 106546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 1066a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown if (! monitor) { 1067a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown android_view_InputChannel_setDisposeCallback(env, inputChannelObj, 10684532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown handleInputChannelDisposed, im); 1069a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown } 107046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} 107146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 10724532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic void nativeUnregisterInputChannel(JNIEnv* env, jclass clazz, 10734532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jint ptr, jobject inputChannelObj) { 10744532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 107546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 107646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown sp<InputChannel> inputChannel = android_view_InputChannel_getInputChannel(env, 107746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown inputChannelObj); 107846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown if (inputChannel == NULL) { 107946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown throwInputChannelNotInitialized(env); 108046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown return; 108146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 108246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 108346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown android_view_InputChannel_setDisposeCallback(env, inputChannelObj, NULL, NULL); 108446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 10854532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown status_t status = im->unregisterInputChannel(env, inputChannel); 1086cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown if (status && status != BAD_VALUE) { // ignore already unregistered channel 1087cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown String8 message; 1088cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown message.appendFormat("Failed to unregister input channel. status=%d", status); 1089cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown jniThrowRuntimeException(env, message.string()); 109046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 109146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} 109246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 10934532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic void nativeSetInputFilterEnabled(JNIEnv* env, jclass clazz, 10944532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jint ptr, jboolean enabled) { 10954532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 10960029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown 10974532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown im->getInputManager()->getDispatcher()->setInputFilterEnabled(enabled); 10980029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown} 10990029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown 11004532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic jint nativeInjectInputEvent(JNIEnv* env, jclass clazz, 11014532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jint ptr, jobject inputEventObj, jint injectorPid, jint injectorUid, 11020029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown jint syncMode, jint timeoutMillis, jint policyFlags) { 11034532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 11047fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown 11056ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown if (env->IsInstanceOf(inputEventObj, gKeyEventClassInfo.clazz)) { 11066ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown KeyEvent keyEvent; 11071f2451007c660091b7b090c1ea332f9044515d2dJeff Brown status_t status = android_view_KeyEvent_toNative(env, inputEventObj, & keyEvent); 11081f2451007c660091b7b090c1ea332f9044515d2dJeff Brown if (status) { 11091f2451007c660091b7b090c1ea332f9044515d2dJeff Brown jniThrowRuntimeException(env, "Could not read contents of KeyEvent object."); 11101f2451007c660091b7b090c1ea332f9044515d2dJeff Brown return INPUT_EVENT_INJECTION_FAILED; 11111f2451007c660091b7b090c1ea332f9044515d2dJeff Brown } 11127fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown 11134532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown return im->getInputManager()->getDispatcher()->injectInputEvent( 11140029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown & keyEvent, injectorPid, injectorUid, syncMode, timeoutMillis, 11150029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown uint32_t(policyFlags)); 11166ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown } else if (env->IsInstanceOf(inputEventObj, gMotionEventClassInfo.clazz)) { 11172ed2462aa29c564f5231f317c27b3188da875e52Jeff Brown const MotionEvent* motionEvent = android_view_MotionEvent_getNativePtr(env, inputEventObj); 11182ed2462aa29c564f5231f317c27b3188da875e52Jeff Brown if (!motionEvent) { 11191f2451007c660091b7b090c1ea332f9044515d2dJeff Brown jniThrowRuntimeException(env, "Could not read contents of MotionEvent object."); 11201f2451007c660091b7b090c1ea332f9044515d2dJeff Brown return INPUT_EVENT_INJECTION_FAILED; 11211f2451007c660091b7b090c1ea332f9044515d2dJeff Brown } 11227fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown 11234532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown return im->getInputManager()->getDispatcher()->injectInputEvent( 11240029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown motionEvent, injectorPid, injectorUid, syncMode, timeoutMillis, 11250029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown uint32_t(policyFlags)); 11266ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown } else { 11276ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown jniThrowRuntimeException(env, "Invalid input event type."); 11287fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown return INPUT_EVENT_INJECTION_FAILED; 11297fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown } 11307fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown} 11317fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown 11324532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic void nativeSetInputWindows(JNIEnv* env, jclass clazz, 11334532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jint ptr, jobjectArray windowHandleObjArray) { 11344532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 1135349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown 11364532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown im->setInputWindows(env, windowHandleObjArray); 1137349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown} 1138349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown 11394532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic void nativeSetFocusedApplication(JNIEnv* env, jclass clazz, 11404532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jint ptr, jobject applicationHandleObj) { 11414532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 1142349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown 11434532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown im->setFocusedApplication(env, applicationHandleObj); 1144349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown} 1145349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown 11464532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic void nativeSetInputDispatchMode(JNIEnv* env, 11474532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jclass clazz, jint ptr, jboolean enabled, jboolean frozen) { 11484532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 1149349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown 11504532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown im->setInputDispatchMode(enabled, frozen); 1151349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown} 1152349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown 11534532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic void nativeSetSystemUiVisibility(JNIEnv* env, 11544532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jclass clazz, jint ptr, jint visibility) { 11554532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 115605dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown 11574532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown im->setSystemUiVisibility(visibility); 115805dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown} 115905dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown 11604532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic jobject nativeGetInputDevice(JNIEnv* env, 11614532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jclass clazz, jint ptr, jint deviceId) { 11624532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 11638d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown 11648d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown InputDeviceInfo deviceInfo; 11654532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown status_t status = im->getInputManager()->getReader()->getInputDeviceInfo( 11668d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown deviceId, & deviceInfo); 11678d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown if (status) { 11688d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown return NULL; 11698d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown } 11708d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown 11718d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown jobject deviceObj = env->NewObject(gInputDeviceClassInfo.clazz, gInputDeviceClassInfo.ctor); 11728d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown if (! deviceObj) { 11738d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown return NULL; 11748d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown } 11758d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown 11768d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown jstring deviceNameObj = env->NewStringUTF(deviceInfo.getName().string()); 11778d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown if (! deviceNameObj) { 11788d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown return NULL; 11798d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown } 11808d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown 11811e08fe90df18930691b0c2ec22e5db25d7fcb4cfJeff Brown jstring fileStr = env->NewStringUTF(deviceInfo.getKeyCharacterMapFile()); 11821e08fe90df18930691b0c2ec22e5db25d7fcb4cfJeff Brown if (!fileStr) { 11831e08fe90df18930691b0c2ec22e5db25d7fcb4cfJeff Brown return NULL; 11841e08fe90df18930691b0c2ec22e5db25d7fcb4cfJeff Brown } 11851e08fe90df18930691b0c2ec22e5db25d7fcb4cfJeff Brown 11868d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown env->SetIntField(deviceObj, gInputDeviceClassInfo.mId, deviceInfo.getId()); 11878d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown env->SetObjectField(deviceObj, gInputDeviceClassInfo.mName, deviceNameObj); 11888d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown env->SetIntField(deviceObj, gInputDeviceClassInfo.mSources, deviceInfo.getSources()); 11898d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown env->SetIntField(deviceObj, gInputDeviceClassInfo.mKeyboardType, deviceInfo.getKeyboardType()); 11901e08fe90df18930691b0c2ec22e5db25d7fcb4cfJeff Brown env->SetObjectField(deviceObj, gInputDeviceClassInfo.mKeyCharacterMapFile, fileStr); 11918d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown 1192efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown const Vector<InputDeviceInfo::MotionRange>& ranges = deviceInfo.getMotionRanges(); 11938d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown for (size_t i = 0; i < ranges.size(); i++) { 1194efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown const InputDeviceInfo::MotionRange& range = ranges.itemAt(i); 11958d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown env->CallVoidMethod(deviceObj, gInputDeviceClassInfo.addMotionRange, 1196efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown range.axis, range.source, range.min, range.max, range.flat, range.fuzz); 11978d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown if (env->ExceptionCheck()) { 11988d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown return NULL; 11998d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown } 12008d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown } 12018d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown 12028d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown return deviceObj; 12038d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown} 12048d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown 12054532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic jintArray nativeGetInputDeviceIds(JNIEnv* env, 12064532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jclass clazz, jint ptr) { 12074532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 12088d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown 12098d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown Vector<int> deviceIds; 12104532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown im->getInputManager()->getReader()->getInputDeviceIds(deviceIds); 12118d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown 12128d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown jintArray deviceIdsObj = env->NewIntArray(deviceIds.size()); 12138d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown if (! deviceIdsObj) { 12148d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown return NULL; 12158d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown } 12168d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown 12178d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown env->SetIntArrayRegion(deviceIdsObj, 0, deviceIds.size(), deviceIds.array()); 12188d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown return deviceIdsObj; 12198d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown} 12208d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown 12214532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic void nativeGetInputConfiguration(JNIEnv* env, 12224532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jclass clazz, jint ptr, jobject configObj) { 12234532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 122457c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown 122557c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown InputConfiguration config; 12264532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown im->getInputManager()->getReader()->getInputConfiguration(& config); 122757c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown 122857c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown env->SetIntField(configObj, gConfigurationClassInfo.touchscreen, config.touchScreen); 122957c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown env->SetIntField(configObj, gConfigurationClassInfo.keyboard, config.keyboard); 123057c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown env->SetIntField(configObj, gConfigurationClassInfo.navigation, config.navigation); 123157c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown} 123257c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown 12334532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic jboolean nativeTransferTouchFocus(JNIEnv* env, 12344532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jclass clazz, jint ptr, jobject fromChannelObj, jobject toChannelObj) { 12354532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 1236e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown 1237e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown sp<InputChannel> fromChannel = 1238e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown android_view_InputChannel_getInputChannel(env, fromChannelObj); 1239e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown sp<InputChannel> toChannel = 1240e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown android_view_InputChannel_getInputChannel(env, toChannelObj); 1241e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown 1242e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown if (fromChannel == NULL || toChannel == NULL) { 1243e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown return false; 1244e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown } 1245e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown 12464532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown return im->getInputManager()->getDispatcher()-> 1247e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown transferTouchFocus(fromChannel, toChannel); 1248e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown} 1249e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown 12504532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic void nativeSetPointerSpeed(JNIEnv* env, 12514532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jclass clazz, jint ptr, jint speed) { 12524532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 12531a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown 12544532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown im->setPointerSpeed(speed); 12551a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown} 12561a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown 12574532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic void nativeSetShowTouches(JNIEnv* env, 12584532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jclass clazz, jint ptr, jboolean enabled) { 12594532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 1260daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown 12614532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown im->setShowTouches(enabled); 1262daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown} 1263daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown 12644532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic jstring nativeDump(JNIEnv* env, jclass clazz, jint ptr) { 12654532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 1266e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown 1267b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown String8 dump; 12684532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown im->dump(dump); 1269e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown return env->NewStringUTF(dump.string()); 1270e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown} 1271e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown 12724532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic void nativeMonitor(JNIEnv* env, jclass clazz, jint ptr) { 12734532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 127489ef0720ee8e0ac6ae1758faa917e4d6c9606fb4Jeff Brown 12754532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown im->getInputManager()->getReader()->monitor(); 12764532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown im->getInputManager()->getDispatcher()->monitor(); 127789ef0720ee8e0ac6ae1758faa917e4d6c9606fb4Jeff Brown} 127889ef0720ee8e0ac6ae1758faa917e4d6c9606fb4Jeff Brown 12799c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown// ---------------------------------------------------------------------------- 12809c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 128146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownstatic JNINativeMethod gInputManagerMethods[] = { 128246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown /* name, signature, funcPtr */ 12834532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown { "nativeInit", 12844532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown "(Lcom/android/server/input/InputManagerService;Landroid/content/Context;Landroid/os/MessageQueue;)I", 12854532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeInit }, 12864532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown { "nativeStart", "(I)V", 12874532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeStart }, 12884532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown { "nativeSetDisplaySize", "(IIIIII)V", 12894532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeSetDisplaySize }, 12904532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown { "nativeSetDisplayOrientation", "(III)V", 12914532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeSetDisplayOrientation }, 12924532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown { "nativeGetScanCodeState", "(IIII)I", 12934532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeGetScanCodeState }, 12944532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown { "nativeGetKeyCodeState", "(IIII)I", 12954532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeGetKeyCodeState }, 12964532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown { "nativeGetSwitchState", "(IIII)I", 12974532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeGetSwitchState }, 12984532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown { "nativeHasKeys", "(III[I[Z)Z", 12994532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeHasKeys }, 1300928e054931d357326613c78e62f4d850b7c442ffJeff Brown { "nativeRegisterInputChannel", 13014532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown "(ILandroid/view/InputChannel;Lcom/android/server/input/InputWindowHandle;Z)V", 13024532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeRegisterInputChannel }, 13034532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown { "nativeUnregisterInputChannel", "(ILandroid/view/InputChannel;)V", 13044532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeUnregisterInputChannel }, 13054532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown { "nativeSetInputFilterEnabled", "(IZ)V", 13064532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeSetInputFilterEnabled }, 13074532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown { "nativeInjectInputEvent", "(ILandroid/view/InputEvent;IIIII)I", 13084532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeInjectInputEvent }, 13094532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown { "nativeSetInputWindows", "(I[Lcom/android/server/input/InputWindowHandle;)V", 13104532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeSetInputWindows }, 13114532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown { "nativeSetFocusedApplication", "(ILcom/android/server/input/InputApplicationHandle;)V", 13124532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeSetFocusedApplication }, 13134532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown { "nativeSetInputDispatchMode", "(IZZ)V", 13144532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeSetInputDispatchMode }, 13154532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown { "nativeSetSystemUiVisibility", "(II)V", 13164532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeSetSystemUiVisibility }, 13174532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown { "nativeGetInputDevice", "(II)Landroid/view/InputDevice;", 13184532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeGetInputDevice }, 13194532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown { "nativeGetInputDeviceIds", "(I)[I", 13204532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeGetInputDeviceIds }, 13214532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown { "nativeGetInputConfiguration", "(ILandroid/content/res/Configuration;)V", 13224532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeGetInputConfiguration }, 13234532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown { "nativeTransferTouchFocus", "(ILandroid/view/InputChannel;Landroid/view/InputChannel;)Z", 13244532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeTransferTouchFocus }, 13254532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown { "nativeSetPointerSpeed", "(II)V", 13264532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeSetPointerSpeed }, 13274532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown { "nativeSetShowTouches", "(IZ)V", 13284532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeSetShowTouches }, 13294532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown { "nativeDump", "(I)Ljava/lang/String;", 13304532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeDump }, 13314532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown { "nativeMonitor", "(I)V", 13324532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeMonitor }, 133346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}; 133446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 133546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#define FIND_CLASS(var, className) \ 133646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown var = env->FindClass(className); \ 133717cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro LOG_FATAL_IF(! var, "Unable to find class " className); 133846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 133946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#define GET_METHOD_ID(var, clazz, methodName, methodDescriptor) \ 134046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown var = env->GetMethodID(clazz, methodName, methodDescriptor); \ 134146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown LOG_FATAL_IF(! var, "Unable to find method " methodName); 134246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 134346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#define GET_FIELD_ID(var, clazz, fieldName, fieldDescriptor) \ 134446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown var = env->GetFieldID(clazz, fieldName, fieldDescriptor); \ 134546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown LOG_FATAL_IF(! var, "Unable to find field " fieldName); 134646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 134746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownint register_android_server_InputManager(JNIEnv* env) { 13484532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown int res = jniRegisterNativeMethods(env, "com/android/server/input/InputManagerService", 134946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown gInputManagerMethods, NELEM(gInputManagerMethods)); 135046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown LOG_FATAL_IF(res < 0, "Unable to register native methods."); 135146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 13529c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown // Callbacks 135346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 135417cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro jclass clazz; 13554532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown FIND_CLASS(clazz, "com/android/server/input/InputManagerService"); 135646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 13574532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown GET_METHOD_ID(gServiceClassInfo.notifyConfigurationChanged, clazz, 135857c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown "notifyConfigurationChanged", "(J)V"); 135946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 13604532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown GET_METHOD_ID(gServiceClassInfo.notifyLidSwitchChanged, clazz, 136146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown "notifyLidSwitchChanged", "(JZ)V"); 136246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 13634532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown GET_METHOD_ID(gServiceClassInfo.notifyInputChannelBroken, clazz, 13644532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown "notifyInputChannelBroken", "(Lcom/android/server/input/InputWindowHandle;)V"); 13657fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown 13664532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown GET_METHOD_ID(gServiceClassInfo.notifyANR, clazz, 1367928e054931d357326613c78e62f4d850b7c442ffJeff Brown "notifyANR", 13684532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown "(Lcom/android/server/input/InputApplicationHandle;Lcom/android/server/input/InputWindowHandle;)J"); 1369349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown 13704532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown GET_METHOD_ID(gServiceClassInfo.filterInputEvent, clazz, 13710029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown "filterInputEvent", "(Landroid/view/InputEvent;I)Z"); 13720029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown 13734532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown GET_METHOD_ID(gServiceClassInfo.interceptKeyBeforeQueueing, clazz, 13741f2451007c660091b7b090c1ea332f9044515d2dJeff Brown "interceptKeyBeforeQueueing", "(Landroid/view/KeyEvent;IZ)I"); 1375349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown 13764532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown GET_METHOD_ID(gServiceClassInfo.interceptMotionBeforeQueueingWhenScreenOff, 137717cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro clazz, 137856194ebec6212e229f4ccdaa4b187166d20013efJeff Brown "interceptMotionBeforeQueueingWhenScreenOff", "(I)I"); 137956194ebec6212e229f4ccdaa4b187166d20013efJeff Brown 13804532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown GET_METHOD_ID(gServiceClassInfo.interceptKeyBeforeDispatching, clazz, 13811f2451007c660091b7b090c1ea332f9044515d2dJeff Brown "interceptKeyBeforeDispatching", 13824532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown "(Lcom/android/server/input/InputWindowHandle;Landroid/view/KeyEvent;I)J"); 1383349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown 13844532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown GET_METHOD_ID(gServiceClassInfo.dispatchUnhandledKey, clazz, 138549ed71db425c5054e3ad9526496a7e116c89556bJeff Brown "dispatchUnhandledKey", 13864532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown "(Lcom/android/server/input/InputWindowHandle;Landroid/view/KeyEvent;I)Landroid/view/KeyEvent;"); 13873915bb845b032dc184dba5e60970b803390ca3edJeff Brown 13884532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown GET_METHOD_ID(gServiceClassInfo.checkInjectEventsPermission, clazz, 1389349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown "checkInjectEventsPermission", "(II)Z"); 139046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 13914532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown GET_METHOD_ID(gServiceClassInfo.getVirtualKeyQuietTimeMillis, clazz, 1392fe50892af3b365806a767298dfd8e86447682581Jeff Brown "getVirtualKeyQuietTimeMillis", "()I"); 1393fe50892af3b365806a767298dfd8e86447682581Jeff Brown 13944532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown GET_METHOD_ID(gServiceClassInfo.getExcludedDeviceNames, clazz, 139546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown "getExcludedDeviceNames", "()[Ljava/lang/String;"); 139646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 13974532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown GET_METHOD_ID(gServiceClassInfo.getKeyRepeatTimeout, clazz, 1398a454767b09ecb7d25d00beae0e5a1fdd48605c63Jeff Brown "getKeyRepeatTimeout", "()I"); 1399a454767b09ecb7d25d00beae0e5a1fdd48605c63Jeff Brown 14004532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown GET_METHOD_ID(gServiceClassInfo.getKeyRepeatDelay, clazz, 1401a454767b09ecb7d25d00beae0e5a1fdd48605c63Jeff Brown "getKeyRepeatDelay", "()I"); 1402a454767b09ecb7d25d00beae0e5a1fdd48605c63Jeff Brown 14034532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown GET_METHOD_ID(gServiceClassInfo.getHoverTapTimeout, clazz, 1404bb3fcba0caf697f1d238a2cbefdf1efe06eded99Jeff Brown "getHoverTapTimeout", "()I"); 1405bb3fcba0caf697f1d238a2cbefdf1efe06eded99Jeff Brown 14064532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown GET_METHOD_ID(gServiceClassInfo.getHoverTapSlop, clazz, 1407bb3fcba0caf697f1d238a2cbefdf1efe06eded99Jeff Brown "getHoverTapSlop", "()I"); 1408214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown 14094532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown GET_METHOD_ID(gServiceClassInfo.getDoubleTapTimeout, clazz, 1410214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown "getDoubleTapTimeout", "()I"); 1411214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown 14124532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown GET_METHOD_ID(gServiceClassInfo.getLongPressTimeout, clazz, 1413214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown "getLongPressTimeout", "()I"); 1414214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown 14154532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown GET_METHOD_ID(gServiceClassInfo.getPointerLayer, clazz, 141683c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown "getPointerLayer", "()I"); 141783c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown 14184532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown GET_METHOD_ID(gServiceClassInfo.getPointerIcon, clazz, 14192352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown "getPointerIcon", "()Landroid/view/PointerIcon;"); 1420b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 14216ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown // KeyEvent 14226ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown 14236ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown FIND_CLASS(gKeyEventClassInfo.clazz, "android/view/KeyEvent"); 142417cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro gKeyEventClassInfo.clazz = jclass(env->NewGlobalRef(gKeyEventClassInfo.clazz)); 142517cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro 14268d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown // MotionEvent 14276ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown 14286ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown FIND_CLASS(gMotionEventClassInfo.clazz, "android/view/MotionEvent"); 142917cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro gMotionEventClassInfo.clazz = jclass(env->NewGlobalRef(gMotionEventClassInfo.clazz)); 14306ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown 14318d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown // InputDevice 14328d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown 14338d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown FIND_CLASS(gInputDeviceClassInfo.clazz, "android/view/InputDevice"); 143417cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro gInputDeviceClassInfo.clazz = jclass(env->NewGlobalRef(gInputDeviceClassInfo.clazz)); 14358d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown 14368d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown GET_METHOD_ID(gInputDeviceClassInfo.ctor, gInputDeviceClassInfo.clazz, 14378d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown "<init>", "()V"); 14388d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown 14398d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown GET_METHOD_ID(gInputDeviceClassInfo.addMotionRange, gInputDeviceClassInfo.clazz, 1440efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown "addMotionRange", "(IIFFFF)V"); 14418d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown 14428d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown GET_FIELD_ID(gInputDeviceClassInfo.mId, gInputDeviceClassInfo.clazz, 14438d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown "mId", "I"); 14448d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown 14458d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown GET_FIELD_ID(gInputDeviceClassInfo.mName, gInputDeviceClassInfo.clazz, 14468d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown "mName", "Ljava/lang/String;"); 14478d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown 14488d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown GET_FIELD_ID(gInputDeviceClassInfo.mSources, gInputDeviceClassInfo.clazz, 14498d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown "mSources", "I"); 14508d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown 14518d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown GET_FIELD_ID(gInputDeviceClassInfo.mKeyboardType, gInputDeviceClassInfo.clazz, 14528d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown "mKeyboardType", "I"); 14538d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown 14541e08fe90df18930691b0c2ec22e5db25d7fcb4cfJeff Brown GET_FIELD_ID(gInputDeviceClassInfo.mKeyCharacterMapFile, gInputDeviceClassInfo.clazz, 14551e08fe90df18930691b0c2ec22e5db25d7fcb4cfJeff Brown "mKeyCharacterMapFile", "Ljava/lang/String;"); 14561e08fe90df18930691b0c2ec22e5db25d7fcb4cfJeff Brown 145757c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown // Configuration 145857c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown 145917cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro FIND_CLASS(clazz, "android/content/res/Configuration"); 146057c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown 146117cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro GET_FIELD_ID(gConfigurationClassInfo.touchscreen, clazz, 146257c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown "touchscreen", "I"); 146357c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown 146417cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro GET_FIELD_ID(gConfigurationClassInfo.keyboard, clazz, 146557c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown "keyboard", "I"); 146657c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown 146717cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro GET_FIELD_ID(gConfigurationClassInfo.navigation, clazz, 146857c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown "navigation", "I"); 146957c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown 147046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown return 0; 147146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} 147246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 147346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} /* namespace android */ 1474