1 /* 2 * Copyright (C) 2022 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.server.input; 18 19 import android.content.Context; 20 import android.hardware.display.DisplayViewport; 21 import android.hardware.input.InputSensorInfo; 22 import android.hardware.lights.Light; 23 import android.os.IBinder; 24 import android.os.MessageQueue; 25 import android.util.SparseArray; 26 import android.view.InputApplicationHandle; 27 import android.view.InputChannel; 28 import android.view.InputEvent; 29 import android.view.PointerIcon; 30 import android.view.VerifiedInputEvent; 31 32 import com.android.internal.annotations.VisibleForTesting; 33 34 import java.util.List; 35 36 /** 37 * An interface for the native methods of InputManagerService. We use a public interface so that 38 * this can be mocked for testing by Mockito. 39 */ 40 @VisibleForTesting 41 public interface NativeInputManagerService { 42 start()43 void start(); 44 setDisplayViewports(DisplayViewport[] viewports)45 void setDisplayViewports(DisplayViewport[] viewports); 46 getScanCodeState(int deviceId, int sourceMask, int scanCode)47 int getScanCodeState(int deviceId, int sourceMask, int scanCode); 48 getKeyCodeState(int deviceId, int sourceMask, int keyCode)49 int getKeyCodeState(int deviceId, int sourceMask, int keyCode); 50 getSwitchState(int deviceId, int sourceMask, int sw)51 int getSwitchState(int deviceId, int sourceMask, int sw); 52 hasKeys(int deviceId, int sourceMask, int[] keyCodes, boolean[] keyExists)53 boolean hasKeys(int deviceId, int sourceMask, int[] keyCodes, boolean[] keyExists); 54 getKeyCodeForKeyLocation(int deviceId, int locationKeyCode)55 int getKeyCodeForKeyLocation(int deviceId, int locationKeyCode); 56 createInputChannel(String name)57 InputChannel createInputChannel(String name); 58 createInputMonitor(int displayId, String name, int pid)59 InputChannel createInputMonitor(int displayId, String name, int pid); 60 removeInputChannel(IBinder connectionToken)61 void removeInputChannel(IBinder connectionToken); 62 pilferPointers(IBinder token)63 void pilferPointers(IBinder token); 64 setInputFilterEnabled(boolean enable)65 void setInputFilterEnabled(boolean enable); 66 setInTouchMode(boolean inTouchMode, int pid, int uid, boolean hasPermission)67 boolean setInTouchMode(boolean inTouchMode, int pid, int uid, boolean hasPermission); 68 setMaximumObscuringOpacityForTouch(float opacity)69 void setMaximumObscuringOpacityForTouch(float opacity); 70 setBlockUntrustedTouchesMode(int mode)71 void setBlockUntrustedTouchesMode(int mode); 72 73 /** 74 * Inject an input event into the system. 75 * 76 * @param event the input event to inject 77 * @param injectIntoUid true if the event should target windows owned by uid, false otherwise 78 * @param uid the uid whose windows should be targeted, if any 79 * @param syncMode {@link android.os.InputEventInjectionSync} 80 * @param timeoutMillis timeout to wait for input injection to complete, in milliseconds 81 * @param policyFlags defined in {@link android.view.WindowManagerPolicyConstants} 82 * @return {@link android.os.InputEventInjectionResult} 83 */ injectInputEvent(InputEvent event, boolean injectIntoUid, int uid, int syncMode, int timeoutMillis, int policyFlags)84 int injectInputEvent(InputEvent event, boolean injectIntoUid, int uid, int syncMode, 85 int timeoutMillis, int policyFlags); 86 verifyInputEvent(InputEvent event)87 VerifiedInputEvent verifyInputEvent(InputEvent event); 88 toggleCapsLock(int deviceId)89 void toggleCapsLock(int deviceId); 90 displayRemoved(int displayId)91 void displayRemoved(int displayId); 92 setInputDispatchMode(boolean enabled, boolean frozen)93 void setInputDispatchMode(boolean enabled, boolean frozen); 94 setSystemUiLightsOut(boolean lightsOut)95 void setSystemUiLightsOut(boolean lightsOut); 96 setFocusedApplication(int displayId, InputApplicationHandle application)97 void setFocusedApplication(int displayId, InputApplicationHandle application); 98 setFocusedDisplay(int displayId)99 void setFocusedDisplay(int displayId); 100 transferTouchFocus(IBinder fromChannelToken, IBinder toChannelToken, boolean isDragDrop)101 boolean transferTouchFocus(IBinder fromChannelToken, IBinder toChannelToken, 102 boolean isDragDrop); 103 104 /** 105 * Transfer the current touch gesture to the window identified by 'destChannelToken' positioned 106 * on display with id 'displayId'. 107 */ transferTouch(IBinder destChannelToken, int displayId)108 boolean transferTouch(IBinder destChannelToken, int displayId); 109 setPointerSpeed(int speed)110 void setPointerSpeed(int speed); 111 setPointerAcceleration(float acceleration)112 void setPointerAcceleration(float acceleration); 113 setShowTouches(boolean enabled)114 void setShowTouches(boolean enabled); 115 setInteractive(boolean interactive)116 void setInteractive(boolean interactive); 117 reloadCalibration()118 void reloadCalibration(); 119 vibrate(int deviceId, long[] pattern, int[] amplitudes, int repeat, int token)120 void vibrate(int deviceId, long[] pattern, int[] amplitudes, int repeat, int token); 121 vibrateCombined(int deviceId, long[] pattern, SparseArray<int[]> amplitudes, int repeat, int token)122 void vibrateCombined(int deviceId, long[] pattern, SparseArray<int[]> amplitudes, 123 int repeat, int token); 124 cancelVibrate(int deviceId, int token)125 void cancelVibrate(int deviceId, int token); 126 isVibrating(int deviceId)127 boolean isVibrating(int deviceId); 128 getVibratorIds(int deviceId)129 int[] getVibratorIds(int deviceId); 130 getBatteryCapacity(int deviceId)131 int getBatteryCapacity(int deviceId); 132 getBatteryStatus(int deviceId)133 int getBatteryStatus(int deviceId); 134 getLights(int deviceId)135 List<Light> getLights(int deviceId); 136 getLightPlayerId(int deviceId, int lightId)137 int getLightPlayerId(int deviceId, int lightId); 138 getLightColor(int deviceId, int lightId)139 int getLightColor(int deviceId, int lightId); 140 setLightPlayerId(int deviceId, int lightId, int playerId)141 void setLightPlayerId(int deviceId, int lightId, int playerId); 142 setLightColor(int deviceId, int lightId, int color)143 void setLightColor(int deviceId, int lightId, int color); 144 reloadKeyboardLayouts()145 void reloadKeyboardLayouts(); 146 reloadDeviceAliases()147 void reloadDeviceAliases(); 148 dump()149 String dump(); 150 monitor()151 void monitor(); 152 isInputDeviceEnabled(int deviceId)153 boolean isInputDeviceEnabled(int deviceId); 154 enableInputDevice(int deviceId)155 void enableInputDevice(int deviceId); 156 disableInputDevice(int deviceId)157 void disableInputDevice(int deviceId); 158 setPointerIconType(int iconId)159 void setPointerIconType(int iconId); 160 reloadPointerIcons()161 void reloadPointerIcons(); 162 setCustomPointerIcon(PointerIcon icon)163 void setCustomPointerIcon(PointerIcon icon); 164 requestPointerCapture(IBinder windowToken, boolean enabled)165 void requestPointerCapture(IBinder windowToken, boolean enabled); 166 canDispatchToDisplay(int deviceId, int displayId)167 boolean canDispatchToDisplay(int deviceId, int displayId); 168 notifyPortAssociationsChanged()169 void notifyPortAssociationsChanged(); 170 changeUniqueIdAssociation()171 void changeUniqueIdAssociation(); 172 notifyPointerDisplayIdChanged()173 void notifyPointerDisplayIdChanged(); 174 setDisplayEligibilityForPointerCapture(int displayId, boolean enabled)175 void setDisplayEligibilityForPointerCapture(int displayId, boolean enabled); 176 setMotionClassifierEnabled(boolean enabled)177 void setMotionClassifierEnabled(boolean enabled); 178 getSensorList(int deviceId)179 InputSensorInfo[] getSensorList(int deviceId); 180 flushSensor(int deviceId, int sensorType)181 boolean flushSensor(int deviceId, int sensorType); 182 enableSensor(int deviceId, int sensorType, int samplingPeriodUs, int maxBatchReportLatencyUs)183 boolean enableSensor(int deviceId, int sensorType, int samplingPeriodUs, 184 int maxBatchReportLatencyUs); 185 disableSensor(int deviceId, int sensorType)186 void disableSensor(int deviceId, int sensorType); 187 cancelCurrentTouch()188 void cancelCurrentTouch(); 189 190 /** Set the displayId on which the mouse cursor should be shown. */ setPointerDisplayId(int displayId)191 void setPointerDisplayId(int displayId); 192 193 /** The native implementation of InputManagerService methods. */ 194 class NativeImpl implements NativeInputManagerService { 195 /** Pointer to native input manager service object, used by native code. */ 196 @SuppressWarnings({"unused", "FieldCanBeLocal"}) 197 private final long mPtr; 198 NativeImpl(InputManagerService service, Context context, MessageQueue messageQueue)199 NativeImpl(InputManagerService service, Context context, MessageQueue messageQueue) { 200 mPtr = init(service, context, messageQueue); 201 } 202 init(InputManagerService service, Context context, MessageQueue messageQueue)203 private native long init(InputManagerService service, Context context, 204 MessageQueue messageQueue); 205 206 @Override start()207 public native void start(); 208 209 @Override setDisplayViewports(DisplayViewport[] viewports)210 public native void setDisplayViewports(DisplayViewport[] viewports); 211 212 @Override getScanCodeState(int deviceId, int sourceMask, int scanCode)213 public native int getScanCodeState(int deviceId, int sourceMask, int scanCode); 214 215 @Override getKeyCodeState(int deviceId, int sourceMask, int keyCode)216 public native int getKeyCodeState(int deviceId, int sourceMask, int keyCode); 217 218 @Override getSwitchState(int deviceId, int sourceMask, int sw)219 public native int getSwitchState(int deviceId, int sourceMask, int sw); 220 221 @Override hasKeys(int deviceId, int sourceMask, int[] keyCodes, boolean[] keyExists)222 public native boolean hasKeys(int deviceId, int sourceMask, int[] keyCodes, 223 boolean[] keyExists); 224 225 @Override getKeyCodeForKeyLocation(int deviceId, int locationKeyCode)226 public native int getKeyCodeForKeyLocation(int deviceId, int locationKeyCode); 227 228 @Override createInputChannel(String name)229 public native InputChannel createInputChannel(String name); 230 231 @Override createInputMonitor(int displayId, String name, int pid)232 public native InputChannel createInputMonitor(int displayId, String name, int pid); 233 234 @Override removeInputChannel(IBinder connectionToken)235 public native void removeInputChannel(IBinder connectionToken); 236 237 @Override pilferPointers(IBinder token)238 public native void pilferPointers(IBinder token); 239 240 @Override setInputFilterEnabled(boolean enable)241 public native void setInputFilterEnabled(boolean enable); 242 243 @Override setInTouchMode(boolean inTouchMode, int pid, int uid, boolean hasPermission)244 public native boolean setInTouchMode(boolean inTouchMode, int pid, int uid, 245 boolean hasPermission); 246 247 @Override setMaximumObscuringOpacityForTouch(float opacity)248 public native void setMaximumObscuringOpacityForTouch(float opacity); 249 250 @Override setBlockUntrustedTouchesMode(int mode)251 public native void setBlockUntrustedTouchesMode(int mode); 252 253 @Override injectInputEvent(InputEvent event, boolean injectIntoUid, int uid, int syncMode, int timeoutMillis, int policyFlags)254 public native int injectInputEvent(InputEvent event, boolean injectIntoUid, int uid, 255 int syncMode, 256 int timeoutMillis, int policyFlags); 257 258 @Override verifyInputEvent(InputEvent event)259 public native VerifiedInputEvent verifyInputEvent(InputEvent event); 260 261 @Override toggleCapsLock(int deviceId)262 public native void toggleCapsLock(int deviceId); 263 264 @Override displayRemoved(int displayId)265 public native void displayRemoved(int displayId); 266 267 @Override setInputDispatchMode(boolean enabled, boolean frozen)268 public native void setInputDispatchMode(boolean enabled, boolean frozen); 269 270 @Override setSystemUiLightsOut(boolean lightsOut)271 public native void setSystemUiLightsOut(boolean lightsOut); 272 273 @Override setFocusedApplication(int displayId, InputApplicationHandle application)274 public native void setFocusedApplication(int displayId, InputApplicationHandle application); 275 276 @Override setFocusedDisplay(int displayId)277 public native void setFocusedDisplay(int displayId); 278 279 @Override transferTouchFocus(IBinder fromChannelToken, IBinder toChannelToken, boolean isDragDrop)280 public native boolean transferTouchFocus(IBinder fromChannelToken, IBinder toChannelToken, 281 boolean isDragDrop); 282 283 @Override transferTouch(IBinder destChannelToken, int displayId)284 public native boolean transferTouch(IBinder destChannelToken, int displayId); 285 286 @Override setPointerSpeed(int speed)287 public native void setPointerSpeed(int speed); 288 289 @Override setPointerAcceleration(float acceleration)290 public native void setPointerAcceleration(float acceleration); 291 292 @Override setShowTouches(boolean enabled)293 public native void setShowTouches(boolean enabled); 294 295 @Override setInteractive(boolean interactive)296 public native void setInteractive(boolean interactive); 297 298 @Override reloadCalibration()299 public native void reloadCalibration(); 300 301 @Override vibrate(int deviceId, long[] pattern, int[] amplitudes, int repeat, int token)302 public native void vibrate(int deviceId, long[] pattern, int[] amplitudes, int repeat, 303 int token); 304 305 @Override vibrateCombined(int deviceId, long[] pattern, SparseArray<int[]> amplitudes, int repeat, int token)306 public native void vibrateCombined(int deviceId, long[] pattern, 307 SparseArray<int[]> amplitudes, 308 int repeat, int token); 309 310 @Override cancelVibrate(int deviceId, int token)311 public native void cancelVibrate(int deviceId, int token); 312 313 @Override isVibrating(int deviceId)314 public native boolean isVibrating(int deviceId); 315 316 @Override getVibratorIds(int deviceId)317 public native int[] getVibratorIds(int deviceId); 318 319 @Override getBatteryCapacity(int deviceId)320 public native int getBatteryCapacity(int deviceId); 321 322 @Override getBatteryStatus(int deviceId)323 public native int getBatteryStatus(int deviceId); 324 325 @Override getLights(int deviceId)326 public native List<Light> getLights(int deviceId); 327 328 @Override getLightPlayerId(int deviceId, int lightId)329 public native int getLightPlayerId(int deviceId, int lightId); 330 331 @Override getLightColor(int deviceId, int lightId)332 public native int getLightColor(int deviceId, int lightId); 333 334 @Override setLightPlayerId(int deviceId, int lightId, int playerId)335 public native void setLightPlayerId(int deviceId, int lightId, int playerId); 336 337 @Override setLightColor(int deviceId, int lightId, int color)338 public native void setLightColor(int deviceId, int lightId, int color); 339 340 @Override reloadKeyboardLayouts()341 public native void reloadKeyboardLayouts(); 342 343 @Override reloadDeviceAliases()344 public native void reloadDeviceAliases(); 345 346 @Override dump()347 public native String dump(); 348 349 @Override monitor()350 public native void monitor(); 351 352 @Override isInputDeviceEnabled(int deviceId)353 public native boolean isInputDeviceEnabled(int deviceId); 354 355 @Override enableInputDevice(int deviceId)356 public native void enableInputDevice(int deviceId); 357 358 @Override disableInputDevice(int deviceId)359 public native void disableInputDevice(int deviceId); 360 361 @Override setPointerIconType(int iconId)362 public native void setPointerIconType(int iconId); 363 364 @Override reloadPointerIcons()365 public native void reloadPointerIcons(); 366 367 @Override setCustomPointerIcon(PointerIcon icon)368 public native void setCustomPointerIcon(PointerIcon icon); 369 370 @Override requestPointerCapture(IBinder windowToken, boolean enabled)371 public native void requestPointerCapture(IBinder windowToken, boolean enabled); 372 373 @Override canDispatchToDisplay(int deviceId, int displayId)374 public native boolean canDispatchToDisplay(int deviceId, int displayId); 375 376 @Override notifyPortAssociationsChanged()377 public native void notifyPortAssociationsChanged(); 378 379 @Override changeUniqueIdAssociation()380 public native void changeUniqueIdAssociation(); 381 382 @Override notifyPointerDisplayIdChanged()383 public native void notifyPointerDisplayIdChanged(); 384 385 @Override setDisplayEligibilityForPointerCapture(int displayId, boolean enabled)386 public native void setDisplayEligibilityForPointerCapture(int displayId, boolean enabled); 387 388 @Override setMotionClassifierEnabled(boolean enabled)389 public native void setMotionClassifierEnabled(boolean enabled); 390 391 @Override getSensorList(int deviceId)392 public native InputSensorInfo[] getSensorList(int deviceId); 393 394 @Override flushSensor(int deviceId, int sensorType)395 public native boolean flushSensor(int deviceId, int sensorType); 396 397 @Override enableSensor(int deviceId, int sensorType, int samplingPeriodUs, int maxBatchReportLatencyUs)398 public native boolean enableSensor(int deviceId, int sensorType, int samplingPeriodUs, 399 int maxBatchReportLatencyUs); 400 401 @Override disableSensor(int deviceId, int sensorType)402 public native void disableSensor(int deviceId, int sensorType); 403 404 @Override cancelCurrentTouch()405 public native void cancelCurrentTouch(); 406 407 @Override setPointerDisplayId(int displayId)408 public native void setPointerDisplayId(int displayId); 409 } 410 } 411