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 } 766ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko // To destroy the activity to make sure next test case's activity launch check works well. 776ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko mDevice.pressBack(); 78816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko super.tearDown(); 79816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 80816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 81816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko /** 82816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * Send the keys for the channel number of {@code channel} and press the DPAD 83816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * center. 84816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * 85816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * <p>Usually this will tune to the given channel. 86816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko */ 87816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko protected void pressKeysForChannel(ChannelInfo channel) { 88816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko UiDeviceUtils.pressKeys(mDevice, channel.number); 8907b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko assertWaitForCondition(mDevice, Until.hasObject(Constants.KEYPAD_CHANNEL_SWITCH)); 90816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko mDevice.pressDPadCenter(); 91816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 92816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 93816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko /** 94816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * Update the channel state to {@code data} then tune to that channel. 95816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * 96816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * @param data the state to update the channel with. 97816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * @param channel the channel to tune to 98816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko */ 99816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko protected void updateThenTune(ChannelStateData data, ChannelInfo channel) { 100816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko mConnection.updateChannelState(channel, data); 101816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko pressKeysForChannel(channel); 102816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 103816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko} 104