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