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