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