GridWidgetTest.java revision e7ead88853562603f76b92189a828ba14d5c4bcb
1062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu/* 2062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu * Copyright (C) 2015 The Android Open Source Project 3062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu * 4062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu * Licensed under the Apache License, Version 2.0 (the "License"); 5062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu * you may not use this file except in compliance with the License. 6062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu * You may obtain a copy of the License at 7062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu * 8062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu * http://www.apache.org/licenses/LICENSE-2.0 9062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu * 10062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu * Unless required by applicable law or agreed to in writing, software 11062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu * distributed under the License is distributed on an "AS IS" BASIS, 12062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu * See the License for the specific language governing permissions and 14062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu * limitations under the License. 15062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu */ 16062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gupackage android.support.v17.leanback.widget; 17062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu 18062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Guimport android.test.ActivityInstrumentationTestCase2; 19062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Guimport android.util.Log; 20062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Guimport android.view.KeyEvent; 21062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Guimport android.view.View; 22062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Guimport android.view.ViewGroup; 23062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Guimport android.app.Instrumentation; 24062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Guimport android.content.Intent; 25062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu 26062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Guimport java.util.ArrayList; 27062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Guimport java.util.Arrays; 28062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Guimport java.util.Comparator; 29062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Guimport java.util.HashMap; 30062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Guimport java.util.Iterator; 31062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu 32062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu/** 33062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu * @hide from javadoc 34062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu */ 35062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gupublic class GridWidgetTest extends ActivityInstrumentationTestCase2<GridActivity> { 36062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu 37062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu protected GridActivity mActivity; 38062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu protected Instrumentation mInstrumentation; 39062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu protected BaseGridView mGridView; 40062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu protected int mOrientation; 41062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu 42062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu private final Comparator<View> mRowSortComparator = new Comparator<View>() { 43062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu public int compare(View lhs, View rhs) { 44062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu if (mOrientation == BaseGridView.HORIZONTAL) { 45062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu return lhs.getLeft() - rhs.getLeft(); 46062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu } else { 47062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu return lhs.getTop() - rhs.getTop(); 48062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu } 49062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu }; 50062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu }; 51062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu 52062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu /** 53062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu * Verify margins between items on same row are same. 54062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu */ 55062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu private final Runnable mVerifyLayout = new Runnable() { 56062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu @Override 57062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu public void run() { 58e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu verifyMargin(); 59062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu } 60062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu }; 61062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu 62062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu public GridWidgetTest() { 63062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu super("android.support.v17.leanback.tests", GridActivity.class); 64062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu } 65062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu 66062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu /** 67062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu * Wait for grid view stop scroll and optionally verify state of grid view. 68062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu */ 69062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu protected void waitForScrollIdle(Runnable verify) throws Throwable { 70062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu while (mGridView.getLayoutManager().isSmoothScrolling() || 71062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu mGridView.getScrollState() != BaseGridView.SCROLL_STATE_IDLE) { 72062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu try { 73062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu Thread.sleep(100); 74062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu } catch (InterruptedException ex) { 75062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu break; 76062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu } 77062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu if (verify != null) { 78062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu runTestOnUiThread(verify); 79062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu } 80062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu } 81062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu } 82062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu 83062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu /** 84062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu * Wait for grid view stop scroll. 85062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu */ 86062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu protected void waitForScrollIdle() throws Throwable { 87062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu waitForScrollIdle(null); 88062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu } 89062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu 90e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu /** 91e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu * Group and sort children by their position on each row (HORIZONTAL) or column(VERTICAL). 92e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu */ 93e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu protected View[][] sortByRows() { 94e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu final HashMap<Integer, ArrayList<View>> rows = new HashMap<Integer, ArrayList<View>>(); 95e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu for (int i = 0; i < mGridView.getChildCount(); i++) { 96e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu View v = mGridView.getChildAt(i); 97e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu int rowLocation; 98e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu if (mOrientation == BaseGridView.HORIZONTAL) { 99e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu rowLocation = v.getTop(); 100e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu } else { 101e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu rowLocation = mGridView.getLayoutDirection() == ViewGroup.LAYOUT_DIRECTION_RTL ? 102e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu v.getRight() : v.getLeft(); 103e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu } 104e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu ArrayList<View> views = rows.get(rowLocation); 105e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu if (views == null) { 106e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu views = new ArrayList<View>(); 107e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu rows.put(rowLocation, views); 108e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu } 109e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu views.add(v); 110e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu } 111e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu assertEquals(rows.size(), mActivity.mRows); 112e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu View[][] sorted = new View[rows.size()][]; 113e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu int i = 0; 114e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu for (Iterator<ArrayList<View>> iter = rows.values().iterator(); iter.hasNext(); ) { 115e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu ArrayList<View> arr = iter.next(); 116e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu View[] views = arr.toArray(new View[arr.size()]); 117e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu Arrays.sort(views, mRowSortComparator); 118e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu sorted[i++] = views; 119e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu } 120e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu return sorted; 121e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu } 122e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu 123e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu protected void verifyMargin() { 124e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu View[][] sorted = sortByRows(); 125e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu for (int row = 0; row < sorted.length; row++) { 126e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu View[] views = sorted[row]; 127e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu int margin = -1; 128e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu for (int i = 1; i < views.length; i++) { 129e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu if (mOrientation == BaseGridView.HORIZONTAL) { 130e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu if (i == 1) { 131e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu margin = views[i].getLeft() - views[i - 1].getRight(); 132e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu } else { 133e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu assertEquals(margin, views[i].getLeft() - views[i - 1].getRight()); 134e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu } 135e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu } else { 136e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu if (i == 1) { 137e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu margin = views[i].getTop() - views[i - 1].getBottom(); 138e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu } else { 139e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu assertEquals(margin, views[i].getTop() - views[i - 1].getBottom()); 140e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu } 141e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu } 142e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu } 143e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu } 144e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu } 145e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu 146e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu protected void verifyBeginAligned() { 147e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu View[][] sorted = sortByRows(); 148e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu int alignedLocation = 0; 149e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu if (mOrientation == BaseGridView.HORIZONTAL) { 150e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu if (mGridView.getLayoutDirection() == ViewGroup.LAYOUT_DIRECTION_RTL) { 151e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu for (int i = 0; i < sorted.length; i++) { 152e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu if (i == 0) { 153e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu alignedLocation = sorted[i][sorted[i].length - 1].getRight(); 154e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu } else { 155e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu assertEquals(alignedLocation, sorted[i][sorted[i].length - 1].getRight()); 156e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu } 157e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu } 158e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu } else { 159e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu for (int i = 0; i < sorted.length; i++) { 160e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu if (i == 0) { 161e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu alignedLocation = sorted[i][0].getLeft(); 162e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu } else { 163e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu assertEquals(alignedLocation, sorted[i][0].getLeft()); 164e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu } 165e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu } 166e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu } 167e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu } else { 168e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu for (int i = 0; i < sorted.length; i++) { 169e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu if (i == 0) { 170e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu alignedLocation = sorted[i][0].getTop(); 171e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu } else { 172e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu assertEquals(alignedLocation, sorted[i][0].getTop()); 173e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu } 174e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu } 175e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu } 176e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu } 177e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu 178e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu public void testThreeRowHorizontalBasic() throws Throwable { 179062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu 180062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu mInstrumentation = getInstrumentation(); 181062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class); 182e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 100); 183e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu intent.putExtra(GridActivity.EXTRA_ROWS, 3); 184e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu mOrientation = BaseGridView.HORIZONTAL; 185e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu intent.putExtra(GridActivity.EXTRA_ORIENTATION, mOrientation); 186062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu setActivityIntent(intent); 187062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu mActivity = getActivity(); 188062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu mGridView = mActivity.mGridView; 189062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu 190062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu sendRepeatedKeys(100, KeyEvent.KEYCODE_DPAD_RIGHT); 191062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu waitForScrollIdle(mVerifyLayout); 192062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu 193e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu assertEquals(mActivity.getBoundCount(), 100); 194e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu 195062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu sendRepeatedKeys(100, KeyEvent.KEYCODE_DPAD_LEFT); 196062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu waitForScrollIdle(mVerifyLayout); 197062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu 198e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu verifyBeginAligned(); 199062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu } 200062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu 201e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu public void testThreeColumnVerticalBasic() throws Throwable { 202e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu 203e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu mInstrumentation = getInstrumentation(); 204e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class); 205e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 200); 206e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu intent.putExtra(GridActivity.EXTRA_ROWS, 3); 207e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu mOrientation = BaseGridView.VERTICAL; 208e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu intent.putExtra(GridActivity.EXTRA_ORIENTATION, mOrientation); 209e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu setActivityIntent(intent); 210e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu mActivity = getActivity(); 211e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu mGridView = mActivity.mGridView; 212e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu 213e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu sendRepeatedKeys(100, KeyEvent.KEYCODE_DPAD_DOWN); 214e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu waitForScrollIdle(mVerifyLayout); 215e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu 216e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu assertEquals(mActivity.getBoundCount(), 200); 217e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu 218e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu sendRepeatedKeys(100, KeyEvent.KEYCODE_DPAD_UP); 219e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu waitForScrollIdle(mVerifyLayout); 220e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu 221e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu verifyBeginAligned(); 222e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu } 223062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu} 224