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