TextListItemTest.java revision 20e9f85df9325d7dc79750be2527bd8dd1c38fcb
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;
4120e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxingimport android.text.TextUtils;
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() {
113172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item = new TextListItem(mActivity);
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() {
120172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
121172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon, true);
122172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
123172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item1 = new TextListItem(mActivity);
124172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item1.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon, false);
125172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
126172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        List<TextListItem> items = Arrays.asList(item0, item1);
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() {
137172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
138172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setTitle("title");
139172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
140172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item1 = new TextListItem(mActivity);
141172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item1.setBody("body");
142172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
143172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        List<TextListItem> items = Arrays.asList(item0, item1);
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() {
154172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
155172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setSupplementalIcon(android.R.drawable.sym_def_app_icon, true);
156172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
157172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item1 = new TextListItem(mActivity);
158172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item1.setAction("text", true, v -> { /* Do nothing. */ });
159172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
160172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
161172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item2 = new TextListItem(mActivity);
162172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item2.setActions("text", true, v -> { /* Do nothing. */ },
163172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing                        "text", true, v -> { /* Do nothing. */ });
164172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
165172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        List<TextListItem> items = Arrays.asList(item0, item1, item2);
166e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
167e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
1684e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing        TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0);
169e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getSupplementalIcon().getVisibility(), is(equalTo(View.VISIBLE)));
170e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getSupplementalIconDivider().getVisibility(),
171e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                is(equalTo(View.VISIBLE)));
172e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
173e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        viewHolder = getViewHolderAtPosition(1);
174e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getAction1().getVisibility(), is(equalTo(View.VISIBLE)));
175e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getAction1Divider().getVisibility(), is(equalTo(View.VISIBLE)));
176e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
177e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        viewHolder = getViewHolderAtPosition(2);
178e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getAction1().getVisibility(), is(equalTo(View.VISIBLE)));
179e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getAction1Divider().getVisibility(), is(equalTo(View.VISIBLE)));
180e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getAction2().getVisibility(), is(equalTo(View.VISIBLE)));
181e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getAction2Divider().getVisibility(), is(equalTo(View.VISIBLE)));
182e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
183e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
184e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
18522037e659c30185f51f522e1761236f780334c9dYao, Yuxing    public void testSwitchVisibleAndCheckedState() {
186172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
187172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setSwitch(true, true, null);
188172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
189172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item1 = new TextListItem(mActivity);
190172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item1.setSwitch(false, true, null);
191172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
192172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        List<TextListItem> items = Arrays.asList(item0, item1);
19322037e659c30185f51f522e1761236f780334c9dYao, Yuxing        setupPagedListView(items);
19422037e659c30185f51f522e1761236f780334c9dYao, Yuxing
1954e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing        TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0);
19622037e659c30185f51f522e1761236f780334c9dYao, Yuxing        assertThat(viewHolder.getSwitch().getVisibility(), is(equalTo(View.VISIBLE)));
19722037e659c30185f51f522e1761236f780334c9dYao, Yuxing        assertThat(viewHolder.getSwitch().isChecked(), is(equalTo(true)));
19822037e659c30185f51f522e1761236f780334c9dYao, Yuxing        assertThat(viewHolder.getSwitchDivider().getVisibility(), is(equalTo(View.VISIBLE)));
19922037e659c30185f51f522e1761236f780334c9dYao, Yuxing
20022037e659c30185f51f522e1761236f780334c9dYao, Yuxing        viewHolder = getViewHolderAtPosition(1);
20122037e659c30185f51f522e1761236f780334c9dYao, Yuxing        assertThat(viewHolder.getSwitch().getVisibility(), is(equalTo(View.VISIBLE)));
20222037e659c30185f51f522e1761236f780334c9dYao, Yuxing        assertThat(viewHolder.getSwitch().isChecked(), is(equalTo(false)));
20322037e659c30185f51f522e1761236f780334c9dYao, Yuxing        assertThat(viewHolder.getSwitchDivider().getVisibility(), is(equalTo(View.VISIBLE)));
20422037e659c30185f51f522e1761236f780334c9dYao, Yuxing    }
20522037e659c30185f51f522e1761236f780334c9dYao, Yuxing
20622037e659c30185f51f522e1761236f780334c9dYao, Yuxing    @Test
207e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testDividersAreOptional() {
208172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
209172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setSupplementalIcon(android.R.drawable.sym_def_app_icon, false);
210172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
211172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item1 = new TextListItem(mActivity);
212172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item1.setAction("text", false, v -> { /* Do nothing. */ });
213172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
214172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item2 = new TextListItem(mActivity);
215172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item2.setActions("text", false, v -> { /* Do nothing. */ },
216172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing                "text", false, v -> { /* Do nothing. */ });
217172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
218172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item3 = new TextListItem(mActivity);
219172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item3.setSwitch(true, false, null);
220172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
221172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        List<TextListItem> items = Arrays.asList(item0, item1, item2, item3);
222e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
223e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
2244e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing        TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0);
225e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getSupplementalIcon().getVisibility(), is(equalTo(View.VISIBLE)));
226e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getSupplementalIconDivider().getVisibility(),
227e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                is(equalTo(View.GONE)));
228e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
229e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        viewHolder = getViewHolderAtPosition(1);
230e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getAction1().getVisibility(), is(equalTo(View.VISIBLE)));
231e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getAction1Divider().getVisibility(), is(equalTo(View.GONE)));
232e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
233e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        viewHolder = getViewHolderAtPosition(2);
234e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getAction1().getVisibility(), is(equalTo(View.VISIBLE)));
235e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getAction1Divider().getVisibility(), is(equalTo(View.GONE)));
236e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getAction2().getVisibility(), is(equalTo(View.VISIBLE)));
237e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getAction2Divider().getVisibility(), is(equalTo(View.GONE)));
23822037e659c30185f51f522e1761236f780334c9dYao, Yuxing
23922037e659c30185f51f522e1761236f780334c9dYao, Yuxing        viewHolder = getViewHolderAtPosition(3);
24022037e659c30185f51f522e1761236f780334c9dYao, Yuxing        assertThat(viewHolder.getSwitch().getVisibility(), is(equalTo(View.VISIBLE)));
24122037e659c30185f51f522e1761236f780334c9dYao, Yuxing        assertThat(viewHolder.getSwitchDivider().getVisibility(), is(equalTo(View.GONE)));
242e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
243e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
244e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
245172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing    public void testTextStartMarginMatchesPrimaryActionType() {
246172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
247172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon, true);
2489b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana
249172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item1 = new TextListItem(mActivity);
250172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item1.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon, false);
2519b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana
252172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item2 = new TextListItem(mActivity);
253172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item2.setPrimaryActionEmptyIcon();
2549b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana
255172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item3 = new TextListItem(mActivity);
256172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item3.setPrimaryActionNoIcon();
257172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
258172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        List<TextListItem> items = Arrays.asList(item0, item1, item2, item3);
259e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        List<Integer> expectedStartMargin = Arrays.asList(R.dimen.car_keyline_4,
260e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                R.dimen.car_keyline_3, R.dimen.car_keyline_3, R.dimen.car_keyline_1);
261e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
262e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
263e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        for (int i = 0; i < items.size(); i++) {
2644e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing            TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(i);
265e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
266e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            int expected = InstrumentationRegistry.getContext().getResources()
267e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                    .getDimensionPixelSize(expectedStartMargin.get(i));
268e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            assertThat(((ViewGroup.MarginLayoutParams) viewHolder.getTitle().getLayoutParams())
269e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                    .getMarginStart(), is(equalTo(expected)));
270e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            assertThat(((ViewGroup.MarginLayoutParams) viewHolder.getBody().getLayoutParams())
271e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                    .getMarginStart(), is(equalTo(expected)));
272e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        }
273e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
274e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
275e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
276e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testItemWithOnlyTitleIsSingleLine() {
277172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        // Only space.
278172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
279172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setTitle(" ");
280172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
281172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        // Underscore.
282172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item1 = new TextListItem(mActivity);
283172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item1.setTitle("______");
284172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
285172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item2 = new TextListItem(mActivity);
286172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item2.setTitle("ALL UPPER CASE");
287172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
288172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        // String wouldn't fit in one line.
289172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item3 = new TextListItem(mActivity);
290172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item3.setTitle(InstrumentationRegistry.getContext().getResources().getString(
291172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing                R.string.over_120_chars));
292172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
293172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        List<TextListItem> items = Arrays.asList(item0, item1, item2, item3);
294e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
295e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
296e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        double singleLineHeight = InstrumentationRegistry.getContext().getResources().getDimension(
297e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                R.dimen.car_single_line_list_item_height);
298e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
299b226d4dcc396fe8837876dfa113143702dd23c26Anthony Chen        LinearLayoutManager layoutManager =
300b226d4dcc396fe8837876dfa113143702dd23c26Anthony Chen                (LinearLayoutManager) mPagedListView.getRecyclerView().getLayoutManager();
301e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        for (int i = 0; i < items.size(); i++) {
302b226d4dcc396fe8837876dfa113143702dd23c26Anthony Chen            assertThat((double) layoutManager.findViewByPosition(i).getHeight(),
303e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                    is(closeTo(singleLineHeight, 1.0d)));
304e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        }
305e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
306e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
307e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
308e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testItemWithBodyTextIsAtLeastDoubleLine() {
309172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        // Only space.
310172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
311172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setBody(" ");
312172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
313172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        // Underscore.
314172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item1 = new TextListItem(mActivity);
315172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item1.setBody("____");
316172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
317172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        // String wouldn't fit in one line.
318172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item2 = new TextListItem(mActivity);
319172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item2.setBody(InstrumentationRegistry.getContext().getResources().getString(
320172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing                R.string.over_120_chars));
321172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
322172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        List<TextListItem> items = Arrays.asList(item0, item1, item2);
323e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
324e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
325e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        final int doubleLineHeight =
326e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                (int) InstrumentationRegistry.getContext().getResources().getDimension(
327e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        R.dimen.car_double_line_list_item_height);
328e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
329b226d4dcc396fe8837876dfa113143702dd23c26Anthony Chen        LinearLayoutManager layoutManager =
330b226d4dcc396fe8837876dfa113143702dd23c26Anthony Chen                (LinearLayoutManager) mPagedListView.getRecyclerView().getLayoutManager();
331e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        for (int i = 0; i < items.size(); i++) {
332b226d4dcc396fe8837876dfa113143702dd23c26Anthony Chen            assertThat(layoutManager.findViewByPosition(i).getHeight(),
333e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                    is(greaterThanOrEqualTo(doubleLineHeight)));
334e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        }
335e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
336e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
337e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
338e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testBodyTextLengthLimit() {
339e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        final String longText = InstrumentationRegistry.getContext().getResources().getString(
340e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                R.string.over_120_chars);
341e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        final int limit = InstrumentationRegistry.getContext().getResources().getInteger(
342e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                R.integer.car_list_item_text_length_limit);
343172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
344172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
345172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setBody(longText);
346172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
347172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        List<TextListItem> items = Arrays.asList(item0);
348e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
349e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
350e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        // + 1 for appended ellipsis.
351e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(getViewHolderAtPosition(0).getBody().getText().length(),
352e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                is(equalTo(limit + 1)));
353e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
354e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
355e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
356e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testPrimaryIconDrawable() {
357e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        Drawable drawable = InstrumentationRegistry.getContext().getResources().getDrawable(
358e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                android.R.drawable.sym_def_app_icon, null);
359172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
360172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
361172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setPrimaryActionIcon(drawable, true);
362172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
363172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        List<TextListItem> items = Arrays.asList(item0);
364e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
365e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
366e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertTrue(getViewHolderAtPosition(0).getPrimaryIcon().getDrawable().getConstantState()
367e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                .equals(drawable.getConstantState()));
368e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
369e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
370e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
371e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testLargePrimaryIconHasNoStartMargin() {
372172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
373172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon, true);
374172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
375172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        List<TextListItem> items = Arrays.asList(item0);
376e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
377e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
3784e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing        TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0);
379e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(((ViewGroup.MarginLayoutParams) viewHolder.getPrimaryIcon().getLayoutParams())
380e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                .getMarginStart(), is(equalTo(0)));
381e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
382e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
383e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
384e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testSmallPrimaryIconStartMargin() {
385172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
386172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon, false);
387172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
388172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        List<TextListItem> items = Arrays.asList(item0);
389e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
390e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
391e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        int expected = InstrumentationRegistry.getContext().getResources().getDimensionPixelSize(
392e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                R.dimen.car_keyline_1);
393e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
3944e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing        TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0);
395e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(((ViewGroup.MarginLayoutParams) viewHolder.getPrimaryIcon().getLayoutParams())
396e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                .getMarginStart(), is(equalTo(expected)));
397e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
398e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
399e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
4005dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing    public void testSmallPrimaryIconTopMarginRemainsTheSameRegardlessOfTextLength() {
4015dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing        final String longText = InstrumentationRegistry.getContext().getResources().getString(
4025dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing                R.string.over_120_chars);
403172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
404172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        // Single line item.
405172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
406172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon, false);
407172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setTitle("one line text");
408172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
409172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        // Double line item with one line text.
410172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item1 = new TextListItem(mActivity);
411172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item1.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon, false);
412172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item1.setTitle("one line text");
413172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item1.setBody("one line text");
414172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
415172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        // Double line item with long text.
416172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item2 = new TextListItem(mActivity);
417172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item2.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon, false);
418172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item2.setTitle("one line text");
419172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item2.setBody(longText);
420172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
421172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        // Body text only - long text.
422172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item3 = new TextListItem(mActivity);
423172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item3.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon, false);
424172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item3.setBody(longText);
425172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
426172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        // Body text only - one line text.
427172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item4 = new TextListItem(mActivity);
428172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item4.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon, false);
429172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item4.setBody("one line text");
430172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
431172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        List<TextListItem> items = Arrays.asList(item0, item1, item2, item3, item4);
4325dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing        setupPagedListView(items);
4335dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing
4345dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing        for (int i = 1; i < items.size(); i++) {
4355dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing            onView(withId(R.id.recycler_view)).perform(scrollToPosition(i));
4365dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing            // Implementation uses integer division so it may be off by 1 vs centered vertically.
4375dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing            assertThat((double) getViewHolderAtPosition(i - 1).getPrimaryIcon().getTop(),
4385dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing                    is(closeTo(
4395dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing                    (double) getViewHolderAtPosition(i).getPrimaryIcon().getTop(), 1.0d)));
4405dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing        }
4415dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing    }
4425dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing
4435dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing    @Test
444e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testClickingPrimaryActionIsSeparateFromSupplementalAction() {
445e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        final boolean[] clicked = {false, false};
446172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
447172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
448172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setOnClickListener(v -> clicked[0] = true);
449172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setSupplementalIcon(android.R.drawable.sym_def_app_icon, true,
450172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing                v -> clicked[1] = true);
451172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
452172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        List<TextListItem> items = Arrays.asList(item0);
453e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
454e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
455e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        onView(withId(R.id.recycler_view)).perform(actionOnItemAtPosition(0, click()));
456e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertTrue(clicked[0]);
457e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertFalse(clicked[1]);
458e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
459e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        onView(withId(R.id.recycler_view)).perform(
460e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                actionOnItemAtPosition(0, clickChildViewWithId(R.id.supplemental_icon)));
461e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertTrue(clicked[1]);
462e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
463e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
464e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
465e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testClickingSupplementalIcon() {
466e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        final boolean[] clicked = {false};
467172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
468172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
469172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setSupplementalIcon(android.R.drawable.sym_def_app_icon, true,
470172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing                v -> clicked[0] = true);
471172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
472172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        List<TextListItem> items = Arrays.asList(item0);
473e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
474e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
475e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        onView(withId(R.id.recycler_view)).perform(
476e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                actionOnItemAtPosition(0, clickChildViewWithId(R.id.supplemental_icon)));
477e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertTrue(clicked[0]);
478e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
479e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
480e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
481439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing    public void testSupplementalIconWithoutClickListenerIsNotClickable() {
482172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
483172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setSupplementalIcon(android.R.drawable.sym_def_app_icon, true);
484172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
485172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        List<TextListItem> items = Arrays.asList(item0);
486439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing        setupPagedListView(items);
487439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing
4884e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing        TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0);
489439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing        assertFalse(viewHolder.getSupplementalIcon().isClickable());
490439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing    }
491439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing
492439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing    @Test
49322037e659c30185f51f522e1761236f780334c9dYao, Yuxing    public void testCheckingSwitch() {
49422037e659c30185f51f522e1761236f780334c9dYao, Yuxing        final boolean[] clicked = {false, false};
495172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
496172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
497172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setSwitch(false, false, (button, isChecked) -> {
498172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing            // Initial value is false.
499172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing            assertTrue(isChecked);
500172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing            clicked[0] = true;
501172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        });
502172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
503172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item1 = new TextListItem(mActivity);
504172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item1.setSwitch(true, false, (button, isChecked) -> {
505172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing            // Initial value is true.
506172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing            assertFalse(isChecked);
507172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing            clicked[1] = true;
508172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        });
509172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
510172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        List<TextListItem> items = Arrays.asList(item0, item1);
51122037e659c30185f51f522e1761236f780334c9dYao, Yuxing        setupPagedListView(items);
51222037e659c30185f51f522e1761236f780334c9dYao, Yuxing
51322037e659c30185f51f522e1761236f780334c9dYao, Yuxing        onView(withId(R.id.recycler_view)).perform(
51422037e659c30185f51f522e1761236f780334c9dYao, Yuxing                actionOnItemAtPosition(0, clickChildViewWithId(R.id.switch_widget)));
51522037e659c30185f51f522e1761236f780334c9dYao, Yuxing        assertTrue(clicked[0]);
51622037e659c30185f51f522e1761236f780334c9dYao, Yuxing
51722037e659c30185f51f522e1761236f780334c9dYao, Yuxing        onView(withId(R.id.recycler_view)).perform(
51822037e659c30185f51f522e1761236f780334c9dYao, Yuxing                actionOnItemAtPosition(1, clickChildViewWithId(R.id.switch_widget)));
51922037e659c30185f51f522e1761236f780334c9dYao, Yuxing        assertTrue(clicked[1]);
52022037e659c30185f51f522e1761236f780334c9dYao, Yuxing    }
52122037e659c30185f51f522e1761236f780334c9dYao, Yuxing
52222037e659c30185f51f522e1761236f780334c9dYao, Yuxing    @Test
523e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testClickingSupplementalAction() {
524e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        final boolean[] clicked = {false};
525172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
526172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
527172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setAction("action", true, v -> clicked[0] = true);
528172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
529172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        List<TextListItem> items = Arrays.asList(item0);
530e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
531e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
532e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        onView(withId(R.id.recycler_view)).perform(
533e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                actionOnItemAtPosition(0, clickChildViewWithId(R.id.action1)));
534e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertTrue(clicked[0]);
535e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
536e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
537e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
538e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testClickingBothSupplementalActions() {
539e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        final boolean[] clicked = {false, false};
540172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
541172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
542172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setActions("action 1", true, v -> clicked[0] = true,
543172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing                        "action 2", true, v -> clicked[1] = true);
544172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
545172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        List<TextListItem> items = Arrays.asList(item0);
546e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
547e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
548e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        onView(withId(R.id.recycler_view)).perform(
549e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                actionOnItemAtPosition(0, clickChildViewWithId(R.id.action1)));
550e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertTrue(clicked[0]);
551e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertFalse(clicked[1]);
552e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
553e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        onView(withId(R.id.recycler_view)).perform(
554e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                actionOnItemAtPosition(0, clickChildViewWithId(R.id.action2)));
555e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertTrue(clicked[1]);
556e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
557e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
558e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
559172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing    public void testCustomViewBinderBindsLast() {
560e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        final String updatedTitle = "updated title";
561172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
562172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
563172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setTitle("original title");
564172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.addViewBinder((viewHolder) -> viewHolder.getTitle().setText(updatedTitle));
565172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
566172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        List<TextListItem> items = Arrays.asList(item0);
567e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
568e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
5694e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing        TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0);
570e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getTitle().getText(), is(equalTo(updatedTitle)));
571e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
572e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
573e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
574e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testCustomViewBinderOnUnusedViewsHasNoEffect() {
575172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
576172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.addViewBinder((viewHolder) -> viewHolder.getBody().setText("text"));
577172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
578172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        List<TextListItem> items = Arrays.asList(item0);
579e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
580e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
5814e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing        TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0);
582e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getBody().getVisibility(), is(equalTo(View.GONE)));
583e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        // Custom binder interacts with body but has no effect.
584e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        // Expect card height to remain single line.
585e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat((double) viewHolder.itemView.getHeight(), is(closeTo(
586e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                InstrumentationRegistry.getContext().getResources().getDimension(
587e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        R.dimen.car_single_line_list_item_height), 1.0d)));
588e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
589e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
590e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
59120e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing    public void testRevertingViewBinder() throws Throwable {
59220e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
59320e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing        item0.setBody("one item");
59420e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing        item0.addViewBinder(
59520e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing                (viewHolder) -> viewHolder.getBody().setEllipsize(TextUtils.TruncateAt.END),
59620e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing                (viewHolder -> viewHolder.getBody().setEllipsize(null)));
59720e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing
59820e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing        List<TextListItem> items = Arrays.asList(item0);
59920e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing        setupPagedListView(items);
60020e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing
60120e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing        TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0);
60220e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing
60320e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing        // Bind view holder to a new item - the customization made by item0 should be reverted.
60420e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing        TextListItem item1 = new TextListItem(mActivity);
60520e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing        item1.setBody("new item");
60620e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing        mActivityRule.runOnUiThread(() -> item1.bind(viewHolder));
60720e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing
60820e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing        assertThat(viewHolder.getBody().getEllipsize(), is(equalTo(null)));
60920e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing    }
61020e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing
61120e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing    @Test
61220e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing    public void testRemovingViewBinder() {
61320e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
61420e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing        item0.setBody("one item");
61520e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing        ListItem.ViewBinder<TextListItem.ViewHolder> binder =
61620e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing                (viewHolder) -> viewHolder.getTitle().setEllipsize(TextUtils.TruncateAt.END);
61720e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing        item0.addViewBinder(binder);
61820e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing
61920e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing        assertTrue(item0.removeViewBinder(binder));
62020e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing
62120e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing        List<TextListItem> items = Arrays.asList(item0);
62220e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing        setupPagedListView(items);
62320e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing
62420e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing        assertThat(getViewHolderAtPosition(0).getBody().getEllipsize(), is(equalTo(null)));
62520e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing    }
62620e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing
62720e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing    @Test
628e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testSettingTitleOrBodyAsPrimaryText() {
629e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        // Create 2 items, one with Title as primary (default) and one with Body.
630e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        // The primary text, regardless of view, should have consistent look (as primary).
631172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
632172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setTitle("title");
633172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setBody("body");
634172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
635172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item1 = new TextListItem(mActivity);
636172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item1.setTitle("title");
637172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item1.setBody("body", true);
638172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
639172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        List<TextListItem> items = Arrays.asList(item0, item1);
640e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
641e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
6424e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing        TextListItem.ViewHolder titlePrimary = getViewHolderAtPosition(0);
6434e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing        TextListItem.ViewHolder bodyPrimary = getViewHolderAtPosition(1);
644e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(titlePrimary.getTitle().getTextSize(),
645e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                is(equalTo(bodyPrimary.getBody().getTextSize())));
646e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(titlePrimary.getTitle().getTextColors(),
647e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                is(equalTo(bodyPrimary.getBody().getTextColors())));
648e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
649e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
650a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing    @Test
651a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing    public void testNoCarriedOverLayoutParamsForTextView() throws Throwable {
652172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem singleLine = new TextListItem(mActivity);
653172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        singleLine.setTitle("title");
654172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
655a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        setupPagedListView(Arrays.asList(singleLine));
656a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing
657a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        // Manually rebind the view holder of a single line item to a double line item.
658172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem doubleLine = new TextListItem(mActivity);
659172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        doubleLine.setTitle("title");
660172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        doubleLine.setBody("body");
6614e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing        TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0);
662a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        mActivityRule.runOnUiThread(() -> doubleLine.bind(viewHolder));
663a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing
664a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        RelativeLayout.LayoutParams titleLayoutParams =
665a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing                (RelativeLayout.LayoutParams) viewHolder.getTitle().getLayoutParams();
666a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        RelativeLayout.LayoutParams bodyLayoutParams =
667a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing                (RelativeLayout.LayoutParams) viewHolder.getTitle().getLayoutParams();
668a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        assertThat(titleLayoutParams.getRule(RelativeLayout.CENTER_VERTICAL), is(equalTo(0)));
669a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        assertThat(bodyLayoutParams.getRule(RelativeLayout.CENTER_VERTICAL), is(equalTo(0)));
670a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing    }
671a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing
672a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing    @Test
673a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing    public void testNoCarriedOverLayoutParamsForPrimaryIcon() throws Throwable {
674172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem smallIcon = new TextListItem(mActivity);
675172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        smallIcon.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon, false);
676172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        smallIcon.setBody("body");  // Small icon of items with body text should use top margin.
677a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        setupPagedListView(Arrays.asList(smallIcon));
678a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing
679a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        // Manually rebind the view holder.
680172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem largeIcon = new TextListItem(mActivity);
681172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        largeIcon.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon, true);
6824e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing        TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0);
683a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        mActivityRule.runOnUiThread(() -> largeIcon.bind(viewHolder));
684a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing
685a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        RelativeLayout.LayoutParams iconLayoutParams =
686a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing                (RelativeLayout.LayoutParams) viewHolder.getPrimaryIcon().getLayoutParams();
687a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        assertThat(iconLayoutParams.getRule(RelativeLayout.CENTER_VERTICAL),
688a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing                is(equalTo(RelativeLayout.TRUE)));
689a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        assertThat(iconLayoutParams.topMargin, is(equalTo(0)));
690a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing    }
691a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing
692172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing    @Test
693172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing    public void testUpdateItem() throws Throwable {
694172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item = new TextListItem(mActivity);
695172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        setupPagedListView(Arrays.asList(item));
696172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
697172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        String title = "updated title";
698172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item.setTitle(title);
699172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        mActivityRule.runOnUiThread(() -> mPagedListView.getAdapter().notifyItemChanged(0));
700172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
701172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        // Wait for paged list view to layout by using espresso to scroll to a position.
702172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        onView(withId(R.id.recycler_view)).perform(scrollToPosition(0));
703172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
704172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0);
705172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        assertThat(viewHolder.getTitle().getText(), is(equalTo(title)));
706172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing    }
707172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
708e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    private static ViewAction clickChildViewWithId(final int id) {
709e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        return new ViewAction() {
710e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            @Override
711e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            public Matcher<View> getConstraints() {
712e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                return null;
713e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            }
714e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
715e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            @Override
716e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            public String getDescription() {
717e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                return "Click on a child view with specific id.";
718e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            }
719e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
720e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            @Override
721e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            public void perform(UiController uiController, View view) {
722e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                View v = view.findViewById(id);
723e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                v.performClick();
724e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            }
725e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        };
726e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
727e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing}
728