GridWidgetTest.java revision 85df3117f0fcd0aa10d7bd45194dab97e22112f2
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; 4085df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu protected GridLayoutManager mLayoutManager; 41062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu protected int mOrientation; 42062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu 43062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu private final Comparator<View> mRowSortComparator = new Comparator<View>() { 44062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu public int compare(View lhs, View rhs) { 45062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu if (mOrientation == BaseGridView.HORIZONTAL) { 46062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu return lhs.getLeft() - rhs.getLeft(); 47062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu } else { 48062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu return lhs.getTop() - rhs.getTop(); 49062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu } 50062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu }; 51062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu }; 52062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu 53062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu /** 54062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu * Verify margins between items on same row are same. 55062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu */ 56062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu private final Runnable mVerifyLayout = new Runnable() { 57062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu @Override 58062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu public void run() { 59e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu verifyMargin(); 60062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu } 61062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu }; 62062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu 63062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu public GridWidgetTest() { 64062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu super("android.support.v17.leanback.tests", GridActivity.class); 65062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu } 66062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu 67062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu /** 68062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu * Wait for grid view stop scroll and optionally verify state of grid view. 69062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu */ 70062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu protected void waitForScrollIdle(Runnable verify) throws Throwable { 71062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu while (mGridView.getLayoutManager().isSmoothScrolling() || 72062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu mGridView.getScrollState() != BaseGridView.SCROLL_STATE_IDLE) { 73062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu try { 74062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu Thread.sleep(100); 75062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu } catch (InterruptedException ex) { 76062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu break; 77062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu } 78062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu if (verify != null) { 79062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu runTestOnUiThread(verify); 80062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu } 81062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu } 82062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu } 83062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu 84062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu /** 8585df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu * Wait for grid view stop animation and optionally verify state of grid view. 8685df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu */ 8785df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu protected void waitForTransientStateGone(Runnable verify) throws Throwable { 8885df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu do { 8985df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu try { 9085df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu Thread.sleep(100); 9185df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu } catch (InterruptedException ex) { 9285df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu break; 9385df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu } 9485df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu if (verify != null) { 9585df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu runTestOnUiThread(verify); 9685df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu } 9785df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu } while (mGridView.hasTransientState()); 9885df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu } 9985df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu 10085df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu /** 101062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu * Wait for grid view stop scroll. 102062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu */ 103062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu protected void waitForScrollIdle() throws Throwable { 104062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu waitForScrollIdle(null); 105062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu } 106062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu 107e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu /** 108e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu * Group and sort children by their position on each row (HORIZONTAL) or column(VERTICAL). 109e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu */ 110e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu protected View[][] sortByRows() { 111e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu final HashMap<Integer, ArrayList<View>> rows = new HashMap<Integer, ArrayList<View>>(); 112e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu for (int i = 0; i < mGridView.getChildCount(); i++) { 113e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu View v = mGridView.getChildAt(i); 114e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu int rowLocation; 115e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu if (mOrientation == BaseGridView.HORIZONTAL) { 116e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu rowLocation = v.getTop(); 117e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu } else { 118e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu rowLocation = mGridView.getLayoutDirection() == ViewGroup.LAYOUT_DIRECTION_RTL ? 119e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu v.getRight() : v.getLeft(); 120e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu } 121e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu ArrayList<View> views = rows.get(rowLocation); 122e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu if (views == null) { 123e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu views = new ArrayList<View>(); 124e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu rows.put(rowLocation, views); 125e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu } 126e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu views.add(v); 127e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu } 12885df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu assertEquals("Dump Views by rows "+rows, rows.size(), mActivity.mRows); 129e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu View[][] sorted = new View[rows.size()][]; 130e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu int i = 0; 131e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu for (Iterator<ArrayList<View>> iter = rows.values().iterator(); iter.hasNext(); ) { 132e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu ArrayList<View> arr = iter.next(); 133e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu View[] views = arr.toArray(new View[arr.size()]); 134e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu Arrays.sort(views, mRowSortComparator); 135e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu sorted[i++] = views; 136e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu } 137e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu return sorted; 138e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu } 139e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu 140e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu protected void verifyMargin() { 141e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu View[][] sorted = sortByRows(); 142e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu for (int row = 0; row < sorted.length; row++) { 143e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu View[] views = sorted[row]; 144e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu int margin = -1; 145e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu for (int i = 1; i < views.length; i++) { 146e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu if (mOrientation == BaseGridView.HORIZONTAL) { 147e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu if (i == 1) { 148e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu margin = views[i].getLeft() - views[i - 1].getRight(); 149e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu } else { 150e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu assertEquals(margin, views[i].getLeft() - views[i - 1].getRight()); 151e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu } 152e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu } else { 153e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu if (i == 1) { 154e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu margin = views[i].getTop() - views[i - 1].getBottom(); 155e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu } else { 156e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu assertEquals(margin, views[i].getTop() - views[i - 1].getBottom()); 157e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu } 158e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu } 159e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu } 160e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu } 161e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu } 162e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu 163e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu protected void verifyBeginAligned() { 164e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu View[][] sorted = sortByRows(); 165e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu int alignedLocation = 0; 166e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu if (mOrientation == BaseGridView.HORIZONTAL) { 167e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu if (mGridView.getLayoutDirection() == ViewGroup.LAYOUT_DIRECTION_RTL) { 168e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu for (int i = 0; i < sorted.length; i++) { 169e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu if (i == 0) { 170e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu alignedLocation = sorted[i][sorted[i].length - 1].getRight(); 171e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu } else { 172e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu assertEquals(alignedLocation, sorted[i][sorted[i].length - 1].getRight()); 173e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu } 174e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu } 175e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu } else { 176e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu for (int i = 0; i < sorted.length; i++) { 177e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu if (i == 0) { 178e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu alignedLocation = sorted[i][0].getLeft(); 179e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu } else { 180e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu assertEquals(alignedLocation, sorted[i][0].getLeft()); 181e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu } 182e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu } 183e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu } 184e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu } else { 185e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu for (int i = 0; i < sorted.length; i++) { 186e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu if (i == 0) { 187e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu alignedLocation = sorted[i][0].getTop(); 188e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu } else { 189e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu assertEquals(alignedLocation, sorted[i][0].getTop()); 190e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu } 191e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu } 192e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu } 193e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu } 194e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu 19585df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu protected void verifyBoundCount(int count) { 19685df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu if (mActivity.getBoundCount() != count) { 19785df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu StringBuffer b = new StringBuffer(); 19885df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu b.append("ItemsLength: "); 19985df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu for (int i = 0; i < mActivity.mItemLengths.length; i++) { 20085df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu b.append(mActivity.mItemLengths[i]).append(","); 20185df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu } 20285df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu assertEquals("Bound count does not match, ItemsLengths: "+ b, 20385df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu count, mActivity.getBoundCount()); 20485df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu } 20585df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu } 20685df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu 207e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu public void testThreeRowHorizontalBasic() throws Throwable { 208062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu 209062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu mInstrumentation = getInstrumentation(); 210062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class); 211e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 100); 212e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu intent.putExtra(GridActivity.EXTRA_ROWS, 3); 213e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu mOrientation = BaseGridView.HORIZONTAL; 214e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu intent.putExtra(GridActivity.EXTRA_ORIENTATION, mOrientation); 215062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu setActivityIntent(intent); 216062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu mActivity = getActivity(); 217062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu mGridView = mActivity.mGridView; 218062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu 21985df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu if (mGridView.getLayoutDirection() == ViewGroup.LAYOUT_DIRECTION_RTL) { 22085df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu sendRepeatedKeys(100, KeyEvent.KEYCODE_DPAD_LEFT); 22185df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu } else { 22285df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu sendRepeatedKeys(100, KeyEvent.KEYCODE_DPAD_RIGHT); 22385df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu } 224062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu waitForScrollIdle(mVerifyLayout); 225062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu 22685df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu verifyBoundCount(100); 227e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu 22885df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu if (mGridView.getLayoutDirection() == ViewGroup.LAYOUT_DIRECTION_RTL) { 22985df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu sendRepeatedKeys(100, KeyEvent.KEYCODE_DPAD_RIGHT); 23085df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu } else { 23185df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu sendRepeatedKeys(100, KeyEvent.KEYCODE_DPAD_LEFT); 23285df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu } 233062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu waitForScrollIdle(mVerifyLayout); 234062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu 235e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu verifyBeginAligned(); 236062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu } 237062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu 238e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu public void testThreeColumnVerticalBasic() throws Throwable { 239e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu 240e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu mInstrumentation = getInstrumentation(); 241e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class); 242e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 200); 243e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu intent.putExtra(GridActivity.EXTRA_ROWS, 3); 244e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu mOrientation = BaseGridView.VERTICAL; 245e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu intent.putExtra(GridActivity.EXTRA_ORIENTATION, mOrientation); 246e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu setActivityIntent(intent); 247e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu mActivity = getActivity(); 248e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu mGridView = mActivity.mGridView; 249e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu 250e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu sendRepeatedKeys(100, KeyEvent.KEYCODE_DPAD_DOWN); 251e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu waitForScrollIdle(mVerifyLayout); 25285df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu verifyBoundCount(200); 253e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu 25485df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu sendRepeatedKeys(100, KeyEvent.KEYCODE_DPAD_UP); 25585df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu waitForScrollIdle(mVerifyLayout); 25685df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu 25785df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu verifyBeginAligned(); 25885df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu } 25985df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu 26085df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu public void testRedundantAppendRemove() throws Throwable { 26185df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu mInstrumentation = getInstrumentation(); 26285df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class); 26385df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu intent.putExtra(GridActivity.EXTRA_GRIDVIEW_LAYOUT_SIZE, new int[]{1920, 984}); 26485df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu intent.putExtra(GridActivity.EXTRA_ITEMS, new int[]{ 26585df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu 149,177,128,234,227,187,163,223,146,210,228,148,227,193,182,197,177,142,225,207, 26685df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu 157,171,209,204,187,184,123,221,197,153,202,179,193,214,226,173,225,143,188,159, 26785df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu 139,193,233,143,227,203,222,124,228,223,164,131,228,126,211,160,165,152,235,184, 26885df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu 155,224,149,181,171,229,200,234,177,130,164,172,188,139,132,203,179,220,147,131, 26985df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu 226,127,230,239,183,203,206,227,123,170,239,234,200,149,237,204,160,133,202,234, 27085df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu 173,122,139,149,151,153,216,231,121,145,227,153,186,174,223,180,123,215,206,216, 27185df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu 239,222,219,207,193,218,140,133,171,153,183,132,233,138,159,174,189,171,143,128, 27285df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu 152,222,141,202,224,190,134,120,181,231,230,136,132,224,136,210,207,150,128,183, 27385df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu 221,194,179,220,126,221,137,205,223,193,172,132,226,209,133,191,227,127,159,171, 27485df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu 180,149,237,177,194,207,170,202,161,144,147,199,205,186,164,140,193,203,224,129}); 27585df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu intent.putExtra(GridActivity.EXTRA_ROWS, 3); 27685df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu mOrientation = BaseGridView.VERTICAL; 27785df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu intent.putExtra(GridActivity.EXTRA_ORIENTATION, mOrientation); 27885df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu setActivityIntent(intent); 27985df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu mActivity = getActivity(); 28085df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu mGridView = mActivity.mGridView; 28185df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu 28285df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu sendRepeatedKeys(100, KeyEvent.KEYCODE_DPAD_DOWN); 28385df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu waitForScrollIdle(mVerifyLayout); 28485df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu 28585df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu verifyBoundCount(200); 286e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu 287e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu sendRepeatedKeys(100, KeyEvent.KEYCODE_DPAD_UP); 288e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu waitForScrollIdle(mVerifyLayout); 289e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu 290e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu verifyBeginAligned(); 291e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu } 29285df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu 29385df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu public void testRedundantAppendRemove2() throws Throwable { 29485df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu mInstrumentation = getInstrumentation(); 29585df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class); 29685df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu intent.putExtra(GridActivity.EXTRA_GRIDVIEW_LAYOUT_SIZE, new int[]{1920, 984}); 29785df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu intent.putExtra(GridActivity.EXTRA_ITEMS, new int[]{ 29885df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu 318,333,199,224,246,273,269,289,340,313,265,306,349,269,185,282,257,354,316,252, 29985df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu 237,290,283,343,196,313,290,343,191,262,342,228,343,349,251,203,226,305,265,213, 30085df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu 216,333,295,188,187,281,288,311,244,232,224,332,290,181,267,276,226,261,335,355, 30185df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu 225,217,219,183,234,285,257,304,182,250,244,223,257,219,342,185,347,205,302,315, 30285df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu 299,309,292,237,192,309,228,250,347,227,337,298,299,185,185,331,223,284,265,351}); 30385df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu intent.putExtra(GridActivity.EXTRA_ROWS, 3); 30485df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu mOrientation = BaseGridView.HORIZONTAL; 30585df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu intent.putExtra(GridActivity.EXTRA_ORIENTATION, mOrientation); 30685df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu setActivityIntent(intent); 30785df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu mActivity = getActivity(); 30885df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu mGridView = mActivity.mGridView; 30985df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu mLayoutManager = (GridLayoutManager) mGridView.getLayoutManager(); 31085df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu 31185df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu // test append without staggered result cache 31285df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu if (mGridView.getLayoutDirection() == ViewGroup.LAYOUT_DIRECTION_RTL) { 31385df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu sendRepeatedKeys(100, KeyEvent.KEYCODE_DPAD_LEFT); 31485df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu } else { 31585df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu sendRepeatedKeys(100, KeyEvent.KEYCODE_DPAD_RIGHT); 31685df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu } 31785df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu waitForScrollIdle(mVerifyLayout); 31885df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu 31985df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu verifyBoundCount(100); 32085df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu 32185df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu if (mGridView.getLayoutDirection() == ViewGroup.LAYOUT_DIRECTION_RTL) { 32285df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu sendRepeatedKeys(100, KeyEvent.KEYCODE_DPAD_RIGHT); 32385df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu } else { 32485df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu sendRepeatedKeys(100, KeyEvent.KEYCODE_DPAD_LEFT); 32585df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu } 32685df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu waitForScrollIdle(mVerifyLayout); 32785df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu 32885df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu verifyBeginAligned(); 32985df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu 33085df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu // now test append with staggered result cache 33185df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu runTestOnUiThread(new Runnable() { 33285df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu public void run() { 33385df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu mActivity.changeArraySize(3); 33485df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu } 33585df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu }); 33685df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu Thread.sleep(500); 33785df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu assertEquals("Staggerd cache should be kept as is when no item size change", 33885df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu 100, ((StaggeredGrid) mLayoutManager.mGrid).mLocations.size()); 33985df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu 34085df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu mActivity.resetBoundCount(); 34185df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu runTestOnUiThread(new Runnable() { 34285df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu public void run() { 34385df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu mActivity.changeArraySize(100); 34485df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu } 34585df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu }); 34685df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu Thread.sleep(500); 34785df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu 34885df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu if (mGridView.getLayoutDirection() == ViewGroup.LAYOUT_DIRECTION_RTL) { 34985df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu sendRepeatedKeys(100, KeyEvent.KEYCODE_DPAD_LEFT); 35085df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu } else { 35185df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu sendRepeatedKeys(100, KeyEvent.KEYCODE_DPAD_RIGHT); 35285df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu } 35385df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu waitForScrollIdle(mVerifyLayout); 35485df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu verifyBoundCount(100); 35585df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu } 35685df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu 35785df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu public void testItemMoved() throws Throwable { 35885df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu 35985df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu mInstrumentation = getInstrumentation(); 36085df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class); 36185df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 200); 36285df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu intent.putExtra(GridActivity.EXTRA_ROWS, 3); 36385df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu mOrientation = BaseGridView.HORIZONTAL; 36485df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu intent.putExtra(GridActivity.EXTRA_ORIENTATION, mOrientation); 36585df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu setActivityIntent(intent); 36685df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu mActivity = getActivity(); 36785df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu mGridView = mActivity.mGridView; 36885df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu 36985df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu mGridView.setSelectedPositionSmooth(150); 37085df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu waitForScrollIdle(mVerifyLayout); 37185df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu mActivity.swap(150, 152); 37285df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu waitForTransientStateGone(null); 37385df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu 37485df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu runTestOnUiThread(mVerifyLayout); 37585df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu 37685df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu if (mGridView.getLayoutDirection() == ViewGroup.LAYOUT_DIRECTION_RTL) { 37785df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu sendRepeatedKeys(100, KeyEvent.KEYCODE_DPAD_RIGHT); 37885df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu } else { 37985df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu sendRepeatedKeys(100, KeyEvent.KEYCODE_DPAD_LEFT); 38085df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu } 38185df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu waitForScrollIdle(mVerifyLayout); 38285df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu 38385df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu verifyBeginAligned(); 38485df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu } 38585df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu 386062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu} 387