RowsFragmentTest.java revision ea89ed4fd190e0b2a0fe595f2172bc649af67bf7
1/*
2 * Copyright (C) 2016 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 */
16package android.support.v17.leanback.app;
17
18import static org.junit.Assert.assertEquals;
19import static org.junit.Assert.assertNotNull;
20import static org.junit.Assert.assertTrue;
21
22import android.graphics.Rect;
23import android.os.Bundle;
24import android.os.Handler;
25import android.os.SystemClock;
26import android.support.test.InstrumentationRegistry;
27import android.support.test.filters.MediumTest;
28import android.support.test.runner.AndroidJUnit4;
29import android.support.v17.leanback.testutils.PollingCheck;
30import android.support.v17.leanback.widget.ArrayObjectAdapter;
31import android.support.v17.leanback.widget.HeaderItem;
32import android.support.v17.leanback.widget.ListRow;
33import android.support.v17.leanback.widget.ListRowPresenter;
34import android.support.v17.leanback.widget.VerticalGridView;
35import android.view.KeyEvent;
36import android.view.View;
37
38import org.junit.Test;
39import org.junit.runner.RunWith;
40
41import java.lang.ref.WeakReference;
42
43@MediumTest
44@RunWith(AndroidJUnit4.class)
45public class RowsFragmentTest extends SingleFragmentTestBase {
46
47    static final StringPresenter sCardPresenter = new StringPresenter();
48
49    static void loadData(ArrayObjectAdapter adapter, int numRows, int repeatPerRow) {
50        for (int i = 0; i < numRows; ++i) {
51            ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(sCardPresenter);
52            int index = 0;
53            for (int j = 0; j < repeatPerRow; ++j) {
54                listRowAdapter.add("Hello world-" + (index++));
55                listRowAdapter.add("This is a test-" + (index++));
56                listRowAdapter.add("Android TV-" + (index++));
57                listRowAdapter.add("Leanback-" + (index++));
58                listRowAdapter.add("Hello world-" + (index++));
59                listRowAdapter.add("Android TV-" + (index++));
60                listRowAdapter.add("Leanback-" + (index++));
61                listRowAdapter.add("GuidedStepFragment-" + (index++));
62            }
63            HeaderItem header = new HeaderItem(i, "Row " + i);
64            adapter.add(new ListRow(header, listRowAdapter));
65        }
66    }
67
68    public static class F_defaultAlignment extends RowsFragment {
69        @Override
70        public void onCreate(Bundle savedInstanceState) {
71            super.onCreate(savedInstanceState);
72            ListRowPresenter lrp = new ListRowPresenter();
73            ArrayObjectAdapter adapter = new ArrayObjectAdapter(lrp);
74            setAdapter(adapter);
75            loadData(adapter, 10, 1);
76        }
77    }
78
79    @Test
80    public void defaultAlignment() throws InterruptedException {
81        launchAndWaitActivity(1000);
82
83        final Rect rect = new Rect();
84
85        final VerticalGridView gridView = ((RowsFragment) mActivity.getTestFragment())
86                .getVerticalGridView();
87        View row0 = gridView.findViewHolderForAdapterPosition(0).itemView;
88        rect.set(0, 0, row0.getWidth(), row0.getHeight());
89        gridView.offsetDescendantRectToMyCoords(row0, rect);
90        assertEquals("First row is initially aligned to top of screen", 0, rect.top);
91
92        sendKeys(KeyEvent.KEYCODE_DPAD_DOWN);
93        View row1 = gridView.findViewHolderForAdapterPosition(1).itemView;
94        PollingCheck.waitFor(new PollingCheck.ViewStableOnScreen(row1));
95
96        rect.set(0, 0, row1.getWidth(), row1.getHeight());
97        gridView.offsetDescendantRectToMyCoords(row1, rect);
98        assertTrue("Second row should not be aligned to top of screen", rect.top > 0);
99    }
100
101    public static class F_selectBeforeSetAdapter extends RowsFragment {
102        @Override
103        public void onCreate(Bundle savedInstanceState) {
104            super.onCreate(savedInstanceState);
105            setSelectedPosition(7, false);
106            new Handler().postDelayed(new Runnable() {
107                @Override
108                public void run() {
109                    ListRowPresenter lrp = new ListRowPresenter();
110                    ArrayObjectAdapter adapter = new ArrayObjectAdapter(lrp);
111                    setAdapter(adapter);
112                    loadData(adapter, 10, 1);
113                }
114            }, 1000);
115        }
116    }
117
118    @Test
119    public void selectBeforeSetAdapter() throws InterruptedException {
120        launchAndWaitActivity(2000);
121
122        final VerticalGridView gridView = ((RowsFragment) mActivity.getTestFragment())
123                .getVerticalGridView();
124        assertEquals(7, gridView.getSelectedPosition());
125        assertNotNull(gridView.findViewHolderForAdapterPosition(7));
126    }
127
128    public static class F_selectBeforeAddData extends RowsFragment {
129        @Override
130        public void onCreate(Bundle savedInstanceState) {
131            super.onCreate(savedInstanceState);
132            ListRowPresenter lrp = new ListRowPresenter();
133            final ArrayObjectAdapter adapter = new ArrayObjectAdapter(lrp);
134            setAdapter(adapter);
135            setSelectedPosition(7, false);
136            new Handler().postDelayed(new Runnable() {
137                @Override
138                public void run() {
139                    loadData(adapter, 10, 1);
140                }
141            }, 1000);
142        }
143    }
144
145    @Test
146    public void selectBeforeAddData() throws InterruptedException {
147        launchAndWaitActivity(2000);
148
149        final VerticalGridView gridView = ((RowsFragment) mActivity.getTestFragment())
150                .getVerticalGridView();
151        assertEquals(7, gridView.getSelectedPosition());
152        assertNotNull(gridView.findViewHolderForAdapterPosition(7));
153    }
154
155    public static class F_selectAfterAddData extends RowsFragment {
156        @Override
157        public void onCreate(Bundle savedInstanceState) {
158            super.onCreate(savedInstanceState);
159            ListRowPresenter lrp = new ListRowPresenter();
160            final ArrayObjectAdapter adapter = new ArrayObjectAdapter(lrp);
161            setAdapter(adapter);
162            loadData(adapter, 10, 1);
163            new Handler().postDelayed(new Runnable() {
164                @Override
165                public void run() {
166                    setSelectedPosition(7, false);
167                }
168            }, 1000);
169        }
170    }
171
172    @Test
173    public void selectAfterAddData() throws InterruptedException {
174        launchAndWaitActivity(2000);
175
176        final VerticalGridView gridView = ((RowsFragment) mActivity.getTestFragment())
177                .getVerticalGridView();
178        assertEquals(7, gridView.getSelectedPosition());
179        assertNotNull(gridView.findViewHolderForAdapterPosition(7));
180    }
181
182    static WeakReference<F_restoreSelection> sLastF_restoreSelection;
183
184    public static class F_restoreSelection extends RowsFragment {
185        public F_restoreSelection() {
186            sLastF_restoreSelection = new WeakReference<F_restoreSelection>(this);
187        }
188
189        @Override
190        public void onCreate(Bundle savedInstanceState) {
191            super.onCreate(savedInstanceState);
192            ListRowPresenter lrp = new ListRowPresenter();
193            final ArrayObjectAdapter adapter = new ArrayObjectAdapter(lrp);
194            setAdapter(adapter);
195            loadData(adapter, 10, 1);
196            if (savedInstanceState == null) {
197                setSelectedPosition(7, false);
198            }
199        }
200    }
201
202    @Test
203    public void restoreSelection() {
204        launchAndWaitActivity(1000);
205
206        InstrumentationRegistry.getInstrumentation().runOnMainSync(
207                new Runnable() {
208                    public void run() {
209                        mActivity.recreate();
210                    }
211                }
212        );
213        SystemClock.sleep(1000);
214
215        // mActivity is invalid after recreate(), a new Activity instance is created
216        // but we could get Fragment from static variable.
217        RowsFragment fragment = sLastF_restoreSelection.get();
218        final VerticalGridView gridView = fragment.getVerticalGridView();
219        assertEquals(7, gridView.getSelectedPosition());
220        assertNotNull(gridView.findViewHolderForAdapterPosition(7));
221
222    }
223}
224