1/*
2 * Copyright (C) 2007 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package android.widget.gridview.touch;
18
19import android.content.Context;
20import android.test.ActivityInstrumentationTestCase;
21import android.test.suitebuilder.annotation.LargeTest;
22import android.test.suitebuilder.annotation.MediumTest;
23import android.test.TouchUtils;
24import android.view.Gravity;
25import android.view.View;
26import android.view.ViewConfiguration;
27import android.widget.GridView;
28
29import android.widget.gridview.GridVerticalSpacingStackFromBottom;
30
31public class GridTouchVerticalSpacingStackFromBottomTest extends ActivityInstrumentationTestCase<GridVerticalSpacingStackFromBottom> {
32    private GridVerticalSpacingStackFromBottom mActivity;
33    private GridView mGridView;
34    private ViewConfiguration mViewConfig;
35
36    public GridTouchVerticalSpacingStackFromBottomTest() {
37        super("com.android.frameworks.coretests", GridVerticalSpacingStackFromBottom.class);
38    }
39
40    @Override
41    protected void setUp() throws Exception {
42        super.setUp();
43
44        mActivity = getActivity();
45        mGridView = getActivity().getGridView();
46        final Context context = mActivity.getApplicationContext();
47        mViewConfig = ViewConfiguration.get(context);
48    }
49
50    @MediumTest
51    public void testPreconditions() {
52        assertNotNull(mActivity);
53        assertNotNull(mGridView);
54
55        // Last item should be selected
56        assertEquals(mGridView.getAdapter().getCount() - 1, mGridView.getSelectedItemPosition());
57
58    }
59
60    @MediumTest
61    public void testNoScroll() {
62        View firstChild = mGridView.getChildAt(0);
63        View lastChild = mGridView.getChildAt(mGridView.getChildCount() - 1);
64
65        int lastTop = lastChild.getTop();
66
67        TouchUtils.dragViewBy(this, firstChild, Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL, 0,
68                ViewConfiguration.getTouchSlop());
69
70        View newLastChild = mGridView.getChildAt(mGridView.getChildCount() - 1);
71
72        assertEquals("View scrolled too early", lastTop, newLastChild.getTop());
73        assertEquals("Wrong view in last position", mGridView.getAdapter().getCount() - 1,
74                newLastChild.getId());
75    }
76
77    // TODO: needs to be adjusted to pass on non-HVGA displays
78    // @LargeTest
79    public void testShortScroll() {
80        View firstChild = mGridView.getChildAt(0);
81        if (firstChild.getTop() < this.mGridView.getListPaddingTop()) {
82            firstChild = mGridView.getChildAt(1);
83        }
84
85        View lastChild = mGridView.getChildAt(mGridView.getChildCount() - 1);
86
87        int lastTop = lastChild.getTop();
88
89        TouchUtils.dragViewBy(this, firstChild, Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL, 0,
90                mViewConfig.getScaledTouchSlop() + 1 + 10);
91
92        View newLastChild = mGridView.getChildAt(mGridView.getChildCount() - 1);
93
94        assertEquals("View scrolled to wrong position", lastTop, newLastChild.getTop() - 10);
95        assertEquals("Wrong view in last position", mGridView.getAdapter().getCount() - 1,
96                newLastChild.getId());
97    }
98
99    // TODO: needs to be adjusted to pass on non-HVGA displays
100    // @LargeTest
101    public void testLongScroll() {
102        View firstChild = mGridView.getChildAt(0);
103        if (firstChild.getTop() < mGridView.getListPaddingTop()) {
104            firstChild = mGridView.getChildAt(1);
105        }
106
107        int firstTop = firstChild.getTop();
108
109        int distance = TouchUtils.dragViewBy(this, firstChild,
110                Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL, 0,
111                (int) (mActivity.getWindowManager().getDefaultDisplay().getHeight() * 0.75f));
112
113        assertEquals("View scrolled to wrong position", firstTop
114                + (distance - mViewConfig.getScaledTouchSlop() - 1), firstChild.getTop());
115    }
116
117    @LargeTest
118    public void testManyScrolls() {
119        int originalCount = mGridView.getChildCount();
120
121        View firstChild;
122        int firstId = Integer.MIN_VALUE;
123        int firstTop = Integer.MIN_VALUE;
124        int prevId;
125        int prevTop;
126        do {
127            prevId = firstId;
128            prevTop = firstTop;
129            TouchUtils.dragQuarterScreenDown(this);
130            assertTrue(String.format("Too many children created: %d expected no more than %d",
131                    mGridView.getChildCount(), originalCount + 4),
132                    mGridView.getChildCount() <= originalCount + 4);
133            firstChild = mGridView.getChildAt(0);
134            firstId = firstChild.getId();
135            firstTop = firstChild.getTop();
136        } while ((prevId != firstId) || (prevTop != firstTop));
137
138
139        firstChild = mGridView.getChildAt(0);
140        assertEquals("View scrolled to wrong position", 0, firstChild.getId());
141
142        firstId = Integer.MIN_VALUE;
143        firstTop = Integer.MIN_VALUE;
144        do {
145            prevId = firstId;
146            prevTop = firstTop;
147            TouchUtils.dragQuarterScreenUp(this);
148            assertTrue(String.format("Too many children created: %d expected no more than %d",
149                    mGridView.getChildCount(), originalCount + 4),
150                    mGridView.getChildCount() <= originalCount + 4);
151            firstChild = mGridView.getChildAt(0);
152            firstId = firstChild.getId();
153            firstTop = firstChild.getTop();
154        } while ((prevId != firstId) || (prevTop != firstTop));
155
156        View lastChild = mGridView.getChildAt(mGridView.getChildCount() - 1);
157        assertEquals("Grid is not scrolled to the bottom", mGridView.getAdapter().getCount() - 1,
158                lastChild.getId());
159    }
160}
161