PlaybackSupportFragmentTest.java revision e2104f4b5c8e3ad63570306a25e61502dfe4c418
1// CHECKSTYLE:OFF Generated code
2/* This file is auto-generated from PlaybackFragmentTest.java.  DO NOT MODIFY. */
3
4/*
5 * Copyright (C) 2016 The Android Open Source Project
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 *      http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 */
19package android.support.v17.leanback.app;
20
21import static org.junit.Assert.assertNull;
22import static org.junit.Assert.assertSame;
23import static org.junit.Assert.assertTrue;
24import static org.mockito.Matchers.any;
25import static org.mockito.Mockito.times;
26import static org.mockito.Mockito.verify;
27
28import android.support.test.filters.MediumTest;
29import android.support.test.runner.AndroidJUnit4;
30import android.support.v17.leanback.media.PlaybackControlGlue;
31import android.support.v17.leanback.media.PlaybackGlue;
32import android.support.v17.leanback.testutils.PollingCheck;
33import android.support.v17.leanback.widget.ListRow;
34import android.support.v17.leanback.widget.OnItemViewClickedListener;
35import android.support.v17.leanback.widget.OnItemViewSelectedListener;
36import android.support.v17.leanback.widget.PlaybackControlsRow;
37import android.support.v17.leanback.widget.Presenter;
38import android.support.v17.leanback.widget.Row;
39import android.support.v17.leanback.widget.RowPresenter;
40import android.support.v17.leanback.widget.SparseArrayObjectAdapter;
41import android.view.KeyEvent;
42
43import org.junit.Test;
44import org.junit.runner.RunWith;
45import org.mockito.ArgumentCaptor;
46import org.mockito.Mockito;
47
48@MediumTest
49@RunWith(AndroidJUnit4.class)
50public class PlaybackSupportFragmentTest extends SingleSupportFragmentTestBase {
51
52    private static final String TAG = "PlaybackSupportFragmentTest";
53    private static final long TRANSITION_LENGTH = 1000;
54
55    @Test
56    public void testDetachCalledWhenDestroyFragment() throws Throwable {
57        launchAndWaitActivity(PlaybackTestSupportFragment.class, 1000);
58        final PlaybackTestSupportFragment fragment = (PlaybackTestSupportFragment) mActivity.getTestFragment();
59        PlaybackGlue glue = fragment.getGlue();
60        activityTestRule.runOnUiThread(new Runnable() {
61            @Override
62            public void run() {
63                mActivity.finish();
64            }
65        });
66        PollingCheck.waitFor(new PollingCheck.PollingCheckCondition() {
67            @Override
68            public boolean canProceed() {
69                return fragment.mDestroyCalled;
70            }
71        });
72        assertNull(glue.getHost());
73    }
74
75    @Test
76    public void testSelectedListener() throws Throwable {
77        launchAndWaitActivity(PlaybackTestSupportFragment.class, 1000);
78        PlaybackTestSupportFragment fragment = (PlaybackTestSupportFragment) mActivity.getTestFragment();
79
80        assertTrue(fragment.getView().hasFocus());
81
82        OnItemViewSelectedListener selectedListener = Mockito.mock(
83                OnItemViewSelectedListener.class);
84        fragment.setOnItemViewSelectedListener(selectedListener);
85
86
87        PlaybackControlsRow controlsRow = fragment.getGlue().getControlsRow();
88        SparseArrayObjectAdapter primaryActionsAdapter = (SparseArrayObjectAdapter)
89                controlsRow.getPrimaryActionsAdapter();
90
91        PlaybackControlsRow.MultiAction playPause = (PlaybackControlsRow.MultiAction)
92                primaryActionsAdapter.lookup(PlaybackControlGlue.ACTION_PLAY_PAUSE);
93
94        PlaybackControlsRow.MultiAction rewind = (PlaybackControlsRow.MultiAction)
95                primaryActionsAdapter.lookup(PlaybackControlGlue.ACTION_REWIND);
96
97        PlaybackControlsRow.MultiAction thumbsUp = (PlaybackControlsRow.MultiAction)
98                primaryActionsAdapter.lookup(PlaybackControlGlue.ACTION_CUSTOM_LEFT_FIRST);
99
100        ArgumentCaptor<Presenter.ViewHolder> itemVHCaptor =
101                ArgumentCaptor.forClass(Presenter.ViewHolder.class);
102        ArgumentCaptor<Object> itemCaptor = ArgumentCaptor.forClass(Object.class);
103        ArgumentCaptor<RowPresenter.ViewHolder> rowVHCaptor =
104                ArgumentCaptor.forClass(RowPresenter.ViewHolder.class);
105        ArgumentCaptor<Row> rowCaptor = ArgumentCaptor.forClass(Row.class);
106
107
108        // First navigate left within PlaybackControlsRow items.
109        verify(selectedListener, times(0)).onItemSelected(any(Presenter.ViewHolder.class),
110                any(Object.class), any(RowPresenter.ViewHolder.class), any(Row.class));
111        sendKeys(KeyEvent.KEYCODE_DPAD_LEFT);
112        Thread.sleep(TRANSITION_LENGTH);
113        verify(selectedListener, times(1)).onItemSelected(itemVHCaptor.capture(),
114                itemCaptor.capture(), rowVHCaptor.capture(), rowCaptor.capture());
115        assertSame("Same controls row should be passed to the listener", controlsRow,
116                rowCaptor.getValue());
117        assertSame("The selected action should be rewind", rewind, itemCaptor.getValue());
118
119        sendKeys(KeyEvent.KEYCODE_DPAD_LEFT);
120        Thread.sleep(TRANSITION_LENGTH);
121        verify(selectedListener, times(2)).onItemSelected(itemVHCaptor.capture(),
122                itemCaptor.capture(), rowVHCaptor.capture(), rowCaptor.capture());
123        assertSame("Same controls row should be passed to the listener", controlsRow,
124                rowCaptor.getValue());
125        assertSame("The selected action should be thumbsUp", thumbsUp, itemCaptor.getValue());
126
127        // Now navigate down to a ListRow item.
128        ListRow listRow0 = (ListRow) fragment.getAdapter().get(1);
129
130        sendKeys(KeyEvent.KEYCODE_DPAD_DOWN);
131        Thread.sleep(TRANSITION_LENGTH);
132        verify(selectedListener, times(3)).onItemSelected(itemVHCaptor.capture(),
133                itemCaptor.capture(), rowVHCaptor.capture(), rowCaptor.capture());
134        assertSame("Same list row should be passed to the listener", listRow0,
135                rowCaptor.getValue());
136        // Depending on the focusSearch algorithm, one of the items in the first ListRow must be
137        // selected.
138        boolean listRowItemPassed = (itemCaptor.getValue() == listRow0.getAdapter().get(0)
139                || itemCaptor.getValue() == listRow0.getAdapter().get(1));
140        assertTrue("None of the items in the first ListRow are passed to the selected listener.",
141                listRowItemPassed);
142    }
143
144    @Test
145    public void testClickedListener() throws Throwable {
146        launchAndWaitActivity(PlaybackTestSupportFragment.class, 1000);
147        PlaybackTestSupportFragment fragment = (PlaybackTestSupportFragment) mActivity.getTestFragment();
148
149        assertTrue(fragment.getView().hasFocus());
150
151        OnItemViewClickedListener clickedListener = Mockito.mock(OnItemViewClickedListener.class);
152        fragment.setOnItemViewClickedListener(clickedListener);
153
154
155        PlaybackControlsRow controlsRow = fragment.getGlue().getControlsRow();
156        SparseArrayObjectAdapter primaryActionsAdapter = (SparseArrayObjectAdapter)
157                controlsRow.getPrimaryActionsAdapter();
158
159        PlaybackControlsRow.MultiAction playPause = (PlaybackControlsRow.MultiAction)
160                primaryActionsAdapter.lookup(PlaybackControlGlue.ACTION_PLAY_PAUSE);
161
162        PlaybackControlsRow.MultiAction rewind = (PlaybackControlsRow.MultiAction)
163                primaryActionsAdapter.lookup(PlaybackControlGlue.ACTION_REWIND);
164
165        PlaybackControlsRow.MultiAction thumbsUp = (PlaybackControlsRow.MultiAction)
166                primaryActionsAdapter.lookup(PlaybackControlGlue.ACTION_CUSTOM_LEFT_FIRST);
167
168        ArgumentCaptor<Presenter.ViewHolder> itemVHCaptor =
169                ArgumentCaptor.forClass(Presenter.ViewHolder.class);
170        ArgumentCaptor<Object> itemCaptor = ArgumentCaptor.forClass(Object.class);
171        ArgumentCaptor<RowPresenter.ViewHolder> rowVHCaptor =
172                ArgumentCaptor.forClass(RowPresenter.ViewHolder.class);
173        ArgumentCaptor<Row> rowCaptor = ArgumentCaptor.forClass(Row.class);
174
175
176        // First navigate left within PlaybackControlsRow items.
177        verify(clickedListener, times(0)).onItemClicked(any(Presenter.ViewHolder.class),
178                any(Object.class), any(RowPresenter.ViewHolder.class), any(Row.class));
179        sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);
180        Thread.sleep(TRANSITION_LENGTH);
181        verify(clickedListener, times(1)).onItemClicked(itemVHCaptor.capture(),
182                itemCaptor.capture(), rowVHCaptor.capture(), rowCaptor.capture());
183        assertSame("Same controls row should be passed to the listener", controlsRow,
184                rowCaptor.getValue());
185        assertSame("The clicked action should be playPause", playPause, itemCaptor.getValue());
186
187        sendKeys(KeyEvent.KEYCODE_DPAD_LEFT);
188        Thread.sleep(TRANSITION_LENGTH);
189        verify(clickedListener, times(1)).onItemClicked(any(Presenter.ViewHolder.class),
190                any(Object.class), any(RowPresenter.ViewHolder.class), any(Row.class));
191        sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);
192        Thread.sleep(TRANSITION_LENGTH);
193        verify(clickedListener, times(2)).onItemClicked(itemVHCaptor.capture(),
194                itemCaptor.capture(), rowVHCaptor.capture(), rowCaptor.capture());
195        assertSame("Same controls row should be passed to the listener", controlsRow,
196                rowCaptor.getValue());
197        assertSame("The clicked action should be rewind", rewind, itemCaptor.getValue());
198
199        sendKeys(KeyEvent.KEYCODE_DPAD_LEFT);
200        Thread.sleep(TRANSITION_LENGTH);
201        verify(clickedListener, times(2)).onItemClicked(any(Presenter.ViewHolder.class),
202                any(Object.class), any(RowPresenter.ViewHolder.class), any(Row.class));
203        sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);
204        Thread.sleep(TRANSITION_LENGTH);
205        verify(clickedListener, times(3)).onItemClicked(itemVHCaptor.capture(),
206                itemCaptor.capture(), rowVHCaptor.capture(), rowCaptor.capture());
207        assertSame("Same controls row should be passed to the listener", controlsRow,
208                rowCaptor.getValue());
209        assertSame("The clicked action should be thumbsUp", thumbsUp, itemCaptor.getValue());
210
211        // Now navigate down to a ListRow item.
212        ListRow listRow0 = (ListRow) fragment.getAdapter().get(1);
213
214        sendKeys(KeyEvent.KEYCODE_DPAD_DOWN);
215        Thread.sleep(TRANSITION_LENGTH);
216        verify(clickedListener, times(3)).onItemClicked(any(Presenter.ViewHolder.class),
217                any(Object.class), any(RowPresenter.ViewHolder.class), any(Row.class));
218        sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);
219        Thread.sleep(TRANSITION_LENGTH);
220        verify(clickedListener, times(4)).onItemClicked(itemVHCaptor.capture(),
221                itemCaptor.capture(), rowVHCaptor.capture(), rowCaptor.capture());
222        assertSame("Same list row should be passed to the listener", listRow0,
223                rowCaptor.getValue());
224        boolean listRowItemPassed = (itemCaptor.getValue() == listRow0.getAdapter().get(0)
225                || itemCaptor.getValue() == listRow0.getAdapter().get(1));
226        assertTrue("None of the items in the first ListRow are passed to the click listener.",
227                listRowItemPassed);
228    }
229
230}
231