GridWidgetTest.java revision 9c56475370d1df940252ff1360b92de50022fff6
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;
20062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Guimport android.util.Log;
21062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Guimport android.view.KeyEvent;
22062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Guimport android.view.View;
23062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Guimport android.view.ViewGroup;
24062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Guimport android.app.Instrumentation;
25062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Guimport android.content.Intent;
26062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu
27062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Guimport java.util.ArrayList;
28062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Guimport java.util.Arrays;
29062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Guimport java.util.Comparator;
30062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Guimport java.util.HashMap;
31062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Guimport java.util.Iterator;
32062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu
33062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu/**
34062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu * @hide from javadoc
35062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu */
36062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gupublic class GridWidgetTest extends ActivityInstrumentationTestCase2<GridActivity> {
37062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu
38062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu    protected GridActivity mActivity;
39062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu    protected Instrumentation mInstrumentation;
40062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu    protected BaseGridView mGridView;
4185df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu    protected GridLayoutManager mLayoutManager;
42062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu    protected int mOrientation;
43247741d74797105ba4f6d2834ec56dab32c14644Dake Gu    protected int mNumRows;
44062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu
45062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu    private final Comparator<View> mRowSortComparator = new Comparator<View>() {
46062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu        public int compare(View lhs, View rhs) {
47062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu            if (mOrientation == BaseGridView.HORIZONTAL) {
48062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu                return lhs.getLeft() - rhs.getLeft();
49062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu            } else {
50062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu                return lhs.getTop() - rhs.getTop();
51062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu            }
52062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu        };
53062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu    };
54062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu
55062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu    /**
56062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu     * Verify margins between items on same row are same.
57062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu     */
58062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu    private final Runnable mVerifyLayout = new Runnable() {
59062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu        @Override
60062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu        public void run() {
61e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu            verifyMargin();
62062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu        }
63062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu    };
64062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu
65062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu    public GridWidgetTest() {
66062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu        super("android.support.v17.leanback.tests", GridActivity.class);
67062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu    }
68062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu
69062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu    /**
70062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu     * Wait for grid view stop scroll and optionally verify state of grid view.
71062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu     */
72062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu    protected void waitForScrollIdle(Runnable verify) throws Throwable {
738c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        Thread.sleep(100);
74062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu        while (mGridView.getLayoutManager().isSmoothScrolling() ||
75062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu                mGridView.getScrollState() != BaseGridView.SCROLL_STATE_IDLE) {
76062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu            try {
77062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu                Thread.sleep(100);
78062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu            } catch (InterruptedException ex) {
79062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu                break;
80062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu            }
81062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu            if (verify != null) {
82062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu                runTestOnUiThread(verify);
83062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu            }
84062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu        }
85062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu    }
86062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu
87062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu    /**
8885df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu     * Wait for grid view stop animation and optionally verify state of grid view.
8985df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu     */
9085df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu    protected void waitForTransientStateGone(Runnable verify) throws Throwable {
9185df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu        do {
9285df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu            try {
9385df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu                Thread.sleep(100);
9485df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu            } catch (InterruptedException ex) {
9585df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu                break;
9685df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu            }
9785df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu            if (verify != null) {
9885df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu                runTestOnUiThread(verify);
9985df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu            }
10085df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu        } while (mGridView.hasTransientState());
10185df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu    }
10285df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu
10385df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu    /**
104062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu     * Wait for grid view stop scroll.
105062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu     */
106062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu    protected void waitForScrollIdle() throws Throwable {
107062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu        waitForScrollIdle(null);
108062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu    }
109062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu
110e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu    /**
111a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu     * Scrolls using given key.
112a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu     */
113a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu    protected void scroll(int key, Runnable verify) throws Throwable {
114a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu        do {
115a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu            if (verify != null) {
116a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu                runTestOnUiThread(verify);
117a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu            }
118a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu            sendRepeatedKeys(10, key);
119a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu            try {
1208c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu                Thread.sleep(300);
121a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu            } catch (InterruptedException ex) {
122a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu                break;
123a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu            }
124a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu        } while (mGridView.getLayoutManager().isSmoothScrolling() ||
125a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu                mGridView.getScrollState() != BaseGridView.SCROLL_STATE_IDLE);
126a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu    }
127a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu
128a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu    protected void scrollToBegin(Runnable verify) throws Throwable {
129a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu        int key;
130a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu        if (mOrientation == BaseGridView.HORIZONTAL) {
131a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu            if (mGridView.getLayoutDirection() == ViewGroup.LAYOUT_DIRECTION_RTL) {
132a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu                key = KeyEvent.KEYCODE_DPAD_RIGHT;
133a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu            } else {
134a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu                key = KeyEvent.KEYCODE_DPAD_LEFT;
135a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu            }
136a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu        } else {
137a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu            key = KeyEvent.KEYCODE_DPAD_UP;
138a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu        }
139a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu        scroll(key, verify);
140a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu    }
141a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu
142a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu    protected void scrollToEnd(Runnable verify) throws Throwable {
143a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu        int key;
144a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu        if (mOrientation == BaseGridView.HORIZONTAL) {
145a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu            if (mGridView.getLayoutDirection() == ViewGroup.LAYOUT_DIRECTION_RTL) {
146a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu                key = KeyEvent.KEYCODE_DPAD_LEFT;
147a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu            } else {
148a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu                key = KeyEvent.KEYCODE_DPAD_RIGHT;
149a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu            }
150a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu        } else {
151a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu            key = KeyEvent.KEYCODE_DPAD_DOWN;
152a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu        }
153a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu        scroll(key, verify);
154a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu    }
155a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu
156a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu    /**
157e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu     * Group and sort children by their position on each row (HORIZONTAL) or column(VERTICAL).
158e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu     */
159e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu    protected View[][] sortByRows() {
160e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu        final HashMap<Integer, ArrayList<View>> rows = new HashMap<Integer, ArrayList<View>>();
161c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu        ArrayList<Integer> rowLocations = new ArrayList();
162e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu        for (int i = 0; i < mGridView.getChildCount(); i++) {
163e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu            View v = mGridView.getChildAt(i);
164e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu            int rowLocation;
165e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu            if (mOrientation == BaseGridView.HORIZONTAL) {
166e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu                rowLocation = v.getTop();
167e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu            } else {
168e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu                rowLocation = mGridView.getLayoutDirection() == ViewGroup.LAYOUT_DIRECTION_RTL ?
169e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu                    v.getRight() : v.getLeft();
170e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu            }
171e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu            ArrayList<View> views = rows.get(rowLocation);
172e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu            if (views == null) {
173e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu                views = new ArrayList<View>();
174e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu                rows.put(rowLocation, views);
175c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu                rowLocations.add(rowLocation);
176e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu            }
177e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu            views.add(v);
178e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu        }
179c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu        Object[] sortedLocations = rowLocations.toArray();
180c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu        Arrays.sort(sortedLocations);
181c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu        if (mNumRows != rows.size()) {
182c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu            assertEquals("Dump Views by rows "+rows, mNumRows, rows.size());
183c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu        }
184e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu        View[][] sorted = new View[rows.size()][];
185c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu        for (int i = 0; i < rowLocations.size(); i++) {
186c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu            Integer rowLocation = rowLocations.get(i);
187c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu            ArrayList<View> arr = rows.get(rowLocation);
188e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu            View[] views = arr.toArray(new View[arr.size()]);
189e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu            Arrays.sort(views, mRowSortComparator);
190c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu            sorted[i] = views;
191e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu        }
192e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu        return sorted;
193e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu    }
194e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu
195e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu    protected void verifyMargin() {
196e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu        View[][] sorted = sortByRows();
197e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu        for (int row = 0; row < sorted.length; row++) {
198e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu            View[] views = sorted[row];
199e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu            int margin = -1;
200e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu            for (int i = 1; i < views.length; i++) {
201e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu                if (mOrientation == BaseGridView.HORIZONTAL) {
202e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu                    if (i == 1) {
203e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu                        margin = views[i].getLeft() - views[i - 1].getRight();
204e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu                    } else {
205e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu                        assertEquals(margin, views[i].getLeft() - views[i - 1].getRight());
206e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu                    }
207e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu                } else {
208e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu                    if (i == 1) {
209e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu                        margin = views[i].getTop() - views[i - 1].getBottom();
210e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu                    } else {
211e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu                        assertEquals(margin, views[i].getTop() - views[i - 1].getBottom());
212e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu                    }
213e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu                }
214e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu            }
215e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu        }
216e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu    }
217e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu
218e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu    protected void verifyBeginAligned() {
219e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu        View[][] sorted = sortByRows();
220e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu        int alignedLocation = 0;
221e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu        if (mOrientation == BaseGridView.HORIZONTAL) {
222e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu            if (mGridView.getLayoutDirection() == ViewGroup.LAYOUT_DIRECTION_RTL) {
223e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu                for (int i = 0; i < sorted.length; i++) {
224e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu                    if (i == 0) {
225e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu                        alignedLocation = sorted[i][sorted[i].length - 1].getRight();
226e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu                    } else {
227e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu                        assertEquals(alignedLocation, sorted[i][sorted[i].length - 1].getRight());
228e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu                    }
229e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu                }
230e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu            } else {
231e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu                for (int i = 0; i < sorted.length; i++) {
232e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu                    if (i == 0) {
233e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu                        alignedLocation = sorted[i][0].getLeft();
234e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu                    } else {
235e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu                        assertEquals(alignedLocation, sorted[i][0].getLeft());
236e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu                    }
237e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu                }
238e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu            }
239e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu        } else {
240e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu            for (int i = 0; i < sorted.length; i++) {
241e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu                if (i == 0) {
242e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu                    alignedLocation = sorted[i][0].getTop();
243e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu                } else {
244e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu                    assertEquals(alignedLocation, sorted[i][0].getTop());
245e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu                }
246e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu            }
247e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu        }
248e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu    }
249e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu
250c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu    protected int[] getEndEdges() {
251c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu        View[][] sorted = sortByRows();
252c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu        int[] edges = new int[sorted.length];
253c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu        if (mOrientation == BaseGridView.HORIZONTAL) {
254c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu            if (mGridView.getLayoutDirection() == ViewGroup.LAYOUT_DIRECTION_RTL) {
255c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu                for (int i = 0; i < sorted.length; i++) {
256c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu                    edges[i] = sorted[i][0].getLeft();
257c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu                }
258c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu            } else {
259c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu                for (int i = 0; i < sorted.length; i++) {
260c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu                    edges[i] = sorted[i][sorted[i].length - 1].getRight();
261c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu                }
262c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu            }
263c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu        } else {
264c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu            for (int i = 0; i < sorted.length; i++) {
265c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu                edges[i] = sorted[i][sorted[i].length - 1].getBottom();
266c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu            }
267c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu        }
268c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu        return edges;
269c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu    }
270c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu
271c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu    protected void verifyEdgesSame(int[] edges, int[] edges2) {
272c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu        assertEquals(edges.length, edges2.length);
273c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu        for (int i = 0; i < edges.length; i++) {
274c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu            assertEquals(edges[i], edges2[i]);
275c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu        }
276c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu    }
277c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu
27885df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu    protected void verifyBoundCount(int count) {
27985df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu        if (mActivity.getBoundCount() != count) {
28085df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu            StringBuffer b = new StringBuffer();
28185df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu            b.append("ItemsLength: ");
28285df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu            for (int i = 0; i < mActivity.mItemLengths.length; i++) {
28385df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu                b.append(mActivity.mItemLengths[i]).append(",");
28485df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu            }
28585df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu            assertEquals("Bound count does not match, ItemsLengths: "+ b,
28685df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu                    count, mActivity.getBoundCount());
28785df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu        }
28885df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu    }
28985df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu
2908c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu    private static int getCenterY(View v) {
2918c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        return (v.getTop() + v.getBottom())/2;
2928c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu    }
293062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu
2948c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu    private static int getCenterX(View v) {
2958c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        return (v.getLeft() + v.getRight())/2;
2968c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu    }
2978c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu
2988c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu    private void initActivity(Intent intent) {
2998c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        setActivityIntent(intent);
3008c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        mActivity = getActivity();
3018c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        final String testName = getName();
3028c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        try {
3038c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu            runTestOnUiThread(new Runnable() {
3048c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu                public void run() {
3058c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu                    mActivity.setTitle(testName);
3068c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu                }
3078c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu            });
3088c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu            Thread.sleep(1000);
3098c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        } catch (Throwable t) {
3108c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu            t.printStackTrace();
3118c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        }
3128c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        mGridView = mActivity.mGridView;
3138c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu    }
3148c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu
3158c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu    public void testThreeRowHorizontalBasic() throws Throwable {
316062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu        mInstrumentation = getInstrumentation();
317062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
318247741d74797105ba4f6d2834ec56dab32c14644Dake Gu        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID, R.layout.horizontal_grid);
319e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 100);
3208c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        initActivity(intent);
321247741d74797105ba4f6d2834ec56dab32c14644Dake Gu        mOrientation = BaseGridView.HORIZONTAL;
322247741d74797105ba4f6d2834ec56dab32c14644Dake Gu        mNumRows = 3;
323062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu
324a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu        scrollToEnd(mVerifyLayout);
32585df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu        verifyBoundCount(100);
326e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu
327a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu        scrollToBegin(mVerifyLayout);
328062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu
329e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu        verifyBeginAligned();
330062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu    }
331062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu
332e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu    public void testThreeColumnVerticalBasic() throws Throwable {
333e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu
334e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu        mInstrumentation = getInstrumentation();
335e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
336247741d74797105ba4f6d2834ec56dab32c14644Dake Gu        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID, R.layout.vertical_grid);
337e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 200);
3388c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        initActivity(intent);
339247741d74797105ba4f6d2834ec56dab32c14644Dake Gu        mOrientation = BaseGridView.VERTICAL;
340247741d74797105ba4f6d2834ec56dab32c14644Dake Gu        mNumRows = 3;
341e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu
342a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu        scrollToEnd(mVerifyLayout);
34385df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu        verifyBoundCount(200);
344e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu
345a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu        scrollToBegin(mVerifyLayout);
34685df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu
34785df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu        verifyBeginAligned();
34885df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu    }
34985df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu
35085df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu    public void testRedundantAppendRemove() throws Throwable {
35185df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu        mInstrumentation = getInstrumentation();
35285df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
353247741d74797105ba4f6d2834ec56dab32c14644Dake Gu        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
354247741d74797105ba4f6d2834ec56dab32c14644Dake Gu                R.layout.vertical_grid_testredundantappendremove);
35585df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu        intent.putExtra(GridActivity.EXTRA_ITEMS, new int[]{
35685df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu                149,177,128,234,227,187,163,223,146,210,228,148,227,193,182,197,177,142,225,207,
35785df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu                157,171,209,204,187,184,123,221,197,153,202,179,193,214,226,173,225,143,188,159,
35885df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu                139,193,233,143,227,203,222,124,228,223,164,131,228,126,211,160,165,152,235,184,
35985df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu                155,224,149,181,171,229,200,234,177,130,164,172,188,139,132,203,179,220,147,131,
36085df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu                226,127,230,239,183,203,206,227,123,170,239,234,200,149,237,204,160,133,202,234,
36185df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu                173,122,139,149,151,153,216,231,121,145,227,153,186,174,223,180,123,215,206,216,
36285df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu                239,222,219,207,193,218,140,133,171,153,183,132,233,138,159,174,189,171,143,128,
36385df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu                152,222,141,202,224,190,134,120,181,231,230,136,132,224,136,210,207,150,128,183,
36485df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu                221,194,179,220,126,221,137,205,223,193,172,132,226,209,133,191,227,127,159,171,
36585df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu                180,149,237,177,194,207,170,202,161,144,147,199,205,186,164,140,193,203,224,129});
3668c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        initActivity(intent);
367247741d74797105ba4f6d2834ec56dab32c14644Dake Gu        mOrientation = BaseGridView.VERTICAL;
368247741d74797105ba4f6d2834ec56dab32c14644Dake Gu        mNumRows = 3;
36985df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu
370a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu        scrollToEnd(mVerifyLayout);
37185df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu
37285df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu        verifyBoundCount(200);
373e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu
374a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu        scrollToBegin(mVerifyLayout);
375e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu
376e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu        verifyBeginAligned();
377e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu    }
37885df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu
37985df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu    public void testRedundantAppendRemove2() throws Throwable {
38085df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu        mInstrumentation = getInstrumentation();
38185df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
382247741d74797105ba4f6d2834ec56dab32c14644Dake Gu        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
383247741d74797105ba4f6d2834ec56dab32c14644Dake Gu                R.layout.horizontal_grid_testredundantappendremove2);
38485df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu        intent.putExtra(GridActivity.EXTRA_ITEMS, new int[]{
38585df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu                318,333,199,224,246,273,269,289,340,313,265,306,349,269,185,282,257,354,316,252,
38685df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu                237,290,283,343,196,313,290,343,191,262,342,228,343,349,251,203,226,305,265,213,
38785df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu                216,333,295,188,187,281,288,311,244,232,224,332,290,181,267,276,226,261,335,355,
38885df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu                225,217,219,183,234,285,257,304,182,250,244,223,257,219,342,185,347,205,302,315,
38985df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu                299,309,292,237,192,309,228,250,347,227,337,298,299,185,185,331,223,284,265,351});
3908c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        initActivity(intent);
391247741d74797105ba4f6d2834ec56dab32c14644Dake Gu        mOrientation = BaseGridView.HORIZONTAL;
392247741d74797105ba4f6d2834ec56dab32c14644Dake Gu        mNumRows = 3;
39385df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu        mLayoutManager = (GridLayoutManager) mGridView.getLayoutManager();
39485df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu
39585df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu        // test append without staggered result cache
396a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu        scrollToEnd(mVerifyLayout);
39785df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu
39885df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu        verifyBoundCount(100);
399c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu        int[] endEdges = getEndEdges();
40085df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu
401a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu        scrollToBegin(mVerifyLayout);
40285df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu
40385df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu        verifyBeginAligned();
40485df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu
40585df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu        // now test append with staggered result cache
40685df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu        runTestOnUiThread(new Runnable() {
40785df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu            public void run() {
40885df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu                mActivity.changeArraySize(3);
40985df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu            }
41085df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu        });
41185df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu        Thread.sleep(500);
41285df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu        assertEquals("Staggerd cache should be kept as is when no item size change",
41385df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu                100, ((StaggeredGrid) mLayoutManager.mGrid).mLocations.size());
41485df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu
41585df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu        mActivity.resetBoundCount();
41685df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu        runTestOnUiThread(new Runnable() {
41785df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu            public void run() {
41885df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu                mActivity.changeArraySize(100);
41985df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu            }
42085df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu        });
42185df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu        Thread.sleep(500);
42285df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu
423a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu        scrollToEnd(mVerifyLayout);
42485df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu        verifyBoundCount(100);
425c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu
426c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu        // we should get same aligned end edges
427c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu        int[] endEdges2 = getEndEdges();
428c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu        verifyEdgesSame(endEdges, endEdges2);
42985df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu    }
43085df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu
431c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu    public void testItemMovedHorizontal() throws Throwable {
43285df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu
43385df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu        mInstrumentation = getInstrumentation();
43485df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
435247741d74797105ba4f6d2834ec56dab32c14644Dake Gu        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
436247741d74797105ba4f6d2834ec56dab32c14644Dake Gu                R.layout.horizontal_grid);
43785df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 200);
4388c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        initActivity(intent);
439247741d74797105ba4f6d2834ec56dab32c14644Dake Gu        mOrientation = BaseGridView.HORIZONTAL;
440247741d74797105ba4f6d2834ec56dab32c14644Dake Gu        mNumRows = 3;
44185df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu
44285df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu        mGridView.setSelectedPositionSmooth(150);
44385df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu        waitForScrollIdle(mVerifyLayout);
44485df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu        mActivity.swap(150, 152);
44585df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu        waitForTransientStateGone(null);
44685df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu
44785df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu        runTestOnUiThread(mVerifyLayout);
44885df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu
449a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu        scrollToBegin(mVerifyLayout);
45085df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu
45185df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu        verifyBeginAligned();
45285df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu    }
45385df3117f0fcd0aa10d7bd45194dab97e22112f2Dake Gu
454c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu    public void testItemMovedVertical() throws Throwable {
455c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu
456c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu        mInstrumentation = getInstrumentation();
457c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
458c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
459c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu                R.layout.vertical_grid);
460c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 200);
4618c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        initActivity(intent);
462c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu        mOrientation = BaseGridView.VERTICAL;
463c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu        mNumRows = 3;
464c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu
465c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu        mGridView.setSelectedPositionSmooth(150);
466c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu        waitForScrollIdle(mVerifyLayout);
467c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu        mActivity.swap(150, 152);
468c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu        waitForTransientStateGone(null);
469c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu
470c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu        runTestOnUiThread(mVerifyLayout);
471c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu
4727ee22537e201c3d6b5de2908aecc4b0cc59a05c2Dake Gu        scrollToEnd(mVerifyLayout);
473a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu        scrollToBegin(mVerifyLayout);
474c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu
475c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu        verifyBeginAligned();
476c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu    }
477c755c85c3596bb00f30f7941bac3860a9dc91d7aDake Gu
478ede7fd3c91008fb042c736240534d0d87234f112Dake Gu    public void testItemAddRemoveHorizontal() throws Throwable {
479ede7fd3c91008fb042c736240534d0d87234f112Dake Gu
480ede7fd3c91008fb042c736240534d0d87234f112Dake Gu        mInstrumentation = getInstrumentation();
481ede7fd3c91008fb042c736240534d0d87234f112Dake Gu        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
482ede7fd3c91008fb042c736240534d0d87234f112Dake Gu        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
483ede7fd3c91008fb042c736240534d0d87234f112Dake Gu                R.layout.horizontal_grid);
484ede7fd3c91008fb042c736240534d0d87234f112Dake Gu        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 200);
4858c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        initActivity(intent);
486ede7fd3c91008fb042c736240534d0d87234f112Dake Gu        mOrientation = BaseGridView.HORIZONTAL;
487ede7fd3c91008fb042c736240534d0d87234f112Dake Gu        mNumRows = 3;
488ede7fd3c91008fb042c736240534d0d87234f112Dake Gu
489a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu        scrollToEnd(mVerifyLayout);
490ede7fd3c91008fb042c736240534d0d87234f112Dake Gu        int[] endEdges = getEndEdges();
491ede7fd3c91008fb042c736240534d0d87234f112Dake Gu
492ede7fd3c91008fb042c736240534d0d87234f112Dake Gu        mGridView.setSelectedPositionSmooth(150);
493ede7fd3c91008fb042c736240534d0d87234f112Dake Gu        waitForScrollIdle(mVerifyLayout);
494ede7fd3c91008fb042c736240534d0d87234f112Dake Gu        int[] removedItems = mActivity.removeItems(151, 4);
495ede7fd3c91008fb042c736240534d0d87234f112Dake Gu        waitForTransientStateGone(null);
496ede7fd3c91008fb042c736240534d0d87234f112Dake Gu
497a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu        scrollToEnd(mVerifyLayout);
498ede7fd3c91008fb042c736240534d0d87234f112Dake Gu        mGridView.setSelectedPositionSmooth(150);
499ede7fd3c91008fb042c736240534d0d87234f112Dake Gu        waitForScrollIdle(mVerifyLayout);
500ede7fd3c91008fb042c736240534d0d87234f112Dake Gu
501ede7fd3c91008fb042c736240534d0d87234f112Dake Gu        mActivity.addItems(151, removedItems);
502ede7fd3c91008fb042c736240534d0d87234f112Dake Gu        waitForTransientStateGone(null);
503a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu        scrollToEnd(mVerifyLayout);
504ede7fd3c91008fb042c736240534d0d87234f112Dake Gu
505ede7fd3c91008fb042c736240534d0d87234f112Dake Gu        // we should get same aligned end edges
506ede7fd3c91008fb042c736240534d0d87234f112Dake Gu        int[] endEdges2 = getEndEdges();
507ede7fd3c91008fb042c736240534d0d87234f112Dake Gu        verifyEdgesSame(endEdges, endEdges2);
508ede7fd3c91008fb042c736240534d0d87234f112Dake Gu
509a3c24a53034f1effc24b2d01328d63d96ad2ac7cDake Gu        scrollToBegin(mVerifyLayout);
510ede7fd3c91008fb042c736240534d0d87234f112Dake Gu        verifyBeginAligned();
511ede7fd3c91008fb042c736240534d0d87234f112Dake Gu    }
512ede7fd3c91008fb042c736240534d0d87234f112Dake Gu
5139c56475370d1df940252ff1360b92de50022fff6Dake Gu    public void testFocusToFirstItem() throws Throwable {
5149c56475370d1df940252ff1360b92de50022fff6Dake Gu
5159c56475370d1df940252ff1360b92de50022fff6Dake Gu        mInstrumentation = getInstrumentation();
5169c56475370d1df940252ff1360b92de50022fff6Dake Gu        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
5179c56475370d1df940252ff1360b92de50022fff6Dake Gu        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
5189c56475370d1df940252ff1360b92de50022fff6Dake Gu                R.layout.horizontal_grid);
5199c56475370d1df940252ff1360b92de50022fff6Dake Gu        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 200);
5209c56475370d1df940252ff1360b92de50022fff6Dake Gu        initActivity(intent);
5219c56475370d1df940252ff1360b92de50022fff6Dake Gu        mOrientation = BaseGridView.HORIZONTAL;
5229c56475370d1df940252ff1360b92de50022fff6Dake Gu        mNumRows = 3;
5239c56475370d1df940252ff1360b92de50022fff6Dake Gu
5249c56475370d1df940252ff1360b92de50022fff6Dake Gu        int[] removedItems = mActivity.removeItems(0, 200);
5259c56475370d1df940252ff1360b92de50022fff6Dake Gu
5269c56475370d1df940252ff1360b92de50022fff6Dake Gu        waitForTransientStateGone(null);
5279c56475370d1df940252ff1360b92de50022fff6Dake Gu        Thread.sleep(500);
5289c56475370d1df940252ff1360b92de50022fff6Dake Gu        mActivity.addItems(0, removedItems);
5299c56475370d1df940252ff1360b92de50022fff6Dake Gu
5309c56475370d1df940252ff1360b92de50022fff6Dake Gu        waitForTransientStateGone(null);
5319c56475370d1df940252ff1360b92de50022fff6Dake Gu        Thread.sleep(500);
5329c56475370d1df940252ff1360b92de50022fff6Dake Gu        assertTrue(mGridView.getLayoutManager().findViewByPosition(0).hasFocus());
5339c56475370d1df940252ff1360b92de50022fff6Dake Gu
5349c56475370d1df940252ff1360b92de50022fff6Dake Gu        runTestOnUiThread(new Runnable() {
5359c56475370d1df940252ff1360b92de50022fff6Dake Gu            public void run() {
5369c56475370d1df940252ff1360b92de50022fff6Dake Gu                mActivity.changeArraySize(0);
5379c56475370d1df940252ff1360b92de50022fff6Dake Gu            }
5389c56475370d1df940252ff1360b92de50022fff6Dake Gu        });
5399c56475370d1df940252ff1360b92de50022fff6Dake Gu        Thread.sleep(500);
5409c56475370d1df940252ff1360b92de50022fff6Dake Gu
5419c56475370d1df940252ff1360b92de50022fff6Dake Gu        runTestOnUiThread(new Runnable() {
5429c56475370d1df940252ff1360b92de50022fff6Dake Gu            public void run() {
5439c56475370d1df940252ff1360b92de50022fff6Dake Gu                mActivity.changeArraySize(200);
5449c56475370d1df940252ff1360b92de50022fff6Dake Gu            }
5459c56475370d1df940252ff1360b92de50022fff6Dake Gu        });
5469c56475370d1df940252ff1360b92de50022fff6Dake Gu        Thread.sleep(500);
5479c56475370d1df940252ff1360b92de50022fff6Dake Gu        assertTrue(mGridView.getLayoutManager().findViewByPosition(0).hasFocus());
5489c56475370d1df940252ff1360b92de50022fff6Dake Gu    }
5499c56475370d1df940252ff1360b92de50022fff6Dake Gu
55077b17ebed6d1f8488b150b25e2b6754971480caeDake Gu    public void testNonFocusableHorizontal() throws Throwable {
55177b17ebed6d1f8488b150b25e2b6754971480caeDake Gu        final int numItems = 200;
55277b17ebed6d1f8488b150b25e2b6754971480caeDake Gu        final int startPos = 45;
55377b17ebed6d1f8488b150b25e2b6754971480caeDake Gu        final int skips = 20;
55477b17ebed6d1f8488b150b25e2b6754971480caeDake Gu        final int numColumns = 3;
55577b17ebed6d1f8488b150b25e2b6754971480caeDake Gu        final int endPos = startPos + numColumns * (skips + 1);
55677b17ebed6d1f8488b150b25e2b6754971480caeDake Gu
55777b17ebed6d1f8488b150b25e2b6754971480caeDake Gu        mInstrumentation = getInstrumentation();
55877b17ebed6d1f8488b150b25e2b6754971480caeDake Gu        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
55977b17ebed6d1f8488b150b25e2b6754971480caeDake Gu        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
56077b17ebed6d1f8488b150b25e2b6754971480caeDake Gu                R.layout.horizontal_grid);
56177b17ebed6d1f8488b150b25e2b6754971480caeDake Gu        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, numItems);
56277b17ebed6d1f8488b150b25e2b6754971480caeDake Gu        intent.putExtra(GridActivity.EXTRA_STAGGERED, false);
56377b17ebed6d1f8488b150b25e2b6754971480caeDake Gu        mOrientation = BaseGridView.HORIZONTAL;
56477b17ebed6d1f8488b150b25e2b6754971480caeDake Gu        mNumRows = numColumns;
56577b17ebed6d1f8488b150b25e2b6754971480caeDake Gu        boolean[] focusable = new boolean[numItems];
56677b17ebed6d1f8488b150b25e2b6754971480caeDake Gu        for (int i = 0; i < focusable.length; i++) {
56777b17ebed6d1f8488b150b25e2b6754971480caeDake Gu            focusable[i] = true;
56877b17ebed6d1f8488b150b25e2b6754971480caeDake Gu        }
56977b17ebed6d1f8488b150b25e2b6754971480caeDake Gu        for (int i = startPos + mNumRows, j = 0; j < skips; i += mNumRows, j++) {
57077b17ebed6d1f8488b150b25e2b6754971480caeDake Gu            focusable[i] = false;
57177b17ebed6d1f8488b150b25e2b6754971480caeDake Gu        }
57277b17ebed6d1f8488b150b25e2b6754971480caeDake Gu        intent.putExtra(GridActivity.EXTRA_ITEMS_FOCUSABLE, focusable);
5738c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        initActivity(intent);
57477b17ebed6d1f8488b150b25e2b6754971480caeDake Gu
57577b17ebed6d1f8488b150b25e2b6754971480caeDake Gu        mGridView.setSelectedPositionSmooth(startPos);
57677b17ebed6d1f8488b150b25e2b6754971480caeDake Gu        waitForScrollIdle(mVerifyLayout);
57777b17ebed6d1f8488b150b25e2b6754971480caeDake Gu
57877b17ebed6d1f8488b150b25e2b6754971480caeDake Gu        if (mGridView.getLayoutDirection() == ViewGroup.LAYOUT_DIRECTION_RTL) {
57977b17ebed6d1f8488b150b25e2b6754971480caeDake Gu            sendKeys(KeyEvent.KEYCODE_DPAD_LEFT);
58077b17ebed6d1f8488b150b25e2b6754971480caeDake Gu        } else {
58177b17ebed6d1f8488b150b25e2b6754971480caeDake Gu            sendKeys(KeyEvent.KEYCODE_DPAD_RIGHT);
58277b17ebed6d1f8488b150b25e2b6754971480caeDake Gu        }
58377b17ebed6d1f8488b150b25e2b6754971480caeDake Gu        waitForScrollIdle(mVerifyLayout);
58477b17ebed6d1f8488b150b25e2b6754971480caeDake Gu        assertEquals(endPos, mGridView.getSelectedPosition());
58577b17ebed6d1f8488b150b25e2b6754971480caeDake Gu
58677b17ebed6d1f8488b150b25e2b6754971480caeDake Gu        if (mGridView.getLayoutDirection() == ViewGroup.LAYOUT_DIRECTION_RTL) {
58777b17ebed6d1f8488b150b25e2b6754971480caeDake Gu            sendKeys(KeyEvent.KEYCODE_DPAD_RIGHT);
58877b17ebed6d1f8488b150b25e2b6754971480caeDake Gu        } else {
58977b17ebed6d1f8488b150b25e2b6754971480caeDake Gu            sendKeys(KeyEvent.KEYCODE_DPAD_LEFT);
59077b17ebed6d1f8488b150b25e2b6754971480caeDake Gu        }
59177b17ebed6d1f8488b150b25e2b6754971480caeDake Gu        waitForScrollIdle(mVerifyLayout);
59277b17ebed6d1f8488b150b25e2b6754971480caeDake Gu        assertEquals(startPos, mGridView.getSelectedPosition());
59377b17ebed6d1f8488b150b25e2b6754971480caeDake Gu
59477b17ebed6d1f8488b150b25e2b6754971480caeDake Gu    }
59577b17ebed6d1f8488b150b25e2b6754971480caeDake Gu
59677b17ebed6d1f8488b150b25e2b6754971480caeDake Gu
59777b17ebed6d1f8488b150b25e2b6754971480caeDake Gu    public void testNonFocusableVertical() throws Throwable {
59877b17ebed6d1f8488b150b25e2b6754971480caeDake Gu        final int numItems = 200;
59977b17ebed6d1f8488b150b25e2b6754971480caeDake Gu        final int startPos = 44;
60077b17ebed6d1f8488b150b25e2b6754971480caeDake Gu        final int skips = 20;
60177b17ebed6d1f8488b150b25e2b6754971480caeDake Gu        final int numColumns = 3;
60277b17ebed6d1f8488b150b25e2b6754971480caeDake Gu        final int endPos = startPos + numColumns * (skips + 1);
60377b17ebed6d1f8488b150b25e2b6754971480caeDake Gu
60477b17ebed6d1f8488b150b25e2b6754971480caeDake Gu        mInstrumentation = getInstrumentation();
60577b17ebed6d1f8488b150b25e2b6754971480caeDake Gu        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
60677b17ebed6d1f8488b150b25e2b6754971480caeDake Gu        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
60777b17ebed6d1f8488b150b25e2b6754971480caeDake Gu                R.layout.vertical_grid);
60877b17ebed6d1f8488b150b25e2b6754971480caeDake Gu        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, numItems);
60977b17ebed6d1f8488b150b25e2b6754971480caeDake Gu        intent.putExtra(GridActivity.EXTRA_STAGGERED, false);
61077b17ebed6d1f8488b150b25e2b6754971480caeDake Gu        mOrientation = BaseGridView.VERTICAL;
61177b17ebed6d1f8488b150b25e2b6754971480caeDake Gu        mNumRows = numColumns;
61277b17ebed6d1f8488b150b25e2b6754971480caeDake Gu        boolean[] focusable = new boolean[numItems];
61377b17ebed6d1f8488b150b25e2b6754971480caeDake Gu        for (int i = 0; i < focusable.length; i++) {
61477b17ebed6d1f8488b150b25e2b6754971480caeDake Gu            focusable[i] = true;
61577b17ebed6d1f8488b150b25e2b6754971480caeDake Gu        }
61677b17ebed6d1f8488b150b25e2b6754971480caeDake Gu        for (int i = startPos + mNumRows, j = 0; j < skips; i += mNumRows, j++) {
61777b17ebed6d1f8488b150b25e2b6754971480caeDake Gu            focusable[i] = false;
61877b17ebed6d1f8488b150b25e2b6754971480caeDake Gu        }
61977b17ebed6d1f8488b150b25e2b6754971480caeDake Gu        intent.putExtra(GridActivity.EXTRA_ITEMS_FOCUSABLE, focusable);
6208c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        initActivity(intent);
62177b17ebed6d1f8488b150b25e2b6754971480caeDake Gu
62277b17ebed6d1f8488b150b25e2b6754971480caeDake Gu        mGridView.setSelectedPositionSmooth(startPos);
62377b17ebed6d1f8488b150b25e2b6754971480caeDake Gu        waitForScrollIdle(mVerifyLayout);
62477b17ebed6d1f8488b150b25e2b6754971480caeDake Gu
62577b17ebed6d1f8488b150b25e2b6754971480caeDake Gu        sendKeys(KeyEvent.KEYCODE_DPAD_DOWN);
62677b17ebed6d1f8488b150b25e2b6754971480caeDake Gu        waitForScrollIdle(mVerifyLayout);
62777b17ebed6d1f8488b150b25e2b6754971480caeDake Gu        assertEquals(endPos, mGridView.getSelectedPosition());
62877b17ebed6d1f8488b150b25e2b6754971480caeDake Gu
62977b17ebed6d1f8488b150b25e2b6754971480caeDake Gu        sendKeys(KeyEvent.KEYCODE_DPAD_UP);
63077b17ebed6d1f8488b150b25e2b6754971480caeDake Gu        waitForScrollIdle(mVerifyLayout);
63177b17ebed6d1f8488b150b25e2b6754971480caeDake Gu        assertEquals(startPos, mGridView.getSelectedPosition());
63277b17ebed6d1f8488b150b25e2b6754971480caeDake Gu
63377b17ebed6d1f8488b150b25e2b6754971480caeDake Gu    }
6346b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu
6356b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu    public void testTransferFocusable() throws Throwable {
6366b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu        final int numItems = 200;
6376b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu        final int numColumns = 3;
6386b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu        final int startPos = 1;
6396b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu
6406b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu        mInstrumentation = getInstrumentation();
6416b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
6426b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
6436b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu                R.layout.horizontal_grid);
6446b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, numItems);
6456b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu        intent.putExtra(GridActivity.EXTRA_STAGGERED, false);
6466b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu        mOrientation = BaseGridView.HORIZONTAL;
6476b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu        mNumRows = numColumns;
6486b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu        boolean[] focusable = new boolean[numItems];
6496b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu        for (int i = 0; i < focusable.length; i++) {
6506b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu            focusable[i] = true;
6516b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu        }
6526b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu        for (int i = 0; i < startPos; i++) {
6536b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu            focusable[i] = false;
6546b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu        }
6556b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu        intent.putExtra(GridActivity.EXTRA_ITEMS_FOCUSABLE, focusable);
6568c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        initActivity(intent);
6576b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu
6586b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu        runTestOnUiThread(new Runnable() {
6596b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu            public void run() {
6606b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu                mActivity.changeArraySize(0);
6616b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu            }
6626b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu        });
6636b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu        Thread.sleep(500);
6646b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu        assertTrue(mGridView.isFocused());
6656b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu
6666b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu        runTestOnUiThread(new Runnable() {
6676b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu            public void run() {
6686b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu                mActivity.changeArraySize(numItems);
6696b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu            }
6706b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu        });
6716b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu        Thread.sleep(500);
6726b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu        assertTrue(mGridView.getLayoutManager().findViewByPosition(startPos).hasFocus());
6736b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu    }
6746b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu
6756b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu    public void testTransferFocusable2() throws Throwable {
6766b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu        final int numItems = 200;
6776b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu        final int numColumns = 3;
6786b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu        final int startPos = 10;
6796b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu
6806b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu        mInstrumentation = getInstrumentation();
6816b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
6826b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
6836b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu                R.layout.horizontal_grid);
6846b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, numItems);
6856b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu        intent.putExtra(GridActivity.EXTRA_STAGGERED, true);
6866b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu        mOrientation = BaseGridView.HORIZONTAL;
6876b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu        mNumRows = numColumns;
6886b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu        boolean[] focusable = new boolean[numItems];
6896b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu        for (int i = 0; i < focusable.length; i++) {
6906b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu            focusable[i] = true;
6916b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu        }
6926b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu        for (int i = 0; i < startPos; i++) {
6936b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu            focusable[i] = false;
6946b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu        }
6956b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu        intent.putExtra(GridActivity.EXTRA_ITEMS_FOCUSABLE, focusable);
6968c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        initActivity(intent);
6976b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu
6986b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu        runTestOnUiThread(new Runnable() {
6996b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu            public void run() {
7006b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu                mActivity.changeArraySize(0);
7016b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu            }
7026b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu        });
7036b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu        Thread.sleep(500);
7046b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu        assertTrue(mGridView.isFocused());
7056b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu
7066b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu        runTestOnUiThread(new Runnable() {
7076b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu            public void run() {
7086b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu                mActivity.changeArraySize(numItems);
7096b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu            }
7106b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu        });
7116b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu        Thread.sleep(500);
7126b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu        assertTrue(mGridView.getLayoutManager().findViewByPosition(startPos).hasFocus());
7136b22c4c875d7a540e705b2b6b65bf52c7a89299aDake Gu    }
714fa5f60106a84a2b475c38cc6b8baa347bbd6ae1dDake Gu
7158c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu    public void testNonFocusableLoseInFastLayout() throws Throwable {
716fa5f60106a84a2b475c38cc6b8baa347bbd6ae1dDake Gu        mInstrumentation = getInstrumentation();
717fa5f60106a84a2b475c38cc6b8baa347bbd6ae1dDake Gu        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
718fa5f60106a84a2b475c38cc6b8baa347bbd6ae1dDake Gu        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
719fa5f60106a84a2b475c38cc6b8baa347bbd6ae1dDake Gu                R.layout.vertical_linear);
720fa5f60106a84a2b475c38cc6b8baa347bbd6ae1dDake Gu        int[] items = new int[300];
721fa5f60106a84a2b475c38cc6b8baa347bbd6ae1dDake Gu        for (int i = 0; i < items.length; i++) {
722fa5f60106a84a2b475c38cc6b8baa347bbd6ae1dDake Gu            items[i] = 480;
723fa5f60106a84a2b475c38cc6b8baa347bbd6ae1dDake Gu        }
724fa5f60106a84a2b475c38cc6b8baa347bbd6ae1dDake Gu        intent.putExtra(GridActivity.EXTRA_ITEMS, items);
725fa5f60106a84a2b475c38cc6b8baa347bbd6ae1dDake Gu        intent.putExtra(GridActivity.EXTRA_STAGGERED, false);
726fa5f60106a84a2b475c38cc6b8baa347bbd6ae1dDake Gu        intent.putExtra(GridActivity.EXTRA_REQUEST_LAYOUT_ONFOCUS, true);
727fa5f60106a84a2b475c38cc6b8baa347bbd6ae1dDake Gu        mOrientation = BaseGridView.VERTICAL;
728fa5f60106a84a2b475c38cc6b8baa347bbd6ae1dDake Gu        mNumRows = 1;
729fa5f60106a84a2b475c38cc6b8baa347bbd6ae1dDake Gu        int pressDown = 15;
730fa5f60106a84a2b475c38cc6b8baa347bbd6ae1dDake Gu
7318c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        initActivity(intent);
732fa5f60106a84a2b475c38cc6b8baa347bbd6ae1dDake Gu
733fa5f60106a84a2b475c38cc6b8baa347bbd6ae1dDake Gu        mGridView.setSelectedPositionSmooth(0);
734fa5f60106a84a2b475c38cc6b8baa347bbd6ae1dDake Gu        Thread.sleep(100);
735fa5f60106a84a2b475c38cc6b8baa347bbd6ae1dDake Gu
736fa5f60106a84a2b475c38cc6b8baa347bbd6ae1dDake Gu        for (int i = 0; i < pressDown; i++) {
737fa5f60106a84a2b475c38cc6b8baa347bbd6ae1dDake Gu            sendKeys(KeyEvent.KEYCODE_DPAD_DOWN);
738fa5f60106a84a2b475c38cc6b8baa347bbd6ae1dDake Gu        }
739fa5f60106a84a2b475c38cc6b8baa347bbd6ae1dDake Gu        waitForScrollIdle(mVerifyLayout);
740fa5f60106a84a2b475c38cc6b8baa347bbd6ae1dDake Gu        assertFalse(mGridView.isFocused());
741fa5f60106a84a2b475c38cc6b8baa347bbd6ae1dDake Gu
742fa5f60106a84a2b475c38cc6b8baa347bbd6ae1dDake Gu    }
743fa5f60106a84a2b475c38cc6b8baa347bbd6ae1dDake Gu
7448c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu    public void testSetSelectionWithDelta() throws Throwable {
7458c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        mInstrumentation = getInstrumentation();
7468c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
7478c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
7488c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu                R.layout.vertical_linear);
7498c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 300);
7508c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        intent.putExtra(GridActivity.EXTRA_STAGGERED, false);
7518c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        mOrientation = BaseGridView.VERTICAL;
7528c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        mNumRows = 1;
7538c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu
7548c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        initActivity(intent);
7558c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu
7568c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        runTestOnUiThread(new Runnable() {
7578c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu            public void run() {
7588c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu                mGridView.setSelectedPositionSmooth(3);
7598c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu            }
7608c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        });
7618c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        waitForScrollIdle(mVerifyLayout);
7628c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        int top1 = mGridView.getLayoutManager().findViewByPosition(3).getTop();
7638c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu
7648c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        Thread.sleep(1000);
7658c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu
7668c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        // scroll to position with delta
7678c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        runTestOnUiThread(new Runnable() {
7688c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu            public void run() {
7698c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu                mGridView.setSelectedPosition(3, 100);
7708c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu            }
7718c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        });
7728c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        Thread.sleep(1000);
7738c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        int top2 = mGridView.getLayoutManager().findViewByPosition(3).getTop();
7748c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        assertEquals(top1 - 100, top2);
7758c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu
7768c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        // scroll to same position without delta, it will be reset
7778c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        runTestOnUiThread(new Runnable() {
7788c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu            public void run() {
7798c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu                mGridView.setSelectedPosition(3, 0);
7808c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu            }
7818c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        });
7828c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        Thread.sleep(1000);
7838c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        int top3 = mGridView.getLayoutManager().findViewByPosition(3).getTop();
7848c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        assertEquals(top1, top3);
7858c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu
7868c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        // scroll invisible item after last visible item
7878c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        final int lastVisiblePos = ((GridLayoutManager)mGridView.getLayoutManager())
7888c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu                .mGrid.getLastVisibleIndex();
7898c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        runTestOnUiThread(new Runnable() {
7908c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu            public void run() {
7918c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu                mGridView.setSelectedPosition(lastVisiblePos + 1, 100);
7928c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu            }
7938c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        });
7948c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        Thread.sleep(1000);
7958c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        int top4 = mGridView.getLayoutManager().findViewByPosition(lastVisiblePos + 1).getTop();
7968c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        assertEquals(top1 - 100, top4);
7978c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu
7988c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        // scroll invisible item before first visible item
7998c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        final int firstVisiblePos = ((GridLayoutManager)mGridView.getLayoutManager())
8008c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu                .mGrid.getFirstVisibleIndex();
8018c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        runTestOnUiThread(new Runnable() {
8028c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu            public void run() {
8038c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu                mGridView.setSelectedPosition(firstVisiblePos - 1, 100);
8048c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu            }
8058c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        });
8068c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        Thread.sleep(1000);
8078c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        int top5 = mGridView.getLayoutManager().findViewByPosition(firstVisiblePos - 1).getTop();
8088c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        assertEquals(top1 - 100, top5);
8098c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu
8108c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        // scroll to invisible item that is far away.
8118c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        runTestOnUiThread(new Runnable() {
8128c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu            public void run() {
8138c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu                mGridView.setSelectedPosition(50, 100);
8148c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu            }
8158c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        });
8168c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        Thread.sleep(1000);
8178c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        int top6 = mGridView.getLayoutManager().findViewByPosition(50).getTop();
8188c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        assertEquals(top1 - 100, top6);
8198c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu
8208c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        // scroll to invisible item that is far away.
8218c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        runTestOnUiThread(new Runnable() {
8228c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu            public void run() {
8238c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu                mGridView.setSelectedPositionSmooth(100);
8248c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu            }
8258c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        });
8268c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        waitForScrollIdle(mVerifyLayout);
8278c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        int top7 = mGridView.getLayoutManager().findViewByPosition(100).getTop();
8288c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        assertEquals(top1, top7);
8298c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu
8308c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        // scroll to invisible item that is far away.
8318c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        runTestOnUiThread(new Runnable() {
8328c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu            public void run() {
8338c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu                mGridView.setSelectedPosition(10, 50);
8348c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu            }
8358c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        });
8368c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        Thread.sleep(1000);
8378c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        int top8 = mGridView.getLayoutManager().findViewByPosition(10).getTop();
8388c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        assertEquals(top1 - 50, top8);
8398c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu    }
8408c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu
8418c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu    public void testSetSelectionWithDeltaInGrid() throws Throwable {
8428c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        mInstrumentation = getInstrumentation();
8438c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
8448c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
8458c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu                R.layout.vertical_grid);
8468c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 500);
8478c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        intent.putExtra(GridActivity.EXTRA_STAGGERED, true);
8488c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        mOrientation = BaseGridView.VERTICAL;
8498c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        mNumRows = 3;
8508c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu
8518c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        initActivity(intent);
8528c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu
8538c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        runTestOnUiThread(new Runnable() {
8548c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu            public void run() {
8558c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu                mGridView.setSelectedPositionSmooth(10);
8568c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu            }
8578c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        });
8588c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        waitForScrollIdle(mVerifyLayout);
8598c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        int top1 = getCenterY(mGridView.getLayoutManager().findViewByPosition(10));
8608c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu
8618c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        Thread.sleep(500);
8628c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu
8638c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        // scroll to position with delta
8648c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        runTestOnUiThread(new Runnable() {
8658c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu            public void run() {
8668c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu                mGridView.setSelectedPosition(20, 100);
8678c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu            }
8688c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        });
8698c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        Thread.sleep(500);
8708c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        int top2 = getCenterY(mGridView.getLayoutManager().findViewByPosition(20));
8718c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        assertEquals(top1 - 100, top2);
8728c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu
8738c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        // scroll to same position without delta, it will be reset
8748c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        runTestOnUiThread(new Runnable() {
8758c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu            public void run() {
8768c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu                mGridView.setSelectedPosition(20, 0);
8778c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu            }
8788c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        });
8798c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        Thread.sleep(500);
8808c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        int top3 = getCenterY(mGridView.getLayoutManager().findViewByPosition(20));
8818c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        assertEquals(top1, top3);
8828c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu
8838c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        // scroll invisible item after last visible item
8848c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        final int lastVisiblePos = ((GridLayoutManager)mGridView.getLayoutManager())
8858c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu                .mGrid.getLastVisibleIndex();
8868c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        runTestOnUiThread(new Runnable() {
8878c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu            public void run() {
8888c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu                mGridView.setSelectedPosition(lastVisiblePos + 1, 100);
8898c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu            }
8908c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        });
8918c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        Thread.sleep(500);
8928c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        int top4 = getCenterY(mGridView.getLayoutManager().findViewByPosition(lastVisiblePos + 1));
8938c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        verifyMargin();
8948c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        assertEquals(top1 - 100, top4);
8958c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu
8968c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        // scroll invisible item before first visible item
8978c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        final int firstVisiblePos = ((GridLayoutManager)mGridView.getLayoutManager())
8988c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu                .mGrid.getFirstVisibleIndex();
8998c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        runTestOnUiThread(new Runnable() {
9008c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu            public void run() {
9018c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu                mGridView.setSelectedPosition(firstVisiblePos - 1, 100);
9028c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu            }
9038c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        });
9048c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        Thread.sleep(500);
9058c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        int top5 = getCenterY(mGridView.getLayoutManager().findViewByPosition(firstVisiblePos - 1));
9068c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        assertEquals(top1 - 100, top5);
9078c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu
9088c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        // scroll to invisible item that is far away.
9098c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        runTestOnUiThread(new Runnable() {
9108c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu            public void run() {
9118c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu                mGridView.setSelectedPosition(100, 100);
9128c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu            }
9138c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        });
9148c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        Thread.sleep(500);
9158c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        int top6 = getCenterY(mGridView.getLayoutManager().findViewByPosition(100));
9168c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        assertEquals(top1 - 100, top6);
9178c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu
9188c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        // scroll to invisible item that is far away.
9198c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        runTestOnUiThread(new Runnable() {
9208c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu            public void run() {
9218c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu                mGridView.setSelectedPositionSmooth(200);
9228c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu            }
9238c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        });
9248c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        waitForScrollIdle(mVerifyLayout);
9258c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        Thread.sleep(500);
9268c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        int top7 = getCenterY(mGridView.getLayoutManager().findViewByPosition(200));
9278c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        assertEquals(top1, top7);
9288c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu
9298c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        // scroll to invisible item that is far away.
9308c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        runTestOnUiThread(new Runnable() {
9318c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu            public void run() {
9328c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu                mGridView.setSelectedPosition(10, 50);
9338c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu            }
9348c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        });
9358c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        Thread.sleep(500);
9368c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        int top8 = getCenterY(mGridView.getLayoutManager().findViewByPosition(10));
9378c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        assertEquals(top1 - 50, top8);
9388c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu    }
9398c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu
9408c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu
9418c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu    public void testSetSelectionWithDeltaInGrid1() throws Throwable {
9428c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        mInstrumentation = getInstrumentation();
9438c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
9448c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
9458c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu                R.layout.vertical_grid);
9468c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        intent.putExtra(GridActivity.EXTRA_ITEMS, new int[]{
9478c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu                193,176,153,141,203,184,232,139,177,206,222,136,132,237,172,137,
9488c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu                188,172,163,213,158,219,209,147,133,229,170,197,138,215,188,205,
9498c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu                223,192,225,170,195,127,229,229,210,195,134,142,160,139,130,222,
9508c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu                150,163,180,176,157,137,234,169,159,167,182,150,224,231,202,236,
9518c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu                123,140,181,223,120,185,183,221,123,210,134,158,166,208,149,128,
9528c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu                192,214,212,198,133,140,158,133,229,173,226,141,180,128,127,218,
9538c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu                192,235,183,213,216,150,143,193,125,141,219,210,195,195,192,191,
9548c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu                212,236,157,189,160,220,147,158,220,199,233,231,201,180,168,141,
9558c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu                156,204,191,183,190,153,123,210,238,151,139,221,223,200,175,191,
9568c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu                132,184,197,204,236,157,230,151,195,219,212,143,172,149,219,184,
9578c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu                164,211,132,187,172,142,174,146,127,147,206,238,188,129,199,226,
9588c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu                132,220,210,159,235,153,208,182,196,123,180,159,131,135,175,226,
9598c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu                127,134,237,211,133,225,132,124,160,226,224,200,173,137,217,169,
9608c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu                182,183,176,185,122,168,195,159,172,129,126,129,166,136,149,220,
9618c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu                178,191,192,238,180,208,234,154,222,206,239,228,129,140,203,125,
9628c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu                214,175,125,169,196,132,234,138,192,142,234,190,215,232,239,122,
9638c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu                188,158,128,221,159,237,207,157,232,138,132,214,122,199,121,191,
9648c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu                199,209,126,164,175,187,173,186,194,224,191,196,146,208,213,210,
9658c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu                164,176,202,213,123,157,179,138,217,129,186,166,237,211,157,130,
9668c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu                137,132,171,232,216,239,180,151,137,132,190,133,218,155,171,227,
9678c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu                193,147,197,164,120,218,193,154,170,196,138,222,161,235,143,154,
9688c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu                192,178,228,195,178,133,203,178,173,206,178,212,136,157,169,124,
9698c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu                172,121,128,223,238,125,217,187,184,156,169,215,231,124,210,174,
9708c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu                146,226,185,134,223,228,183,182,136,133,199,146,180,233,226,225,
9718c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu                174,233,145,235,216,170,192,171,132,132,134,223,233,148,154,162,
9728c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu                192,179,197,203,139,197,174,187,135,132,180,136,192,195,124,221,
9738c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu                120,189,233,233,146,225,234,163,215,143,132,198,156,205,151,190,
9748c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu                204,239,221,229,123,138,134,217,219,136,218,215,167,139,195,125,
9758c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu                202,225,178,226,145,208,130,194,228,197,157,215,124,147,174,123,
9768c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu                237,140,172,181,161,151,229,216,199,199,179,213,146,122,222,162,
9778c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu                139,173,165,150,160,217,207,137,165,175,129,158,134,133,178,199,
9788c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu                215,213,122,197
9798c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        });
9808c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        intent.putExtra(GridActivity.EXTRA_STAGGERED, true);
9818c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        mOrientation = BaseGridView.VERTICAL;
9828c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        mNumRows = 3;
9838c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu
9848c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        initActivity(intent);
9858c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu
9868c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        runTestOnUiThread(new Runnable() {
9878c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu            public void run() {
9888c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu                mGridView.setSelectedPositionSmooth(10);
9898c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu            }
9908c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        });
9918c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        waitForScrollIdle(mVerifyLayout);
9928c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        int top1 = getCenterY(mGridView.getLayoutManager().findViewByPosition(10));
9938c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu
9948c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        Thread.sleep(500);
9958c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu
9968c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        // scroll to position with delta
9978c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        runTestOnUiThread(new Runnable() {
9988c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu            public void run() {
9998c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu                mGridView.setSelectedPosition(20, 100);
10008c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu            }
10018c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        });
10028c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        Thread.sleep(500);
10038c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        int top2 = getCenterY(mGridView.getLayoutManager().findViewByPosition(20));
10048c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        assertEquals(top1 - 100, top2);
10058c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu
10068c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        // scroll to same position without delta, it will be reset
10078c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        runTestOnUiThread(new Runnable() {
10088c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu            public void run() {
10098c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu                mGridView.setSelectedPosition(20, 0);
10108c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu            }
10118c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        });
10128c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        Thread.sleep(500);
10138c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        int top3 = getCenterY(mGridView.getLayoutManager().findViewByPosition(20));
10148c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        assertEquals(top1, top3);
10158c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu
10168c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        // scroll invisible item after last visible item
10178c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        final int lastVisiblePos = ((GridLayoutManager)mGridView.getLayoutManager())
10188c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu                .mGrid.getLastVisibleIndex();
10198c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        runTestOnUiThread(new Runnable() {
10208c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu            public void run() {
10218c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu                mGridView.setSelectedPosition(lastVisiblePos + 1, 100);
10228c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu            }
10238c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        });
10248c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        Thread.sleep(500);
10258c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        int top4 = getCenterY(mGridView.getLayoutManager().findViewByPosition(lastVisiblePos + 1));
10268c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        verifyMargin();
10278c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        assertEquals(top1 - 100, top4);
10288c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu
10298c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        // scroll invisible item before first visible item
10308c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        final int firstVisiblePos = ((GridLayoutManager)mGridView.getLayoutManager())
10318c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu                .mGrid.getFirstVisibleIndex();
10328c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        runTestOnUiThread(new Runnable() {
10338c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu            public void run() {
10348c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu                mGridView.setSelectedPosition(firstVisiblePos - 1, 100);
10358c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu            }
10368c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        });
10378c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        Thread.sleep(500);
10388c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        int top5 = getCenterY(mGridView.getLayoutManager().findViewByPosition(firstVisiblePos - 1));
10398c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        assertEquals(top1 - 100, top5);
10408c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu
10418c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        // scroll to invisible item that is far away.
10428c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        runTestOnUiThread(new Runnable() {
10438c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu            public void run() {
10448c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu                mGridView.setSelectedPosition(100, 100);
10458c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu            }
10468c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        });
10478c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        Thread.sleep(500);
10488c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        int top6 = getCenterY(mGridView.getLayoutManager().findViewByPosition(100));
10498c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        assertEquals(top1 - 100, top6);
10508c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu
10518c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        // scroll to invisible item that is far away.
10528c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        runTestOnUiThread(new Runnable() {
10538c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu            public void run() {
10548c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu                mGridView.setSelectedPositionSmooth(200);
10558c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu            }
10568c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        });
10578c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        waitForScrollIdle(mVerifyLayout);
10588c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        Thread.sleep(500);
10598c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        int top7 = getCenterY(mGridView.getLayoutManager().findViewByPosition(200));
10608c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        assertEquals(top1, top7);
10618c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu
10628c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        // scroll to invisible item that is far away.
10638c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        runTestOnUiThread(new Runnable() {
10648c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu            public void run() {
10658c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu                mGridView.setSelectedPosition(10, 50);
10668c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu            }
10678c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        });
10688c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        Thread.sleep(500);
10698c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        int top8 = getCenterY(mGridView.getLayoutManager().findViewByPosition(10));
10708c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu        assertEquals(top1 - 50, top8);
10718c5d3b45f6afa838e64e4cf011a385c191d557c6Dake Gu    }
1072062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu}
1073