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
171d3165f10b12165f02b7015ac1a817c5f60e6399Neal Nguyenpackage android.util;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.Instrumentation;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.SystemClock;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.test.ActivityInstrumentationTestCase;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.test.InstrumentationTestCase;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.Gravity;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.KeyCharacterMap;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.KeyEvent;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.MotionEvent;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.View;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.ViewConfiguration;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.ViewGroup;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Reusable methods for generating key events.
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Definitions:
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> Tap refers to pushing and releasing a button (down and up event).
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> Chord refers to pushing a modifier key, tapping a regular key, and
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * releasing the modifier key.
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class KeyUtils {
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Simulates tapping the menu key.
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param test The test case that is being run.
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static void tapMenuKey(ActivityInstrumentationTestCase test) {
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final Instrumentation inst = test.getInstrumentation();
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        inst.sendKeySync(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MENU));
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        inst.sendKeySync(new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_MENU));
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Simulates chording the menu key.
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param test The test case that is being run.
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param shortcutKey The shortcut key to tap while chording the menu key.
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static void chordMenuKey(ActivityInstrumentationTestCase test, char shortcutKey) {
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final Instrumentation inst = test.getInstrumentation();
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final KeyEvent pushMenuKey = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MENU);
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final KeyCharacterMap keyCharMap = KeyCharacterMap.load(pushMenuKey.getDeviceId());
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final KeyEvent shortcutKeyEvent = keyCharMap.getEvents(new char[] { shortcutKey })[0];
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int shortcutKeyCode = shortcutKeyEvent.getKeyCode();
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        inst.sendKeySync(pushMenuKey);
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        inst.sendKeySync(new KeyEvent(KeyEvent.ACTION_DOWN, shortcutKeyCode));
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        inst.sendKeySync(new KeyEvent(KeyEvent.ACTION_UP, shortcutKeyCode));
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        inst.sendKeySync(new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_MENU));
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Simulates a long click via the keyboard.
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param test The test case that is being run.
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static void longClick(ActivityInstrumentationTestCase test) {
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final Instrumentation inst = test.getInstrumentation();
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        inst.sendKeySync(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DPAD_CENTER));
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Thread.sleep((long)(ViewConfiguration.getLongPressTimeout() * 1.5f));
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (InterruptedException e) {
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            e.printStackTrace();
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        inst.sendKeySync(new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_DPAD_CENTER));
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
88869dd39c5a9c1e55a1d7ab796a05e5e710dff348Andrei Stingaceanu
89869dd39c5a9c1e55a1d7ab796a05e5e710dff348Andrei Stingaceanu    /**
90869dd39c5a9c1e55a1d7ab796a05e5e710dff348Andrei Stingaceanu     * Generates a {@link KeyEvent}.
91869dd39c5a9c1e55a1d7ab796a05e5e710dff348Andrei Stingaceanu     *
92869dd39c5a9c1e55a1d7ab796a05e5e710dff348Andrei Stingaceanu     * @param keycode The integer keycode for the event to be generated.
93869dd39c5a9c1e55a1d7ab796a05e5e710dff348Andrei Stingaceanu     * @param keyEventAction The integer {@link KeyEvent} action code.
94869dd39c5a9c1e55a1d7ab796a05e5e710dff348Andrei Stingaceanu     * @param metaState Flags indicating which meta keys are currently pressed.
95869dd39c5a9c1e55a1d7ab796a05e5e710dff348Andrei Stingaceanu     *
96869dd39c5a9c1e55a1d7ab796a05e5e710dff348Andrei Stingaceanu     * @return a new {@link KeyEvent} for current time.
97869dd39c5a9c1e55a1d7ab796a05e5e710dff348Andrei Stingaceanu     */
98869dd39c5a9c1e55a1d7ab796a05e5e710dff348Andrei Stingaceanu    public static KeyEvent generateKeyEvent(int keycode, int keyEventAction, int metaState) {
99869dd39c5a9c1e55a1d7ab796a05e5e710dff348Andrei Stingaceanu        long currentTime = System.currentTimeMillis();
100869dd39c5a9c1e55a1d7ab796a05e5e710dff348Andrei Stingaceanu        return new KeyEvent(currentTime, currentTime, keyEventAction, keycode,
101869dd39c5a9c1e55a1d7ab796a05e5e710dff348Andrei Stingaceanu            0 /* repeat */, metaState);
102869dd39c5a9c1e55a1d7ab796a05e5e710dff348Andrei Stingaceanu    }
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
104