RowsFragmentTest.java revision ea89ed4fd190e0b2a0fe595f2172bc649af67bf7
1/* 2 * Copyright (C) 2016 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16package android.support.v17.leanback.app; 17 18import static org.junit.Assert.assertEquals; 19import static org.junit.Assert.assertNotNull; 20import static org.junit.Assert.assertTrue; 21 22import android.graphics.Rect; 23import android.os.Bundle; 24import android.os.Handler; 25import android.os.SystemClock; 26import android.support.test.InstrumentationRegistry; 27import android.support.test.filters.MediumTest; 28import android.support.test.runner.AndroidJUnit4; 29import android.support.v17.leanback.testutils.PollingCheck; 30import android.support.v17.leanback.widget.ArrayObjectAdapter; 31import android.support.v17.leanback.widget.HeaderItem; 32import android.support.v17.leanback.widget.ListRow; 33import android.support.v17.leanback.widget.ListRowPresenter; 34import android.support.v17.leanback.widget.VerticalGridView; 35import android.view.KeyEvent; 36import android.view.View; 37 38import org.junit.Test; 39import org.junit.runner.RunWith; 40 41import java.lang.ref.WeakReference; 42 43@MediumTest 44@RunWith(AndroidJUnit4.class) 45public class RowsFragmentTest extends SingleFragmentTestBase { 46 47 static final StringPresenter sCardPresenter = new StringPresenter(); 48 49 static void loadData(ArrayObjectAdapter adapter, int numRows, int repeatPerRow) { 50 for (int i = 0; i < numRows; ++i) { 51 ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(sCardPresenter); 52 int index = 0; 53 for (int j = 0; j < repeatPerRow; ++j) { 54 listRowAdapter.add("Hello world-" + (index++)); 55 listRowAdapter.add("This is a test-" + (index++)); 56 listRowAdapter.add("Android TV-" + (index++)); 57 listRowAdapter.add("Leanback-" + (index++)); 58 listRowAdapter.add("Hello world-" + (index++)); 59 listRowAdapter.add("Android TV-" + (index++)); 60 listRowAdapter.add("Leanback-" + (index++)); 61 listRowAdapter.add("GuidedStepFragment-" + (index++)); 62 } 63 HeaderItem header = new HeaderItem(i, "Row " + i); 64 adapter.add(new ListRow(header, listRowAdapter)); 65 } 66 } 67 68 public static class F_defaultAlignment extends RowsFragment { 69 @Override 70 public void onCreate(Bundle savedInstanceState) { 71 super.onCreate(savedInstanceState); 72 ListRowPresenter lrp = new ListRowPresenter(); 73 ArrayObjectAdapter adapter = new ArrayObjectAdapter(lrp); 74 setAdapter(adapter); 75 loadData(adapter, 10, 1); 76 } 77 } 78 79 @Test 80 public void defaultAlignment() throws InterruptedException { 81 launchAndWaitActivity(1000); 82 83 final Rect rect = new Rect(); 84 85 final VerticalGridView gridView = ((RowsFragment) mActivity.getTestFragment()) 86 .getVerticalGridView(); 87 View row0 = gridView.findViewHolderForAdapterPosition(0).itemView; 88 rect.set(0, 0, row0.getWidth(), row0.getHeight()); 89 gridView.offsetDescendantRectToMyCoords(row0, rect); 90 assertEquals("First row is initially aligned to top of screen", 0, rect.top); 91 92 sendKeys(KeyEvent.KEYCODE_DPAD_DOWN); 93 View row1 = gridView.findViewHolderForAdapterPosition(1).itemView; 94 PollingCheck.waitFor(new PollingCheck.ViewStableOnScreen(row1)); 95 96 rect.set(0, 0, row1.getWidth(), row1.getHeight()); 97 gridView.offsetDescendantRectToMyCoords(row1, rect); 98 assertTrue("Second row should not be aligned to top of screen", rect.top > 0); 99 } 100 101 public static class F_selectBeforeSetAdapter extends RowsFragment { 102 @Override 103 public void onCreate(Bundle savedInstanceState) { 104 super.onCreate(savedInstanceState); 105 setSelectedPosition(7, false); 106 new Handler().postDelayed(new Runnable() { 107 @Override 108 public void run() { 109 ListRowPresenter lrp = new ListRowPresenter(); 110 ArrayObjectAdapter adapter = new ArrayObjectAdapter(lrp); 111 setAdapter(adapter); 112 loadData(adapter, 10, 1); 113 } 114 }, 1000); 115 } 116 } 117 118 @Test 119 public void selectBeforeSetAdapter() throws InterruptedException { 120 launchAndWaitActivity(2000); 121 122 final VerticalGridView gridView = ((RowsFragment) mActivity.getTestFragment()) 123 .getVerticalGridView(); 124 assertEquals(7, gridView.getSelectedPosition()); 125 assertNotNull(gridView.findViewHolderForAdapterPosition(7)); 126 } 127 128 public static class F_selectBeforeAddData extends RowsFragment { 129 @Override 130 public void onCreate(Bundle savedInstanceState) { 131 super.onCreate(savedInstanceState); 132 ListRowPresenter lrp = new ListRowPresenter(); 133 final ArrayObjectAdapter adapter = new ArrayObjectAdapter(lrp); 134 setAdapter(adapter); 135 setSelectedPosition(7, false); 136 new Handler().postDelayed(new Runnable() { 137 @Override 138 public void run() { 139 loadData(adapter, 10, 1); 140 } 141 }, 1000); 142 } 143 } 144 145 @Test 146 public void selectBeforeAddData() throws InterruptedException { 147 launchAndWaitActivity(2000); 148 149 final VerticalGridView gridView = ((RowsFragment) mActivity.getTestFragment()) 150 .getVerticalGridView(); 151 assertEquals(7, gridView.getSelectedPosition()); 152 assertNotNull(gridView.findViewHolderForAdapterPosition(7)); 153 } 154 155 public static class F_selectAfterAddData extends RowsFragment { 156 @Override 157 public void onCreate(Bundle savedInstanceState) { 158 super.onCreate(savedInstanceState); 159 ListRowPresenter lrp = new ListRowPresenter(); 160 final ArrayObjectAdapter adapter = new ArrayObjectAdapter(lrp); 161 setAdapter(adapter); 162 loadData(adapter, 10, 1); 163 new Handler().postDelayed(new Runnable() { 164 @Override 165 public void run() { 166 setSelectedPosition(7, false); 167 } 168 }, 1000); 169 } 170 } 171 172 @Test 173 public void selectAfterAddData() throws InterruptedException { 174 launchAndWaitActivity(2000); 175 176 final VerticalGridView gridView = ((RowsFragment) mActivity.getTestFragment()) 177 .getVerticalGridView(); 178 assertEquals(7, gridView.getSelectedPosition()); 179 assertNotNull(gridView.findViewHolderForAdapterPosition(7)); 180 } 181 182 static WeakReference<F_restoreSelection> sLastF_restoreSelection; 183 184 public static class F_restoreSelection extends RowsFragment { 185 public F_restoreSelection() { 186 sLastF_restoreSelection = new WeakReference<F_restoreSelection>(this); 187 } 188 189 @Override 190 public void onCreate(Bundle savedInstanceState) { 191 super.onCreate(savedInstanceState); 192 ListRowPresenter lrp = new ListRowPresenter(); 193 final ArrayObjectAdapter adapter = new ArrayObjectAdapter(lrp); 194 setAdapter(adapter); 195 loadData(adapter, 10, 1); 196 if (savedInstanceState == null) { 197 setSelectedPosition(7, false); 198 } 199 } 200 } 201 202 @Test 203 public void restoreSelection() { 204 launchAndWaitActivity(1000); 205 206 InstrumentationRegistry.getInstrumentation().runOnMainSync( 207 new Runnable() { 208 public void run() { 209 mActivity.recreate(); 210 } 211 } 212 ); 213 SystemClock.sleep(1000); 214 215 // mActivity is invalid after recreate(), a new Activity instance is created 216 // but we could get Fragment from static variable. 217 RowsFragment fragment = sLastF_restoreSelection.get(); 218 final VerticalGridView gridView = fragment.getVerticalGridView(); 219 assertEquals(7, gridView.getSelectedPosition()); 220 assertNotNull(gridView.findViewHolderForAdapterPosition(7)); 221 222 } 223} 224