Input.java revision 2ac9d8d0f0ea65aae6ba43490b5be6617ad97125
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage com.android.commands.input; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19ac14351e16e1258f1cb54e2bf772b8be004eb2b8Jeff Brownimport android.hardware.input.InputManager; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.SystemClock; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log; 22ac14351e16e1258f1cb54e2bf772b8be004eb2b8Jeff Brownimport android.view.InputDevice; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.KeyCharacterMap; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.KeyEvent; 25797e4465fbc1f6a818e2905d17719e5df8c2a705Jeff Brownimport android.view.MotionEvent; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Command that sends key events to the device, either by their keycode, or by 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * desired character output. 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class Input { 33797e4465fbc1f6a818e2905d17719e5df8c2a705Jeff Brown private static final String TAG = "Input"; 34797e4465fbc1f6a818e2905d17719e5df8c2a705Jeff Brown 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Command-line entry point. 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param args The command-line arguments 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static void main(String[] args) { 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (new Input()).run(args); 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void run(String[] args) { 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (args.length < 1) { 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showUsage(); 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String command = args[0]; 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 52797e4465fbc1f6a818e2905d17719e5df8c2a705Jeff Brown try { 53797e4465fbc1f6a818e2905d17719e5df8c2a705Jeff Brown if (command.equals("text")) { 54797e4465fbc1f6a818e2905d17719e5df8c2a705Jeff Brown if (args.length == 2) { 55797e4465fbc1f6a818e2905d17719e5df8c2a705Jeff Brown sendText(args[1]); 56797e4465fbc1f6a818e2905d17719e5df8c2a705Jeff Brown return; 57797e4465fbc1f6a818e2905d17719e5df8c2a705Jeff Brown } 58797e4465fbc1f6a818e2905d17719e5df8c2a705Jeff Brown } else if (command.equals("keyevent")) { 592ac9d8d0f0ea65aae6ba43490b5be6617ad97125Diego Torres Milano if (args.length >= 2) { 602ac9d8d0f0ea65aae6ba43490b5be6617ad97125Diego Torres Milano for (int i=1; i < args.length; i++) { 612ac9d8d0f0ea65aae6ba43490b5be6617ad97125Diego Torres Milano int keyCode = KeyEvent.keyCodeFromString(args[i]); 622ac9d8d0f0ea65aae6ba43490b5be6617ad97125Diego Torres Milano if (keyCode == KeyEvent.KEYCODE_UNKNOWN) { 632ac9d8d0f0ea65aae6ba43490b5be6617ad97125Diego Torres Milano keyCode = KeyEvent.keyCodeFromString("KEYCODE_" + args[i]); 642ac9d8d0f0ea65aae6ba43490b5be6617ad97125Diego Torres Milano } 652ac9d8d0f0ea65aae6ba43490b5be6617ad97125Diego Torres Milano sendKeyEvent(keyCode); 66ca13fed08bf38c2f2811b3ec3f995d0ca57ac6acJeff Brown } 67797e4465fbc1f6a818e2905d17719e5df8c2a705Jeff Brown return; 68797e4465fbc1f6a818e2905d17719e5df8c2a705Jeff Brown } 69797e4465fbc1f6a818e2905d17719e5df8c2a705Jeff Brown } else if (command.equals("tap")) { 70797e4465fbc1f6a818e2905d17719e5df8c2a705Jeff Brown if (args.length == 3) { 71b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease sendTap(InputDevice.SOURCE_TOUCHSCREEN, Float.parseFloat(args[1]), Float.parseFloat(args[2])); 72797e4465fbc1f6a818e2905d17719e5df8c2a705Jeff Brown return; 73797e4465fbc1f6a818e2905d17719e5df8c2a705Jeff Brown } 74797e4465fbc1f6a818e2905d17719e5df8c2a705Jeff Brown } else if (command.equals("swipe")) { 75797e4465fbc1f6a818e2905d17719e5df8c2a705Jeff Brown if (args.length == 5) { 76b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease sendSwipe(InputDevice.SOURCE_TOUCHSCREEN, Float.parseFloat(args[1]), Float.parseFloat(args[2]), 77797e4465fbc1f6a818e2905d17719e5df8c2a705Jeff Brown Float.parseFloat(args[3]), Float.parseFloat(args[4])); 78797e4465fbc1f6a818e2905d17719e5df8c2a705Jeff Brown return; 79797e4465fbc1f6a818e2905d17719e5df8c2a705Jeff Brown } 80b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease } else if (command.equals("touchscreen") || command.equals("touchpad")) { 81b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease // determine input source 82b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease int inputSource = InputDevice.SOURCE_TOUCHSCREEN; 83b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease if (command.equals("touchpad")) { 84b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease inputSource = InputDevice.SOURCE_TOUCHPAD; 85b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease } 86b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease // determine subcommand 87b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease if (args.length > 1) { 88b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease String subcommand = args[1]; 89b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease if (subcommand.equals("tap")) { 90b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease if (args.length == 4) { 91b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease sendTap(inputSource, Float.parseFloat(args[2]), 92b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease Float.parseFloat(args[3])); 93b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease return; 94b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease } 95b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease } else if (subcommand.equals("swipe")) { 96b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease if (args.length == 6) { 97b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease sendSwipe(inputSource, Float.parseFloat(args[2]), 98b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease Float.parseFloat(args[3]), Float.parseFloat(args[4]), 99b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease Float.parseFloat(args[5])); 100b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease return; 101b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease } 102b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease } 103b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease } 104b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease } else if (command.equals("trackball")) { 105b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease // determine subcommand 106b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease if (args.length > 1) { 107b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease String subcommand = args[1]; 108b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease if (subcommand.equals("press")) { 109b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease sendTap(InputDevice.SOURCE_TRACKBALL, 0.0f, 0.0f); 110b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease return; 111b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease } else if (subcommand.equals("roll")) { 112b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease if (args.length == 4) { 113b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease sendMove(InputDevice.SOURCE_TRACKBALL, Float.parseFloat(args[2]), 114b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease Float.parseFloat(args[3])); 115b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease return; 116b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease } 117b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease } 118b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease } 119797e4465fbc1f6a818e2905d17719e5df8c2a705Jeff Brown } else { 120797e4465fbc1f6a818e2905d17719e5df8c2a705Jeff Brown System.err.println("Error: Unknown command: " + command); 121797e4465fbc1f6a818e2905d17719e5df8c2a705Jeff Brown showUsage(); 122797e4465fbc1f6a818e2905d17719e5df8c2a705Jeff Brown return; 123797e4465fbc1f6a818e2905d17719e5df8c2a705Jeff Brown } 124797e4465fbc1f6a818e2905d17719e5df8c2a705Jeff Brown } catch (NumberFormatException ex) { 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 126797e4465fbc1f6a818e2905d17719e5df8c2a705Jeff Brown System.err.println("Error: Invalid arguments for command: " + command); 127797e4465fbc1f6a818e2905d17719e5df8c2a705Jeff Brown showUsage(); 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Convert the characters of string text into key event's and send to 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * device. 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param text is a string of characters you want to input to the device. 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void sendText(String text) { 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project StringBuffer buff = new StringBuffer(text); 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean escapeFlag = false; 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<buff.length(); i++) { 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (escapeFlag) { 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project escapeFlag = false; 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (buff.charAt(i) == 's') { 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buff.setCharAt(i, ' '); 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buff.deleteCharAt(--i); 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (buff.charAt(i) == '%') { 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project escapeFlag = true; 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project char[] chars = buff.toString().toCharArray(); 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 156797e4465fbc1f6a818e2905d17719e5df8c2a705Jeff Brown KeyCharacterMap kcm = KeyCharacterMap.load(KeyCharacterMap.VIRTUAL_KEYBOARD); 157797e4465fbc1f6a818e2905d17719e5df8c2a705Jeff Brown KeyEvent[] events = kcm.getEvents(chars); 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for(int i = 0; i < events.length; i++) { 159797e4465fbc1f6a818e2905d17719e5df8c2a705Jeff Brown injectKeyEvent(events[i]); 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 163797e4465fbc1f6a818e2905d17719e5df8c2a705Jeff Brown private void sendKeyEvent(int keyCode) { 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long now = SystemClock.uptimeMillis(); 165ac14351e16e1258f1cb54e2bf772b8be004eb2b8Jeff Brown injectKeyEvent(new KeyEvent(now, now, KeyEvent.ACTION_DOWN, keyCode, 0, 0, 166ac14351e16e1258f1cb54e2bf772b8be004eb2b8Jeff Brown KeyCharacterMap.VIRTUAL_KEYBOARD, 0, 0, InputDevice.SOURCE_KEYBOARD)); 167ac14351e16e1258f1cb54e2bf772b8be004eb2b8Jeff Brown injectKeyEvent(new KeyEvent(now, now, KeyEvent.ACTION_UP, keyCode, 0, 0, 168ac14351e16e1258f1cb54e2bf772b8be004eb2b8Jeff Brown KeyCharacterMap.VIRTUAL_KEYBOARD, 0, 0, InputDevice.SOURCE_KEYBOARD)); 169797e4465fbc1f6a818e2905d17719e5df8c2a705Jeff Brown } 170797e4465fbc1f6a818e2905d17719e5df8c2a705Jeff Brown 171b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease private void sendTap(int inputSource, float x, float y) { 172797e4465fbc1f6a818e2905d17719e5df8c2a705Jeff Brown long now = SystemClock.uptimeMillis(); 173b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease injectMotionEvent(inputSource, MotionEvent.ACTION_DOWN, now, x, y, 1.0f); 174b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease injectMotionEvent(inputSource, MotionEvent.ACTION_UP, now, x, y, 0.0f); 175797e4465fbc1f6a818e2905d17719e5df8c2a705Jeff Brown } 176797e4465fbc1f6a818e2905d17719e5df8c2a705Jeff Brown 177b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease private void sendSwipe(int inputSource, float x1, float y1, float x2, float y2) { 178797e4465fbc1f6a818e2905d17719e5df8c2a705Jeff Brown final int NUM_STEPS = 11; 179797e4465fbc1f6a818e2905d17719e5df8c2a705Jeff Brown long now = SystemClock.uptimeMillis(); 180b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease injectMotionEvent(inputSource, MotionEvent.ACTION_DOWN, now, x1, y1, 1.0f); 181797e4465fbc1f6a818e2905d17719e5df8c2a705Jeff Brown for (int i = 1; i < NUM_STEPS; i++) { 182b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease float alpha = (float) i / NUM_STEPS; 183b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease injectMotionEvent(inputSource, MotionEvent.ACTION_MOVE, now, lerp(x1, x2, alpha), 184b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease lerp(y1, y2, alpha), 1.0f); 185797e4465fbc1f6a818e2905d17719e5df8c2a705Jeff Brown } 186b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease injectMotionEvent(inputSource, MotionEvent.ACTION_UP, now, x1, y1, 0.0f); 187b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease } 188b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease 189b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease /** 190b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease * Sends a simple zero-pressure move event. 191b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease * 192b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease * @param inputSource the InputDevice.SOURCE_* sending the input event 193b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease * @param dx change in x coordinate due to move 194b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease * @param dy change in y coordinate due to move 195b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease */ 196b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease private void sendMove(int inputSource, float dx, float dy) { 197b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease long now = SystemClock.uptimeMillis(); 198b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease injectMotionEvent(inputSource, MotionEvent.ACTION_MOVE, now, dx, dy, 0.0f); 199797e4465fbc1f6a818e2905d17719e5df8c2a705Jeff Brown } 200797e4465fbc1f6a818e2905d17719e5df8c2a705Jeff Brown 201797e4465fbc1f6a818e2905d17719e5df8c2a705Jeff Brown private void injectKeyEvent(KeyEvent event) { 202b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease Log.i(TAG, "injectKeyEvent: " + event); 2039f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown InputManager.getInstance().injectInputEvent(event, 2049f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown InputManager.INJECT_INPUT_EVENT_MODE_WAIT_FOR_FINISH); 205797e4465fbc1f6a818e2905d17719e5df8c2a705Jeff Brown } 206797e4465fbc1f6a818e2905d17719e5df8c2a705Jeff Brown 207b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease /** 208b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease * Builds a MotionEvent and injects it into the event stream. 209b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease * 210b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease * @param inputSource the InputDevice.SOURCE_* sending the input event 211b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease * @param action the MotionEvent.ACTION_* for the event 212b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease * @param when the value of SystemClock.uptimeMillis() at which the event happened 213b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease * @param x x coordinate of event 214b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease * @param y y coordinate of event 215b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease * @param pressure pressure of event 216b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease */ 217b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease private void injectMotionEvent(int inputSource, int action, long when, float x, float y, float pressure) { 218b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease final float DEFAULT_SIZE = 1.0f; 219b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease final int DEFAULT_META_STATE = 0; 220b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease final float DEFAULT_PRECISION_X = 1.0f; 221b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease final float DEFAULT_PRECISION_Y = 1.0f; 222b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease final int DEFAULT_DEVICE_ID = 0; 223b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease final int DEFAULT_EDGE_FLAGS = 0; 224b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease MotionEvent event = MotionEvent.obtain(when, when, action, x, y, pressure, DEFAULT_SIZE, 225b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease DEFAULT_META_STATE, DEFAULT_PRECISION_X, DEFAULT_PRECISION_Y, DEFAULT_DEVICE_ID, 226b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease DEFAULT_EDGE_FLAGS); 227b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease event.setSource(inputSource); 2282ac9d8d0f0ea65aae6ba43490b5be6617ad97125Diego Torres Milano Log.i(TAG, "injectMotionEvent: " + event); 2299f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown InputManager.getInstance().injectInputEvent(event, 2309f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown InputManager.INJECT_INPUT_EVENT_MODE_WAIT_FOR_FINISH); 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 233797e4465fbc1f6a818e2905d17719e5df8c2a705Jeff Brown private static final float lerp(float a, float b, float alpha) { 234797e4465fbc1f6a818e2905d17719e5df8c2a705Jeff Brown return (b - a) * alpha + a; 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void showUsage() { 238ac14351e16e1258f1cb54e2bf772b8be004eb2b8Jeff Brown System.err.println("usage: input ..."); 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(" input text <string>"); 2402ac9d8d0f0ea65aae6ba43490b5be6617ad97125Diego Torres Milano System.err.println(" input keyevent <key code number or name> ..."); 241b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease System.err.println(" input [touchscreen|touchpad] tap <x> <y>"); 242b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease System.err.println(" input [touchscreen|touchpad] swipe <x1> <y1> <x2> <y2>"); 243b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease System.err.println(" input trackball press"); 244b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease System.err.println(" input trackball roll <dx> <dy>"); 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 247