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 Brownpackage com.android.server; 1846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 1946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownimport com.android.internal.util.XmlUtils; 2046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 2146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownimport org.xmlpull.v1.XmlPullParser; 2246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 2346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownimport android.content.Context; 24349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brownimport android.content.pm.PackageManager; 2546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownimport android.content.res.Configuration; 2646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownimport android.os.Environment; 27ae9fc03bdccda709101291bbcd3beaa5b6daebfcJeff Brownimport android.os.SystemProperties; 2846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownimport android.util.Slog; 2946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownimport android.util.Xml; 3046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownimport android.view.InputChannel; 318d60866e2100db70ecf0502c14768a384514d7e9Jeff Brownimport android.view.InputDevice; 326ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brownimport android.view.InputEvent; 3346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownimport android.view.Surface; 3446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 3546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownimport java.io.BufferedReader; 3646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownimport java.io.File; 3746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownimport java.io.FileInputStream; 3846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownimport java.io.FileNotFoundException; 3946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownimport java.io.FileReader; 4046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownimport java.io.IOException; 4146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownimport java.io.InputStreamReader; 4246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownimport java.io.PrintWriter; 4346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownimport java.util.ArrayList; 448d60866e2100db70ecf0502c14768a384514d7e9Jeff Brownimport java.util.Properties; 4546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 4646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown/* 4746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * Wraps the C++ InputManager and provides its callbacks. 4846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown */ 4946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownpublic class InputManager { 5046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown static final String TAG = "InputManager"; 5146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 52b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown private static final boolean DEBUG = false; 53b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown 5446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown private final Callbacks mCallbacks; 5546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown private final Context mContext; 5646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown private final WindowManagerService mWindowManagerService; 5746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 5846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown private static native void nativeInit(Callbacks callbacks); 5946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown private static native void nativeStart(); 6046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown private static native void nativeSetDisplaySize(int displayId, int width, int height); 6146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown private static native void nativeSetDisplayOrientation(int displayId, int rotation); 6246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 636d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown private static native int nativeGetScanCodeState(int deviceId, int sourceMask, 6446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown int scanCode); 656d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown private static native int nativeGetKeyCodeState(int deviceId, int sourceMask, 6646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown int keyCode); 676d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown private static native int nativeGetSwitchState(int deviceId, int sourceMask, 6846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown int sw); 696d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown private static native boolean nativeHasKeys(int deviceId, int sourceMask, 706d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown int[] keyCodes, boolean[] keyExists); 71a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown private static native void nativeRegisterInputChannel(InputChannel inputChannel, 72a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown boolean monitor); 7346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown private static native void nativeUnregisterInputChannel(InputChannel inputChannel); 746ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown private static native int nativeInjectInputEvent(InputEvent event, 756ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown int injectorPid, int injectorUid, int syncMode, int timeoutMillis); 76349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown private static native void nativeSetInputWindows(InputWindow[] windows); 77349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown private static native void nativeSetInputDispatchMode(boolean enabled, boolean frozen); 78349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown private static native void nativeSetFocusedApplication(InputApplication application); 798d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown private static native InputDevice nativeGetInputDevice(int deviceId); 8057c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown private static native void nativeGetInputConfiguration(Configuration configuration); 818d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown private static native int[] nativeGetInputDeviceIds(); 82e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown private static native String nativeDump(); 8346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 847fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown // Input event injection constants defined in InputDispatcher.h. 857fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown static final int INPUT_EVENT_INJECTION_SUCCEEDED = 0; 867fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown static final int INPUT_EVENT_INJECTION_PERMISSION_DENIED = 1; 877fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown static final int INPUT_EVENT_INJECTION_FAILED = 2; 887fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown static final int INPUT_EVENT_INJECTION_TIMED_OUT = 3; 897fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown 906ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown // Input event injection synchronization modes defined in InputDispatcher.h 916ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown static final int INPUT_EVENT_INJECTION_SYNC_NONE = 0; 926ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown static final int INPUT_EVENT_INJECTION_SYNC_WAIT_FOR_RESULT = 1; 936ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown static final int INPUT_EVENT_INJECTION_SYNC_WAIT_FOR_FINISH = 2; 946ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown 956d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown // Key states (may be returned by queries about the current state of a 966d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown // particular key code, scan code or switch). 976d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown 986d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown /** The key state is unknown or the requested key itself is not supported. */ 996d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown public static final int KEY_STATE_UNKNOWN = -1; 1006d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown 1016d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown /** The key is up. /*/ 1026d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown public static final int KEY_STATE_UP = 0; 1036d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown 1046d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown /** The key is down. */ 1056d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown public static final int KEY_STATE_DOWN = 1; 1066d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown 1076d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown /** The key is down but is a virtual key press that is being emulated by the system. */ 1086d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown public static final int KEY_STATE_VIRTUAL = 2; 1096d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown 110e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown public InputManager(Context context, WindowManagerService windowManagerService) { 11146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown this.mContext = context; 11246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown this.mWindowManagerService = windowManagerService; 11346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 11446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown this.mCallbacks = new Callbacks(); 11546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 11646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown init(); 11746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 11846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 11946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown private void init() { 12046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown Slog.i(TAG, "Initializing input manager"); 12146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown nativeInit(mCallbacks); 12246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 12346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 12446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown public void start() { 12546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown Slog.i(TAG, "Starting input manager"); 12646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown nativeStart(); 12746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 12846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 12946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown public void setDisplaySize(int displayId, int width, int height) { 13046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown if (width <= 0 || height <= 0) { 13146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown throw new IllegalArgumentException("Invalid display id or dimensions."); 13246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 13346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 134b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown if (DEBUG) { 135b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown Slog.d(TAG, "Setting display #" + displayId + " size to " + width + "x" + height); 136b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown } 13746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown nativeSetDisplaySize(displayId, width, height); 13846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 13946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 14046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown public void setDisplayOrientation(int displayId, int rotation) { 14146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown if (rotation < Surface.ROTATION_0 || rotation > Surface.ROTATION_270) { 14246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown throw new IllegalArgumentException("Invalid rotation."); 14346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 14446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 145b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown if (DEBUG) { 146b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown Slog.d(TAG, "Setting display #" + displayId + " orientation to " + rotation); 147b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown } 14846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown nativeSetDisplayOrientation(displayId, rotation); 14946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 15046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 15146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown public void getInputConfiguration(Configuration config) { 15246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown if (config == null) { 15346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown throw new IllegalArgumentException("config must not be null."); 15446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 15546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 15657c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown nativeGetInputConfiguration(config); 15746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 15846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 1596d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown /** 1606d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown * Gets the current state of a key or button by key code. 1616d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown * @param deviceId The input device id, or -1 to consult all devices. 1626d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown * @param sourceMask The input sources to consult, or {@link InputDevice#SOURCE_ANY} to 1636d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown * consider all input sources. An input device is consulted if at least one of its 1646d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown * non-class input source bits matches the specified source mask. 1656d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown * @param keyCode The key code to check. 1666d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown * @return The key state. 1676d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown */ 1686d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown public int getKeyCodeState(int deviceId, int sourceMask, int keyCode) { 1696d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown return nativeGetKeyCodeState(deviceId, sourceMask, keyCode); 17046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 17146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 1726d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown /** 1736d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown * Gets the current state of a key or button by scan code. 1746d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown * @param deviceId The input device id, or -1 to consult all devices. 1756d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown * @param sourceMask The input sources to consult, or {@link InputDevice#SOURCE_ANY} to 1766d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown * consider all input sources. An input device is consulted if at least one of its 1776d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown * non-class input source bits matches the specified source mask. 1786d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown * @param scanCode The scan code to check. 1796d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown * @return The key state. 1806d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown */ 1816d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown public int getScanCodeState(int deviceId, int sourceMask, int scanCode) { 1826d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown return nativeGetScanCodeState(deviceId, sourceMask, scanCode); 18346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 18446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 1856d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown /** 1866d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown * Gets the current state of a switch by switch code. 1876d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown * @param deviceId The input device id, or -1 to consult all devices. 1886d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown * @param sourceMask The input sources to consult, or {@link InputDevice#SOURCE_ANY} to 1896d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown * consider all input sources. An input device is consulted if at least one of its 1906d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown * non-class input source bits matches the specified source mask. 1916d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown * @param switchCode The switch code to check. 1926d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown * @return The switch state. 1936d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown */ 1946d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown public int getSwitchState(int deviceId, int sourceMask, int switchCode) { 1956d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown return nativeGetSwitchState(deviceId, sourceMask, switchCode); 19646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 19746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 1986d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown /** 1996d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown * Determines whether the specified key codes are supported by a particular device. 2006d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown * @param deviceId The input device id, or -1 to consult all devices. 2016d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown * @param sourceMask The input sources to consult, or {@link InputDevice#SOURCE_ANY} to 2026d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown * consider all input sources. An input device is consulted if at least one of its 2036d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown * non-class input source bits matches the specified source mask. 2046d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown * @param keyCodes The array of key codes to check. 2056d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown * @param keyExists An array at least as large as keyCodes whose entries will be set 2066d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown * to true or false based on the presence or absence of support for the corresponding 2076d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown * key codes. 2086d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown * @return True if the lookup was successful, false otherwise. 2096d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown */ 2106d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown public boolean hasKeys(int deviceId, int sourceMask, int[] keyCodes, boolean[] keyExists) { 21146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown if (keyCodes == null) { 21246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown throw new IllegalArgumentException("keyCodes must not be null."); 21346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 2146d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown if (keyExists == null || keyExists.length < keyCodes.length) { 2156d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown throw new IllegalArgumentException("keyExists must not be null and must be at " 2166d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown + "least as large as keyCodes."); 21746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 21846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 2196d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown return nativeHasKeys(deviceId, sourceMask, keyCodes, keyExists); 22046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 22146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 222a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown /** 223a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown * Creates an input channel that will receive all input from the input dispatcher. 224a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown * @param inputChannelName The input channel name. 225a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown * @return The input channel. 226a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown */ 227a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown public InputChannel monitorInput(String inputChannelName) { 228a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown if (inputChannelName == null) { 229a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown throw new IllegalArgumentException("inputChannelName must not be null."); 230a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown } 231a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown 232a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown InputChannel[] inputChannels = InputChannel.openInputChannelPair(inputChannelName); 233a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown nativeRegisterInputChannel(inputChannels[0], true); 234a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown inputChannels[0].dispose(); // don't need to retain the Java object reference 235a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown return inputChannels[1]; 236a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown } 237a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown 238a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown /** 239a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown * Registers an input channel so that it can be used as an input event target. 240a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown * @param inputChannel The input channel to register. 241a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown */ 24246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown public void registerInputChannel(InputChannel inputChannel) { 24346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown if (inputChannel == null) { 24446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown throw new IllegalArgumentException("inputChannel must not be null."); 24546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 24646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 247a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown nativeRegisterInputChannel(inputChannel, false); 24846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 24946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 250a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown /** 251a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown * Unregisters an input channel. 252a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown * @param inputChannel The input channel to unregister. 253a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown */ 25446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown public void unregisterInputChannel(InputChannel inputChannel) { 25546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown if (inputChannel == null) { 25646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown throw new IllegalArgumentException("inputChannel must not be null."); 25746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 25846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 25946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown nativeUnregisterInputChannel(inputChannel); 26046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 26146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 26246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown /** 2636ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown * Injects an input event into the event system on behalf of an application. 2646ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown * The synchronization mode determines whether the method blocks while waiting for 2656ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown * input injection to proceed. 2666ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown * 2676ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown * {@link #INPUT_EVENT_INJECTION_SYNC_NONE} never blocks. Injection is asynchronous and 2686ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown * is assumed always to be successful. 2696ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown * 2706ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown * {@link #INPUT_EVENT_INJECTION_SYNC_WAIT_FOR_RESULT} waits for previous events to be 2716ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown * dispatched so that the input dispatcher can determine whether input event injection will 2726ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown * be permitted based on the current input focus. Does not wait for the input event to 2736ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown * finish processing. 2746ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown * 2756ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown * {@link #INPUT_EVENT_INJECTION_SYNC_WAIT_FOR_FINISH} waits for the input event to 2766ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown * be completely processed. 2776ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown * 27846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * @param event The event to inject. 2797fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown * @param injectorPid The pid of the injecting application. 2807fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown * @param injectorUid The uid of the injecting application. 2816ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown * @param syncMode The synchronization mode. 2827fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown * @param timeoutMillis The injection timeout in milliseconds. 2837fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown * @return One of the INPUT_EVENT_INJECTION_XXX constants. 28446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown */ 2856ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown public int injectInputEvent(InputEvent event, int injectorPid, int injectorUid, 2866ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown int syncMode, int timeoutMillis) { 2877fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown if (event == null) { 2887fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown throw new IllegalArgumentException("event must not be null"); 2897fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown } 2907fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown if (injectorPid < 0 || injectorUid < 0) { 2917fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown throw new IllegalArgumentException("injectorPid and injectorUid must not be negative."); 2927fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown } 2937fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown if (timeoutMillis <= 0) { 2947fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown throw new IllegalArgumentException("timeoutMillis must be positive"); 2957fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown } 2966ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown 2976ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown return nativeInjectInputEvent(event, injectorPid, injectorUid, syncMode, timeoutMillis); 29846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 29946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 3008d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown /** 3018d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown * Gets information about the input device with the specified id. 3028d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown * @param id The device id. 3038d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown * @return The input device or null if not found. 3048d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown */ 3058d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown public InputDevice getInputDevice(int deviceId) { 3068d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown return nativeGetInputDevice(deviceId); 3078d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown } 3088d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown 3098d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown /** 3108d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown * Gets the ids of all input devices in the system. 3118d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown * @return The input device ids. 3128d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown */ 3138d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown public int[] getInputDeviceIds() { 3148d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown return nativeGetInputDeviceIds(); 3158d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown } 3168d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown 317349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown public void setInputWindows(InputWindow[] windows) { 318349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown nativeSetInputWindows(windows); 319349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown } 320349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown 321349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown public void setFocusedApplication(InputApplication application) { 322349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown nativeSetFocusedApplication(application); 323349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown } 324349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown 325349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown public void setInputDispatchMode(boolean enabled, boolean frozen) { 326349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown nativeSetInputDispatchMode(enabled, frozen); 327349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown } 328349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown 32946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown public void dump(PrintWriter pw) { 330e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown String dumpStr = nativeDump(); 331e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown if (dumpStr != null) { 332e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown pw.println(dumpStr); 333e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown } 33446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 33546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 33646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown private static final class VirtualKeyDefinition { 33746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown public int scanCode; 33846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 33946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown // configured position data, specified in display coords 34046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown public int centerX; 34146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown public int centerY; 34246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown public int width; 34346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown public int height; 34446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 34546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 3468d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown private static final class InputDeviceCalibration { 3478d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown public String[] keys; 3488d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown public String[] values; 3498d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown } 3508d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown 35146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown /* 35246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * Callbacks from native. 35346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown */ 35446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown private class Callbacks { 35546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown static final String TAG = "InputManager-Callbacks"; 35646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 35746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown private static final boolean DEBUG_VIRTUAL_KEYS = false; 35846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown private static final String EXCLUDED_DEVICES_PATH = "etc/excluded-input-devices.xml"; 3598d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown private static final String CALIBRATION_DIR_PATH = "usr/idc/"; 36046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 36146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown @SuppressWarnings("unused") 36257c59376f4432bdb285acb242bd9b3bec81f6bcaJeff Brown public void notifyConfigurationChanged(long whenNanos) { 36346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown mWindowManagerService.sendNewConfiguration(); 36446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 36546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 36646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown @SuppressWarnings("unused") 36746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown public void notifyLidSwitchChanged(long whenNanos, boolean lidOpen) { 36800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown mWindowManagerService.mInputMonitor.notifyLidSwitchChanged(whenNanos, lidOpen); 36946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 37046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 37146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown @SuppressWarnings("unused") 3727fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown public void notifyInputChannelBroken(InputChannel inputChannel) { 373349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown mWindowManagerService.mInputMonitor.notifyInputChannelBroken(inputChannel); 3747fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown } 375349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown 376349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown @SuppressWarnings("unused") 377519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown public long notifyANR(Object token, InputChannel inputChannel) { 378519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown return mWindowManagerService.mInputMonitor.notifyANR(token, inputChannel); 3797fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown } 3807fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown 3817fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown @SuppressWarnings("unused") 382eb9f7a01b0f501a535d872a957c1102ebb13d1c7Jeff Brown public int interceptKeyBeforeQueueing(long whenNanos, int action, int flags, 383eb9f7a01b0f501a535d872a957c1102ebb13d1c7Jeff Brown int keyCode, int scanCode, int policyFlags, boolean isScreenOn) { 38400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown return mWindowManagerService.mInputMonitor.interceptKeyBeforeQueueing( 385eb9f7a01b0f501a535d872a957c1102ebb13d1c7Jeff Brown whenNanos, action, flags, keyCode, scanCode, policyFlags, isScreenOn); 386349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown } 387349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown 388349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown @SuppressWarnings("unused") 38900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown public boolean interceptKeyBeforeDispatching(InputChannel focus, int action, 390eb9f7a01b0f501a535d872a957c1102ebb13d1c7Jeff Brown int flags, int keyCode, int scanCode, int metaState, int repeatCount, 391eb9f7a01b0f501a535d872a957c1102ebb13d1c7Jeff Brown int policyFlags) { 392349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown return mWindowManagerService.mInputMonitor.interceptKeyBeforeDispatching(focus, 393eb9f7a01b0f501a535d872a957c1102ebb13d1c7Jeff Brown action, flags, keyCode, scanCode, metaState, repeatCount, policyFlags); 394349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown } 395349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown 396349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown @SuppressWarnings("unused") 397349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown public boolean checkInjectEventsPermission(int injectorPid, int injectorUid) { 398349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown return mContext.checkPermission( 399349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown android.Manifest.permission.INJECT_EVENTS, injectorPid, injectorUid) 400349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown == PackageManager.PERMISSION_GRANTED; 40146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 40246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 40346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown @SuppressWarnings("unused") 40446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown public boolean filterTouchEvents() { 40546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown return mContext.getResources().getBoolean( 40646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown com.android.internal.R.bool.config_filterTouchEvents); 40746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 40846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 40946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown @SuppressWarnings("unused") 41046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown public boolean filterJumpyTouchEvents() { 41146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown return mContext.getResources().getBoolean( 41246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown com.android.internal.R.bool.config_filterJumpyTouchEvents); 41346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 4146f71d0fedbb04c048a7294976103e42f0f046641Jeff Brown 4156f71d0fedbb04c048a7294976103e42f0f046641Jeff Brown @SuppressWarnings("unused") 4166f71d0fedbb04c048a7294976103e42f0f046641Jeff Brown public int getVirtualKeyQuietTimeMillis() { 4176f71d0fedbb04c048a7294976103e42f0f046641Jeff Brown return mContext.getResources().getInteger( 4186f71d0fedbb04c048a7294976103e42f0f046641Jeff Brown com.android.internal.R.integer.config_virtualKeyQuietTimeMillis); 4196f71d0fedbb04c048a7294976103e42f0f046641Jeff Brown } 4206f71d0fedbb04c048a7294976103e42f0f046641Jeff Brown 42146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown @SuppressWarnings("unused") 42246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown public VirtualKeyDefinition[] getVirtualKeyDefinitions(String deviceName) { 42346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown ArrayList<VirtualKeyDefinition> keys = new ArrayList<VirtualKeyDefinition>(); 42446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 42546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown try { 42646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown FileInputStream fis = new FileInputStream( 42746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown "/sys/board_properties/virtualkeys." + deviceName); 42846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown InputStreamReader isr = new InputStreamReader(fis); 42946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown BufferedReader br = new BufferedReader(isr, 2048); 43046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown String str = br.readLine(); 43146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown if (str != null) { 43246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown String[] it = str.split(":"); 43346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown if (DEBUG_VIRTUAL_KEYS) Slog.v(TAG, "***** VIRTUAL KEYS: " + it); 43446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown final int N = it.length-6; 43546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown for (int i=0; i<=N; i+=6) { 43646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown if (!"0x01".equals(it[i])) { 4378d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown Slog.w(TAG, "Unknown virtual key type at elem #" 4388d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown + i + ": " + it[i] + " for device " + deviceName); 43946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown continue; 44046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 44146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown try { 44246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown VirtualKeyDefinition key = new VirtualKeyDefinition(); 44346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown key.scanCode = Integer.parseInt(it[i+1]); 44446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown key.centerX = Integer.parseInt(it[i+2]); 44546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown key.centerY = Integer.parseInt(it[i+3]); 44646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown key.width = Integer.parseInt(it[i+4]); 44746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown key.height = Integer.parseInt(it[i+5]); 44846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown if (DEBUG_VIRTUAL_KEYS) Slog.v(TAG, "Virtual key " 44946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown + key.scanCode + ": center=" + key.centerX + "," 45046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown + key.centerY + " size=" + key.width + "x" 45146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown + key.height); 45246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown keys.add(key); 45346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } catch (NumberFormatException e) { 4548d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown Slog.w(TAG, "Bad number in virtual key definition at region " 4558d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown + i + " in: " + str + " for device " + deviceName, e); 45646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 45746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 45846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 45946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown br.close(); 46046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } catch (FileNotFoundException e) { 4618d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown Slog.i(TAG, "No virtual keys found for device " + deviceName + "."); 46246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } catch (IOException e) { 4638d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown Slog.w(TAG, "Error reading virtual keys for device " + deviceName + ".", e); 46446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 46546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 46646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown return keys.toArray(new VirtualKeyDefinition[keys.size()]); 46746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 46846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 46946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown @SuppressWarnings("unused") 4708d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown public InputDeviceCalibration getInputDeviceCalibration(String deviceName) { 4718d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown // Calibration is specified as a sequence of colon-delimited key value pairs. 4728d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown Properties properties = new Properties(); 4738d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown File calibrationFile = new File(Environment.getRootDirectory(), 4748d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown CALIBRATION_DIR_PATH + deviceName + ".idc"); 4758d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown if (calibrationFile.exists()) { 4768d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown try { 4778d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown properties.load(new FileInputStream(calibrationFile)); 4788d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown } catch (IOException ex) { 4798d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown Slog.w(TAG, "Error reading input device calibration properties for device " 4808d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown + deviceName + " from " + calibrationFile + ".", ex); 4818d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown } 4828d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown } else { 4838d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown Slog.i(TAG, "No input device calibration properties found for device " 4848d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown + deviceName + "."); 4858d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown return null; 4868d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown } 4878d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown 4888d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown InputDeviceCalibration calibration = new InputDeviceCalibration(); 4898d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown calibration.keys = properties.keySet().toArray(new String[properties.size()]); 4908d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown calibration.values = properties.values().toArray(new String[properties.size()]); 4918d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown return calibration; 4928d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown } 4938d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown 4948d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown @SuppressWarnings("unused") 49546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown public String[] getExcludedDeviceNames() { 49646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown ArrayList<String> names = new ArrayList<String>(); 49746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 49846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown // Read partner-provided list of excluded input devices 49946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown XmlPullParser parser = null; 50046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown // Environment.getRootDirectory() is a fancy way of saying ANDROID_ROOT or "/system". 50146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown File confFile = new File(Environment.getRootDirectory(), EXCLUDED_DEVICES_PATH); 50246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown FileReader confreader = null; 50346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown try { 50446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown confreader = new FileReader(confFile); 50546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown parser = Xml.newPullParser(); 50646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown parser.setInput(confreader); 50746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown XmlUtils.beginDocument(parser, "devices"); 50846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 50946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown while (true) { 51046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown XmlUtils.nextElement(parser); 51146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown if (!"device".equals(parser.getName())) { 51246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown break; 51346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 51446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown String name = parser.getAttributeValue(null, "name"); 51546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown if (name != null) { 51646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown names.add(name); 51746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 51846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 51946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } catch (FileNotFoundException e) { 52046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown // It's ok if the file does not exist. 52146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } catch (Exception e) { 52246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown Slog.e(TAG, "Exception while parsing '" + confFile.getAbsolutePath() + "'", e); 52346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } finally { 52446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown try { if (confreader != null) confreader.close(); } catch (IOException e) { } 52546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 52646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 52746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown return names.toArray(new String[names.size()]); 52846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 529ae9fc03bdccda709101291bbcd3beaa5b6daebfcJeff Brown 530ae9fc03bdccda709101291bbcd3beaa5b6daebfcJeff Brown @SuppressWarnings("unused") 531ae9fc03bdccda709101291bbcd3beaa5b6daebfcJeff Brown public int getMaxEventsPerSecond() { 532ae9fc03bdccda709101291bbcd3beaa5b6daebfcJeff Brown int result = 0; 533ae9fc03bdccda709101291bbcd3beaa5b6daebfcJeff Brown try { 534ae9fc03bdccda709101291bbcd3beaa5b6daebfcJeff Brown result = Integer.parseInt(SystemProperties.get("windowsmgr.max_events_per_sec")); 535ae9fc03bdccda709101291bbcd3beaa5b6daebfcJeff Brown } catch (NumberFormatException e) { 536ae9fc03bdccda709101291bbcd3beaa5b6daebfcJeff Brown } 537ae9fc03bdccda709101291bbcd3beaa5b6daebfcJeff Brown if (result < 1) { 5383d8c9bdbed0c31143227697bd0d94fd234fe08adJeff Brown result = 60; 539ae9fc03bdccda709101291bbcd3beaa5b6daebfcJeff Brown } 540ae9fc03bdccda709101291bbcd3beaa5b6daebfcJeff Brown return result; 541ae9fc03bdccda709101291bbcd3beaa5b6daebfcJeff Brown } 54246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 54346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} 544