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