19d9c6a22548670bf017e69fd5d0f47134a18b53fChris Banes/*
29d9c6a22548670bf017e69fd5d0f47134a18b53fChris Banes * Copyright (C) 2015 The Android Open Source Project
39d9c6a22548670bf017e69fd5d0f47134a18b53fChris Banes *
49d9c6a22548670bf017e69fd5d0f47134a18b53fChris Banes * Licensed under the Apache License, Version 2.0 (the "License");
59d9c6a22548670bf017e69fd5d0f47134a18b53fChris Banes * you may not use this file except in compliance with the License.
69d9c6a22548670bf017e69fd5d0f47134a18b53fChris Banes * You may obtain a copy of the License at
79d9c6a22548670bf017e69fd5d0f47134a18b53fChris Banes *
89d9c6a22548670bf017e69fd5d0f47134a18b53fChris Banes *      http://www.apache.org/licenses/LICENSE-2.0
99d9c6a22548670bf017e69fd5d0f47134a18b53fChris Banes *
109d9c6a22548670bf017e69fd5d0f47134a18b53fChris Banes * Unless required by applicable law or agreed to in writing, software
119d9c6a22548670bf017e69fd5d0f47134a18b53fChris Banes * distributed under the License is distributed on an "AS IS" BASIS,
129d9c6a22548670bf017e69fd5d0f47134a18b53fChris Banes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139d9c6a22548670bf017e69fd5d0f47134a18b53fChris Banes * See the License for the specific language governing permissions and
149d9c6a22548670bf017e69fd5d0f47134a18b53fChris Banes * limitations under the License.
159d9c6a22548670bf017e69fd5d0f47134a18b53fChris Banes */
169d9c6a22548670bf017e69fd5d0f47134a18b53fChris Banes
179d9c6a22548670bf017e69fd5d0f47134a18b53fChris Banespackage android.support.v7.app;
189d9c6a22548670bf017e69fd5d0f47134a18b53fChris Banes
199a7543438e16c1e20c398fddc02fb48c30f1e5e2Aurimas Liutikasimport static org.junit.Assert.assertEquals;
209a7543438e16c1e20c398fddc02fb48c30f1e5e2Aurimas Liutikasimport static org.junit.Assert.assertNotNull;
219d9c6a22548670bf017e69fd5d0f47134a18b53fChris Banes
229d9c6a22548670bf017e69fd5d0f47134a18b53fChris Banesimport android.os.SystemClock;
23754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikasimport android.support.test.filters.SmallTest;
249d9c6a22548670bf017e69fd5d0f47134a18b53fChris Banesimport android.support.v7.appcompat.test.R;
2524391daa4e5831395924e2f48df86e19294cc211Chris Banesimport android.support.v7.testutils.BaseTestActivity;
269d9c6a22548670bf017e69fd5d0f47134a18b53fChris Banesimport android.view.KeyCharacterMap;
279d9c6a22548670bf017e69fd5d0f47134a18b53fChris Banesimport android.view.KeyEvent;
289d9c6a22548670bf017e69fd5d0f47134a18b53fChris Banesimport android.view.MenuItem;
299d9c6a22548670bf017e69fd5d0f47134a18b53fChris Banes
309a7543438e16c1e20c398fddc02fb48c30f1e5e2Aurimas Liutikasimport org.junit.Test;
3124391daa4e5831395924e2f48df86e19294cc211Chris Banes
329d9c6a22548670bf017e69fd5d0f47134a18b53fChris Banespublic abstract class BaseKeyboardShortcutsTestCase<A extends BaseTestActivity>
339d9c6a22548670bf017e69fd5d0f47134a18b53fChris Banes        extends BaseInstrumentationTestCase<A> {
349d9c6a22548670bf017e69fd5d0f47134a18b53fChris Banes
359d9c6a22548670bf017e69fd5d0f47134a18b53fChris Banes    protected BaseKeyboardShortcutsTestCase(Class<A> activityClass) {
369d9c6a22548670bf017e69fd5d0f47134a18b53fChris Banes        super(activityClass);
379d9c6a22548670bf017e69fd5d0f47134a18b53fChris Banes    }
389d9c6a22548670bf017e69fd5d0f47134a18b53fChris Banes
399d9c6a22548670bf017e69fd5d0f47134a18b53fChris Banes    @Test
40daea069fe33cc750bcb733ebcb6206d2dcedae76Chris Banes    @SmallTest
419d9c6a22548670bf017e69fd5d0f47134a18b53fChris Banes    public void testAlphabeticCtrlShortcut() {
429d9c6a22548670bf017e69fd5d0f47134a18b53fChris Banes        testKeyboardShortcut(KeyEvent.KEYCODE_A,
439d9c6a22548670bf017e69fd5d0f47134a18b53fChris Banes                KeyEvent.META_CTRL_ON | KeyEvent.META_CTRL_LEFT_ON,
449d9c6a22548670bf017e69fd5d0f47134a18b53fChris Banes                R.id.action_alpha_shortcut);
459d9c6a22548670bf017e69fd5d0f47134a18b53fChris Banes    }
469d9c6a22548670bf017e69fd5d0f47134a18b53fChris Banes
479d9c6a22548670bf017e69fd5d0f47134a18b53fChris Banes    private void testKeyboardShortcut(final int keyCode, final int meta, final int expectedId) {
489d9c6a22548670bf017e69fd5d0f47134a18b53fChris Banes        final long downTime = SystemClock.uptimeMillis();
499d9c6a22548670bf017e69fd5d0f47134a18b53fChris Banes        final KeyEvent downEvent = new KeyEvent(downTime, downTime, KeyEvent.ACTION_DOWN,
509d9c6a22548670bf017e69fd5d0f47134a18b53fChris Banes                keyCode, 0, meta, KeyCharacterMap.VIRTUAL_KEYBOARD, 0);
519d9c6a22548670bf017e69fd5d0f47134a18b53fChris Banes        getInstrumentation().sendKeySync(downEvent);
529d9c6a22548670bf017e69fd5d0f47134a18b53fChris Banes        getInstrumentation().waitForIdleSync();
539d9c6a22548670bf017e69fd5d0f47134a18b53fChris Banes
549d9c6a22548670bf017e69fd5d0f47134a18b53fChris Banes        final KeyEvent upEvent = new KeyEvent(downTime, downTime + 500, KeyEvent.ACTION_UP,
559d9c6a22548670bf017e69fd5d0f47134a18b53fChris Banes                keyCode, 0, meta, KeyCharacterMap.VIRTUAL_KEYBOARD, 0);
569d9c6a22548670bf017e69fd5d0f47134a18b53fChris Banes        getInstrumentation().sendKeySync(upEvent);
579d9c6a22548670bf017e69fd5d0f47134a18b53fChris Banes        getInstrumentation().waitForIdleSync();
589d9c6a22548670bf017e69fd5d0f47134a18b53fChris Banes
599d9c6a22548670bf017e69fd5d0f47134a18b53fChris Banes        MenuItem selectedItem = getActivity().getOptionsItemSelected();
609d9c6a22548670bf017e69fd5d0f47134a18b53fChris Banes        assertNotNull("Options item selected", selectedItem);
619d9c6a22548670bf017e69fd5d0f47134a18b53fChris Banes        assertEquals("Correct options item selected", selectedItem.getItemId(), expectedId);
629d9c6a22548670bf017e69fd5d0f47134a18b53fChris Banes    }
639d9c6a22548670bf017e69fd5d0f47134a18b53fChris Banes}
64