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