com_android_server_input_InputManagerService.cpp revision 6ec6f79e1ac1714e3b837796e99f07ff88f66601
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 496ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown#include <ScopedLocalRef.h> 506ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown#include <ScopedUtfChars.h> 516ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown 5200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown#include "com_android_server_PowerManagerService.h" 534532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown#include "com_android_server_input_InputApplicationHandle.h" 544532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown#include "com_android_server_input_InputWindowHandle.h" 5546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 5646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownnamespace android { 5746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 581a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown// The exponent used to calculate the pointer speed scaling factor. 591a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown// The scaling factor is calculated as 2 ^ (speed * exponent), 601a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown// where the speed ranges from -7 to + 7 and is supplied by the user. 61bb3fcba0caf697f1d238a2cbefdf1efe06eded99Jeff Brownstatic const float POINTER_SPEED_EXPONENT = 1.0f / 4; 621a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown 639c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brownstatic struct { 649c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown jmethodID notifyConfigurationChanged; 65af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown jmethodID notifyInputDevicesChanged; 669c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown jmethodID notifyLidSwitchChanged; 677fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown jmethodID notifyInputChannelBroken; 68349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown jmethodID notifyANR; 690029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown jmethodID filterInputEvent; 70349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown jmethodID interceptKeyBeforeQueueing; 7156194ebec6212e229f4ccdaa4b187166d20013efJeff Brown jmethodID interceptMotionBeforeQueueingWhenScreenOff; 72349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown jmethodID interceptKeyBeforeDispatching; 733915bb845b032dc184dba5e60970b803390ca3edJeff Brown jmethodID dispatchUnhandledKey; 74349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown jmethodID checkInjectEventsPermission; 75fe50892af3b365806a767298dfd8e86447682581Jeff Brown jmethodID getVirtualKeyQuietTimeMillis; 769c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown jmethodID getExcludedDeviceNames; 77a454767b09ecb7d25d00beae0e5a1fdd48605c63Jeff Brown jmethodID getKeyRepeatTimeout; 78a454767b09ecb7d25d00beae0e5a1fdd48605c63Jeff Brown jmethodID getKeyRepeatDelay; 79bb3fcba0caf697f1d238a2cbefdf1efe06eded99Jeff Brown jmethodID getHoverTapTimeout; 80bb3fcba0caf697f1d238a2cbefdf1efe06eded99Jeff Brown jmethodID getHoverTapSlop; 81214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown jmethodID getDoubleTapTimeout; 82214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown jmethodID getLongPressTimeout; 8383c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown jmethodID getPointerLayer; 84b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown jmethodID getPointerIcon; 856ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown jmethodID getKeyboardLayoutOverlay; 864532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown} gServiceClassInfo; 879c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 889c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brownstatic struct { 899c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown jclass clazz; 90af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown} gInputDeviceClassInfo; 91af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown 92af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brownstatic struct { 93af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown jclass clazz; 946ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown} gKeyEventClassInfo; 956ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown 966ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brownstatic struct { 976ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown jclass clazz; 986ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown} gMotionEventClassInfo; 996ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown 1008d60866e2100db70ecf0502c14768a384514d7e9Jeff Brownstatic struct { 10157c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown jfieldID touchscreen; 10257c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown jfieldID keyboard; 10357c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown jfieldID navigation; 10457c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown} gConfigurationClassInfo; 10557c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown 106928e054931d357326613c78e62f4d850b7c442ffJeff Brown 107928e054931d357326613c78e62f4d850b7c442ffJeff Brown// --- Global functions --- 108928e054931d357326613c78e62f4d850b7c442ffJeff Brown 109214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Browntemplate<typename T> 110214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Browninline static T min(const T& a, const T& b) { 111214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown return a < b ? a : b; 112214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown} 113214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown 114214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Browntemplate<typename T> 115214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Browninline static T max(const T& a, const T& b) { 116214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown return a > b ? a : b; 117214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown} 118214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown 119928e054931d357326613c78e62f4d850b7c442ffJeff Brownstatic jobject getInputApplicationHandleObjLocalRef(JNIEnv* env, 120928e054931d357326613c78e62f4d850b7c442ffJeff Brown const sp<InputApplicationHandle>& inputApplicationHandle) { 121928e054931d357326613c78e62f4d850b7c442ffJeff Brown if (inputApplicationHandle == NULL) { 122928e054931d357326613c78e62f4d850b7c442ffJeff Brown return NULL; 123928e054931d357326613c78e62f4d850b7c442ffJeff Brown } 124928e054931d357326613c78e62f4d850b7c442ffJeff Brown return static_cast<NativeInputApplicationHandle*>(inputApplicationHandle.get())-> 125928e054931d357326613c78e62f4d850b7c442ffJeff Brown getInputApplicationHandleObjLocalRef(env); 126928e054931d357326613c78e62f4d850b7c442ffJeff Brown} 127928e054931d357326613c78e62f4d850b7c442ffJeff Brown 128928e054931d357326613c78e62f4d850b7c442ffJeff Brownstatic jobject getInputWindowHandleObjLocalRef(JNIEnv* env, 129928e054931d357326613c78e62f4d850b7c442ffJeff Brown const sp<InputWindowHandle>& inputWindowHandle) { 130928e054931d357326613c78e62f4d850b7c442ffJeff Brown if (inputWindowHandle == NULL) { 131928e054931d357326613c78e62f4d850b7c442ffJeff Brown return NULL; 132928e054931d357326613c78e62f4d850b7c442ffJeff Brown } 133928e054931d357326613c78e62f4d850b7c442ffJeff Brown return static_cast<NativeInputWindowHandle*>(inputWindowHandle.get())-> 134928e054931d357326613c78e62f4d850b7c442ffJeff Brown getInputWindowHandleObjLocalRef(env); 135928e054931d357326613c78e62f4d850b7c442ffJeff Brown} 136928e054931d357326613c78e62f4d850b7c442ffJeff Brown 1372352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brownstatic void loadSystemIconAsSprite(JNIEnv* env, jobject contextObj, int32_t style, 1382352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown SpriteIcon* outSpriteIcon) { 1392352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown PointerIcon pointerIcon; 1402352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown status_t status = android_view_PointerIcon_loadSystemIcon(env, 1412352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown contextObj, style, &pointerIcon); 1422352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown if (!status) { 1432352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown pointerIcon.bitmap.copyTo(&outSpriteIcon->bitmap, SkBitmap::kARGB_8888_Config); 1442352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown outSpriteIcon->hotSpotX = pointerIcon.hotSpotX; 1452352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown outSpriteIcon->hotSpotY = pointerIcon.hotSpotY; 1462352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown } 1472352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown} 1482352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown 149905805ad7ce18a386076fff99264f821bbad9f83Jeff Brownenum { 150905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown WM_ACTION_PASS_TO_USER = 1, 151905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown WM_ACTION_POKE_USER_ACTIVITY = 2, 152905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown WM_ACTION_GO_TO_SLEEP = 4, 153905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown}; 154905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown 155928e054931d357326613c78e62f4d850b7c442ffJeff Brown 156928e054931d357326613c78e62f4d850b7c442ffJeff Brown// --- NativeInputManager --- 15783c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown 1589c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brownclass NativeInputManager : public virtual RefBase, 1599c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown public virtual InputReaderPolicyInterface, 1602352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown public virtual InputDispatcherPolicyInterface, 1612352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown public virtual PointerControllerPolicyInterface { 1629c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brownprotected: 1639c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown virtual ~NativeInputManager(); 1649c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 16546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownpublic: 1664532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager(jobject contextObj, jobject serviceObj, const sp<Looper>& looper); 1679c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 1689c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown inline sp<InputManager> getInputManager() const { return mInputManager; } 16946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 170b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown void dump(String8& dump); 171e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown 172bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown void setDisplaySize(int32_t displayId, int32_t width, int32_t height, 173bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown int32_t externalWidth, int32_t externalHeight); 17446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown void setDisplayOrientation(int32_t displayId, int32_t orientation); 17546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 1767fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown status_t registerInputChannel(JNIEnv* env, const sp<InputChannel>& inputChannel, 177928e054931d357326613c78e62f4d850b7c442ffJeff Brown const sp<InputWindowHandle>& inputWindowHandle, bool monitor); 1787fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown status_t unregisterInputChannel(JNIEnv* env, const sp<InputChannel>& inputChannel); 1797fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown 1809302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown void setInputWindows(JNIEnv* env, jobjectArray windowHandleObjArray); 1819302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown void setFocusedApplication(JNIEnv* env, jobject applicationHandleObj); 182349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown void setInputDispatchMode(bool enabled, bool frozen); 18305dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown void setSystemUiVisibility(int32_t visibility); 1841a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown void setPointerSpeed(int32_t speed); 185daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown void setShowTouches(bool enabled); 1866ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown void reloadKeyboardLayouts(); 187349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown 1889c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown /* --- InputReaderPolicyInterface implementation --- */ 1899c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 190214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown virtual void getReaderConfiguration(InputReaderConfiguration* outConfig); 19183c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown virtual sp<PointerControllerInterface> obtainPointerController(int32_t deviceId); 192af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown virtual void notifyInputDevicesChanged(const Vector<InputDeviceInfo>& inputDevices); 1936ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown virtual sp<KeyCharacterMap> getKeyboardLayoutOverlay(const String8& inputDeviceDescriptor); 19446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 1959c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown /* --- InputDispatcherPolicyInterface implementation --- */ 19646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 197e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown virtual void notifySwitch(nsecs_t when, int32_t switchCode, int32_t switchValue, 198e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown uint32_t policyFlags); 1999c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown virtual void notifyConfigurationChanged(nsecs_t when); 200519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown virtual nsecs_t notifyANR(const sp<InputApplicationHandle>& inputApplicationHandle, 201928e054931d357326613c78e62f4d850b7c442ffJeff Brown const sp<InputWindowHandle>& inputWindowHandle); 202928e054931d357326613c78e62f4d850b7c442ffJeff Brown virtual void notifyInputChannelBroken(const sp<InputWindowHandle>& inputWindowHandle); 2030029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown virtual bool filterInputEvent(const InputEvent* inputEvent, uint32_t policyFlags); 204214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown virtual void getDispatcherConfiguration(InputDispatcherConfiguration* outConfig); 205214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown virtual bool isKeyRepeatEnabled(); 2061f2451007c660091b7b090c1ea332f9044515d2dJeff Brown virtual void interceptKeyBeforeQueueing(const KeyEvent* keyEvent, uint32_t& policyFlags); 20756194ebec6212e229f4ccdaa4b187166d20013efJeff Brown virtual void interceptMotionBeforeQueueing(nsecs_t when, uint32_t& policyFlags); 208905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown virtual nsecs_t interceptKeyBeforeDispatching( 209905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown const sp<InputWindowHandle>& inputWindowHandle, 210b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown const KeyEvent* keyEvent, uint32_t policyFlags); 211928e054931d357326613c78e62f4d850b7c442ffJeff Brown virtual bool dispatchUnhandledKey(const sp<InputWindowHandle>& inputWindowHandle, 21249ed71db425c5054e3ad9526496a7e116c89556bJeff Brown const KeyEvent* keyEvent, uint32_t policyFlags, KeyEvent* outFallbackKeyEvent); 21301ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown virtual void pokeUserActivity(nsecs_t eventTime, int32_t eventType); 214b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown virtual bool checkInjectEventsPermissionNonReentrant( 215b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown int32_t injectorPid, int32_t injectorUid); 21646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 2172352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown /* --- PointerControllerPolicyInterface implementation --- */ 2182352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown 2192352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown virtual void loadPointerResources(PointerResources* outResources); 2202352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown 22146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownprivate: 2229c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown sp<InputManager> mInputManager; 22346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 2242352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown jobject mContextObj; 2254532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jobject mServiceObj; 22605dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown sp<Looper> mLooper; 22746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 22883c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown Mutex mLock; 22983c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown struct Locked { 23083c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown // Display size information. 231bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown int32_t displayWidth, displayHeight; // -1 when not initialized 232bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown int32_t displayExternalWidth, displayExternalHeight; // -1 when not initialized 23383c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown int32_t displayOrientation; 23483c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown 23505dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown // System UI visibility. 23605dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown int32_t systemUiVisibility; 23705dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown 2381a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown // Pointer speed. 2391a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown int32_t pointerSpeed; 2401a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown 241474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown // True if pointer gestures are enabled. 242474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown bool pointerGesturesEnabled; 243474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown 244daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown // Show touches feature enable/disable. 245daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown bool showTouches; 246daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown 2475541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown // Sprite controller singleton, created on first use. 2485541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown sp<SpriteController> spriteController; 2495541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown 25083c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown // Pointer controller singleton, created and destroyed as needed. 25183c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown wp<PointerController> pointerController; 25283c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown } mLocked; 25346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 2542352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown void updateInactivityTimeoutLocked(const sp<PointerController>& controller); 25556194ebec6212e229f4ccdaa4b187166d20013efJeff Brown void handleInterceptActions(jint wmActions, nsecs_t when, uint32_t& policyFlags); 2565541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown void ensureSpriteControllerLocked(); 25705dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown 25800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown // Power manager interactions. 2599c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown bool isScreenOn(); 2609c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown bool isScreenBright(); 2619c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 262b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown static bool checkAndClearExceptionFromCallback(JNIEnv* env, const char* methodName); 263a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown 2649c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown static inline JNIEnv* jniEnv() { 26546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown return AndroidRuntime::getJNIEnv(); 26646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 26746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}; 26846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 269928e054931d357326613c78e62f4d850b7c442ffJeff Brown 27046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 2712352b978a3c94cd88f41d0d908f961333fdac1e9Jeff BrownNativeInputManager::NativeInputManager(jobject contextObj, 2724532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jobject serviceObj, const sp<Looper>& looper) : 273214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown mLooper(looper) { 2749c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown JNIEnv* env = jniEnv(); 27546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 2762352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown mContextObj = env->NewGlobalRef(contextObj); 2774532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown mServiceObj = env->NewGlobalRef(serviceObj); 27846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 27983c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown { 28083c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown AutoMutex _l(mLock); 28183c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown mLocked.displayWidth = -1; 28283c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown mLocked.displayHeight = -1; 283bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown mLocked.displayExternalWidth = -1; 284bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown mLocked.displayExternalHeight = -1; 28565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown mLocked.displayOrientation = DISPLAY_ORIENTATION_0; 28605dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown 28705dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown mLocked.systemUiVisibility = ASYSTEM_UI_VISIBILITY_STATUS_BAR_VISIBLE; 2881a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown mLocked.pointerSpeed = 0; 289474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown mLocked.pointerGesturesEnabled = true; 290daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown mLocked.showTouches = false; 29183c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown } 29283c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown 2939c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown sp<EventHub> eventHub = new EventHub(); 2949c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown mInputManager = new InputManager(eventHub, this, this); 2959c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown} 29646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 2979c3cda04d969912bc46184f2b326d1db95e0aba5Jeff BrownNativeInputManager::~NativeInputManager() { 2989c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown JNIEnv* env = jniEnv(); 29946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 3002352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown env->DeleteGlobalRef(mContextObj); 3014532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown env->DeleteGlobalRef(mServiceObj); 3029c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown} 30346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 304b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brownvoid NativeInputManager::dump(String8& dump) { 305b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown mInputManager->getReader()->dump(dump); 306b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown dump.append("\n"); 3076d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown 308b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown mInputManager->getDispatcher()->dump(dump); 309b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown dump.append("\n"); 3109c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown} 31146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 3127fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brownbool NativeInputManager::checkAndClearExceptionFromCallback(JNIEnv* env, const char* methodName) { 3139c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown if (env->ExceptionCheck()) { 3143762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("An exception was thrown by callback '%s'.", methodName); 3159c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown LOGE_EX(env); 3169c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown env->ExceptionClear(); 3179c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown return true; 3189c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown } 3199c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown return false; 3209c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown} 3219c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 322bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brownvoid NativeInputManager::setDisplaySize(int32_t displayId, int32_t width, int32_t height, 323bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown int32_t externalWidth, int32_t externalHeight) { 32465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown bool changed = false; 3259c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown if (displayId == 0) { 32665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown AutoMutex _l(mLock); 3272352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown 32865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown if (mLocked.displayWidth != width || mLocked.displayHeight != height) { 32965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown changed = true; 33065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown mLocked.displayWidth = width; 33165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown mLocked.displayHeight = height; 33283c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown 33365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown sp<PointerController> controller = mLocked.pointerController.promote(); 33465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown if (controller != NULL) { 33565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown controller->setDisplaySize(width, height); 33683c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown } 33765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown } 338bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown 33965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown if (mLocked.displayExternalWidth != externalWidth 34065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown || mLocked.displayExternalHeight != externalHeight) { 34165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown changed = true; 342bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown mLocked.displayExternalWidth = externalWidth; 343bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown mLocked.displayExternalHeight = externalHeight; 34465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown } 34565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown } 34665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown 34765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown if (changed) { 34865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown mInputManager->getReader()->requestRefreshConfiguration( 34965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown InputReaderConfiguration::CHANGE_DISPLAY_INFO); 3509c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown } 3519c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown} 3529c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 3539c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brownvoid NativeInputManager::setDisplayOrientation(int32_t displayId, int32_t orientation) { 35465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown bool changed = false; 3559c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown if (displayId == 0) { 35683c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown AutoMutex _l(mLock); 35783c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown 35883c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown if (mLocked.displayOrientation != orientation) { 35965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown changed = true; 36083c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown mLocked.displayOrientation = orientation; 3619c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 36283c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown sp<PointerController> controller = mLocked.pointerController.promote(); 36383c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown if (controller != NULL) { 36483c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown controller->setDisplayOrientation(orientation); 36583c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown } 36683c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown } 3679c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown } 36865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown 36965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown if (changed) { 37065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown mInputManager->getReader()->requestRefreshConfiguration( 37165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown InputReaderConfiguration::CHANGE_DISPLAY_INFO); 37265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown } 3739c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown} 3749c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 3757fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brownstatus_t NativeInputManager::registerInputChannel(JNIEnv* env, 376928e054931d357326613c78e62f4d850b7c442ffJeff Brown const sp<InputChannel>& inputChannel, 377928e054931d357326613c78e62f4d850b7c442ffJeff Brown const sp<InputWindowHandle>& inputWindowHandle, bool monitor) { 378928e054931d357326613c78e62f4d850b7c442ffJeff Brown return mInputManager->getDispatcher()->registerInputChannel( 379928e054931d357326613c78e62f4d850b7c442ffJeff Brown inputChannel, inputWindowHandle, monitor); 3807fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown} 3817fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown 3827fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brownstatus_t NativeInputManager::unregisterInputChannel(JNIEnv* env, 3837fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown const sp<InputChannel>& inputChannel) { 384b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown return mInputManager->getDispatcher()->unregisterInputChannel(inputChannel); 3857fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown} 3867fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown 387214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brownvoid NativeInputManager::getReaderConfiguration(InputReaderConfiguration* outConfig) { 388214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown JNIEnv* env = jniEnv(); 3899c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 3904532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jint virtualKeyQuietTime = env->CallIntMethod(mServiceObj, 3914532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown gServiceClassInfo.getVirtualKeyQuietTimeMillis); 392214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown if (!checkAndClearExceptionFromCallback(env, "getVirtualKeyQuietTimeMillis")) { 393214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown outConfig->virtualKeyQuietTime = milliseconds_to_nanoseconds(virtualKeyQuietTime); 394fe50892af3b365806a767298dfd8e86447682581Jeff Brown } 3959c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 396214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown outConfig->excludedDeviceNames.clear(); 3974532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jobjectArray excludedDeviceNames = jobjectArray(env->CallObjectMethod(mServiceObj, 3984532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown gServiceClassInfo.getExcludedDeviceNames)); 399214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown if (!checkAndClearExceptionFromCallback(env, "getExcludedDeviceNames") && excludedDeviceNames) { 400214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown jsize length = env->GetArrayLength(excludedDeviceNames); 4019c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown for (jsize i = 0; i < length; i++) { 402214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown jstring item = jstring(env->GetObjectArrayElement(excludedDeviceNames, i)); 4039c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown const char* deviceNameChars = env->GetStringUTFChars(item, NULL); 404214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown outConfig->excludedDeviceNames.add(String8(deviceNameChars)); 4059c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown env->ReleaseStringUTFChars(item, deviceNameChars); 4069c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown env->DeleteLocalRef(item); 4079c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown } 408214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown env->DeleteLocalRef(excludedDeviceNames); 409214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown } 410214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown 4114532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jint hoverTapTimeout = env->CallIntMethod(mServiceObj, 4124532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown gServiceClassInfo.getHoverTapTimeout); 413bb3fcba0caf697f1d238a2cbefdf1efe06eded99Jeff Brown if (!checkAndClearExceptionFromCallback(env, "getHoverTapTimeout")) { 4144532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jint doubleTapTimeout = env->CallIntMethod(mServiceObj, 4154532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown gServiceClassInfo.getDoubleTapTimeout); 416214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown if (!checkAndClearExceptionFromCallback(env, "getDoubleTapTimeout")) { 4174532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jint longPressTimeout = env->CallIntMethod(mServiceObj, 4184532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown gServiceClassInfo.getLongPressTimeout); 419214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown if (!checkAndClearExceptionFromCallback(env, "getLongPressTimeout")) { 420bb3fcba0caf697f1d238a2cbefdf1efe06eded99Jeff Brown outConfig->pointerGestureTapInterval = milliseconds_to_nanoseconds(hoverTapTimeout); 421214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown 422214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown // We must ensure that the tap-drag interval is significantly shorter than 423214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown // the long-press timeout because the tap is held down for the entire duration 424214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown // of the double-tap timeout. 425214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown jint tapDragInterval = max(min(longPressTimeout - 100, 426bb3fcba0caf697f1d238a2cbefdf1efe06eded99Jeff Brown doubleTapTimeout), hoverTapTimeout); 427214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown outConfig->pointerGestureTapDragInterval = 428214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown milliseconds_to_nanoseconds(tapDragInterval); 429214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown } 430214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown } 431214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown } 432214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown 4334532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jint hoverTapSlop = env->CallIntMethod(mServiceObj, 4344532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown gServiceClassInfo.getHoverTapSlop); 435bb3fcba0caf697f1d238a2cbefdf1efe06eded99Jeff Brown if (!checkAndClearExceptionFromCallback(env, "getHoverTapSlop")) { 436bb3fcba0caf697f1d238a2cbefdf1efe06eded99Jeff Brown outConfig->pointerGestureTapSlop = hoverTapSlop; 4379c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown } 4381a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown 4391a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown { // acquire lock 4401a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown AutoMutex _l(mLock); 4411a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown 4421a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown outConfig->pointerVelocityControlParameters.scale = exp2f(mLocked.pointerSpeed 4431a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown * POINTER_SPEED_EXPONENT); 444474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown outConfig->pointerGesturesEnabled = mLocked.pointerGesturesEnabled; 44565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown 446daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown outConfig->showTouches = mLocked.showTouches; 447daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown 44865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown outConfig->setDisplayInfo(0, false /*external*/, 44965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown mLocked.displayWidth, mLocked.displayHeight, mLocked.displayOrientation); 45065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown outConfig->setDisplayInfo(0, true /*external*/, 45165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown mLocked.displayExternalWidth, mLocked.displayExternalHeight, 45265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown mLocked.displayOrientation); 4531a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown } // release lock 4549c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown} 4559c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 45683c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brownsp<PointerControllerInterface> NativeInputManager::obtainPointerController(int32_t deviceId) { 45783c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown AutoMutex _l(mLock); 45883c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown 45983c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown sp<PointerController> controller = mLocked.pointerController.promote(); 46083c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown if (controller == NULL) { 4615541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown ensureSpriteControllerLocked(); 46283c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown 4632352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown controller = new PointerController(this, mLooper, mLocked.spriteController); 46483c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown mLocked.pointerController = controller; 46583c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown 46683c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown controller->setDisplaySize(mLocked.displayWidth, mLocked.displayHeight); 46783c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown controller->setDisplayOrientation(mLocked.displayOrientation); 468b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 4695541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown JNIEnv* env = jniEnv(); 4704532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jobject pointerIconObj = env->CallObjectMethod(mServiceObj, 4714532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown gServiceClassInfo.getPointerIcon); 4722352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown if (!checkAndClearExceptionFromCallback(env, "getPointerIcon")) { 4732352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown PointerIcon pointerIcon; 4742352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown status_t status = android_view_PointerIcon_load(env, pointerIconObj, 4752352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown mContextObj, &pointerIcon); 4762352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown if (!status && !pointerIcon.isNullIcon()) { 4772352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown controller->setPointerIcon(SpriteIcon(pointerIcon.bitmap, 4782352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown pointerIcon.hotSpotX, pointerIcon.hotSpotY)); 4792352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown } else { 4802352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown controller->setPointerIcon(SpriteIcon()); 481b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown } 4822352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown env->DeleteLocalRef(pointerIconObj); 483b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown } 48405dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown 4852352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown updateInactivityTimeoutLocked(controller); 48683c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown } 48783c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown return controller; 48883c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown} 48983c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown 4905541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brownvoid NativeInputManager::ensureSpriteControllerLocked() { 4915541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown if (mLocked.spriteController == NULL) { 4925541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown JNIEnv* env = jniEnv(); 4934532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jint layer = env->CallIntMethod(mServiceObj, gServiceClassInfo.getPointerLayer); 4945541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown if (checkAndClearExceptionFromCallback(env, "getPointerLayer")) { 4955541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown layer = -1; 4965541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown } 4975541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown mLocked.spriteController = new SpriteController(mLooper, layer); 4985541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown } 4995541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown} 5005541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown 501af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brownvoid NativeInputManager::notifyInputDevicesChanged(const Vector<InputDeviceInfo>& inputDevices) { 502af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown JNIEnv* env = jniEnv(); 503af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown 504af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown size_t count = inputDevices.size(); 505af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown jobjectArray inputDevicesObjArray = env->NewObjectArray( 506af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown count, gInputDeviceClassInfo.clazz, NULL); 507af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown if (inputDevicesObjArray) { 508af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown bool error = false; 509af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown for (size_t i = 0; i < count; i++) { 510af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown jobject inputDeviceObj = android_view_InputDevice_create(env, inputDevices.itemAt(i)); 511af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown if (!inputDeviceObj) { 512af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown error = true; 513af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown break; 514af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown } 515af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown 516af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown env->SetObjectArrayElement(inputDevicesObjArray, i, inputDeviceObj); 517af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown env->DeleteLocalRef(inputDeviceObj); 518af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown } 519af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown 520af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown if (!error) { 521af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown env->CallVoidMethod(mServiceObj, gServiceClassInfo.notifyInputDevicesChanged, 522af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown inputDevicesObjArray); 523af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown } 524af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown 525af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown env->DeleteLocalRef(inputDevicesObjArray); 526af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown } 527af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown 528af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown checkAndClearExceptionFromCallback(env, "notifyInputDevicesChanged"); 529af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown} 530af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown 5316ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brownsp<KeyCharacterMap> NativeInputManager::getKeyboardLayoutOverlay( 5326ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown const String8& inputDeviceDescriptor) { 5336ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown JNIEnv* env = jniEnv(); 5346ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown 5356ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown sp<KeyCharacterMap> result; 5366ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown ScopedLocalRef<jstring> descriptorObj(env, env->NewStringUTF(inputDeviceDescriptor.string())); 5376ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown ScopedLocalRef<jobjectArray> arrayObj(env, jobjectArray(env->CallObjectMethod(mServiceObj, 5386ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown gServiceClassInfo.getKeyboardLayoutOverlay, descriptorObj.get()))); 5396ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown if (arrayObj.get()) { 5406ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown ScopedLocalRef<jstring> filenameObj(env, 5416ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown jstring(env->GetObjectArrayElement(arrayObj.get(), 0))); 5426ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown ScopedLocalRef<jstring> contentsObj(env, 5436ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown jstring(env->GetObjectArrayElement(arrayObj.get(), 1))); 5446ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown ScopedUtfChars filenameChars(env, filenameObj.get()); 5456ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown ScopedUtfChars contentsChars(env, contentsObj.get()); 5466ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown 5476ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown KeyCharacterMap::loadContents(String8(filenameChars.c_str()), 5486ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown String8(contentsChars.c_str()), KeyCharacterMap::FORMAT_OVERLAY, &result); 5496ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown } 5506ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown checkAndClearExceptionFromCallback(env, "getKeyboardLayoutOverlay"); 5516ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown return result; 5526ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown} 5536ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown 554e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brownvoid NativeInputManager::notifySwitch(nsecs_t when, int32_t switchCode, 555e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown int32_t switchValue, uint32_t policyFlags) { 556e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown#if DEBUG_INPUT_DISPATCHER_POLICY 5575baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("notifySwitch - when=%lld, switchCode=%d, switchValue=%d, policyFlags=0x%x", 558e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown when, switchCode, switchValue, policyFlags); 559e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown#endif 560e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown 561e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown JNIEnv* env = jniEnv(); 562e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown 563e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown switch (switchCode) { 564e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown case SW_LID: 56527fd3420ac0498ff5086f71023f443966541aa04Jeff Brown // When switch value is set indicates lid is closed. 5664532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown env->CallVoidMethod(mServiceObj, gServiceClassInfo.notifyLidSwitchChanged, 56727fd3420ac0498ff5086f71023f443966541aa04Jeff Brown when, switchValue == 0 /*lidOpen*/); 568e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown checkAndClearExceptionFromCallback(env, "notifyLidSwitchChanged"); 569e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown break; 570e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown } 571e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown} 572e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown 5739c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brownvoid NativeInputManager::notifyConfigurationChanged(nsecs_t when) { 5749c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown#if DEBUG_INPUT_DISPATCHER_POLICY 5755baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("notifyConfigurationChanged - when=%lld", when); 5769c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown#endif 5779c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 5789c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown JNIEnv* env = jniEnv(); 5799c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 5804532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown env->CallVoidMethod(mServiceObj, gServiceClassInfo.notifyConfigurationChanged, when); 5817fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown checkAndClearExceptionFromCallback(env, "notifyConfigurationChanged"); 5829c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown} 5839c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 584519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brownnsecs_t NativeInputManager::notifyANR(const sp<InputApplicationHandle>& inputApplicationHandle, 585928e054931d357326613c78e62f4d850b7c442ffJeff Brown const sp<InputWindowHandle>& inputWindowHandle) { 586b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown#if DEBUG_INPUT_DISPATCHER_POLICY 5875baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("notifyANR"); 588b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown#endif 589b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown 590b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown JNIEnv* env = jniEnv(); 591b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown 592928e054931d357326613c78e62f4d850b7c442ffJeff Brown jobject inputApplicationHandleObj = 593928e054931d357326613c78e62f4d850b7c442ffJeff Brown getInputApplicationHandleObjLocalRef(env, inputApplicationHandle); 594928e054931d357326613c78e62f4d850b7c442ffJeff Brown jobject inputWindowHandleObj = 595928e054931d357326613c78e62f4d850b7c442ffJeff Brown getInputWindowHandleObjLocalRef(env, inputWindowHandle); 596b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown 5974532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jlong newTimeout = env->CallLongMethod(mServiceObj, 5984532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown gServiceClassInfo.notifyANR, inputApplicationHandleObj, inputWindowHandleObj); 599519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown if (checkAndClearExceptionFromCallback(env, "notifyANR")) { 600b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown newTimeout = 0; // abort dispatch 601519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown } else { 602519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown assert(newTimeout >= 0); 603b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown } 604b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown 605928e054931d357326613c78e62f4d850b7c442ffJeff Brown env->DeleteLocalRef(inputWindowHandleObj); 606928e054931d357326613c78e62f4d850b7c442ffJeff Brown env->DeleteLocalRef(inputApplicationHandleObj); 607b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown return newTimeout; 608b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown} 609b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown 610928e054931d357326613c78e62f4d850b7c442ffJeff Brownvoid NativeInputManager::notifyInputChannelBroken(const sp<InputWindowHandle>& inputWindowHandle) { 6119c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown#if DEBUG_INPUT_DISPATCHER_POLICY 6125baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("notifyInputChannelBroken"); 6139c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown#endif 6149c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 6157fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown JNIEnv* env = jniEnv(); 6167fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown 617928e054931d357326613c78e62f4d850b7c442ffJeff Brown jobject inputWindowHandleObj = 618928e054931d357326613c78e62f4d850b7c442ffJeff Brown getInputWindowHandleObjLocalRef(env, inputWindowHandle); 619928e054931d357326613c78e62f4d850b7c442ffJeff Brown if (inputWindowHandleObj) { 6204532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown env->CallVoidMethod(mServiceObj, gServiceClassInfo.notifyInputChannelBroken, 621928e054931d357326613c78e62f4d850b7c442ffJeff Brown inputWindowHandleObj); 6227fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown checkAndClearExceptionFromCallback(env, "notifyInputChannelBroken"); 6237fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown 624928e054931d357326613c78e62f4d850b7c442ffJeff Brown env->DeleteLocalRef(inputWindowHandleObj); 6257fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown } 6269c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown} 6279c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 628214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brownvoid NativeInputManager::getDispatcherConfiguration(InputDispatcherConfiguration* outConfig) { 629214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown JNIEnv* env = jniEnv(); 630a454767b09ecb7d25d00beae0e5a1fdd48605c63Jeff Brown 6314532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jint keyRepeatTimeout = env->CallIntMethod(mServiceObj, 6324532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown gServiceClassInfo.getKeyRepeatTimeout); 633214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown if (!checkAndClearExceptionFromCallback(env, "getKeyRepeatTimeout")) { 634214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown outConfig->keyRepeatTimeout = milliseconds_to_nanoseconds(keyRepeatTimeout); 6359c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown } 6369c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 6374532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jint keyRepeatDelay = env->CallIntMethod(mServiceObj, 6384532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown gServiceClassInfo.getKeyRepeatDelay); 639214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown if (!checkAndClearExceptionFromCallback(env, "getKeyRepeatDelay")) { 640214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown outConfig->keyRepeatDelay = milliseconds_to_nanoseconds(keyRepeatDelay); 641214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown } 642b21fb104cc95fe7e5daf3b3626241e525c39a3f1Jeff Brown} 643b21fb104cc95fe7e5daf3b3626241e525c39a3f1Jeff Brown 644214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brownbool NativeInputManager::isKeyRepeatEnabled() { 645214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown // Only enable automatic key repeating when the screen is on. 646214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown return isScreenOn(); 647ae9fc03bdccda709101291bbcd3beaa5b6daebfcJeff Brown} 648ae9fc03bdccda709101291bbcd3beaa5b6daebfcJeff Brown 6499302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brownvoid NativeInputManager::setInputWindows(JNIEnv* env, jobjectArray windowHandleObjArray) { 6509302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown Vector<sp<InputWindowHandle> > windowHandles; 6519c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 6529302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown if (windowHandleObjArray) { 6539302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown jsize length = env->GetArrayLength(windowHandleObjArray); 6549302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown for (jsize i = 0; i < length; i++) { 6559302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown jobject windowHandleObj = env->GetObjectArrayElement(windowHandleObjArray, i); 6569302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown if (! windowHandleObj) { 6579302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown break; // found null element indicating end of used portion of the array 6589302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown } 659349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown 6609302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown sp<InputWindowHandle> windowHandle = 6619302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown android_server_InputWindowHandle_getHandle(env, windowHandleObj); 6629302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown if (windowHandle != NULL) { 6639302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown windowHandles.push(windowHandle); 664474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown } 6659302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown env->DeleteLocalRef(windowHandleObj); 666e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown } 667b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown } 668349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown 6699302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown mInputManager->getDispatcher()->setInputWindows(windowHandles); 6709302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown 6719302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown // Do this after the dispatcher has updated the window handle state. 6729302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown bool newPointerGesturesEnabled = true; 6739302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown size_t numWindows = windowHandles.size(); 6749302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown for (size_t i = 0; i < numWindows; i++) { 6759302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown const sp<InputWindowHandle>& windowHandle = windowHandles.itemAt(i); 676cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown const InputWindowInfo* windowInfo = windowHandle->getInfo(); 677cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown if (windowInfo && windowInfo->hasFocus && (windowInfo->inputFeatures 678cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown & InputWindowInfo::INPUT_FEATURE_DISABLE_TOUCH_PAD_GESTURES)) { 6799302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown newPointerGesturesEnabled = false; 6809302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown } 6819302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown } 682474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown 683474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown uint32_t changes = 0; 684474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown { // acquire lock 685474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown AutoMutex _l(mLock); 686474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown 687474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown if (mLocked.pointerGesturesEnabled != newPointerGesturesEnabled) { 688474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown mLocked.pointerGesturesEnabled = newPointerGesturesEnabled; 689474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown changes |= InputReaderConfiguration::CHANGE_POINTER_GESTURE_ENABLEMENT; 690474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown } 691474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown } // release lock 692474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown 693474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown if (changes) { 694474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown mInputManager->getReader()->requestRefreshConfiguration(changes); 695474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown } 696349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown} 697349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown 6989302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brownvoid NativeInputManager::setFocusedApplication(JNIEnv* env, jobject applicationHandleObj) { 6999302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown sp<InputApplicationHandle> applicationHandle = 7009302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown android_server_InputApplicationHandle_getHandle(env, applicationHandleObj); 7019302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown mInputManager->getDispatcher()->setFocusedApplication(applicationHandle); 7029c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown} 7039c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 704b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brownvoid NativeInputManager::setInputDispatchMode(bool enabled, bool frozen) { 705b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown mInputManager->getDispatcher()->setInputDispatchMode(enabled, frozen); 706349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown} 707349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown 70805dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brownvoid NativeInputManager::setSystemUiVisibility(int32_t visibility) { 70905dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown AutoMutex _l(mLock); 71005dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown 71105dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown if (mLocked.systemUiVisibility != visibility) { 71205dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown mLocked.systemUiVisibility = visibility; 71305dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown 71405dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown sp<PointerController> controller = mLocked.pointerController.promote(); 71505dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown if (controller != NULL) { 7162352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown updateInactivityTimeoutLocked(controller); 71705dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown } 71805dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown } 71905dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown} 72005dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown 7212352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brownvoid NativeInputManager::updateInactivityTimeoutLocked(const sp<PointerController>& controller) { 72205dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown bool lightsOut = mLocked.systemUiVisibility & ASYSTEM_UI_VISIBILITY_STATUS_BAR_HIDDEN; 7232352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown controller->setInactivityTimeout(lightsOut 7242352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown ? PointerController::INACTIVITY_TIMEOUT_SHORT 7252352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown : PointerController::INACTIVITY_TIMEOUT_NORMAL); 72605dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown} 72705dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown 7281a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brownvoid NativeInputManager::setPointerSpeed(int32_t speed) { 729474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown { // acquire lock 730474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown AutoMutex _l(mLock); 731474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown 732474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown if (mLocked.pointerSpeed == speed) { 733474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown return; 734474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown } 7351a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown 7366215d3ff4b5dfa52a5d8b9a42e343051f31066a5Steve Block ALOGI("Setting pointer speed to %d.", speed); 7371a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown mLocked.pointerSpeed = speed; 738474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown } // release lock 7391a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown 740474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown mInputManager->getReader()->requestRefreshConfiguration( 741474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown InputReaderConfiguration::CHANGE_POINTER_SPEED); 7421a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown} 7431a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown 744daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brownvoid NativeInputManager::setShowTouches(bool enabled) { 745daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown { // acquire lock 746daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown AutoMutex _l(mLock); 747daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown 748daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown if (mLocked.showTouches == enabled) { 749daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown return; 750daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown } 751daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown 7526215d3ff4b5dfa52a5d8b9a42e343051f31066a5Steve Block ALOGI("Setting show touches feature to %s.", enabled ? "enabled" : "disabled"); 753daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown mLocked.showTouches = enabled; 754daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown } // release lock 755daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown 756daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown mInputManager->getReader()->requestRefreshConfiguration( 757daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown InputReaderConfiguration::CHANGE_SHOW_TOUCHES); 758daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown} 759daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown 7606ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brownvoid NativeInputManager::reloadKeyboardLayouts() { 7616ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown mInputManager->getReader()->requestRefreshConfiguration( 7626ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown InputReaderConfiguration::CHANGE_KEYBOARD_LAYOUTS); 7636ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown} 7646ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown 765e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brownbool NativeInputManager::isScreenOn() { 766e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown return android_server_PowerManagerService_isScreenOn(); 767e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown} 768e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown 769e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brownbool NativeInputManager::isScreenBright() { 770e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown return android_server_PowerManagerService_isScreenBright(); 771e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown} 772e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown 7730029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brownbool NativeInputManager::filterInputEvent(const InputEvent* inputEvent, uint32_t policyFlags) { 7740029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown jobject inputEventObj; 7750029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown 7760029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown JNIEnv* env = jniEnv(); 7770029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown switch (inputEvent->getType()) { 7780029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown case AINPUT_EVENT_TYPE_KEY: 7790029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown inputEventObj = android_view_KeyEvent_fromNative(env, 7800029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown static_cast<const KeyEvent*>(inputEvent)); 7810029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown break; 7820029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown case AINPUT_EVENT_TYPE_MOTION: 7830029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown inputEventObj = android_view_MotionEvent_obtainAsCopy(env, 7840029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown static_cast<const MotionEvent*>(inputEvent)); 7850029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown break; 7860029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown default: 7870029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown return true; // dispatch the event normally 7880029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown } 7890029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown 7900029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown if (!inputEventObj) { 7913762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("Failed to obtain input event object for filterInputEvent."); 7920029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown return true; // dispatch the event normally 7930029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown } 7940029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown 7950029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown // The callee is responsible for recycling the event. 7964532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jboolean pass = env->CallBooleanMethod(mServiceObj, gServiceClassInfo.filterInputEvent, 7970029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown inputEventObj, policyFlags); 7980029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown if (checkAndClearExceptionFromCallback(env, "filterInputEvent")) { 7990029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown pass = true; 8000029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown } 8010029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown env->DeleteLocalRef(inputEventObj); 8020029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown return pass; 8030029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown} 8040029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown 8051f2451007c660091b7b090c1ea332f9044515d2dJeff Brownvoid NativeInputManager::interceptKeyBeforeQueueing(const KeyEvent* keyEvent, 8061f2451007c660091b7b090c1ea332f9044515d2dJeff Brown uint32_t& policyFlags) { 8073122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown // Policy: 8083122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown // - Ignore untrusted events and pass them along. 8093122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown // - Ask the window manager what to do with normal events and trusted injected events. 8103122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown // - For normal events wake and brighten the screen if currently off or dim. 8113122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown if ((policyFlags & POLICY_FLAG_TRUSTED)) { 8121f2451007c660091b7b090c1ea332f9044515d2dJeff Brown nsecs_t when = keyEvent->getEventTime(); 8133122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown bool isScreenOn = this->isScreenOn(); 8143122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown bool isScreenBright = this->isScreenBright(); 815e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown 8163122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown JNIEnv* env = jniEnv(); 8171f2451007c660091b7b090c1ea332f9044515d2dJeff Brown jobject keyEventObj = android_view_KeyEvent_fromNative(env, keyEvent); 8181f2451007c660091b7b090c1ea332f9044515d2dJeff Brown jint wmActions; 8191f2451007c660091b7b090c1ea332f9044515d2dJeff Brown if (keyEventObj) { 8204532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown wmActions = env->CallIntMethod(mServiceObj, 8214532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown gServiceClassInfo.interceptKeyBeforeQueueing, 8221f2451007c660091b7b090c1ea332f9044515d2dJeff Brown keyEventObj, policyFlags, isScreenOn); 8231f2451007c660091b7b090c1ea332f9044515d2dJeff Brown if (checkAndClearExceptionFromCallback(env, "interceptKeyBeforeQueueing")) { 8241f2451007c660091b7b090c1ea332f9044515d2dJeff Brown wmActions = 0; 8251f2451007c660091b7b090c1ea332f9044515d2dJeff Brown } 8261f2451007c660091b7b090c1ea332f9044515d2dJeff Brown android_view_KeyEvent_recycle(env, keyEventObj); 8271f2451007c660091b7b090c1ea332f9044515d2dJeff Brown env->DeleteLocalRef(keyEventObj); 8281f2451007c660091b7b090c1ea332f9044515d2dJeff Brown } else { 8293762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("Failed to obtain key event object for interceptKeyBeforeQueueing."); 8303122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown wmActions = 0; 831e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown } 832e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown 8331f2451007c660091b7b090c1ea332f9044515d2dJeff Brown if (!(policyFlags & POLICY_FLAG_INJECTED)) { 8343122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown if (!isScreenOn) { 8353122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown policyFlags |= POLICY_FLAG_WOKE_HERE; 8363122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown } 8373122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown 8383122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown if (!isScreenBright) { 8393122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown policyFlags |= POLICY_FLAG_BRIGHT_HERE; 8403122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown } 841e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown } 842e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown 84356194ebec6212e229f4ccdaa4b187166d20013efJeff Brown handleInterceptActions(wmActions, when, /*byref*/ policyFlags); 8443122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown } else { 845e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown policyFlags |= POLICY_FLAG_PASS_TO_USER; 846e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown } 847e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown} 848e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown 84956194ebec6212e229f4ccdaa4b187166d20013efJeff Brownvoid NativeInputManager::interceptMotionBeforeQueueing(nsecs_t when, uint32_t& policyFlags) { 8503122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown // Policy: 8513122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown // - Ignore untrusted events and pass them along. 8523122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown // - No special filtering for injected events required at this time. 8533122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown // - Filter normal events based on screen state. 8543122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown // - For normal events brighten (but do not wake) the screen if currently dim. 8553122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown if ((policyFlags & POLICY_FLAG_TRUSTED) && !(policyFlags & POLICY_FLAG_INJECTED)) { 8563122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown if (isScreenOn()) { 8573122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown policyFlags |= POLICY_FLAG_PASS_TO_USER; 8583122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown 8593122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown if (!isScreenBright()) { 8603122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown policyFlags |= POLICY_FLAG_BRIGHT_HERE; 8613122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown } 86256194ebec6212e229f4ccdaa4b187166d20013efJeff Brown } else { 86356194ebec6212e229f4ccdaa4b187166d20013efJeff Brown JNIEnv* env = jniEnv(); 8644532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jint wmActions = env->CallIntMethod(mServiceObj, 8654532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown gServiceClassInfo.interceptMotionBeforeQueueingWhenScreenOff, 86656194ebec6212e229f4ccdaa4b187166d20013efJeff Brown policyFlags); 86756194ebec6212e229f4ccdaa4b187166d20013efJeff Brown if (checkAndClearExceptionFromCallback(env, 86856194ebec6212e229f4ccdaa4b187166d20013efJeff Brown "interceptMotionBeforeQueueingWhenScreenOff")) { 86956194ebec6212e229f4ccdaa4b187166d20013efJeff Brown wmActions = 0; 87056194ebec6212e229f4ccdaa4b187166d20013efJeff Brown } 87156194ebec6212e229f4ccdaa4b187166d20013efJeff Brown 87256194ebec6212e229f4ccdaa4b187166d20013efJeff Brown policyFlags |= POLICY_FLAG_WOKE_HERE | POLICY_FLAG_BRIGHT_HERE; 87356194ebec6212e229f4ccdaa4b187166d20013efJeff Brown handleInterceptActions(wmActions, when, /*byref*/ policyFlags); 874e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown } 8753122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown } else { 8763122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown policyFlags |= POLICY_FLAG_PASS_TO_USER; 877e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown } 878e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown} 879e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown 88056194ebec6212e229f4ccdaa4b187166d20013efJeff Brownvoid NativeInputManager::handleInterceptActions(jint wmActions, nsecs_t when, 88156194ebec6212e229f4ccdaa4b187166d20013efJeff Brown uint32_t& policyFlags) { 88256194ebec6212e229f4ccdaa4b187166d20013efJeff Brown if (wmActions & WM_ACTION_GO_TO_SLEEP) { 8839267beb8689e6febe3dd23f2a3025736c50eef01Jeff Brown#if DEBUG_INPUT_DISPATCHER_POLICY 8845baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("handleInterceptActions: Going to sleep."); 88556194ebec6212e229f4ccdaa4b187166d20013efJeff Brown#endif 88656194ebec6212e229f4ccdaa4b187166d20013efJeff Brown android_server_PowerManagerService_goToSleep(when); 88756194ebec6212e229f4ccdaa4b187166d20013efJeff Brown } 88856194ebec6212e229f4ccdaa4b187166d20013efJeff Brown 88956194ebec6212e229f4ccdaa4b187166d20013efJeff Brown if (wmActions & WM_ACTION_POKE_USER_ACTIVITY) { 8909267beb8689e6febe3dd23f2a3025736c50eef01Jeff Brown#if DEBUG_INPUT_DISPATCHER_POLICY 8915baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("handleInterceptActions: Poking user activity."); 89256194ebec6212e229f4ccdaa4b187166d20013efJeff Brown#endif 89356194ebec6212e229f4ccdaa4b187166d20013efJeff Brown android_server_PowerManagerService_userActivity(when, POWER_MANAGER_BUTTON_EVENT); 89456194ebec6212e229f4ccdaa4b187166d20013efJeff Brown } 89556194ebec6212e229f4ccdaa4b187166d20013efJeff Brown 89656194ebec6212e229f4ccdaa4b187166d20013efJeff Brown if (wmActions & WM_ACTION_PASS_TO_USER) { 89756194ebec6212e229f4ccdaa4b187166d20013efJeff Brown policyFlags |= POLICY_FLAG_PASS_TO_USER; 89856194ebec6212e229f4ccdaa4b187166d20013efJeff Brown } else { 8999267beb8689e6febe3dd23f2a3025736c50eef01Jeff Brown#if DEBUG_INPUT_DISPATCHER_POLICY 9005baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("handleInterceptActions: Not passing key to user."); 90156194ebec6212e229f4ccdaa4b187166d20013efJeff Brown#endif 90256194ebec6212e229f4ccdaa4b187166d20013efJeff Brown } 90356194ebec6212e229f4ccdaa4b187166d20013efJeff Brown} 90456194ebec6212e229f4ccdaa4b187166d20013efJeff Brown 905905805ad7ce18a386076fff99264f821bbad9f83Jeff Brownnsecs_t NativeInputManager::interceptKeyBeforeDispatching( 906928e054931d357326613c78e62f4d850b7c442ffJeff Brown const sp<InputWindowHandle>& inputWindowHandle, 907e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown const KeyEvent* keyEvent, uint32_t policyFlags) { 9083122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown // Policy: 9093122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown // - Ignore untrusted events and pass them along. 9103122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown // - Filter normal events and trusted injected events through the window manager policy to 9113122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown // handle the HOME key and the like. 912905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown nsecs_t result = 0; 9133122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown if (policyFlags & POLICY_FLAG_TRUSTED) { 9143122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown JNIEnv* env = jniEnv(); 9153122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown 916928e054931d357326613c78e62f4d850b7c442ffJeff Brown // Note: inputWindowHandle may be null. 917928e054931d357326613c78e62f4d850b7c442ffJeff Brown jobject inputWindowHandleObj = getInputWindowHandleObjLocalRef(env, inputWindowHandle); 9181f2451007c660091b7b090c1ea332f9044515d2dJeff Brown jobject keyEventObj = android_view_KeyEvent_fromNative(env, keyEvent); 9191f2451007c660091b7b090c1ea332f9044515d2dJeff Brown if (keyEventObj) { 9204532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jlong delayMillis = env->CallLongMethod(mServiceObj, 9214532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown gServiceClassInfo.interceptKeyBeforeDispatching, 922928e054931d357326613c78e62f4d850b7c442ffJeff Brown inputWindowHandleObj, keyEventObj, policyFlags); 9231f2451007c660091b7b090c1ea332f9044515d2dJeff Brown bool error = checkAndClearExceptionFromCallback(env, "interceptKeyBeforeDispatching"); 9241f2451007c660091b7b090c1ea332f9044515d2dJeff Brown android_view_KeyEvent_recycle(env, keyEventObj); 9251f2451007c660091b7b090c1ea332f9044515d2dJeff Brown env->DeleteLocalRef(keyEventObj); 926905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown if (!error) { 927905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown if (delayMillis < 0) { 928905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown result = -1; 929905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown } else if (delayMillis > 0) { 930905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown result = milliseconds_to_nanoseconds(delayMillis); 931905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown } 932905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown } 9331f2451007c660091b7b090c1ea332f9044515d2dJeff Brown } else { 9343762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("Failed to obtain key event object for interceptKeyBeforeDispatching."); 9351f2451007c660091b7b090c1ea332f9044515d2dJeff Brown } 936928e054931d357326613c78e62f4d850b7c442ffJeff Brown env->DeleteLocalRef(inputWindowHandleObj); 9373122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown } 9381f2451007c660091b7b090c1ea332f9044515d2dJeff Brown return result; 939d0097871828bb7d5d6eec06cadd92c2e3358849bJeff Brown} 940d0097871828bb7d5d6eec06cadd92c2e3358849bJeff Brown 941928e054931d357326613c78e62f4d850b7c442ffJeff Brownbool NativeInputManager::dispatchUnhandledKey(const sp<InputWindowHandle>& inputWindowHandle, 94249ed71db425c5054e3ad9526496a7e116c89556bJeff Brown const KeyEvent* keyEvent, uint32_t policyFlags, KeyEvent* outFallbackKeyEvent) { 9433915bb845b032dc184dba5e60970b803390ca3edJeff Brown // Policy: 9443915bb845b032dc184dba5e60970b803390ca3edJeff Brown // - Ignore untrusted events and do not perform default handling. 94549ed71db425c5054e3ad9526496a7e116c89556bJeff Brown bool result = false; 9463915bb845b032dc184dba5e60970b803390ca3edJeff Brown if (policyFlags & POLICY_FLAG_TRUSTED) { 9473915bb845b032dc184dba5e60970b803390ca3edJeff Brown JNIEnv* env = jniEnv(); 9483915bb845b032dc184dba5e60970b803390ca3edJeff Brown 949928e054931d357326613c78e62f4d850b7c442ffJeff Brown // Note: inputWindowHandle may be null. 950928e054931d357326613c78e62f4d850b7c442ffJeff Brown jobject inputWindowHandleObj = getInputWindowHandleObjLocalRef(env, inputWindowHandle); 9511f2451007c660091b7b090c1ea332f9044515d2dJeff Brown jobject keyEventObj = android_view_KeyEvent_fromNative(env, keyEvent); 9521f2451007c660091b7b090c1ea332f9044515d2dJeff Brown if (keyEventObj) { 9534532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jobject fallbackKeyEventObj = env->CallObjectMethod(mServiceObj, 9544532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown gServiceClassInfo.dispatchUnhandledKey, 955928e054931d357326613c78e62f4d850b7c442ffJeff Brown inputWindowHandleObj, keyEventObj, policyFlags); 956da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown if (checkAndClearExceptionFromCallback(env, "dispatchUnhandledKey")) { 957da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown fallbackKeyEventObj = NULL; 958da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown } 9591f2451007c660091b7b090c1ea332f9044515d2dJeff Brown android_view_KeyEvent_recycle(env, keyEventObj); 9601f2451007c660091b7b090c1ea332f9044515d2dJeff Brown env->DeleteLocalRef(keyEventObj); 96149ed71db425c5054e3ad9526496a7e116c89556bJeff Brown 96249ed71db425c5054e3ad9526496a7e116c89556bJeff Brown if (fallbackKeyEventObj) { 96349ed71db425c5054e3ad9526496a7e116c89556bJeff Brown // Note: outFallbackKeyEvent may be the same object as keyEvent. 96449ed71db425c5054e3ad9526496a7e116c89556bJeff Brown if (!android_view_KeyEvent_toNative(env, fallbackKeyEventObj, 96549ed71db425c5054e3ad9526496a7e116c89556bJeff Brown outFallbackKeyEvent)) { 96649ed71db425c5054e3ad9526496a7e116c89556bJeff Brown result = true; 96749ed71db425c5054e3ad9526496a7e116c89556bJeff Brown } 96849ed71db425c5054e3ad9526496a7e116c89556bJeff Brown android_view_KeyEvent_recycle(env, fallbackKeyEventObj); 96949ed71db425c5054e3ad9526496a7e116c89556bJeff Brown env->DeleteLocalRef(fallbackKeyEventObj); 97049ed71db425c5054e3ad9526496a7e116c89556bJeff Brown } 9711f2451007c660091b7b090c1ea332f9044515d2dJeff Brown } else { 9723762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("Failed to obtain key event object for dispatchUnhandledKey."); 9731f2451007c660091b7b090c1ea332f9044515d2dJeff Brown } 974928e054931d357326613c78e62f4d850b7c442ffJeff Brown env->DeleteLocalRef(inputWindowHandleObj); 9753915bb845b032dc184dba5e60970b803390ca3edJeff Brown } 9761f2451007c660091b7b090c1ea332f9044515d2dJeff Brown return result; 9773915bb845b032dc184dba5e60970b803390ca3edJeff Brown} 9783915bb845b032dc184dba5e60970b803390ca3edJeff Brown 97901ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brownvoid NativeInputManager::pokeUserActivity(nsecs_t eventTime, int32_t eventType) { 98001ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown android_server_PowerManagerService_userActivity(eventTime, eventType); 9816d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown} 9826d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown 983349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown 984b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brownbool NativeInputManager::checkInjectEventsPermissionNonReentrant( 985b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown int32_t injectorPid, int32_t injectorUid) { 986b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown JNIEnv* env = jniEnv(); 9874532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jboolean result = env->CallBooleanMethod(mServiceObj, 9884532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown gServiceClassInfo.checkInjectEventsPermission, injectorPid, injectorUid); 989da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown if (checkAndClearExceptionFromCallback(env, "checkInjectEventsPermission")) { 990da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown result = false; 991da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown } 992349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown return result; 993349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown} 994349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown 9952352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brownvoid NativeInputManager::loadPointerResources(PointerResources* outResources) { 9962352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown JNIEnv* env = jniEnv(); 9972352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown 9982352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown loadSystemIconAsSprite(env, mContextObj, POINTER_ICON_STYLE_SPOT_HOVER, 9992352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown &outResources->spotHover); 10002352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown loadSystemIconAsSprite(env, mContextObj, POINTER_ICON_STYLE_SPOT_TOUCH, 10012352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown &outResources->spotTouch); 10022352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown loadSystemIconAsSprite(env, mContextObj, POINTER_ICON_STYLE_SPOT_ANCHOR, 10032352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown &outResources->spotAnchor); 10042352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown} 10052352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown 100683c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown 10079c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown// ---------------------------------------------------------------------------- 10089c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 10094532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic jint nativeInit(JNIEnv* env, jclass clazz, 10104532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jobject serviceObj, jobject contextObj, jobject messageQueueObj) { 1011603b44589682db3ff33ade172facb0c5e309f1beJeff Brown sp<MessageQueue> messageQueue = android_os_MessageQueue_getMessageQueue(env, messageQueueObj); 1012603b44589682db3ff33ade172facb0c5e309f1beJeff Brown NativeInputManager* im = new NativeInputManager(contextObj, serviceObj, 1013603b44589682db3ff33ade172facb0c5e309f1beJeff Brown messageQueue->getLooper()); 10144532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown im->incStrong(serviceObj); 10154532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown return reinterpret_cast<jint>(im); 101646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} 101746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 10184532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic void nativeStart(JNIEnv* env, jclass clazz, jint ptr) { 10194532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 102046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 10214532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown status_t result = im->getInputManager()->start(); 102246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown if (result) { 102346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown jniThrowRuntimeException(env, "Input manager could not be started."); 102446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 102546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} 102646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 10274532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic void nativeSetDisplaySize(JNIEnv* env, jclass clazz, jint ptr, 1028bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown jint displayId, jint width, jint height, jint externalWidth, jint externalHeight) { 10294532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 103046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 103146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown // XXX we could get this from the SurfaceFlinger directly instead of requiring it 103246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown // to be passed in like this, not sure which is better but leaving it like this 103346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown // keeps the window manager in direct control of when display transitions propagate down 103446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown // to the input dispatcher 10354532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown im->setDisplaySize(displayId, width, height, externalWidth, externalHeight); 103646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} 103746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 10384532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic void nativeSetDisplayOrientation(JNIEnv* env, jclass clazz, 10394532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jint ptr, jint displayId, jint orientation) { 10404532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 104146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 10424532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown im->setDisplayOrientation(displayId, orientation); 104346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} 104446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 10454532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic jint nativeGetScanCodeState(JNIEnv* env, jclass clazz, 10464532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jint ptr, jint deviceId, jint sourceMask, jint scanCode) { 10474532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 104846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 10494532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown return im->getInputManager()->getReader()->getScanCodeState( 10506d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown deviceId, uint32_t(sourceMask), scanCode); 105146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} 105246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 10534532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic jint nativeGetKeyCodeState(JNIEnv* env, jclass clazz, 10544532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jint ptr, jint deviceId, jint sourceMask, jint keyCode) { 10554532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 105646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 10574532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown return im->getInputManager()->getReader()->getKeyCodeState( 10586d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown deviceId, uint32_t(sourceMask), keyCode); 105946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} 106046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 10614532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic jint nativeGetSwitchState(JNIEnv* env, jclass clazz, 10624532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jint ptr, jint deviceId, jint sourceMask, jint sw) { 10634532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 106446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 10654532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown return im->getInputManager()->getReader()->getSwitchState( 10666d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown deviceId, uint32_t(sourceMask), sw); 106746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} 106846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 10694532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic jboolean nativeHasKeys(JNIEnv* env, jclass clazz, 10704532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jint ptr, jint deviceId, jint sourceMask, jintArray keyCodes, jbooleanArray outFlags) { 10714532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 107246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 107346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown int32_t* codes = env->GetIntArrayElements(keyCodes, NULL); 107446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown uint8_t* flags = env->GetBooleanArrayElements(outFlags, NULL); 107546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown jsize numCodes = env->GetArrayLength(keyCodes); 107646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown jboolean result; 10776d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown if (numCodes == env->GetArrayLength(keyCodes)) { 10784532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown result = im->getInputManager()->getReader()->hasKeys( 10796d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown deviceId, uint32_t(sourceMask), numCodes, codes, flags); 108046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } else { 108146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown result = JNI_FALSE; 108246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 108346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 108446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown env->ReleaseBooleanArrayElements(outFlags, flags, 0); 108546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown env->ReleaseIntArrayElements(keyCodes, codes, 0); 108646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown return result; 108746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} 108846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 108946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownstatic void throwInputChannelNotInitialized(JNIEnv* env) { 109046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown jniThrowException(env, "java/lang/IllegalStateException", 109146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown "inputChannel is not initialized"); 109246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} 109346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 10944532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic void handleInputChannelDisposed(JNIEnv* env, 109546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown jobject inputChannelObj, const sp<InputChannel>& inputChannel, void* data) { 10964532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = static_cast<NativeInputManager*>(data); 10974532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown 10988564c8da817a845353d213acd8636b76f567b234Steve Block ALOGW("Input channel object '%s' was disposed without first being unregistered with " 109946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown "the input manager!", inputChannel->getName().string()); 11004532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown im->unregisterInputChannel(env, inputChannel); 110146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} 110246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 11034532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic void nativeRegisterInputChannel(JNIEnv* env, jclass clazz, 11044532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jint ptr, jobject inputChannelObj, jobject inputWindowHandleObj, jboolean monitor) { 11054532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 110646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 110746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown sp<InputChannel> inputChannel = android_view_InputChannel_getInputChannel(env, 110846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown inputChannelObj); 110946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown if (inputChannel == NULL) { 111046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown throwInputChannelNotInitialized(env); 111146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown return; 111246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 111346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 1114928e054931d357326613c78e62f4d850b7c442ffJeff Brown sp<InputWindowHandle> inputWindowHandle = 1115928e054931d357326613c78e62f4d850b7c442ffJeff Brown android_server_InputWindowHandle_getHandle(env, inputWindowHandleObj); 11167fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown 11174532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown status_t status = im->registerInputChannel( 1118928e054931d357326613c78e62f4d850b7c442ffJeff Brown env, inputChannel, inputWindowHandle, monitor); 111946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown if (status) { 1120cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown String8 message; 1121cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown message.appendFormat("Failed to register input channel. status=%d", status); 1122cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown jniThrowRuntimeException(env, message.string()); 112346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown return; 112446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 112546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 1126a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown if (! monitor) { 1127a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown android_view_InputChannel_setDisposeCallback(env, inputChannelObj, 11284532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown handleInputChannelDisposed, im); 1129a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown } 113046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} 113146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 11324532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic void nativeUnregisterInputChannel(JNIEnv* env, jclass clazz, 11334532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jint ptr, jobject inputChannelObj) { 11344532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 113546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 113646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown sp<InputChannel> inputChannel = android_view_InputChannel_getInputChannel(env, 113746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown inputChannelObj); 113846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown if (inputChannel == NULL) { 113946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown throwInputChannelNotInitialized(env); 114046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown return; 114146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 114246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 114346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown android_view_InputChannel_setDisposeCallback(env, inputChannelObj, NULL, NULL); 114446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 11454532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown status_t status = im->unregisterInputChannel(env, inputChannel); 1146cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown if (status && status != BAD_VALUE) { // ignore already unregistered channel 1147cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown String8 message; 1148cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown message.appendFormat("Failed to unregister input channel. status=%d", status); 1149cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown jniThrowRuntimeException(env, message.string()); 115046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 115146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} 115246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 11534532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic void nativeSetInputFilterEnabled(JNIEnv* env, jclass clazz, 11544532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jint ptr, jboolean enabled) { 11554532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 11560029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown 11574532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown im->getInputManager()->getDispatcher()->setInputFilterEnabled(enabled); 11580029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown} 11590029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown 11604532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic jint nativeInjectInputEvent(JNIEnv* env, jclass clazz, 11614532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jint ptr, jobject inputEventObj, jint injectorPid, jint injectorUid, 11620029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown jint syncMode, jint timeoutMillis, jint policyFlags) { 11634532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 11647fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown 11656ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown if (env->IsInstanceOf(inputEventObj, gKeyEventClassInfo.clazz)) { 11666ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown KeyEvent keyEvent; 11671f2451007c660091b7b090c1ea332f9044515d2dJeff Brown status_t status = android_view_KeyEvent_toNative(env, inputEventObj, & keyEvent); 11681f2451007c660091b7b090c1ea332f9044515d2dJeff Brown if (status) { 11691f2451007c660091b7b090c1ea332f9044515d2dJeff Brown jniThrowRuntimeException(env, "Could not read contents of KeyEvent object."); 11701f2451007c660091b7b090c1ea332f9044515d2dJeff Brown return INPUT_EVENT_INJECTION_FAILED; 11711f2451007c660091b7b090c1ea332f9044515d2dJeff Brown } 11727fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown 11734532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown return im->getInputManager()->getDispatcher()->injectInputEvent( 11740029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown & keyEvent, injectorPid, injectorUid, syncMode, timeoutMillis, 11750029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown uint32_t(policyFlags)); 11766ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown } else if (env->IsInstanceOf(inputEventObj, gMotionEventClassInfo.clazz)) { 11772ed2462aa29c564f5231f317c27b3188da875e52Jeff Brown const MotionEvent* motionEvent = android_view_MotionEvent_getNativePtr(env, inputEventObj); 11782ed2462aa29c564f5231f317c27b3188da875e52Jeff Brown if (!motionEvent) { 11791f2451007c660091b7b090c1ea332f9044515d2dJeff Brown jniThrowRuntimeException(env, "Could not read contents of MotionEvent object."); 11801f2451007c660091b7b090c1ea332f9044515d2dJeff Brown return INPUT_EVENT_INJECTION_FAILED; 11811f2451007c660091b7b090c1ea332f9044515d2dJeff Brown } 11827fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown 11834532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown return im->getInputManager()->getDispatcher()->injectInputEvent( 11840029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown motionEvent, injectorPid, injectorUid, syncMode, timeoutMillis, 11850029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown uint32_t(policyFlags)); 11866ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown } else { 11876ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown jniThrowRuntimeException(env, "Invalid input event type."); 11887fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown return INPUT_EVENT_INJECTION_FAILED; 11897fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown } 11907fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown} 11917fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown 11924532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic void nativeSetInputWindows(JNIEnv* env, jclass clazz, 11934532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jint ptr, jobjectArray windowHandleObjArray) { 11944532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 1195349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown 11964532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown im->setInputWindows(env, windowHandleObjArray); 1197349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown} 1198349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown 11994532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic void nativeSetFocusedApplication(JNIEnv* env, jclass clazz, 12004532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jint ptr, jobject applicationHandleObj) { 12014532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 1202349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown 12034532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown im->setFocusedApplication(env, applicationHandleObj); 1204349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown} 1205349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown 12064532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic void nativeSetInputDispatchMode(JNIEnv* env, 12074532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jclass clazz, jint ptr, jboolean enabled, jboolean frozen) { 12084532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 1209349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown 12104532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown im->setInputDispatchMode(enabled, frozen); 1211349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown} 1212349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown 12134532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic void nativeSetSystemUiVisibility(JNIEnv* env, 12144532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jclass clazz, jint ptr, jint visibility) { 12154532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 121605dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown 12174532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown im->setSystemUiVisibility(visibility); 121805dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown} 121905dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown 12204532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic void nativeGetInputConfiguration(JNIEnv* env, 12214532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jclass clazz, jint ptr, jobject configObj) { 12224532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 122357c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown 122457c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown InputConfiguration config; 12254532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown im->getInputManager()->getReader()->getInputConfiguration(& config); 122657c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown 122757c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown env->SetIntField(configObj, gConfigurationClassInfo.touchscreen, config.touchScreen); 122857c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown env->SetIntField(configObj, gConfigurationClassInfo.keyboard, config.keyboard); 122957c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown env->SetIntField(configObj, gConfigurationClassInfo.navigation, config.navigation); 123057c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown} 123157c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown 12324532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic jboolean nativeTransferTouchFocus(JNIEnv* env, 12334532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jclass clazz, jint ptr, jobject fromChannelObj, jobject toChannelObj) { 12344532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 1235e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown 1236e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown sp<InputChannel> fromChannel = 1237e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown android_view_InputChannel_getInputChannel(env, fromChannelObj); 1238e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown sp<InputChannel> toChannel = 1239e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown android_view_InputChannel_getInputChannel(env, toChannelObj); 1240e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown 1241e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown if (fromChannel == NULL || toChannel == NULL) { 1242e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown return false; 1243e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown } 1244e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown 12454532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown return im->getInputManager()->getDispatcher()-> 1246e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown transferTouchFocus(fromChannel, toChannel); 1247e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown} 1248e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown 12494532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic void nativeSetPointerSpeed(JNIEnv* env, 12504532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jclass clazz, jint ptr, jint speed) { 12514532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 12521a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown 12534532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown im->setPointerSpeed(speed); 12541a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown} 12551a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown 12564532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic void nativeSetShowTouches(JNIEnv* env, 12574532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown jclass clazz, jint ptr, jboolean enabled) { 12584532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 1259daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown 12604532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown im->setShowTouches(enabled); 1261daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown} 1262daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown 1263a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brownstatic void nativeVibrate(JNIEnv* env, 1264a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown jclass clazz, jint ptr, jint deviceId, jlongArray patternObj, 1265a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown jint repeat, jint token) { 1266a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 1267a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown 1268a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown size_t patternSize = env->GetArrayLength(patternObj); 1269a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown if (patternSize > MAX_VIBRATE_PATTERN_SIZE) { 1270a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown ALOGI("Skipped requested vibration because the pattern size is %d " 1271a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown "which is more than the maximum supported size of %d.", 1272a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown patternSize, MAX_VIBRATE_PATTERN_SIZE); 1273a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown return; // limit to reasonable size 1274a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown } 1275a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown 1276a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown jlong* patternMillis = static_cast<jlong*>(env->GetPrimitiveArrayCritical( 1277a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown patternObj, NULL)); 1278a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown nsecs_t pattern[patternSize]; 1279a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown for (size_t i = 0; i < patternSize; i++) { 1280a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown pattern[i] = max(jlong(0), min(patternMillis[i], 1281a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown MAX_VIBRATE_PATTERN_DELAY_NSECS / 1000000LL)) * 1000000LL; 1282a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown } 1283a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown env->ReleasePrimitiveArrayCritical(patternObj, patternMillis, JNI_ABORT); 1284a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown 1285a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown im->getInputManager()->getReader()->vibrate(deviceId, pattern, patternSize, repeat, token); 1286a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown} 1287a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown 1288a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brownstatic void nativeCancelVibrate(JNIEnv* env, 1289a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown jclass clazz, jint ptr, jint deviceId, jint token) { 1290a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 1291a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown 1292a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown im->getInputManager()->getReader()->cancelVibrate(deviceId, token); 1293a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown} 1294a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown 12956ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brownstatic void nativeReloadKeyboardLayouts(JNIEnv* env, 12966ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown jclass clazz, jint ptr) { 12976ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 12986ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown 12996ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown im->reloadKeyboardLayouts(); 13006ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown} 13016ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown 13024532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic jstring nativeDump(JNIEnv* env, jclass clazz, jint ptr) { 13034532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 1304e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown 1305b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown String8 dump; 13064532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown im->dump(dump); 1307e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown return env->NewStringUTF(dump.string()); 1308e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown} 1309e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown 13104532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic void nativeMonitor(JNIEnv* env, jclass clazz, jint ptr) { 13114532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); 131289ef0720ee8e0ac6ae1758faa917e4d6c9606fb4Jeff Brown 13134532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown im->getInputManager()->getReader()->monitor(); 13144532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown im->getInputManager()->getDispatcher()->monitor(); 131589ef0720ee8e0ac6ae1758faa917e4d6c9606fb4Jeff Brown} 131689ef0720ee8e0ac6ae1758faa917e4d6c9606fb4Jeff Brown 13179c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown// ---------------------------------------------------------------------------- 13189c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 131946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownstatic JNINativeMethod gInputManagerMethods[] = { 132046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown /* name, signature, funcPtr */ 13214532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown { "nativeInit", 13224532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown "(Lcom/android/server/input/InputManagerService;Landroid/content/Context;Landroid/os/MessageQueue;)I", 13234532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeInit }, 13244532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown { "nativeStart", "(I)V", 13254532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeStart }, 13264532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown { "nativeSetDisplaySize", "(IIIIII)V", 13274532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeSetDisplaySize }, 13284532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown { "nativeSetDisplayOrientation", "(III)V", 13294532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeSetDisplayOrientation }, 13304532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown { "nativeGetScanCodeState", "(IIII)I", 13314532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeGetScanCodeState }, 13324532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown { "nativeGetKeyCodeState", "(IIII)I", 13334532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeGetKeyCodeState }, 13344532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown { "nativeGetSwitchState", "(IIII)I", 13354532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeGetSwitchState }, 13364532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown { "nativeHasKeys", "(III[I[Z)Z", 13374532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeHasKeys }, 1338928e054931d357326613c78e62f4d850b7c442ffJeff Brown { "nativeRegisterInputChannel", 13394532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown "(ILandroid/view/InputChannel;Lcom/android/server/input/InputWindowHandle;Z)V", 13404532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeRegisterInputChannel }, 13414532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown { "nativeUnregisterInputChannel", "(ILandroid/view/InputChannel;)V", 13424532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeUnregisterInputChannel }, 13434532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown { "nativeSetInputFilterEnabled", "(IZ)V", 13444532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeSetInputFilterEnabled }, 13454532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown { "nativeInjectInputEvent", "(ILandroid/view/InputEvent;IIIII)I", 13464532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeInjectInputEvent }, 13474532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown { "nativeSetInputWindows", "(I[Lcom/android/server/input/InputWindowHandle;)V", 13484532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeSetInputWindows }, 13494532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown { "nativeSetFocusedApplication", "(ILcom/android/server/input/InputApplicationHandle;)V", 13504532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeSetFocusedApplication }, 13514532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown { "nativeSetInputDispatchMode", "(IZZ)V", 13524532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeSetInputDispatchMode }, 13534532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown { "nativeSetSystemUiVisibility", "(II)V", 13544532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeSetSystemUiVisibility }, 13554532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown { "nativeGetInputConfiguration", "(ILandroid/content/res/Configuration;)V", 13564532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeGetInputConfiguration }, 13574532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown { "nativeTransferTouchFocus", "(ILandroid/view/InputChannel;Landroid/view/InputChannel;)Z", 13584532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeTransferTouchFocus }, 13594532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown { "nativeSetPointerSpeed", "(II)V", 13604532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeSetPointerSpeed }, 13614532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown { "nativeSetShowTouches", "(IZ)V", 13624532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeSetShowTouches }, 1363a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown { "nativeVibrate", "(II[JII)V", 1364a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown (void*) nativeVibrate }, 1365a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown { "nativeCancelVibrate", "(III)V", 1366a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown (void*) nativeCancelVibrate }, 13676ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown { "nativeReloadKeyboardLayouts", "(I)V", 13686ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown (void*) nativeReloadKeyboardLayouts }, 13694532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown { "nativeDump", "(I)Ljava/lang/String;", 13704532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeDump }, 13714532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown { "nativeMonitor", "(I)V", 13724532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown (void*) nativeMonitor }, 137346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}; 137446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 137546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#define FIND_CLASS(var, className) \ 137646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown var = env->FindClass(className); \ 137717cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro LOG_FATAL_IF(! var, "Unable to find class " className); 137846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 137946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#define GET_METHOD_ID(var, clazz, methodName, methodDescriptor) \ 138046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown var = env->GetMethodID(clazz, methodName, methodDescriptor); \ 138146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown LOG_FATAL_IF(! var, "Unable to find method " methodName); 138246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 138346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#define GET_FIELD_ID(var, clazz, fieldName, fieldDescriptor) \ 138446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown var = env->GetFieldID(clazz, fieldName, fieldDescriptor); \ 138546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown LOG_FATAL_IF(! var, "Unable to find field " fieldName); 138646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 138746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownint register_android_server_InputManager(JNIEnv* env) { 13884532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown int res = jniRegisterNativeMethods(env, "com/android/server/input/InputManagerService", 138946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown gInputManagerMethods, NELEM(gInputManagerMethods)); 139046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown LOG_FATAL_IF(res < 0, "Unable to register native methods."); 139146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 13929c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown // Callbacks 139346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 139417cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro jclass clazz; 13954532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown FIND_CLASS(clazz, "com/android/server/input/InputManagerService"); 139646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 13974532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown GET_METHOD_ID(gServiceClassInfo.notifyConfigurationChanged, clazz, 139857c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown "notifyConfigurationChanged", "(J)V"); 139946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 1400af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown GET_METHOD_ID(gServiceClassInfo.notifyInputDevicesChanged, clazz, 1401af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown "notifyInputDevicesChanged", "([Landroid/view/InputDevice;)V"); 1402af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown 14034532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown GET_METHOD_ID(gServiceClassInfo.notifyLidSwitchChanged, clazz, 140446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown "notifyLidSwitchChanged", "(JZ)V"); 140546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 14064532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown GET_METHOD_ID(gServiceClassInfo.notifyInputChannelBroken, clazz, 14074532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown "notifyInputChannelBroken", "(Lcom/android/server/input/InputWindowHandle;)V"); 14087fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown 14094532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown GET_METHOD_ID(gServiceClassInfo.notifyANR, clazz, 1410928e054931d357326613c78e62f4d850b7c442ffJeff Brown "notifyANR", 14114532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown "(Lcom/android/server/input/InputApplicationHandle;Lcom/android/server/input/InputWindowHandle;)J"); 1412349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown 14134532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown GET_METHOD_ID(gServiceClassInfo.filterInputEvent, clazz, 14140029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown "filterInputEvent", "(Landroid/view/InputEvent;I)Z"); 14150029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown 14164532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown GET_METHOD_ID(gServiceClassInfo.interceptKeyBeforeQueueing, clazz, 14171f2451007c660091b7b090c1ea332f9044515d2dJeff Brown "interceptKeyBeforeQueueing", "(Landroid/view/KeyEvent;IZ)I"); 1418349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown 14194532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown GET_METHOD_ID(gServiceClassInfo.interceptMotionBeforeQueueingWhenScreenOff, 142017cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro clazz, 142156194ebec6212e229f4ccdaa4b187166d20013efJeff Brown "interceptMotionBeforeQueueingWhenScreenOff", "(I)I"); 142256194ebec6212e229f4ccdaa4b187166d20013efJeff Brown 14234532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown GET_METHOD_ID(gServiceClassInfo.interceptKeyBeforeDispatching, clazz, 14241f2451007c660091b7b090c1ea332f9044515d2dJeff Brown "interceptKeyBeforeDispatching", 14254532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown "(Lcom/android/server/input/InputWindowHandle;Landroid/view/KeyEvent;I)J"); 1426349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown 14274532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown GET_METHOD_ID(gServiceClassInfo.dispatchUnhandledKey, clazz, 142849ed71db425c5054e3ad9526496a7e116c89556bJeff Brown "dispatchUnhandledKey", 14294532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown "(Lcom/android/server/input/InputWindowHandle;Landroid/view/KeyEvent;I)Landroid/view/KeyEvent;"); 14303915bb845b032dc184dba5e60970b803390ca3edJeff Brown 14314532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown GET_METHOD_ID(gServiceClassInfo.checkInjectEventsPermission, clazz, 1432349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown "checkInjectEventsPermission", "(II)Z"); 143346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 14344532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown GET_METHOD_ID(gServiceClassInfo.getVirtualKeyQuietTimeMillis, clazz, 1435fe50892af3b365806a767298dfd8e86447682581Jeff Brown "getVirtualKeyQuietTimeMillis", "()I"); 1436fe50892af3b365806a767298dfd8e86447682581Jeff Brown 14374532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown GET_METHOD_ID(gServiceClassInfo.getExcludedDeviceNames, clazz, 143846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown "getExcludedDeviceNames", "()[Ljava/lang/String;"); 143946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 14404532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown GET_METHOD_ID(gServiceClassInfo.getKeyRepeatTimeout, clazz, 1441a454767b09ecb7d25d00beae0e5a1fdd48605c63Jeff Brown "getKeyRepeatTimeout", "()I"); 1442a454767b09ecb7d25d00beae0e5a1fdd48605c63Jeff Brown 14434532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown GET_METHOD_ID(gServiceClassInfo.getKeyRepeatDelay, clazz, 1444a454767b09ecb7d25d00beae0e5a1fdd48605c63Jeff Brown "getKeyRepeatDelay", "()I"); 1445a454767b09ecb7d25d00beae0e5a1fdd48605c63Jeff Brown 14464532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown GET_METHOD_ID(gServiceClassInfo.getHoverTapTimeout, clazz, 1447bb3fcba0caf697f1d238a2cbefdf1efe06eded99Jeff Brown "getHoverTapTimeout", "()I"); 1448bb3fcba0caf697f1d238a2cbefdf1efe06eded99Jeff Brown 14494532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown GET_METHOD_ID(gServiceClassInfo.getHoverTapSlop, clazz, 1450bb3fcba0caf697f1d238a2cbefdf1efe06eded99Jeff Brown "getHoverTapSlop", "()I"); 1451214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown 14524532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown GET_METHOD_ID(gServiceClassInfo.getDoubleTapTimeout, clazz, 1453214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown "getDoubleTapTimeout", "()I"); 1454214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown 14554532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown GET_METHOD_ID(gServiceClassInfo.getLongPressTimeout, clazz, 1456214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown "getLongPressTimeout", "()I"); 1457214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown 14584532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown GET_METHOD_ID(gServiceClassInfo.getPointerLayer, clazz, 145983c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown "getPointerLayer", "()I"); 146083c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown 14614532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown GET_METHOD_ID(gServiceClassInfo.getPointerIcon, clazz, 14622352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown "getPointerIcon", "()Landroid/view/PointerIcon;"); 1463b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 14646ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown GET_METHOD_ID(gServiceClassInfo.getKeyboardLayoutOverlay, clazz, 14656ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown "getKeyboardLayoutOverlay", "(Ljava/lang/String;)[Ljava/lang/String;"); 14666ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown 1467af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown // InputDevice 1468af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown 1469af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown FIND_CLASS(gInputDeviceClassInfo.clazz, "android/view/InputDevice"); 1470af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown gInputDeviceClassInfo.clazz = jclass(env->NewGlobalRef(gInputDeviceClassInfo.clazz)); 1471af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown 14726ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown // KeyEvent 14736ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown 14746ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown FIND_CLASS(gKeyEventClassInfo.clazz, "android/view/KeyEvent"); 147517cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro gKeyEventClassInfo.clazz = jclass(env->NewGlobalRef(gKeyEventClassInfo.clazz)); 147617cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro 14778d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown // MotionEvent 14786ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown 14796ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown FIND_CLASS(gMotionEventClassInfo.clazz, "android/view/MotionEvent"); 148017cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro gMotionEventClassInfo.clazz = jclass(env->NewGlobalRef(gMotionEventClassInfo.clazz)); 14816ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown 148257c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown // Configuration 148357c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown 148417cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro FIND_CLASS(clazz, "android/content/res/Configuration"); 148557c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown 148617cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro GET_FIELD_ID(gConfigurationClassInfo.touchscreen, clazz, 148757c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown "touchscreen", "I"); 148857c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown 148917cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro GET_FIELD_ID(gConfigurationClassInfo.keyboard, clazz, 149057c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown "keyboard", "I"); 149157c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown 149217cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro GET_FIELD_ID(gConfigurationClassInfo.navigation, clazz, 149357c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown "navigation", "I"); 149457c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown 149546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown return 0; 149646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} 149746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 149846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} /* namespace android */ 1499