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")) { 59797e4465fbc1f6a818e2905d17719e5df8c2a705Jeff Brown if (args.length == 2) { 60ca13fed08bf38c2f2811b3ec3f995d0ca57ac6acJeff Brown int keyCode = KeyEvent.keyCodeFromString(args[1]); 61ca13fed08bf38c2f2811b3ec3f995d0ca57ac6acJeff Brown if (keyCode == KeyEvent.KEYCODE_UNKNOWN) { 62ca13fed08bf38c2f2811b3ec3f995d0ca57ac6acJeff Brown keyCode = KeyEvent.keyCodeFromString("KEYCODE_" + args[1]); 63ca13fed08bf38c2f2811b3ec3f995d0ca57ac6acJeff Brown } 64ca13fed08bf38c2f2811b3ec3f995d0ca57ac6acJeff Brown sendKeyEvent(keyCode); 65797e4465fbc1f6a818e2905d17719e5df8c2a705Jeff Brown return; 66797e4465fbc1f6a818e2905d17719e5df8c2a705Jeff Brown } 67797e4465fbc1f6a818e2905d17719e5df8c2a705Jeff Brown } else if (command.equals("tap")) { 68797e4465fbc1f6a818e2905d17719e5df8c2a705Jeff Brown if (args.length == 3) { 69b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease sendTap(InputDevice.SOURCE_TOUCHSCREEN, Float.parseFloat(args[1]), Float.parseFloat(args[2])); 70797e4465fbc1f6a818e2905d17719e5df8c2a705Jeff Brown return; 71797e4465fbc1f6a818e2905d17719e5df8c2a705Jeff Brown } 72797e4465fbc1f6a818e2905d17719e5df8c2a705Jeff Brown } else if (command.equals("swipe")) { 73797e4465fbc1f6a818e2905d17719e5df8c2a705Jeff Brown if (args.length == 5) { 74b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease sendSwipe(InputDevice.SOURCE_TOUCHSCREEN, Float.parseFloat(args[1]), Float.parseFloat(args[2]), 75797e4465fbc1f6a818e2905d17719e5df8c2a705Jeff Brown Float.parseFloat(args[3]), Float.parseFloat(args[4])); 76797e4465fbc1f6a818e2905d17719e5df8c2a705Jeff Brown return; 77797e4465fbc1f6a818e2905d17719e5df8c2a705Jeff Brown } 78b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease } else if (command.equals("touchscreen") || command.equals("touchpad")) { 79b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease // determine input source 80b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease int inputSource = InputDevice.SOURCE_TOUCHSCREEN; 81b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease if (command.equals("touchpad")) { 82b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease inputSource = InputDevice.SOURCE_TOUCHPAD; 83b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease } 84b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease // determine subcommand 85b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease if (args.length > 1) { 86b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease String subcommand = args[1]; 87b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease if (subcommand.equals("tap")) { 88b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease if (args.length == 4) { 89b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease sendTap(inputSource, Float.parseFloat(args[2]), 90b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease Float.parseFloat(args[3])); 91b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease return; 92b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease } 93b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease } else if (subcommand.equals("swipe")) { 94b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease if (args.length == 6) { 95b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease sendSwipe(inputSource, Float.parseFloat(args[2]), 96b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease Float.parseFloat(args[3]), Float.parseFloat(args[4]), 97b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease Float.parseFloat(args[5])); 98b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease return; 99b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease } 100b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease } 101b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease } 102b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease } else if (command.equals("trackball")) { 103b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease // determine subcommand 104b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease if (args.length > 1) { 105b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease String subcommand = args[1]; 106b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease if (subcommand.equals("press")) { 107b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease sendTap(InputDevice.SOURCE_TRACKBALL, 0.0f, 0.0f); 108b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease return; 109b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease } else if (subcommand.equals("roll")) { 110b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease if (args.length == 4) { 111b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease sendMove(InputDevice.SOURCE_TRACKBALL, Float.parseFloat(args[2]), 112b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease Float.parseFloat(args[3])); 113b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease return; 114b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease } 115b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease } 116b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease } 117797e4465fbc1f6a818e2905d17719e5df8c2a705Jeff Brown } else { 118797e4465fbc1f6a818e2905d17719e5df8c2a705Jeff Brown System.err.println("Error: Unknown command: " + command); 119797e4465fbc1f6a818e2905d17719e5df8c2a705Jeff Brown showUsage(); 120797e4465fbc1f6a818e2905d17719e5df8c2a705Jeff Brown return; 121797e4465fbc1f6a818e2905d17719e5df8c2a705Jeff Brown } 122797e4465fbc1f6a818e2905d17719e5df8c2a705Jeff Brown } catch (NumberFormatException ex) { 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 124797e4465fbc1f6a818e2905d17719e5df8c2a705Jeff Brown System.err.println("Error: Invalid arguments for command: " + command); 125797e4465fbc1f6a818e2905d17719e5df8c2a705Jeff Brown showUsage(); 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Convert the characters of string text into key event's and send to 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * device. 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param text is a string of characters you want to input to the device. 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void sendText(String text) { 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project StringBuffer buff = new StringBuffer(text); 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean escapeFlag = false; 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<buff.length(); i++) { 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (escapeFlag) { 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project escapeFlag = false; 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (buff.charAt(i) == 's') { 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buff.setCharAt(i, ' '); 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buff.deleteCharAt(--i); 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (buff.charAt(i) == '%') { 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project escapeFlag = true; 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project char[] chars = buff.toString().toCharArray(); 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 154797e4465fbc1f6a818e2905d17719e5df8c2a705Jeff Brown KeyCharacterMap kcm = KeyCharacterMap.load(KeyCharacterMap.VIRTUAL_KEYBOARD); 155797e4465fbc1f6a818e2905d17719e5df8c2a705Jeff Brown KeyEvent[] events = kcm.getEvents(chars); 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for(int i = 0; i < events.length; i++) { 157797e4465fbc1f6a818e2905d17719e5df8c2a705Jeff Brown injectKeyEvent(events[i]); 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 161797e4465fbc1f6a818e2905d17719e5df8c2a705Jeff Brown private void sendKeyEvent(int keyCode) { 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long now = SystemClock.uptimeMillis(); 163ac14351e16e1258f1cb54e2bf772b8be004eb2b8Jeff Brown injectKeyEvent(new KeyEvent(now, now, KeyEvent.ACTION_DOWN, keyCode, 0, 0, 164ac14351e16e1258f1cb54e2bf772b8be004eb2b8Jeff Brown KeyCharacterMap.VIRTUAL_KEYBOARD, 0, 0, InputDevice.SOURCE_KEYBOARD)); 165ac14351e16e1258f1cb54e2bf772b8be004eb2b8Jeff Brown injectKeyEvent(new KeyEvent(now, now, KeyEvent.ACTION_UP, keyCode, 0, 0, 166ac14351e16e1258f1cb54e2bf772b8be004eb2b8Jeff Brown KeyCharacterMap.VIRTUAL_KEYBOARD, 0, 0, InputDevice.SOURCE_KEYBOARD)); 167797e4465fbc1f6a818e2905d17719e5df8c2a705Jeff Brown } 168797e4465fbc1f6a818e2905d17719e5df8c2a705Jeff Brown 169b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease private void sendTap(int inputSource, float x, float y) { 170797e4465fbc1f6a818e2905d17719e5df8c2a705Jeff Brown long now = SystemClock.uptimeMillis(); 171b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease injectMotionEvent(inputSource, MotionEvent.ACTION_DOWN, now, x, y, 1.0f); 172b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease injectMotionEvent(inputSource, MotionEvent.ACTION_UP, now, x, y, 0.0f); 173797e4465fbc1f6a818e2905d17719e5df8c2a705Jeff Brown } 174797e4465fbc1f6a818e2905d17719e5df8c2a705Jeff Brown 175b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease private void sendSwipe(int inputSource, float x1, float y1, float x2, float y2) { 176797e4465fbc1f6a818e2905d17719e5df8c2a705Jeff Brown final int NUM_STEPS = 11; 177797e4465fbc1f6a818e2905d17719e5df8c2a705Jeff Brown long now = SystemClock.uptimeMillis(); 178b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease injectMotionEvent(inputSource, MotionEvent.ACTION_DOWN, now, x1, y1, 1.0f); 179797e4465fbc1f6a818e2905d17719e5df8c2a705Jeff Brown for (int i = 1; i < NUM_STEPS; i++) { 180b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease float alpha = (float) i / NUM_STEPS; 181b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease injectMotionEvent(inputSource, MotionEvent.ACTION_MOVE, now, lerp(x1, x2, alpha), 182b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease lerp(y1, y2, alpha), 1.0f); 183797e4465fbc1f6a818e2905d17719e5df8c2a705Jeff Brown } 184b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease injectMotionEvent(inputSource, MotionEvent.ACTION_UP, now, x1, y1, 0.0f); 185b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease } 186b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease 187b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease /** 188b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease * Sends a simple zero-pressure move event. 189b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease * 190b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease * @param inputSource the InputDevice.SOURCE_* sending the input event 191b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease * @param dx change in x coordinate due to move 192b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease * @param dy change in y coordinate due to move 193b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease */ 194b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease private void sendMove(int inputSource, float dx, float dy) { 195b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease long now = SystemClock.uptimeMillis(); 196b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease injectMotionEvent(inputSource, MotionEvent.ACTION_MOVE, now, dx, dy, 0.0f); 197797e4465fbc1f6a818e2905d17719e5df8c2a705Jeff Brown } 198797e4465fbc1f6a818e2905d17719e5df8c2a705Jeff Brown 199797e4465fbc1f6a818e2905d17719e5df8c2a705Jeff Brown private void injectKeyEvent(KeyEvent event) { 200b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease Log.i(TAG, "injectKeyEvent: " + event); 2019f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown InputManager.getInstance().injectInputEvent(event, 2029f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown InputManager.INJECT_INPUT_EVENT_MODE_WAIT_FOR_FINISH); 203797e4465fbc1f6a818e2905d17719e5df8c2a705Jeff Brown } 204797e4465fbc1f6a818e2905d17719e5df8c2a705Jeff Brown 205b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease /** 206b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease * Builds a MotionEvent and injects it into the event stream. 207b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease * 208b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease * @param inputSource the InputDevice.SOURCE_* sending the input event 209b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease * @param action the MotionEvent.ACTION_* for the event 210b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease * @param when the value of SystemClock.uptimeMillis() at which the event happened 211b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease * @param x x coordinate of event 212b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease * @param y y coordinate of event 213b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease * @param pressure pressure of event 214b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease */ 215b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease private void injectMotionEvent(int inputSource, int action, long when, float x, float y, float pressure) { 216b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease final float DEFAULT_SIZE = 1.0f; 217b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease final int DEFAULT_META_STATE = 0; 218b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease final float DEFAULT_PRECISION_X = 1.0f; 219b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease final float DEFAULT_PRECISION_Y = 1.0f; 220b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease final int DEFAULT_DEVICE_ID = 0; 221b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease final int DEFAULT_EDGE_FLAGS = 0; 222b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease MotionEvent event = MotionEvent.obtain(when, when, action, x, y, pressure, DEFAULT_SIZE, 223b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease DEFAULT_META_STATE, DEFAULT_PRECISION_X, DEFAULT_PRECISION_Y, DEFAULT_DEVICE_ID, 224b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease DEFAULT_EDGE_FLAGS); 225b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease event.setSource(inputSource); 226b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease Log.i("Input", "injectMotionEvent: " + event); 2279f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown InputManager.getInstance().injectInputEvent(event, 2289f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown InputManager.INJECT_INPUT_EVENT_MODE_WAIT_FOR_FINISH); 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 231797e4465fbc1f6a818e2905d17719e5df8c2a705Jeff Brown private static final float lerp(float a, float b, float alpha) { 232797e4465fbc1f6a818e2905d17719e5df8c2a705Jeff Brown return (b - a) * alpha + a; 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void showUsage() { 236ac14351e16e1258f1cb54e2bf772b8be004eb2b8Jeff Brown System.err.println("usage: input ..."); 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(" input text <string>"); 238ca13fed08bf38c2f2811b3ec3f995d0ca57ac6acJeff Brown System.err.println(" input keyevent <key code number or name>"); 239b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease System.err.println(" input [touchscreen|touchpad] tap <x> <y>"); 240b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease System.err.println(" input [touchscreen|touchpad] swipe <x1> <y1> <x2> <y2>"); 241b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease System.err.println(" input trackball press"); 242b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease System.err.println(" input trackball roll <dx> <dy>"); 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 245