com_android_server_input_InputManagerService.cpp revision 9f25b7fdf216c9ef0bd2322cd223eeaf0d60f77f
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;
629c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    jmethodID notifyLidSwitchChanged;
637fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown    jmethodID notifyInputChannelBroken;
64349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown    jmethodID notifyANR;
650029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown    jmethodID filterInputEvent;
66349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown    jmethodID interceptKeyBeforeQueueing;
6756194ebec6212e229f4ccdaa4b187166d20013efJeff Brown    jmethodID interceptMotionBeforeQueueingWhenScreenOff;
68349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown    jmethodID interceptKeyBeforeDispatching;
693915bb845b032dc184dba5e60970b803390ca3edJeff Brown    jmethodID dispatchUnhandledKey;
70349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown    jmethodID checkInjectEventsPermission;
71fe50892af3b365806a767298dfd8e86447682581Jeff Brown    jmethodID getVirtualKeyQuietTimeMillis;
729c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    jmethodID getExcludedDeviceNames;
73a454767b09ecb7d25d00beae0e5a1fdd48605c63Jeff Brown    jmethodID getKeyRepeatTimeout;
74a454767b09ecb7d25d00beae0e5a1fdd48605c63Jeff Brown    jmethodID getKeyRepeatDelay;
75bb3fcba0caf697f1d238a2cbefdf1efe06eded99Jeff Brown    jmethodID getHoverTapTimeout;
76bb3fcba0caf697f1d238a2cbefdf1efe06eded99Jeff Brown    jmethodID getHoverTapSlop;
77214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    jmethodID getDoubleTapTimeout;
78214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    jmethodID getLongPressTimeout;
7983c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown    jmethodID getPointerLayer;
80b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown    jmethodID getPointerIcon;
814532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown} gServiceClassInfo;
829c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
839c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brownstatic struct {
849c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    jclass clazz;
856ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown} gKeyEventClassInfo;
866ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown
876ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brownstatic struct {
886ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown    jclass clazz;
896ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown} gMotionEventClassInfo;
906ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown
918d60866e2100db70ecf0502c14768a384514d7e9Jeff Brownstatic struct {
9257c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown    jfieldID touchscreen;
9357c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown    jfieldID keyboard;
9457c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown    jfieldID navigation;
9557c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown} gConfigurationClassInfo;
9657c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown
97928e054931d357326613c78e62f4d850b7c442ffJeff Brown
98928e054931d357326613c78e62f4d850b7c442ffJeff Brown// --- Global functions ---
99928e054931d357326613c78e62f4d850b7c442ffJeff Brown
100214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Browntemplate<typename T>
101214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Browninline static T min(const T& a, const T& b) {
102214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    return a < b ? a : b;
103214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown}
104214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown
105214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Browntemplate<typename T>
106214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Browninline static T max(const T& a, const T& b) {
107214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    return a > b ? a : b;
108214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown}
109214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown
110928e054931d357326613c78e62f4d850b7c442ffJeff Brownstatic jobject getInputApplicationHandleObjLocalRef(JNIEnv* env,
111928e054931d357326613c78e62f4d850b7c442ffJeff Brown        const sp<InputApplicationHandle>& inputApplicationHandle) {
112928e054931d357326613c78e62f4d850b7c442ffJeff Brown    if (inputApplicationHandle == NULL) {
113928e054931d357326613c78e62f4d850b7c442ffJeff Brown        return NULL;
114928e054931d357326613c78e62f4d850b7c442ffJeff Brown    }
115928e054931d357326613c78e62f4d850b7c442ffJeff Brown    return static_cast<NativeInputApplicationHandle*>(inputApplicationHandle.get())->
116928e054931d357326613c78e62f4d850b7c442ffJeff Brown            getInputApplicationHandleObjLocalRef(env);
117928e054931d357326613c78e62f4d850b7c442ffJeff Brown}
118928e054931d357326613c78e62f4d850b7c442ffJeff Brown
119928e054931d357326613c78e62f4d850b7c442ffJeff Brownstatic jobject getInputWindowHandleObjLocalRef(JNIEnv* env,
120928e054931d357326613c78e62f4d850b7c442ffJeff Brown        const sp<InputWindowHandle>& inputWindowHandle) {
121928e054931d357326613c78e62f4d850b7c442ffJeff Brown    if (inputWindowHandle == NULL) {
122928e054931d357326613c78e62f4d850b7c442ffJeff Brown        return NULL;
123928e054931d357326613c78e62f4d850b7c442ffJeff Brown    }
124928e054931d357326613c78e62f4d850b7c442ffJeff Brown    return static_cast<NativeInputWindowHandle*>(inputWindowHandle.get())->
125928e054931d357326613c78e62f4d850b7c442ffJeff Brown            getInputWindowHandleObjLocalRef(env);
126928e054931d357326613c78e62f4d850b7c442ffJeff Brown}
127928e054931d357326613c78e62f4d850b7c442ffJeff Brown
1282352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brownstatic void loadSystemIconAsSprite(JNIEnv* env, jobject contextObj, int32_t style,
1292352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown        SpriteIcon* outSpriteIcon) {
1302352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown    PointerIcon pointerIcon;
1312352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown    status_t status = android_view_PointerIcon_loadSystemIcon(env,
1322352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown            contextObj, style, &pointerIcon);
1332352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown    if (!status) {
1342352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown        pointerIcon.bitmap.copyTo(&outSpriteIcon->bitmap, SkBitmap::kARGB_8888_Config);
1352352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown        outSpriteIcon->hotSpotX = pointerIcon.hotSpotX;
1362352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown        outSpriteIcon->hotSpotY = pointerIcon.hotSpotY;
1372352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown    }
1382352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown}
1392352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown
140905805ad7ce18a386076fff99264f821bbad9f83Jeff Brownenum {
141905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown    WM_ACTION_PASS_TO_USER = 1,
142905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown    WM_ACTION_POKE_USER_ACTIVITY = 2,
143905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown    WM_ACTION_GO_TO_SLEEP = 4,
144905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown};
145905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown
146928e054931d357326613c78e62f4d850b7c442ffJeff Brown
147928e054931d357326613c78e62f4d850b7c442ffJeff Brown// --- NativeInputManager ---
14883c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown
1499c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brownclass NativeInputManager : public virtual RefBase,
1509c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    public virtual InputReaderPolicyInterface,
1512352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown    public virtual InputDispatcherPolicyInterface,
1522352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown    public virtual PointerControllerPolicyInterface {
1539c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brownprotected:
1549c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    virtual ~NativeInputManager();
1559c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
15646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownpublic:
1574532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    NativeInputManager(jobject contextObj, jobject serviceObj, const sp<Looper>& looper);
1589c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
1599c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    inline sp<InputManager> getInputManager() const { return mInputManager; }
16046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
161b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    void dump(String8& dump);
162e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown
163bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown    void setDisplaySize(int32_t displayId, int32_t width, int32_t height,
164bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown            int32_t externalWidth, int32_t externalHeight);
16546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    void setDisplayOrientation(int32_t displayId, int32_t orientation);
16646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
1677fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown    status_t registerInputChannel(JNIEnv* env, const sp<InputChannel>& inputChannel,
168928e054931d357326613c78e62f4d850b7c442ffJeff Brown            const sp<InputWindowHandle>& inputWindowHandle, bool monitor);
1697fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown    status_t unregisterInputChannel(JNIEnv* env, const sp<InputChannel>& inputChannel);
1707fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown
1719302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    void setInputWindows(JNIEnv* env, jobjectArray windowHandleObjArray);
1729302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    void setFocusedApplication(JNIEnv* env, jobject applicationHandleObj);
173349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown    void setInputDispatchMode(bool enabled, bool frozen);
17405dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    void setSystemUiVisibility(int32_t visibility);
1751a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown    void setPointerSpeed(int32_t speed);
176daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown    void setShowTouches(bool enabled);
177349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown
1789c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    /* --- InputReaderPolicyInterface implementation --- */
1799c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
180214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    virtual void getReaderConfiguration(InputReaderConfiguration* outConfig);
18183c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown    virtual sp<PointerControllerInterface> obtainPointerController(int32_t deviceId);
18246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
1839c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    /* --- InputDispatcherPolicyInterface implementation --- */
18446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
185e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown    virtual void notifySwitch(nsecs_t when, int32_t switchCode, int32_t switchValue,
186e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown            uint32_t policyFlags);
1879c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    virtual void notifyConfigurationChanged(nsecs_t when);
188519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown    virtual nsecs_t notifyANR(const sp<InputApplicationHandle>& inputApplicationHandle,
189928e054931d357326613c78e62f4d850b7c442ffJeff Brown            const sp<InputWindowHandle>& inputWindowHandle);
190928e054931d357326613c78e62f4d850b7c442ffJeff Brown    virtual void notifyInputChannelBroken(const sp<InputWindowHandle>& inputWindowHandle);
1910029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown    virtual bool filterInputEvent(const InputEvent* inputEvent, uint32_t policyFlags);
192214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    virtual void getDispatcherConfiguration(InputDispatcherConfiguration* outConfig);
193214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    virtual bool isKeyRepeatEnabled();
1941f2451007c660091b7b090c1ea332f9044515d2dJeff Brown    virtual void interceptKeyBeforeQueueing(const KeyEvent* keyEvent, uint32_t& policyFlags);
19556194ebec6212e229f4ccdaa4b187166d20013efJeff Brown    virtual void interceptMotionBeforeQueueing(nsecs_t when, uint32_t& policyFlags);
196905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown    virtual nsecs_t interceptKeyBeforeDispatching(
197905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown            const sp<InputWindowHandle>& inputWindowHandle,
198b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            const KeyEvent* keyEvent, uint32_t policyFlags);
199928e054931d357326613c78e62f4d850b7c442ffJeff Brown    virtual bool dispatchUnhandledKey(const sp<InputWindowHandle>& inputWindowHandle,
20049ed71db425c5054e3ad9526496a7e116c89556bJeff Brown            const KeyEvent* keyEvent, uint32_t policyFlags, KeyEvent* outFallbackKeyEvent);
20101ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    virtual void pokeUserActivity(nsecs_t eventTime, int32_t eventType);
202b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    virtual bool checkInjectEventsPermissionNonReentrant(
203b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            int32_t injectorPid, int32_t injectorUid);
20446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
2052352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown    /* --- PointerControllerPolicyInterface implementation --- */
2062352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown
2072352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown    virtual void loadPointerResources(PointerResources* outResources);
2082352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown
20946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownprivate:
2109c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    sp<InputManager> mInputManager;
21146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
2122352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown    jobject mContextObj;
2134532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    jobject mServiceObj;
21405dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    sp<Looper> mLooper;
21546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
21683c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown    Mutex mLock;
21783c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown    struct Locked {
21883c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown        // Display size information.
219bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown        int32_t displayWidth, displayHeight; // -1 when not initialized
220bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown        int32_t displayExternalWidth, displayExternalHeight; // -1 when not initialized
22183c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown        int32_t displayOrientation;
22283c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown
22305dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown        // System UI visibility.
22405dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown        int32_t systemUiVisibility;
22505dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown
2261a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown        // Pointer speed.
2271a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown        int32_t pointerSpeed;
2281a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown
229474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown        // True if pointer gestures are enabled.
230474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown        bool pointerGesturesEnabled;
231474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown
232daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown        // Show touches feature enable/disable.
233daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown        bool showTouches;
234daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown
2355541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown        // Sprite controller singleton, created on first use.
2365541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown        sp<SpriteController> spriteController;
2375541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown
23883c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown        // Pointer controller singleton, created and destroyed as needed.
23983c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown        wp<PointerController> pointerController;
24083c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown    } mLocked;
24146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
2422352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown    void updateInactivityTimeoutLocked(const sp<PointerController>& controller);
24356194ebec6212e229f4ccdaa4b187166d20013efJeff Brown    void handleInterceptActions(jint wmActions, nsecs_t when, uint32_t& policyFlags);
2445541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown    void ensureSpriteControllerLocked();
24505dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown
24600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown    // Power manager interactions.
2479c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    bool isScreenOn();
2489c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    bool isScreenBright();
2499c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
250b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    static bool checkAndClearExceptionFromCallback(JNIEnv* env, const char* methodName);
251a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown
2529c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    static inline JNIEnv* jniEnv() {
25346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        return AndroidRuntime::getJNIEnv();
25446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    }
25546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown};
25646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
257928e054931d357326613c78e62f4d850b7c442ffJeff Brown
25846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
2592352b978a3c94cd88f41d0d908f961333fdac1e9Jeff BrownNativeInputManager::NativeInputManager(jobject contextObj,
2604532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown        jobject serviceObj, const sp<Looper>& looper) :
261214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown        mLooper(looper) {
2629c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    JNIEnv* env = jniEnv();
26346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
2642352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown    mContextObj = env->NewGlobalRef(contextObj);
2654532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    mServiceObj = env->NewGlobalRef(serviceObj);
26646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
26783c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown    {
26883c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown        AutoMutex _l(mLock);
26983c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown        mLocked.displayWidth = -1;
27083c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown        mLocked.displayHeight = -1;
271bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown        mLocked.displayExternalWidth = -1;
272bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown        mLocked.displayExternalHeight = -1;
27365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown        mLocked.displayOrientation = DISPLAY_ORIENTATION_0;
27405dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown
27505dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown        mLocked.systemUiVisibility = ASYSTEM_UI_VISIBILITY_STATUS_BAR_VISIBLE;
2761a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown        mLocked.pointerSpeed = 0;
277474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown        mLocked.pointerGesturesEnabled = true;
278daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown        mLocked.showTouches = false;
27983c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown    }
28083c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown
2819c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    sp<EventHub> eventHub = new EventHub();
2829c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    mInputManager = new InputManager(eventHub, this, this);
2839c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown}
28446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
2859c3cda04d969912bc46184f2b326d1db95e0aba5Jeff BrownNativeInputManager::~NativeInputManager() {
2869c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    JNIEnv* env = jniEnv();
28746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
2882352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown    env->DeleteGlobalRef(mContextObj);
2894532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    env->DeleteGlobalRef(mServiceObj);
2909c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown}
29146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
292b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brownvoid NativeInputManager::dump(String8& dump) {
293b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    mInputManager->getReader()->dump(dump);
294b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    dump.append("\n");
2956d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
296b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    mInputManager->getDispatcher()->dump(dump);
297b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    dump.append("\n");
2989c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown}
29946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
3007fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brownbool NativeInputManager::checkAndClearExceptionFromCallback(JNIEnv* env, const char* methodName) {
3019c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    if (env->ExceptionCheck()) {
3023762c311729fe9f3af085c14c5c1fb471d994c03Steve Block        ALOGE("An exception was thrown by callback '%s'.", methodName);
3039c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown        LOGE_EX(env);
3049c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown        env->ExceptionClear();
3059c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown        return true;
3069c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    }
3079c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    return false;
3089c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown}
3099c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
310bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brownvoid NativeInputManager::setDisplaySize(int32_t displayId, int32_t width, int32_t height,
311bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown        int32_t externalWidth, int32_t externalHeight) {
31265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    bool changed = false;
3139c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    if (displayId == 0) {
31465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown        AutoMutex _l(mLock);
3152352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown
31665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown        if (mLocked.displayWidth != width || mLocked.displayHeight != height) {
31765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown            changed = true;
31865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown            mLocked.displayWidth = width;
31965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown            mLocked.displayHeight = height;
32083c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown
32165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown            sp<PointerController> controller = mLocked.pointerController.promote();
32265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown            if (controller != NULL) {
32365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown                controller->setDisplaySize(width, height);
32483c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown            }
32565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown        }
326bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown
32765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown        if (mLocked.displayExternalWidth != externalWidth
32865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown                || mLocked.displayExternalHeight != externalHeight) {
32965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown            changed = true;
330bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown            mLocked.displayExternalWidth = externalWidth;
331bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown            mLocked.displayExternalHeight = externalHeight;
33265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown        }
33365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    }
33465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
33565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    if (changed) {
33665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown        mInputManager->getReader()->requestRefreshConfiguration(
33765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown                InputReaderConfiguration::CHANGE_DISPLAY_INFO);
3389c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    }
3399c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown}
3409c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
3419c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brownvoid NativeInputManager::setDisplayOrientation(int32_t displayId, int32_t orientation) {
34265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    bool changed = false;
3439c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    if (displayId == 0) {
34483c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown        AutoMutex _l(mLock);
34583c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown
34683c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown        if (mLocked.displayOrientation != orientation) {
34765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown            changed = true;
34883c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown            mLocked.displayOrientation = orientation;
3499c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
35083c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown            sp<PointerController> controller = mLocked.pointerController.promote();
35183c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown            if (controller != NULL) {
35283c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown                controller->setDisplayOrientation(orientation);
35383c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown            }
35483c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown        }
3559c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    }
35665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
35765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    if (changed) {
35865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown        mInputManager->getReader()->requestRefreshConfiguration(
35965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown                InputReaderConfiguration::CHANGE_DISPLAY_INFO);
36065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    }
3619c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown}
3629c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
3637fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brownstatus_t NativeInputManager::registerInputChannel(JNIEnv* env,
364928e054931d357326613c78e62f4d850b7c442ffJeff Brown        const sp<InputChannel>& inputChannel,
365928e054931d357326613c78e62f4d850b7c442ffJeff Brown        const sp<InputWindowHandle>& inputWindowHandle, bool monitor) {
366928e054931d357326613c78e62f4d850b7c442ffJeff Brown    return mInputManager->getDispatcher()->registerInputChannel(
367928e054931d357326613c78e62f4d850b7c442ffJeff Brown            inputChannel, inputWindowHandle, monitor);
3687fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown}
3697fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown
3707fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brownstatus_t NativeInputManager::unregisterInputChannel(JNIEnv* env,
3717fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown        const sp<InputChannel>& inputChannel) {
372b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    return mInputManager->getDispatcher()->unregisterInputChannel(inputChannel);
3737fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown}
3747fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown
375214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brownvoid NativeInputManager::getReaderConfiguration(InputReaderConfiguration* outConfig) {
376214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    JNIEnv* env = jniEnv();
3779c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
3784532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    jint virtualKeyQuietTime = env->CallIntMethod(mServiceObj,
3794532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown            gServiceClassInfo.getVirtualKeyQuietTimeMillis);
380214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    if (!checkAndClearExceptionFromCallback(env, "getVirtualKeyQuietTimeMillis")) {
381214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown        outConfig->virtualKeyQuietTime = milliseconds_to_nanoseconds(virtualKeyQuietTime);
382fe50892af3b365806a767298dfd8e86447682581Jeff Brown    }
3839c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
384214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    outConfig->excludedDeviceNames.clear();
3854532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    jobjectArray excludedDeviceNames = jobjectArray(env->CallObjectMethod(mServiceObj,
3864532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown            gServiceClassInfo.getExcludedDeviceNames));
387214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    if (!checkAndClearExceptionFromCallback(env, "getExcludedDeviceNames") && excludedDeviceNames) {
388214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown        jsize length = env->GetArrayLength(excludedDeviceNames);
3899c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown        for (jsize i = 0; i < length; i++) {
390214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown            jstring item = jstring(env->GetObjectArrayElement(excludedDeviceNames, i));
3919c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown            const char* deviceNameChars = env->GetStringUTFChars(item, NULL);
392214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown            outConfig->excludedDeviceNames.add(String8(deviceNameChars));
3939c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown            env->ReleaseStringUTFChars(item, deviceNameChars);
3949c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown            env->DeleteLocalRef(item);
3959c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown        }
396214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown        env->DeleteLocalRef(excludedDeviceNames);
397214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    }
398214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown
3994532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    jint hoverTapTimeout = env->CallIntMethod(mServiceObj,
4004532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown            gServiceClassInfo.getHoverTapTimeout);
401bb3fcba0caf697f1d238a2cbefdf1efe06eded99Jeff Brown    if (!checkAndClearExceptionFromCallback(env, "getHoverTapTimeout")) {
4024532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown        jint doubleTapTimeout = env->CallIntMethod(mServiceObj,
4034532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown                gServiceClassInfo.getDoubleTapTimeout);
404214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown        if (!checkAndClearExceptionFromCallback(env, "getDoubleTapTimeout")) {
4054532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown            jint longPressTimeout = env->CallIntMethod(mServiceObj,
4064532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown                    gServiceClassInfo.getLongPressTimeout);
407214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown            if (!checkAndClearExceptionFromCallback(env, "getLongPressTimeout")) {
408bb3fcba0caf697f1d238a2cbefdf1efe06eded99Jeff Brown                outConfig->pointerGestureTapInterval = milliseconds_to_nanoseconds(hoverTapTimeout);
409214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown
410214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown                // We must ensure that the tap-drag interval is significantly shorter than
411214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown                // the long-press timeout because the tap is held down for the entire duration
412214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown                // of the double-tap timeout.
413214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown                jint tapDragInterval = max(min(longPressTimeout - 100,
414bb3fcba0caf697f1d238a2cbefdf1efe06eded99Jeff Brown                        doubleTapTimeout), hoverTapTimeout);
415214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown                outConfig->pointerGestureTapDragInterval =
416214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown                        milliseconds_to_nanoseconds(tapDragInterval);
417214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown            }
418214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown        }
419214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    }
420214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown
4214532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    jint hoverTapSlop = env->CallIntMethod(mServiceObj,
4224532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown            gServiceClassInfo.getHoverTapSlop);
423bb3fcba0caf697f1d238a2cbefdf1efe06eded99Jeff Brown    if (!checkAndClearExceptionFromCallback(env, "getHoverTapSlop")) {
424bb3fcba0caf697f1d238a2cbefdf1efe06eded99Jeff Brown        outConfig->pointerGestureTapSlop = hoverTapSlop;
4259c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    }
4261a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown
4271a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown    { // acquire lock
4281a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown        AutoMutex _l(mLock);
4291a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown
4301a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown        outConfig->pointerVelocityControlParameters.scale = exp2f(mLocked.pointerSpeed
4311a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown                * POINTER_SPEED_EXPONENT);
432474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown        outConfig->pointerGesturesEnabled = mLocked.pointerGesturesEnabled;
43365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
434daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown        outConfig->showTouches = mLocked.showTouches;
435daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown
43665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown        outConfig->setDisplayInfo(0, false /*external*/,
43765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown                mLocked.displayWidth, mLocked.displayHeight, mLocked.displayOrientation);
43865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown        outConfig->setDisplayInfo(0, true /*external*/,
43965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown                mLocked.displayExternalWidth, mLocked.displayExternalHeight,
44065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown                mLocked.displayOrientation);
4411a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown    } // release lock
4429c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown}
4439c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
44483c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brownsp<PointerControllerInterface> NativeInputManager::obtainPointerController(int32_t deviceId) {
44583c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown    AutoMutex _l(mLock);
44683c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown
44783c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown    sp<PointerController> controller = mLocked.pointerController.promote();
44883c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown    if (controller == NULL) {
4495541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown        ensureSpriteControllerLocked();
45083c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown
4512352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown        controller = new PointerController(this, mLooper, mLocked.spriteController);
45283c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown        mLocked.pointerController = controller;
45383c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown
45483c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown        controller->setDisplaySize(mLocked.displayWidth, mLocked.displayHeight);
45583c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown        controller->setDisplayOrientation(mLocked.displayOrientation);
456b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown
4575541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown        JNIEnv* env = jniEnv();
4584532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown        jobject pointerIconObj = env->CallObjectMethod(mServiceObj,
4594532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown                gServiceClassInfo.getPointerIcon);
4602352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown        if (!checkAndClearExceptionFromCallback(env, "getPointerIcon")) {
4612352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown            PointerIcon pointerIcon;
4622352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown            status_t status = android_view_PointerIcon_load(env, pointerIconObj,
4632352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown                    mContextObj, &pointerIcon);
4642352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown            if (!status && !pointerIcon.isNullIcon()) {
4652352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown                controller->setPointerIcon(SpriteIcon(pointerIcon.bitmap,
4662352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown                        pointerIcon.hotSpotX, pointerIcon.hotSpotY));
4672352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown            } else {
4682352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown                controller->setPointerIcon(SpriteIcon());
469b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown            }
4702352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown            env->DeleteLocalRef(pointerIconObj);
471b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown        }
47205dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown
4732352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown        updateInactivityTimeoutLocked(controller);
47483c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown    }
47583c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown    return controller;
47683c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown}
47783c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown
4785541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brownvoid NativeInputManager::ensureSpriteControllerLocked() {
4795541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown    if (mLocked.spriteController == NULL) {
4805541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown        JNIEnv* env = jniEnv();
4814532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown        jint layer = env->CallIntMethod(mServiceObj, gServiceClassInfo.getPointerLayer);
4825541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown        if (checkAndClearExceptionFromCallback(env, "getPointerLayer")) {
4835541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown            layer = -1;
4845541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown        }
4855541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown        mLocked.spriteController = new SpriteController(mLooper, layer);
4865541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown    }
4875541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown}
4885541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown
489e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brownvoid NativeInputManager::notifySwitch(nsecs_t when, int32_t switchCode,
490e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown        int32_t switchValue, uint32_t policyFlags) {
491e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown#if DEBUG_INPUT_DISPATCHER_POLICY
4925baa3a62a97544669fba6d65a11c07f252e654ddSteve Block    ALOGD("notifySwitch - when=%lld, switchCode=%d, switchValue=%d, policyFlags=0x%x",
493e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown            when, switchCode, switchValue, policyFlags);
494e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown#endif
495e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown
496e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown    JNIEnv* env = jniEnv();
497e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown
498e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown    switch (switchCode) {
499e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown    case SW_LID:
50027fd3420ac0498ff5086f71023f443966541aa04Jeff Brown        // When switch value is set indicates lid is closed.
5014532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown        env->CallVoidMethod(mServiceObj, gServiceClassInfo.notifyLidSwitchChanged,
50227fd3420ac0498ff5086f71023f443966541aa04Jeff Brown                when, switchValue == 0 /*lidOpen*/);
503e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown        checkAndClearExceptionFromCallback(env, "notifyLidSwitchChanged");
504e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown        break;
505e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown    }
506e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown}
507e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown
5089c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brownvoid NativeInputManager::notifyConfigurationChanged(nsecs_t when) {
5099c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown#if DEBUG_INPUT_DISPATCHER_POLICY
5105baa3a62a97544669fba6d65a11c07f252e654ddSteve Block    ALOGD("notifyConfigurationChanged - when=%lld", when);
5119c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown#endif
5129c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
5139c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    JNIEnv* env = jniEnv();
5149c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
5154532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    env->CallVoidMethod(mServiceObj, gServiceClassInfo.notifyConfigurationChanged, when);
5167fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown    checkAndClearExceptionFromCallback(env, "notifyConfigurationChanged");
5179c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown}
5189c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
519519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brownnsecs_t NativeInputManager::notifyANR(const sp<InputApplicationHandle>& inputApplicationHandle,
520928e054931d357326613c78e62f4d850b7c442ffJeff Brown        const sp<InputWindowHandle>& inputWindowHandle) {
521b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown#if DEBUG_INPUT_DISPATCHER_POLICY
5225baa3a62a97544669fba6d65a11c07f252e654ddSteve Block    ALOGD("notifyANR");
523b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown#endif
524b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
525b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    JNIEnv* env = jniEnv();
526b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
527928e054931d357326613c78e62f4d850b7c442ffJeff Brown    jobject inputApplicationHandleObj =
528928e054931d357326613c78e62f4d850b7c442ffJeff Brown            getInputApplicationHandleObjLocalRef(env, inputApplicationHandle);
529928e054931d357326613c78e62f4d850b7c442ffJeff Brown    jobject inputWindowHandleObj =
530928e054931d357326613c78e62f4d850b7c442ffJeff Brown            getInputWindowHandleObjLocalRef(env, inputWindowHandle);
531b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
5324532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    jlong newTimeout = env->CallLongMethod(mServiceObj,
5334532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown                gServiceClassInfo.notifyANR, inputApplicationHandleObj, inputWindowHandleObj);
534519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown    if (checkAndClearExceptionFromCallback(env, "notifyANR")) {
535b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        newTimeout = 0; // abort dispatch
536519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown    } else {
537519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown        assert(newTimeout >= 0);
538b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    }
539b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
540928e054931d357326613c78e62f4d850b7c442ffJeff Brown    env->DeleteLocalRef(inputWindowHandleObj);
541928e054931d357326613c78e62f4d850b7c442ffJeff Brown    env->DeleteLocalRef(inputApplicationHandleObj);
542b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    return newTimeout;
543b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
544b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
545928e054931d357326613c78e62f4d850b7c442ffJeff Brownvoid NativeInputManager::notifyInputChannelBroken(const sp<InputWindowHandle>& inputWindowHandle) {
5469c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown#if DEBUG_INPUT_DISPATCHER_POLICY
5475baa3a62a97544669fba6d65a11c07f252e654ddSteve Block    ALOGD("notifyInputChannelBroken");
5489c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown#endif
5499c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
5507fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown    JNIEnv* env = jniEnv();
5517fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown
552928e054931d357326613c78e62f4d850b7c442ffJeff Brown    jobject inputWindowHandleObj =
553928e054931d357326613c78e62f4d850b7c442ffJeff Brown            getInputWindowHandleObjLocalRef(env, inputWindowHandle);
554928e054931d357326613c78e62f4d850b7c442ffJeff Brown    if (inputWindowHandleObj) {
5554532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown        env->CallVoidMethod(mServiceObj, gServiceClassInfo.notifyInputChannelBroken,
556928e054931d357326613c78e62f4d850b7c442ffJeff Brown                inputWindowHandleObj);
5577fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown        checkAndClearExceptionFromCallback(env, "notifyInputChannelBroken");
5587fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown
559928e054931d357326613c78e62f4d850b7c442ffJeff Brown        env->DeleteLocalRef(inputWindowHandleObj);
5607fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown    }
5619c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown}
5629c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
563214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brownvoid NativeInputManager::getDispatcherConfiguration(InputDispatcherConfiguration* outConfig) {
564214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    JNIEnv* env = jniEnv();
565a454767b09ecb7d25d00beae0e5a1fdd48605c63Jeff Brown
5664532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    jint keyRepeatTimeout = env->CallIntMethod(mServiceObj,
5674532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown            gServiceClassInfo.getKeyRepeatTimeout);
568214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    if (!checkAndClearExceptionFromCallback(env, "getKeyRepeatTimeout")) {
569214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown        outConfig->keyRepeatTimeout = milliseconds_to_nanoseconds(keyRepeatTimeout);
5709c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    }
5719c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
5724532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    jint keyRepeatDelay = env->CallIntMethod(mServiceObj,
5734532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown            gServiceClassInfo.getKeyRepeatDelay);
574214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    if (!checkAndClearExceptionFromCallback(env, "getKeyRepeatDelay")) {
575214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown        outConfig->keyRepeatDelay = milliseconds_to_nanoseconds(keyRepeatDelay);
576214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    }
577b21fb104cc95fe7e5daf3b3626241e525c39a3f1Jeff Brown}
578b21fb104cc95fe7e5daf3b3626241e525c39a3f1Jeff Brown
579214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brownbool NativeInputManager::isKeyRepeatEnabled() {
580214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    // Only enable automatic key repeating when the screen is on.
581214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    return isScreenOn();
582ae9fc03bdccda709101291bbcd3beaa5b6daebfcJeff Brown}
583ae9fc03bdccda709101291bbcd3beaa5b6daebfcJeff Brown
5849302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brownvoid NativeInputManager::setInputWindows(JNIEnv* env, jobjectArray windowHandleObjArray) {
5859302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    Vector<sp<InputWindowHandle> > windowHandles;
5869c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
5879302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    if (windowHandleObjArray) {
5889302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        jsize length = env->GetArrayLength(windowHandleObjArray);
5899302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        for (jsize i = 0; i < length; i++) {
5909302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            jobject windowHandleObj = env->GetObjectArrayElement(windowHandleObjArray, i);
5919302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            if (! windowHandleObj) {
5929302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                break; // found null element indicating end of used portion of the array
5939302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            }
594349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown
5959302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            sp<InputWindowHandle> windowHandle =
5969302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                    android_server_InputWindowHandle_getHandle(env, windowHandleObj);
5979302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            if (windowHandle != NULL) {
5989302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                windowHandles.push(windowHandle);
599474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown            }
6009302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            env->DeleteLocalRef(windowHandleObj);
601e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        }
602b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    }
603349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown
6049302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    mInputManager->getDispatcher()->setInputWindows(windowHandles);
6059302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown
6069302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    // Do this after the dispatcher has updated the window handle state.
6079302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    bool newPointerGesturesEnabled = true;
6089302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    size_t numWindows = windowHandles.size();
6099302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    for (size_t i = 0; i < numWindows; i++) {
6109302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        const sp<InputWindowHandle>& windowHandle = windowHandles.itemAt(i);
611cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        const InputWindowInfo* windowInfo = windowHandle->getInfo();
612cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        if (windowInfo && windowInfo->hasFocus && (windowInfo->inputFeatures
613cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                & InputWindowInfo::INPUT_FEATURE_DISABLE_TOUCH_PAD_GESTURES)) {
6149302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            newPointerGesturesEnabled = false;
6159302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        }
6169302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    }
617474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown
618474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown    uint32_t changes = 0;
619474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown    { // acquire lock
620474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown        AutoMutex _l(mLock);
621474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown
622474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown        if (mLocked.pointerGesturesEnabled != newPointerGesturesEnabled) {
623474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown            mLocked.pointerGesturesEnabled = newPointerGesturesEnabled;
624474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown            changes |= InputReaderConfiguration::CHANGE_POINTER_GESTURE_ENABLEMENT;
625474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown        }
626474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown    } // release lock
627474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown
628474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown    if (changes) {
629474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown        mInputManager->getReader()->requestRefreshConfiguration(changes);
630474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown    }
631349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown}
632349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown
6339302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brownvoid NativeInputManager::setFocusedApplication(JNIEnv* env, jobject applicationHandleObj) {
6349302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    sp<InputApplicationHandle> applicationHandle =
6359302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            android_server_InputApplicationHandle_getHandle(env, applicationHandleObj);
6369302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    mInputManager->getDispatcher()->setFocusedApplication(applicationHandle);
6379c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown}
6389c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
639b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brownvoid NativeInputManager::setInputDispatchMode(bool enabled, bool frozen) {
640b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    mInputManager->getDispatcher()->setInputDispatchMode(enabled, frozen);
641349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown}
642349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown
64305dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brownvoid NativeInputManager::setSystemUiVisibility(int32_t visibility) {
64405dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    AutoMutex _l(mLock);
64505dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown
64605dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    if (mLocked.systemUiVisibility != visibility) {
64705dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown        mLocked.systemUiVisibility = visibility;
64805dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown
64905dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown        sp<PointerController> controller = mLocked.pointerController.promote();
65005dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown        if (controller != NULL) {
6512352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown            updateInactivityTimeoutLocked(controller);
65205dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown        }
65305dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    }
65405dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown}
65505dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown
6562352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brownvoid NativeInputManager::updateInactivityTimeoutLocked(const sp<PointerController>& controller) {
65705dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    bool lightsOut = mLocked.systemUiVisibility & ASYSTEM_UI_VISIBILITY_STATUS_BAR_HIDDEN;
6582352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown    controller->setInactivityTimeout(lightsOut
6592352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown            ? PointerController::INACTIVITY_TIMEOUT_SHORT
6602352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown            : PointerController::INACTIVITY_TIMEOUT_NORMAL);
66105dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown}
66205dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown
6631a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brownvoid NativeInputManager::setPointerSpeed(int32_t speed) {
664474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown    { // acquire lock
665474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown        AutoMutex _l(mLock);
666474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown
667474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown        if (mLocked.pointerSpeed == speed) {
668474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown            return;
669474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown        }
6701a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown
6716215d3ff4b5dfa52a5d8b9a42e343051f31066a5Steve Block        ALOGI("Setting pointer speed to %d.", speed);
6721a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown        mLocked.pointerSpeed = speed;
673474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown    } // release lock
6741a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown
675474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown    mInputManager->getReader()->requestRefreshConfiguration(
676474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown            InputReaderConfiguration::CHANGE_POINTER_SPEED);
6771a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown}
6781a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown
679daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brownvoid NativeInputManager::setShowTouches(bool enabled) {
680daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown    { // acquire lock
681daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown        AutoMutex _l(mLock);
682daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown
683daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown        if (mLocked.showTouches == enabled) {
684daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown            return;
685daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown        }
686daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown
6876215d3ff4b5dfa52a5d8b9a42e343051f31066a5Steve Block        ALOGI("Setting show touches feature to %s.", enabled ? "enabled" : "disabled");
688daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown        mLocked.showTouches = enabled;
689daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown    } // release lock
690daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown
691daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown    mInputManager->getReader()->requestRefreshConfiguration(
692daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown            InputReaderConfiguration::CHANGE_SHOW_TOUCHES);
693daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown}
694daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown
695e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brownbool NativeInputManager::isScreenOn() {
696e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown    return android_server_PowerManagerService_isScreenOn();
697e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown}
698e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown
699e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brownbool NativeInputManager::isScreenBright() {
700e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown    return android_server_PowerManagerService_isScreenBright();
701e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown}
702e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown
7030029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brownbool NativeInputManager::filterInputEvent(const InputEvent* inputEvent, uint32_t policyFlags) {
7040029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown    jobject inputEventObj;
7050029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown
7060029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown    JNIEnv* env = jniEnv();
7070029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown    switch (inputEvent->getType()) {
7080029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown    case AINPUT_EVENT_TYPE_KEY:
7090029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown        inputEventObj = android_view_KeyEvent_fromNative(env,
7100029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown                static_cast<const KeyEvent*>(inputEvent));
7110029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown        break;
7120029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown    case AINPUT_EVENT_TYPE_MOTION:
7130029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown        inputEventObj = android_view_MotionEvent_obtainAsCopy(env,
7140029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown                static_cast<const MotionEvent*>(inputEvent));
7150029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown        break;
7160029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown    default:
7170029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown        return true; // dispatch the event normally
7180029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown    }
7190029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown
7200029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown    if (!inputEventObj) {
7213762c311729fe9f3af085c14c5c1fb471d994c03Steve Block        ALOGE("Failed to obtain input event object for filterInputEvent.");
7220029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown        return true; // dispatch the event normally
7230029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown    }
7240029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown
7250029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown    // The callee is responsible for recycling the event.
7264532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    jboolean pass = env->CallBooleanMethod(mServiceObj, gServiceClassInfo.filterInputEvent,
7270029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown            inputEventObj, policyFlags);
7280029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown    if (checkAndClearExceptionFromCallback(env, "filterInputEvent")) {
7290029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown        pass = true;
7300029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown    }
7310029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown    env->DeleteLocalRef(inputEventObj);
7320029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown    return pass;
7330029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown}
7340029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown
7351f2451007c660091b7b090c1ea332f9044515d2dJeff Brownvoid NativeInputManager::interceptKeyBeforeQueueing(const KeyEvent* keyEvent,
7361f2451007c660091b7b090c1ea332f9044515d2dJeff Brown        uint32_t& policyFlags) {
7373122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown    // Policy:
7383122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown    // - Ignore untrusted events and pass them along.
7393122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown    // - Ask the window manager what to do with normal events and trusted injected events.
7403122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown    // - For normal events wake and brighten the screen if currently off or dim.
7413122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown    if ((policyFlags & POLICY_FLAG_TRUSTED)) {
7421f2451007c660091b7b090c1ea332f9044515d2dJeff Brown        nsecs_t when = keyEvent->getEventTime();
7433122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown        bool isScreenOn = this->isScreenOn();
7443122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown        bool isScreenBright = this->isScreenBright();
745e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown
7463122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown        JNIEnv* env = jniEnv();
7471f2451007c660091b7b090c1ea332f9044515d2dJeff Brown        jobject keyEventObj = android_view_KeyEvent_fromNative(env, keyEvent);
7481f2451007c660091b7b090c1ea332f9044515d2dJeff Brown        jint wmActions;
7491f2451007c660091b7b090c1ea332f9044515d2dJeff Brown        if (keyEventObj) {
7504532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown            wmActions = env->CallIntMethod(mServiceObj,
7514532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown                    gServiceClassInfo.interceptKeyBeforeQueueing,
7521f2451007c660091b7b090c1ea332f9044515d2dJeff Brown                    keyEventObj, policyFlags, isScreenOn);
7531f2451007c660091b7b090c1ea332f9044515d2dJeff Brown            if (checkAndClearExceptionFromCallback(env, "interceptKeyBeforeQueueing")) {
7541f2451007c660091b7b090c1ea332f9044515d2dJeff Brown                wmActions = 0;
7551f2451007c660091b7b090c1ea332f9044515d2dJeff Brown            }
7561f2451007c660091b7b090c1ea332f9044515d2dJeff Brown            android_view_KeyEvent_recycle(env, keyEventObj);
7571f2451007c660091b7b090c1ea332f9044515d2dJeff Brown            env->DeleteLocalRef(keyEventObj);
7581f2451007c660091b7b090c1ea332f9044515d2dJeff Brown        } else {
7593762c311729fe9f3af085c14c5c1fb471d994c03Steve Block            ALOGE("Failed to obtain key event object for interceptKeyBeforeQueueing.");
7603122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown            wmActions = 0;
761e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown        }
762e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown
7631f2451007c660091b7b090c1ea332f9044515d2dJeff Brown        if (!(policyFlags & POLICY_FLAG_INJECTED)) {
7643122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown            if (!isScreenOn) {
7653122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown                policyFlags |= POLICY_FLAG_WOKE_HERE;
7663122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown            }
7673122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown
7683122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown            if (!isScreenBright) {
7693122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown                policyFlags |= POLICY_FLAG_BRIGHT_HERE;
7703122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown            }
771e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown        }
772e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown
77356194ebec6212e229f4ccdaa4b187166d20013efJeff Brown        handleInterceptActions(wmActions, when, /*byref*/ policyFlags);
7743122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown    } else {
775e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown        policyFlags |= POLICY_FLAG_PASS_TO_USER;
776e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown    }
777e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown}
778e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown
77956194ebec6212e229f4ccdaa4b187166d20013efJeff Brownvoid NativeInputManager::interceptMotionBeforeQueueing(nsecs_t when, uint32_t& policyFlags) {
7803122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown    // Policy:
7813122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown    // - Ignore untrusted events and pass them along.
7823122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown    // - No special filtering for injected events required at this time.
7833122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown    // - Filter normal events based on screen state.
7843122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown    // - For normal events brighten (but do not wake) the screen if currently dim.
7853122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown    if ((policyFlags & POLICY_FLAG_TRUSTED) && !(policyFlags & POLICY_FLAG_INJECTED)) {
7863122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown        if (isScreenOn()) {
7873122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown            policyFlags |= POLICY_FLAG_PASS_TO_USER;
7883122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown
7893122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown            if (!isScreenBright()) {
7903122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown                policyFlags |= POLICY_FLAG_BRIGHT_HERE;
7913122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown            }
79256194ebec6212e229f4ccdaa4b187166d20013efJeff Brown        } else {
79356194ebec6212e229f4ccdaa4b187166d20013efJeff Brown            JNIEnv* env = jniEnv();
7944532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown            jint wmActions = env->CallIntMethod(mServiceObj,
7954532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown                        gServiceClassInfo.interceptMotionBeforeQueueingWhenScreenOff,
79656194ebec6212e229f4ccdaa4b187166d20013efJeff Brown                        policyFlags);
79756194ebec6212e229f4ccdaa4b187166d20013efJeff Brown            if (checkAndClearExceptionFromCallback(env,
79856194ebec6212e229f4ccdaa4b187166d20013efJeff Brown                    "interceptMotionBeforeQueueingWhenScreenOff")) {
79956194ebec6212e229f4ccdaa4b187166d20013efJeff Brown                wmActions = 0;
80056194ebec6212e229f4ccdaa4b187166d20013efJeff Brown            }
80156194ebec6212e229f4ccdaa4b187166d20013efJeff Brown
80256194ebec6212e229f4ccdaa4b187166d20013efJeff Brown            policyFlags |= POLICY_FLAG_WOKE_HERE | POLICY_FLAG_BRIGHT_HERE;
80356194ebec6212e229f4ccdaa4b187166d20013efJeff Brown            handleInterceptActions(wmActions, when, /*byref*/ policyFlags);
804e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown        }
8053122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown    } else {
8063122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown        policyFlags |= POLICY_FLAG_PASS_TO_USER;
807e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown    }
808e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown}
809e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown
81056194ebec6212e229f4ccdaa4b187166d20013efJeff Brownvoid NativeInputManager::handleInterceptActions(jint wmActions, nsecs_t when,
81156194ebec6212e229f4ccdaa4b187166d20013efJeff Brown        uint32_t& policyFlags) {
81256194ebec6212e229f4ccdaa4b187166d20013efJeff Brown    if (wmActions & WM_ACTION_GO_TO_SLEEP) {
8139267beb8689e6febe3dd23f2a3025736c50eef01Jeff Brown#if DEBUG_INPUT_DISPATCHER_POLICY
8145baa3a62a97544669fba6d65a11c07f252e654ddSteve Block        ALOGD("handleInterceptActions: Going to sleep.");
81556194ebec6212e229f4ccdaa4b187166d20013efJeff Brown#endif
81656194ebec6212e229f4ccdaa4b187166d20013efJeff Brown        android_server_PowerManagerService_goToSleep(when);
81756194ebec6212e229f4ccdaa4b187166d20013efJeff Brown    }
81856194ebec6212e229f4ccdaa4b187166d20013efJeff Brown
81956194ebec6212e229f4ccdaa4b187166d20013efJeff Brown    if (wmActions & WM_ACTION_POKE_USER_ACTIVITY) {
8209267beb8689e6febe3dd23f2a3025736c50eef01Jeff Brown#if DEBUG_INPUT_DISPATCHER_POLICY
8215baa3a62a97544669fba6d65a11c07f252e654ddSteve Block        ALOGD("handleInterceptActions: Poking user activity.");
82256194ebec6212e229f4ccdaa4b187166d20013efJeff Brown#endif
82356194ebec6212e229f4ccdaa4b187166d20013efJeff Brown        android_server_PowerManagerService_userActivity(when, POWER_MANAGER_BUTTON_EVENT);
82456194ebec6212e229f4ccdaa4b187166d20013efJeff Brown    }
82556194ebec6212e229f4ccdaa4b187166d20013efJeff Brown
82656194ebec6212e229f4ccdaa4b187166d20013efJeff Brown    if (wmActions & WM_ACTION_PASS_TO_USER) {
82756194ebec6212e229f4ccdaa4b187166d20013efJeff Brown        policyFlags |= POLICY_FLAG_PASS_TO_USER;
82856194ebec6212e229f4ccdaa4b187166d20013efJeff Brown    } else {
8299267beb8689e6febe3dd23f2a3025736c50eef01Jeff Brown#if DEBUG_INPUT_DISPATCHER_POLICY
8305baa3a62a97544669fba6d65a11c07f252e654ddSteve Block        ALOGD("handleInterceptActions: Not passing key to user.");
83156194ebec6212e229f4ccdaa4b187166d20013efJeff Brown#endif
83256194ebec6212e229f4ccdaa4b187166d20013efJeff Brown    }
83356194ebec6212e229f4ccdaa4b187166d20013efJeff Brown}
83456194ebec6212e229f4ccdaa4b187166d20013efJeff Brown
835905805ad7ce18a386076fff99264f821bbad9f83Jeff Brownnsecs_t NativeInputManager::interceptKeyBeforeDispatching(
836928e054931d357326613c78e62f4d850b7c442ffJeff Brown        const sp<InputWindowHandle>& inputWindowHandle,
837e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown        const KeyEvent* keyEvent, uint32_t policyFlags) {
8383122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown    // Policy:
8393122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown    // - Ignore untrusted events and pass them along.
8403122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown    // - Filter normal events and trusted injected events through the window manager policy to
8413122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown    //   handle the HOME key and the like.
842905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown    nsecs_t result = 0;
8433122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown    if (policyFlags & POLICY_FLAG_TRUSTED) {
8443122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown        JNIEnv* env = jniEnv();
8453122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown
846928e054931d357326613c78e62f4d850b7c442ffJeff Brown        // Note: inputWindowHandle may be null.
847928e054931d357326613c78e62f4d850b7c442ffJeff Brown        jobject inputWindowHandleObj = getInputWindowHandleObjLocalRef(env, inputWindowHandle);
8481f2451007c660091b7b090c1ea332f9044515d2dJeff Brown        jobject keyEventObj = android_view_KeyEvent_fromNative(env, keyEvent);
8491f2451007c660091b7b090c1ea332f9044515d2dJeff Brown        if (keyEventObj) {
8504532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown            jlong delayMillis = env->CallLongMethod(mServiceObj,
8514532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown                    gServiceClassInfo.interceptKeyBeforeDispatching,
852928e054931d357326613c78e62f4d850b7c442ffJeff Brown                    inputWindowHandleObj, keyEventObj, policyFlags);
8531f2451007c660091b7b090c1ea332f9044515d2dJeff Brown            bool error = checkAndClearExceptionFromCallback(env, "interceptKeyBeforeDispatching");
8541f2451007c660091b7b090c1ea332f9044515d2dJeff Brown            android_view_KeyEvent_recycle(env, keyEventObj);
8551f2451007c660091b7b090c1ea332f9044515d2dJeff Brown            env->DeleteLocalRef(keyEventObj);
856905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown            if (!error) {
857905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown                if (delayMillis < 0) {
858905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown                    result = -1;
859905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown                } else if (delayMillis > 0) {
860905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown                    result = milliseconds_to_nanoseconds(delayMillis);
861905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown                }
862905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown            }
8631f2451007c660091b7b090c1ea332f9044515d2dJeff Brown        } else {
8643762c311729fe9f3af085c14c5c1fb471d994c03Steve Block            ALOGE("Failed to obtain key event object for interceptKeyBeforeDispatching.");
8651f2451007c660091b7b090c1ea332f9044515d2dJeff Brown        }
866928e054931d357326613c78e62f4d850b7c442ffJeff Brown        env->DeleteLocalRef(inputWindowHandleObj);
8673122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown    }
8681f2451007c660091b7b090c1ea332f9044515d2dJeff Brown    return result;
869d0097871828bb7d5d6eec06cadd92c2e3358849bJeff Brown}
870d0097871828bb7d5d6eec06cadd92c2e3358849bJeff Brown
871928e054931d357326613c78e62f4d850b7c442ffJeff Brownbool NativeInputManager::dispatchUnhandledKey(const sp<InputWindowHandle>& inputWindowHandle,
87249ed71db425c5054e3ad9526496a7e116c89556bJeff Brown        const KeyEvent* keyEvent, uint32_t policyFlags, KeyEvent* outFallbackKeyEvent) {
8733915bb845b032dc184dba5e60970b803390ca3edJeff Brown    // Policy:
8743915bb845b032dc184dba5e60970b803390ca3edJeff Brown    // - Ignore untrusted events and do not perform default handling.
87549ed71db425c5054e3ad9526496a7e116c89556bJeff Brown    bool result = false;
8763915bb845b032dc184dba5e60970b803390ca3edJeff Brown    if (policyFlags & POLICY_FLAG_TRUSTED) {
8773915bb845b032dc184dba5e60970b803390ca3edJeff Brown        JNIEnv* env = jniEnv();
8783915bb845b032dc184dba5e60970b803390ca3edJeff Brown
879928e054931d357326613c78e62f4d850b7c442ffJeff Brown        // Note: inputWindowHandle may be null.
880928e054931d357326613c78e62f4d850b7c442ffJeff Brown        jobject inputWindowHandleObj = getInputWindowHandleObjLocalRef(env, inputWindowHandle);
8811f2451007c660091b7b090c1ea332f9044515d2dJeff Brown        jobject keyEventObj = android_view_KeyEvent_fromNative(env, keyEvent);
8821f2451007c660091b7b090c1ea332f9044515d2dJeff Brown        if (keyEventObj) {
8834532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown            jobject fallbackKeyEventObj = env->CallObjectMethod(mServiceObj,
8844532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown                    gServiceClassInfo.dispatchUnhandledKey,
885928e054931d357326613c78e62f4d850b7c442ffJeff Brown                    inputWindowHandleObj, keyEventObj, policyFlags);
886da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown            if (checkAndClearExceptionFromCallback(env, "dispatchUnhandledKey")) {
887da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown                fallbackKeyEventObj = NULL;
888da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown            }
8891f2451007c660091b7b090c1ea332f9044515d2dJeff Brown            android_view_KeyEvent_recycle(env, keyEventObj);
8901f2451007c660091b7b090c1ea332f9044515d2dJeff Brown            env->DeleteLocalRef(keyEventObj);
89149ed71db425c5054e3ad9526496a7e116c89556bJeff Brown
89249ed71db425c5054e3ad9526496a7e116c89556bJeff Brown            if (fallbackKeyEventObj) {
89349ed71db425c5054e3ad9526496a7e116c89556bJeff Brown                // Note: outFallbackKeyEvent may be the same object as keyEvent.
89449ed71db425c5054e3ad9526496a7e116c89556bJeff Brown                if (!android_view_KeyEvent_toNative(env, fallbackKeyEventObj,
89549ed71db425c5054e3ad9526496a7e116c89556bJeff Brown                        outFallbackKeyEvent)) {
89649ed71db425c5054e3ad9526496a7e116c89556bJeff Brown                    result = true;
89749ed71db425c5054e3ad9526496a7e116c89556bJeff Brown                }
89849ed71db425c5054e3ad9526496a7e116c89556bJeff Brown                android_view_KeyEvent_recycle(env, fallbackKeyEventObj);
89949ed71db425c5054e3ad9526496a7e116c89556bJeff Brown                env->DeleteLocalRef(fallbackKeyEventObj);
90049ed71db425c5054e3ad9526496a7e116c89556bJeff Brown            }
9011f2451007c660091b7b090c1ea332f9044515d2dJeff Brown        } else {
9023762c311729fe9f3af085c14c5c1fb471d994c03Steve Block            ALOGE("Failed to obtain key event object for dispatchUnhandledKey.");
9031f2451007c660091b7b090c1ea332f9044515d2dJeff Brown        }
904928e054931d357326613c78e62f4d850b7c442ffJeff Brown        env->DeleteLocalRef(inputWindowHandleObj);
9053915bb845b032dc184dba5e60970b803390ca3edJeff Brown    }
9061f2451007c660091b7b090c1ea332f9044515d2dJeff Brown    return result;
9073915bb845b032dc184dba5e60970b803390ca3edJeff Brown}
9083915bb845b032dc184dba5e60970b803390ca3edJeff Brown
90901ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brownvoid NativeInputManager::pokeUserActivity(nsecs_t eventTime, int32_t eventType) {
91001ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    android_server_PowerManagerService_userActivity(eventTime, eventType);
9116d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown}
9126d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
913349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown
914b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brownbool NativeInputManager::checkInjectEventsPermissionNonReentrant(
915b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        int32_t injectorPid, int32_t injectorUid) {
916b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    JNIEnv* env = jniEnv();
9174532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    jboolean result = env->CallBooleanMethod(mServiceObj,
9184532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown            gServiceClassInfo.checkInjectEventsPermission, injectorPid, injectorUid);
919da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown    if (checkAndClearExceptionFromCallback(env, "checkInjectEventsPermission")) {
920da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown        result = false;
921da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown    }
922349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown    return result;
923349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown}
924349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown
9252352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brownvoid NativeInputManager::loadPointerResources(PointerResources* outResources) {
9262352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown    JNIEnv* env = jniEnv();
9272352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown
9282352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown    loadSystemIconAsSprite(env, mContextObj, POINTER_ICON_STYLE_SPOT_HOVER,
9292352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown            &outResources->spotHover);
9302352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown    loadSystemIconAsSprite(env, mContextObj, POINTER_ICON_STYLE_SPOT_TOUCH,
9312352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown            &outResources->spotTouch);
9322352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown    loadSystemIconAsSprite(env, mContextObj, POINTER_ICON_STYLE_SPOT_ANCHOR,
9332352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown            &outResources->spotAnchor);
9342352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown}
9352352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown
93683c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown
9379c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown// ----------------------------------------------------------------------------
9389c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
9394532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic jint nativeInit(JNIEnv* env, jclass clazz,
9404532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown        jobject serviceObj, jobject contextObj, jobject messageQueueObj) {
941603b44589682db3ff33ade172facb0c5e309f1beJeff Brown    sp<MessageQueue> messageQueue = android_os_MessageQueue_getMessageQueue(env, messageQueueObj);
942603b44589682db3ff33ade172facb0c5e309f1beJeff Brown    NativeInputManager* im = new NativeInputManager(contextObj, serviceObj,
943603b44589682db3ff33ade172facb0c5e309f1beJeff Brown            messageQueue->getLooper());
9444532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    im->incStrong(serviceObj);
9454532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    return reinterpret_cast<jint>(im);
94646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
94746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
9484532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic void nativeStart(JNIEnv* env, jclass clazz, jint ptr) {
9494532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr);
95046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
9514532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    status_t result = im->getInputManager()->start();
95246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    if (result) {
95346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        jniThrowRuntimeException(env, "Input manager could not be started.");
95446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    }
95546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
95646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
9574532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic void nativeSetDisplaySize(JNIEnv* env, jclass clazz, jint ptr,
958bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown        jint displayId, jint width, jint height, jint externalWidth, jint externalHeight) {
9594532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr);
96046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
96146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    // XXX we could get this from the SurfaceFlinger directly instead of requiring it
96246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    // to be passed in like this, not sure which is better but leaving it like this
96346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    // keeps the window manager in direct control of when display transitions propagate down
96446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    // to the input dispatcher
9654532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    im->setDisplaySize(displayId, width, height, externalWidth, externalHeight);
96646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
96746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
9684532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic void nativeSetDisplayOrientation(JNIEnv* env, jclass clazz,
9694532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown        jint ptr, jint displayId, jint orientation) {
9704532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr);
97146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
9724532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    im->setDisplayOrientation(displayId, orientation);
97346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
97446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
9754532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic jint nativeGetScanCodeState(JNIEnv* env, jclass clazz,
9764532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown        jint ptr, jint deviceId, jint sourceMask, jint scanCode) {
9774532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr);
97846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
9794532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    return im->getInputManager()->getReader()->getScanCodeState(
9806d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown            deviceId, uint32_t(sourceMask), scanCode);
98146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
98246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
9834532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic jint nativeGetKeyCodeState(JNIEnv* env, jclass clazz,
9844532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown        jint ptr, jint deviceId, jint sourceMask, jint keyCode) {
9854532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr);
98646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
9874532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    return im->getInputManager()->getReader()->getKeyCodeState(
9886d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown            deviceId, uint32_t(sourceMask), keyCode);
98946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
99046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
9914532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic jint nativeGetSwitchState(JNIEnv* env, jclass clazz,
9924532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown        jint ptr, jint deviceId, jint sourceMask, jint sw) {
9934532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr);
99446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
9954532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    return im->getInputManager()->getReader()->getSwitchState(
9966d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown            deviceId, uint32_t(sourceMask), sw);
99746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
99846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
9994532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic jboolean nativeHasKeys(JNIEnv* env, jclass clazz,
10004532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown        jint ptr, jint deviceId, jint sourceMask, jintArray keyCodes, jbooleanArray outFlags) {
10014532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr);
100246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
100346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    int32_t* codes = env->GetIntArrayElements(keyCodes, NULL);
100446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    uint8_t* flags = env->GetBooleanArrayElements(outFlags, NULL);
100546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    jsize numCodes = env->GetArrayLength(keyCodes);
100646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    jboolean result;
10076d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    if (numCodes == env->GetArrayLength(keyCodes)) {
10084532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown        result = im->getInputManager()->getReader()->hasKeys(
10096d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown                deviceId, uint32_t(sourceMask), numCodes, codes, flags);
101046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    } else {
101146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        result = JNI_FALSE;
101246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    }
101346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
101446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    env->ReleaseBooleanArrayElements(outFlags, flags, 0);
101546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    env->ReleaseIntArrayElements(keyCodes, codes, 0);
101646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    return result;
101746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
101846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
101946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownstatic void throwInputChannelNotInitialized(JNIEnv* env) {
102046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    jniThrowException(env, "java/lang/IllegalStateException",
102146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown             "inputChannel is not initialized");
102246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
102346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
10244532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic void handleInputChannelDisposed(JNIEnv* env,
102546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        jobject inputChannelObj, const sp<InputChannel>& inputChannel, void* data) {
10264532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    NativeInputManager* im = static_cast<NativeInputManager*>(data);
10274532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown
10288564c8da817a845353d213acd8636b76f567b234Steve Block    ALOGW("Input channel object '%s' was disposed without first being unregistered with "
102946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            "the input manager!", inputChannel->getName().string());
10304532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    im->unregisterInputChannel(env, inputChannel);
103146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
103246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
10334532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic void nativeRegisterInputChannel(JNIEnv* env, jclass clazz,
10344532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown        jint ptr, jobject inputChannelObj, jobject inputWindowHandleObj, jboolean monitor) {
10354532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr);
103646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
103746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    sp<InputChannel> inputChannel = android_view_InputChannel_getInputChannel(env,
103846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            inputChannelObj);
103946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    if (inputChannel == NULL) {
104046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        throwInputChannelNotInitialized(env);
104146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        return;
104246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    }
104346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
1044928e054931d357326613c78e62f4d850b7c442ffJeff Brown    sp<InputWindowHandle> inputWindowHandle =
1045928e054931d357326613c78e62f4d850b7c442ffJeff Brown            android_server_InputWindowHandle_getHandle(env, inputWindowHandleObj);
10467fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown
10474532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    status_t status = im->registerInputChannel(
1048928e054931d357326613c78e62f4d850b7c442ffJeff Brown            env, inputChannel, inputWindowHandle, monitor);
104946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    if (status) {
1050cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        String8 message;
1051cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        message.appendFormat("Failed to register input channel.  status=%d", status);
1052cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        jniThrowRuntimeException(env, message.string());
105346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        return;
105446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    }
105546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
1056a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown    if (! monitor) {
1057a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown        android_view_InputChannel_setDisposeCallback(env, inputChannelObj,
10584532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown                handleInputChannelDisposed, im);
1059a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown    }
106046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
106146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
10624532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic void nativeUnregisterInputChannel(JNIEnv* env, jclass clazz,
10634532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown        jint ptr, jobject inputChannelObj) {
10644532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr);
106546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
106646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    sp<InputChannel> inputChannel = android_view_InputChannel_getInputChannel(env,
106746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            inputChannelObj);
106846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    if (inputChannel == NULL) {
106946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        throwInputChannelNotInitialized(env);
107046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        return;
107146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    }
107246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
107346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    android_view_InputChannel_setDisposeCallback(env, inputChannelObj, NULL, NULL);
107446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
10754532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    status_t status = im->unregisterInputChannel(env, inputChannel);
1076cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown    if (status && status != BAD_VALUE) { // ignore already unregistered channel
1077cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        String8 message;
1078cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        message.appendFormat("Failed to unregister input channel.  status=%d", status);
1079cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        jniThrowRuntimeException(env, message.string());
108046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    }
108146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
108246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
10834532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic void nativeSetInputFilterEnabled(JNIEnv* env, jclass clazz,
10844532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown        jint ptr, jboolean enabled) {
10854532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr);
10860029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown
10874532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    im->getInputManager()->getDispatcher()->setInputFilterEnabled(enabled);
10880029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown}
10890029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown
10904532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic jint nativeInjectInputEvent(JNIEnv* env, jclass clazz,
10914532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown        jint ptr, jobject inputEventObj, jint injectorPid, jint injectorUid,
10920029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown        jint syncMode, jint timeoutMillis, jint policyFlags) {
10934532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr);
10947fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown
10956ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown    if (env->IsInstanceOf(inputEventObj, gKeyEventClassInfo.clazz)) {
10966ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown        KeyEvent keyEvent;
10971f2451007c660091b7b090c1ea332f9044515d2dJeff Brown        status_t status = android_view_KeyEvent_toNative(env, inputEventObj, & keyEvent);
10981f2451007c660091b7b090c1ea332f9044515d2dJeff Brown        if (status) {
10991f2451007c660091b7b090c1ea332f9044515d2dJeff Brown            jniThrowRuntimeException(env, "Could not read contents of KeyEvent object.");
11001f2451007c660091b7b090c1ea332f9044515d2dJeff Brown            return INPUT_EVENT_INJECTION_FAILED;
11011f2451007c660091b7b090c1ea332f9044515d2dJeff Brown        }
11027fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown
11034532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown        return im->getInputManager()->getDispatcher()->injectInputEvent(
11040029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown                & keyEvent, injectorPid, injectorUid, syncMode, timeoutMillis,
11050029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown                uint32_t(policyFlags));
11066ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown    } else if (env->IsInstanceOf(inputEventObj, gMotionEventClassInfo.clazz)) {
11072ed2462aa29c564f5231f317c27b3188da875e52Jeff Brown        const MotionEvent* motionEvent = android_view_MotionEvent_getNativePtr(env, inputEventObj);
11082ed2462aa29c564f5231f317c27b3188da875e52Jeff Brown        if (!motionEvent) {
11091f2451007c660091b7b090c1ea332f9044515d2dJeff Brown            jniThrowRuntimeException(env, "Could not read contents of MotionEvent object.");
11101f2451007c660091b7b090c1ea332f9044515d2dJeff Brown            return INPUT_EVENT_INJECTION_FAILED;
11111f2451007c660091b7b090c1ea332f9044515d2dJeff Brown        }
11127fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown
11134532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown        return im->getInputManager()->getDispatcher()->injectInputEvent(
11140029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown                motionEvent, injectorPid, injectorUid, syncMode, timeoutMillis,
11150029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown                uint32_t(policyFlags));
11166ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown    } else {
11176ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown        jniThrowRuntimeException(env, "Invalid input event type.");
11187fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown        return INPUT_EVENT_INJECTION_FAILED;
11197fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown    }
11207fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown}
11217fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown
11224532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic void nativeSetInputWindows(JNIEnv* env, jclass clazz,
11234532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown        jint ptr, jobjectArray windowHandleObjArray) {
11244532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr);
1125349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown
11264532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    im->setInputWindows(env, windowHandleObjArray);
1127349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown}
1128349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown
11294532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic void nativeSetFocusedApplication(JNIEnv* env, jclass clazz,
11304532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown        jint ptr, jobject applicationHandleObj) {
11314532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr);
1132349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown
11334532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    im->setFocusedApplication(env, applicationHandleObj);
1134349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown}
1135349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown
11364532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic void nativeSetInputDispatchMode(JNIEnv* env,
11374532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown        jclass clazz, jint ptr, jboolean enabled, jboolean frozen) {
11384532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr);
1139349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown
11404532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    im->setInputDispatchMode(enabled, frozen);
1141349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown}
1142349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown
11434532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic void nativeSetSystemUiVisibility(JNIEnv* env,
11444532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown        jclass clazz, jint ptr, jint visibility) {
11454532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr);
114605dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown
11474532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    im->setSystemUiVisibility(visibility);
114805dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown}
114905dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown
11504532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic jobject nativeGetInputDevice(JNIEnv* env,
11514532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown        jclass clazz, jint ptr, jint deviceId) {
11524532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr);
11538d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown
11548d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    InputDeviceInfo deviceInfo;
11554532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    status_t status = im->getInputManager()->getReader()->getInputDeviceInfo(
11568d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            deviceId, & deviceInfo);
11578d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    if (status) {
11588d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        return NULL;
11598d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    }
11608d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown
11619f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    return android_view_InputDevice_create(env, deviceInfo);
11628d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown}
11638d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown
11644532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic jintArray nativeGetInputDeviceIds(JNIEnv* env,
11654532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown        jclass clazz, jint ptr) {
11664532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr);
11678d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown
11688d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    Vector<int> deviceIds;
11694532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    im->getInputManager()->getReader()->getInputDeviceIds(deviceIds);
11708d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown
11718d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    jintArray deviceIdsObj = env->NewIntArray(deviceIds.size());
11728d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    if (! deviceIdsObj) {
11738d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        return NULL;
11748d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    }
11758d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown
11768d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    env->SetIntArrayRegion(deviceIdsObj, 0, deviceIds.size(), deviceIds.array());
11778d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    return deviceIdsObj;
11788d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown}
11798d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown
11804532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic void nativeGetInputConfiguration(JNIEnv* env,
11814532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown        jclass clazz, jint ptr, jobject configObj) {
11824532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr);
118357c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown
118457c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown    InputConfiguration config;
11854532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    im->getInputManager()->getReader()->getInputConfiguration(& config);
118657c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown
118757c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown    env->SetIntField(configObj, gConfigurationClassInfo.touchscreen, config.touchScreen);
118857c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown    env->SetIntField(configObj, gConfigurationClassInfo.keyboard, config.keyboard);
118957c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown    env->SetIntField(configObj, gConfigurationClassInfo.navigation, config.navigation);
119057c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown}
119157c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown
11924532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic jboolean nativeTransferTouchFocus(JNIEnv* env,
11934532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown        jclass clazz, jint ptr, jobject fromChannelObj, jobject toChannelObj) {
11944532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr);
1195e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown
1196e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown    sp<InputChannel> fromChannel =
1197e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown            android_view_InputChannel_getInputChannel(env, fromChannelObj);
1198e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown    sp<InputChannel> toChannel =
1199e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown            android_view_InputChannel_getInputChannel(env, toChannelObj);
1200e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown
1201e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown    if (fromChannel == NULL || toChannel == NULL) {
1202e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown        return false;
1203e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown    }
1204e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown
12054532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    return im->getInputManager()->getDispatcher()->
1206e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown            transferTouchFocus(fromChannel, toChannel);
1207e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown}
1208e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown
12094532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic void nativeSetPointerSpeed(JNIEnv* env,
12104532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown        jclass clazz, jint ptr, jint speed) {
12114532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr);
12121a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown
12134532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    im->setPointerSpeed(speed);
12141a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown}
12151a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown
12164532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic void nativeSetShowTouches(JNIEnv* env,
12174532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown        jclass clazz, jint ptr, jboolean enabled) {
12184532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr);
1219daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown
12204532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    im->setShowTouches(enabled);
1221daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown}
1222daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown
12234532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic jstring nativeDump(JNIEnv* env, jclass clazz, jint ptr) {
12244532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr);
1225e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown
1226b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    String8 dump;
12274532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    im->dump(dump);
1228e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    return env->NewStringUTF(dump.string());
1229e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown}
1230e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown
12314532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownstatic void nativeMonitor(JNIEnv* env, jclass clazz, jint ptr) {
12324532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr);
123389ef0720ee8e0ac6ae1758faa917e4d6c9606fb4Jeff Brown
12344532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    im->getInputManager()->getReader()->monitor();
12354532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    im->getInputManager()->getDispatcher()->monitor();
123689ef0720ee8e0ac6ae1758faa917e4d6c9606fb4Jeff Brown}
123789ef0720ee8e0ac6ae1758faa917e4d6c9606fb4Jeff Brown
12389c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown// ----------------------------------------------------------------------------
12399c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
124046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownstatic JNINativeMethod gInputManagerMethods[] = {
124146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    /* name, signature, funcPtr */
12424532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    { "nativeInit",
12434532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown            "(Lcom/android/server/input/InputManagerService;Landroid/content/Context;Landroid/os/MessageQueue;)I",
12444532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown            (void*) nativeInit },
12454532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    { "nativeStart", "(I)V",
12464532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown            (void*) nativeStart },
12474532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    { "nativeSetDisplaySize", "(IIIIII)V",
12484532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown            (void*) nativeSetDisplaySize },
12494532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    { "nativeSetDisplayOrientation", "(III)V",
12504532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown            (void*) nativeSetDisplayOrientation },
12514532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    { "nativeGetScanCodeState", "(IIII)I",
12524532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown            (void*) nativeGetScanCodeState },
12534532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    { "nativeGetKeyCodeState", "(IIII)I",
12544532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown            (void*) nativeGetKeyCodeState },
12554532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    { "nativeGetSwitchState", "(IIII)I",
12564532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown            (void*) nativeGetSwitchState },
12574532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    { "nativeHasKeys", "(III[I[Z)Z",
12584532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown            (void*) nativeHasKeys },
1259928e054931d357326613c78e62f4d850b7c442ffJeff Brown    { "nativeRegisterInputChannel",
12604532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown            "(ILandroid/view/InputChannel;Lcom/android/server/input/InputWindowHandle;Z)V",
12614532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown            (void*) nativeRegisterInputChannel },
12624532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    { "nativeUnregisterInputChannel", "(ILandroid/view/InputChannel;)V",
12634532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown            (void*) nativeUnregisterInputChannel },
12644532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    { "nativeSetInputFilterEnabled", "(IZ)V",
12654532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown            (void*) nativeSetInputFilterEnabled },
12664532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    { "nativeInjectInputEvent", "(ILandroid/view/InputEvent;IIIII)I",
12674532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown            (void*) nativeInjectInputEvent },
12684532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    { "nativeSetInputWindows", "(I[Lcom/android/server/input/InputWindowHandle;)V",
12694532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown            (void*) nativeSetInputWindows },
12704532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    { "nativeSetFocusedApplication", "(ILcom/android/server/input/InputApplicationHandle;)V",
12714532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown            (void*) nativeSetFocusedApplication },
12724532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    { "nativeSetInputDispatchMode", "(IZZ)V",
12734532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown            (void*) nativeSetInputDispatchMode },
12744532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    { "nativeSetSystemUiVisibility", "(II)V",
12754532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown            (void*) nativeSetSystemUiVisibility },
12764532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    { "nativeGetInputDevice", "(II)Landroid/view/InputDevice;",
12774532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown            (void*) nativeGetInputDevice },
12784532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    { "nativeGetInputDeviceIds", "(I)[I",
12794532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown            (void*) nativeGetInputDeviceIds },
12804532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    { "nativeGetInputConfiguration", "(ILandroid/content/res/Configuration;)V",
12814532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown            (void*) nativeGetInputConfiguration },
12824532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    { "nativeTransferTouchFocus", "(ILandroid/view/InputChannel;Landroid/view/InputChannel;)Z",
12834532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown            (void*) nativeTransferTouchFocus },
12844532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    { "nativeSetPointerSpeed", "(II)V",
12854532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown            (void*) nativeSetPointerSpeed },
12864532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    { "nativeSetShowTouches", "(IZ)V",
12874532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown            (void*) nativeSetShowTouches },
12884532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    { "nativeDump", "(I)Ljava/lang/String;",
12894532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown            (void*) nativeDump },
12904532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    { "nativeMonitor", "(I)V",
12914532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown            (void*) nativeMonitor },
129246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown};
129346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
129446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#define FIND_CLASS(var, className) \
129546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        var = env->FindClass(className); \
129617cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro        LOG_FATAL_IF(! var, "Unable to find class " className);
129746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
129846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#define GET_METHOD_ID(var, clazz, methodName, methodDescriptor) \
129946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        var = env->GetMethodID(clazz, methodName, methodDescriptor); \
130046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        LOG_FATAL_IF(! var, "Unable to find method " methodName);
130146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
130246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#define GET_FIELD_ID(var, clazz, fieldName, fieldDescriptor) \
130346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        var = env->GetFieldID(clazz, fieldName, fieldDescriptor); \
130446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        LOG_FATAL_IF(! var, "Unable to find field " fieldName);
130546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
130646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownint register_android_server_InputManager(JNIEnv* env) {
13074532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    int res = jniRegisterNativeMethods(env, "com/android/server/input/InputManagerService",
130846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            gInputManagerMethods, NELEM(gInputManagerMethods));
130946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    LOG_FATAL_IF(res < 0, "Unable to register native methods.");
131046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
13119c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    // Callbacks
131246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
131317cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro    jclass clazz;
13144532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    FIND_CLASS(clazz, "com/android/server/input/InputManagerService");
131546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
13164532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    GET_METHOD_ID(gServiceClassInfo.notifyConfigurationChanged, clazz,
131757c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown            "notifyConfigurationChanged", "(J)V");
131846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
13194532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    GET_METHOD_ID(gServiceClassInfo.notifyLidSwitchChanged, clazz,
132046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            "notifyLidSwitchChanged", "(JZ)V");
132146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
13224532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    GET_METHOD_ID(gServiceClassInfo.notifyInputChannelBroken, clazz,
13234532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown            "notifyInputChannelBroken", "(Lcom/android/server/input/InputWindowHandle;)V");
13247fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown
13254532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    GET_METHOD_ID(gServiceClassInfo.notifyANR, clazz,
1326928e054931d357326613c78e62f4d850b7c442ffJeff Brown            "notifyANR",
13274532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown            "(Lcom/android/server/input/InputApplicationHandle;Lcom/android/server/input/InputWindowHandle;)J");
1328349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown
13294532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    GET_METHOD_ID(gServiceClassInfo.filterInputEvent, clazz,
13300029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown            "filterInputEvent", "(Landroid/view/InputEvent;I)Z");
13310029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown
13324532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    GET_METHOD_ID(gServiceClassInfo.interceptKeyBeforeQueueing, clazz,
13331f2451007c660091b7b090c1ea332f9044515d2dJeff Brown            "interceptKeyBeforeQueueing", "(Landroid/view/KeyEvent;IZ)I");
1334349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown
13354532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    GET_METHOD_ID(gServiceClassInfo.interceptMotionBeforeQueueingWhenScreenOff,
133617cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro            clazz,
133756194ebec6212e229f4ccdaa4b187166d20013efJeff Brown            "interceptMotionBeforeQueueingWhenScreenOff", "(I)I");
133856194ebec6212e229f4ccdaa4b187166d20013efJeff Brown
13394532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    GET_METHOD_ID(gServiceClassInfo.interceptKeyBeforeDispatching, clazz,
13401f2451007c660091b7b090c1ea332f9044515d2dJeff Brown            "interceptKeyBeforeDispatching",
13414532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown            "(Lcom/android/server/input/InputWindowHandle;Landroid/view/KeyEvent;I)J");
1342349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown
13434532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    GET_METHOD_ID(gServiceClassInfo.dispatchUnhandledKey, clazz,
134449ed71db425c5054e3ad9526496a7e116c89556bJeff Brown            "dispatchUnhandledKey",
13454532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown            "(Lcom/android/server/input/InputWindowHandle;Landroid/view/KeyEvent;I)Landroid/view/KeyEvent;");
13463915bb845b032dc184dba5e60970b803390ca3edJeff Brown
13474532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    GET_METHOD_ID(gServiceClassInfo.checkInjectEventsPermission, clazz,
1348349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown            "checkInjectEventsPermission", "(II)Z");
134946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
13504532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    GET_METHOD_ID(gServiceClassInfo.getVirtualKeyQuietTimeMillis, clazz,
1351fe50892af3b365806a767298dfd8e86447682581Jeff Brown            "getVirtualKeyQuietTimeMillis", "()I");
1352fe50892af3b365806a767298dfd8e86447682581Jeff Brown
13534532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    GET_METHOD_ID(gServiceClassInfo.getExcludedDeviceNames, clazz,
135446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            "getExcludedDeviceNames", "()[Ljava/lang/String;");
135546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
13564532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    GET_METHOD_ID(gServiceClassInfo.getKeyRepeatTimeout, clazz,
1357a454767b09ecb7d25d00beae0e5a1fdd48605c63Jeff Brown            "getKeyRepeatTimeout", "()I");
1358a454767b09ecb7d25d00beae0e5a1fdd48605c63Jeff Brown
13594532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    GET_METHOD_ID(gServiceClassInfo.getKeyRepeatDelay, clazz,
1360a454767b09ecb7d25d00beae0e5a1fdd48605c63Jeff Brown            "getKeyRepeatDelay", "()I");
1361a454767b09ecb7d25d00beae0e5a1fdd48605c63Jeff Brown
13624532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    GET_METHOD_ID(gServiceClassInfo.getHoverTapTimeout, clazz,
1363bb3fcba0caf697f1d238a2cbefdf1efe06eded99Jeff Brown            "getHoverTapTimeout", "()I");
1364bb3fcba0caf697f1d238a2cbefdf1efe06eded99Jeff Brown
13654532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    GET_METHOD_ID(gServiceClassInfo.getHoverTapSlop, clazz,
1366bb3fcba0caf697f1d238a2cbefdf1efe06eded99Jeff Brown            "getHoverTapSlop", "()I");
1367214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown
13684532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    GET_METHOD_ID(gServiceClassInfo.getDoubleTapTimeout, clazz,
1369214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown            "getDoubleTapTimeout", "()I");
1370214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown
13714532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    GET_METHOD_ID(gServiceClassInfo.getLongPressTimeout, clazz,
1372214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown            "getLongPressTimeout", "()I");
1373214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown
13744532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    GET_METHOD_ID(gServiceClassInfo.getPointerLayer, clazz,
137583c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown            "getPointerLayer", "()I");
137683c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown
13774532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    GET_METHOD_ID(gServiceClassInfo.getPointerIcon, clazz,
13782352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown            "getPointerIcon", "()Landroid/view/PointerIcon;");
1379b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown
13806ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown    // KeyEvent
13816ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown
13826ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown    FIND_CLASS(gKeyEventClassInfo.clazz, "android/view/KeyEvent");
138317cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro    gKeyEventClassInfo.clazz = jclass(env->NewGlobalRef(gKeyEventClassInfo.clazz));
138417cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro
13858d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    // MotionEvent
13866ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown
13876ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown    FIND_CLASS(gMotionEventClassInfo.clazz, "android/view/MotionEvent");
138817cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro    gMotionEventClassInfo.clazz = jclass(env->NewGlobalRef(gMotionEventClassInfo.clazz));
13896ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown
139057c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown    // Configuration
139157c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown
139217cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro    FIND_CLASS(clazz, "android/content/res/Configuration");
139357c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown
139417cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro    GET_FIELD_ID(gConfigurationClassInfo.touchscreen, clazz,
139557c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown            "touchscreen", "I");
139657c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown
139717cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro    GET_FIELD_ID(gConfigurationClassInfo.keyboard, clazz,
139857c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown            "keyboard", "I");
139957c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown
140017cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro    GET_FIELD_ID(gConfigurationClassInfo.navigation, clazz,
140157c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown            "navigation", "I");
140257c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown
140346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    return 0;
140446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
140546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
140646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} /* namespace android */
1407