TextListItemTest.java revision 4e832ea4269fff1780e0726c16bc37584957ba10
1e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing/*
2e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing * Copyright 2017 The Android Open Source Project
3e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing *
4e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing * Licensed under the Apache License, Version 2.0 (the "License");
5e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing * you may not use this file except in compliance with the License.
6e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing * You may obtain a copy of the License at
7e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing *
8e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing *      http://www.apache.org/licenses/LICENSE-2.0
9e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing *
10e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing * Unless required by applicable law or agreed to in writing, software
11e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing * distributed under the License is distributed on an "AS IS" BASIS,
12e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing * See the License for the specific language governing permissions and
14e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing * limitations under the License.
15e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing */
16e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
17e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingpackage androidx.car.widget;
18e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
19e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport static android.support.test.espresso.Espresso.onView;
20e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport static android.support.test.espresso.action.ViewActions.click;
21e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport static android.support.test.espresso.contrib.RecyclerViewActions.actionOnItemAtPosition;
22e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport static android.support.test.espresso.contrib.RecyclerViewActions.scrollToPosition;
23e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport static android.support.test.espresso.matcher.ViewMatchers.withId;
24e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
25e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport static org.hamcrest.Matchers.greaterThanOrEqualTo;
269b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovanaimport static org.hamcrest.Matchers.notNullValue;
27e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport static org.hamcrest.core.Is.is;
28e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport static org.hamcrest.core.IsEqual.equalTo;
29e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport static org.hamcrest.number.IsCloseTo.closeTo;
30fa39e2bca1b284ad7c931d9194287770b7b507faAurimas Liutikasimport static org.junit.Assert.assertFalse;
31e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport static org.junit.Assert.assertThat;
32e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport static org.junit.Assert.assertTrue;
33e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
34e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport android.graphics.drawable.Drawable;
35e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport android.support.test.InstrumentationRegistry;
36e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport android.support.test.espresso.UiController;
37e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport android.support.test.espresso.ViewAction;
38e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport android.support.test.filters.SmallTest;
39e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport android.support.test.rule.ActivityTestRule;
40e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport android.support.test.runner.AndroidJUnit4;
41b226d4dcc396fe8837876dfa113143702dd23c26Anthony Chenimport android.support.v7.widget.LinearLayoutManager;
42e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport android.view.View;
43e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport android.view.ViewGroup;
44a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxingimport android.widget.RelativeLayout;
45e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
46e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport org.hamcrest.Matcher;
47e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport org.junit.Before;
48e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport org.junit.Rule;
49e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport org.junit.Test;
50e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport org.junit.runner.RunWith;
51e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
52e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport java.util.ArrayList;
53e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport java.util.Arrays;
54e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport java.util.List;
55e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
56e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport androidx.car.test.R;
57e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
58e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing/**
594e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing* Tests the layout configuration in {@link TextListItem}.
60e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing */
61e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing@RunWith(AndroidJUnit4.class)
62e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing@SmallTest
634e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxingpublic class TextListItemTest {
64e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
65e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Rule
66e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public ActivityTestRule<PagedListViewTestActivity> mActivityRule =
67e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            new ActivityTestRule<>(PagedListViewTestActivity.class);
68e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
69e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    private PagedListViewTestActivity mActivity;
70e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    private PagedListView mPagedListView;
71e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
72e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Before
73e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void setUp() {
74e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        mActivity = mActivityRule.getActivity();
75e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        mPagedListView = mActivity.findViewById(R.id.paged_list_view);
76e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
77e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
784e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing    private void setupPagedListView(List<TextListItem> items) {
79e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        ListItemProvider provider = new ListItemProvider.ListProvider(
80e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                new ArrayList<>(items));
81e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        try {
82e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            mActivityRule.runOnUiThread(() -> {
83e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                mPagedListView.setAdapter(new ListItemAdapter(mActivity, provider));
84e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            });
85e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        } catch (Throwable throwable) {
86e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            throwable.printStackTrace();
87e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            throw new RuntimeException(throwable);
88e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        }
89e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        // Wait for paged list view to layout by using espresso to scroll to a position.
90e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        onView(withId(R.id.recycler_view)).perform(scrollToPosition(0));
91e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
92e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
93e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    private static void verifyViewIsHidden(View view) {
94e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        if (view instanceof ViewGroup) {
95e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            ViewGroup viewGroup = (ViewGroup) view;
96e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            final int childCount = viewGroup.getChildCount();
97e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            for (int i = 0; i < childCount; i++) {
98e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                verifyViewIsHidden(viewGroup.getChildAt(i));
99e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            }
100e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        } else {
101e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            assertThat(view.getVisibility(), is(equalTo(View.GONE)));
102e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        }
103e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
104e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
1054e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing    private TextListItem.ViewHolder getViewHolderAtPosition(int position) {
1064e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing        return (TextListItem.ViewHolder) mPagedListView.getRecyclerView()
107e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                .findViewHolderForAdapterPosition(
108e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                position);
109e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
110e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
111e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
112e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testEmptyItemHidesAllViews() {
1134e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing        TextListItem item = new TextListItem.Builder(mActivity).build();
114e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(Arrays.asList(item));
115b226d4dcc396fe8837876dfa113143702dd23c26Anthony Chen        verifyViewIsHidden(mPagedListView.getRecyclerView().getLayoutManager().getChildAt(0));
116e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
117e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
118e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
119e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testPrimaryActionVisible() {
1204e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing        List<TextListItem> items = Arrays.asList(
1214e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing                new TextListItem.Builder(mActivity)
122e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withPrimaryActionIcon(android.R.drawable.sym_def_app_icon, true)
123e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build(),
1244e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing                new TextListItem.Builder(mActivity)
125e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withPrimaryActionIcon(android.R.drawable.sym_def_app_icon, false)
126e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build());
127e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
128e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
129e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(getViewHolderAtPosition(0).getPrimaryIcon().getVisibility(),
130e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                is(equalTo(View.VISIBLE)));
131e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(getViewHolderAtPosition(1).getPrimaryIcon().getVisibility(),
132e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                is(equalTo(View.VISIBLE)));
133e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
134e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
135e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
136e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testTextVisible() {
1374e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing        List<TextListItem> items = Arrays.asList(
1384e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing                new TextListItem.Builder(mActivity)
139e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withTitle("title")
140e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build(),
1414e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing                new TextListItem.Builder(mActivity)
142e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withBody("body")
143e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build());
144e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
145e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
146e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(getViewHolderAtPosition(0).getTitle().getVisibility(),
147e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                is(equalTo(View.VISIBLE)));
148e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(getViewHolderAtPosition(1).getBody().getVisibility(),
149e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                is(equalTo(View.VISIBLE)));
150e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
151e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
152e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
153e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testSupplementalActionVisible() {
1544e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing        List<TextListItem> items = Arrays.asList(
1554e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing                new TextListItem.Builder(mActivity)
156e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withSupplementalIcon(android.R.drawable.sym_def_app_icon, true)
157e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build(),
1584e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing                new TextListItem.Builder(mActivity)
159439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing                        .withAction("text", true, v -> { /* Do nothing. */ })
160e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build(),
1614e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing                new TextListItem.Builder(mActivity)
162439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing                        .withActions("text", true, v -> { /* Do nothing. */ },
163439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing                                 "text", true, v -> { /* Do nothing. */ })
164e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build());
165e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
166e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
1674e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing        TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0);
168e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getSupplementalIcon().getVisibility(), is(equalTo(View.VISIBLE)));
169e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getSupplementalIconDivider().getVisibility(),
170e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                is(equalTo(View.VISIBLE)));
171e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
172e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        viewHolder = getViewHolderAtPosition(1);
173e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getAction1().getVisibility(), is(equalTo(View.VISIBLE)));
174e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getAction1Divider().getVisibility(), is(equalTo(View.VISIBLE)));
175e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
176e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        viewHolder = getViewHolderAtPosition(2);
177e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getAction1().getVisibility(), is(equalTo(View.VISIBLE)));
178e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getAction1Divider().getVisibility(), is(equalTo(View.VISIBLE)));
179e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getAction2().getVisibility(), is(equalTo(View.VISIBLE)));
180e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getAction2Divider().getVisibility(), is(equalTo(View.VISIBLE)));
181e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
182e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
183e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
18422037e659c30185f51f522e1761236f780334c9dYao, Yuxing    public void testSwitchVisibleAndCheckedState() {
1854e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing        List<TextListItem> items = Arrays.asList(
1864e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing                new TextListItem.Builder(mActivity)
18722037e659c30185f51f522e1761236f780334c9dYao, Yuxing                        .withSwitch(true, true, null)
18822037e659c30185f51f522e1761236f780334c9dYao, Yuxing                        .build(),
1894e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing                new TextListItem.Builder(mActivity)
19022037e659c30185f51f522e1761236f780334c9dYao, Yuxing                        .withSwitch(false, true, null)
19122037e659c30185f51f522e1761236f780334c9dYao, Yuxing                        .build());
19222037e659c30185f51f522e1761236f780334c9dYao, Yuxing        setupPagedListView(items);
19322037e659c30185f51f522e1761236f780334c9dYao, Yuxing
1944e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing        TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0);
19522037e659c30185f51f522e1761236f780334c9dYao, Yuxing        assertThat(viewHolder.getSwitch().getVisibility(), is(equalTo(View.VISIBLE)));
19622037e659c30185f51f522e1761236f780334c9dYao, Yuxing        assertThat(viewHolder.getSwitch().isChecked(), is(equalTo(true)));
19722037e659c30185f51f522e1761236f780334c9dYao, Yuxing        assertThat(viewHolder.getSwitchDivider().getVisibility(), is(equalTo(View.VISIBLE)));
19822037e659c30185f51f522e1761236f780334c9dYao, Yuxing
19922037e659c30185f51f522e1761236f780334c9dYao, Yuxing        viewHolder = getViewHolderAtPosition(1);
20022037e659c30185f51f522e1761236f780334c9dYao, Yuxing        assertThat(viewHolder.getSwitch().getVisibility(), is(equalTo(View.VISIBLE)));
20122037e659c30185f51f522e1761236f780334c9dYao, Yuxing        assertThat(viewHolder.getSwitch().isChecked(), is(equalTo(false)));
20222037e659c30185f51f522e1761236f780334c9dYao, Yuxing        assertThat(viewHolder.getSwitchDivider().getVisibility(), is(equalTo(View.VISIBLE)));
20322037e659c30185f51f522e1761236f780334c9dYao, Yuxing    }
20422037e659c30185f51f522e1761236f780334c9dYao, Yuxing
20522037e659c30185f51f522e1761236f780334c9dYao, Yuxing    @Test
206e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testDividersAreOptional() {
2074e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing        List<TextListItem> items = Arrays.asList(
2084e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing                new TextListItem.Builder(mActivity)
209e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withSupplementalIcon(android.R.drawable.sym_def_app_icon, false)
210e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build(),
2114e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing                new TextListItem.Builder(mActivity)
212439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing                        .withAction("text", false, v -> { /* Do nothing. */ })
213e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build(),
2144e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing                new TextListItem.Builder(mActivity)
215439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing                        .withActions("text", false, v -> { /* Do nothing. */ },
216439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing                                "text", false, v -> { /* Do nothing. */ })
21722037e659c30185f51f522e1761236f780334c9dYao, Yuxing                        .build(),
2184e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing                new TextListItem.Builder(mActivity)
21922037e659c30185f51f522e1761236f780334c9dYao, Yuxing                        .withSwitch(true, false, null)
220e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build());
221e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
222e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
2234e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing        TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0);
224e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getSupplementalIcon().getVisibility(), is(equalTo(View.VISIBLE)));
225e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getSupplementalIconDivider().getVisibility(),
226e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                is(equalTo(View.GONE)));
227e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
228e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        viewHolder = getViewHolderAtPosition(1);
229e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getAction1().getVisibility(), is(equalTo(View.VISIBLE)));
230e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getAction1Divider().getVisibility(), is(equalTo(View.GONE)));
231e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
232e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        viewHolder = getViewHolderAtPosition(2);
233e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getAction1().getVisibility(), is(equalTo(View.VISIBLE)));
234e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getAction1Divider().getVisibility(), is(equalTo(View.GONE)));
235e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getAction2().getVisibility(), is(equalTo(View.VISIBLE)));
236e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getAction2Divider().getVisibility(), is(equalTo(View.GONE)));
23722037e659c30185f51f522e1761236f780334c9dYao, Yuxing
23822037e659c30185f51f522e1761236f780334c9dYao, Yuxing        viewHolder = getViewHolderAtPosition(3);
23922037e659c30185f51f522e1761236f780334c9dYao, Yuxing        assertThat(viewHolder.getSwitch().getVisibility(), is(equalTo(View.VISIBLE)));
24022037e659c30185f51f522e1761236f780334c9dYao, Yuxing        assertThat(viewHolder.getSwitchDivider().getVisibility(), is(equalTo(View.GONE)));
241e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
242e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
243e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
2449b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana    public void testCanHideItemDividers() {
2454e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing        List<TextListItem> items = Arrays.asList(
2464e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing                new TextListItem.Builder(mActivity)
2479b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana                        .withDividerHidden()
2489b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana                        .build(),
2494e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing                new TextListItem.Builder(mActivity)
2509b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana                        .build());
2519b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana        setupPagedListView(items);
2529b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana
2539b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana        assertThat(items.get(0).shouldHideDivider(), is(true));
2549b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana        assertThat(items.get(1).shouldHideDivider(), is(false));
2559b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana
2569b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana        PagedListView.DividerVisibilityManager dvm = (PagedListView.DividerVisibilityManager)
2579b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana                mPagedListView.getAdapter();
2589b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana        assertThat(dvm, is(notNullValue()));
2599b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana        assertThat(dvm.shouldHideDivider(0), is(true));
2609b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana        assertThat(dvm.shouldHideDivider(1), is(false));
2619b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana    }
2629b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana
2639b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana    @Test
264e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testTextStartMarginMatchesPrimaryActionType() {
2654e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing        List<TextListItem> items = Arrays.asList(
2664e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing                new TextListItem.Builder(mActivity)
267e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withPrimaryActionIcon(android.R.drawable.sym_def_app_icon, true)
268e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build(),
2694e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing                new TextListItem.Builder(mActivity)
270e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withPrimaryActionIcon(android.R.drawable.sym_def_app_icon, false)
271e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build(),
2724e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing                new TextListItem.Builder(mActivity)
273e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withPrimaryActionEmptyIcon()
274e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build(),
2754e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing                new TextListItem.Builder(mActivity)
276e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withPrimaryActionNoIcon()
277e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build());
278e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        List<Integer> expectedStartMargin = Arrays.asList(R.dimen.car_keyline_4,
279e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                R.dimen.car_keyline_3, R.dimen.car_keyline_3, R.dimen.car_keyline_1);
280e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
281e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
282e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        for (int i = 0; i < items.size(); i++) {
2834e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing            TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(i);
284e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
285e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            int expected = InstrumentationRegistry.getContext().getResources()
286e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                    .getDimensionPixelSize(expectedStartMargin.get(i));
287e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            assertThat(((ViewGroup.MarginLayoutParams) viewHolder.getTitle().getLayoutParams())
288e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                    .getMarginStart(), is(equalTo(expected)));
289e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            assertThat(((ViewGroup.MarginLayoutParams) viewHolder.getBody().getLayoutParams())
290e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                    .getMarginStart(), is(equalTo(expected)));
291e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        }
292e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
293e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
294e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
295e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testItemWithOnlyTitleIsSingleLine() {
2964e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing        List<TextListItem> items = Arrays.asList(
297e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                // Only space
2984e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing                new TextListItem.Builder(mActivity)
299e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withTitle(" ")
300e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build(),
301e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                // Underscore
3024e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing                new TextListItem.Builder(mActivity)
303e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withTitle("______")
304e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build(),
3054e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing                new TextListItem.Builder(mActivity)
306e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withTitle("ALL UPPER CASE")
307e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build(),
308e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                // String wouldn't fit in one line
3094e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing                new TextListItem.Builder(mActivity)
310e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withTitle(InstrumentationRegistry.getContext().getResources().getString(
311e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                                R.string.over_120_chars))
312e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build());
313e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
314e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
315e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        double singleLineHeight = InstrumentationRegistry.getContext().getResources().getDimension(
316e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                R.dimen.car_single_line_list_item_height);
317e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
318b226d4dcc396fe8837876dfa113143702dd23c26Anthony Chen        LinearLayoutManager layoutManager =
319b226d4dcc396fe8837876dfa113143702dd23c26Anthony Chen                (LinearLayoutManager) mPagedListView.getRecyclerView().getLayoutManager();
320e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        for (int i = 0; i < items.size(); i++) {
321b226d4dcc396fe8837876dfa113143702dd23c26Anthony Chen            assertThat((double) layoutManager.findViewByPosition(i).getHeight(),
322e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                    is(closeTo(singleLineHeight, 1.0d)));
323e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        }
324e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
325e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
326e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
327e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testItemWithBodyTextIsAtLeastDoubleLine() {
3284e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing        List<TextListItem> items = Arrays.asList(
329e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                // Only space
3304e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing                new TextListItem.Builder(mActivity)
331e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withBody(" ")
332e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build(),
333e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                // Underscore
3344e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing                new TextListItem.Builder(mActivity)
335e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withBody("____")
336e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build(),
337e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                // String wouldn't fit in one line
3384e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing                new TextListItem.Builder(mActivity)
339e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withBody(InstrumentationRegistry.getContext().getResources().getString(
340e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                                R.string.over_120_chars))
341e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build());
342e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
343e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
344e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        final int doubleLineHeight =
345e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                (int) InstrumentationRegistry.getContext().getResources().getDimension(
346e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        R.dimen.car_double_line_list_item_height);
347e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
348b226d4dcc396fe8837876dfa113143702dd23c26Anthony Chen        LinearLayoutManager layoutManager =
349b226d4dcc396fe8837876dfa113143702dd23c26Anthony Chen                (LinearLayoutManager) mPagedListView.getRecyclerView().getLayoutManager();
350e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        for (int i = 0; i < items.size(); i++) {
351b226d4dcc396fe8837876dfa113143702dd23c26Anthony Chen            assertThat(layoutManager.findViewByPosition(i).getHeight(),
352e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                    is(greaterThanOrEqualTo(doubleLineHeight)));
353e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        }
354e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
355e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
356e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
357e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testBodyTextLengthLimit() {
358e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        final String longText = InstrumentationRegistry.getContext().getResources().getString(
359e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                R.string.over_120_chars);
360e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        final int limit = InstrumentationRegistry.getContext().getResources().getInteger(
361e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                R.integer.car_list_item_text_length_limit);
3624e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing        List<TextListItem> items = Arrays.asList(
3634e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing                new TextListItem.Builder(mActivity)
364e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withBody(longText)
365e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build());
366e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
367e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
368e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        // + 1 for appended ellipsis.
369e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(getViewHolderAtPosition(0).getBody().getText().length(),
370e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                is(equalTo(limit + 1)));
371e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
372e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
373e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
374e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testPrimaryIconDrawable() {
375e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        Drawable drawable = InstrumentationRegistry.getContext().getResources().getDrawable(
376e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                android.R.drawable.sym_def_app_icon, null);
3774e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing        List<TextListItem> items = Arrays.asList(
3784e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing                new TextListItem.Builder(mActivity)
379e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withPrimaryActionIcon(drawable, true)
380e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build());
381e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
382e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
383e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertTrue(getViewHolderAtPosition(0).getPrimaryIcon().getDrawable().getConstantState()
384e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                .equals(drawable.getConstantState()));
385e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
386e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
387e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
388e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testLargePrimaryIconHasNoStartMargin() {
3894e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing        List<TextListItem> items = Arrays.asList(
3904e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing                new TextListItem.Builder(mActivity)
391e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withPrimaryActionIcon(android.R.drawable.sym_def_app_icon, true)
392e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build());
393e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
394e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
3954e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing        TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0);
396e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(((ViewGroup.MarginLayoutParams) viewHolder.getPrimaryIcon().getLayoutParams())
397e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                .getMarginStart(), is(equalTo(0)));
398e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
399e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
400e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
401e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testSmallPrimaryIconStartMargin() {
4024e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing        List<TextListItem> items = Arrays.asList(
4034e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing                new TextListItem.Builder(mActivity)
404e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withPrimaryActionIcon(android.R.drawable.sym_def_app_icon, false)
405e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build());
406e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
407e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
408e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        int expected = InstrumentationRegistry.getContext().getResources().getDimensionPixelSize(
409e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                R.dimen.car_keyline_1);
410e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
4114e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing        TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0);
412e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(((ViewGroup.MarginLayoutParams) viewHolder.getPrimaryIcon().getLayoutParams())
413e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                .getMarginStart(), is(equalTo(expected)));
414e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
415e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
416e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
4175dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing    public void testSmallPrimaryIconTopMarginRemainsTheSameRegardlessOfTextLength() {
4185dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing        final String longText = InstrumentationRegistry.getContext().getResources().getString(
4195dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing                R.string.over_120_chars);
4204e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing        List<TextListItem> items = Arrays.asList(
4215dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing                // Single line item.
4224e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing                new TextListItem.Builder(mActivity)
4235dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing                        .withPrimaryActionIcon(android.R.drawable.sym_def_app_icon, false)
4245dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing                        .withTitle("one line text")
4255dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing                        .build(),
4265dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing                // Double line item with one line text.
4274e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing                new TextListItem.Builder(mActivity)
4285dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing                        .withPrimaryActionIcon(android.R.drawable.sym_def_app_icon, false)
4295dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing                        .withTitle("one line text")
4305dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing                        .withBody("one line text")
4315dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing                        .build(),
4325dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing                // Double line item with long text.
4334e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing                new TextListItem.Builder(mActivity)
4345dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing                        .withPrimaryActionIcon(android.R.drawable.sym_def_app_icon, false)
4355dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing                        .withTitle("one line text")
4365dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing                        .withBody(longText)
4375dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing                        .build(),
4385dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing                // Body text only - long text.
4394e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing                new TextListItem.Builder(mActivity)
4405dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing                        .withPrimaryActionIcon(android.R.drawable.sym_def_app_icon, false)
4415dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing                        .withBody(longText)
4425dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing                        .build(),
4435dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing                // Body text only - one line text.
4444e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing                new TextListItem.Builder(mActivity)
4455dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing                        .withPrimaryActionIcon(android.R.drawable.sym_def_app_icon, false)
4465dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing                        .withBody("one line text")
4475dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing                        .build());
4485dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing        setupPagedListView(items);
4495dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing
4505dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing        for (int i = 1; i < items.size(); i++) {
4515dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing            onView(withId(R.id.recycler_view)).perform(scrollToPosition(i));
4525dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing            // Implementation uses integer division so it may be off by 1 vs centered vertically.
4535dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing            assertThat((double) getViewHolderAtPosition(i - 1).getPrimaryIcon().getTop(),
4545dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing                    is(closeTo(
4555dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing                    (double) getViewHolderAtPosition(i).getPrimaryIcon().getTop(), 1.0d)));
4565dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing        }
4575dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing    }
4585dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing
4595dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing    @Test
460e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testClickingPrimaryActionIsSeparateFromSupplementalAction() {
461e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        final boolean[] clicked = {false, false};
4624e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing        List<TextListItem> items = Arrays.asList(
4634e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing                new TextListItem.Builder(mActivity)
464439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing                        .withOnClickListener(v -> clicked[0] = true)
465e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withSupplementalIcon(android.R.drawable.sym_def_app_icon, true,
466439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing                                v -> clicked[1] = true)
467e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build());
468e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
469e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
470e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        onView(withId(R.id.recycler_view)).perform(actionOnItemAtPosition(0, click()));
471e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertTrue(clicked[0]);
472e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertFalse(clicked[1]);
473e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
474e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        onView(withId(R.id.recycler_view)).perform(
475e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                actionOnItemAtPosition(0, clickChildViewWithId(R.id.supplemental_icon)));
476e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertTrue(clicked[1]);
477e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
478e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
479e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
480e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testClickingSupplementalIcon() {
481e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        final boolean[] clicked = {false};
4824e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing        List<TextListItem> items = Arrays.asList(
4834e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing                new TextListItem.Builder(mActivity)
484e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withSupplementalIcon(android.R.drawable.sym_def_app_icon, true,
485439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing                                v -> clicked[0] = true)
486e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build());
487e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
488e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
489e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        onView(withId(R.id.recycler_view)).perform(
490e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                actionOnItemAtPosition(0, clickChildViewWithId(R.id.supplemental_icon)));
491e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertTrue(clicked[0]);
492e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
493e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
494e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
495439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing    public void testSupplementalIconWithoutClickListenerIsNotClickable() {
4964e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing        List<TextListItem> items = Arrays.asList(
4974e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing                new TextListItem.Builder(mActivity)
498439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing                        .withSupplementalIcon(android.R.drawable.sym_def_app_icon, true)
499439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing                        .build());
500439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing        setupPagedListView(items);
501439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing
5024e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing        TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0);
503439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing        assertFalse(viewHolder.getSupplementalIcon().isClickable());
504439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing    }
505439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing
506439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing    @Test
50722037e659c30185f51f522e1761236f780334c9dYao, Yuxing    public void testCheckingSwitch() {
50822037e659c30185f51f522e1761236f780334c9dYao, Yuxing        final boolean[] clicked = {false, false};
5094e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing        List<TextListItem> items = Arrays.asList(
5104e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing                new TextListItem.Builder(mActivity)
51122037e659c30185f51f522e1761236f780334c9dYao, Yuxing                        .withSwitch(false, false, (button, isChecked) -> {
51222037e659c30185f51f522e1761236f780334c9dYao, Yuxing                            // Initial value is false.
51322037e659c30185f51f522e1761236f780334c9dYao, Yuxing                            assertTrue(isChecked);
51422037e659c30185f51f522e1761236f780334c9dYao, Yuxing                            clicked[0] = true;
51522037e659c30185f51f522e1761236f780334c9dYao, Yuxing                        })
51622037e659c30185f51f522e1761236f780334c9dYao, Yuxing                        .build(),
5174e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing                new TextListItem.Builder(mActivity)
51822037e659c30185f51f522e1761236f780334c9dYao, Yuxing                        .withSwitch(true, false, (button, isChecked) -> {
51922037e659c30185f51f522e1761236f780334c9dYao, Yuxing                            // Initial value is true.
52022037e659c30185f51f522e1761236f780334c9dYao, Yuxing                            assertFalse(isChecked);
52122037e659c30185f51f522e1761236f780334c9dYao, Yuxing                            clicked[1] = true;
52222037e659c30185f51f522e1761236f780334c9dYao, Yuxing                        })
52322037e659c30185f51f522e1761236f780334c9dYao, Yuxing                        .build());
52422037e659c30185f51f522e1761236f780334c9dYao, Yuxing        setupPagedListView(items);
52522037e659c30185f51f522e1761236f780334c9dYao, Yuxing
52622037e659c30185f51f522e1761236f780334c9dYao, Yuxing        onView(withId(R.id.recycler_view)).perform(
52722037e659c30185f51f522e1761236f780334c9dYao, Yuxing                actionOnItemAtPosition(0, clickChildViewWithId(R.id.switch_widget)));
52822037e659c30185f51f522e1761236f780334c9dYao, Yuxing        assertTrue(clicked[0]);
52922037e659c30185f51f522e1761236f780334c9dYao, Yuxing
53022037e659c30185f51f522e1761236f780334c9dYao, Yuxing        onView(withId(R.id.recycler_view)).perform(
53122037e659c30185f51f522e1761236f780334c9dYao, Yuxing                actionOnItemAtPosition(1, clickChildViewWithId(R.id.switch_widget)));
53222037e659c30185f51f522e1761236f780334c9dYao, Yuxing        assertTrue(clicked[1]);
53322037e659c30185f51f522e1761236f780334c9dYao, Yuxing    }
53422037e659c30185f51f522e1761236f780334c9dYao, Yuxing
53522037e659c30185f51f522e1761236f780334c9dYao, Yuxing    @Test
536e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testClickingSupplementalAction() {
537e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        final boolean[] clicked = {false};
5384e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing        List<TextListItem> items = Arrays.asList(
5394e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing                new TextListItem.Builder(mActivity)
540439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing                        .withAction("action", true, v -> clicked[0] = true)
541e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build());
542e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
543e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
544e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        onView(withId(R.id.recycler_view)).perform(
545e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                actionOnItemAtPosition(0, clickChildViewWithId(R.id.action1)));
546e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertTrue(clicked[0]);
547e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
548e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
549e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
550e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testClickingBothSupplementalActions() {
551e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        final boolean[] clicked = {false, false};
5524e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing        List<TextListItem> items = Arrays.asList(
5534e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing                new TextListItem.Builder(mActivity)
554439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing                        .withActions("action 1", true, v -> clicked[0] = true,
555439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing                                "action 2", true, v -> clicked[1] = true)
556e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build());
557e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
558e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
559e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        onView(withId(R.id.recycler_view)).perform(
560e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                actionOnItemAtPosition(0, clickChildViewWithId(R.id.action1)));
561e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertTrue(clicked[0]);
562e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertFalse(clicked[1]);
563e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
564e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        onView(withId(R.id.recycler_view)).perform(
565e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                actionOnItemAtPosition(0, clickChildViewWithId(R.id.action2)));
566e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertTrue(clicked[1]);
567e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
568e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
569e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
570e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testCustomViewBinderAreCalledLast() {
571e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        final String updatedTitle = "updated title";
5724e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing        List<TextListItem> items = Arrays.asList(
5734e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing                new TextListItem.Builder(mActivity)
574e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withTitle("original title")
575e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withViewBinder((viewHolder) -> viewHolder.getTitle().setText(updatedTitle))
576e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build());
577e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
578e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
5794e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing        TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0);
580e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getTitle().getText(), is(equalTo(updatedTitle)));
581e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
582e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
583e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
584e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testCustomViewBinderOnUnusedViewsHasNoEffect() {
5854e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing        List<TextListItem> items = Arrays.asList(
5864e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing                new TextListItem.Builder(mActivity)
587e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withViewBinder((viewHolder) -> viewHolder.getBody().setText("text"))
588e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build());
589e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
590e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
5914e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing        TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0);
592e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getBody().getVisibility(), is(equalTo(View.GONE)));
593e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        // Custom binder interacts with body but has no effect.
594e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        // Expect card height to remain single line.
595e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat((double) viewHolder.itemView.getHeight(), is(closeTo(
596e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                InstrumentationRegistry.getContext().getResources().getDimension(
597e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        R.dimen.car_single_line_list_item_height), 1.0d)));
598e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
599e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
600e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
601e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testSettingTitleOrBodyAsPrimaryText() {
602e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        // Create 2 items, one with Title as primary (default) and one with Body.
603e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        // The primary text, regardless of view, should have consistent look (as primary).
6044e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing        List<TextListItem> items = Arrays.asList(
6054e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing                new TextListItem.Builder(mActivity)
606e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withTitle("title")
607e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withBody("body")
608e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build(),
6094e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing                new TextListItem.Builder(mActivity)
610e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withTitle("title")
611e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withBody("body", true)
612e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build());
613e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
614e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
6154e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing        TextListItem.ViewHolder titlePrimary = getViewHolderAtPosition(0);
6164e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing        TextListItem.ViewHolder bodyPrimary = getViewHolderAtPosition(1);
617e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(titlePrimary.getTitle().getTextSize(),
618e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                is(equalTo(bodyPrimary.getBody().getTextSize())));
619e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(titlePrimary.getTitle().getTextColors(),
620e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                is(equalTo(bodyPrimary.getBody().getTextColors())));
621e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
622e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
623a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing    @Test
624a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing    public void testNoCarriedOverLayoutParamsForTextView() throws Throwable {
6254e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing        TextListItem singleLine = new TextListItem.Builder(mActivity).withTitle("t").build();
626a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        setupPagedListView(Arrays.asList(singleLine));
627a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing
628a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        // Manually rebind the view holder of a single line item to a double line item.
6294e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing        TextListItem doubleLine = new TextListItem.Builder(mActivity).withTitle("t").withBody("b")
6304e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing                .build();
6314e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing        TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0);
632a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        mActivityRule.runOnUiThread(() -> doubleLine.bind(viewHolder));
633a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing
634a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        RelativeLayout.LayoutParams titleLayoutParams =
635a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing                (RelativeLayout.LayoutParams) viewHolder.getTitle().getLayoutParams();
636a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        RelativeLayout.LayoutParams bodyLayoutParams =
637a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing                (RelativeLayout.LayoutParams) viewHolder.getTitle().getLayoutParams();
638a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        assertThat(titleLayoutParams.getRule(RelativeLayout.CENTER_VERTICAL), is(equalTo(0)));
639a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        assertThat(bodyLayoutParams.getRule(RelativeLayout.CENTER_VERTICAL), is(equalTo(0)));
640a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing    }
641a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing
642a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing    @Test
643a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing    public void testNoCarriedOverLayoutParamsForPrimaryIcon() throws Throwable {
6444e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing        TextListItem smallIcon = new TextListItem.Builder(mActivity)
645a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing                .withPrimaryActionIcon(android.R.drawable.sym_def_app_icon, false)
646a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing                .withBody("body")  // Small icon of items with body text should use top margin.
647a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing                .build();
648a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        setupPagedListView(Arrays.asList(smallIcon));
649a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing
650a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        // Manually rebind the view holder.
6514e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing        TextListItem largeIcon = new TextListItem.Builder(mActivity)
652a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing                .withPrimaryActionIcon(android.R.drawable.sym_def_app_icon, true)
653a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing                .build();
6544e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing        TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0);
655a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        mActivityRule.runOnUiThread(() -> largeIcon.bind(viewHolder));
656a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing
657a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        RelativeLayout.LayoutParams iconLayoutParams =
658a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing                (RelativeLayout.LayoutParams) viewHolder.getPrimaryIcon().getLayoutParams();
659a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        assertThat(iconLayoutParams.getRule(RelativeLayout.CENTER_VERTICAL),
660a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing                is(equalTo(RelativeLayout.TRUE)));
661a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        assertThat(iconLayoutParams.topMargin, is(equalTo(0)));
662a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing    }
663a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing
664e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    private static ViewAction clickChildViewWithId(final int id) {
665e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        return new ViewAction() {
666e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            @Override
667e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            public Matcher<View> getConstraints() {
668e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                return null;
669e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            }
670e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
671e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            @Override
672e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            public String getDescription() {
673e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                return "Click on a child view with specific id.";
674e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            }
675e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
676e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            @Override
677e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            public void perform(UiController uiController, View view) {
678e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                View v = view.findViewById(id);
679e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                v.performClick();
680e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            }
681e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        };
682e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
683e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing}
684