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