19b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana/*
29b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana * Copyright (C) 2017 The Android Open Source Project
39b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana *
49b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana * Licensed under the Apache License, Version 2.0 (the "License");
59b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana * you may not use this file except in compliance with the License.
69b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana * You may obtain a copy of the License at
79b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana *
89b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana *      http://www.apache.org/licenses/LICENSE-2.0
99b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana *
109b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana * Unless required by applicable law or agreed to in writing, software
119b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana * distributed under the License is distributed on an "AS IS" BASIS,
129b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana * See the License for the specific language governing permissions and
149b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana * limitations under the License.
159b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana */
169b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana
179b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovanapackage androidx.car.widget;
189b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana
19c5bcb56b9b4ae59dd52acf07764a69c8d1216ec0Yao, Yuxingimport static org.hamcrest.Matchers.closeTo;
20172425512285f6da3c69b9405738df1f064336c1Yao, Yuxingimport static org.hamcrest.Matchers.greaterThan;
219b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovanaimport static org.hamcrest.Matchers.is;
22172425512285f6da3c69b9405738df1f064336c1Yao, Yuxingimport static org.hamcrest.core.IsNull.notNullValue;
239b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovanaimport static org.junit.Assert.assertEquals;
249b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovanaimport static org.junit.Assert.assertFalse;
259b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovanaimport static org.junit.Assert.assertThat;
269b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovanaimport static org.junit.Assert.assertTrue;
279b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana
289b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovanaimport android.content.pm.PackageManager;
299b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovanaimport android.support.test.InstrumentationRegistry;
309b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovanaimport android.support.test.filters.MediumTest;
319b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovanaimport android.support.test.rule.ActivityTestRule;
329b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovanaimport android.support.test.runner.AndroidJUnit4;
339b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovanaimport android.view.LayoutInflater;
349b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovanaimport android.view.View;
359b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovanaimport android.view.ViewGroup;
369b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovanaimport android.widget.TextView;
379b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana
3876dcad7e204288db0d0c1a50619054c8513336f4Anthony Chenimport androidx.car.test.R;
3976dcad7e204288db0d0c1a50619054c8513336f4Anthony Chenimport androidx.recyclerview.widget.RecyclerView;
4076dcad7e204288db0d0c1a50619054c8513336f4Anthony Chen
413737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxingimport org.junit.Assume;
429b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovanaimport org.junit.Before;
439b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovanaimport org.junit.Rule;
449b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovanaimport org.junit.Test;
459b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovanaimport org.junit.runner.RunWith;
469b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana
479b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovanaimport java.util.ArrayList;
489b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovanaimport java.util.Arrays;
499b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovanaimport java.util.List;
509b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana
519b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana/** Unit tests for implementations of {@link PagedListView.DividerVisibilityManager}. */
529b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana@RunWith(AndroidJUnit4.class)
539b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana@MediumTest
549b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovanapublic final class DividerVisibilityManagerTest {
559b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana
569b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana    /**
579b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana     * Used by {@link TestAdapter} to calculate ViewHolder height so N items appear in one page of
589b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana     * {@link PagedListView}. If you need to test behavior under multiple pages, set number of items
599b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana     * to ITEMS_PER_PAGE * desired_pages.
609b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana     * Actual value does not matter.
619b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana     */
629b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana    private static final int ITEMS_PER_PAGE = 10;
639b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana
649b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana    @Rule
659b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana    public ActivityTestRule<DividerVisibilityManagerTestActivity> mActivityRule =
669b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana            new ActivityTestRule<>(DividerVisibilityManagerTestActivity.class);
679b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana
689b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana    private DividerVisibilityManagerTestActivity mActivity;
699b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana    private PagedListView mPagedListView;
709b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana
719b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana    /** Returns {@code true} if the testing device has the automotive feature flag. */
729b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana    private boolean isAutoDevice() {
739b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana        PackageManager packageManager = mActivityRule.getActivity().getPackageManager();
749b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana        return packageManager.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE);
759b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana    }
769b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana
773737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing    @Before
783737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing    public void setUp() {
793737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing        Assume.assumeTrue(isAutoDevice());
803737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing
813737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing        mActivity = mActivityRule.getActivity();
823737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing        mPagedListView = mActivity.findViewById(R.id.paged_list_view_with_dividers);
833737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing    }
843737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing
859b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana    /** Sets up {@link #mPagedListView} with the given number of items. */
869b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana    private void setUpPagedListView(int itemCount) {
879b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana        try {
889b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana            mActivityRule.runOnUiThread(() -> {
899b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana                mPagedListView.setMaxPages(PagedListView.ItemCap.UNLIMITED);
909b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana                mPagedListView.setAdapter(
919b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana                        new TestAdapter(itemCount, mPagedListView.getMeasuredHeight()));
929b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana            });
939b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana        } catch (Throwable throwable) {
949b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana            throwable.printStackTrace();
959b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana            throw new RuntimeException(throwable);
969b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana        }
979b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana    }
989b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana
999b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana    @Test
1009b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana    public void setCustomDividerVisibilityManager() throws Throwable {
1019b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana        final int itemCount = 8;
1029b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana        setUpPagedListView(itemCount /* itemCount */);
1039b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana        RecyclerView.LayoutManager layoutManager =
1049b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana                mPagedListView.getRecyclerView().getLayoutManager();
1059b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana
1069b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana        // Fetch divider height.
1079b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana        final int dividerHeight = InstrumentationRegistry.getContext().getResources()
1089b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana                .getDimensionPixelSize(R.dimen.car_list_divider_height);
1099b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana
1109b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana
1119b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana        // Initially, dividers are present between each two items.
1129b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana        final View[] views = new View[itemCount];
1139b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana        mActivityRule.runOnUiThread(() -> {
1149b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana            for (int i = 0; i < layoutManager.getChildCount(); i++) {
1159b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana                views[i] = layoutManager.getChildAt(i);
1169b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana            }
1179b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana        });
1189b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana        for (int i = 0; i < itemCount - 1; i++) {
119c5bcb56b9b4ae59dd52acf07764a69c8d1216ec0Yao, Yuxing            assertThat((double) views[i + 1].getTop() - views[i].getBottom(),
120c5bcb56b9b4ae59dd52acf07764a69c8d1216ec0Yao, Yuxing                    is(closeTo(2 * (dividerHeight / 2), 1.0f)));
1219b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana        }
1229b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana
1239b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana
1249b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana        // Set DividerVisibilityManager on PagedListView.
1259b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana        final PagedListView.DividerVisibilityManager dvm = new TestDividerVisibilityManager();
1269b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana        mActivityRule.runOnUiThread(() -> {
1279b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana            mPagedListView.setDividerVisibilityManager(dvm);
1289b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana        });
1299b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana
1309b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana        mActivityRule.runOnUiThread(() -> {
1319b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana            for (int i = 0; i < layoutManager.getChildCount(); i++) {
1329b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana                views[i] = layoutManager.getChildAt(i);
1339b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana            }
1349b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana        });
1359b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana
1369b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana        for (int i = 0; i < itemCount - 1; i++) {
1379b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana            int distance = views[i + 1].getTop() - views[i].getBottom();
1389b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana            if (dvm.shouldHideDivider(i)) {
1399b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana                assertEquals(distance, 0);
1409b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana            } else {
141c5bcb56b9b4ae59dd52acf07764a69c8d1216ec0Yao, Yuxing                assertThat((double) distance, is(closeTo(2 * (dividerHeight / 2), 1.0f)));
1429b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana            }
1439b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana        }
1449b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana    }
1459b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana
1469b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana    @Test
1479b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana    public void testListItemAdapterAsVisibilityManager() {
148172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
149172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setHideDivider(true);
150172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
151172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item1 = new TextListItem(mActivity);
152172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item1.setHideDivider(false);
153172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
154172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item2 = new TextListItem(mActivity);
155172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item2.setHideDivider(true);
156172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
157172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item3 = new TextListItem(mActivity);
158172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item3.setHideDivider(true);
159172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
1609b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana        // Create and populate ListItemAdapter.
1619b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana        ListItemProvider provider = new ListItemProvider.ListProvider(Arrays.asList(
162172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing                item0, item1, item2, item3));
1639b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana
1649b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana        ListItemAdapter itemAdapter = new ListItemAdapter(mActivity, provider);
1659b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana        assertTrue(itemAdapter.shouldHideDivider(0));
1669b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana        assertFalse(itemAdapter.shouldHideDivider(1));
1679b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana        assertTrue(itemAdapter.shouldHideDivider(2));
1689b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana        assertTrue(itemAdapter.shouldHideDivider(3));
1699b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana    }
1709b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana
171172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing    @Test
172172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing    public void testSettingItemDividersHidden() throws Throwable {
173172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
174172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setHideDivider(true);
175172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
176172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item1 = new TextListItem(mActivity);
177172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
178172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        ListItemProvider provider = new ListItemProvider.ListProvider(Arrays.asList(item0, item1));
179172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        mActivityRule.runOnUiThread(() -> {
180172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing            mPagedListView.setAdapter(new ListItemAdapter(mActivity, provider));
181172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        });
182172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
183172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        assertThat(item0.shouldHideDivider(), is(true));
184172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        assertThat(item1.shouldHideDivider(), is(false));
185172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
186172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        // First verify hiding divider works.
187172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        PagedListView.DividerVisibilityManager dvm = (PagedListView.DividerVisibilityManager)
188172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing                mPagedListView.getAdapter();
189172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        assertThat(dvm, is(notNullValue()));
190172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        assertThat(dvm.shouldHideDivider(0), is(true));
191172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        assertThat(dvm.shouldHideDivider(1), is(false));
192172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
193172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        // Then verify we can show divider by checking the space between items reserved by
194172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        // divider decorator.
195172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setHideDivider(false);
196172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        mActivityRule.runOnUiThread(() -> {
197172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing            mPagedListView.getAdapter().notifyDataSetChanged();
198172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        });
199172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
200172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        assertThat(dvm.shouldHideDivider(0), is(false));
201172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        int upper = mPagedListView.getRecyclerView().getLayoutManager()
202172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing                .findViewByPosition(0).getBottom();
203172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        int lower = mPagedListView.getRecyclerView().getLayoutManager()
204172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing                .findViewByPosition(1).getTop();
205172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        assertThat(lower - upper, is(greaterThan(0)));
206172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing    }
207172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
2089b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana    private class TestDividerVisibilityManager implements PagedListView.DividerVisibilityManager {
2099b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana        @Override
2109b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana        public boolean shouldHideDivider(int position) {
2119b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana            // Hide divider after items at even positions, show after items at odd positions.
2129b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana            return position % 2 == 0;
2139b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana        }
2149b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana    }
2159b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana
2169b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana    private static String itemText(int index) {
2179b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana        return "Data " + index;
2189b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana    }
2199b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana
2209b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana    /** A base adapter that will handle inflating the test view and binding data to it. */
2219b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana    private class TestAdapter extends RecyclerView.Adapter<TestViewHolder> {
2229b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana        private List<String> mData;
2239b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana        private int mParentHeight;
2249b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana
2259b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana        TestAdapter(int itemCount, int parentHeight) {
2269b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana            mData = new ArrayList<>();
2279b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana            for (int i = 0; i < itemCount; i++) {
2289b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana                mData.add(itemText(i));
2299b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana            }
2309b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana            mParentHeight = parentHeight;
2319b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana        }
2329b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana
2339b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana        @Override
2349b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana        public TestViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
2359b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana            LayoutInflater inflater = LayoutInflater.from(parent.getContext());
2369b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana            return new TestViewHolder(inflater, parent);
2379b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana        }
2389b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana
2399b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana        @Override
2409b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana        public void onBindViewHolder(TestViewHolder holder, int position) {
2419b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana            // Calculate height for an item so one page fits ITEMS_PER_PAGE items.
2429b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana            int height = (int) Math.floor(mParentHeight / ITEMS_PER_PAGE);
2439b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana            holder.itemView.setMinimumHeight(height);
2449b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana            holder.bind(mData.get(position));
2459b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana        }
2469b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana
2479b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana        @Override
2489b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana        public int getItemCount() {
2499b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana            return mData.size();
2509b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana        }
2519b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana    }
2529b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana
2539b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana    private class TestViewHolder extends RecyclerView.ViewHolder {
2549b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana        private TextView mTextView;
2559b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana
2569b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana        TestViewHolder(LayoutInflater inflater, ViewGroup parent) {
2579b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana            super(inflater.inflate(R.layout.paged_list_item_column_card, parent, false));
2589b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana            mTextView = itemView.findViewById(R.id.text_view);
2599b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana        }
2609b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana
2619b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana        public void bind(String text) {
2629b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana            mTextView.setText(text);
2639b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana        }
2649b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana    }
2659b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana}
266