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