GridWidgetTest.java revision 91feb947412e0521a5f1835553214dcbe03fd362
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 18247741d74797105ba4f6d2834ec56dab32c14644Dake Guimport android.support.v17.leanback.tests.R; 19062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Guimport android.test.ActivityInstrumentationTestCase2; 203bd331ac6fe8ef25a2deb3559b0b5958573c231bDake Guimport android.text.Selection; 213bd331ac6fe8ef25a2deb3559b0b5958573c231bDake Guimport android.text.Spannable; 22062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Guimport android.util.Log; 233bd331ac6fe8ef25a2deb3559b0b5958573c231bDake Guimport android.util.SparseArray; 24062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Guimport android.view.KeyEvent; 25062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Guimport android.view.View; 26062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Guimport android.view.ViewGroup; 27c0b265dd2df42b399ba1f959b3dfd14dd14012b5Dake Guimport android.widget.TextView; 28d1cab1b54104d55407335c5d649398635822fffdDake Gu 29d1cab1b54104d55407335c5d649398635822fffdDake Guimport android.support.v4.view.accessibility.AccessibilityNodeInfoCompat; 30d1cab1b54104d55407335c5d649398635822fffdDake Guimport android.support.v7.widget.RecyclerViewAccessibilityDelegate; 31d1cab1b54104d55407335c5d649398635822fffdDake Gu 32062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Guimport android.app.Instrumentation; 33062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Guimport android.content.Intent; 343bd331ac6fe8ef25a2deb3559b0b5958573c231bDake Guimport android.os.Parcelable; 35062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu 36062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Guimport java.util.ArrayList; 37062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Guimport java.util.Arrays; 38062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Guimport java.util.Comparator; 39062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Guimport java.util.HashMap; 40062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Guimport java.util.Iterator; 41062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu 42062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu/** 43062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu * @hide from javadoc 44062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu */ 45062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gupublic class GridWidgetTest extends ActivityInstrumentationTestCase2<GridActivity> { 46062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu 47f518dc6b5898d16d0b8818ff4d06425b2bb0b3d0Dake Gu private static final boolean HUMAN_DELAY = false; 487538845719cd1e588185ce9ae60320377862ef8dDake Gu private static final long WAIT_FOR_SCROLL_IDLE_TIMEOUT_MS = 60000; 49f518dc6b5898d16d0b8818ff4d06425b2bb0b3d0Dake Gu 50062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu protected GridActivity mActivity; 51062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu protected Instrumentation mInstrumentation; 52062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu protected BaseGridView mGridView; 5385df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu protected GridLayoutManager mLayoutManager; 54062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu protected int mOrientation; 55247741d74797105ba4f6d2834ec56dab32c14644Dake Gu protected int mNumRows; 56062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu 57062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu private final Comparator<View> mRowSortComparator = new Comparator<View>() { 58062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu public int compare(View lhs, View rhs) { 59062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu if (mOrientation == BaseGridView.HORIZONTAL) { 60062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu return lhs.getLeft() - rhs.getLeft(); 61062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu } else { 62062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu return lhs.getTop() - rhs.getTop(); 63062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu } 64062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu }; 65062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu }; 66062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu 67062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu /** 68062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu * Verify margins between items on same row are same. 69062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu */ 70062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu private final Runnable mVerifyLayout = new Runnable() { 71062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu @Override 72062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu public void run() { 73e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu verifyMargin(); 74062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu } 75062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu }; 76062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu 77062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu public GridWidgetTest() { 78062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu super("android.support.v17.leanback.tests", GridActivity.class); 79062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu } 80062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu 81f518dc6b5898d16d0b8818ff4d06425b2bb0b3d0Dake Gu private void humanDelay(int delay) throws InterruptedException { 82f518dc6b5898d16d0b8818ff4d06425b2bb0b3d0Dake Gu if (HUMAN_DELAY) Thread.sleep(delay); 83f518dc6b5898d16d0b8818ff4d06425b2bb0b3d0Dake Gu } 84f518dc6b5898d16d0b8818ff4d06425b2bb0b3d0Dake Gu /** 85f518dc6b5898d16d0b8818ff4d06425b2bb0b3d0Dake Gu * Change size of the Adapter and notifyDataSetChanged. 86f518dc6b5898d16d0b8818ff4d06425b2bb0b3d0Dake Gu */ 87f518dc6b5898d16d0b8818ff4d06425b2bb0b3d0Dake Gu private void changeArraySize(final int size) throws Throwable { 88f518dc6b5898d16d0b8818ff4d06425b2bb0b3d0Dake Gu runTestOnUiThread(new Runnable() { 89f518dc6b5898d16d0b8818ff4d06425b2bb0b3d0Dake Gu public void run() { 90f518dc6b5898d16d0b8818ff4d06425b2bb0b3d0Dake Gu mActivity.changeArraySize(size); 91f518dc6b5898d16d0b8818ff4d06425b2bb0b3d0Dake Gu } 92f518dc6b5898d16d0b8818ff4d06425b2bb0b3d0Dake Gu }); 93f518dc6b5898d16d0b8818ff4d06425b2bb0b3d0Dake Gu Thread.sleep(500); 94f518dc6b5898d16d0b8818ff4d06425b2bb0b3d0Dake Gu } 95f518dc6b5898d16d0b8818ff4d06425b2bb0b3d0Dake Gu 96f518dc6b5898d16d0b8818ff4d06425b2bb0b3d0Dake Gu /** 97f518dc6b5898d16d0b8818ff4d06425b2bb0b3d0Dake Gu * Change selected position. 98f518dc6b5898d16d0b8818ff4d06425b2bb0b3d0Dake Gu */ 99f518dc6b5898d16d0b8818ff4d06425b2bb0b3d0Dake Gu private void setSelectedPosition(final int position, final int scrollExtra) throws Throwable { 100f518dc6b5898d16d0b8818ff4d06425b2bb0b3d0Dake Gu runTestOnUiThread(new Runnable() { 101f518dc6b5898d16d0b8818ff4d06425b2bb0b3d0Dake Gu public void run() { 102f518dc6b5898d16d0b8818ff4d06425b2bb0b3d0Dake Gu mGridView.setSelectedPosition(position, scrollExtra); 103f518dc6b5898d16d0b8818ff4d06425b2bb0b3d0Dake Gu } 104f518dc6b5898d16d0b8818ff4d06425b2bb0b3d0Dake Gu }); 105f518dc6b5898d16d0b8818ff4d06425b2bb0b3d0Dake Gu Thread.sleep(500); 106f518dc6b5898d16d0b8818ff4d06425b2bb0b3d0Dake Gu } 107f518dc6b5898d16d0b8818ff4d06425b2bb0b3d0Dake Gu 108062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu /** 109062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu * Wait for grid view stop scroll and optionally verify state of grid view. 110062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu */ 111062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu protected void waitForScrollIdle(Runnable verify) throws Throwable { 1128c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu Thread.sleep(100); 1137538845719cd1e588185ce9ae60320377862ef8dDake Gu int total = 0; 114062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu while (mGridView.getLayoutManager().isSmoothScrolling() || 115062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu mGridView.getScrollState() != BaseGridView.SCROLL_STATE_IDLE) { 1167538845719cd1e588185ce9ae60320377862ef8dDake Gu if ((total += 100) >= WAIT_FOR_SCROLL_IDLE_TIMEOUT_MS) { 1177538845719cd1e588185ce9ae60320377862ef8dDake Gu throw new RuntimeException("waitForScrollIdle Timeout"); 1187538845719cd1e588185ce9ae60320377862ef8dDake Gu } 119062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu try { 120062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu Thread.sleep(100); 121062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu } catch (InterruptedException ex) { 122062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu break; 123062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu } 124062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu if (verify != null) { 125062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu runTestOnUiThread(verify); 126062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu } 127062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu } 128062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu } 129062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu 130062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu /** 13185df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu * Wait for grid view stop animation and optionally verify state of grid view. 13285df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu */ 13385df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu protected void waitForTransientStateGone(Runnable verify) throws Throwable { 13485df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu do { 13585df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu try { 13685df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu Thread.sleep(100); 13785df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu } catch (InterruptedException ex) { 13885df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu break; 13985df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu } 14085df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu if (verify != null) { 14185df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu runTestOnUiThread(verify); 14285df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu } 14385df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu } while (mGridView.hasTransientState()); 14485df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu } 14585df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu 14685df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu /** 147062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu * Wait for grid view stop scroll. 148062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu */ 149062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu protected void waitForScrollIdle() throws Throwable { 150062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu waitForScrollIdle(null); 151062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu } 152062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu 153e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu /** 154a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu * Scrolls using given key. 155a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu */ 156a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu protected void scroll(int key, Runnable verify) throws Throwable { 157a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu do { 158a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu if (verify != null) { 159a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu runTestOnUiThread(verify); 160a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu } 161a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu sendRepeatedKeys(10, key); 162a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu try { 1638c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu Thread.sleep(300); 164a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu } catch (InterruptedException ex) { 165a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu break; 166a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu } 167a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu } while (mGridView.getLayoutManager().isSmoothScrolling() || 168a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu mGridView.getScrollState() != BaseGridView.SCROLL_STATE_IDLE); 169a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu } 170a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu 171a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu protected void scrollToBegin(Runnable verify) throws Throwable { 172a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu int key; 173a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu if (mOrientation == BaseGridView.HORIZONTAL) { 174a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu if (mGridView.getLayoutDirection() == ViewGroup.LAYOUT_DIRECTION_RTL) { 175a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu key = KeyEvent.KEYCODE_DPAD_RIGHT; 176a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu } else { 177a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu key = KeyEvent.KEYCODE_DPAD_LEFT; 178a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu } 179a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu } else { 180a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu key = KeyEvent.KEYCODE_DPAD_UP; 181a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu } 182a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu scroll(key, verify); 183a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu } 184a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu 185a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu protected void scrollToEnd(Runnable verify) throws Throwable { 186a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu int key; 187a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu if (mOrientation == BaseGridView.HORIZONTAL) { 188a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu if (mGridView.getLayoutDirection() == ViewGroup.LAYOUT_DIRECTION_RTL) { 189a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu key = KeyEvent.KEYCODE_DPAD_LEFT; 190a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu } else { 191a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu key = KeyEvent.KEYCODE_DPAD_RIGHT; 192a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu } 193a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu } else { 194a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu key = KeyEvent.KEYCODE_DPAD_DOWN; 195a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu } 196a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu scroll(key, verify); 197a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu } 198a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu 199a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu /** 200e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu * Group and sort children by their position on each row (HORIZONTAL) or column(VERTICAL). 201e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu */ 202e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu protected View[][] sortByRows() { 203e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu final HashMap<Integer, ArrayList<View>> rows = new HashMap<Integer, ArrayList<View>>(); 204c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu ArrayList<Integer> rowLocations = new ArrayList(); 205e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu for (int i = 0; i < mGridView.getChildCount(); i++) { 206e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu View v = mGridView.getChildAt(i); 207e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu int rowLocation; 208e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu if (mOrientation == BaseGridView.HORIZONTAL) { 209e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu rowLocation = v.getTop(); 210e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu } else { 211e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu rowLocation = mGridView.getLayoutDirection() == ViewGroup.LAYOUT_DIRECTION_RTL ? 212e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu v.getRight() : v.getLeft(); 213e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu } 214e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu ArrayList<View> views = rows.get(rowLocation); 215e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu if (views == null) { 216e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu views = new ArrayList<View>(); 217e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu rows.put(rowLocation, views); 218c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu rowLocations.add(rowLocation); 219e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu } 220e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu views.add(v); 221e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu } 222c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu Object[] sortedLocations = rowLocations.toArray(); 223c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu Arrays.sort(sortedLocations); 224c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu if (mNumRows != rows.size()) { 225c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu assertEquals("Dump Views by rows "+rows, mNumRows, rows.size()); 226c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu } 227e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu View[][] sorted = new View[rows.size()][]; 228c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu for (int i = 0; i < rowLocations.size(); i++) { 229c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu Integer rowLocation = rowLocations.get(i); 230c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu ArrayList<View> arr = rows.get(rowLocation); 231e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu View[] views = arr.toArray(new View[arr.size()]); 232e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu Arrays.sort(views, mRowSortComparator); 233c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu sorted[i] = views; 234e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu } 235e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu return sorted; 236e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu } 237e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu 238e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu protected void verifyMargin() { 239e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu View[][] sorted = sortByRows(); 240e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu for (int row = 0; row < sorted.length; row++) { 241e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu View[] views = sorted[row]; 242e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu int margin = -1; 243e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu for (int i = 1; i < views.length; i++) { 244e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu if (mOrientation == BaseGridView.HORIZONTAL) { 245492506cede17ecee39ce7fa35ee7a347ff31c5baDake Gu assertEquals(mGridView.getHorizontalMargin(), 246492506cede17ecee39ce7fa35ee7a347ff31c5baDake Gu views[i].getLeft() - views[i - 1].getRight()); 247e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu } else { 248492506cede17ecee39ce7fa35ee7a347ff31c5baDake Gu assertEquals(mGridView.getVerticalMargin(), 249492506cede17ecee39ce7fa35ee7a347ff31c5baDake Gu views[i].getTop() - views[i - 1].getBottom()); 250e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu } 251e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu } 252e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu } 253e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu } 254e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu 255e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu protected void verifyBeginAligned() { 256e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu View[][] sorted = sortByRows(); 257e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu int alignedLocation = 0; 258e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu if (mOrientation == BaseGridView.HORIZONTAL) { 259e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu if (mGridView.getLayoutDirection() == ViewGroup.LAYOUT_DIRECTION_RTL) { 260e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu for (int i = 0; i < sorted.length; i++) { 261e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu if (i == 0) { 262e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu alignedLocation = sorted[i][sorted[i].length - 1].getRight(); 263e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu } else { 264e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu assertEquals(alignedLocation, sorted[i][sorted[i].length - 1].getRight()); 265e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu } 266e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu } 267e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu } else { 268e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu for (int i = 0; i < sorted.length; i++) { 269e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu if (i == 0) { 270e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu alignedLocation = sorted[i][0].getLeft(); 271e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu } else { 272e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu assertEquals(alignedLocation, sorted[i][0].getLeft()); 273e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu } 274e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu } 275e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu } 276e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu } else { 277e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu for (int i = 0; i < sorted.length; i++) { 278e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu if (i == 0) { 279e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu alignedLocation = sorted[i][0].getTop(); 280e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu } else { 281e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu assertEquals(alignedLocation, sorted[i][0].getTop()); 282e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu } 283e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu } 284e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu } 285e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu } 286e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu 287c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu protected int[] getEndEdges() { 288c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu View[][] sorted = sortByRows(); 289c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu int[] edges = new int[sorted.length]; 290c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu if (mOrientation == BaseGridView.HORIZONTAL) { 291c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu if (mGridView.getLayoutDirection() == ViewGroup.LAYOUT_DIRECTION_RTL) { 292c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu for (int i = 0; i < sorted.length; i++) { 293c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu edges[i] = sorted[i][0].getLeft(); 294c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu } 295c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu } else { 296c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu for (int i = 0; i < sorted.length; i++) { 297c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu edges[i] = sorted[i][sorted[i].length - 1].getRight(); 298c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu } 299c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu } 300c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu } else { 301c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu for (int i = 0; i < sorted.length; i++) { 302c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu edges[i] = sorted[i][sorted[i].length - 1].getBottom(); 303c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu } 304c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu } 305c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu return edges; 306c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu } 307c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu 308c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu protected void verifyEdgesSame(int[] edges, int[] edges2) { 309c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu assertEquals(edges.length, edges2.length); 310c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu for (int i = 0; i < edges.length; i++) { 311c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu assertEquals(edges[i], edges2[i]); 312c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu } 313c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu } 314c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu 31585df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu protected void verifyBoundCount(int count) { 31685df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu if (mActivity.getBoundCount() != count) { 31785df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu StringBuffer b = new StringBuffer(); 31885df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu b.append("ItemsLength: "); 31985df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu for (int i = 0; i < mActivity.mItemLengths.length; i++) { 32085df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu b.append(mActivity.mItemLengths[i]).append(","); 32185df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu } 32285df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu assertEquals("Bound count does not match, ItemsLengths: "+ b, 32385df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu count, mActivity.getBoundCount()); 32485df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu } 32585df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu } 32685df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu 3278c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu private static int getCenterY(View v) { 3288c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu return (v.getTop() + v.getBottom())/2; 3298c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu } 330062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu 3318c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu private static int getCenterX(View v) { 3328c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu return (v.getLeft() + v.getRight())/2; 3338c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu } 3348c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu 3358c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu private void initActivity(Intent intent) { 3368c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu setActivityIntent(intent); 3378c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu mActivity = getActivity(); 3388c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu final String testName = getName(); 3398c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu try { 3408c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu runTestOnUiThread(new Runnable() { 3418c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu public void run() { 3428c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu mActivity.setTitle(testName); 3438c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu } 3448c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu }); 3458c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu Thread.sleep(1000); 3468c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu } catch (Throwable t) { 3478c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu t.printStackTrace(); 3488c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu } 3498c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu mGridView = mActivity.mGridView; 3508c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu } 3518c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu 3528c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu public void testThreeRowHorizontalBasic() throws Throwable { 353062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu mInstrumentation = getInstrumentation(); 354062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class); 355247741d74797105ba4f6d2834ec56dab32c14644Dake Gu intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID, R.layout.horizontal_grid); 356e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 100); 3578c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu initActivity(intent); 358247741d74797105ba4f6d2834ec56dab32c14644Dake Gu mOrientation = BaseGridView.HORIZONTAL; 359247741d74797105ba4f6d2834ec56dab32c14644Dake Gu mNumRows = 3; 360062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu 361a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu scrollToEnd(mVerifyLayout); 36285df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu verifyBoundCount(100); 363e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu 364a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu scrollToBegin(mVerifyLayout); 365062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu 366e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu verifyBeginAligned(); 367062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu } 368062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu 369e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu public void testThreeColumnVerticalBasic() throws Throwable { 370e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu 371e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu mInstrumentation = getInstrumentation(); 372e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class); 373247741d74797105ba4f6d2834ec56dab32c14644Dake Gu intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID, R.layout.vertical_grid); 374e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 200); 3758c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu initActivity(intent); 376247741d74797105ba4f6d2834ec56dab32c14644Dake Gu mOrientation = BaseGridView.VERTICAL; 377247741d74797105ba4f6d2834ec56dab32c14644Dake Gu mNumRows = 3; 378e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu 379a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu scrollToEnd(mVerifyLayout); 38085df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu verifyBoundCount(200); 381e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu 382a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu scrollToBegin(mVerifyLayout); 38385df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu 38485df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu verifyBeginAligned(); 38585df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu } 38685df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu 38785df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu public void testRedundantAppendRemove() throws Throwable { 38885df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu mInstrumentation = getInstrumentation(); 38985df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class); 390247741d74797105ba4f6d2834ec56dab32c14644Dake Gu intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID, 391247741d74797105ba4f6d2834ec56dab32c14644Dake Gu R.layout.vertical_grid_testredundantappendremove); 39285df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu intent.putExtra(GridActivity.EXTRA_ITEMS, new int[]{ 39385df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu 149,177,128,234,227,187,163,223,146,210,228,148,227,193,182,197,177,142,225,207, 39485df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu 157,171,209,204,187,184,123,221,197,153,202,179,193,214,226,173,225,143,188,159, 39585df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu 139,193,233,143,227,203,222,124,228,223,164,131,228,126,211,160,165,152,235,184, 39685df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu 155,224,149,181,171,229,200,234,177,130,164,172,188,139,132,203,179,220,147,131, 39785df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu 226,127,230,239,183,203,206,227,123,170,239,234,200,149,237,204,160,133,202,234, 39885df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu 173,122,139,149,151,153,216,231,121,145,227,153,186,174,223,180,123,215,206,216, 39985df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu 239,222,219,207,193,218,140,133,171,153,183,132,233,138,159,174,189,171,143,128, 40085df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu 152,222,141,202,224,190,134,120,181,231,230,136,132,224,136,210,207,150,128,183, 40185df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu 221,194,179,220,126,221,137,205,223,193,172,132,226,209,133,191,227,127,159,171, 40285df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu 180,149,237,177,194,207,170,202,161,144,147,199,205,186,164,140,193,203,224,129}); 4038c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu initActivity(intent); 404247741d74797105ba4f6d2834ec56dab32c14644Dake Gu mOrientation = BaseGridView.VERTICAL; 405247741d74797105ba4f6d2834ec56dab32c14644Dake Gu mNumRows = 3; 40685df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu 407a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu scrollToEnd(mVerifyLayout); 40885df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu 40985df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu verifyBoundCount(200); 410e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu 411a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu scrollToBegin(mVerifyLayout); 412e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu 413e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu verifyBeginAligned(); 414e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu } 41585df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu 41685df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu public void testRedundantAppendRemove2() throws Throwable { 41785df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu mInstrumentation = getInstrumentation(); 41885df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class); 419247741d74797105ba4f6d2834ec56dab32c14644Dake Gu intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID, 420247741d74797105ba4f6d2834ec56dab32c14644Dake Gu R.layout.horizontal_grid_testredundantappendremove2); 42185df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu intent.putExtra(GridActivity.EXTRA_ITEMS, new int[]{ 42285df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu 318,333,199,224,246,273,269,289,340,313,265,306,349,269,185,282,257,354,316,252, 42385df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu 237,290,283,343,196,313,290,343,191,262,342,228,343,349,251,203,226,305,265,213, 42485df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu 216,333,295,188,187,281,288,311,244,232,224,332,290,181,267,276,226,261,335,355, 42585df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu 225,217,219,183,234,285,257,304,182,250,244,223,257,219,342,185,347,205,302,315, 42685df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu 299,309,292,237,192,309,228,250,347,227,337,298,299,185,185,331,223,284,265,351}); 4278c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu initActivity(intent); 428247741d74797105ba4f6d2834ec56dab32c14644Dake Gu mOrientation = BaseGridView.HORIZONTAL; 429247741d74797105ba4f6d2834ec56dab32c14644Dake Gu mNumRows = 3; 43085df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu mLayoutManager = (GridLayoutManager) mGridView.getLayoutManager(); 43185df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu 43285df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu // test append without staggered result cache 433a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu scrollToEnd(mVerifyLayout); 43485df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu 43585df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu verifyBoundCount(100); 436c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu int[] endEdges = getEndEdges(); 43785df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu 438a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu scrollToBegin(mVerifyLayout); 43985df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu 44085df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu verifyBeginAligned(); 44185df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu 44285df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu // now test append with staggered result cache 443f518dc6b5898d16d0b8818ff4d06425b2bb0b3d0Dake Gu changeArraySize(3); 44485df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu assertEquals("Staggerd cache should be kept as is when no item size change", 44585df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu 100, ((StaggeredGrid) mLayoutManager.mGrid).mLocations.size()); 44685df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu 44785df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu mActivity.resetBoundCount(); 448f518dc6b5898d16d0b8818ff4d06425b2bb0b3d0Dake Gu changeArraySize(100); 44985df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu 450a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu scrollToEnd(mVerifyLayout); 45185df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu verifyBoundCount(100); 452c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu 453c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu // we should get same aligned end edges 454c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu int[] endEdges2 = getEndEdges(); 455c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu verifyEdgesSame(endEdges, endEdges2); 45685df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu } 45785df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu 458c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu public void testItemMovedHorizontal() throws Throwable { 45985df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu 46085df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu mInstrumentation = getInstrumentation(); 46185df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class); 462247741d74797105ba4f6d2834ec56dab32c14644Dake Gu intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID, 463247741d74797105ba4f6d2834ec56dab32c14644Dake Gu R.layout.horizontal_grid); 46485df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 200); 4658c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu initActivity(intent); 466247741d74797105ba4f6d2834ec56dab32c14644Dake Gu mOrientation = BaseGridView.HORIZONTAL; 467247741d74797105ba4f6d2834ec56dab32c14644Dake Gu mNumRows = 3; 46885df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu 46985df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu mGridView.setSelectedPositionSmooth(150); 47085df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu waitForScrollIdle(mVerifyLayout); 47185df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu mActivity.swap(150, 152); 47285df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu waitForTransientStateGone(null); 47385df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu 47485df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu runTestOnUiThread(mVerifyLayout); 47585df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu 476a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu scrollToBegin(mVerifyLayout); 47785df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu 47885df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu verifyBeginAligned(); 47985df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu } 48085df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu 481c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu public void testItemMovedVertical() throws Throwable { 482c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu 483c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu mInstrumentation = getInstrumentation(); 484c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class); 485c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID, 486c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu R.layout.vertical_grid); 487c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 200); 4888c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu initActivity(intent); 489c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu mOrientation = BaseGridView.VERTICAL; 490c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu mNumRows = 3; 491c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu 492c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu mGridView.setSelectedPositionSmooth(150); 493c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu waitForScrollIdle(mVerifyLayout); 494c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu mActivity.swap(150, 152); 495c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu waitForTransientStateGone(null); 496c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu 497c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu runTestOnUiThread(mVerifyLayout); 498c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu 4997ee22537e201c3d6b5de2908aecc4b0cc59a05c2Dake Gu scrollToEnd(mVerifyLayout); 500a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu scrollToBegin(mVerifyLayout); 501c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu 502c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu verifyBeginAligned(); 503c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu } 504c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu 505ede7fd3c91008fb042c736240534d0d87234f112Dake Gu public void testItemAddRemoveHorizontal() throws Throwable { 506ede7fd3c91008fb042c736240534d0d87234f112Dake Gu 507ede7fd3c91008fb042c736240534d0d87234f112Dake Gu mInstrumentation = getInstrumentation(); 508ede7fd3c91008fb042c736240534d0d87234f112Dake Gu Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class); 509ede7fd3c91008fb042c736240534d0d87234f112Dake Gu intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID, 510ede7fd3c91008fb042c736240534d0d87234f112Dake Gu R.layout.horizontal_grid); 511ede7fd3c91008fb042c736240534d0d87234f112Dake Gu intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 200); 5128c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu initActivity(intent); 513ede7fd3c91008fb042c736240534d0d87234f112Dake Gu mOrientation = BaseGridView.HORIZONTAL; 514ede7fd3c91008fb042c736240534d0d87234f112Dake Gu mNumRows = 3; 515ede7fd3c91008fb042c736240534d0d87234f112Dake Gu 516a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu scrollToEnd(mVerifyLayout); 517ede7fd3c91008fb042c736240534d0d87234f112Dake Gu int[] endEdges = getEndEdges(); 518ede7fd3c91008fb042c736240534d0d87234f112Dake Gu 519ede7fd3c91008fb042c736240534d0d87234f112Dake Gu mGridView.setSelectedPositionSmooth(150); 520ede7fd3c91008fb042c736240534d0d87234f112Dake Gu waitForScrollIdle(mVerifyLayout); 521ede7fd3c91008fb042c736240534d0d87234f112Dake Gu int[] removedItems = mActivity.removeItems(151, 4); 522ede7fd3c91008fb042c736240534d0d87234f112Dake Gu waitForTransientStateGone(null); 523ede7fd3c91008fb042c736240534d0d87234f112Dake Gu 524a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu scrollToEnd(mVerifyLayout); 525ede7fd3c91008fb042c736240534d0d87234f112Dake Gu mGridView.setSelectedPositionSmooth(150); 526ede7fd3c91008fb042c736240534d0d87234f112Dake Gu waitForScrollIdle(mVerifyLayout); 527ede7fd3c91008fb042c736240534d0d87234f112Dake Gu 528ede7fd3c91008fb042c736240534d0d87234f112Dake Gu mActivity.addItems(151, removedItems); 529ede7fd3c91008fb042c736240534d0d87234f112Dake Gu waitForTransientStateGone(null); 530a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu scrollToEnd(mVerifyLayout); 531ede7fd3c91008fb042c736240534d0d87234f112Dake Gu 532ede7fd3c91008fb042c736240534d0d87234f112Dake Gu // we should get same aligned end edges 533ede7fd3c91008fb042c736240534d0d87234f112Dake Gu int[] endEdges2 = getEndEdges(); 534ede7fd3c91008fb042c736240534d0d87234f112Dake Gu verifyEdgesSame(endEdges, endEdges2); 535ede7fd3c91008fb042c736240534d0d87234f112Dake Gu 536a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu scrollToBegin(mVerifyLayout); 537ede7fd3c91008fb042c736240534d0d87234f112Dake Gu verifyBeginAligned(); 538ede7fd3c91008fb042c736240534d0d87234f112Dake Gu } 539ede7fd3c91008fb042c736240534d0d87234f112Dake Gu 54091feb947412e0521a5f1835553214dcbe03fd362Dake Gu public void testBug22209986() throws Throwable { 54191feb947412e0521a5f1835553214dcbe03fd362Dake Gu 54291feb947412e0521a5f1835553214dcbe03fd362Dake Gu mInstrumentation = getInstrumentation(); 54391feb947412e0521a5f1835553214dcbe03fd362Dake Gu Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class); 54491feb947412e0521a5f1835553214dcbe03fd362Dake Gu intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID, 54591feb947412e0521a5f1835553214dcbe03fd362Dake Gu R.layout.horizontal_linear); 54691feb947412e0521a5f1835553214dcbe03fd362Dake Gu intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 50); 54791feb947412e0521a5f1835553214dcbe03fd362Dake Gu initActivity(intent); 54891feb947412e0521a5f1835553214dcbe03fd362Dake Gu mOrientation = BaseGridView.HORIZONTAL; 54991feb947412e0521a5f1835553214dcbe03fd362Dake Gu mNumRows = 1; 55091feb947412e0521a5f1835553214dcbe03fd362Dake Gu 55191feb947412e0521a5f1835553214dcbe03fd362Dake Gu final int focusToIndex = mGridView.getChildCount() - 1; 55291feb947412e0521a5f1835553214dcbe03fd362Dake Gu runTestOnUiThread(new Runnable() { 55391feb947412e0521a5f1835553214dcbe03fd362Dake Gu public void run() { 55491feb947412e0521a5f1835553214dcbe03fd362Dake Gu mGridView.setSelectedPositionSmooth(focusToIndex); 55591feb947412e0521a5f1835553214dcbe03fd362Dake Gu } 55691feb947412e0521a5f1835553214dcbe03fd362Dake Gu }); 55791feb947412e0521a5f1835553214dcbe03fd362Dake Gu 55891feb947412e0521a5f1835553214dcbe03fd362Dake Gu waitForTransientStateGone(null); 55991feb947412e0521a5f1835553214dcbe03fd362Dake Gu waitForScrollIdle(); 56091feb947412e0521a5f1835553214dcbe03fd362Dake Gu runTestOnUiThread(new Runnable() { 56191feb947412e0521a5f1835553214dcbe03fd362Dake Gu public void run() { 56291feb947412e0521a5f1835553214dcbe03fd362Dake Gu mGridView.setSelectedPositionSmooth(focusToIndex + 1); 56391feb947412e0521a5f1835553214dcbe03fd362Dake Gu } 56491feb947412e0521a5f1835553214dcbe03fd362Dake Gu }); 56591feb947412e0521a5f1835553214dcbe03fd362Dake Gu // let the scroll running for a while and requestLayout during scroll 56691feb947412e0521a5f1835553214dcbe03fd362Dake Gu Thread.sleep(80); 56791feb947412e0521a5f1835553214dcbe03fd362Dake Gu runTestOnUiThread(new Runnable() { 56891feb947412e0521a5f1835553214dcbe03fd362Dake Gu public void run() { 56991feb947412e0521a5f1835553214dcbe03fd362Dake Gu assertEquals(mGridView.getScrollState(), BaseGridView.SCROLL_STATE_SETTLING); 57091feb947412e0521a5f1835553214dcbe03fd362Dake Gu mGridView.requestLayout(); 57191feb947412e0521a5f1835553214dcbe03fd362Dake Gu } 57291feb947412e0521a5f1835553214dcbe03fd362Dake Gu }); 57391feb947412e0521a5f1835553214dcbe03fd362Dake Gu waitForTransientStateGone(null); 57491feb947412e0521a5f1835553214dcbe03fd362Dake Gu waitForScrollIdle(); 57591feb947412e0521a5f1835553214dcbe03fd362Dake Gu 57691feb947412e0521a5f1835553214dcbe03fd362Dake Gu int leftEdge = mGridView.getLayoutManager().findViewByPosition(focusToIndex).getLeft(); 57791feb947412e0521a5f1835553214dcbe03fd362Dake Gu 57891feb947412e0521a5f1835553214dcbe03fd362Dake Gu runTestOnUiThread(new Runnable() { 57991feb947412e0521a5f1835553214dcbe03fd362Dake Gu public void run() { 58091feb947412e0521a5f1835553214dcbe03fd362Dake Gu mGridView.requestLayout(); 58191feb947412e0521a5f1835553214dcbe03fd362Dake Gu } 58291feb947412e0521a5f1835553214dcbe03fd362Dake Gu }); 58391feb947412e0521a5f1835553214dcbe03fd362Dake Gu waitForTransientStateGone(null); 58491feb947412e0521a5f1835553214dcbe03fd362Dake Gu waitForScrollIdle(); 58591feb947412e0521a5f1835553214dcbe03fd362Dake Gu assertEquals(leftEdge, 58691feb947412e0521a5f1835553214dcbe03fd362Dake Gu mGridView.getLayoutManager().findViewByPosition(focusToIndex).getLeft()); 58791feb947412e0521a5f1835553214dcbe03fd362Dake Gu } 58891feb947412e0521a5f1835553214dcbe03fd362Dake Gu 589ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu public void testScrollAndRemove() throws Throwable { 590ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu 591ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu mInstrumentation = getInstrumentation(); 592ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class); 593ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID, 594ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu R.layout.horizontal_linear); 595ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 50); 596ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu initActivity(intent); 597ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu mOrientation = BaseGridView.HORIZONTAL; 598ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu mNumRows = 1; 599ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu 600ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu final int focusToIndex = mGridView.getChildCount() - 1; 601ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu runTestOnUiThread(new Runnable() { 602ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu public void run() { 603ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu mGridView.setSelectedPositionSmooth(focusToIndex); 604ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu } 605ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu }); 606ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu 607ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu runTestOnUiThread(new Runnable() { 608ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu public void run() { 609ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu mActivity.removeItems(focusToIndex, 1); 610ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu } 611ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu }); 612ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu 613ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu waitForTransientStateGone(null); 614ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu waitForScrollIdle(); 615ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu int leftEdge = mGridView.getLayoutManager().findViewByPosition(focusToIndex).getLeft(); 616ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu 617ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu runTestOnUiThread(new Runnable() { 618ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu public void run() { 619ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu mGridView.requestLayout(); 620ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu } 621ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu }); 622ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu waitForTransientStateGone(null); 623ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu waitForScrollIdle(); 624ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu assertEquals(leftEdge, 625ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu mGridView.getLayoutManager().findViewByPosition(focusToIndex).getLeft()); 626ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu } 627ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu 6284927a3bbd1921aed5da5d276a5d15240b2960faeDake Gu public void testScrollAndInsert() throws Throwable { 6294927a3bbd1921aed5da5d276a5d15240b2960faeDake Gu 6304927a3bbd1921aed5da5d276a5d15240b2960faeDake Gu mInstrumentation = getInstrumentation(); 6314927a3bbd1921aed5da5d276a5d15240b2960faeDake Gu Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class); 6324927a3bbd1921aed5da5d276a5d15240b2960faeDake Gu intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID, 6334927a3bbd1921aed5da5d276a5d15240b2960faeDake Gu R.layout.vertical_grid); 6344927a3bbd1921aed5da5d276a5d15240b2960faeDake Gu int[] items = new int[1000]; 6354927a3bbd1921aed5da5d276a5d15240b2960faeDake Gu for (int i = 0; i < items.length; i++) { 6364927a3bbd1921aed5da5d276a5d15240b2960faeDake Gu items[i] = 300 + (int)(Math.random() * 100); 6374927a3bbd1921aed5da5d276a5d15240b2960faeDake Gu } 6384927a3bbd1921aed5da5d276a5d15240b2960faeDake Gu intent.putExtra(GridActivity.EXTRA_ITEMS, items); 6394927a3bbd1921aed5da5d276a5d15240b2960faeDake Gu intent.putExtra(GridActivity.EXTRA_STAGGERED, true); 6404927a3bbd1921aed5da5d276a5d15240b2960faeDake Gu mOrientation = BaseGridView.VERTICAL; 6414927a3bbd1921aed5da5d276a5d15240b2960faeDake Gu mNumRows = 3; 6424927a3bbd1921aed5da5d276a5d15240b2960faeDake Gu 6434927a3bbd1921aed5da5d276a5d15240b2960faeDake Gu initActivity(intent); 6444927a3bbd1921aed5da5d276a5d15240b2960faeDake Gu 6454927a3bbd1921aed5da5d276a5d15240b2960faeDake Gu runTestOnUiThread(new Runnable() { 6464927a3bbd1921aed5da5d276a5d15240b2960faeDake Gu public void run() { 6474927a3bbd1921aed5da5d276a5d15240b2960faeDake Gu mGridView.setSelectedPositionSmooth(150); 6484927a3bbd1921aed5da5d276a5d15240b2960faeDake Gu } 6494927a3bbd1921aed5da5d276a5d15240b2960faeDake Gu }); 6504927a3bbd1921aed5da5d276a5d15240b2960faeDake Gu waitForScrollIdle(mVerifyLayout); 6514927a3bbd1921aed5da5d276a5d15240b2960faeDake Gu 6524927a3bbd1921aed5da5d276a5d15240b2960faeDake Gu View view = mGridView.getChildAt(mGridView.getChildCount() - 1); 6534927a3bbd1921aed5da5d276a5d15240b2960faeDake Gu final int focusToIndex = mGridView.getChildAdapterPosition(view); 6544927a3bbd1921aed5da5d276a5d15240b2960faeDake Gu runTestOnUiThread(new Runnable() { 6554927a3bbd1921aed5da5d276a5d15240b2960faeDake Gu public void run() { 6564927a3bbd1921aed5da5d276a5d15240b2960faeDake Gu mGridView.setSelectedPositionSmooth(focusToIndex); 6574927a3bbd1921aed5da5d276a5d15240b2960faeDake Gu } 6584927a3bbd1921aed5da5d276a5d15240b2960faeDake Gu }); 6594927a3bbd1921aed5da5d276a5d15240b2960faeDake Gu 6604927a3bbd1921aed5da5d276a5d15240b2960faeDake Gu runTestOnUiThread(new Runnable() { 6614927a3bbd1921aed5da5d276a5d15240b2960faeDake Gu public void run() { 6624927a3bbd1921aed5da5d276a5d15240b2960faeDake Gu int[] newItems = new int[]{300, 300, 300}; 6634927a3bbd1921aed5da5d276a5d15240b2960faeDake Gu mActivity.addItems(0, newItems); 6644927a3bbd1921aed5da5d276a5d15240b2960faeDake Gu } 6654927a3bbd1921aed5da5d276a5d15240b2960faeDake Gu }); 6664927a3bbd1921aed5da5d276a5d15240b2960faeDake Gu 6674927a3bbd1921aed5da5d276a5d15240b2960faeDake Gu waitForTransientStateGone(null); 6684927a3bbd1921aed5da5d276a5d15240b2960faeDake Gu waitForScrollIdle(); 6694927a3bbd1921aed5da5d276a5d15240b2960faeDake Gu } 6704927a3bbd1921aed5da5d276a5d15240b2960faeDake Gu 6714927a3bbd1921aed5da5d276a5d15240b2960faeDake Gu public void testScrollAndInsertBeforeVisibleItem() throws Throwable { 6724927a3bbd1921aed5da5d276a5d15240b2960faeDake Gu 6734927a3bbd1921aed5da5d276a5d15240b2960faeDake Gu mInstrumentation = getInstrumentation(); 6744927a3bbd1921aed5da5d276a5d15240b2960faeDake Gu Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class); 6754927a3bbd1921aed5da5d276a5d15240b2960faeDake Gu intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID, 6764927a3bbd1921aed5da5d276a5d15240b2960faeDake Gu R.layout.vertical_grid); 6774927a3bbd1921aed5da5d276a5d15240b2960faeDake Gu int[] items = new int[1000]; 6784927a3bbd1921aed5da5d276a5d15240b2960faeDake Gu for (int i = 0; i < items.length; i++) { 6794927a3bbd1921aed5da5d276a5d15240b2960faeDake Gu items[i] = 300 + (int)(Math.random() * 100); 6804927a3bbd1921aed5da5d276a5d15240b2960faeDake Gu } 6814927a3bbd1921aed5da5d276a5d15240b2960faeDake Gu intent.putExtra(GridActivity.EXTRA_ITEMS, items); 6824927a3bbd1921aed5da5d276a5d15240b2960faeDake Gu intent.putExtra(GridActivity.EXTRA_STAGGERED, true); 6834927a3bbd1921aed5da5d276a5d15240b2960faeDake Gu mOrientation = BaseGridView.VERTICAL; 6844927a3bbd1921aed5da5d276a5d15240b2960faeDake Gu mNumRows = 3; 6854927a3bbd1921aed5da5d276a5d15240b2960faeDake Gu 6864927a3bbd1921aed5da5d276a5d15240b2960faeDake Gu initActivity(intent); 6874927a3bbd1921aed5da5d276a5d15240b2960faeDake Gu 6884927a3bbd1921aed5da5d276a5d15240b2960faeDake Gu runTestOnUiThread(new Runnable() { 6894927a3bbd1921aed5da5d276a5d15240b2960faeDake Gu public void run() { 6904927a3bbd1921aed5da5d276a5d15240b2960faeDake Gu mGridView.setSelectedPositionSmooth(150); 6914927a3bbd1921aed5da5d276a5d15240b2960faeDake Gu } 6924927a3bbd1921aed5da5d276a5d15240b2960faeDake Gu }); 6934927a3bbd1921aed5da5d276a5d15240b2960faeDake Gu waitForScrollIdle(mVerifyLayout); 6944927a3bbd1921aed5da5d276a5d15240b2960faeDake Gu 6954927a3bbd1921aed5da5d276a5d15240b2960faeDake Gu View view = mGridView.getChildAt(mGridView.getChildCount() - 1); 6964927a3bbd1921aed5da5d276a5d15240b2960faeDake Gu final int focusToIndex = mGridView.getChildAdapterPosition(view); 6974927a3bbd1921aed5da5d276a5d15240b2960faeDake Gu runTestOnUiThread(new Runnable() { 6984927a3bbd1921aed5da5d276a5d15240b2960faeDake Gu public void run() { 6994927a3bbd1921aed5da5d276a5d15240b2960faeDake Gu mGridView.setSelectedPositionSmooth(focusToIndex); 7004927a3bbd1921aed5da5d276a5d15240b2960faeDake Gu } 7014927a3bbd1921aed5da5d276a5d15240b2960faeDake Gu }); 7024927a3bbd1921aed5da5d276a5d15240b2960faeDake Gu 7034927a3bbd1921aed5da5d276a5d15240b2960faeDake Gu runTestOnUiThread(new Runnable() { 7044927a3bbd1921aed5da5d276a5d15240b2960faeDake Gu public void run() { 7054927a3bbd1921aed5da5d276a5d15240b2960faeDake Gu int[] newItems = new int[]{300, 300, 300}; 7064927a3bbd1921aed5da5d276a5d15240b2960faeDake Gu mActivity.addItems(focusToIndex, newItems); 7074927a3bbd1921aed5da5d276a5d15240b2960faeDake Gu } 7084927a3bbd1921aed5da5d276a5d15240b2960faeDake Gu }); 7094927a3bbd1921aed5da5d276a5d15240b2960faeDake Gu 7104927a3bbd1921aed5da5d276a5d15240b2960faeDake Gu waitForTransientStateGone(null); 7114927a3bbd1921aed5da5d276a5d15240b2960faeDake Gu waitForScrollIdle(); 7124927a3bbd1921aed5da5d276a5d15240b2960faeDake Gu } 7134927a3bbd1921aed5da5d276a5d15240b2960faeDake Gu 714ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu public void testSmoothScrollAndRemove() throws Throwable { 715ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu 716ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu mInstrumentation = getInstrumentation(); 717ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class); 718ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID, 719ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu R.layout.horizontal_linear); 720ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 50); 721ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu initActivity(intent); 722ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu mOrientation = BaseGridView.HORIZONTAL; 723ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu mNumRows = 1; 724ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu 725ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu final int focusToIndex = 40; 726ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu runTestOnUiThread(new Runnable() { 727ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu public void run() { 728ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu mGridView.setSelectedPositionSmooth(focusToIndex); 729ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu } 730ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu }); 731ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu 732ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu runTestOnUiThread(new Runnable() { 733ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu public void run() { 734ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu mActivity.removeItems(focusToIndex, 1); 735ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu } 736ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu }); 737ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu 738ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu Thread.sleep(20); // wait for layout 739ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu assertTrue("removing the index of not attached child should not affect smooth scroller", 740ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu mGridView.getLayoutManager().isSmoothScrolling()); 741ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu waitForTransientStateGone(null); 742ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu waitForScrollIdle(); 743ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu int leftEdge = mGridView.getLayoutManager().findViewByPosition(focusToIndex).getLeft(); 744ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu 745ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu runTestOnUiThread(new Runnable() { 746ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu public void run() { 747ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu mGridView.requestLayout(); 748ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu } 749ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu }); 750ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu waitForTransientStateGone(null); 751ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu waitForScrollIdle(); 752ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu assertEquals(leftEdge, 753ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu mGridView.getLayoutManager().findViewByPosition(focusToIndex).getLeft()); 754ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu } 755ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu 756ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu public void testSmoothScrollAndRemove2() throws Throwable { 757ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu 758ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu mInstrumentation = getInstrumentation(); 759ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class); 760ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID, 761ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu R.layout.horizontal_linear); 762ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 50); 763ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu initActivity(intent); 764ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu mOrientation = BaseGridView.HORIZONTAL; 765ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu mNumRows = 1; 766ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu 767ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu final int focusToIndex = 40; 768ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu runTestOnUiThread(new Runnable() { 769ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu public void run() { 770ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu mGridView.setSelectedPositionSmooth(focusToIndex); 771ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu } 772ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu }); 773ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu 774ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu final int removeIndex = mGridView.getChildCount() - 1; 775ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu runTestOnUiThread(new Runnable() { 776ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu public void run() { 777ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu mActivity.removeItems(removeIndex, 1); 778ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu } 779ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu }); 780ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu 781ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu Thread.sleep(20); // wait for layout 782ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu assertFalse("removing the index of attached child should kill smooth scroller", 783ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu mGridView.getLayoutManager().isSmoothScrolling()); 784ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu waitForTransientStateGone(null); 785ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu waitForScrollIdle(); 786ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu int leftEdge = mGridView.getLayoutManager().findViewByPosition(focusToIndex).getLeft(); 787ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu 788ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu runTestOnUiThread(new Runnable() { 789ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu public void run() { 790ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu mGridView.requestLayout(); 791ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu } 792ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu }); 793ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu waitForTransientStateGone(null); 794ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu waitForScrollIdle(); 795ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu assertEquals(leftEdge, 796ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu mGridView.getLayoutManager().findViewByPosition(focusToIndex).getLeft()); 797ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu } 798ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu 799ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu public void testPendingSmoothScrollAndRemove() throws Throwable { 800ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu mInstrumentation = getInstrumentation(); 801ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class); 802ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID, 803ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu R.layout.vertical_linear); 804ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu intent.putExtra(GridActivity.EXTRA_REQUEST_FOCUS_ONLAYOUT, true); 805ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu int[] items = new int[100]; 806ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu for (int i = 0; i < items.length; i++) { 807ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu items[i] = 630 + (int)(Math.random() * 100); 808ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu } 809ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu intent.putExtra(GridActivity.EXTRA_ITEMS, items); 810ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu intent.putExtra(GridActivity.EXTRA_STAGGERED, true); 811ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu mOrientation = BaseGridView.VERTICAL; 812ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu mNumRows = 1; 813ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu 814ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu initActivity(intent); 815ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu 816ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu mGridView.setSelectedPositionSmooth(0); 817ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu waitForScrollIdle(mVerifyLayout); 818ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu assertTrue(mGridView.getChildAt(0).hasFocus()); 819ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu 820ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu // Pressing lots of key to make sure smooth scroller is running 821ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu for (int i = 0; i < 20; i++) { 822ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu sendKeys(KeyEvent.KEYCODE_DPAD_DOWN); 823ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu } 824ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu Thread.sleep(100); 825ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu 826ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu assertTrue(mGridView.getLayoutManager().isSmoothScrolling()); 827ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu final int removeIndex = mGridView.getChildCount() - 1; 828ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu runTestOnUiThread(new Runnable() { 829ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu public void run() { 830ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu mActivity.removeItems(removeIndex, 1); 831ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu } 832ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu }); 833ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu 834ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu Thread.sleep(20); // wait for layout 835ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu assertFalse("removing the index of attached child should kill smooth scroller", 836ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu mGridView.getLayoutManager().isSmoothScrolling()); 837ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu 838ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu waitForTransientStateGone(null); 839ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu waitForScrollIdle(); 840ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu int focusIndex = mGridView.getSelectedPosition(); 841ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu int leftEdge = mGridView.getLayoutManager().findViewByPosition(focusIndex).getLeft(); 842ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu 843ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu runTestOnUiThread(new Runnable() { 844ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu public void run() { 845ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu mGridView.requestLayout(); 846ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu } 847ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu }); 848ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu waitForTransientStateGone(null); 849ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu waitForScrollIdle(); 850ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu assertEquals(leftEdge, 851ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu mGridView.getLayoutManager().findViewByPosition(focusIndex).getLeft()); 852ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu } 853ff3b38c570fa25327bb6a9bca1753827d9f9d7fdDake Gu 8549c56475370d1df940252ff1360b92de50022fff6Dake Gu public void testFocusToFirstItem() throws Throwable { 8559c56475370d1df940252ff1360b92de50022fff6Dake Gu 8569c56475370d1df940252ff1360b92de50022fff6Dake Gu mInstrumentation = getInstrumentation(); 8579c56475370d1df940252ff1360b92de50022fff6Dake Gu Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class); 8589c56475370d1df940252ff1360b92de50022fff6Dake Gu intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID, 8599c56475370d1df940252ff1360b92de50022fff6Dake Gu R.layout.horizontal_grid); 8609c56475370d1df940252ff1360b92de50022fff6Dake Gu intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 200); 8619c56475370d1df940252ff1360b92de50022fff6Dake Gu initActivity(intent); 8629c56475370d1df940252ff1360b92de50022fff6Dake Gu mOrientation = BaseGridView.HORIZONTAL; 8639c56475370d1df940252ff1360b92de50022fff6Dake Gu mNumRows = 3; 8649c56475370d1df940252ff1360b92de50022fff6Dake Gu 8659c56475370d1df940252ff1360b92de50022fff6Dake Gu int[] removedItems = mActivity.removeItems(0, 200); 8669c56475370d1df940252ff1360b92de50022fff6Dake Gu 8679c56475370d1df940252ff1360b92de50022fff6Dake Gu waitForTransientStateGone(null); 868f518dc6b5898d16d0b8818ff4d06425b2bb0b3d0Dake Gu humanDelay(500); 8699c56475370d1df940252ff1360b92de50022fff6Dake Gu mActivity.addItems(0, removedItems); 8709c56475370d1df940252ff1360b92de50022fff6Dake Gu 8719c56475370d1df940252ff1360b92de50022fff6Dake Gu waitForTransientStateGone(null); 872f518dc6b5898d16d0b8818ff4d06425b2bb0b3d0Dake Gu humanDelay(500); 8739c56475370d1df940252ff1360b92de50022fff6Dake Gu assertTrue(mGridView.getLayoutManager().findViewByPosition(0).hasFocus()); 8749c56475370d1df940252ff1360b92de50022fff6Dake Gu 875f518dc6b5898d16d0b8818ff4d06425b2bb0b3d0Dake Gu changeArraySize(0); 8769c56475370d1df940252ff1360b92de50022fff6Dake Gu 877f518dc6b5898d16d0b8818ff4d06425b2bb0b3d0Dake Gu changeArraySize(200); 8789c56475370d1df940252ff1360b92de50022fff6Dake Gu assertTrue(mGridView.getLayoutManager().findViewByPosition(0).hasFocus()); 8799c56475370d1df940252ff1360b92de50022fff6Dake Gu } 8809c56475370d1df940252ff1360b92de50022fff6Dake Gu 88177b17ebed6d1f8488b150b25e2b6754971480caeDake Gu public void testNonFocusableHorizontal() throws Throwable { 88277b17ebed6d1f8488b150b25e2b6754971480caeDake Gu final int numItems = 200; 88377b17ebed6d1f8488b150b25e2b6754971480caeDake Gu final int startPos = 45; 88477b17ebed6d1f8488b150b25e2b6754971480caeDake Gu final int skips = 20; 88577b17ebed6d1f8488b150b25e2b6754971480caeDake Gu final int numColumns = 3; 88677b17ebed6d1f8488b150b25e2b6754971480caeDake Gu final int endPos = startPos + numColumns * (skips + 1); 88777b17ebed6d1f8488b150b25e2b6754971480caeDake Gu 88877b17ebed6d1f8488b150b25e2b6754971480caeDake Gu mInstrumentation = getInstrumentation(); 88977b17ebed6d1f8488b150b25e2b6754971480caeDake Gu Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class); 89077b17ebed6d1f8488b150b25e2b6754971480caeDake Gu intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID, 89177b17ebed6d1f8488b150b25e2b6754971480caeDake Gu R.layout.horizontal_grid); 89277b17ebed6d1f8488b150b25e2b6754971480caeDake Gu intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, numItems); 89377b17ebed6d1f8488b150b25e2b6754971480caeDake Gu intent.putExtra(GridActivity.EXTRA_STAGGERED, false); 89477b17ebed6d1f8488b150b25e2b6754971480caeDake Gu mOrientation = BaseGridView.HORIZONTAL; 89577b17ebed6d1f8488b150b25e2b6754971480caeDake Gu mNumRows = numColumns; 89677b17ebed6d1f8488b150b25e2b6754971480caeDake Gu boolean[] focusable = new boolean[numItems]; 89777b17ebed6d1f8488b150b25e2b6754971480caeDake Gu for (int i = 0; i < focusable.length; i++) { 89877b17ebed6d1f8488b150b25e2b6754971480caeDake Gu focusable[i] = true; 89977b17ebed6d1f8488b150b25e2b6754971480caeDake Gu } 90077b17ebed6d1f8488b150b25e2b6754971480caeDake Gu for (int i = startPos + mNumRows, j = 0; j < skips; i += mNumRows, j++) { 90177b17ebed6d1f8488b150b25e2b6754971480caeDake Gu focusable[i] = false; 90277b17ebed6d1f8488b150b25e2b6754971480caeDake Gu } 90377b17ebed6d1f8488b150b25e2b6754971480caeDake Gu intent.putExtra(GridActivity.EXTRA_ITEMS_FOCUSABLE, focusable); 9048c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu initActivity(intent); 90577b17ebed6d1f8488b150b25e2b6754971480caeDake Gu 90677b17ebed6d1f8488b150b25e2b6754971480caeDake Gu mGridView.setSelectedPositionSmooth(startPos); 90777b17ebed6d1f8488b150b25e2b6754971480caeDake Gu waitForScrollIdle(mVerifyLayout); 90877b17ebed6d1f8488b150b25e2b6754971480caeDake Gu 90977b17ebed6d1f8488b150b25e2b6754971480caeDake Gu if (mGridView.getLayoutDirection() == ViewGroup.LAYOUT_DIRECTION_RTL) { 91077b17ebed6d1f8488b150b25e2b6754971480caeDake Gu sendKeys(KeyEvent.KEYCODE_DPAD_LEFT); 91177b17ebed6d1f8488b150b25e2b6754971480caeDake Gu } else { 91277b17ebed6d1f8488b150b25e2b6754971480caeDake Gu sendKeys(KeyEvent.KEYCODE_DPAD_RIGHT); 91377b17ebed6d1f8488b150b25e2b6754971480caeDake Gu } 91477b17ebed6d1f8488b150b25e2b6754971480caeDake Gu waitForScrollIdle(mVerifyLayout); 91577b17ebed6d1f8488b150b25e2b6754971480caeDake Gu assertEquals(endPos, mGridView.getSelectedPosition()); 91677b17ebed6d1f8488b150b25e2b6754971480caeDake Gu 91777b17ebed6d1f8488b150b25e2b6754971480caeDake Gu if (mGridView.getLayoutDirection() == ViewGroup.LAYOUT_DIRECTION_RTL) { 91877b17ebed6d1f8488b150b25e2b6754971480caeDake Gu sendKeys(KeyEvent.KEYCODE_DPAD_RIGHT); 91977b17ebed6d1f8488b150b25e2b6754971480caeDake Gu } else { 92077b17ebed6d1f8488b150b25e2b6754971480caeDake Gu sendKeys(KeyEvent.KEYCODE_DPAD_LEFT); 92177b17ebed6d1f8488b150b25e2b6754971480caeDake Gu } 92277b17ebed6d1f8488b150b25e2b6754971480caeDake Gu waitForScrollIdle(mVerifyLayout); 92377b17ebed6d1f8488b150b25e2b6754971480caeDake Gu assertEquals(startPos, mGridView.getSelectedPosition()); 92477b17ebed6d1f8488b150b25e2b6754971480caeDake Gu 92577b17ebed6d1f8488b150b25e2b6754971480caeDake Gu } 92677b17ebed6d1f8488b150b25e2b6754971480caeDake Gu 92777b17ebed6d1f8488b150b25e2b6754971480caeDake Gu 92877b17ebed6d1f8488b150b25e2b6754971480caeDake Gu public void testNonFocusableVertical() throws Throwable { 92977b17ebed6d1f8488b150b25e2b6754971480caeDake Gu final int numItems = 200; 93077b17ebed6d1f8488b150b25e2b6754971480caeDake Gu final int startPos = 44; 93177b17ebed6d1f8488b150b25e2b6754971480caeDake Gu final int skips = 20; 93277b17ebed6d1f8488b150b25e2b6754971480caeDake Gu final int numColumns = 3; 93377b17ebed6d1f8488b150b25e2b6754971480caeDake Gu final int endPos = startPos + numColumns * (skips + 1); 93477b17ebed6d1f8488b150b25e2b6754971480caeDake Gu 93577b17ebed6d1f8488b150b25e2b6754971480caeDake Gu mInstrumentation = getInstrumentation(); 93677b17ebed6d1f8488b150b25e2b6754971480caeDake Gu Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class); 93777b17ebed6d1f8488b150b25e2b6754971480caeDake Gu intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID, 93877b17ebed6d1f8488b150b25e2b6754971480caeDake Gu R.layout.vertical_grid); 93977b17ebed6d1f8488b150b25e2b6754971480caeDake Gu intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, numItems); 94077b17ebed6d1f8488b150b25e2b6754971480caeDake Gu intent.putExtra(GridActivity.EXTRA_STAGGERED, false); 94177b17ebed6d1f8488b150b25e2b6754971480caeDake Gu mOrientation = BaseGridView.VERTICAL; 94277b17ebed6d1f8488b150b25e2b6754971480caeDake Gu mNumRows = numColumns; 94377b17ebed6d1f8488b150b25e2b6754971480caeDake Gu boolean[] focusable = new boolean[numItems]; 94477b17ebed6d1f8488b150b25e2b6754971480caeDake Gu for (int i = 0; i < focusable.length; i++) { 94577b17ebed6d1f8488b150b25e2b6754971480caeDake Gu focusable[i] = true; 94677b17ebed6d1f8488b150b25e2b6754971480caeDake Gu } 94777b17ebed6d1f8488b150b25e2b6754971480caeDake Gu for (int i = startPos + mNumRows, j = 0; j < skips; i += mNumRows, j++) { 94877b17ebed6d1f8488b150b25e2b6754971480caeDake Gu focusable[i] = false; 94977b17ebed6d1f8488b150b25e2b6754971480caeDake Gu } 95077b17ebed6d1f8488b150b25e2b6754971480caeDake Gu intent.putExtra(GridActivity.EXTRA_ITEMS_FOCUSABLE, focusable); 9518c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu initActivity(intent); 95277b17ebed6d1f8488b150b25e2b6754971480caeDake Gu 95377b17ebed6d1f8488b150b25e2b6754971480caeDake Gu mGridView.setSelectedPositionSmooth(startPos); 95477b17ebed6d1f8488b150b25e2b6754971480caeDake Gu waitForScrollIdle(mVerifyLayout); 95577b17ebed6d1f8488b150b25e2b6754971480caeDake Gu 95677b17ebed6d1f8488b150b25e2b6754971480caeDake Gu sendKeys(KeyEvent.KEYCODE_DPAD_DOWN); 95777b17ebed6d1f8488b150b25e2b6754971480caeDake Gu waitForScrollIdle(mVerifyLayout); 95877b17ebed6d1f8488b150b25e2b6754971480caeDake Gu assertEquals(endPos, mGridView.getSelectedPosition()); 95977b17ebed6d1f8488b150b25e2b6754971480caeDake Gu 96077b17ebed6d1f8488b150b25e2b6754971480caeDake Gu sendKeys(KeyEvent.KEYCODE_DPAD_UP); 96177b17ebed6d1f8488b150b25e2b6754971480caeDake Gu waitForScrollIdle(mVerifyLayout); 96277b17ebed6d1f8488b150b25e2b6754971480caeDake Gu assertEquals(startPos, mGridView.getSelectedPosition()); 96377b17ebed6d1f8488b150b25e2b6754971480caeDake Gu 96477b17ebed6d1f8488b150b25e2b6754971480caeDake Gu } 9656b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu 9666b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu public void testTransferFocusable() throws Throwable { 9676b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu final int numItems = 200; 9686b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu final int numColumns = 3; 9696b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu final int startPos = 1; 9706b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu 9716b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu mInstrumentation = getInstrumentation(); 9726b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class); 9736b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID, 9746b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu R.layout.horizontal_grid); 9756b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, numItems); 9766b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu intent.putExtra(GridActivity.EXTRA_STAGGERED, false); 9776b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu mOrientation = BaseGridView.HORIZONTAL; 9786b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu mNumRows = numColumns; 9796b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu boolean[] focusable = new boolean[numItems]; 9806b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu for (int i = 0; i < focusable.length; i++) { 9816b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu focusable[i] = true; 9826b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu } 9836b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu for (int i = 0; i < startPos; i++) { 9846b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu focusable[i] = false; 9856b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu } 9866b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu intent.putExtra(GridActivity.EXTRA_ITEMS_FOCUSABLE, focusable); 9878c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu initActivity(intent); 9886b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu 989f518dc6b5898d16d0b8818ff4d06425b2bb0b3d0Dake Gu changeArraySize(0); 9906b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu assertTrue(mGridView.isFocused()); 9916b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu 992f518dc6b5898d16d0b8818ff4d06425b2bb0b3d0Dake Gu changeArraySize(numItems); 9936b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu assertTrue(mGridView.getLayoutManager().findViewByPosition(startPos).hasFocus()); 9946b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu } 9956b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu 9966b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu public void testTransferFocusable2() throws Throwable { 9976b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu final int numItems = 200; 9986b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu final int numColumns = 3; 9996b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu final int startPos = 10; 10006b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu 10016b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu mInstrumentation = getInstrumentation(); 10026b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class); 10036b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID, 10046b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu R.layout.horizontal_grid); 10056b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, numItems); 10066b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu intent.putExtra(GridActivity.EXTRA_STAGGERED, true); 10076b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu mOrientation = BaseGridView.HORIZONTAL; 10086b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu mNumRows = numColumns; 10096b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu boolean[] focusable = new boolean[numItems]; 10106b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu for (int i = 0; i < focusable.length; i++) { 10116b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu focusable[i] = true; 10126b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu } 10136b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu for (int i = 0; i < startPos; i++) { 10146b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu focusable[i] = false; 10156b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu } 10166b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu intent.putExtra(GridActivity.EXTRA_ITEMS_FOCUSABLE, focusable); 10178c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu initActivity(intent); 10186b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu 1019f518dc6b5898d16d0b8818ff4d06425b2bb0b3d0Dake Gu changeArraySize(0); 10206b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu assertTrue(mGridView.isFocused()); 10216b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu 1022f518dc6b5898d16d0b8818ff4d06425b2bb0b3d0Dake Gu changeArraySize(numItems); 10236b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu assertTrue(mGridView.getLayoutManager().findViewByPosition(startPos).hasFocus()); 10246b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu } 1025fa5f60106a84a2b475c38cc6b8baa347bbd6ae1dDake Gu 10268c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu public void testNonFocusableLoseInFastLayout() throws Throwable { 1027fa5f60106a84a2b475c38cc6b8baa347bbd6ae1dDake Gu mInstrumentation = getInstrumentation(); 1028fa5f60106a84a2b475c38cc6b8baa347bbd6ae1dDake Gu Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class); 1029fa5f60106a84a2b475c38cc6b8baa347bbd6ae1dDake Gu intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID, 1030fa5f60106a84a2b475c38cc6b8baa347bbd6ae1dDake Gu R.layout.vertical_linear); 1031fa5f60106a84a2b475c38cc6b8baa347bbd6ae1dDake Gu int[] items = new int[300]; 1032fa5f60106a84a2b475c38cc6b8baa347bbd6ae1dDake Gu for (int i = 0; i < items.length; i++) { 1033fa5f60106a84a2b475c38cc6b8baa347bbd6ae1dDake Gu items[i] = 480; 1034fa5f60106a84a2b475c38cc6b8baa347bbd6ae1dDake Gu } 1035fa5f60106a84a2b475c38cc6b8baa347bbd6ae1dDake Gu intent.putExtra(GridActivity.EXTRA_ITEMS, items); 1036fa5f60106a84a2b475c38cc6b8baa347bbd6ae1dDake Gu intent.putExtra(GridActivity.EXTRA_STAGGERED, false); 1037fa5f60106a84a2b475c38cc6b8baa347bbd6ae1dDake Gu intent.putExtra(GridActivity.EXTRA_REQUEST_LAYOUT_ONFOCUS, true); 1038fa5f60106a84a2b475c38cc6b8baa347bbd6ae1dDake Gu mOrientation = BaseGridView.VERTICAL; 1039fa5f60106a84a2b475c38cc6b8baa347bbd6ae1dDake Gu mNumRows = 1; 1040fa5f60106a84a2b475c38cc6b8baa347bbd6ae1dDake Gu int pressDown = 15; 1041fa5f60106a84a2b475c38cc6b8baa347bbd6ae1dDake Gu 10428c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu initActivity(intent); 1043fa5f60106a84a2b475c38cc6b8baa347bbd6ae1dDake Gu 1044fa5f60106a84a2b475c38cc6b8baa347bbd6ae1dDake Gu mGridView.setSelectedPositionSmooth(0); 1045f518dc6b5898d16d0b8818ff4d06425b2bb0b3d0Dake Gu waitForScrollIdle(mVerifyLayout); 1046fa5f60106a84a2b475c38cc6b8baa347bbd6ae1dDake Gu 1047fa5f60106a84a2b475c38cc6b8baa347bbd6ae1dDake Gu for (int i = 0; i < pressDown; i++) { 1048fa5f60106a84a2b475c38cc6b8baa347bbd6ae1dDake Gu sendKeys(KeyEvent.KEYCODE_DPAD_DOWN); 1049fa5f60106a84a2b475c38cc6b8baa347bbd6ae1dDake Gu } 1050fa5f60106a84a2b475c38cc6b8baa347bbd6ae1dDake Gu waitForScrollIdle(mVerifyLayout); 1051fa5f60106a84a2b475c38cc6b8baa347bbd6ae1dDake Gu assertFalse(mGridView.isFocused()); 1052fa5f60106a84a2b475c38cc6b8baa347bbd6ae1dDake Gu 1053fa5f60106a84a2b475c38cc6b8baa347bbd6ae1dDake Gu } 1054fa5f60106a84a2b475c38cc6b8baa347bbd6ae1dDake Gu 10558c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu public void testSetSelectionWithDelta() throws Throwable { 10568c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu mInstrumentation = getInstrumentation(); 10578c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class); 10588c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID, 10598c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu R.layout.vertical_linear); 10608c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 300); 10618c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu intent.putExtra(GridActivity.EXTRA_STAGGERED, false); 10628c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu mOrientation = BaseGridView.VERTICAL; 10638c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu mNumRows = 1; 10648c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu 10658c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu initActivity(intent); 10668c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu 10678c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu runTestOnUiThread(new Runnable() { 10688c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu public void run() { 10698c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu mGridView.setSelectedPositionSmooth(3); 10708c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu } 10718c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu }); 10728c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu waitForScrollIdle(mVerifyLayout); 10738c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu int top1 = mGridView.getLayoutManager().findViewByPosition(3).getTop(); 10748c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu 1075f518dc6b5898d16d0b8818ff4d06425b2bb0b3d0Dake Gu humanDelay(1000); 10768c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu 10778c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu // scroll to position with delta 1078f518dc6b5898d16d0b8818ff4d06425b2bb0b3d0Dake Gu setSelectedPosition(3, 100); 10798c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu int top2 = mGridView.getLayoutManager().findViewByPosition(3).getTop(); 10808c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu assertEquals(top1 - 100, top2); 10818c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu 10828c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu // scroll to same position without delta, it will be reset 1083f518dc6b5898d16d0b8818ff4d06425b2bb0b3d0Dake Gu setSelectedPosition(3, 0); 10848c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu int top3 = mGridView.getLayoutManager().findViewByPosition(3).getTop(); 10858c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu assertEquals(top1, top3); 10868c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu 10878c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu // scroll invisible item after last visible item 10888c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu final int lastVisiblePos = ((GridLayoutManager)mGridView.getLayoutManager()) 10898c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu .mGrid.getLastVisibleIndex(); 1090f518dc6b5898d16d0b8818ff4d06425b2bb0b3d0Dake Gu setSelectedPosition(lastVisiblePos + 1, 100); 10918c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu int top4 = mGridView.getLayoutManager().findViewByPosition(lastVisiblePos + 1).getTop(); 10928c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu assertEquals(top1 - 100, top4); 10938c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu 10948c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu // scroll invisible item before first visible item 10958c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu final int firstVisiblePos = ((GridLayoutManager)mGridView.getLayoutManager()) 10968c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu .mGrid.getFirstVisibleIndex(); 1097f518dc6b5898d16d0b8818ff4d06425b2bb0b3d0Dake Gu setSelectedPosition(firstVisiblePos - 1, 100); 10988c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu int top5 = mGridView.getLayoutManager().findViewByPosition(firstVisiblePos - 1).getTop(); 10998c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu assertEquals(top1 - 100, top5); 11008c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu 11018c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu // scroll to invisible item that is far away. 1102f518dc6b5898d16d0b8818ff4d06425b2bb0b3d0Dake Gu setSelectedPosition(50, 100); 11038c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu int top6 = mGridView.getLayoutManager().findViewByPosition(50).getTop(); 11048c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu assertEquals(top1 - 100, top6); 11058c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu 11068c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu // scroll to invisible item that is far away. 11078c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu runTestOnUiThread(new Runnable() { 11088c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu public void run() { 11098c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu mGridView.setSelectedPositionSmooth(100); 11108c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu } 11118c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu }); 11128c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu waitForScrollIdle(mVerifyLayout); 11138c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu int top7 = mGridView.getLayoutManager().findViewByPosition(100).getTop(); 11148c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu assertEquals(top1, top7); 11158c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu 11168c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu // scroll to invisible item that is far away. 1117f518dc6b5898d16d0b8818ff4d06425b2bb0b3d0Dake Gu setSelectedPosition(10, 50); 11188c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu int top8 = mGridView.getLayoutManager().findViewByPosition(10).getTop(); 11198c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu assertEquals(top1 - 50, top8); 11208c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu } 11218c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu 11228c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu public void testSetSelectionWithDeltaInGrid() throws Throwable { 11238c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu mInstrumentation = getInstrumentation(); 11248c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class); 11258c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID, 11268c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu R.layout.vertical_grid); 11278c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 500); 11288c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu intent.putExtra(GridActivity.EXTRA_STAGGERED, true); 11298c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu mOrientation = BaseGridView.VERTICAL; 11308c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu mNumRows = 3; 11318c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu 11328c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu initActivity(intent); 11338c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu 11348c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu runTestOnUiThread(new Runnable() { 11358c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu public void run() { 11368c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu mGridView.setSelectedPositionSmooth(10); 11378c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu } 11388c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu }); 11398c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu waitForScrollIdle(mVerifyLayout); 11408c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu int top1 = getCenterY(mGridView.getLayoutManager().findViewByPosition(10)); 11418c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu 1142f518dc6b5898d16d0b8818ff4d06425b2bb0b3d0Dake Gu humanDelay(500); 11438c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu 11448c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu // scroll to position with delta 1145f518dc6b5898d16d0b8818ff4d06425b2bb0b3d0Dake Gu setSelectedPosition(20, 100); 11468c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu int top2 = getCenterY(mGridView.getLayoutManager().findViewByPosition(20)); 11478c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu assertEquals(top1 - 100, top2); 11488c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu 11498c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu // scroll to same position without delta, it will be reset 1150f518dc6b5898d16d0b8818ff4d06425b2bb0b3d0Dake Gu setSelectedPosition(20, 0); 11518c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu int top3 = getCenterY(mGridView.getLayoutManager().findViewByPosition(20)); 11528c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu assertEquals(top1, top3); 11538c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu 11548c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu // scroll invisible item after last visible item 11558c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu final int lastVisiblePos = ((GridLayoutManager)mGridView.getLayoutManager()) 11568c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu .mGrid.getLastVisibleIndex(); 1157f518dc6b5898d16d0b8818ff4d06425b2bb0b3d0Dake Gu setSelectedPosition(lastVisiblePos + 1, 100); 11588c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu int top4 = getCenterY(mGridView.getLayoutManager().findViewByPosition(lastVisiblePos + 1)); 11598c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu verifyMargin(); 11608c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu assertEquals(top1 - 100, top4); 11618c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu 11628c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu // scroll invisible item before first visible item 11638c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu final int firstVisiblePos = ((GridLayoutManager)mGridView.getLayoutManager()) 11648c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu .mGrid.getFirstVisibleIndex(); 1165f518dc6b5898d16d0b8818ff4d06425b2bb0b3d0Dake Gu setSelectedPosition(firstVisiblePos - 1, 100); 11668c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu int top5 = getCenterY(mGridView.getLayoutManager().findViewByPosition(firstVisiblePos - 1)); 11678c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu assertEquals(top1 - 100, top5); 11688c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu 11698c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu // scroll to invisible item that is far away. 1170f518dc6b5898d16d0b8818ff4d06425b2bb0b3d0Dake Gu setSelectedPosition(100, 100); 11718c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu int top6 = getCenterY(mGridView.getLayoutManager().findViewByPosition(100)); 11728c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu assertEquals(top1 - 100, top6); 11738c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu 11748c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu // scroll to invisible item that is far away. 11758c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu runTestOnUiThread(new Runnable() { 11768c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu public void run() { 11778c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu mGridView.setSelectedPositionSmooth(200); 11788c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu } 11798c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu }); 11808c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu waitForScrollIdle(mVerifyLayout); 11818c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu Thread.sleep(500); 11828c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu int top7 = getCenterY(mGridView.getLayoutManager().findViewByPosition(200)); 11838c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu assertEquals(top1, top7); 11848c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu 11858c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu // scroll to invisible item that is far away. 1186f518dc6b5898d16d0b8818ff4d06425b2bb0b3d0Dake Gu setSelectedPosition(10, 50); 11878c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu int top8 = getCenterY(mGridView.getLayoutManager().findViewByPosition(10)); 11888c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu assertEquals(top1 - 50, top8); 11898c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu } 11908c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu 11918c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu 11928c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu public void testSetSelectionWithDeltaInGrid1() throws Throwable { 11938c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu mInstrumentation = getInstrumentation(); 11948c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class); 11958c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID, 11968c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu R.layout.vertical_grid); 11978c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu intent.putExtra(GridActivity.EXTRA_ITEMS, new int[]{ 11988c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu 193,176,153,141,203,184,232,139,177,206,222,136,132,237,172,137, 11998c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu 188,172,163,213,158,219,209,147,133,229,170,197,138,215,188,205, 12008c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu 223,192,225,170,195,127,229,229,210,195,134,142,160,139,130,222, 12018c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu 150,163,180,176,157,137,234,169,159,167,182,150,224,231,202,236, 12028c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu 123,140,181,223,120,185,183,221,123,210,134,158,166,208,149,128, 12038c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu 192,214,212,198,133,140,158,133,229,173,226,141,180,128,127,218, 12048c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu 192,235,183,213,216,150,143,193,125,141,219,210,195,195,192,191, 12058c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu 212,236,157,189,160,220,147,158,220,199,233,231,201,180,168,141, 12068c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu 156,204,191,183,190,153,123,210,238,151,139,221,223,200,175,191, 12078c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu 132,184,197,204,236,157,230,151,195,219,212,143,172,149,219,184, 12088c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu 164,211,132,187,172,142,174,146,127,147,206,238,188,129,199,226, 12098c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu 132,220,210,159,235,153,208,182,196,123,180,159,131,135,175,226, 12108c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu 127,134,237,211,133,225,132,124,160,226,224,200,173,137,217,169, 12118c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu 182,183,176,185,122,168,195,159,172,129,126,129,166,136,149,220, 12128c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu 178,191,192,238,180,208,234,154,222,206,239,228,129,140,203,125, 12138c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu 214,175,125,169,196,132,234,138,192,142,234,190,215,232,239,122, 12148c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu 188,158,128,221,159,237,207,157,232,138,132,214,122,199,121,191, 12158c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu 199,209,126,164,175,187,173,186,194,224,191,196,146,208,213,210, 12168c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu 164,176,202,213,123,157,179,138,217,129,186,166,237,211,157,130, 12178c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu 137,132,171,232,216,239,180,151,137,132,190,133,218,155,171,227, 12188c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu 193,147,197,164,120,218,193,154,170,196,138,222,161,235,143,154, 12198c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu 192,178,228,195,178,133,203,178,173,206,178,212,136,157,169,124, 12208c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu 172,121,128,223,238,125,217,187,184,156,169,215,231,124,210,174, 12218c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu 146,226,185,134,223,228,183,182,136,133,199,146,180,233,226,225, 12228c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu 174,233,145,235,216,170,192,171,132,132,134,223,233,148,154,162, 12238c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu 192,179,197,203,139,197,174,187,135,132,180,136,192,195,124,221, 12248c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu 120,189,233,233,146,225,234,163,215,143,132,198,156,205,151,190, 12258c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu 204,239,221,229,123,138,134,217,219,136,218,215,167,139,195,125, 12268c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu 202,225,178,226,145,208,130,194,228,197,157,215,124,147,174,123, 12278c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu 237,140,172,181,161,151,229,216,199,199,179,213,146,122,222,162, 12288c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu 139,173,165,150,160,217,207,137,165,175,129,158,134,133,178,199, 12298c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu 215,213,122,197 12308c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu }); 12318c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu intent.putExtra(GridActivity.EXTRA_STAGGERED, true); 12328c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu mOrientation = BaseGridView.VERTICAL; 12338c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu mNumRows = 3; 12348c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu 12358c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu initActivity(intent); 12368c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu 12378c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu runTestOnUiThread(new Runnable() { 12388c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu public void run() { 12398c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu mGridView.setSelectedPositionSmooth(10); 12408c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu } 12418c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu }); 12428c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu waitForScrollIdle(mVerifyLayout); 12438c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu int top1 = getCenterY(mGridView.getLayoutManager().findViewByPosition(10)); 12448c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu 1245f518dc6b5898d16d0b8818ff4d06425b2bb0b3d0Dake Gu humanDelay(500); 12468c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu 12478c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu // scroll to position with delta 1248f518dc6b5898d16d0b8818ff4d06425b2bb0b3d0Dake Gu setSelectedPosition(20, 100); 12498c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu int top2 = getCenterY(mGridView.getLayoutManager().findViewByPosition(20)); 12508c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu assertEquals(top1 - 100, top2); 12518c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu 12528c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu // scroll to same position without delta, it will be reset 1253f518dc6b5898d16d0b8818ff4d06425b2bb0b3d0Dake Gu setSelectedPosition(20, 0); 12548c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu int top3 = getCenterY(mGridView.getLayoutManager().findViewByPosition(20)); 12558c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu assertEquals(top1, top3); 12568c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu 12578c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu // scroll invisible item after last visible item 12588c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu final int lastVisiblePos = ((GridLayoutManager)mGridView.getLayoutManager()) 12598c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu .mGrid.getLastVisibleIndex(); 1260f518dc6b5898d16d0b8818ff4d06425b2bb0b3d0Dake Gu setSelectedPosition(lastVisiblePos + 1, 100); 12618c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu int top4 = getCenterY(mGridView.getLayoutManager().findViewByPosition(lastVisiblePos + 1)); 12628c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu verifyMargin(); 12638c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu assertEquals(top1 - 100, top4); 12648c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu 12658c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu // scroll invisible item before first visible item 12668c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu final int firstVisiblePos = ((GridLayoutManager)mGridView.getLayoutManager()) 12678c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu .mGrid.getFirstVisibleIndex(); 1268f518dc6b5898d16d0b8818ff4d06425b2bb0b3d0Dake Gu setSelectedPosition(firstVisiblePos - 1, 100); 12698c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu int top5 = getCenterY(mGridView.getLayoutManager().findViewByPosition(firstVisiblePos - 1)); 12708c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu assertEquals(top1 - 100, top5); 12718c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu 12728c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu // scroll to invisible item that is far away. 1273f518dc6b5898d16d0b8818ff4d06425b2bb0b3d0Dake Gu setSelectedPosition(100, 100); 12748c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu int top6 = getCenterY(mGridView.getLayoutManager().findViewByPosition(100)); 12758c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu assertEquals(top1 - 100, top6); 12768c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu 12778c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu // scroll to invisible item that is far away. 12788c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu runTestOnUiThread(new Runnable() { 12798c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu public void run() { 12808c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu mGridView.setSelectedPositionSmooth(200); 12818c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu } 12828c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu }); 12838c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu waitForScrollIdle(mVerifyLayout); 12848c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu Thread.sleep(500); 12858c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu int top7 = getCenterY(mGridView.getLayoutManager().findViewByPosition(200)); 12868c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu assertEquals(top1, top7); 12878c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu 12888c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu // scroll to invisible item that is far away. 1289f518dc6b5898d16d0b8818ff4d06425b2bb0b3d0Dake Gu setSelectedPosition(10, 50); 12908c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu int top8 = getCenterY(mGridView.getLayoutManager().findViewByPosition(10)); 12918c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu assertEquals(top1 - 50, top8); 12928c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu } 1293f80ef0d6b0b6403f3cd94e7197bc4a39d285280aDake Gu 1294f80ef0d6b0b6403f3cd94e7197bc4a39d285280aDake Gu public void testSmoothScrollSelectionEvents() throws Throwable { 1295f80ef0d6b0b6403f3cd94e7197bc4a39d285280aDake Gu mInstrumentation = getInstrumentation(); 1296f80ef0d6b0b6403f3cd94e7197bc4a39d285280aDake Gu Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class); 1297f80ef0d6b0b6403f3cd94e7197bc4a39d285280aDake Gu intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID, 1298f80ef0d6b0b6403f3cd94e7197bc4a39d285280aDake Gu R.layout.vertical_grid); 1299f80ef0d6b0b6403f3cd94e7197bc4a39d285280aDake Gu intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 500); 1300f80ef0d6b0b6403f3cd94e7197bc4a39d285280aDake Gu intent.putExtra(GridActivity.EXTRA_STAGGERED, false); 1301f80ef0d6b0b6403f3cd94e7197bc4a39d285280aDake Gu mOrientation = BaseGridView.VERTICAL; 1302f80ef0d6b0b6403f3cd94e7197bc4a39d285280aDake Gu mNumRows = 3; 1303f80ef0d6b0b6403f3cd94e7197bc4a39d285280aDake Gu initActivity(intent); 1304f80ef0d6b0b6403f3cd94e7197bc4a39d285280aDake Gu 1305f80ef0d6b0b6403f3cd94e7197bc4a39d285280aDake Gu runTestOnUiThread(new Runnable() { 1306f80ef0d6b0b6403f3cd94e7197bc4a39d285280aDake Gu public void run() { 1307f80ef0d6b0b6403f3cd94e7197bc4a39d285280aDake Gu mGridView.setSelectedPositionSmooth(30); 1308f80ef0d6b0b6403f3cd94e7197bc4a39d285280aDake Gu } 1309f80ef0d6b0b6403f3cd94e7197bc4a39d285280aDake Gu }); 1310f80ef0d6b0b6403f3cd94e7197bc4a39d285280aDake Gu waitForScrollIdle(mVerifyLayout); 1311f518dc6b5898d16d0b8818ff4d06425b2bb0b3d0Dake Gu humanDelay(500); 1312f80ef0d6b0b6403f3cd94e7197bc4a39d285280aDake Gu 1313f80ef0d6b0b6403f3cd94e7197bc4a39d285280aDake Gu final ArrayList<Integer> selectedPositions = new ArrayList<Integer>(); 1314f80ef0d6b0b6403f3cd94e7197bc4a39d285280aDake Gu mGridView.setOnChildSelectedListener(new OnChildSelectedListener() { 1315f80ef0d6b0b6403f3cd94e7197bc4a39d285280aDake Gu @Override 1316f80ef0d6b0b6403f3cd94e7197bc4a39d285280aDake Gu public void onChildSelected(ViewGroup parent, View view, int position, long id) { 1317f80ef0d6b0b6403f3cd94e7197bc4a39d285280aDake Gu selectedPositions.add(position); 1318f80ef0d6b0b6403f3cd94e7197bc4a39d285280aDake Gu } 1319f80ef0d6b0b6403f3cd94e7197bc4a39d285280aDake Gu }); 1320f80ef0d6b0b6403f3cd94e7197bc4a39d285280aDake Gu 1321f80ef0d6b0b6403f3cd94e7197bc4a39d285280aDake Gu sendRepeatedKeys(10, KeyEvent.KEYCODE_DPAD_UP); 1322f518dc6b5898d16d0b8818ff4d06425b2bb0b3d0Dake Gu humanDelay(500); 1323f80ef0d6b0b6403f3cd94e7197bc4a39d285280aDake Gu waitForScrollIdle(mVerifyLayout); 1324f80ef0d6b0b6403f3cd94e7197bc4a39d285280aDake Gu // should only get childselected event for item 0 once 1325f80ef0d6b0b6403f3cd94e7197bc4a39d285280aDake Gu assertTrue(selectedPositions.size() > 0); 1326f80ef0d6b0b6403f3cd94e7197bc4a39d285280aDake Gu assertEquals(0, selectedPositions.get(selectedPositions.size() - 1).intValue()); 1327f80ef0d6b0b6403f3cd94e7197bc4a39d285280aDake Gu for (int i = selectedPositions.size() - 2; i >= 0; i--) { 1328f80ef0d6b0b6403f3cd94e7197bc4a39d285280aDake Gu assertFalse(0 == selectedPositions.get(i).intValue()); 1329f80ef0d6b0b6403f3cd94e7197bc4a39d285280aDake Gu } 1330f80ef0d6b0b6403f3cd94e7197bc4a39d285280aDake Gu 1331f80ef0d6b0b6403f3cd94e7197bc4a39d285280aDake Gu } 1332f80ef0d6b0b6403f3cd94e7197bc4a39d285280aDake Gu 1333f80ef0d6b0b6403f3cd94e7197bc4a39d285280aDake Gu public void testSmoothScrollSelectionEventsLinear() throws Throwable { 1334f80ef0d6b0b6403f3cd94e7197bc4a39d285280aDake Gu mInstrumentation = getInstrumentation(); 1335f80ef0d6b0b6403f3cd94e7197bc4a39d285280aDake Gu Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class); 1336f80ef0d6b0b6403f3cd94e7197bc4a39d285280aDake Gu intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID, 1337f80ef0d6b0b6403f3cd94e7197bc4a39d285280aDake Gu R.layout.vertical_linear); 1338f80ef0d6b0b6403f3cd94e7197bc4a39d285280aDake Gu intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 500); 1339f80ef0d6b0b6403f3cd94e7197bc4a39d285280aDake Gu intent.putExtra(GridActivity.EXTRA_STAGGERED, false); 1340f80ef0d6b0b6403f3cd94e7197bc4a39d285280aDake Gu mOrientation = BaseGridView.VERTICAL; 1341f80ef0d6b0b6403f3cd94e7197bc4a39d285280aDake Gu mNumRows = 1; 1342f80ef0d6b0b6403f3cd94e7197bc4a39d285280aDake Gu initActivity(intent); 1343f80ef0d6b0b6403f3cd94e7197bc4a39d285280aDake Gu 1344f80ef0d6b0b6403f3cd94e7197bc4a39d285280aDake Gu runTestOnUiThread(new Runnable() { 1345f80ef0d6b0b6403f3cd94e7197bc4a39d285280aDake Gu public void run() { 1346f80ef0d6b0b6403f3cd94e7197bc4a39d285280aDake Gu mGridView.setSelectedPositionSmooth(10); 1347f80ef0d6b0b6403f3cd94e7197bc4a39d285280aDake Gu } 1348f80ef0d6b0b6403f3cd94e7197bc4a39d285280aDake Gu }); 1349f80ef0d6b0b6403f3cd94e7197bc4a39d285280aDake Gu waitForScrollIdle(mVerifyLayout); 1350f518dc6b5898d16d0b8818ff4d06425b2bb0b3d0Dake Gu humanDelay(500); 1351f80ef0d6b0b6403f3cd94e7197bc4a39d285280aDake Gu 1352f80ef0d6b0b6403f3cd94e7197bc4a39d285280aDake Gu final ArrayList<Integer> selectedPositions = new ArrayList<Integer>(); 1353f80ef0d6b0b6403f3cd94e7197bc4a39d285280aDake Gu mGridView.setOnChildSelectedListener(new OnChildSelectedListener() { 1354f80ef0d6b0b6403f3cd94e7197bc4a39d285280aDake Gu @Override 1355f80ef0d6b0b6403f3cd94e7197bc4a39d285280aDake Gu public void onChildSelected(ViewGroup parent, View view, int position, long id) { 1356f80ef0d6b0b6403f3cd94e7197bc4a39d285280aDake Gu selectedPositions.add(position); 1357f80ef0d6b0b6403f3cd94e7197bc4a39d285280aDake Gu } 1358f80ef0d6b0b6403f3cd94e7197bc4a39d285280aDake Gu }); 1359f80ef0d6b0b6403f3cd94e7197bc4a39d285280aDake Gu 1360f80ef0d6b0b6403f3cd94e7197bc4a39d285280aDake Gu sendRepeatedKeys(10, KeyEvent.KEYCODE_DPAD_UP); 1361f518dc6b5898d16d0b8818ff4d06425b2bb0b3d0Dake Gu humanDelay(500); 1362f80ef0d6b0b6403f3cd94e7197bc4a39d285280aDake Gu waitForScrollIdle(mVerifyLayout); 1363f80ef0d6b0b6403f3cd94e7197bc4a39d285280aDake Gu // should only get childselected event for item 0 once 1364f80ef0d6b0b6403f3cd94e7197bc4a39d285280aDake Gu assertTrue(selectedPositions.size() > 0); 1365f80ef0d6b0b6403f3cd94e7197bc4a39d285280aDake Gu assertEquals(0, selectedPositions.get(selectedPositions.size() - 1).intValue()); 1366f80ef0d6b0b6403f3cd94e7197bc4a39d285280aDake Gu for (int i = selectedPositions.size() - 2; i >= 0; i--) { 1367f80ef0d6b0b6403f3cd94e7197bc4a39d285280aDake Gu assertFalse(0 == selectedPositions.get(i).intValue()); 1368f80ef0d6b0b6403f3cd94e7197bc4a39d285280aDake Gu } 1369f80ef0d6b0b6403f3cd94e7197bc4a39d285280aDake Gu 1370f80ef0d6b0b6403f3cd94e7197bc4a39d285280aDake Gu } 13717538845719cd1e588185ce9ae60320377862ef8dDake Gu 13727538845719cd1e588185ce9ae60320377862ef8dDake Gu public void testScrollToNoneExisting() throws Throwable { 13737538845719cd1e588185ce9ae60320377862ef8dDake Gu mInstrumentation = getInstrumentation(); 13747538845719cd1e588185ce9ae60320377862ef8dDake Gu Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class); 13757538845719cd1e588185ce9ae60320377862ef8dDake Gu intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID, 13767538845719cd1e588185ce9ae60320377862ef8dDake Gu R.layout.vertical_grid); 13777538845719cd1e588185ce9ae60320377862ef8dDake Gu intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 100); 13787538845719cd1e588185ce9ae60320377862ef8dDake Gu intent.putExtra(GridActivity.EXTRA_STAGGERED, false); 13797538845719cd1e588185ce9ae60320377862ef8dDake Gu mOrientation = BaseGridView.VERTICAL; 13807538845719cd1e588185ce9ae60320377862ef8dDake Gu mNumRows = 3; 13817538845719cd1e588185ce9ae60320377862ef8dDake Gu initActivity(intent); 13827538845719cd1e588185ce9ae60320377862ef8dDake Gu 13837538845719cd1e588185ce9ae60320377862ef8dDake Gu runTestOnUiThread(new Runnable() { 13847538845719cd1e588185ce9ae60320377862ef8dDake Gu public void run() { 13857538845719cd1e588185ce9ae60320377862ef8dDake Gu mGridView.setSelectedPositionSmooth(99); 13867538845719cd1e588185ce9ae60320377862ef8dDake Gu } 13877538845719cd1e588185ce9ae60320377862ef8dDake Gu }); 13887538845719cd1e588185ce9ae60320377862ef8dDake Gu waitForScrollIdle(mVerifyLayout); 13897538845719cd1e588185ce9ae60320377862ef8dDake Gu humanDelay(500); 13907538845719cd1e588185ce9ae60320377862ef8dDake Gu 13917538845719cd1e588185ce9ae60320377862ef8dDake Gu 13927538845719cd1e588185ce9ae60320377862ef8dDake Gu runTestOnUiThread(new Runnable() { 13937538845719cd1e588185ce9ae60320377862ef8dDake Gu public void run() { 13947538845719cd1e588185ce9ae60320377862ef8dDake Gu mGridView.setSelectedPositionSmooth(50); 13957538845719cd1e588185ce9ae60320377862ef8dDake Gu } 13967538845719cd1e588185ce9ae60320377862ef8dDake Gu }); 13977538845719cd1e588185ce9ae60320377862ef8dDake Gu Thread.sleep(100); 13987538845719cd1e588185ce9ae60320377862ef8dDake Gu runTestOnUiThread(new Runnable() { 13997538845719cd1e588185ce9ae60320377862ef8dDake Gu public void run() { 14007538845719cd1e588185ce9ae60320377862ef8dDake Gu mGridView.requestLayout(); 14017538845719cd1e588185ce9ae60320377862ef8dDake Gu mGridView.setSelectedPositionSmooth(0); 14027538845719cd1e588185ce9ae60320377862ef8dDake Gu } 14037538845719cd1e588185ce9ae60320377862ef8dDake Gu }); 14047538845719cd1e588185ce9ae60320377862ef8dDake Gu waitForScrollIdle(mVerifyLayout); 14057538845719cd1e588185ce9ae60320377862ef8dDake Gu humanDelay(500); 14067538845719cd1e588185ce9ae60320377862ef8dDake Gu 14077538845719cd1e588185ce9ae60320377862ef8dDake Gu } 14087538845719cd1e588185ce9ae60320377862ef8dDake Gu 14093a7aa9cd68bd39f3a843291817dc209d1d9a45aaDake Gu public void testSmoothscrollerInterrupted() throws Throwable { 14103a7aa9cd68bd39f3a843291817dc209d1d9a45aaDake Gu mInstrumentation = getInstrumentation(); 14113a7aa9cd68bd39f3a843291817dc209d1d9a45aaDake Gu Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class); 14123a7aa9cd68bd39f3a843291817dc209d1d9a45aaDake Gu intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID, 14133a7aa9cd68bd39f3a843291817dc209d1d9a45aaDake Gu R.layout.vertical_linear); 14143a7aa9cd68bd39f3a843291817dc209d1d9a45aaDake Gu intent.putExtra(GridActivity.EXTRA_REQUEST_FOCUS_ONLAYOUT, true); 14153a7aa9cd68bd39f3a843291817dc209d1d9a45aaDake Gu int[] items = new int[100]; 14163a7aa9cd68bd39f3a843291817dc209d1d9a45aaDake Gu for (int i = 0; i < items.length; i++) { 14173a7aa9cd68bd39f3a843291817dc209d1d9a45aaDake Gu items[i] = 680; 14183a7aa9cd68bd39f3a843291817dc209d1d9a45aaDake Gu } 14193a7aa9cd68bd39f3a843291817dc209d1d9a45aaDake Gu intent.putExtra(GridActivity.EXTRA_ITEMS, items); 14203a7aa9cd68bd39f3a843291817dc209d1d9a45aaDake Gu intent.putExtra(GridActivity.EXTRA_STAGGERED, false); 14213a7aa9cd68bd39f3a843291817dc209d1d9a45aaDake Gu mOrientation = BaseGridView.VERTICAL; 14223a7aa9cd68bd39f3a843291817dc209d1d9a45aaDake Gu mNumRows = 1; 14233a7aa9cd68bd39f3a843291817dc209d1d9a45aaDake Gu 14243a7aa9cd68bd39f3a843291817dc209d1d9a45aaDake Gu initActivity(intent); 14253a7aa9cd68bd39f3a843291817dc209d1d9a45aaDake Gu 14263a7aa9cd68bd39f3a843291817dc209d1d9a45aaDake Gu mGridView.setSelectedPositionSmooth(0); 14273a7aa9cd68bd39f3a843291817dc209d1d9a45aaDake Gu waitForScrollIdle(mVerifyLayout); 14283a7aa9cd68bd39f3a843291817dc209d1d9a45aaDake Gu assertTrue(mGridView.getChildAt(0).hasFocus()); 14293a7aa9cd68bd39f3a843291817dc209d1d9a45aaDake Gu 14303a7aa9cd68bd39f3a843291817dc209d1d9a45aaDake Gu // Pressing lots of key to make sure smooth scroller is running 14313a7aa9cd68bd39f3a843291817dc209d1d9a45aaDake Gu for (int i = 0; i < 20; i++) { 14323a7aa9cd68bd39f3a843291817dc209d1d9a45aaDake Gu sendKeys(KeyEvent.KEYCODE_DPAD_DOWN); 14333a7aa9cd68bd39f3a843291817dc209d1d9a45aaDake Gu } 14343a7aa9cd68bd39f3a843291817dc209d1d9a45aaDake Gu Thread.sleep(100); 14353a7aa9cd68bd39f3a843291817dc209d1d9a45aaDake Gu int total = 0; 14363a7aa9cd68bd39f3a843291817dc209d1d9a45aaDake Gu while (mGridView.getLayoutManager().isSmoothScrolling() || 14373a7aa9cd68bd39f3a843291817dc209d1d9a45aaDake Gu mGridView.getScrollState() != BaseGridView.SCROLL_STATE_IDLE) { 14383a7aa9cd68bd39f3a843291817dc209d1d9a45aaDake Gu if ((total += 10) >= WAIT_FOR_SCROLL_IDLE_TIMEOUT_MS) { 14393a7aa9cd68bd39f3a843291817dc209d1d9a45aaDake Gu throw new RuntimeException("waitForScrollIdle Timeout"); 14403a7aa9cd68bd39f3a843291817dc209d1d9a45aaDake Gu } 14413a7aa9cd68bd39f3a843291817dc209d1d9a45aaDake Gu try { 14423a7aa9cd68bd39f3a843291817dc209d1d9a45aaDake Gu // Repeatedly pressing to make sure pending keys does not drop to zero. 14433a7aa9cd68bd39f3a843291817dc209d1d9a45aaDake Gu Thread.sleep(10); 14443a7aa9cd68bd39f3a843291817dc209d1d9a45aaDake Gu sendKeys(KeyEvent.KEYCODE_DPAD_DOWN); 14453a7aa9cd68bd39f3a843291817dc209d1d9a45aaDake Gu } catch (InterruptedException ex) { 14463a7aa9cd68bd39f3a843291817dc209d1d9a45aaDake Gu break; 14473a7aa9cd68bd39f3a843291817dc209d1d9a45aaDake Gu } 14483a7aa9cd68bd39f3a843291817dc209d1d9a45aaDake Gu } 14493a7aa9cd68bd39f3a843291817dc209d1d9a45aaDake Gu 14503a7aa9cd68bd39f3a843291817dc209d1d9a45aaDake Gu assertTrue("LinearSmoothScroller would not use many RV.smoothScrollBy() calls", 14513a7aa9cd68bd39f3a843291817dc209d1d9a45aaDake Gu ((VerticalGridViewEx) mGridView).mSmoothScrollByCalled < 10); 14523a7aa9cd68bd39f3a843291817dc209d1d9a45aaDake Gu } 145357f5baa07260dad2a9641e9ceb80567ce2784e9aDake Gu 145457f5baa07260dad2a9641e9ceb80567ce2784e9aDake Gu public void testSetNumRowsAndAddItem() throws Throwable { 145557f5baa07260dad2a9641e9ceb80567ce2784e9aDake Gu mInstrumentation = getInstrumentation(); 145657f5baa07260dad2a9641e9ceb80567ce2784e9aDake Gu Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class); 145757f5baa07260dad2a9641e9ceb80567ce2784e9aDake Gu intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID, 145857f5baa07260dad2a9641e9ceb80567ce2784e9aDake Gu R.layout.vertical_linear); 145957f5baa07260dad2a9641e9ceb80567ce2784e9aDake Gu intent.putExtra(GridActivity.EXTRA_REQUEST_FOCUS_ONLAYOUT, true); 146057f5baa07260dad2a9641e9ceb80567ce2784e9aDake Gu int[] items = new int[2]; 146157f5baa07260dad2a9641e9ceb80567ce2784e9aDake Gu for (int i = 0; i < items.length; i++) { 146257f5baa07260dad2a9641e9ceb80567ce2784e9aDake Gu items[i] = 300; 146357f5baa07260dad2a9641e9ceb80567ce2784e9aDake Gu } 146457f5baa07260dad2a9641e9ceb80567ce2784e9aDake Gu intent.putExtra(GridActivity.EXTRA_ITEMS, items); 146557f5baa07260dad2a9641e9ceb80567ce2784e9aDake Gu intent.putExtra(GridActivity.EXTRA_STAGGERED, false); 146657f5baa07260dad2a9641e9ceb80567ce2784e9aDake Gu mOrientation = BaseGridView.VERTICAL; 146757f5baa07260dad2a9641e9ceb80567ce2784e9aDake Gu mNumRows = 1; 146857f5baa07260dad2a9641e9ceb80567ce2784e9aDake Gu 146957f5baa07260dad2a9641e9ceb80567ce2784e9aDake Gu initActivity(intent); 147057f5baa07260dad2a9641e9ceb80567ce2784e9aDake Gu 147157f5baa07260dad2a9641e9ceb80567ce2784e9aDake Gu mGridView.setSelectedPositionSmooth(0); 147257f5baa07260dad2a9641e9ceb80567ce2784e9aDake Gu waitForScrollIdle(mVerifyLayout); 147357f5baa07260dad2a9641e9ceb80567ce2784e9aDake Gu 147457f5baa07260dad2a9641e9ceb80567ce2784e9aDake Gu mActivity.addItems(items.length, new int[]{300}); 147557f5baa07260dad2a9641e9ceb80567ce2784e9aDake Gu 147657f5baa07260dad2a9641e9ceb80567ce2784e9aDake Gu runTestOnUiThread(new Runnable() { 147757f5baa07260dad2a9641e9ceb80567ce2784e9aDake Gu public void run() { 147857f5baa07260dad2a9641e9ceb80567ce2784e9aDake Gu ((VerticalGridView) mGridView).setNumColumns(2); 147957f5baa07260dad2a9641e9ceb80567ce2784e9aDake Gu } 148057f5baa07260dad2a9641e9ceb80567ce2784e9aDake Gu }); 148157f5baa07260dad2a9641e9ceb80567ce2784e9aDake Gu Thread.sleep(1000); 148257f5baa07260dad2a9641e9ceb80567ce2784e9aDake Gu assertTrue(mGridView.getChildAt(2).getLeft() != mGridView.getChildAt(1).getLeft()); 148357f5baa07260dad2a9641e9ceb80567ce2784e9aDake Gu } 1484c0b265dd2df42b399ba1f959b3dfd14dd14012b5Dake Gu 1485c0b265dd2df42b399ba1f959b3dfd14dd14012b5Dake Gu 1486c0b265dd2df42b399ba1f959b3dfd14dd14012b5Dake Gu public void testRequestLayoutBugInLayout() throws Throwable { 1487c0b265dd2df42b399ba1f959b3dfd14dd14012b5Dake Gu mInstrumentation = getInstrumentation(); 1488c0b265dd2df42b399ba1f959b3dfd14dd14012b5Dake Gu Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class); 1489c0b265dd2df42b399ba1f959b3dfd14dd14012b5Dake Gu intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID, 1490c0b265dd2df42b399ba1f959b3dfd14dd14012b5Dake Gu R.layout.vertical_linear); 1491c0b265dd2df42b399ba1f959b3dfd14dd14012b5Dake Gu intent.putExtra(GridActivity.EXTRA_CHILD_LAYOUT_ID, R.layout.relative_layout); 1492c0b265dd2df42b399ba1f959b3dfd14dd14012b5Dake Gu intent.putExtra(GridActivity.EXTRA_REQUEST_FOCUS_ONLAYOUT, true); 1493c0b265dd2df42b399ba1f959b3dfd14dd14012b5Dake Gu int[] items = new int[100]; 1494c0b265dd2df42b399ba1f959b3dfd14dd14012b5Dake Gu for (int i = 0; i < items.length; i++) { 1495c0b265dd2df42b399ba1f959b3dfd14dd14012b5Dake Gu items[i] = 300; 1496c0b265dd2df42b399ba1f959b3dfd14dd14012b5Dake Gu } 1497c0b265dd2df42b399ba1f959b3dfd14dd14012b5Dake Gu intent.putExtra(GridActivity.EXTRA_ITEMS, items); 1498c0b265dd2df42b399ba1f959b3dfd14dd14012b5Dake Gu intent.putExtra(GridActivity.EXTRA_STAGGERED, false); 1499c0b265dd2df42b399ba1f959b3dfd14dd14012b5Dake Gu mOrientation = BaseGridView.VERTICAL; 1500c0b265dd2df42b399ba1f959b3dfd14dd14012b5Dake Gu mNumRows = 1; 1501c0b265dd2df42b399ba1f959b3dfd14dd14012b5Dake Gu 1502c0b265dd2df42b399ba1f959b3dfd14dd14012b5Dake Gu initActivity(intent); 1503c0b265dd2df42b399ba1f959b3dfd14dd14012b5Dake Gu 1504c0b265dd2df42b399ba1f959b3dfd14dd14012b5Dake Gu runTestOnUiThread(new Runnable() { 1505c0b265dd2df42b399ba1f959b3dfd14dd14012b5Dake Gu public void run() { 1506c0b265dd2df42b399ba1f959b3dfd14dd14012b5Dake Gu mGridView.setSelectedPositionSmooth(1); 1507c0b265dd2df42b399ba1f959b3dfd14dd14012b5Dake Gu } 1508c0b265dd2df42b399ba1f959b3dfd14dd14012b5Dake Gu }); 1509c0b265dd2df42b399ba1f959b3dfd14dd14012b5Dake Gu waitForScrollIdle(mVerifyLayout); 1510c0b265dd2df42b399ba1f959b3dfd14dd14012b5Dake Gu 1511c0b265dd2df42b399ba1f959b3dfd14dd14012b5Dake Gu sendKeys(KeyEvent.KEYCODE_DPAD_UP); 1512c0b265dd2df42b399ba1f959b3dfd14dd14012b5Dake Gu waitForScrollIdle(mVerifyLayout); 1513c0b265dd2df42b399ba1f959b3dfd14dd14012b5Dake Gu 1514c0b265dd2df42b399ba1f959b3dfd14dd14012b5Dake Gu assertEquals("Line 2", ((TextView) mGridView.findFocus()).getText().toString()); 1515c0b265dd2df42b399ba1f959b3dfd14dd14012b5Dake Gu } 1516492506cede17ecee39ce7fa35ee7a347ff31c5baDake Gu 1517492506cede17ecee39ce7fa35ee7a347ff31c5baDake Gu 1518492506cede17ecee39ce7fa35ee7a347ff31c5baDake Gu public void testChangeLayoutInChild() throws Throwable { 1519492506cede17ecee39ce7fa35ee7a347ff31c5baDake Gu mInstrumentation = getInstrumentation(); 1520492506cede17ecee39ce7fa35ee7a347ff31c5baDake Gu Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class); 1521492506cede17ecee39ce7fa35ee7a347ff31c5baDake Gu intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID, 1522492506cede17ecee39ce7fa35ee7a347ff31c5baDake Gu R.layout.vertical_linear_wrap_content); 1523492506cede17ecee39ce7fa35ee7a347ff31c5baDake Gu intent.putExtra(GridActivity.EXTRA_REQUEST_LAYOUT_ONFOCUS, true); 1524492506cede17ecee39ce7fa35ee7a347ff31c5baDake Gu int[] items = new int[2]; 1525492506cede17ecee39ce7fa35ee7a347ff31c5baDake Gu for (int i = 0; i < items.length; i++) { 1526492506cede17ecee39ce7fa35ee7a347ff31c5baDake Gu items[i] = 300; 1527492506cede17ecee39ce7fa35ee7a347ff31c5baDake Gu } 1528492506cede17ecee39ce7fa35ee7a347ff31c5baDake Gu intent.putExtra(GridActivity.EXTRA_ITEMS, items); 1529492506cede17ecee39ce7fa35ee7a347ff31c5baDake Gu intent.putExtra(GridActivity.EXTRA_STAGGERED, false); 1530492506cede17ecee39ce7fa35ee7a347ff31c5baDake Gu mOrientation = BaseGridView.VERTICAL; 1531492506cede17ecee39ce7fa35ee7a347ff31c5baDake Gu mNumRows = 1; 1532492506cede17ecee39ce7fa35ee7a347ff31c5baDake Gu 1533492506cede17ecee39ce7fa35ee7a347ff31c5baDake Gu initActivity(intent); 1534492506cede17ecee39ce7fa35ee7a347ff31c5baDake Gu 1535492506cede17ecee39ce7fa35ee7a347ff31c5baDake Gu runTestOnUiThread(new Runnable() { 1536492506cede17ecee39ce7fa35ee7a347ff31c5baDake Gu public void run() { 1537492506cede17ecee39ce7fa35ee7a347ff31c5baDake Gu mGridView.setSelectedPositionSmooth(0); 1538492506cede17ecee39ce7fa35ee7a347ff31c5baDake Gu } 1539492506cede17ecee39ce7fa35ee7a347ff31c5baDake Gu }); 1540492506cede17ecee39ce7fa35ee7a347ff31c5baDake Gu waitForScrollIdle(mVerifyLayout); 1541492506cede17ecee39ce7fa35ee7a347ff31c5baDake Gu verifyMargin(); 1542492506cede17ecee39ce7fa35ee7a347ff31c5baDake Gu 1543492506cede17ecee39ce7fa35ee7a347ff31c5baDake Gu runTestOnUiThread(new Runnable() { 1544492506cede17ecee39ce7fa35ee7a347ff31c5baDake Gu public void run() { 1545492506cede17ecee39ce7fa35ee7a347ff31c5baDake Gu mGridView.setSelectedPositionSmooth(1); 1546492506cede17ecee39ce7fa35ee7a347ff31c5baDake Gu } 1547492506cede17ecee39ce7fa35ee7a347ff31c5baDake Gu }); 1548492506cede17ecee39ce7fa35ee7a347ff31c5baDake Gu waitForScrollIdle(mVerifyLayout); 1549492506cede17ecee39ce7fa35ee7a347ff31c5baDake Gu verifyMargin(); 1550492506cede17ecee39ce7fa35ee7a347ff31c5baDake Gu } 15511a5a2c58890e69b0554a82f22e3c0d1ffb238366Dake Gu 15521a5a2c58890e69b0554a82f22e3c0d1ffb238366Dake Gu 15531a5a2c58890e69b0554a82f22e3c0d1ffb238366Dake Gu public void testZeroFixedSecondarySize() throws Throwable { 15541a5a2c58890e69b0554a82f22e3c0d1ffb238366Dake Gu mInstrumentation = getInstrumentation(); 15551a5a2c58890e69b0554a82f22e3c0d1ffb238366Dake Gu Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class); 15561a5a2c58890e69b0554a82f22e3c0d1ffb238366Dake Gu intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID, 15571a5a2c58890e69b0554a82f22e3c0d1ffb238366Dake Gu R.layout.vertical_linear_measured_with_zero); 15581a5a2c58890e69b0554a82f22e3c0d1ffb238366Dake Gu intent.putExtra(GridActivity.EXTRA_SECONDARY_SIZE_ZERO, true); 15591a5a2c58890e69b0554a82f22e3c0d1ffb238366Dake Gu int[] items = new int[2]; 15601a5a2c58890e69b0554a82f22e3c0d1ffb238366Dake Gu for (int i = 0; i < items.length; i++) { 15611a5a2c58890e69b0554a82f22e3c0d1ffb238366Dake Gu items[i] = 0; 15621a5a2c58890e69b0554a82f22e3c0d1ffb238366Dake Gu } 15631a5a2c58890e69b0554a82f22e3c0d1ffb238366Dake Gu intent.putExtra(GridActivity.EXTRA_ITEMS, items); 15641a5a2c58890e69b0554a82f22e3c0d1ffb238366Dake Gu intent.putExtra(GridActivity.EXTRA_STAGGERED, false); 15651a5a2c58890e69b0554a82f22e3c0d1ffb238366Dake Gu mOrientation = BaseGridView.VERTICAL; 15661a5a2c58890e69b0554a82f22e3c0d1ffb238366Dake Gu mNumRows = 1; 15671a5a2c58890e69b0554a82f22e3c0d1ffb238366Dake Gu 15681a5a2c58890e69b0554a82f22e3c0d1ffb238366Dake Gu initActivity(intent); 15691a5a2c58890e69b0554a82f22e3c0d1ffb238366Dake Gu 15701a5a2c58890e69b0554a82f22e3c0d1ffb238366Dake Gu } 15713bd331ac6fe8ef25a2deb3559b0b5958573c231bDake Gu 15723bd331ac6fe8ef25a2deb3559b0b5958573c231bDake Gu public void testChildStates() throws Throwable { 15733bd331ac6fe8ef25a2deb3559b0b5958573c231bDake Gu mInstrumentation = getInstrumentation(); 15743bd331ac6fe8ef25a2deb3559b0b5958573c231bDake Gu Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class); 15753bd331ac6fe8ef25a2deb3559b0b5958573c231bDake Gu intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID, R.layout.vertical_linear); 15763bd331ac6fe8ef25a2deb3559b0b5958573c231bDake Gu int[] items = new int[100]; 15773bd331ac6fe8ef25a2deb3559b0b5958573c231bDake Gu for (int i = 0; i < items.length; i++) { 15783bd331ac6fe8ef25a2deb3559b0b5958573c231bDake Gu items[i] = 200; 15793bd331ac6fe8ef25a2deb3559b0b5958573c231bDake Gu } 15803bd331ac6fe8ef25a2deb3559b0b5958573c231bDake Gu intent.putExtra(GridActivity.EXTRA_ITEMS, items); 15813bd331ac6fe8ef25a2deb3559b0b5958573c231bDake Gu intent.putExtra(GridActivity.EXTRA_STAGGERED, false); 15823bd331ac6fe8ef25a2deb3559b0b5958573c231bDake Gu intent.putExtra(GridActivity.EXTRA_REQUEST_LAYOUT_ONFOCUS, true); 15833bd331ac6fe8ef25a2deb3559b0b5958573c231bDake Gu intent.putExtra(GridActivity.EXTRA_CHILD_LAYOUT_ID, R.layout.selectable_text_view); 15843bd331ac6fe8ef25a2deb3559b0b5958573c231bDake Gu mOrientation = BaseGridView.VERTICAL; 15853bd331ac6fe8ef25a2deb3559b0b5958573c231bDake Gu mNumRows = 1; 15863bd331ac6fe8ef25a2deb3559b0b5958573c231bDake Gu 15873bd331ac6fe8ef25a2deb3559b0b5958573c231bDake Gu initActivity(intent); 15883bd331ac6fe8ef25a2deb3559b0b5958573c231bDake Gu mGridView.setSaveChildrenPolicy(VerticalGridView.SAVE_ALL_CHILD); 15893bd331ac6fe8ef25a2deb3559b0b5958573c231bDake Gu 159061e5a56ed066815e69be7526e3d1bee2d5268d20Dake Gu final SparseArray<Parcelable> container = new SparseArray<Parcelable>(); 15913bd331ac6fe8ef25a2deb3559b0b5958573c231bDake Gu 15923bd331ac6fe8ef25a2deb3559b0b5958573c231bDake Gu // 1 Save view states 15933bd331ac6fe8ef25a2deb3559b0b5958573c231bDake Gu runTestOnUiThread(new Runnable() { 15943bd331ac6fe8ef25a2deb3559b0b5958573c231bDake Gu public void run() { 15953bd331ac6fe8ef25a2deb3559b0b5958573c231bDake Gu Selection.setSelection((Spannable)(((TextView) mGridView.getChildAt(0)) 15963bd331ac6fe8ef25a2deb3559b0b5958573c231bDake Gu .getText()), 0, 1); 15973bd331ac6fe8ef25a2deb3559b0b5958573c231bDake Gu Selection.setSelection((Spannable)(((TextView) mGridView.getChildAt(1)) 15983bd331ac6fe8ef25a2deb3559b0b5958573c231bDake Gu .getText()), 0, 1); 15993bd331ac6fe8ef25a2deb3559b0b5958573c231bDake Gu mGridView.saveHierarchyState(container); 16003bd331ac6fe8ef25a2deb3559b0b5958573c231bDake Gu } 16013bd331ac6fe8ef25a2deb3559b0b5958573c231bDake Gu }); 16023bd331ac6fe8ef25a2deb3559b0b5958573c231bDake Gu 16033bd331ac6fe8ef25a2deb3559b0b5958573c231bDake Gu // 2 Change view states 16043bd331ac6fe8ef25a2deb3559b0b5958573c231bDake Gu runTestOnUiThread(new Runnable() { 16053bd331ac6fe8ef25a2deb3559b0b5958573c231bDake Gu public void run() { 16063bd331ac6fe8ef25a2deb3559b0b5958573c231bDake Gu Selection.setSelection((Spannable)(((TextView) mGridView.getChildAt(0)) 16073bd331ac6fe8ef25a2deb3559b0b5958573c231bDake Gu .getText()), 1, 2); 16083bd331ac6fe8ef25a2deb3559b0b5958573c231bDake Gu Selection.setSelection((Spannable)(((TextView) mGridView.getChildAt(1)) 16093bd331ac6fe8ef25a2deb3559b0b5958573c231bDake Gu .getText()), 1, 2); 16103bd331ac6fe8ef25a2deb3559b0b5958573c231bDake Gu } 16113bd331ac6fe8ef25a2deb3559b0b5958573c231bDake Gu }); 16123bd331ac6fe8ef25a2deb3559b0b5958573c231bDake Gu 16133bd331ac6fe8ef25a2deb3559b0b5958573c231bDake Gu // 3 Detached and re-attached, should still maintain state of (2) 16143bd331ac6fe8ef25a2deb3559b0b5958573c231bDake Gu runTestOnUiThread(new Runnable() { 16153bd331ac6fe8ef25a2deb3559b0b5958573c231bDake Gu public void run() { 16163bd331ac6fe8ef25a2deb3559b0b5958573c231bDake Gu mGridView.setSelectedPositionSmooth(1); 16173bd331ac6fe8ef25a2deb3559b0b5958573c231bDake Gu } 16183bd331ac6fe8ef25a2deb3559b0b5958573c231bDake Gu }); 16193bd331ac6fe8ef25a2deb3559b0b5958573c231bDake Gu waitForScrollIdle(mVerifyLayout); 16203bd331ac6fe8ef25a2deb3559b0b5958573c231bDake Gu assertEquals(((TextView) mGridView.getChildAt(0)).getSelectionStart(), 1); 16213bd331ac6fe8ef25a2deb3559b0b5958573c231bDake Gu assertEquals(((TextView) mGridView.getChildAt(0)).getSelectionEnd(), 2); 16223bd331ac6fe8ef25a2deb3559b0b5958573c231bDake Gu assertEquals(((TextView) mGridView.getChildAt(1)).getSelectionStart(), 1); 16233bd331ac6fe8ef25a2deb3559b0b5958573c231bDake Gu assertEquals(((TextView) mGridView.getChildAt(1)).getSelectionEnd(), 2); 16243bd331ac6fe8ef25a2deb3559b0b5958573c231bDake Gu 16253bd331ac6fe8ef25a2deb3559b0b5958573c231bDake Gu // 4 Recycled and rebound, should load state from (2) 16263bd331ac6fe8ef25a2deb3559b0b5958573c231bDake Gu runTestOnUiThread(new Runnable() { 16273bd331ac6fe8ef25a2deb3559b0b5958573c231bDake Gu public void run() { 16283bd331ac6fe8ef25a2deb3559b0b5958573c231bDake Gu mGridView.setSelectedPositionSmooth(20); 16293bd331ac6fe8ef25a2deb3559b0b5958573c231bDake Gu } 16303bd331ac6fe8ef25a2deb3559b0b5958573c231bDake Gu }); 16313bd331ac6fe8ef25a2deb3559b0b5958573c231bDake Gu waitForScrollIdle(mVerifyLayout); 16323bd331ac6fe8ef25a2deb3559b0b5958573c231bDake Gu runTestOnUiThread(new Runnable() { 16333bd331ac6fe8ef25a2deb3559b0b5958573c231bDake Gu public void run() { 16343bd331ac6fe8ef25a2deb3559b0b5958573c231bDake Gu mGridView.setSelectedPositionSmooth(0); 16353bd331ac6fe8ef25a2deb3559b0b5958573c231bDake Gu } 16363bd331ac6fe8ef25a2deb3559b0b5958573c231bDake Gu }); 16373bd331ac6fe8ef25a2deb3559b0b5958573c231bDake Gu waitForScrollIdle(mVerifyLayout); 16383bd331ac6fe8ef25a2deb3559b0b5958573c231bDake Gu assertEquals(((TextView) mGridView.getChildAt(0)).getSelectionStart(), 1); 16393bd331ac6fe8ef25a2deb3559b0b5958573c231bDake Gu assertEquals(((TextView) mGridView.getChildAt(0)).getSelectionEnd(), 2); 16403bd331ac6fe8ef25a2deb3559b0b5958573c231bDake Gu assertEquals(((TextView) mGridView.getChildAt(1)).getSelectionStart(), 1); 16413bd331ac6fe8ef25a2deb3559b0b5958573c231bDake Gu assertEquals(((TextView) mGridView.getChildAt(1)).getSelectionEnd(), 2); 16423bd331ac6fe8ef25a2deb3559b0b5958573c231bDake Gu } 16433bd331ac6fe8ef25a2deb3559b0b5958573c231bDake Gu 16443bd331ac6fe8ef25a2deb3559b0b5958573c231bDake Gu 164561e5a56ed066815e69be7526e3d1bee2d5268d20Dake Gu public void testNoDispatchSaveChildState() throws Throwable { 164661e5a56ed066815e69be7526e3d1bee2d5268d20Dake Gu mInstrumentation = getInstrumentation(); 164761e5a56ed066815e69be7526e3d1bee2d5268d20Dake Gu Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class); 164861e5a56ed066815e69be7526e3d1bee2d5268d20Dake Gu intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID, R.layout.vertical_linear); 164961e5a56ed066815e69be7526e3d1bee2d5268d20Dake Gu int[] items = new int[100]; 165061e5a56ed066815e69be7526e3d1bee2d5268d20Dake Gu for (int i = 0; i < items.length; i++) { 165161e5a56ed066815e69be7526e3d1bee2d5268d20Dake Gu items[i] = 200; 165261e5a56ed066815e69be7526e3d1bee2d5268d20Dake Gu } 165361e5a56ed066815e69be7526e3d1bee2d5268d20Dake Gu intent.putExtra(GridActivity.EXTRA_ITEMS, items); 165461e5a56ed066815e69be7526e3d1bee2d5268d20Dake Gu intent.putExtra(GridActivity.EXTRA_STAGGERED, false); 165561e5a56ed066815e69be7526e3d1bee2d5268d20Dake Gu intent.putExtra(GridActivity.EXTRA_CHILD_LAYOUT_ID, R.layout.selectable_text_view); 165661e5a56ed066815e69be7526e3d1bee2d5268d20Dake Gu mOrientation = BaseGridView.VERTICAL; 165761e5a56ed066815e69be7526e3d1bee2d5268d20Dake Gu mNumRows = 1; 165861e5a56ed066815e69be7526e3d1bee2d5268d20Dake Gu 165961e5a56ed066815e69be7526e3d1bee2d5268d20Dake Gu initActivity(intent); 166061e5a56ed066815e69be7526e3d1bee2d5268d20Dake Gu mGridView.setSaveChildrenPolicy(VerticalGridView.SAVE_NO_CHILD); 166161e5a56ed066815e69be7526e3d1bee2d5268d20Dake Gu 166261e5a56ed066815e69be7526e3d1bee2d5268d20Dake Gu final SparseArray<Parcelable> container = new SparseArray<Parcelable>(); 166361e5a56ed066815e69be7526e3d1bee2d5268d20Dake Gu 166461e5a56ed066815e69be7526e3d1bee2d5268d20Dake Gu // 1. Set text selection, save view states should do nothing on child 166561e5a56ed066815e69be7526e3d1bee2d5268d20Dake Gu runTestOnUiThread(new Runnable() { 166661e5a56ed066815e69be7526e3d1bee2d5268d20Dake Gu public void run() { 166761e5a56ed066815e69be7526e3d1bee2d5268d20Dake Gu for (int i = 0; i < mGridView.getChildCount(); i++) { 166861e5a56ed066815e69be7526e3d1bee2d5268d20Dake Gu Selection.setSelection((Spannable)(((TextView) mGridView.getChildAt(i)) 166961e5a56ed066815e69be7526e3d1bee2d5268d20Dake Gu .getText()), 0, 1); 167061e5a56ed066815e69be7526e3d1bee2d5268d20Dake Gu } 167161e5a56ed066815e69be7526e3d1bee2d5268d20Dake Gu mGridView.saveHierarchyState(container); 167261e5a56ed066815e69be7526e3d1bee2d5268d20Dake Gu } 167361e5a56ed066815e69be7526e3d1bee2d5268d20Dake Gu }); 167461e5a56ed066815e69be7526e3d1bee2d5268d20Dake Gu 167561e5a56ed066815e69be7526e3d1bee2d5268d20Dake Gu // 2. clear the text selection 167661e5a56ed066815e69be7526e3d1bee2d5268d20Dake Gu runTestOnUiThread(new Runnable() { 167761e5a56ed066815e69be7526e3d1bee2d5268d20Dake Gu public void run() { 167861e5a56ed066815e69be7526e3d1bee2d5268d20Dake Gu for (int i = 0; i < mGridView.getChildCount(); i++) { 167961e5a56ed066815e69be7526e3d1bee2d5268d20Dake Gu Selection.removeSelection((Spannable)(((TextView) mGridView.getChildAt(i)) 168061e5a56ed066815e69be7526e3d1bee2d5268d20Dake Gu .getText())); 168161e5a56ed066815e69be7526e3d1bee2d5268d20Dake Gu } 168261e5a56ed066815e69be7526e3d1bee2d5268d20Dake Gu } 168361e5a56ed066815e69be7526e3d1bee2d5268d20Dake Gu }); 168461e5a56ed066815e69be7526e3d1bee2d5268d20Dake Gu 168561e5a56ed066815e69be7526e3d1bee2d5268d20Dake Gu // 3. Restore view states should be a no-op for child 168661e5a56ed066815e69be7526e3d1bee2d5268d20Dake Gu runTestOnUiThread(new Runnable() { 168761e5a56ed066815e69be7526e3d1bee2d5268d20Dake Gu public void run() { 168861e5a56ed066815e69be7526e3d1bee2d5268d20Dake Gu mGridView.restoreHierarchyState(container); 168961e5a56ed066815e69be7526e3d1bee2d5268d20Dake Gu for (int i = 0; i < mGridView.getChildCount(); i++) { 169061e5a56ed066815e69be7526e3d1bee2d5268d20Dake Gu assertEquals(-1, ((TextView) mGridView.getChildAt(i)).getSelectionStart()); 169161e5a56ed066815e69be7526e3d1bee2d5268d20Dake Gu assertEquals(-1, ((TextView) mGridView.getChildAt(i)).getSelectionEnd()); 169261e5a56ed066815e69be7526e3d1bee2d5268d20Dake Gu } 169361e5a56ed066815e69be7526e3d1bee2d5268d20Dake Gu } 169461e5a56ed066815e69be7526e3d1bee2d5268d20Dake Gu }); 169561e5a56ed066815e69be7526e3d1bee2d5268d20Dake Gu } 169661e5a56ed066815e69be7526e3d1bee2d5268d20Dake Gu 169708c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu 169808c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu static interface ViewTypeProvider { 169908c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu public int getViewType(int position); 170008c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu } 170108c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu 170208c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu static interface ItemAlignmentFacetProvider { 170308c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu public ItemAlignmentFacet getItemAlignmentFacet(int viewType); 170408c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu } 170508c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu 170608c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu static class TwoViewTypesProvider implements ViewTypeProvider { 170708c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu static int VIEW_TYPE_FIRST = 1; 170808c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu static int VIEW_TYPE_DEFAULT = 0; 170908c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu @Override 171008c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu public int getViewType(int position) { 171108c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu if (position == 0) { 171208c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu return VIEW_TYPE_FIRST; 171308c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu } else { 171408c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu return VIEW_TYPE_DEFAULT; 171508c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu } 171608c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu } 171708c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu } 171808c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu 171908c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu static class PositionItemAlignmentFacetProviderForRelativeLayout1 172008c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu implements ItemAlignmentFacetProvider { 172108c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu ItemAlignmentFacet mMultipleFacet; 172208c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu 172308c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu PositionItemAlignmentFacetProviderForRelativeLayout1() { 172408c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu mMultipleFacet = new ItemAlignmentFacet(); 172508c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu ItemAlignmentFacet.ItemAlignmentDef[] defs = 172608c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu new ItemAlignmentFacet.ItemAlignmentDef[2]; 172708c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu defs[0] = new ItemAlignmentFacet.ItemAlignmentDef(); 172808c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu defs[0].setItemAlignmentViewId(R.id.t1); 172908c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu defs[1] = new ItemAlignmentFacet.ItemAlignmentDef(); 173008c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu defs[1].setItemAlignmentViewId(R.id.t2); 173108c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu defs[1].setItemAlignmentOffsetPercent(100); 173208c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu defs[1].setItemAlignmentOffset(-10); 173308c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu mMultipleFacet.setAlignmentDefs(defs); 173408c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu } 173508c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu 173608c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu @Override 173708c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu public ItemAlignmentFacet getItemAlignmentFacet(int position) { 173808c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu if (position == 0) { 173908c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu return mMultipleFacet; 174008c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu } else { 174108c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu return null; 174208c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu } 174308c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu } 174408c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu } 174508c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu 174608c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu public void testMultipleScrollPosition1() throws Throwable { 174708c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu mInstrumentation = getInstrumentation(); 174808c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class); 174908c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID, 175008c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu R.layout.vertical_linear); 175108c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu intent.putExtra(GridActivity.EXTRA_CHILD_LAYOUT_ID, R.layout.relative_layout); 175208c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu intent.putExtra(GridActivity.EXTRA_REQUEST_FOCUS_ONLAYOUT, true); 175308c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu int[] items = new int[100]; 175408c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu for (int i = 0; i < items.length; i++) { 175508c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu items[i] = 300; 175608c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu } 175708c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu intent.putExtra(GridActivity.EXTRA_ITEMS, items); 175808c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu intent.putExtra(GridActivity.EXTRA_STAGGERED, false); 175908c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu intent.putExtra(GridActivity.EXTRA_VIEWTYPEPROVIDER_CLASS, 176008c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu TwoViewTypesProvider.class.getName()); 176108c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu // Set ItemAlignment for each ViewHolder and view type, ViewHolder should 176208c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu // override the view type settings. 176308c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu intent.putExtra(GridActivity.EXTRA_ITEMALIGNMENTPROVIDER_CLASS, 176408c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu PositionItemAlignmentFacetProviderForRelativeLayout1.class.getName()); 176508c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu intent.putExtra(GridActivity.EXTRA_ITEMALIGNMENTPROVIDER_VIEWTYPE_CLASS, 176608c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu ViewTypePositionItemAlignmentFacetProviderForRelativeLayout2.class.getName()); 176708c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu mOrientation = BaseGridView.VERTICAL; 176808c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu mNumRows = 1; 176908c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu 177008c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu initActivity(intent); 177108c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu 177208c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu assertEquals("First view is aligned with padding top", 177308c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu mGridView.getPaddingTop(), mGridView.getChildAt(0).getTop()); 177408c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu 177508c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu sendKeys(KeyEvent.KEYCODE_DPAD_DOWN); 177608c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu waitForScrollIdle(mVerifyLayout); 177708c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu 177808c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu final View v = mGridView.getChildAt(0); 177908c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu View t1 = v.findViewById(R.id.t1); 178008c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu int t1align = (t1.getTop() + t1.getBottom()) / 2; 178108c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu View t2 = v.findViewById(R.id.t2); 178208c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu int t2align = t2.getBottom() - 10; 178308c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu assertEquals("Expected alignment for 2nd textview", 178408c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu mGridView.getPaddingTop() - (t2align - t1align), 178508c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu v.getTop()); 178608c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu } 178708c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu 178808c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu static class PositionItemAlignmentFacetProviderForRelativeLayout2 implements 178908c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu ItemAlignmentFacetProvider { 179008c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu ItemAlignmentFacet mMultipleFacet; 179108c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu 179208c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu PositionItemAlignmentFacetProviderForRelativeLayout2() { 179308c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu mMultipleFacet = new ItemAlignmentFacet(); 179408c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu ItemAlignmentFacet.ItemAlignmentDef[] defs = new ItemAlignmentFacet.ItemAlignmentDef[2]; 179508c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu defs[0] = new ItemAlignmentFacet.ItemAlignmentDef(); 179608c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu defs[0].setItemAlignmentViewId(R.id.t1); 179708c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu defs[0].setItemAlignmentOffsetPercent(0); 179808c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu defs[1] = new ItemAlignmentFacet.ItemAlignmentDef(); 179908c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu defs[1].setItemAlignmentViewId(R.id.t2); 180008c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu defs[1].setItemAlignmentOffsetPercent(ItemAlignmentFacet.ITEM_ALIGN_OFFSET_PERCENT_DISABLED); 180108c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu defs[1].setItemAlignmentOffset(-10); 180208c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu mMultipleFacet.setAlignmentDefs(defs); 180308c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu } 180408c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu 180508c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu @Override 180608c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu public ItemAlignmentFacet getItemAlignmentFacet(int position) { 180708c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu if (position == 0) { 180808c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu return mMultipleFacet; 180908c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu } else { 181008c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu return null; 181108c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu } 181208c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu } 181308c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu } 181408c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu 181508c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu public void testMultipleScrollPosition2() throws Throwable { 181608c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu mInstrumentation = getInstrumentation(); 181708c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class); 181808c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID, R.layout.vertical_linear); 181908c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu intent.putExtra(GridActivity.EXTRA_CHILD_LAYOUT_ID, R.layout.relative_layout); 182008c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu intent.putExtra(GridActivity.EXTRA_REQUEST_FOCUS_ONLAYOUT, true); 182108c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu int[] items = new int[100]; 182208c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu for (int i = 0; i < items.length; i++) { 182308c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu items[i] = 300; 182408c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu } 182508c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu intent.putExtra(GridActivity.EXTRA_ITEMS, items); 182608c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu intent.putExtra(GridActivity.EXTRA_STAGGERED, false); 182708c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu intent.putExtra(GridActivity.EXTRA_VIEWTYPEPROVIDER_CLASS, 182808c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu TwoViewTypesProvider.class.getName()); 182908c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu intent.putExtra(GridActivity.EXTRA_ITEMALIGNMENTPROVIDER_CLASS, 183008c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu PositionItemAlignmentFacetProviderForRelativeLayout2.class.getName()); 183108c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu mOrientation = BaseGridView.VERTICAL; 183208c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu mNumRows = 1; 183308c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu 183408c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu initActivity(intent); 183508c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu 183608c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu assertEquals("First view is aligned with padding top", mGridView.getPaddingTop(), 183708c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu mGridView.getChildAt(0).getTop()); 183808c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu 183908c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu sendKeys(KeyEvent.KEYCODE_DPAD_DOWN); 184008c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu waitForScrollIdle(mVerifyLayout); 184108c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu 184208c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu final View v = mGridView.getChildAt(0); 184308c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu View t1 = v.findViewById(R.id.t1); 184408c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu int t1align = t1.getTop(); 184508c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu View t2 = v.findViewById(R.id.t2); 184608c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu int t2align = t2.getTop() - 10; 184708c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu assertEquals("Expected alignment for 2nd textview", 184808c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu mGridView.getPaddingTop() - (t2align - t1align), v.getTop()); 184908c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu } 185008c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu 185108c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu static class ViewTypePositionItemAlignmentFacetProviderForRelativeLayout2 implements 185208c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu ItemAlignmentFacetProvider { 185308c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu ItemAlignmentFacet mMultipleFacet; 185408c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu 185508c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu ViewTypePositionItemAlignmentFacetProviderForRelativeLayout2() { 185608c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu mMultipleFacet = new ItemAlignmentFacet(); 185708c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu ItemAlignmentFacet.ItemAlignmentDef[] defs = new ItemAlignmentFacet.ItemAlignmentDef[2]; 185808c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu defs[0] = new ItemAlignmentFacet.ItemAlignmentDef(); 185908c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu defs[0].setItemAlignmentViewId(R.id.t1); 186008c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu defs[0].setItemAlignmentOffsetPercent(0); 186108c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu defs[1] = new ItemAlignmentFacet.ItemAlignmentDef(); 186208c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu defs[1].setItemAlignmentViewId(R.id.t2); 186308c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu defs[1].setItemAlignmentOffsetPercent(100); 186408c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu defs[1].setItemAlignmentOffset(-10); 186508c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu mMultipleFacet.setAlignmentDefs(defs); 186608c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu } 186708c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu 186808c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu @Override 186908c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu public ItemAlignmentFacet getItemAlignmentFacet(int viewType) { 187008c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu if (viewType == TwoViewTypesProvider.VIEW_TYPE_FIRST) { 187108c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu return mMultipleFacet; 187208c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu } else { 187308c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu return null; 187408c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu } 187508c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu } 187608c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu } 187708c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu 187808c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu public void testMultipleScrollPosition3() throws Throwable { 187908c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu mInstrumentation = getInstrumentation(); 188008c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class); 188108c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID, R.layout.vertical_linear); 188208c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu intent.putExtra(GridActivity.EXTRA_CHILD_LAYOUT_ID, R.layout.relative_layout); 188308c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu intent.putExtra(GridActivity.EXTRA_REQUEST_FOCUS_ONLAYOUT, true); 188408c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu int[] items = new int[100]; 188508c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu for (int i = 0; i < items.length; i++) { 188608c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu items[i] = 300; 188708c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu } 188808c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu intent.putExtra(GridActivity.EXTRA_ITEMS, items); 188908c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu intent.putExtra(GridActivity.EXTRA_STAGGERED, false); 189008c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu intent.putExtra(GridActivity.EXTRA_VIEWTYPEPROVIDER_CLASS, 189108c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu TwoViewTypesProvider.class.getName()); 189208c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu intent.putExtra(GridActivity.EXTRA_ITEMALIGNMENTPROVIDER_VIEWTYPE_CLASS, 189308c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu ViewTypePositionItemAlignmentFacetProviderForRelativeLayout2.class.getName()); 189408c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu mOrientation = BaseGridView.VERTICAL; 189508c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu mNumRows = 1; 189608c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu 189708c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu initActivity(intent); 189808c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu 189908c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu assertEquals("First view is aligned with padding top", mGridView.getPaddingTop(), 190008c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu mGridView.getChildAt(0).getTop()); 190108c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu 190208c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu sendKeys(KeyEvent.KEYCODE_DPAD_DOWN); 190308c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu waitForScrollIdle(mVerifyLayout); 190408c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu 190508c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu final View v = mGridView.getChildAt(0); 190608c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu View t1 = v.findViewById(R.id.t1); 190708c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu int t1align = t1.getTop(); 190808c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu View t2 = v.findViewById(R.id.t2); 190908c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu int t2align = t2.getBottom() - 10; 191008c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu assertEquals("Expected alignment for 2nd textview", 191108c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu mGridView.getPaddingTop() - (t2align - t1align), v.getTop()); 191208c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu } 191308c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu 1914db0b1afb71440b79923692d58adee982b5954838Dake Gu public void testSelectionAndAddItemInOneCycle() throws Throwable { 1915db0b1afb71440b79923692d58adee982b5954838Dake Gu mInstrumentation = getInstrumentation(); 1916db0b1afb71440b79923692d58adee982b5954838Dake Gu Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class); 1917db0b1afb71440b79923692d58adee982b5954838Dake Gu intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID, 1918db0b1afb71440b79923692d58adee982b5954838Dake Gu R.layout.vertical_linear); 1919db0b1afb71440b79923692d58adee982b5954838Dake Gu intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 0); 1920db0b1afb71440b79923692d58adee982b5954838Dake Gu initActivity(intent); 1921db0b1afb71440b79923692d58adee982b5954838Dake Gu mOrientation = BaseGridView.HORIZONTAL; 1922db0b1afb71440b79923692d58adee982b5954838Dake Gu mNumRows = 1; 1923db0b1afb71440b79923692d58adee982b5954838Dake Gu 1924db0b1afb71440b79923692d58adee982b5954838Dake Gu runTestOnUiThread(new Runnable() { 1925db0b1afb71440b79923692d58adee982b5954838Dake Gu public void run() { 1926db0b1afb71440b79923692d58adee982b5954838Dake Gu mActivity.addItems(0, new int[]{300, 300}); 1927db0b1afb71440b79923692d58adee982b5954838Dake Gu mGridView.setSelectedPosition(0); 1928db0b1afb71440b79923692d58adee982b5954838Dake Gu } 1929db0b1afb71440b79923692d58adee982b5954838Dake Gu }); 1930db0b1afb71440b79923692d58adee982b5954838Dake Gu waitForTransientStateGone(null); 1931db0b1afb71440b79923692d58adee982b5954838Dake Gu assertEquals(0, mGridView.getSelectedPosition()); 1932db0b1afb71440b79923692d58adee982b5954838Dake Gu } 1933db0b1afb71440b79923692d58adee982b5954838Dake Gu 1934db0b1afb71440b79923692d58adee982b5954838Dake Gu public void testSelectionSmoothAndAddItemInOneCycle() throws Throwable { 1935db0b1afb71440b79923692d58adee982b5954838Dake Gu mInstrumentation = getInstrumentation(); 1936db0b1afb71440b79923692d58adee982b5954838Dake Gu Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class); 1937db0b1afb71440b79923692d58adee982b5954838Dake Gu intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID, 1938db0b1afb71440b79923692d58adee982b5954838Dake Gu R.layout.vertical_linear); 1939db0b1afb71440b79923692d58adee982b5954838Dake Gu intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 0); 1940db0b1afb71440b79923692d58adee982b5954838Dake Gu initActivity(intent); 1941db0b1afb71440b79923692d58adee982b5954838Dake Gu mOrientation = BaseGridView.HORIZONTAL; 1942db0b1afb71440b79923692d58adee982b5954838Dake Gu mNumRows = 1; 1943db0b1afb71440b79923692d58adee982b5954838Dake Gu 1944db0b1afb71440b79923692d58adee982b5954838Dake Gu runTestOnUiThread(new Runnable() { 1945db0b1afb71440b79923692d58adee982b5954838Dake Gu public void run() { 1946db0b1afb71440b79923692d58adee982b5954838Dake Gu mActivity.addItems(0, new int[]{300, 300}); 1947db0b1afb71440b79923692d58adee982b5954838Dake Gu mGridView.setSelectedPositionSmooth(0); 1948db0b1afb71440b79923692d58adee982b5954838Dake Gu } 1949db0b1afb71440b79923692d58adee982b5954838Dake Gu }); 1950db0b1afb71440b79923692d58adee982b5954838Dake Gu waitForTransientStateGone(null); 1951db0b1afb71440b79923692d58adee982b5954838Dake Gu assertEquals(0, mGridView.getSelectedPosition()); 1952db0b1afb71440b79923692d58adee982b5954838Dake Gu } 195388dea72af6042049560140a70e059820dbb8f746Dake Gu 195488dea72af6042049560140a70e059820dbb8f746Dake Gu public void testExtraLayoutSpace() throws Throwable { 195588dea72af6042049560140a70e059820dbb8f746Dake Gu mInstrumentation = getInstrumentation(); 195688dea72af6042049560140a70e059820dbb8f746Dake Gu Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class); 195788dea72af6042049560140a70e059820dbb8f746Dake Gu intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID, 195888dea72af6042049560140a70e059820dbb8f746Dake Gu R.layout.vertical_linear); 195988dea72af6042049560140a70e059820dbb8f746Dake Gu intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 1000); 196088dea72af6042049560140a70e059820dbb8f746Dake Gu intent.putExtra(GridActivity.EXTRA_STAGGERED, false); 196188dea72af6042049560140a70e059820dbb8f746Dake Gu initActivity(intent); 196288dea72af6042049560140a70e059820dbb8f746Dake Gu 196388dea72af6042049560140a70e059820dbb8f746Dake Gu final int windowSize = mGridView.getHeight(); 196488dea72af6042049560140a70e059820dbb8f746Dake Gu final int extraLayoutSize = windowSize; 196588dea72af6042049560140a70e059820dbb8f746Dake Gu int itemLength = mActivity.mItemLengths[0]; 196688dea72af6042049560140a70e059820dbb8f746Dake Gu mOrientation = BaseGridView.VERTICAL; 196788dea72af6042049560140a70e059820dbb8f746Dake Gu mNumRows = 1; 196888dea72af6042049560140a70e059820dbb8f746Dake Gu 196988dea72af6042049560140a70e059820dbb8f746Dake Gu // add extra layout space 197088dea72af6042049560140a70e059820dbb8f746Dake Gu runTestOnUiThread(new Runnable() { 197188dea72af6042049560140a70e059820dbb8f746Dake Gu public void run() { 197288dea72af6042049560140a70e059820dbb8f746Dake Gu mGridView.setExtraLayoutSpace(extraLayoutSize); 197388dea72af6042049560140a70e059820dbb8f746Dake Gu } 197488dea72af6042049560140a70e059820dbb8f746Dake Gu }); 197588dea72af6042049560140a70e059820dbb8f746Dake Gu Thread.sleep(50); 197688dea72af6042049560140a70e059820dbb8f746Dake Gu View v; 197788dea72af6042049560140a70e059820dbb8f746Dake Gu v = mGridView.getChildAt(mGridView.getChildCount() - 1); 197888dea72af6042049560140a70e059820dbb8f746Dake Gu assertTrue(v.getTop() < windowSize + extraLayoutSize); 197988dea72af6042049560140a70e059820dbb8f746Dake Gu assertTrue(v.getBottom() >= windowSize + extraLayoutSize - 198088dea72af6042049560140a70e059820dbb8f746Dake Gu mGridView.getVerticalMargin()); 198188dea72af6042049560140a70e059820dbb8f746Dake Gu 198288dea72af6042049560140a70e059820dbb8f746Dake Gu mGridView.setSelectedPositionSmooth(150); 198388dea72af6042049560140a70e059820dbb8f746Dake Gu waitForScrollIdle(mVerifyLayout); 198488dea72af6042049560140a70e059820dbb8f746Dake Gu v = mGridView.getChildAt(0); 198588dea72af6042049560140a70e059820dbb8f746Dake Gu assertTrue(v.getBottom() > - extraLayoutSize); 198688dea72af6042049560140a70e059820dbb8f746Dake Gu assertTrue(v.getTop() <= -extraLayoutSize + mGridView.getVerticalMargin()); 198788dea72af6042049560140a70e059820dbb8f746Dake Gu 198888dea72af6042049560140a70e059820dbb8f746Dake Gu // clear extra layout space 198988dea72af6042049560140a70e059820dbb8f746Dake Gu runTestOnUiThread(new Runnable() { 199088dea72af6042049560140a70e059820dbb8f746Dake Gu public void run() { 199188dea72af6042049560140a70e059820dbb8f746Dake Gu mGridView.setExtraLayoutSpace(0); 199288dea72af6042049560140a70e059820dbb8f746Dake Gu verifyMargin(); 199388dea72af6042049560140a70e059820dbb8f746Dake Gu } 199488dea72af6042049560140a70e059820dbb8f746Dake Gu }); 199588dea72af6042049560140a70e059820dbb8f746Dake Gu Thread.sleep(50); 199688dea72af6042049560140a70e059820dbb8f746Dake Gu v = mGridView.getChildAt(mGridView.getChildCount() - 1); 199788dea72af6042049560140a70e059820dbb8f746Dake Gu assertTrue(v.getTop() < windowSize); 199888dea72af6042049560140a70e059820dbb8f746Dake Gu assertTrue(v.getBottom() >= windowSize - mGridView.getVerticalMargin()); 199988dea72af6042049560140a70e059820dbb8f746Dake Gu } 2000d1cab1b54104d55407335c5d649398635822fffdDake Gu 2001d1cab1b54104d55407335c5d649398635822fffdDake Gu public void testAccessibility() throws Throwable { 2002d1cab1b54104d55407335c5d649398635822fffdDake Gu mInstrumentation = getInstrumentation(); 2003d1cab1b54104d55407335c5d649398635822fffdDake Gu Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class); 2004d1cab1b54104d55407335c5d649398635822fffdDake Gu intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID, 2005d1cab1b54104d55407335c5d649398635822fffdDake Gu R.layout.vertical_linear); 2006d1cab1b54104d55407335c5d649398635822fffdDake Gu intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 1000); 2007d1cab1b54104d55407335c5d649398635822fffdDake Gu intent.putExtra(GridActivity.EXTRA_STAGGERED, false); 2008d1cab1b54104d55407335c5d649398635822fffdDake Gu initActivity(intent); 2009d1cab1b54104d55407335c5d649398635822fffdDake Gu mOrientation = BaseGridView.VERTICAL; 2010d1cab1b54104d55407335c5d649398635822fffdDake Gu mNumRows = 1; 2011d1cab1b54104d55407335c5d649398635822fffdDake Gu 2012d1cab1b54104d55407335c5d649398635822fffdDake Gu assertTrue(0 == mGridView.getSelectedPosition()); 2013d1cab1b54104d55407335c5d649398635822fffdDake Gu 2014d1cab1b54104d55407335c5d649398635822fffdDake Gu final RecyclerViewAccessibilityDelegate delegateCompat = mGridView 2015d1cab1b54104d55407335c5d649398635822fffdDake Gu .getCompatAccessibilityDelegate(); 2016d1cab1b54104d55407335c5d649398635822fffdDake Gu final AccessibilityNodeInfoCompat info = AccessibilityNodeInfoCompat.obtain(); 2017d1cab1b54104d55407335c5d649398635822fffdDake Gu runTestOnUiThread(new Runnable() { 2018d1cab1b54104d55407335c5d649398635822fffdDake Gu @Override 2019d1cab1b54104d55407335c5d649398635822fffdDake Gu public void run() { 2020d1cab1b54104d55407335c5d649398635822fffdDake Gu delegateCompat.onInitializeAccessibilityNodeInfo(mGridView, info); 2021d1cab1b54104d55407335c5d649398635822fffdDake Gu } 2022d1cab1b54104d55407335c5d649398635822fffdDake Gu }); 2023d1cab1b54104d55407335c5d649398635822fffdDake Gu assertTrue("test sanity", info.isScrollable()); 2024d1cab1b54104d55407335c5d649398635822fffdDake Gu runTestOnUiThread(new Runnable() { 2025d1cab1b54104d55407335c5d649398635822fffdDake Gu @Override 2026d1cab1b54104d55407335c5d649398635822fffdDake Gu public void run() { 2027d1cab1b54104d55407335c5d649398635822fffdDake Gu delegateCompat.performAccessibilityAction(mGridView, 2028d1cab1b54104d55407335c5d649398635822fffdDake Gu AccessibilityNodeInfoCompat.ACTION_SCROLL_FORWARD, null); 2029d1cab1b54104d55407335c5d649398635822fffdDake Gu } 2030d1cab1b54104d55407335c5d649398635822fffdDake Gu }); 2031d1cab1b54104d55407335c5d649398635822fffdDake Gu waitForScrollIdle(mVerifyLayout); 2032d1cab1b54104d55407335c5d649398635822fffdDake Gu int selectedPosition1 = mGridView.getSelectedPosition(); 2033d1cab1b54104d55407335c5d649398635822fffdDake Gu assertTrue(0 < selectedPosition1); 2034d1cab1b54104d55407335c5d649398635822fffdDake Gu 2035d1cab1b54104d55407335c5d649398635822fffdDake Gu runTestOnUiThread(new Runnable() { 2036d1cab1b54104d55407335c5d649398635822fffdDake Gu @Override 2037d1cab1b54104d55407335c5d649398635822fffdDake Gu public void run() { 2038d1cab1b54104d55407335c5d649398635822fffdDake Gu delegateCompat.onInitializeAccessibilityNodeInfo(mGridView, info); 2039d1cab1b54104d55407335c5d649398635822fffdDake Gu } 2040d1cab1b54104d55407335c5d649398635822fffdDake Gu }); 2041d1cab1b54104d55407335c5d649398635822fffdDake Gu assertTrue("test sanity", info.isScrollable()); 2042d1cab1b54104d55407335c5d649398635822fffdDake Gu runTestOnUiThread(new Runnable() { 2043d1cab1b54104d55407335c5d649398635822fffdDake Gu @Override 2044d1cab1b54104d55407335c5d649398635822fffdDake Gu public void run() { 2045d1cab1b54104d55407335c5d649398635822fffdDake Gu delegateCompat.performAccessibilityAction(mGridView, 2046d1cab1b54104d55407335c5d649398635822fffdDake Gu AccessibilityNodeInfoCompat.ACTION_SCROLL_BACKWARD, null); 2047d1cab1b54104d55407335c5d649398635822fffdDake Gu } 2048d1cab1b54104d55407335c5d649398635822fffdDake Gu }); 2049d1cab1b54104d55407335c5d649398635822fffdDake Gu waitForScrollIdle(mVerifyLayout); 2050d1cab1b54104d55407335c5d649398635822fffdDake Gu int selectedPosition2 = mGridView.getSelectedPosition(); 2051d1cab1b54104d55407335c5d649398635822fffdDake Gu assertTrue(selectedPosition2 < selectedPosition1); 2052d1cab1b54104d55407335c5d649398635822fffdDake Gu } 2053d1cab1b54104d55407335c5d649398635822fffdDake Gu 2054062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu} 2055