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