TextListItemTest.java revision 172425512285f6da3c69b9405738df1f064336c1
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;
26e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport static org.hamcrest.core.Is.is;
27e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport static org.hamcrest.core.IsEqual.equalTo;
28e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport static org.hamcrest.number.IsCloseTo.closeTo;
29fa39e2bca1b284ad7c931d9194287770b7b507faAurimas Liutikasimport static org.junit.Assert.assertFalse;
30e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport static org.junit.Assert.assertThat;
31e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport static org.junit.Assert.assertTrue;
32e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
33e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport android.graphics.drawable.Drawable;
34e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport android.support.test.InstrumentationRegistry;
35e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport android.support.test.espresso.UiController;
36e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport android.support.test.espresso.ViewAction;
37e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport android.support.test.filters.SmallTest;
38e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport android.support.test.rule.ActivityTestRule;
39e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport android.support.test.runner.AndroidJUnit4;
40b226d4dcc396fe8837876dfa113143702dd23c26Anthony Chenimport android.support.v7.widget.LinearLayoutManager;
41e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport android.view.View;
42e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport android.view.ViewGroup;
43a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxingimport android.widget.RelativeLayout;
44e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
45e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport org.hamcrest.Matcher;
46e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport org.junit.Before;
47e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport org.junit.Rule;
48e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport org.junit.Test;
49e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport org.junit.runner.RunWith;
50e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
51e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport java.util.ArrayList;
52e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport java.util.Arrays;
53e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport java.util.List;
54e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
55e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport androidx.car.test.R;
56e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
57e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing/**
584e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing* Tests the layout configuration in {@link TextListItem}.
59e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing */
60e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing@RunWith(AndroidJUnit4.class)
61e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing@SmallTest
624e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxingpublic class TextListItemTest {
63e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
64e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Rule
65e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public ActivityTestRule<PagedListViewTestActivity> mActivityRule =
66e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            new ActivityTestRule<>(PagedListViewTestActivity.class);
67e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
68e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    private PagedListViewTestActivity mActivity;
69e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    private PagedListView mPagedListView;
70e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
71e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Before
72e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void setUp() {
73e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        mActivity = mActivityRule.getActivity();
74e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        mPagedListView = mActivity.findViewById(R.id.paged_list_view);
75e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
76e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
774e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing    private void setupPagedListView(List<TextListItem> items) {
78e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        ListItemProvider provider = new ListItemProvider.ListProvider(
79e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                new ArrayList<>(items));
80e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        try {
81e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            mActivityRule.runOnUiThread(() -> {
82e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                mPagedListView.setAdapter(new ListItemAdapter(mActivity, provider));
83e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            });
84e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        } catch (Throwable throwable) {
85e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            throwable.printStackTrace();
86e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            throw new RuntimeException(throwable);
87e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        }
88e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        // Wait for paged list view to layout by using espresso to scroll to a position.
89e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        onView(withId(R.id.recycler_view)).perform(scrollToPosition(0));
90e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
91e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
92e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    private static void verifyViewIsHidden(View view) {
93e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        if (view instanceof ViewGroup) {
94e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            ViewGroup viewGroup = (ViewGroup) view;
95e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            final int childCount = viewGroup.getChildCount();
96e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            for (int i = 0; i < childCount; i++) {
97e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                verifyViewIsHidden(viewGroup.getChildAt(i));
98e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            }
99e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        } else {
100e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            assertThat(view.getVisibility(), is(equalTo(View.GONE)));
101e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        }
102e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
103e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
1044e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing    private TextListItem.ViewHolder getViewHolderAtPosition(int position) {
1054e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing        return (TextListItem.ViewHolder) mPagedListView.getRecyclerView()
106e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                .findViewHolderForAdapterPosition(
107e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                position);
108e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
109e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
110e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
111e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testEmptyItemHidesAllViews() {
112172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item = new TextListItem(mActivity);
113e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(Arrays.asList(item));
114b226d4dcc396fe8837876dfa113143702dd23c26Anthony Chen        verifyViewIsHidden(mPagedListView.getRecyclerView().getLayoutManager().getChildAt(0));
115e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
116e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
117e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
118e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testPrimaryActionVisible() {
119172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
120172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon, true);
121172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
122172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item1 = new TextListItem(mActivity);
123172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item1.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon, false);
124172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
125172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        List<TextListItem> items = Arrays.asList(item0, item1);
126e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
127e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
128e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(getViewHolderAtPosition(0).getPrimaryIcon().getVisibility(),
129e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                is(equalTo(View.VISIBLE)));
130e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(getViewHolderAtPosition(1).getPrimaryIcon().getVisibility(),
131e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                is(equalTo(View.VISIBLE)));
132e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
133e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
134e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
135e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testTextVisible() {
136172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
137172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setTitle("title");
138172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
139172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item1 = new TextListItem(mActivity);
140172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item1.setBody("body");
141172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
142172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        List<TextListItem> items = Arrays.asList(item0, item1);
143e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
144e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
145e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(getViewHolderAtPosition(0).getTitle().getVisibility(),
146e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                is(equalTo(View.VISIBLE)));
147e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(getViewHolderAtPosition(1).getBody().getVisibility(),
148e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                is(equalTo(View.VISIBLE)));
149e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
150e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
151e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
152e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testSupplementalActionVisible() {
153172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
154172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setSupplementalIcon(android.R.drawable.sym_def_app_icon, true);
155172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
156172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item1 = new TextListItem(mActivity);
157172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item1.setAction("text", true, v -> { /* Do nothing. */ });
158172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
159172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
160172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item2 = new TextListItem(mActivity);
161172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item2.setActions("text", true, v -> { /* Do nothing. */ },
162172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing                        "text", true, v -> { /* Do nothing. */ });
163172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
164172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        List<TextListItem> items = Arrays.asList(item0, item1, item2);
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() {
185172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
186172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setSwitch(true, true, null);
187172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
188172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item1 = new TextListItem(mActivity);
189172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item1.setSwitch(false, true, null);
190172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
191172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        List<TextListItem> items = Arrays.asList(item0, item1);
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() {
207172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
208172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setSupplementalIcon(android.R.drawable.sym_def_app_icon, false);
209172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
210172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item1 = new TextListItem(mActivity);
211172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item1.setAction("text", false, v -> { /* Do nothing. */ });
212172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
213172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item2 = new TextListItem(mActivity);
214172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item2.setActions("text", false, v -> { /* Do nothing. */ },
215172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing                "text", false, v -> { /* Do nothing. */ });
216172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
217172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item3 = new TextListItem(mActivity);
218172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item3.setSwitch(true, false, null);
219172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
220172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        List<TextListItem> items = Arrays.asList(item0, item1, item2, item3);
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
244172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing    public void testTextStartMarginMatchesPrimaryActionType() {
245172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
246172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon, true);
2479b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana
248172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item1 = new TextListItem(mActivity);
249172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item1.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon, false);
2509b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana
251172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item2 = new TextListItem(mActivity);
252172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item2.setPrimaryActionEmptyIcon();
2539b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana
254172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item3 = new TextListItem(mActivity);
255172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item3.setPrimaryActionNoIcon();
256172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
257172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        List<TextListItem> items = Arrays.asList(item0, item1, item2, item3);
258e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        List<Integer> expectedStartMargin = Arrays.asList(R.dimen.car_keyline_4,
259e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                R.dimen.car_keyline_3, R.dimen.car_keyline_3, R.dimen.car_keyline_1);
260e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
261e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
262e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        for (int i = 0; i < items.size(); i++) {
2634e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing            TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(i);
264e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
265e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            int expected = InstrumentationRegistry.getContext().getResources()
266e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                    .getDimensionPixelSize(expectedStartMargin.get(i));
267e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            assertThat(((ViewGroup.MarginLayoutParams) viewHolder.getTitle().getLayoutParams())
268e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                    .getMarginStart(), is(equalTo(expected)));
269e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            assertThat(((ViewGroup.MarginLayoutParams) viewHolder.getBody().getLayoutParams())
270e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                    .getMarginStart(), is(equalTo(expected)));
271e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        }
272e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
273e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
274e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
275e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testItemWithOnlyTitleIsSingleLine() {
276172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        // Only space.
277172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
278172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setTitle(" ");
279172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
280172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        // Underscore.
281172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item1 = new TextListItem(mActivity);
282172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item1.setTitle("______");
283172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
284172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item2 = new TextListItem(mActivity);
285172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item2.setTitle("ALL UPPER CASE");
286172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
287172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        // String wouldn't fit in one line.
288172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item3 = new TextListItem(mActivity);
289172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item3.setTitle(InstrumentationRegistry.getContext().getResources().getString(
290172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing                R.string.over_120_chars));
291172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
292172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        List<TextListItem> items = Arrays.asList(item0, item1, item2, item3);
293e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
294e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
295e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        double singleLineHeight = InstrumentationRegistry.getContext().getResources().getDimension(
296e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                R.dimen.car_single_line_list_item_height);
297e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
298b226d4dcc396fe8837876dfa113143702dd23c26Anthony Chen        LinearLayoutManager layoutManager =
299b226d4dcc396fe8837876dfa113143702dd23c26Anthony Chen                (LinearLayoutManager) mPagedListView.getRecyclerView().getLayoutManager();
300e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        for (int i = 0; i < items.size(); i++) {
301b226d4dcc396fe8837876dfa113143702dd23c26Anthony Chen            assertThat((double) layoutManager.findViewByPosition(i).getHeight(),
302e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                    is(closeTo(singleLineHeight, 1.0d)));
303e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        }
304e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
305e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
306e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
307e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testItemWithBodyTextIsAtLeastDoubleLine() {
308172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        // Only space.
309172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
310172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setBody(" ");
311172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
312172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        // Underscore.
313172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item1 = new TextListItem(mActivity);
314172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item1.setBody("____");
315172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
316172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        // String wouldn't fit in one line.
317172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item2 = new TextListItem(mActivity);
318172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item2.setBody(InstrumentationRegistry.getContext().getResources().getString(
319172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing                R.string.over_120_chars));
320172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
321172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        List<TextListItem> items = Arrays.asList(item0, item1, item2);
322e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
323e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
324e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        final int doubleLineHeight =
325e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                (int) InstrumentationRegistry.getContext().getResources().getDimension(
326e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        R.dimen.car_double_line_list_item_height);
327e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
328b226d4dcc396fe8837876dfa113143702dd23c26Anthony Chen        LinearLayoutManager layoutManager =
329b226d4dcc396fe8837876dfa113143702dd23c26Anthony Chen                (LinearLayoutManager) mPagedListView.getRecyclerView().getLayoutManager();
330e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        for (int i = 0; i < items.size(); i++) {
331b226d4dcc396fe8837876dfa113143702dd23c26Anthony Chen            assertThat(layoutManager.findViewByPosition(i).getHeight(),
332e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                    is(greaterThanOrEqualTo(doubleLineHeight)));
333e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        }
334e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
335e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
336e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
337e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testBodyTextLengthLimit() {
338e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        final String longText = InstrumentationRegistry.getContext().getResources().getString(
339e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                R.string.over_120_chars);
340e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        final int limit = InstrumentationRegistry.getContext().getResources().getInteger(
341e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                R.integer.car_list_item_text_length_limit);
342172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
343172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
344172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setBody(longText);
345172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
346172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        List<TextListItem> items = Arrays.asList(item0);
347e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
348e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
349e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        // + 1 for appended ellipsis.
350e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(getViewHolderAtPosition(0).getBody().getText().length(),
351e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                is(equalTo(limit + 1)));
352e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
353e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
354e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
355e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testPrimaryIconDrawable() {
356e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        Drawable drawable = InstrumentationRegistry.getContext().getResources().getDrawable(
357e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                android.R.drawable.sym_def_app_icon, null);
358172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
359172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
360172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setPrimaryActionIcon(drawable, true);
361172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
362172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        List<TextListItem> items = Arrays.asList(item0);
363e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
364e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
365e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertTrue(getViewHolderAtPosition(0).getPrimaryIcon().getDrawable().getConstantState()
366e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                .equals(drawable.getConstantState()));
367e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
368e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
369e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
370e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testLargePrimaryIconHasNoStartMargin() {
371172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
372172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon, true);
373172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
374172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        List<TextListItem> items = Arrays.asList(item0);
375e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
376e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
3774e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing        TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0);
378e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(((ViewGroup.MarginLayoutParams) viewHolder.getPrimaryIcon().getLayoutParams())
379e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                .getMarginStart(), is(equalTo(0)));
380e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
381e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
382e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
383e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testSmallPrimaryIconStartMargin() {
384172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
385172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon, false);
386172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
387172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        List<TextListItem> items = Arrays.asList(item0);
388e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
389e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
390e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        int expected = InstrumentationRegistry.getContext().getResources().getDimensionPixelSize(
391e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                R.dimen.car_keyline_1);
392e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
3934e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing        TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0);
394e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(((ViewGroup.MarginLayoutParams) viewHolder.getPrimaryIcon().getLayoutParams())
395e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                .getMarginStart(), is(equalTo(expected)));
396e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
397e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
398e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
3995dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing    public void testSmallPrimaryIconTopMarginRemainsTheSameRegardlessOfTextLength() {
4005dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing        final String longText = InstrumentationRegistry.getContext().getResources().getString(
4015dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing                R.string.over_120_chars);
402172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
403172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        // Single line item.
404172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
405172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon, false);
406172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setTitle("one line text");
407172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
408172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        // Double line item with one line text.
409172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item1 = new TextListItem(mActivity);
410172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item1.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon, false);
411172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item1.setTitle("one line text");
412172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item1.setBody("one line text");
413172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
414172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        // Double line item with long text.
415172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item2 = new TextListItem(mActivity);
416172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item2.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon, false);
417172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item2.setTitle("one line text");
418172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item2.setBody(longText);
419172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
420172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        // Body text only - long text.
421172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item3 = new TextListItem(mActivity);
422172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item3.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon, false);
423172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item3.setBody(longText);
424172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
425172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        // Body text only - one line text.
426172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item4 = new TextListItem(mActivity);
427172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item4.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon, false);
428172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item4.setBody("one line text");
429172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
430172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        List<TextListItem> items = Arrays.asList(item0, item1, item2, item3, item4);
4315dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing        setupPagedListView(items);
4325dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing
4335dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing        for (int i = 1; i < items.size(); i++) {
4345dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing            onView(withId(R.id.recycler_view)).perform(scrollToPosition(i));
4355dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing            // Implementation uses integer division so it may be off by 1 vs centered vertically.
4365dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing            assertThat((double) getViewHolderAtPosition(i - 1).getPrimaryIcon().getTop(),
4375dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing                    is(closeTo(
4385dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing                    (double) getViewHolderAtPosition(i).getPrimaryIcon().getTop(), 1.0d)));
4395dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing        }
4405dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing    }
4415dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing
4425dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing    @Test
443e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testClickingPrimaryActionIsSeparateFromSupplementalAction() {
444e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        final boolean[] clicked = {false, false};
445172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
446172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
447172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setOnClickListener(v -> clicked[0] = true);
448172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setSupplementalIcon(android.R.drawable.sym_def_app_icon, true,
449172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing                v -> clicked[1] = true);
450172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
451172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        List<TextListItem> items = Arrays.asList(item0);
452e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
453e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
454e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        onView(withId(R.id.recycler_view)).perform(actionOnItemAtPosition(0, click()));
455e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertTrue(clicked[0]);
456e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertFalse(clicked[1]);
457e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
458e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        onView(withId(R.id.recycler_view)).perform(
459e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                actionOnItemAtPosition(0, clickChildViewWithId(R.id.supplemental_icon)));
460e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertTrue(clicked[1]);
461e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
462e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
463e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
464e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testClickingSupplementalIcon() {
465e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        final boolean[] clicked = {false};
466172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
467172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
468172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setSupplementalIcon(android.R.drawable.sym_def_app_icon, true,
469172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing                v -> clicked[0] = true);
470172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
471172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        List<TextListItem> items = Arrays.asList(item0);
472e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
473e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
474e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        onView(withId(R.id.recycler_view)).perform(
475e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                actionOnItemAtPosition(0, clickChildViewWithId(R.id.supplemental_icon)));
476e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertTrue(clicked[0]);
477e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
478e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
479e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
480439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing    public void testSupplementalIconWithoutClickListenerIsNotClickable() {
481172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
482172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setSupplementalIcon(android.R.drawable.sym_def_app_icon, true);
483172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
484172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        List<TextListItem> items = Arrays.asList(item0);
485439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing        setupPagedListView(items);
486439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing
4874e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing        TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0);
488439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing        assertFalse(viewHolder.getSupplementalIcon().isClickable());
489439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing    }
490439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing
491439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing    @Test
49222037e659c30185f51f522e1761236f780334c9dYao, Yuxing    public void testCheckingSwitch() {
49322037e659c30185f51f522e1761236f780334c9dYao, Yuxing        final boolean[] clicked = {false, false};
494172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
495172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
496172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setSwitch(false, false, (button, isChecked) -> {
497172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing            // Initial value is false.
498172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing            assertTrue(isChecked);
499172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing            clicked[0] = true;
500172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        });
501172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
502172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item1 = new TextListItem(mActivity);
503172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item1.setSwitch(true, false, (button, isChecked) -> {
504172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing            // Initial value is true.
505172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing            assertFalse(isChecked);
506172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing            clicked[1] = true;
507172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        });
508172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
509172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        List<TextListItem> items = Arrays.asList(item0, item1);
51022037e659c30185f51f522e1761236f780334c9dYao, Yuxing        setupPagedListView(items);
51122037e659c30185f51f522e1761236f780334c9dYao, Yuxing
51222037e659c30185f51f522e1761236f780334c9dYao, Yuxing        onView(withId(R.id.recycler_view)).perform(
51322037e659c30185f51f522e1761236f780334c9dYao, Yuxing                actionOnItemAtPosition(0, clickChildViewWithId(R.id.switch_widget)));
51422037e659c30185f51f522e1761236f780334c9dYao, Yuxing        assertTrue(clicked[0]);
51522037e659c30185f51f522e1761236f780334c9dYao, Yuxing
51622037e659c30185f51f522e1761236f780334c9dYao, Yuxing        onView(withId(R.id.recycler_view)).perform(
51722037e659c30185f51f522e1761236f780334c9dYao, Yuxing                actionOnItemAtPosition(1, clickChildViewWithId(R.id.switch_widget)));
51822037e659c30185f51f522e1761236f780334c9dYao, Yuxing        assertTrue(clicked[1]);
51922037e659c30185f51f522e1761236f780334c9dYao, Yuxing    }
52022037e659c30185f51f522e1761236f780334c9dYao, Yuxing
52122037e659c30185f51f522e1761236f780334c9dYao, Yuxing    @Test
522e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testClickingSupplementalAction() {
523e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        final boolean[] clicked = {false};
524172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
525172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
526172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setAction("action", true, v -> clicked[0] = true);
527172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
528172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        List<TextListItem> items = Arrays.asList(item0);
529e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
530e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
531e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        onView(withId(R.id.recycler_view)).perform(
532e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                actionOnItemAtPosition(0, clickChildViewWithId(R.id.action1)));
533e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertTrue(clicked[0]);
534e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
535e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
536e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
537e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testClickingBothSupplementalActions() {
538e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        final boolean[] clicked = {false, false};
539172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
540172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
541172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setActions("action 1", true, v -> clicked[0] = true,
542172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing                        "action 2", true, v -> clicked[1] = true);
543172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
544172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        List<TextListItem> items = Arrays.asList(item0);
545e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
546e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
547e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        onView(withId(R.id.recycler_view)).perform(
548e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                actionOnItemAtPosition(0, clickChildViewWithId(R.id.action1)));
549e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertTrue(clicked[0]);
550e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertFalse(clicked[1]);
551e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
552e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        onView(withId(R.id.recycler_view)).perform(
553e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                actionOnItemAtPosition(0, clickChildViewWithId(R.id.action2)));
554e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertTrue(clicked[1]);
555e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
556e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
557e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
558172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing    public void testCustomViewBinderBindsLast() {
559e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        final String updatedTitle = "updated title";
560172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
561172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
562172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setTitle("original title");
563172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.addViewBinder((viewHolder) -> viewHolder.getTitle().setText(updatedTitle));
564172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
565172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        List<TextListItem> items = Arrays.asList(item0);
566e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
567e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
5684e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing        TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0);
569e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getTitle().getText(), is(equalTo(updatedTitle)));
570e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
571e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
572e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
573e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testCustomViewBinderOnUnusedViewsHasNoEffect() {
574172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
575172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.addViewBinder((viewHolder) -> viewHolder.getBody().setText("text"));
576172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
577172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        List<TextListItem> items = Arrays.asList(item0);
578e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
579e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
5804e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing        TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0);
581e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getBody().getVisibility(), is(equalTo(View.GONE)));
582e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        // Custom binder interacts with body but has no effect.
583e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        // Expect card height to remain single line.
584e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat((double) viewHolder.itemView.getHeight(), is(closeTo(
585e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                InstrumentationRegistry.getContext().getResources().getDimension(
586e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        R.dimen.car_single_line_list_item_height), 1.0d)));
587e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
588e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
589e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
590e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testSettingTitleOrBodyAsPrimaryText() {
591e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        // Create 2 items, one with Title as primary (default) and one with Body.
592e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        // The primary text, regardless of view, should have consistent look (as primary).
593172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
594172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setTitle("title");
595172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setBody("body");
596172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
597172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item1 = new TextListItem(mActivity);
598172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item1.setTitle("title");
599172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item1.setBody("body", true);
600172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
601172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        List<TextListItem> items = Arrays.asList(item0, item1);
602e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
603e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
6044e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing        TextListItem.ViewHolder titlePrimary = getViewHolderAtPosition(0);
6054e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing        TextListItem.ViewHolder bodyPrimary = getViewHolderAtPosition(1);
606e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(titlePrimary.getTitle().getTextSize(),
607e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                is(equalTo(bodyPrimary.getBody().getTextSize())));
608e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(titlePrimary.getTitle().getTextColors(),
609e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                is(equalTo(bodyPrimary.getBody().getTextColors())));
610e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
611e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
612a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing    @Test
613a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing    public void testNoCarriedOverLayoutParamsForTextView() throws Throwable {
614172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem singleLine = new TextListItem(mActivity);
615172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        singleLine.setTitle("title");
616172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
617a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        setupPagedListView(Arrays.asList(singleLine));
618a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing
619a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        // Manually rebind the view holder of a single line item to a double line item.
620172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem doubleLine = new TextListItem(mActivity);
621172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        doubleLine.setTitle("title");
622172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        doubleLine.setBody("body");
6234e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing        TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0);
624a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        mActivityRule.runOnUiThread(() -> doubleLine.bind(viewHolder));
625a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing
626a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        RelativeLayout.LayoutParams titleLayoutParams =
627a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing                (RelativeLayout.LayoutParams) viewHolder.getTitle().getLayoutParams();
628a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        RelativeLayout.LayoutParams bodyLayoutParams =
629a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing                (RelativeLayout.LayoutParams) viewHolder.getTitle().getLayoutParams();
630a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        assertThat(titleLayoutParams.getRule(RelativeLayout.CENTER_VERTICAL), is(equalTo(0)));
631a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        assertThat(bodyLayoutParams.getRule(RelativeLayout.CENTER_VERTICAL), is(equalTo(0)));
632a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing    }
633a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing
634a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing    @Test
635a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing    public void testNoCarriedOverLayoutParamsForPrimaryIcon() throws Throwable {
636172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem smallIcon = new TextListItem(mActivity);
637172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        smallIcon.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon, false);
638172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        smallIcon.setBody("body");  // Small icon of items with body text should use top margin.
639a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        setupPagedListView(Arrays.asList(smallIcon));
640a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing
641a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        // Manually rebind the view holder.
642172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem largeIcon = new TextListItem(mActivity);
643172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        largeIcon.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon, true);
6444e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing        TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0);
645a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        mActivityRule.runOnUiThread(() -> largeIcon.bind(viewHolder));
646a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing
647a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        RelativeLayout.LayoutParams iconLayoutParams =
648a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing                (RelativeLayout.LayoutParams) viewHolder.getPrimaryIcon().getLayoutParams();
649a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        assertThat(iconLayoutParams.getRule(RelativeLayout.CENTER_VERTICAL),
650a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing                is(equalTo(RelativeLayout.TRUE)));
651a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        assertThat(iconLayoutParams.topMargin, is(equalTo(0)));
652a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing    }
653a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing
654172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing    @Test
655172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing    public void testUpdateItem() throws Throwable {
656172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item = new TextListItem(mActivity);
657172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        setupPagedListView(Arrays.asList(item));
658172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
659172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        String title = "updated title";
660172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item.setTitle(title);
661172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        mActivityRule.runOnUiThread(() -> mPagedListView.getAdapter().notifyItemChanged(0));
662172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
663172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        // Wait for paged list view to layout by using espresso to scroll to a position.
664172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        onView(withId(R.id.recycler_view)).perform(scrollToPosition(0));
665172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
666172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0);
667172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        assertThat(viewHolder.getTitle().getText(), is(equalTo(title)));
668172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing    }
669172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
670e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    private static ViewAction clickChildViewWithId(final int id) {
671e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        return new ViewAction() {
672e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            @Override
673e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            public Matcher<View> getConstraints() {
674e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                return null;
675e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            }
676e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
677e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            @Override
678e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            public String getDescription() {
679e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                return "Click on a child view with specific id.";
680e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            }
681e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
682e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            @Override
683e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            public void perform(UiController uiController, View view) {
684e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                View v = view.findViewById(id);
685e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                v.performClick();
686e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            }
687e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        };
688e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
689e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing}
690