1816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko/* 2816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * Copyright (C) 2015 The Android Open Source Project 3816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * 4816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * Licensed under the Apache License, Version 2.0 (the "License"); 5816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * you may not use this file except in compliance with the License. 6816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * You may obtain a copy of the License at 7816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * 8816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * http://www.apache.org/licenses/LICENSE-2.0 9816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * 10816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * Unless required by applicable law or agreed to in writing, software 11816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * distributed under the License is distributed on an "AS IS" BASIS, 12816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * See the License for the specific language governing permissions and 14816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * limitations under the License. 15816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko */ 16816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkopackage com.android.tv.testing.uihelper; 17816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 186ebde20b03db4c0d57f67acaac11832b610b966bNick Chalkoimport static junit.framework.Assert.assertTrue; 196ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko 206ebde20b03db4c0d57f67acaac11832b610b966bNick Chalkoimport android.app.Instrumentation; 216ebde20b03db4c0d57f67acaac11832b610b966bNick Chalkoimport android.app.UiAutomation; 226ebde20b03db4c0d57f67acaac11832b610b966bNick Chalkoimport android.os.Build; 236ebde20b03db4c0d57f67acaac11832b610b966bNick Chalkoimport android.os.SystemClock; 246ebde20b03db4c0d57f67acaac11832b610b966bNick Chalkoimport android.support.test.uiautomator.Configurator; 25816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.support.test.uiautomator.Direction; 26816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.support.test.uiautomator.UiDevice; 276ebde20b03db4c0d57f67acaac11832b610b966bNick Chalkoimport android.view.InputDevice; 28816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.view.KeyEvent; 29816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 30816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko/** 31816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * Static utility methods for {@link UiDevice}. 32816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko */ 33816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkopublic final class UiDeviceUtils { 34816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 3507b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko public static void pressDpad(UiDevice uiDevice, Direction direction) { 36816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko switch (direction) { 37816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko case UP: 3807b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko uiDevice.pressDPadUp(); 3907b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko break; 40816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko case DOWN: 4107b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko uiDevice.pressDPadDown(); 4207b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko break; 43816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko case LEFT: 4407b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko uiDevice.pressDPadLeft(); 4507b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko break; 46816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko case RIGHT: 4707b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko uiDevice.pressDPadRight(); 4807b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko break; 49816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko default: 50816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko throw new IllegalArgumentException(direction.toString()); 51816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 52816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 53816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 54816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 55816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko public static void pressKeys(UiDevice uiDevice, int... keyCodes) { 56816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko for (int k : keyCodes) { 57816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko uiDevice.pressKeyCode(k); 58816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 59816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 60816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 61816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko /** 626ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko * Parses the string and sends the corresponding individual key presses. 63816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * <p> 64816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * <b>Note:</b> only handles 0-9, '.', and '-'. 65816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko */ 66816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko public static void pressKeys(UiDevice uiDevice, String keys) { 67816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko for (char c : keys.toCharArray()) { 68816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko if (c >= '0' && c <= '9') { 69816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko uiDevice.pressKeyCode(KeyEvent.KEYCODE_0 + c - '0'); 70816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } else if (c == '-') { 71816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko uiDevice.pressKeyCode(KeyEvent.KEYCODE_MINUS); 72816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } else if (c == '.') { 73816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko uiDevice.pressKeyCode(KeyEvent.KEYCODE_PERIOD); 74816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } else { 75816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko throw new IllegalArgumentException(c + " is not supported"); 76816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 77816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 78816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 79816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 806ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko /** 816ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko * Sends the DPAD Center key presses with the {@code repeat} count. 826ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko * TODO: Remove instrumentation argument once migrated to JUnit4. 836ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko */ 846ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko public static void pressDPadCenter(Instrumentation instrumentation, int repeat) { 856ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko pressKey(instrumentation, KeyEvent.KEYCODE_DPAD_CENTER, repeat); 866ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko } 876ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko 886ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko private static void pressKey(Instrumentation instrumentation, int keyCode, int repeat) { 896ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko UiDevice.getInstance(instrumentation).waitForIdle(); 906ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko for (int i = 0; i < repeat; ++i) { 916ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko assertPressKeyDown(instrumentation, keyCode, false); 926ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko if (i < repeat - 1) { 936ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko assertPressKeyUp(instrumentation, keyCode, false); 946ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko } 956ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko } 966ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko // Send last key event synchronously. 976ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko assertPressKeyUp(instrumentation, keyCode, true); 986ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko } 996ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko 1006ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko private static void assertPressKeyDown(Instrumentation instrumentation, int keyCode, 1016ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko boolean sync) { 1026ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko assertPressKey(instrumentation, KeyEvent.ACTION_DOWN, keyCode, sync); 1036ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko } 1046ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko 1056ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko private static void assertPressKeyUp(Instrumentation instrumentation, int keyCode, 1066ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko boolean sync) { 1076ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko assertPressKey(instrumentation, KeyEvent.ACTION_UP, keyCode, sync); 1086ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko } 1096ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko 1106ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko private static void assertPressKey(Instrumentation instrumentation, int action, int keyCode, 1116ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko boolean sync) { 1126ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko long eventTime = SystemClock.uptimeMillis(); 1136ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko KeyEvent event = new KeyEvent(eventTime, eventTime, action, keyCode, 0, 0, -1, 0, 0, 1146ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko InputDevice.SOURCE_KEYBOARD); 1156ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko assertTrue("Failed to inject key up event:" + event, 1166ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko injectEvent(instrumentation, event, sync)); 1176ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko } 1186ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko 1196ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko private static boolean injectEvent(Instrumentation instrumentation, KeyEvent event, 1206ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko boolean sync) { 1216ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko return getUiAutomation(instrumentation).injectInputEvent(event, sync); 1226ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko } 1236ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko 1246ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko private static UiAutomation getUiAutomation(Instrumentation instrumentation) { 1256ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { 1266ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko int flags = Configurator.getInstance().getUiAutomationFlags(); 1276ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko return instrumentation.getUiAutomation(flags); 1286ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko } else { 1296ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko return instrumentation.getUiAutomation(); 1306ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko } 1316ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko } 1326ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko 133816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko private UiDeviceUtils() { 134816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 135816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko} 136