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 Chalko 17816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkopackage com.android.tv.tests.ui; 18816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 1907b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalkoimport static com.android.tv.testing.uihelper.UiDeviceAsserts.assertWaitForCondition; 2007b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko 21816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.content.Context; 22816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.content.res.Resources; 23816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.support.test.uiautomator.UiDevice; 2407b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalkoimport android.support.test.uiautomator.Until; 25816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.test.InstrumentationTestCase; 26816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 27816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport com.android.tv.testing.ChannelInfo; 28816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport com.android.tv.testing.testinput.ChannelStateData; 29816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport com.android.tv.testing.testinput.TestInputControlConnection; 30816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport com.android.tv.testing.testinput.TestInputControlUtils; 31816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport com.android.tv.testing.uihelper.Constants; 32816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport com.android.tv.testing.uihelper.LiveChannelsUiDeviceHelper; 33816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport com.android.tv.testing.uihelper.MenuHelper; 34ba5845f23b8fbc985890f892961abc8b39886611Nick Chalkoimport com.android.tv.testing.uihelper.SidePanelHelper; 35816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport com.android.tv.testing.uihelper.UiDeviceUtils; 36816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 37816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko/** 38816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * Base test case for LiveChannel UI tests. 39816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko */ 40816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkopublic abstract class LiveChannelsTestCase extends InstrumentationTestCase { 41816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko protected final TestInputControlConnection mConnection = new TestInputControlConnection(); 42816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 43816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko protected UiDevice mDevice; 44816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko protected Resources mTargetResources; 45816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko protected MenuHelper mMenuHelper; 46ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko protected SidePanelHelper mSidePanelHelper; 47816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko protected LiveChannelsUiDeviceHelper mLiveChannelsHelper; 48816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 49816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko @Override 50816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko protected void setUp() throws Exception { 51816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko super.setUp(); 52816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko Context context = getInstrumentation().getContext(); 53816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko context.bindService(TestInputControlUtils.createIntent(), mConnection, 54816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko Context.BIND_AUTO_CREATE); 55816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko mDevice = UiDevice.getInstance(getInstrumentation()); 56816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko mTargetResources = getInstrumentation().getTargetContext().getResources(); 57816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko mMenuHelper = new MenuHelper(mDevice, mTargetResources); 58ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko mSidePanelHelper = new SidePanelHelper(mDevice, mTargetResources); 59816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko mLiveChannelsHelper = new LiveChannelsUiDeviceHelper(mDevice, mTargetResources, context); 60816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 61816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 62816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko @Override 63816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko protected void tearDown() throws Exception { 64816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko if (mConnection.isBound()) { 65816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko getInstrumentation().getContext().unbindService(mConnection); 66816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 67816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 68816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko // TODO: robustly handle left over pops from failed tests. 69816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko // Clear any side panel, menu, ... 70816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko // Scene container should not be checked here because pressing the BACK key in some scenes 71816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko // might launch the home screen. 72816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko if (mDevice.hasObject(Constants.SIDE_PANEL) || mDevice.hasObject(Constants.MENU) || mDevice 73816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko .hasObject(Constants.PROGRAM_GUIDE)) { 74816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko mDevice.pressBack(); 75816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 76816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko super.tearDown(); 77816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 78816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 79816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko /** 80816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * Send the keys for the channel number of {@code channel} and press the DPAD 81816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * center. 82816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * 83816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * <p>Usually this will tune to the given channel. 84816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko */ 85816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko protected void pressKeysForChannel(ChannelInfo channel) { 86816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko UiDeviceUtils.pressKeys(mDevice, channel.number); 8707b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko assertWaitForCondition(mDevice, Until.hasObject(Constants.KEYPAD_CHANNEL_SWITCH)); 88816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko mDevice.pressDPadCenter(); 89816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 90816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 91816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko /** 92816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * Update the channel state to {@code data} then tune to that channel. 93816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * 94816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * @param data the state to update the channel with. 95816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * @param channel the channel to tune to 96816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko */ 97816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko protected void updateThenTune(ChannelStateData data, ChannelInfo channel) { 98816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko mConnection.updateChannelState(channel, data); 99816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko pressKeysForChannel(channel); 100816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 101816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko} 102