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