com_android_server_input_InputManagerService.cpp revision a47425a13c19f95057df78b8bb65bb25657e8753
146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown/* 246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * Copyright (C) 2010 The Android Open Source Project 346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * 446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * Licensed under the Apache License, Version 2.0 (the "License"); 546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * you may not use this file except in compliance with the License. 646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * You may obtain a copy of the License at 746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * 846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * http://www.apache.org/licenses/LICENSE-2.0 946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * 1046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * Unless required by applicable law or agreed to in writing, software 1146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * distributed under the License is distributed on an "AS IS" BASIS, 1246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * See the License for the specific language governing permissions and 1446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * limitations under the License. 1546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown */ 1646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 1746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#define LOG_TAG "InputManager-JNI" 1846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 199c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown//#define LOG_NDEBUG 0 209c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 219c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown// Log debug messages about InputReaderPolicy 22349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown#define DEBUG_INPUT_READER_POLICY 0 239c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 249c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown// Log debug messages about InputDispatcherPolicy 25349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown#define DEBUG_INPUT_DISPATCHER_POLICY 0 269c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 2783c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown 2846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#include "JNIHelp.h" 2946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#include "jni.h" 30349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown#include <limits.h> 3146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#include <android_runtime/AndroidRuntime.h> 32b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 3346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#include <utils/Log.h> 3405dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown#include <utils/Looper.h> 3546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#include <utils/threads.h> 3683c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown 37b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown#include <input/InputManager.h> 38b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown#include <input/PointerController.h> 395541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown#include <input/SpriteController.h> 40b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 4105dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown#include <android_os_MessageQueue.h> 429f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown#include <android_view_InputDevice.h> 43b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown#include <android_view_KeyEvent.h> 44b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown#include <android_view_MotionEvent.h> 45b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown#include <android_view_InputChannel.h> 462352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown#include <android_view_PointerIcon.h> 47b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown#include <android/graphics/GraphicsJNI.h> 48b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 4900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown#include "com_android_server_PowerManagerService.h" 504532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown#include "com_android_server_input_InputApplicationHandle.h" 514532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown#include "com_android_server_input_InputWindowHandle.h" 5246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 5346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownnamespace android { 5446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 551a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown// The exponent used to calculate the pointer speed scaling factor. 561a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown// The scaling factor is calculated as 2 ^ (speed * exponent), 571a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown// where the speed ranges from -7 to + 7 and is supplied by the user. 58bb3fcba0caf697f1d238a2cbefdf1efe06eded99Jeff Brownstatic const float POINTER_SPEED_EXPONENT = 1.0f / 4; 591a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown 609c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brownstatic struct { 619c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown jmethodID notifyConfigurationChanged; 62af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown jmethodID notifyInputDevicesChanged; 639c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown jmethodID notifyLidSwitchChanged; 647fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown jmethodID notifyInputChannelBroken; 65349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown jmethodID notifyANR; 660029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown jmethodID filterInputEvent; 67349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown jmethodID interceptKeyBeforeQueueing; 6856194ebec6212e229f4ccdaa4b187166d20013efJeff Brown jmethodID interceptMotionBeforeQueueingWhenScreenOff; 69349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown jmethodID interceptKeyBeforeDispatching; 703915bb845b032dc184dba5e60970b803390ca3edJeff Brown jmethodID dispatchUnhandledKey; 71349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown jmethodID checkInjectEventsPermission; 72fe50892af3b365806a767298dfd8e86447682581Jeff Brown jmethodID getVirtualKeyQuietTimeMillis; 739c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown jmethodID getExcludedDeviceNames; 74a454767b09ecb7d25d00beae0e5a1fdd48605c63Jeff Brown jmethodID getKeyRepeatTimeout; 75a454767b09ecb7d25d00beae0e5a1fdd48605c63Jeff Brown jmethodID getKeyRepeatDelay; 76bb3fcba0caf697f1d238a2cbefdf1efe06eded99Jeff Brown jmethodID getHoverTapTimeout; 77bb3fcba0caf697f1d238a2cbefdf1efe06eded99Jeff Brown jmethodID getHoverTapSlop; 78214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown jmethodID getDoubleTapTimeout; 79214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown jmethodID getLongPressTimeout; 8083c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown jmethodID getPointerLayer; 81b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown jmethodID getPointerIcon; 824532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown} gServiceClassInfo; 839c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 849c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brownstatic struct { 859c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown jclass clazz; 86af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown} gInputDeviceClassInfo; 87af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown 88af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brownstatic struct { 89af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown jclass clazz; 906ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown} gKeyEventClassInfo; 916ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown 926ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brownstatic struct { 936ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown jclass clazz; 946ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown} gMotionEventClassInfo; 956ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown 968d60866e2100db70ecf0502c14768a384514d7e9Jeff Brownstatic struct { 9757c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown jfieldID touchscreen; 9857c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown jfieldID keyboard; 9957c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown jfieldID navigation; 10057c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown} gConfigurationClassInfo; 10157c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown 102928e054931d357326613c78e62f4d850b7c442ffJeff Brown 103928e054931d357326613c78e62f4d850b7c442ffJeff Brown// --- Global functions --- 104928e054931d357326613c78e62f4d850b7c442ffJeff Brown 105214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Browntemplate<typename T> 106214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Browninline static T min(const T& a, const T& b) { 107214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown return a < b ? a : b; 108214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown} 109214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown 110214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Browntemplate<typename T> 111214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Browninline static T max(const T& a, const T& b) { 112214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown return a > b ? a : b; 113214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown} 114214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown 115928e054931d357326613c78e62f4d850b7c442ffJeff Brownstatic jobject getInputApplicationHandleObjLocalRef(JNIEnv* env, 116928e054931d357326613c78e62f4d850b7c442ffJeff Brown const sp<InputApplicationHandle>& inputApplicationHandle) { 117928e054931d357326613c78e62f4d850b7c442ffJeff Brown if (inputApplicationHandle == NULL) { 118928e054931d357326613c78e62f4d850b7c442ffJeff Brown return NULL; 119928e054931d357326613c78e62f4d850b7c442ffJeff Brown } 120928e054931d357326613c78e62f4d850b7c442ffJeff Brown return static_cast<NativeInputApplicationHandle*>(inputApplicationHandle.get())-> 121928e054931d357326613c78e62f4d850b7c442ffJeff Brown getInputApplicationHandleObjLocalRef(env); 122928e054931d357326613c78e62f4d850b7c442ffJeff Brown} 123928e054931d357326613c78e62f4d850b7c442ffJeff Brown 124928e054931d357326613c78e62f4d850b7c442ffJeff Brownstatic jobject getInputWindowHandleObjLocalRef(JNIEnv* env, 125928e054931d357326613c78e62f4d850b7c442ffJeff Brown const sp<InputWindowHandle>& inputWindowHandle) { 126928e054931d357326613c78e62f4d850b7c442ffJeff Brown if (inputWindowHandle == NULL) { 127928e054931d357326613c78e62f4d850b7c442ffJeff Brown return NULL; 128928e054931d357326613c78e62f4d850b7c442ffJeff Brown } 129928e054931d357326613c78e62f4d850b7c442ffJeff Brown return static_cast<NativeInputWindowHandle*>(inputWindowHandle.get())-> 130928e054931d357326613c78e62f4d850b7c442ffJeff Brown getInputWindowHandleObjLocalRef(env); 131928e054931d357326613c78e62f4d850b7c442ffJeff Brown} 132928e054931d357326613c78e62f4d850b7c442ffJeff Brown 1332352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brownstatic void loadSystemIconAsSprite(JNIEnv* env, jobject contextObj, int32_t style, 1342352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown SpriteIcon* outSpriteIcon) { 1352352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown PointerIcon pointerIcon; 1362352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown status_t status = android_view_PointerIcon_loadSystemIcon(env, 1372352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown contextObj, style, &pointerIcon); 1382352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown if (!status) { 1392352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown pointerIcon.bitmap.copyTo(&outSpriteIcon->bitmap, SkBitmap::kARGB_8888_Config); 1402352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown outSpriteIcon->hotSpotX = pointerIcon.hotSpotX; 1412352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown outSpriteIcon->hotSpotY = pointerIcon.hotSpotY; 1422352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown } 1432352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown} 1442352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown 145905805ad7ce18a386076fff99264f821bbad9f83Jeff Brownenum { 146905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown WM_ACTION_PASS_TO_USER = 1, 147905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown WM_ACTION_POKE_USER_ACTIVITY = 2, 148905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown WM_ACTION_GO_TO_SLEEP = 4, 149905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown}; 150905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown 151928e054931d357326613c78e62f4d850b7c442ffJeff Brown 152928e054931d357326613c78e62f4d850b7c442ffJeff Brown// --- NativeInputManager --- 15383c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown 1549c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brownclass NativeInputManager : public virtual RefBase, 1559c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown public virtual InputReaderPolicyInterface, 1562352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown public virtual InputDispatcherPolicyInterface, 1572352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown public virtual PointerControllerPolicyInterface { 1589c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brownprotected: 1599c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown virtual ~NativeInputManager(); 1609c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 16146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownpublic: 1624532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager(jobject contextObj, jobject serviceObj, const sp<Looper>& looper); 1639c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 1649c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown inline sp<InputManager> getInputManager() const { return mInputManager; } 16546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 166b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown void dump(String8& dump); 167e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown 168bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown void setDisplaySize(int32_t displayId, int32_t width, int32_t height, 169bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown int32_t externalWidth, int32_t externalHeight); 17046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown void setDisplayOrientation(int32_t displayId, int32_t orientation); 17146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 1727fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown status_t registerInputChannel(JNIEnv* env, const sp<InputChannel>& inputChannel, 173928e054931d357326613c78e62f4d850b7c442ffJeff Brown const sp<InputWindowHandle>& inputWindowHandle, bool monitor); 1747fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown status_t unregisterInputChannel(JNIEnv* env, const sp<InputChannel>& inputChannel); 1757fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown 1769302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown void setInputWindows(JNIEnv* env, jobjectArray windowHandleObjArray); 1779302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown void setFocusedApplication(JNIEnv* env, jobject applicationHandleObj); 178349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown void setInputDispatchMode(bool enabled, bool frozen); 17905dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown void setSystemUiVisibility(int32_t visibility); 1801a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown void setPointerSpeed(int32_t speed); 181daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown void setShowTouches(bool enabled); 182349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown 1839c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown /* --- InputReaderPolicyInterface implementation --- */ 1849c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 185214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown virtual void getReaderConfiguration(InputReaderConfiguration* outConfig); 18683c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown virtual sp<PointerControllerInterface> obtainPointerController(int32_t deviceId); 187af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown virtual void notifyInputDevicesChanged(const Vector<InputDeviceInfo>& inputDevices); 18846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 1899c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown /* --- InputDispatcherPolicyInterface implementation --- */ 19046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 191e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown virtual void notifySwitch(nsecs_t when, int32_t switchCode, int32_t switchValue, 192e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown uint32_t policyFlags); 1939c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown virtual void notifyConfigurationChanged(nsecs_t when); 194519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown virtual nsecs_t notifyANR(const sp<InputApplicationHandle>& inputApplicationHandle, 195928e054931d357326613c78e62f4d850b7c442ffJeff Brown const sp<InputWindowHandle>& inputWindowHandle); 196928e054931d357326613c78e62f4d850b7c442ffJeff Brown virtual void notifyInputChannelBroken(const sp<InputWindowHandle>& inputWindowHandle); 1970029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown virtual bool filterInputEvent(const InputEvent* inputEvent, uint32_t policyFlags); 198214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown virtual void getDispatcherConfiguration(InputDispatcherConfiguration* outConfig); 199214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown virtual bool isKeyRepeatEnabled(); 2001f2451007c660091b7b090c1ea332f9044515d2dJeff Brown virtual void interceptKeyBeforeQueueing(const KeyEvent* keyEvent, uint32_t& policyFlags); 20156194ebec6212e229f4ccdaa4b187166d20013efJeff Brown virtual void interceptMotionBeforeQueueing(nsecs_t when, uint32_t& policyFlags); 202905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown virtual nsecs_t interceptKeyBeforeDispatching( 203905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown const sp<InputWindowHandle>& inputWindowHandle, 204b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown const KeyEvent* keyEvent, uint32_t policyFlags); 205928e054931d357326613c78e62f4d850b7c442ffJeff Brown virtual bool dispatchUnhandledKey(const sp<InputWindowHandle>& inputWindowHandle, 20649ed71db425c5054e3ad9526496a7e116c89556bJeff Brown const KeyEvent* keyEvent, uint32_t policyFlags, KeyEvent* outFallbackKeyEvent); 20701ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown virtual void pokeUserActivity(nsecs_t eventTime, int32_t eventType); 208b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown virtual bool checkInjectEventsPermissionNonReentrant( 209b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown int32_t injectorPid, int32_t injectorUid); 21046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 2112352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown /* --- PointerControllerPolicyInterface implementation --- */ 2122352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown 2132352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown virtual void loadPointerResources(PointerResources* outResources); 2142352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown 21546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownprivate: 2169c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown sp<InputManager> mInputManager; 21746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 2182352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown jobject mContextObj; 2194532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jobject mServiceObj; 22005dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown sp<Looper> mLooper; 22146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 22283c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown Mutex mLock; 22383c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown struct Locked { 22483c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown // Display size information. 225bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown int32_t displayWidth, displayHeight; // -1 when not initialized 226bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown int32_t displayExternalWidth, displayExternalHeight; // -1 when not initialized 22783c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown int32_t displayOrientation; 22883c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown 22905dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown // System UI visibility. 23005dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown int32_t systemUiVisibility; 23105dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown 2321a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown // Pointer speed. 2331a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown int32_t pointerSpeed; 2341a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown 235474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown // True if pointer gestures are enabled. 236474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown bool pointerGesturesEnabled; 237474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown 238daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown // Show touches feature enable/disable. 239daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown bool showTouches; 240daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown 2415541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown // Sprite controller singleton, created on first use. 2425541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown sp<SpriteController> spriteController; 2435541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown 24483c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown // Pointer controller singleton, created and destroyed as needed. 24583c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown wp<PointerController> pointerController; 24683c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown } mLocked; 24746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 2482352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown void updateInactivityTimeoutLocked(const sp<PointerController>& controller); 24956194ebec6212e229f4ccdaa4b187166d20013efJeff Brown void handleInterceptActions(jint wmActions, nsecs_t when, uint32_t& policyFlags); 2505541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown void ensureSpriteControllerLocked(); 25105dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown 25200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown // Power manager interactions. 2539c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown bool isScreenOn(); 2549c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown bool isScreenBright(); 2559c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 256b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown static bool checkAndClearExceptionFromCallback(JNIEnv* env, const char* methodName); 257a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown 2589c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown static inline JNIEnv* jniEnv() { 25946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown return AndroidRuntime::getJNIEnv(); 26046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 26146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}; 26246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 263928e054931d357326613c78e62f4d850b7c442ffJeff Brown 26446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 2652352b978a3c94cd88f41d0d908f961333fdac1e9Jeff BrownNativeInputManager::NativeInputManager(jobject contextObj, 2664532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jobject serviceObj, const sp<Looper>& looper) : 267214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown mLooper(looper) { 2689c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown JNIEnv* env = jniEnv(); 26946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 2702352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown mContextObj = env->NewGlobalRef(contextObj); 2714532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown mServiceObj = env->NewGlobalRef(serviceObj); 27246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 27383c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown { 27483c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown AutoMutex _l(mLock); 27583c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown mLocked.displayWidth = -1; 27683c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown mLocked.displayHeight = -1; 277bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown mLocked.displayExternalWidth = -1; 278bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown mLocked.displayExternalHeight = -1; 27965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown mLocked.displayOrientation = DISPLAY_ORIENTATION_0; 28005dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown 28105dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown mLocked.systemUiVisibility = ASYSTEM_UI_VISIBILITY_STATUS_BAR_VISIBLE; 2821a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown mLocked.pointerSpeed = 0; 283474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown mLocked.pointerGesturesEnabled = true; 284daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown mLocked.showTouches = false; 28583c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown } 28683c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown 2879c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown sp<EventHub> eventHub = new EventHub(); 2889c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown mInputManager = new InputManager(eventHub, this, this); 2899c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown} 29046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 2919c3cda04d969912bc46184f2b326d1db95e0aba5Jeff BrownNativeInputManager::~NativeInputManager() { 2929c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown JNIEnv* env = jniEnv(); 29346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 2942352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown env->DeleteGlobalRef(mContextObj); 2954532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown env->DeleteGlobalRef(mServiceObj); 2969c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown} 29746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 298b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brownvoid NativeInputManager::dump(String8& dump) { 299b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown mInputManager->getReader()->dump(dump); 300b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown dump.append("\n"); 3016d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown 302b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown mInputManager->getDispatcher()->dump(dump); 303b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown dump.append("\n"); 3049c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown} 30546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 3067fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brownbool NativeInputManager::checkAndClearExceptionFromCallback(JNIEnv* env, const char* methodName) { 3079c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown if (env->ExceptionCheck()) { 3083762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("An exception was thrown by callback '%s'.", methodName); 3099c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown LOGE_EX(env); 3109c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown env->ExceptionClear(); 3119c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown return true; 3129c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown } 3139c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown return false; 3149c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown} 3159c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 316bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brownvoid NativeInputManager::setDisplaySize(int32_t displayId, int32_t width, int32_t height, 317bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown int32_t externalWidth, int32_t externalHeight) { 31865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown bool changed = false; 3199c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown if (displayId == 0) { 32065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown AutoMutex _l(mLock); 3212352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown 32265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown if (mLocked.displayWidth != width || mLocked.displayHeight != height) { 32365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown changed = true; 32465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown mLocked.displayWidth = width; 32565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown mLocked.displayHeight = height; 32683c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown 32765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown sp<PointerController> controller = mLocked.pointerController.promote(); 32865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown if (controller != NULL) { 32965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown controller->setDisplaySize(width, height); 33083c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown } 33165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown } 332bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown 33365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown if (mLocked.displayExternalWidth != externalWidth 33465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown || mLocked.displayExternalHeight != externalHeight) { 33565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown changed = true; 336bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown mLocked.displayExternalWidth = externalWidth; 337bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown mLocked.displayExternalHeight = externalHeight; 33865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown } 33965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown } 34065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown 34165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown if (changed) { 34265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown mInputManager->getReader()->requestRefreshConfiguration( 34365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown InputReaderConfiguration::CHANGE_DISPLAY_INFO); 3449c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown } 3459c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown} 3469c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 3479c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brownvoid NativeInputManager::setDisplayOrientation(int32_t displayId, int32_t orientation) { 34865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown bool changed = false; 3499c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown if (displayId == 0) { 35083c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown AutoMutex _l(mLock); 35183c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown 35283c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown if (mLocked.displayOrientation != orientation) { 35365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown changed = true; 35483c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown mLocked.displayOrientation = orientation; 3559c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 35683c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown sp<PointerController> controller = mLocked.pointerController.promote(); 35783c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown if (controller != NULL) { 35883c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown controller->setDisplayOrientation(orientation); 35983c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown } 36083c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown } 3619c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown } 36265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown 36365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown if (changed) { 36465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown mInputManager->getReader()->requestRefreshConfiguration( 36565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown InputReaderConfiguration::CHANGE_DISPLAY_INFO); 36665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown } 3679c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown} 3689c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 3697fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brownstatus_t NativeInputManager::registerInputChannel(JNIEnv* env, 370928e054931d357326613c78e62f4d850b7c442ffJeff Brown const sp<InputChannel>& inputChannel, 371928e054931d357326613c78e62f4d850b7c442ffJeff Brown const sp<InputWindowHandle>& inputWindowHandle, bool monitor) { 372928e054931d357326613c78e62f4d850b7c442ffJeff Brown return mInputManager->getDispatcher()->registerInputChannel( 373928e054931d357326613c78e62f4d850b7c442ffJeff Brown inputChannel, inputWindowHandle, monitor); 3747fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown} 3757fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown 3767fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brownstatus_t NativeInputManager::unregisterInputChannel(JNIEnv* env, 3777fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown const sp<InputChannel>& inputChannel) { 378b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown return mInputManager->getDispatcher()->unregisterInputChannel(inputChannel); 3797fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown} 3807fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown 381214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brownvoid NativeInputManager::getReaderConfiguration(InputReaderConfiguration* outConfig) { 382214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown JNIEnv* env = jniEnv(); 3839c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 3844532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jint virtualKeyQuietTime = env->CallIntMethod(mServiceObj, 3854532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown gServiceClassInfo.getVirtualKeyQuietTimeMillis); 386214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown if (!checkAndClearExceptionFromCallback(env, "getVirtualKeyQuietTimeMillis")) { 387214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown outConfig->virtualKeyQuietTime = milliseconds_to_nanoseconds(virtualKeyQuietTime); 388fe50892af3b365806a767298dfd8e86447682581Jeff Brown } 3899c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 390214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown outConfig->excludedDeviceNames.clear(); 3914532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jobjectArray excludedDeviceNames = jobjectArray(env->CallObjectMethod(mServiceObj, 3924532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown gServiceClassInfo.getExcludedDeviceNames)); 393214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown if (!checkAndClearExceptionFromCallback(env, "getExcludedDeviceNames") && excludedDeviceNames) { 394214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown jsize length = env->GetArrayLength(excludedDeviceNames); 3959c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown for (jsize i = 0; i < length; i++) { 396214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown jstring item = jstring(env->GetObjectArrayElement(excludedDeviceNames, i)); 3979c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown const char* deviceNameChars = env->GetStringUTFChars(item, NULL); 398214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown outConfig->excludedDeviceNames.add(String8(deviceNameChars)); 3999c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown env->ReleaseStringUTFChars(item, deviceNameChars); 4009c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown env->DeleteLocalRef(item); 4019c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown } 402214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown env->DeleteLocalRef(excludedDeviceNames); 403214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown } 404214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown 4054532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jint hoverTapTimeout = env->CallIntMethod(mServiceObj, 4064532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown gServiceClassInfo.getHoverTapTimeout); 407bb3fcba0caf697f1d238a2cbefdf1efe06eded99Jeff Brown if (!checkAndClearExceptionFromCallback(env, "getHoverTapTimeout")) { 4084532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jint doubleTapTimeout = env->CallIntMethod(mServiceObj, 4094532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown gServiceClassInfo.getDoubleTapTimeout); 410214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown if (!checkAndClearExceptionFromCallback(env, "getDoubleTapTimeout")) { 4114532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jint longPressTimeout = env->CallIntMethod(mServiceObj, 4124532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown gServiceClassInfo.getLongPressTimeout); 413214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown if (!checkAndClearExceptionFromCallback(env, "getLongPressTimeout")) { 414bb3fcba0caf697f1d238a2cbefdf1efe06eded99Jeff Brown outConfig->pointerGestureTapInterval = milliseconds_to_nanoseconds(hoverTapTimeout); 415214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown 416214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown // We must ensure that the tap-drag interval is significantly shorter than 417214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown // the long-press timeout because the tap is held down for the entire duration 418214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown // of the double-tap timeout. 419214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown jint tapDragInterval = max(min(longPressTimeout - 100, 420bb3fcba0caf697f1d238a2cbefdf1efe06eded99Jeff Brown doubleTapTimeout), hoverTapTimeout); 421214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown outConfig->pointerGestureTapDragInterval = 422214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown milliseconds_to_nanoseconds(tapDragInterval); 423214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown } 424214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown } 425214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown } 426214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown 4274532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jint hoverTapSlop = env->CallIntMethod(mServiceObj, 4284532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown gServiceClassInfo.getHoverTapSlop); 429bb3fcba0caf697f1d238a2cbefdf1efe06eded99Jeff Brown if (!checkAndClearExceptionFromCallback(env, "getHoverTapSlop")) { 430bb3fcba0caf697f1d238a2cbefdf1efe06eded99Jeff Brown outConfig->pointerGestureTapSlop = hoverTapSlop; 4319c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown } 4321a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown 4331a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown { // acquire lock 4341a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown AutoMutex _l(mLock); 4351a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown 4361a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown outConfig->pointerVelocityControlParameters.scale = exp2f(mLocked.pointerSpeed 4371a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown * POINTER_SPEED_EXPONENT); 438474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown outConfig->pointerGesturesEnabled = mLocked.pointerGesturesEnabled; 43965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown 440daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown outConfig->showTouches = mLocked.showTouches; 441daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown 44265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown outConfig->setDisplayInfo(0, false /*external*/, 44365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown mLocked.displayWidth, mLocked.displayHeight, mLocked.displayOrientation); 44465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown outConfig->setDisplayInfo(0, true /*external*/, 44565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown mLocked.displayExternalWidth, mLocked.displayExternalHeight, 44665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown mLocked.displayOrientation); 4471a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown } // release lock 4489c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown} 4499c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 45083c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brownsp<PointerControllerInterface> NativeInputManager::obtainPointerController(int32_t deviceId) { 45183c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown AutoMutex _l(mLock); 45283c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown 45383c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown sp<PointerController> controller = mLocked.pointerController.promote(); 45483c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown if (controller == NULL) { 4555541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown ensureSpriteControllerLocked(); 45683c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown 4572352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown controller = new PointerController(this, mLooper, mLocked.spriteController); 45883c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown mLocked.pointerController = controller; 45983c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown 46083c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown controller->setDisplaySize(mLocked.displayWidth, mLocked.displayHeight); 46183c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown controller->setDisplayOrientation(mLocked.displayOrientation); 462b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 4635541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown JNIEnv* env = jniEnv(); 4644532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jobject pointerIconObj = env->CallObjectMethod(mServiceObj, 4654532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown gServiceClassInfo.getPointerIcon); 4662352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown if (!checkAndClearExceptionFromCallback(env, "getPointerIcon")) { 4672352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown PointerIcon pointerIcon; 4682352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown status_t status = android_view_PointerIcon_load(env, pointerIconObj, 4692352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown mContextObj, &pointerIcon); 4702352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown if (!status && !pointerIcon.isNullIcon()) { 4712352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown controller->setPointerIcon(SpriteIcon(pointerIcon.bitmap, 4722352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown pointerIcon.hotSpotX, pointerIcon.hotSpotY)); 4732352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown } else { 4742352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown controller->setPointerIcon(SpriteIcon()); 475b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown } 4762352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown env->DeleteLocalRef(pointerIconObj); 477b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown } 47805dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown 4792352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown updateInactivityTimeoutLocked(controller); 48083c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown } 48183c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown return controller; 48283c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown} 48383c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown 4845541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brownvoid NativeInputManager::ensureSpriteControllerLocked() { 4855541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown if (mLocked.spriteController == NULL) { 4865541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown JNIEnv* env = jniEnv(); 4874532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jint layer = env->CallIntMethod(mServiceObj, gServiceClassInfo.getPointerLayer); 4885541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown if (checkAndClearExceptionFromCallback(env, "getPointerLayer")) { 4895541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown layer = -1; 4905541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown } 4915541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown mLocked.spriteController = new SpriteController(mLooper, layer); 4925541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown } 4935541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown} 4945541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown 495af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brownvoid NativeInputManager::notifyInputDevicesChanged(const Vector<InputDeviceInfo>& inputDevices) { 496af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown JNIEnv* env = jniEnv(); 497af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown 498af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown size_t count = inputDevices.size(); 499af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown jobjectArray inputDevicesObjArray = env->NewObjectArray( 500af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown count, gInputDeviceClassInfo.clazz, NULL); 501af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown if (inputDevicesObjArray) { 502af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown bool error = false; 503af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown for (size_t i = 0; i < count; i++) { 504af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown jobject inputDeviceObj = android_view_InputDevice_create(env, inputDevices.itemAt(i)); 505af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown if (!inputDeviceObj) { 506af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown error = true; 507af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown break; 508af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown } 509af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown 510af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown env->SetObjectArrayElement(inputDevicesObjArray, i, inputDeviceObj); 511af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown env->DeleteLocalRef(inputDeviceObj); 512af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown } 513af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown 514af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown if (!error) { 515af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown env->CallVoidMethod(mServiceObj, gServiceClassInfo.notifyInputDevicesChanged, 516af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown inputDevicesObjArray); 517af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown } 518af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown 519af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown env->DeleteLocalRef(inputDevicesObjArray); 520af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown } 521af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown 522af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown checkAndClearExceptionFromCallback(env, "notifyInputDevicesChanged"); 523af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown} 524af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown 525e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brownvoid NativeInputManager::notifySwitch(nsecs_t when, int32_t switchCode, 526e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown int32_t switchValue, uint32_t policyFlags) { 527e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown#if DEBUG_INPUT_DISPATCHER_POLICY 5285baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("notifySwitch - when=%lld, switchCode=%d, switchValue=%d, policyFlags=0x%x", 529e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown when, switchCode, switchValue, policyFlags); 530e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown#endif 531e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown 532e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown JNIEnv* env = jniEnv(); 533e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown 534e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown switch (switchCode) { 535e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown case SW_LID: 53627fd3420ac0498ff5086f71023f443966541aa04Jeff Brown // When switch value is set indicates lid is closed. 5374532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown env->CallVoidMethod(mServiceObj, gServiceClassInfo.notifyLidSwitchChanged, 53827fd3420ac0498ff5086f71023f443966541aa04Jeff Brown when, switchValue == 0 /*lidOpen*/); 539e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown checkAndClearExceptionFromCallback(env, "notifyLidSwitchChanged"); 540e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown break; 541e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown } 542e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown} 543e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown 5449c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brownvoid NativeInputManager::notifyConfigurationChanged(nsecs_t when) { 5459c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown#if DEBUG_INPUT_DISPATCHER_POLICY 5465baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("notifyConfigurationChanged - when=%lld", when); 5479c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown#endif 5489c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 5499c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown JNIEnv* env = jniEnv(); 5509c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 5514532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown env->CallVoidMethod(mServiceObj, gServiceClassInfo.notifyConfigurationChanged, when); 5527fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown checkAndClearExceptionFromCallback(env, "notifyConfigurationChanged"); 5539c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown} 5549c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 555519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brownnsecs_t NativeInputManager::notifyANR(const sp<InputApplicationHandle>& inputApplicationHandle, 556928e054931d357326613c78e62f4d850b7c442ffJeff Brown const sp<InputWindowHandle>& inputWindowHandle) { 557b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown#if DEBUG_INPUT_DISPATCHER_POLICY 5585baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("notifyANR"); 559b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown#endif 560b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown 561b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown JNIEnv* env = jniEnv(); 562b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown 563928e054931d357326613c78e62f4d850b7c442ffJeff Brown jobject inputApplicationHandleObj = 564928e054931d357326613c78e62f4d850b7c442ffJeff Brown getInputApplicationHandleObjLocalRef(env, inputApplicationHandle); 565928e054931d357326613c78e62f4d850b7c442ffJeff Brown jobject inputWindowHandleObj = 566928e054931d357326613c78e62f4d850b7c442ffJeff Brown getInputWindowHandleObjLocalRef(env, inputWindowHandle); 567b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown 5684532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jlong newTimeout = env->CallLongMethod(mServiceObj, 5694532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown gServiceClassInfo.notifyANR, inputApplicationHandleObj, inputWindowHandleObj); 570519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown if (checkAndClearExceptionFromCallback(env, "notifyANR")) { 571b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown newTimeout = 0; // abort dispatch 572519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown } else { 573519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown assert(newTimeout >= 0); 574b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown } 575b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown 576928e054931d357326613c78e62f4d850b7c442ffJeff Brown env->DeleteLocalRef(inputWindowHandleObj); 577928e054931d357326613c78e62f4d850b7c442ffJeff Brown env->DeleteLocalRef(inputApplicationHandleObj); 578b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown return newTimeout; 579b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown} 580b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown 581928e054931d357326613c78e62f4d850b7c442ffJeff Brownvoid NativeInputManager::notifyInputChannelBroken(const sp<InputWindowHandle>& inputWindowHandle) { 5829c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown#if DEBUG_INPUT_DISPATCHER_POLICY 5835baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("notifyInputChannelBroken"); 5849c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown#endif 5859c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 5867fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown JNIEnv* env = jniEnv(); 5877fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown 588928e054931d357326613c78e62f4d850b7c442ffJeff Brown jobject inputWindowHandleObj = 589928e054931d357326613c78e62f4d850b7c442ffJeff Brown getInputWindowHandleObjLocalRef(env, inputWindowHandle); 590928e054931d357326613c78e62f4d850b7c442ffJeff Brown if (inputWindowHandleObj) { 5914532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown env->CallVoidMethod(mServiceObj, gServiceClassInfo.notifyInputChannelBroken, 592928e054931d357326613c78e62f4d850b7c442ffJeff Brown inputWindowHandleObj); 5937fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown checkAndClearExceptionFromCallback(env, "notifyInputChannelBroken"); 5947fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown 595928e054931d357326613c78e62f4d850b7c442ffJeff Brown env->DeleteLocalRef(inputWindowHandleObj); 5967fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown } 5979c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown} 5989c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 599214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brownvoid NativeInputManager::getDispatcherConfiguration(InputDispatcherConfiguration* outConfig) { 600214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown JNIEnv* env = jniEnv(); 601a454767b09ecb7d25d00beae0e5a1fdd48605c63Jeff Brown 6024532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jint keyRepeatTimeout = env->CallIntMethod(mServiceObj, 6034532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown gServiceClassInfo.getKeyRepeatTimeout); 604214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown if (!checkAndClearExceptionFromCallback(env, "getKeyRepeatTimeout")) { 605214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown outConfig->keyRepeatTimeout = milliseconds_to_nanoseconds(keyRepeatTimeout); 6069c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown } 6079c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 6084532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jint keyRepeatDelay = env->CallIntMethod(mServiceObj, 6094532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown gServiceClassInfo.getKeyRepeatDelay); 610214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown if (!checkAndClearExceptionFromCallback(env, "getKeyRepeatDelay")) { 611214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown outConfig->keyRepeatDelay = milliseconds_to_nanoseconds(keyRepeatDelay); 612214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown } 613b21fb104cc95fe7e5daf3b3626241e525c39a3f1Jeff Brown} 614b21fb104cc95fe7e5daf3b3626241e525c39a3f1Jeff Brown 615214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brownbool NativeInputManager::isKeyRepeatEnabled() { 616214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown // Only enable automatic key repeating when the screen is on. 617214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown return isScreenOn(); 618ae9fc03bdccda709101291bbcd3beaa5b6daebfcJeff Brown} 619ae9fc03bdccda709101291bbcd3beaa5b6daebfcJeff Brown 6209302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brownvoid NativeInputManager::setInputWindows(JNIEnv* env, jobjectArray windowHandleObjArray) { 6219302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown Vector<sp<InputWindowHandle> > windowHandles; 6229c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 6239302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown if (windowHandleObjArray) { 6249302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown jsize length = env->GetArrayLength(windowHandleObjArray); 6259302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown for (jsize i = 0; i < length; i++) { 6269302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown jobject windowHandleObj = env->GetObjectArrayElement(windowHandleObjArray, i); 6279302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown if (! windowHandleObj) { 6289302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown break; // found null element indicating end of used portion of the array 6299302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown } 630349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown 6319302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown sp<InputWindowHandle> windowHandle = 6329302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown android_server_InputWindowHandle_getHandle(env, windowHandleObj); 6339302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown if (windowHandle != NULL) { 6349302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown windowHandles.push(windowHandle); 635474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown } 6369302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown env->DeleteLocalRef(windowHandleObj); 637e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown } 638b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown } 639349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown 6409302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown mInputManager->getDispatcher()->setInputWindows(windowHandles); 6419302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown 6429302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown // Do this after the dispatcher has updated the window handle state. 6439302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown bool newPointerGesturesEnabled = true; 6449302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown size_t numWindows = windowHandles.size(); 6459302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown for (size_t i = 0; i < numWindows; i++) { 6469302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown const sp<InputWindowHandle>& windowHandle = windowHandles.itemAt(i); 647cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown const InputWindowInfo* windowInfo = windowHandle->getInfo(); 648cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown if (windowInfo && windowInfo->hasFocus && (windowInfo->inputFeatures 649cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown & InputWindowInfo::INPUT_FEATURE_DISABLE_TOUCH_PAD_GESTURES)) { 6509302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown newPointerGesturesEnabled = false; 6519302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown } 6529302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown } 653474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown 654474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown uint32_t changes = 0; 655474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown { // acquire lock 656474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown AutoMutex _l(mLock); 657474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown 658474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown if (mLocked.pointerGesturesEnabled != newPointerGesturesEnabled) { 659474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown mLocked.pointerGesturesEnabled = newPointerGesturesEnabled; 660474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown changes |= InputReaderConfiguration::CHANGE_POINTER_GESTURE_ENABLEMENT; 661474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown } 662474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown } // release lock 663474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown 664474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown if (changes) { 665474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown mInputManager->getReader()->requestRefreshConfiguration(changes); 666474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown } 667349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown} 668349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown 6699302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brownvoid NativeInputManager::setFocusedApplication(JNIEnv* env, jobject applicationHandleObj) { 6709302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown sp<InputApplicationHandle> applicationHandle = 6719302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown android_server_InputApplicationHandle_getHandle(env, applicationHandleObj); 6729302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown mInputManager->getDispatcher()->setFocusedApplication(applicationHandle); 6739c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown} 6749c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 675b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brownvoid NativeInputManager::setInputDispatchMode(bool enabled, bool frozen) { 676b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown mInputManager->getDispatcher()->setInputDispatchMode(enabled, frozen); 677349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown} 678349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown 67905dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brownvoid NativeInputManager::setSystemUiVisibility(int32_t visibility) { 68005dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown AutoMutex _l(mLock); 68105dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown 68205dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown if (mLocked.systemUiVisibility != visibility) { 68305dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown mLocked.systemUiVisibility = visibility; 68405dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown 68505dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown sp<PointerController> controller = mLocked.pointerController.promote(); 68605dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown if (controller != NULL) { 6872352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown updateInactivityTimeoutLocked(controller); 68805dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown } 68905dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown } 69005dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown} 69105dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown 6922352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brownvoid NativeInputManager::updateInactivityTimeoutLocked(const sp<PointerController>& controller) { 69305dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown bool lightsOut = mLocked.systemUiVisibility & ASYSTEM_UI_VISIBILITY_STATUS_BAR_HIDDEN; 6942352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown controller->setInactivityTimeout(lightsOut 6952352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown ? PointerController::INACTIVITY_TIMEOUT_SHORT 6962352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown : PointerController::INACTIVITY_TIMEOUT_NORMAL); 69705dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown} 69805dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown 6991a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brownvoid NativeInputManager::setPointerSpeed(int32_t speed) { 700474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown { // acquire lock 701474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown AutoMutex _l(mLock); 702474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown 703474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown if (mLocked.pointerSpeed == speed) { 704474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown return; 705474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown } 7061a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown 7076215d3ff4b5dfa52a5d8b9a42e343051f31066a5Steve Block ALOGI("Setting pointer speed to %d.", speed); 7081a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown mLocked.pointerSpeed = speed; 709474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown } // release lock 7101a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown 711474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown mInputManager->getReader()->requestRefreshConfiguration( 712474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown InputReaderConfiguration::CHANGE_POINTER_SPEED); 7131a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown} 7141a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown 715daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brownvoid NativeInputManager::setShowTouches(bool enabled) { 716daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown { // acquire lock 717daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown AutoMutex _l(mLock); 718daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown 719daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown if (mLocked.showTouches == enabled) { 720daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown return; 721daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown } 722daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown 7236215d3ff4b5dfa52a5d8b9a42e343051f31066a5Steve Block ALOGI("Setting show touches feature to %s.", enabled ? "enabled" : "disabled"); 724daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown mLocked.showTouches = enabled; 725daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown } // release lock 726daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown 727daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown mInputManager->getReader()->requestRefreshConfiguration( 728daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown InputReaderConfiguration::CHANGE_SHOW_TOUCHES); 729daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown} 730daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown 731e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brownbool NativeInputManager::isScreenOn() { 732e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown return android_server_PowerManagerService_isScreenOn(); 733e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown} 734e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown 735e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brownbool NativeInputManager::isScreenBright() { 736e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown return android_server_PowerManagerService_isScreenBright(); 737e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown} 738e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown 7390029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brownbool NativeInputManager::filterInputEvent(const InputEvent* inputEvent, uint32_t policyFlags) { 7400029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown jobject inputEventObj; 7410029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown 7420029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown JNIEnv* env = jniEnv(); 7430029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown switch (inputEvent->getType()) { 7440029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown case AINPUT_EVENT_TYPE_KEY: 7450029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown inputEventObj = android_view_KeyEvent_fromNative(env, 7460029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown static_cast<const KeyEvent*>(inputEvent)); 7470029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown break; 7480029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown case AINPUT_EVENT_TYPE_MOTION: 7490029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown inputEventObj = android_view_MotionEvent_obtainAsCopy(env, 7500029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown static_cast<const MotionEvent*>(inputEvent)); 7510029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown break; 7520029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown default: 7530029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown return true; // dispatch the event normally 7540029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown } 7550029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown 7560029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown if (!inputEventObj) { 7573762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("Failed to obtain input event object for filterInputEvent."); 7580029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown return true; // dispatch the event normally 7590029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown } 7600029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown 7610029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown // The callee is responsible for recycling the event. 7624532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jboolean pass = env->CallBooleanMethod(mServiceObj, gServiceClassInfo.filterInputEvent, 7630029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown inputEventObj, policyFlags); 7640029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown if (checkAndClearExceptionFromCallback(env, "filterInputEvent")) { 7650029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown pass = true; 7660029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown } 7670029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown env->DeleteLocalRef(inputEventObj); 7680029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown return pass; 7690029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown} 7700029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown 7711f2451007c660091b7b090c1ea332f9044515d2dJeff Brownvoid NativeInputManager::interceptKeyBeforeQueueing(const KeyEvent* keyEvent, 7721f2451007c660091b7b090c1ea332f9044515d2dJeff Brown uint32_t& policyFlags) { 7733122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown // Policy: 7743122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown // - Ignore untrusted events and pass them along. 7753122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown // - Ask the window manager what to do with normal events and trusted injected events. 7763122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown // - For normal events wake and brighten the screen if currently off or dim. 7773122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown if ((policyFlags & POLICY_FLAG_TRUSTED)) { 7781f2451007c660091b7b090c1ea332f9044515d2dJeff Brown nsecs_t when = keyEvent->getEventTime(); 7793122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown bool isScreenOn = this->isScreenOn(); 7803122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown bool isScreenBright = this->isScreenBright(); 781e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown 7823122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown JNIEnv* env = jniEnv(); 7831f2451007c660091b7b090c1ea332f9044515d2dJeff Brown jobject keyEventObj = android_view_KeyEvent_fromNative(env, keyEvent); 7841f2451007c660091b7b090c1ea332f9044515d2dJeff Brown jint wmActions; 7851f2451007c660091b7b090c1ea332f9044515d2dJeff Brown if (keyEventObj) { 7864532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown wmActions = env->CallIntMethod(mServiceObj, 7874532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown gServiceClassInfo.interceptKeyBeforeQueueing, 7881f2451007c660091b7b090c1ea332f9044515d2dJeff Brown keyEventObj, policyFlags, isScreenOn); 7891f2451007c660091b7b090c1ea332f9044515d2dJeff Brown if (checkAndClearExceptionFromCallback(env, "interceptKeyBeforeQueueing")) { 7901f2451007c660091b7b090c1ea332f9044515d2dJeff Brown wmActions = 0; 7911f2451007c660091b7b090c1ea332f9044515d2dJeff Brown } 7921f2451007c660091b7b090c1ea332f9044515d2dJeff Brown android_view_KeyEvent_recycle(env, keyEventObj); 7931f2451007c660091b7b090c1ea332f9044515d2dJeff Brown env->DeleteLocalRef(keyEventObj); 7941f2451007c660091b7b090c1ea332f9044515d2dJeff Brown } else { 7953762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("Failed to obtain key event object for interceptKeyBeforeQueueing."); 7963122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown wmActions = 0; 797e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown } 798e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown 7991f2451007c660091b7b090c1ea332f9044515d2dJeff Brown if (!(policyFlags & POLICY_FLAG_INJECTED)) { 8003122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown if (!isScreenOn) { 8013122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown policyFlags |= POLICY_FLAG_WOKE_HERE; 8023122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown } 8033122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown 8043122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown if (!isScreenBright) { 8053122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown policyFlags |= POLICY_FLAG_BRIGHT_HERE; 8063122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown } 807e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown } 808e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown 80956194ebec6212e229f4ccdaa4b187166d20013efJeff Brown handleInterceptActions(wmActions, when, /*byref*/ policyFlags); 8103122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown } else { 811e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown policyFlags |= POLICY_FLAG_PASS_TO_USER; 812e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown } 813e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown} 814e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown 81556194ebec6212e229f4ccdaa4b187166d20013efJeff Brownvoid NativeInputManager::interceptMotionBeforeQueueing(nsecs_t when, uint32_t& policyFlags) { 8163122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown // Policy: 8173122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown // - Ignore untrusted events and pass them along. 8183122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown // - No special filtering for injected events required at this time. 8193122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown // - Filter normal events based on screen state. 8203122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown // - For normal events brighten (but do not wake) the screen if currently dim. 8213122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown if ((policyFlags & POLICY_FLAG_TRUSTED) && !(policyFlags & POLICY_FLAG_INJECTED)) { 8223122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown if (isScreenOn()) { 8233122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown policyFlags |= POLICY_FLAG_PASS_TO_USER; 8243122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown 8253122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown if (!isScreenBright()) { 8263122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown policyFlags |= POLICY_FLAG_BRIGHT_HERE; 8273122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown } 82856194ebec6212e229f4ccdaa4b187166d20013efJeff Brown } else { 82956194ebec6212e229f4ccdaa4b187166d20013efJeff Brown JNIEnv* env = jniEnv(); 8304532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jint wmActions = env->CallIntMethod(mServiceObj, 8314532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown gServiceClassInfo.interceptMotionBeforeQueueingWhenScreenOff, 83256194ebec6212e229f4ccdaa4b187166d20013efJeff Brown policyFlags); 83356194ebec6212e229f4ccdaa4b187166d20013efJeff Brown if (checkAndClearExceptionFromCallback(env, 83456194ebec6212e229f4ccdaa4b187166d20013efJeff Brown "interceptMotionBeforeQueueingWhenScreenOff")) { 83556194ebec6212e229f4ccdaa4b187166d20013efJeff Brown wmActions = 0; 83656194ebec6212e229f4ccdaa4b187166d20013efJeff Brown } 83756194ebec6212e229f4ccdaa4b187166d20013efJeff Brown 83856194ebec6212e229f4ccdaa4b187166d20013efJeff Brown policyFlags |= POLICY_FLAG_WOKE_HERE | POLICY_FLAG_BRIGHT_HERE; 83956194ebec6212e229f4ccdaa4b187166d20013efJeff Brown handleInterceptActions(wmActions, when, /*byref*/ policyFlags); 840e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown } 8413122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown } else { 8423122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown policyFlags |= POLICY_FLAG_PASS_TO_USER; 843e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown } 844e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown} 845e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown 84656194ebec6212e229f4ccdaa4b187166d20013efJeff Brownvoid NativeInputManager::handleInterceptActions(jint wmActions, nsecs_t when, 84756194ebec6212e229f4ccdaa4b187166d20013efJeff Brown uint32_t& policyFlags) { 84856194ebec6212e229f4ccdaa4b187166d20013efJeff Brown if (wmActions & WM_ACTION_GO_TO_SLEEP) { 8499267beb8689e6febe3dd23f2a3025736c50eef01Jeff Brown#if DEBUG_INPUT_DISPATCHER_POLICY 8505baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("handleInterceptActions: Going to sleep."); 85156194ebec6212e229f4ccdaa4b187166d20013efJeff Brown#endif 85256194ebec6212e229f4ccdaa4b187166d20013efJeff Brown android_server_PowerManagerService_goToSleep(when); 85356194ebec6212e229f4ccdaa4b187166d20013efJeff Brown } 85456194ebec6212e229f4ccdaa4b187166d20013efJeff Brown 85556194ebec6212e229f4ccdaa4b187166d20013efJeff Brown if (wmActions & WM_ACTION_POKE_USER_ACTIVITY) { 8569267beb8689e6febe3dd23f2a3025736c50eef01Jeff Brown#if DEBUG_INPUT_DISPATCHER_POLICY 8575baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("handleInterceptActions: Poking user activity."); 85856194ebec6212e229f4ccdaa4b187166d20013efJeff Brown#endif 85956194ebec6212e229f4ccdaa4b187166d20013efJeff Brown android_server_PowerManagerService_userActivity(when, POWER_MANAGER_BUTTON_EVENT); 86056194ebec6212e229f4ccdaa4b187166d20013efJeff Brown } 86156194ebec6212e229f4ccdaa4b187166d20013efJeff Brown 86256194ebec6212e229f4ccdaa4b187166d20013efJeff Brown if (wmActions & WM_ACTION_PASS_TO_USER) { 86356194ebec6212e229f4ccdaa4b187166d20013efJeff Brown policyFlags |= POLICY_FLAG_PASS_TO_USER; 86456194ebec6212e229f4ccdaa4b187166d20013efJeff Brown } else { 8659267beb8689e6febe3dd23f2a3025736c50eef01Jeff Brown#if DEBUG_INPUT_DISPATCHER_POLICY 8665baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("handleInterceptActions: Not passing key to user."); 86756194ebec6212e229f4ccdaa4b187166d20013efJeff Brown#endif 86856194ebec6212e229f4ccdaa4b187166d20013efJeff Brown } 86956194ebec6212e229f4ccdaa4b187166d20013efJeff Brown} 87056194ebec6212e229f4ccdaa4b187166d20013efJeff Brown 871905805ad7ce18a386076fff99264f821bbad9f83Jeff Brownnsecs_t NativeInputManager::interceptKeyBeforeDispatching( 872928e054931d357326613c78e62f4d850b7c442ffJeff Brown const sp<InputWindowHandle>& inputWindowHandle, 873e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown const KeyEvent* keyEvent, uint32_t policyFlags) { 8743122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown // Policy: 8753122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown // - Ignore untrusted events and pass them along. 8763122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown // - Filter normal events and trusted injected events through the window manager policy to 8773122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown // handle the HOME key and the like. 878905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown nsecs_t result = 0; 8793122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown if (policyFlags & POLICY_FLAG_TRUSTED) { 8803122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown JNIEnv* env = jniEnv(); 8813122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown 882928e054931d357326613c78e62f4d850b7c442ffJeff Brown // Note: inputWindowHandle may be null. 883928e054931d357326613c78e62f4d850b7c442ffJeff Brown jobject inputWindowHandleObj = getInputWindowHandleObjLocalRef(env, inputWindowHandle); 8841f2451007c660091b7b090c1ea332f9044515d2dJeff Brown jobject keyEventObj = android_view_KeyEvent_fromNative(env, keyEvent); 8851f2451007c660091b7b090c1ea332f9044515d2dJeff Brown if (keyEventObj) { 8864532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jlong delayMillis = env->CallLongMethod(mServiceObj, 8874532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown gServiceClassInfo.interceptKeyBeforeDispatching, 888928e054931d357326613c78e62f4d850b7c442ffJeff Brown inputWindowHandleObj, keyEventObj, policyFlags); 8891f2451007c660091b7b090c1ea332f9044515d2dJeff Brown bool error = checkAndClearExceptionFromCallback(env, "interceptKeyBeforeDispatching"); 8901f2451007c660091b7b090c1ea332f9044515d2dJeff Brown android_view_KeyEvent_recycle(env, keyEventObj); 8911f2451007c660091b7b090c1ea332f9044515d2dJeff Brown env->DeleteLocalRef(keyEventObj); 892905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown if (!error) { 893905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown if (delayMillis < 0) { 894905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown result = -1; 895905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown } else if (delayMillis > 0) { 896905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown result = milliseconds_to_nanoseconds(delayMillis); 897905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown } 898905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown } 8991f2451007c660091b7b090c1ea332f9044515d2dJeff Brown } else { 9003762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("Failed to obtain key event object for interceptKeyBeforeDispatching."); 9011f2451007c660091b7b090c1ea332f9044515d2dJeff Brown } 902928e054931d357326613c78e62f4d850b7c442ffJeff Brown env->DeleteLocalRef(inputWindowHandleObj); 9033122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown } 9041f2451007c660091b7b090c1ea332f9044515d2dJeff Brown return result; 905d0097871828bb7d5d6eec06cadd92c2e3358849bJeff Brown} 906d0097871828bb7d5d6eec06cadd92c2e3358849bJeff Brown 907928e054931d357326613c78e62f4d850b7c442ffJeff Brownbool NativeInputManager::dispatchUnhandledKey(const sp<InputWindowHandle>& inputWindowHandle, 90849ed71db425c5054e3ad9526496a7e116c89556bJeff Brown const KeyEvent* keyEvent, uint32_t policyFlags, KeyEvent* outFallbackKeyEvent) { 9093915bb845b032dc184dba5e60970b803390ca3edJeff Brown // Policy: 9103915bb845b032dc184dba5e60970b803390ca3edJeff Brown // - Ignore untrusted events and do not perform default handling. 91149ed71db425c5054e3ad9526496a7e116c89556bJeff Brown bool result = false; 9123915bb845b032dc184dba5e60970b803390ca3edJeff Brown if (policyFlags & POLICY_FLAG_TRUSTED) { 9133915bb845b032dc184dba5e60970b803390ca3edJeff Brown JNIEnv* env = jniEnv(); 9143915bb845b032dc184dba5e60970b803390ca3edJeff Brown 915928e054931d357326613c78e62f4d850b7c442ffJeff Brown // Note: inputWindowHandle may be null. 916928e054931d357326613c78e62f4d850b7c442ffJeff Brown jobject inputWindowHandleObj = getInputWindowHandleObjLocalRef(env, inputWindowHandle); 9171f2451007c660091b7b090c1ea332f9044515d2dJeff Brown jobject keyEventObj = android_view_KeyEvent_fromNative(env, keyEvent); 9181f2451007c660091b7b090c1ea332f9044515d2dJeff Brown if (keyEventObj) { 9194532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jobject fallbackKeyEventObj = env->CallObjectMethod(mServiceObj, 9204532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown gServiceClassInfo.dispatchUnhandledKey, 921928e054931d357326613c78e62f4d850b7c442ffJeff Brown inputWindowHandleObj, keyEventObj, policyFlags); 922da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown if (checkAndClearExceptionFromCallback(env, "dispatchUnhandledKey")) { 923da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown fallbackKeyEventObj = NULL; 924da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown } 9251f2451007c660091b7b090c1ea332f9044515d2dJeff Brown android_view_KeyEvent_recycle(env, keyEventObj); 9261f2451007c660091b7b090c1ea332f9044515d2dJeff Brown env->DeleteLocalRef(keyEventObj); 92749ed71db425c5054e3ad9526496a7e116c89556bJeff Brown 92849ed71db425c5054e3ad9526496a7e116c89556bJeff Brown if (fallbackKeyEventObj) { 92949ed71db425c5054e3ad9526496a7e116c89556bJeff Brown // Note: outFallbackKeyEvent may be the same object as keyEvent. 93049ed71db425c5054e3ad9526496a7e116c89556bJeff Brown if (!android_view_KeyEvent_toNative(env, fallbackKeyEventObj, 93149ed71db425c5054e3ad9526496a7e116c89556bJeff Brown outFallbackKeyEvent)) { 93249ed71db425c5054e3ad9526496a7e116c89556bJeff Brown result = true; 93349ed71db425c5054e3ad9526496a7e116c89556bJeff Brown } 93449ed71db425c5054e3ad9526496a7e116c89556bJeff Brown android_view_KeyEvent_recycle(env, fallbackKeyEventObj); 93549ed71db425c5054e3ad9526496a7e116c89556bJeff Brown env->DeleteLocalRef(fallbackKeyEventObj); 93649ed71db425c5054e3ad9526496a7e116c89556bJeff Brown } 9371f2451007c660091b7b090c1ea332f9044515d2dJeff Brown } else { 9383762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("Failed to obtain key event object for dispatchUnhandledKey."); 9391f2451007c660091b7b090c1ea332f9044515d2dJeff Brown } 940928e054931d357326613c78e62f4d850b7c442ffJeff Brown env->DeleteLocalRef(inputWindowHandleObj); 9413915bb845b032dc184dba5e60970b803390ca3edJeff Brown } 9421f2451007c660091b7b090c1ea332f9044515d2dJeff Brown return result; 9433915bb845b032dc184dba5e60970b803390ca3edJeff Brown} 9443915bb845b032dc184dba5e60970b803390ca3edJeff Brown 94501ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brownvoid NativeInputManager::pokeUserActivity(nsecs_t eventTime, int32_t eventType) { 94601ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown android_server_PowerManagerService_userActivity(eventTime, eventType); 9476d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown} 9486d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown 949349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown 950b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brownbool NativeInputManager::checkInjectEventsPermissionNonReentrant( 951b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown int32_t injectorPid, int32_t injectorUid) { 952b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown JNIEnv* env = jniEnv(); 9534532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jboolean result = env->CallBooleanMethod(mServiceObj, 9544532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown gServiceClassInfo.checkInjectEventsPermission, injectorPid, injectorUid); 955da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown if (checkAndClearExceptionFromCallback(env, "checkInjectEventsPermission")) { 956da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown result = false; 957da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown } 958349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown return result; 959349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown} 960349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown 9612352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brownvoid NativeInputManager::loadPointerResources(PointerResources* outResources) { 9622352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown JNIEnv* env = jniEnv(); 9632352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown 9642352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown loadSystemIconAsSprite(env, mContextObj, POINTER_ICON_STYLE_SPOT_HOVER, 9652352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown &outResources->spotHover); 9662352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown loadSystemIconAsSprite(env, mContextObj, POINTER_ICON_STYLE_SPOT_TOUCH, 9672352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown &outResources->spotTouch); 9682352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown loadSystemIconAsSprite(env, mContextObj, POINTER_ICON_STYLE_SPOT_ANCHOR, 9692352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown &outResources->spotAnchor); 9702352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown} 9712352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown 97283c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown 9739c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown// ---------------------------------------------------------------------------- 9749c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 9754532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic jint nativeInit(JNIEnv* env, jclass clazz, 9764532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jobject serviceObj, jobject contextObj, jobject messageQueueObj) { 977603b44589682db3ff33ade172facb0c5e309f1beJeff Brown sp<MessageQueue> messageQueue = android_os_MessageQueue_getMessageQueue(env, messageQueueObj); 978603b44589682db3ff33ade172facb0c5e309f1beJeff Brown NativeInputManager* im = new NativeInputManager(contextObj, serviceObj, 979603b44589682db3ff33ade172facb0c5e309f1beJeff Brown messageQueue->getLooper()); 9804532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown im->incStrong(serviceObj); 9814532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown return reinterpret_cast<jint>(im); 98246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} 98346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 9844532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic void nativeStart(JNIEnv* env, jclass clazz, jint ptr) { 9854532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 98646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 9874532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown status_t result = im->getInputManager()->start(); 98846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown if (result) { 98946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown jniThrowRuntimeException(env, "Input manager could not be started."); 99046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 99146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} 99246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 9934532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic void nativeSetDisplaySize(JNIEnv* env, jclass clazz, jint ptr, 994bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown jint displayId, jint width, jint height, jint externalWidth, jint externalHeight) { 9954532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 99646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 99746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown // XXX we could get this from the SurfaceFlinger directly instead of requiring it 99846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown // to be passed in like this, not sure which is better but leaving it like this 99946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown // keeps the window manager in direct control of when display transitions propagate down 100046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown // to the input dispatcher 10014532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown im->setDisplaySize(displayId, width, height, externalWidth, externalHeight); 100246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} 100346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 10044532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic void nativeSetDisplayOrientation(JNIEnv* env, jclass clazz, 10054532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jint ptr, jint displayId, jint orientation) { 10064532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 100746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 10084532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown im->setDisplayOrientation(displayId, orientation); 100946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} 101046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 10114532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic jint nativeGetScanCodeState(JNIEnv* env, jclass clazz, 10124532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jint ptr, jint deviceId, jint sourceMask, jint scanCode) { 10134532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 101446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 10154532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown return im->getInputManager()->getReader()->getScanCodeState( 10166d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown deviceId, uint32_t(sourceMask), scanCode); 101746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} 101846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 10194532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic jint nativeGetKeyCodeState(JNIEnv* env, jclass clazz, 10204532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jint ptr, jint deviceId, jint sourceMask, jint keyCode) { 10214532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 102246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 10234532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown return im->getInputManager()->getReader()->getKeyCodeState( 10246d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown deviceId, uint32_t(sourceMask), keyCode); 102546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} 102646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 10274532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic jint nativeGetSwitchState(JNIEnv* env, jclass clazz, 10284532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jint ptr, jint deviceId, jint sourceMask, jint sw) { 10294532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 103046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 10314532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown return im->getInputManager()->getReader()->getSwitchState( 10326d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown deviceId, uint32_t(sourceMask), sw); 103346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} 103446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 10354532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic jboolean nativeHasKeys(JNIEnv* env, jclass clazz, 10364532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jint ptr, jint deviceId, jint sourceMask, jintArray keyCodes, jbooleanArray outFlags) { 10374532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 103846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 103946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown int32_t* codes = env->GetIntArrayElements(keyCodes, NULL); 104046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown uint8_t* flags = env->GetBooleanArrayElements(outFlags, NULL); 104146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown jsize numCodes = env->GetArrayLength(keyCodes); 104246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown jboolean result; 10436d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown if (numCodes == env->GetArrayLength(keyCodes)) { 10444532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown result = im->getInputManager()->getReader()->hasKeys( 10456d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown deviceId, uint32_t(sourceMask), numCodes, codes, flags); 104646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } else { 104746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown result = JNI_FALSE; 104846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 104946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 105046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown env->ReleaseBooleanArrayElements(outFlags, flags, 0); 105146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown env->ReleaseIntArrayElements(keyCodes, codes, 0); 105246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown return result; 105346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} 105446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 105546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownstatic void throwInputChannelNotInitialized(JNIEnv* env) { 105646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown jniThrowException(env, "java/lang/IllegalStateException", 105746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown "inputChannel is not initialized"); 105846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} 105946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 10604532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic void handleInputChannelDisposed(JNIEnv* env, 106146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown jobject inputChannelObj, const sp<InputChannel>& inputChannel, void* data) { 10624532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = static_cast<NativeInputManager*>(data); 10634532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown 10648564c8da817a845353d213acd8636b76f567b234Steve Block ALOGW("Input channel object '%s' was disposed without first being unregistered with " 106546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown "the input manager!", inputChannel->getName().string()); 10664532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown im->unregisterInputChannel(env, inputChannel); 106746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} 106846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 10694532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic void nativeRegisterInputChannel(JNIEnv* env, jclass clazz, 10704532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jint ptr, jobject inputChannelObj, jobject inputWindowHandleObj, jboolean monitor) { 10714532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 107246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 107346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown sp<InputChannel> inputChannel = android_view_InputChannel_getInputChannel(env, 107446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown inputChannelObj); 107546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown if (inputChannel == NULL) { 107646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown throwInputChannelNotInitialized(env); 107746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown return; 107846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 107946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 1080928e054931d357326613c78e62f4d850b7c442ffJeff Brown sp<InputWindowHandle> inputWindowHandle = 1081928e054931d357326613c78e62f4d850b7c442ffJeff Brown android_server_InputWindowHandle_getHandle(env, inputWindowHandleObj); 10827fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown 10834532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown status_t status = im->registerInputChannel( 1084928e054931d357326613c78e62f4d850b7c442ffJeff Brown env, inputChannel, inputWindowHandle, monitor); 108546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown if (status) { 1086cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown String8 message; 1087cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown message.appendFormat("Failed to register input channel. status=%d", status); 1088cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown jniThrowRuntimeException(env, message.string()); 108946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown return; 109046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 109146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 1092a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown if (! monitor) { 1093a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown android_view_InputChannel_setDisposeCallback(env, inputChannelObj, 10944532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown handleInputChannelDisposed, im); 1095a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown } 109646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} 109746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 10984532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic void nativeUnregisterInputChannel(JNIEnv* env, jclass clazz, 10994532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jint ptr, jobject inputChannelObj) { 11004532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 110146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 110246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown sp<InputChannel> inputChannel = android_view_InputChannel_getInputChannel(env, 110346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown inputChannelObj); 110446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown if (inputChannel == NULL) { 110546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown throwInputChannelNotInitialized(env); 110646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown return; 110746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 110846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 110946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown android_view_InputChannel_setDisposeCallback(env, inputChannelObj, NULL, NULL); 111046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 11114532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown status_t status = im->unregisterInputChannel(env, inputChannel); 1112cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown if (status && status != BAD_VALUE) { // ignore already unregistered channel 1113cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown String8 message; 1114cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown message.appendFormat("Failed to unregister input channel. status=%d", status); 1115cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown jniThrowRuntimeException(env, message.string()); 111646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 111746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} 111846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 11194532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic void nativeSetInputFilterEnabled(JNIEnv* env, jclass clazz, 11204532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jint ptr, jboolean enabled) { 11214532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 11220029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown 11234532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown im->getInputManager()->getDispatcher()->setInputFilterEnabled(enabled); 11240029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown} 11250029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown 11264532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic jint nativeInjectInputEvent(JNIEnv* env, jclass clazz, 11274532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jint ptr, jobject inputEventObj, jint injectorPid, jint injectorUid, 11280029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown jint syncMode, jint timeoutMillis, jint policyFlags) { 11294532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 11307fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown 11316ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown if (env->IsInstanceOf(inputEventObj, gKeyEventClassInfo.clazz)) { 11326ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown KeyEvent keyEvent; 11331f2451007c660091b7b090c1ea332f9044515d2dJeff Brown status_t status = android_view_KeyEvent_toNative(env, inputEventObj, & keyEvent); 11341f2451007c660091b7b090c1ea332f9044515d2dJeff Brown if (status) { 11351f2451007c660091b7b090c1ea332f9044515d2dJeff Brown jniThrowRuntimeException(env, "Could not read contents of KeyEvent object."); 11361f2451007c660091b7b090c1ea332f9044515d2dJeff Brown return INPUT_EVENT_INJECTION_FAILED; 11371f2451007c660091b7b090c1ea332f9044515d2dJeff Brown } 11387fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown 11394532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown return im->getInputManager()->getDispatcher()->injectInputEvent( 11400029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown & keyEvent, injectorPid, injectorUid, syncMode, timeoutMillis, 11410029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown uint32_t(policyFlags)); 11426ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown } else if (env->IsInstanceOf(inputEventObj, gMotionEventClassInfo.clazz)) { 11432ed2462aa29c564f5231f317c27b3188da875e52Jeff Brown const MotionEvent* motionEvent = android_view_MotionEvent_getNativePtr(env, inputEventObj); 11442ed2462aa29c564f5231f317c27b3188da875e52Jeff Brown if (!motionEvent) { 11451f2451007c660091b7b090c1ea332f9044515d2dJeff Brown jniThrowRuntimeException(env, "Could not read contents of MotionEvent object."); 11461f2451007c660091b7b090c1ea332f9044515d2dJeff Brown return INPUT_EVENT_INJECTION_FAILED; 11471f2451007c660091b7b090c1ea332f9044515d2dJeff Brown } 11487fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown 11494532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown return im->getInputManager()->getDispatcher()->injectInputEvent( 11500029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown motionEvent, injectorPid, injectorUid, syncMode, timeoutMillis, 11510029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown uint32_t(policyFlags)); 11526ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown } else { 11536ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown jniThrowRuntimeException(env, "Invalid input event type."); 11547fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown return INPUT_EVENT_INJECTION_FAILED; 11557fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown } 11567fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown} 11577fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown 11584532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic void nativeSetInputWindows(JNIEnv* env, jclass clazz, 11594532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jint ptr, jobjectArray windowHandleObjArray) { 11604532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 1161349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown 11624532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown im->setInputWindows(env, windowHandleObjArray); 1163349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown} 1164349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown 11654532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic void nativeSetFocusedApplication(JNIEnv* env, jclass clazz, 11664532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jint ptr, jobject applicationHandleObj) { 11674532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 1168349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown 11694532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown im->setFocusedApplication(env, applicationHandleObj); 1170349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown} 1171349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown 11724532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic void nativeSetInputDispatchMode(JNIEnv* env, 11734532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jclass clazz, jint ptr, jboolean enabled, jboolean frozen) { 11744532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 1175349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown 11764532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown im->setInputDispatchMode(enabled, frozen); 1177349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown} 1178349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown 11794532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic void nativeSetSystemUiVisibility(JNIEnv* env, 11804532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jclass clazz, jint ptr, jint visibility) { 11814532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 118205dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown 11834532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown im->setSystemUiVisibility(visibility); 118405dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown} 118505dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown 11864532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic void nativeGetInputConfiguration(JNIEnv* env, 11874532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jclass clazz, jint ptr, jobject configObj) { 11884532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 118957c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown 119057c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown InputConfiguration config; 11914532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown im->getInputManager()->getReader()->getInputConfiguration(& config); 119257c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown 119357c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown env->SetIntField(configObj, gConfigurationClassInfo.touchscreen, config.touchScreen); 119457c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown env->SetIntField(configObj, gConfigurationClassInfo.keyboard, config.keyboard); 119557c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown env->SetIntField(configObj, gConfigurationClassInfo.navigation, config.navigation); 119657c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown} 119757c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown 11984532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic jboolean nativeTransferTouchFocus(JNIEnv* env, 11994532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jclass clazz, jint ptr, jobject fromChannelObj, jobject toChannelObj) { 12004532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 1201e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown 1202e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown sp<InputChannel> fromChannel = 1203e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown android_view_InputChannel_getInputChannel(env, fromChannelObj); 1204e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown sp<InputChannel> toChannel = 1205e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown android_view_InputChannel_getInputChannel(env, toChannelObj); 1206e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown 1207e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown if (fromChannel == NULL || toChannel == NULL) { 1208e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown return false; 1209e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown } 1210e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown 12114532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown return im->getInputManager()->getDispatcher()-> 1212e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown transferTouchFocus(fromChannel, toChannel); 1213e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown} 1214e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown 12154532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic void nativeSetPointerSpeed(JNIEnv* env, 12164532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jclass clazz, jint ptr, jint speed) { 12174532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 12181a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown 12194532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown im->setPointerSpeed(speed); 12201a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown} 12211a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown 12224532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic void nativeSetShowTouches(JNIEnv* env, 12234532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jclass clazz, jint ptr, jboolean enabled) { 12244532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 1225daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown 12264532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown im->setShowTouches(enabled); 1227daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown} 1228daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown 1229a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brownstatic void nativeVibrate(JNIEnv* env, 1230a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown jclass clazz, jint ptr, jint deviceId, jlongArray patternObj, 1231a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown jint repeat, jint token) { 1232a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 1233a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown 1234a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown size_t patternSize = env->GetArrayLength(patternObj); 1235a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown if (patternSize > MAX_VIBRATE_PATTERN_SIZE) { 1236a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown ALOGI("Skipped requested vibration because the pattern size is %d " 1237a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown "which is more than the maximum supported size of %d.", 1238a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown patternSize, MAX_VIBRATE_PATTERN_SIZE); 1239a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown return; // limit to reasonable size 1240a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown } 1241a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown 1242a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown jlong* patternMillis = static_cast<jlong*>(env->GetPrimitiveArrayCritical( 1243a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown patternObj, NULL)); 1244a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown nsecs_t pattern[patternSize]; 1245a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown for (size_t i = 0; i < patternSize; i++) { 1246a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown pattern[i] = max(jlong(0), min(patternMillis[i], 1247a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown MAX_VIBRATE_PATTERN_DELAY_NSECS / 1000000LL)) * 1000000LL; 1248a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown } 1249a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown env->ReleasePrimitiveArrayCritical(patternObj, patternMillis, JNI_ABORT); 1250a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown 1251a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown im->getInputManager()->getReader()->vibrate(deviceId, pattern, patternSize, repeat, token); 1252a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown} 1253a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown 1254a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brownstatic void nativeCancelVibrate(JNIEnv* env, 1255a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown jclass clazz, jint ptr, jint deviceId, jint token) { 1256a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 1257a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown 1258a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown im->getInputManager()->getReader()->cancelVibrate(deviceId, token); 1259a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown} 1260a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown 12614532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic jstring nativeDump(JNIEnv* env, jclass clazz, jint ptr) { 12624532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 1263e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown 1264b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown String8 dump; 12654532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown im->dump(dump); 1266e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown return env->NewStringUTF(dump.string()); 1267e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown} 1268e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown 12694532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic void nativeMonitor(JNIEnv* env, jclass clazz, jint ptr) { 12704532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 127189ef0720ee8e0ac6ae1758faa917e4d6c9606fb4Jeff Brown 12724532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown im->getInputManager()->getReader()->monitor(); 12734532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown im->getInputManager()->getDispatcher()->monitor(); 127489ef0720ee8e0ac6ae1758faa917e4d6c9606fb4Jeff Brown} 127589ef0720ee8e0ac6ae1758faa917e4d6c9606fb4Jeff Brown 12769c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown// ---------------------------------------------------------------------------- 12779c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 127846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownstatic JNINativeMethod gInputManagerMethods[] = { 127946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown /* name, signature, funcPtr */ 12804532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown { "nativeInit", 12814532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown "(Lcom/android/server/input/InputManagerService;Landroid/content/Context;Landroid/os/MessageQueue;)I", 12824532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeInit }, 12834532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown { "nativeStart", "(I)V", 12844532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeStart }, 12854532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown { "nativeSetDisplaySize", "(IIIIII)V", 12864532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeSetDisplaySize }, 12874532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown { "nativeSetDisplayOrientation", "(III)V", 12884532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeSetDisplayOrientation }, 12894532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown { "nativeGetScanCodeState", "(IIII)I", 12904532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeGetScanCodeState }, 12914532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown { "nativeGetKeyCodeState", "(IIII)I", 12924532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeGetKeyCodeState }, 12934532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown { "nativeGetSwitchState", "(IIII)I", 12944532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeGetSwitchState }, 12954532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown { "nativeHasKeys", "(III[I[Z)Z", 12964532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeHasKeys }, 1297928e054931d357326613c78e62f4d850b7c442ffJeff Brown { "nativeRegisterInputChannel", 12984532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown "(ILandroid/view/InputChannel;Lcom/android/server/input/InputWindowHandle;Z)V", 12994532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeRegisterInputChannel }, 13004532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown { "nativeUnregisterInputChannel", "(ILandroid/view/InputChannel;)V", 13014532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeUnregisterInputChannel }, 13024532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown { "nativeSetInputFilterEnabled", "(IZ)V", 13034532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeSetInputFilterEnabled }, 13044532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown { "nativeInjectInputEvent", "(ILandroid/view/InputEvent;IIIII)I", 13054532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeInjectInputEvent }, 13064532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown { "nativeSetInputWindows", "(I[Lcom/android/server/input/InputWindowHandle;)V", 13074532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeSetInputWindows }, 13084532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown { "nativeSetFocusedApplication", "(ILcom/android/server/input/InputApplicationHandle;)V", 13094532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeSetFocusedApplication }, 13104532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown { "nativeSetInputDispatchMode", "(IZZ)V", 13114532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeSetInputDispatchMode }, 13124532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown { "nativeSetSystemUiVisibility", "(II)V", 13134532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeSetSystemUiVisibility }, 13144532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown { "nativeGetInputConfiguration", "(ILandroid/content/res/Configuration;)V", 13154532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeGetInputConfiguration }, 13164532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown { "nativeTransferTouchFocus", "(ILandroid/view/InputChannel;Landroid/view/InputChannel;)Z", 13174532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeTransferTouchFocus }, 13184532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown { "nativeSetPointerSpeed", "(II)V", 13194532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeSetPointerSpeed }, 13204532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown { "nativeSetShowTouches", "(IZ)V", 13214532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeSetShowTouches }, 1322a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown { "nativeVibrate", "(II[JII)V", 1323a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown (void*) nativeVibrate }, 1324a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown { "nativeCancelVibrate", "(III)V", 1325a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown (void*) nativeCancelVibrate }, 13264532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown { "nativeDump", "(I)Ljava/lang/String;", 13274532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeDump }, 13284532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown { "nativeMonitor", "(I)V", 13294532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeMonitor }, 133046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}; 133146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 133246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#define FIND_CLASS(var, className) \ 133346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown var = env->FindClass(className); \ 133417cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro LOG_FATAL_IF(! var, "Unable to find class " className); 133546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 133646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#define GET_METHOD_ID(var, clazz, methodName, methodDescriptor) \ 133746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown var = env->GetMethodID(clazz, methodName, methodDescriptor); \ 133846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown LOG_FATAL_IF(! var, "Unable to find method " methodName); 133946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 134046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#define GET_FIELD_ID(var, clazz, fieldName, fieldDescriptor) \ 134146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown var = env->GetFieldID(clazz, fieldName, fieldDescriptor); \ 134246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown LOG_FATAL_IF(! var, "Unable to find field " fieldName); 134346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 134446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownint register_android_server_InputManager(JNIEnv* env) { 13454532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown int res = jniRegisterNativeMethods(env, "com/android/server/input/InputManagerService", 134646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown gInputManagerMethods, NELEM(gInputManagerMethods)); 134746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown LOG_FATAL_IF(res < 0, "Unable to register native methods."); 134846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 13499c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown // Callbacks 135046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 135117cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro jclass clazz; 13524532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown FIND_CLASS(clazz, "com/android/server/input/InputManagerService"); 135346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 13544532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown GET_METHOD_ID(gServiceClassInfo.notifyConfigurationChanged, clazz, 135557c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown "notifyConfigurationChanged", "(J)V"); 135646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 1357af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown GET_METHOD_ID(gServiceClassInfo.notifyInputDevicesChanged, clazz, 1358af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown "notifyInputDevicesChanged", "([Landroid/view/InputDevice;)V"); 1359af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff 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 1421af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown // InputDevice 1422af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown 1423af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown FIND_CLASS(gInputDeviceClassInfo.clazz, "android/view/InputDevice"); 1424af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown gInputDeviceClassInfo.clazz = jclass(env->NewGlobalRef(gInputDeviceClassInfo.clazz)); 1425af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown 14266ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown // KeyEvent 14276ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown 14286ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown FIND_CLASS(gKeyEventClassInfo.clazz, "android/view/KeyEvent"); 142917cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro gKeyEventClassInfo.clazz = jclass(env->NewGlobalRef(gKeyEventClassInfo.clazz)); 143017cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro 14318d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown // MotionEvent 14326ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown 14336ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown FIND_CLASS(gMotionEventClassInfo.clazz, "android/view/MotionEvent"); 143417cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro gMotionEventClassInfo.clazz = jclass(env->NewGlobalRef(gMotionEventClassInfo.clazz)); 14356ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown 143657c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown // Configuration 143757c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown 143817cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro FIND_CLASS(clazz, "android/content/res/Configuration"); 143957c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown 144017cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro GET_FIELD_ID(gConfigurationClassInfo.touchscreen, clazz, 144157c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown "touchscreen", "I"); 144257c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown 144317cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro GET_FIELD_ID(gConfigurationClassInfo.keyboard, clazz, 144457c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown "keyboard", "I"); 144557c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown 144617cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro GET_FIELD_ID(gConfigurationClassInfo.navigation, clazz, 144757c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown "navigation", "I"); 144857c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown 144946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown return 0; 145046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} 145146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 145246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} /* namespace android */ 1453