TextListItemTest.java revision 32a32d76550734f2c35f5db5b53890d8a2589281
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
25a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxingimport static org.hamcrest.CoreMatchers.not;
26e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport static org.hamcrest.Matchers.greaterThanOrEqualTo;
273737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxingimport static org.hamcrest.Matchers.lessThan;
28e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport static org.hamcrest.core.Is.is;
29e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport static org.hamcrest.core.IsEqual.equalTo;
30e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport static org.hamcrest.number.IsCloseTo.closeTo;
3132a32d76550734f2c35f5db5b53890d8a2589281Yao, Yuxing
32fa39e2bca1b284ad7c931d9194287770b7b507faAurimas Liutikasimport static org.junit.Assert.assertFalse;
33e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport static org.junit.Assert.assertThat;
34e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport static org.junit.Assert.assertTrue;
35e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
363737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxingimport android.content.pm.PackageManager;
37e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport android.graphics.drawable.Drawable;
38e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport android.support.test.InstrumentationRegistry;
39e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport android.support.test.espresso.UiController;
40e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport android.support.test.espresso.ViewAction;
41e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport android.support.test.filters.SmallTest;
42e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport android.support.test.rule.ActivityTestRule;
43e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport android.support.test.runner.AndroidJUnit4;
443737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxingimport android.text.InputFilter;
4520e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxingimport android.text.TextUtils;
46e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport android.view.View;
47e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport android.view.ViewGroup;
48a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxingimport android.widget.RelativeLayout;
49e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
50e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport org.hamcrest.Matcher;
513737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxingimport org.junit.Assume;
52e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport org.junit.Before;
53e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport org.junit.Rule;
54e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport org.junit.Test;
55e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport org.junit.runner.RunWith;
56e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
57e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport java.util.ArrayList;
58e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport java.util.Arrays;
59e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport java.util.List;
603737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxingimport java.util.Locale;
61e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
62e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport androidx.car.test.R;
633737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxingimport androidx.car.utils.CarUxRestrictionsTestUtils;
6432a32d76550734f2c35f5db5b53890d8a2589281Yao, Yuxingimport androidx.recyclerview.widget.LinearLayoutManager;
65e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
66e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing/**
674e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing* Tests the layout configuration in {@link TextListItem}.
68e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing */
69e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing@RunWith(AndroidJUnit4.class)
70e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing@SmallTest
714e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxingpublic class TextListItemTest {
72e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
73e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Rule
74e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public ActivityTestRule<PagedListViewTestActivity> mActivityRule =
75e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            new ActivityTestRule<>(PagedListViewTestActivity.class);
76e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
77e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    private PagedListViewTestActivity mActivity;
78e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    private PagedListView mPagedListView;
79a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing    private ListItemAdapter mAdapter;
80e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
813737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing    private boolean isAutoDevice() {
823737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing        PackageManager packageManager = mActivityRule.getActivity().getPackageManager();
833737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing        return packageManager.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE);
843737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing    }
853737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing
86e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Before
87e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void setUp() {
883737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing        Assume.assumeTrue(isAutoDevice());
893737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing
90e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        mActivity = mActivityRule.getActivity();
91e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        mPagedListView = mActivity.findViewById(R.id.paged_list_view);
92e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
93e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
943737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing    private void refreshUi() {
953737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing        try {
963737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing            mActivityRule.runOnUiThread(() -> {
973737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing                mAdapter.notifyDataSetChanged();
983737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing            });
993737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing        } catch (Throwable throwable) {
1003737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing            throwable.printStackTrace();
1013737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing            throw new RuntimeException(throwable);
1023737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing        }
1033737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing        // Wait for paged list view to layout by using espresso to scroll to a position.
1043737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing        onView(withId(R.id.recycler_view)).perform(scrollToPosition(0));
1053737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing    }
1063737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing
1074e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing    private void setupPagedListView(List<TextListItem> items) {
108e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        ListItemProvider provider = new ListItemProvider.ListProvider(
109e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                new ArrayList<>(items));
110e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        try {
111a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing            mAdapter = new ListItemAdapter(mActivity, provider);
112e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            mActivityRule.runOnUiThread(() -> {
113a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing                mPagedListView.setAdapter(mAdapter);
114e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            });
115e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        } catch (Throwable throwable) {
116e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            throwable.printStackTrace();
117e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            throw new RuntimeException(throwable);
118e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        }
1193737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing
1203737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing        refreshUi();
121e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
122e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
123e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    private static void verifyViewIsHidden(View view) {
124e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        if (view instanceof ViewGroup) {
125e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            ViewGroup viewGroup = (ViewGroup) view;
126e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            final int childCount = viewGroup.getChildCount();
127e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            for (int i = 0; i < childCount; i++) {
128e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                verifyViewIsHidden(viewGroup.getChildAt(i));
129e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            }
130e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        } else {
131e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            assertThat(view.getVisibility(), is(equalTo(View.GONE)));
132e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        }
133e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
134e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
1354e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing    private TextListItem.ViewHolder getViewHolderAtPosition(int position) {
1364e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing        return (TextListItem.ViewHolder) mPagedListView.getRecyclerView()
137e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                .findViewHolderForAdapterPosition(
138e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                position);
139e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
140e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
141e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
142e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testEmptyItemHidesAllViews() {
143172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item = new TextListItem(mActivity);
144e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(Arrays.asList(item));
145b226d4dcc396fe8837876dfa113143702dd23c26Anthony Chen        verifyViewIsHidden(mPagedListView.getRecyclerView().getLayoutManager().getChildAt(0));
146e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
147e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
148e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
149e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testPrimaryActionVisible() {
150172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
151172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon, true);
152172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
153172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item1 = new TextListItem(mActivity);
154172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item1.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon, false);
155172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
156172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        List<TextListItem> items = Arrays.asList(item0, item1);
157e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
158e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
159e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(getViewHolderAtPosition(0).getPrimaryIcon().getVisibility(),
160e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                is(equalTo(View.VISIBLE)));
161e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(getViewHolderAtPosition(1).getPrimaryIcon().getVisibility(),
162e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                is(equalTo(View.VISIBLE)));
163e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
164e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
165e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
166e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testTextVisible() {
167172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
168172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setTitle("title");
169172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
170172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item1 = new TextListItem(mActivity);
171172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item1.setBody("body");
172172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
173172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        List<TextListItem> items = Arrays.asList(item0, item1);
174e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
175e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
176e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(getViewHolderAtPosition(0).getTitle().getVisibility(),
177e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                is(equalTo(View.VISIBLE)));
178e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(getViewHolderAtPosition(1).getBody().getVisibility(),
179e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                is(equalTo(View.VISIBLE)));
180e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
181e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
182e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
183e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testSupplementalActionVisible() {
184172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
185172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setSupplementalIcon(android.R.drawable.sym_def_app_icon, true);
186172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
187172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item1 = new TextListItem(mActivity);
188172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item1.setAction("text", true, v -> { /* Do nothing. */ });
189172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
190172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
191172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item2 = new TextListItem(mActivity);
192172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item2.setActions("text", true, v -> { /* Do nothing. */ },
193172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing                        "text", true, v -> { /* Do nothing. */ });
194172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
195172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        List<TextListItem> items = Arrays.asList(item0, item1, item2);
196e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
197e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
1984e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing        TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0);
199e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getSupplementalIcon().getVisibility(), is(equalTo(View.VISIBLE)));
200e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getSupplementalIconDivider().getVisibility(),
201e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                is(equalTo(View.VISIBLE)));
202e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
203e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        viewHolder = getViewHolderAtPosition(1);
204e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getAction1().getVisibility(), is(equalTo(View.VISIBLE)));
205e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getAction1Divider().getVisibility(), is(equalTo(View.VISIBLE)));
206e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
207e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        viewHolder = getViewHolderAtPosition(2);
208e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getAction1().getVisibility(), is(equalTo(View.VISIBLE)));
209e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getAction1Divider().getVisibility(), is(equalTo(View.VISIBLE)));
210e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getAction2().getVisibility(), is(equalTo(View.VISIBLE)));
211e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getAction2Divider().getVisibility(), is(equalTo(View.VISIBLE)));
212e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
213e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
214e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
21522037e659c30185f51f522e1761236f780334c9dYao, Yuxing    public void testSwitchVisibleAndCheckedState() {
216172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
217172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setSwitch(true, true, null);
218172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
219172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item1 = new TextListItem(mActivity);
220172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item1.setSwitch(false, true, null);
221172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
222172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        List<TextListItem> items = Arrays.asList(item0, item1);
22322037e659c30185f51f522e1761236f780334c9dYao, Yuxing        setupPagedListView(items);
22422037e659c30185f51f522e1761236f780334c9dYao, Yuxing
2254e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing        TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0);
22622037e659c30185f51f522e1761236f780334c9dYao, Yuxing        assertThat(viewHolder.getSwitch().getVisibility(), is(equalTo(View.VISIBLE)));
22722037e659c30185f51f522e1761236f780334c9dYao, Yuxing        assertThat(viewHolder.getSwitch().isChecked(), is(equalTo(true)));
22822037e659c30185f51f522e1761236f780334c9dYao, Yuxing        assertThat(viewHolder.getSwitchDivider().getVisibility(), is(equalTo(View.VISIBLE)));
22922037e659c30185f51f522e1761236f780334c9dYao, Yuxing
23022037e659c30185f51f522e1761236f780334c9dYao, Yuxing        viewHolder = getViewHolderAtPosition(1);
23122037e659c30185f51f522e1761236f780334c9dYao, Yuxing        assertThat(viewHolder.getSwitch().getVisibility(), is(equalTo(View.VISIBLE)));
23222037e659c30185f51f522e1761236f780334c9dYao, Yuxing        assertThat(viewHolder.getSwitch().isChecked(), is(equalTo(false)));
23322037e659c30185f51f522e1761236f780334c9dYao, Yuxing        assertThat(viewHolder.getSwitchDivider().getVisibility(), is(equalTo(View.VISIBLE)));
23422037e659c30185f51f522e1761236f780334c9dYao, Yuxing    }
235a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing
236a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing    @Test
237a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing    public void testSetSwitchState() {
238a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
239a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing        item0.setSwitch(true, true, null);
240a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing
241a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing        setupPagedListView(Arrays.asList(item0));
242a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing
243a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing        item0.setSwitchState(false);
2443737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing
2453737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing        refreshUi();
246a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing
247a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing        TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0);
248a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing        assertThat(viewHolder.getSwitch().getVisibility(), is(equalTo(View.VISIBLE)));
249a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing        assertThat(viewHolder.getSwitch().isChecked(), is(equalTo(false)));
250a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing    }
251a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing
252a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing    @Test
253a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing    public void testSetSwitchStateHasNoEffectIfSwitchIsNotEnabled() {
254a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
255a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing        setupPagedListView(Arrays.asList(item0));
256a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing
257a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing        item0.setSwitchState(false);
2583737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing
2593737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing        refreshUi();
260a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing
261a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing        TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0);
262a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing        assertThat(viewHolder.getSwitch().getVisibility(), is(not(equalTo(View.VISIBLE))));
263a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing    }
26422037e659c30185f51f522e1761236f780334c9dYao, Yuxing
26522037e659c30185f51f522e1761236f780334c9dYao, Yuxing    @Test
266e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testDividersAreOptional() {
267172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
268172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setSupplementalIcon(android.R.drawable.sym_def_app_icon, false);
269172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
270172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item1 = new TextListItem(mActivity);
271172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item1.setAction("text", false, v -> { /* Do nothing. */ });
272172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
273172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item2 = new TextListItem(mActivity);
274172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item2.setActions("text", false, v -> { /* Do nothing. */ },
275172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing                "text", false, v -> { /* Do nothing. */ });
276172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
277172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item3 = new TextListItem(mActivity);
278172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item3.setSwitch(true, false, null);
279172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
280172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        List<TextListItem> items = Arrays.asList(item0, item1, item2, item3);
281e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
282e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
2834e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing        TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0);
284e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getSupplementalIcon().getVisibility(), is(equalTo(View.VISIBLE)));
285e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getSupplementalIconDivider().getVisibility(),
286e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                is(equalTo(View.GONE)));
287e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
288e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        viewHolder = getViewHolderAtPosition(1);
289e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getAction1().getVisibility(), is(equalTo(View.VISIBLE)));
290e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getAction1Divider().getVisibility(), is(equalTo(View.GONE)));
291e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
292e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        viewHolder = getViewHolderAtPosition(2);
293e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getAction1().getVisibility(), is(equalTo(View.VISIBLE)));
294e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getAction1Divider().getVisibility(), is(equalTo(View.GONE)));
295e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getAction2().getVisibility(), is(equalTo(View.VISIBLE)));
296e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getAction2Divider().getVisibility(), is(equalTo(View.GONE)));
29722037e659c30185f51f522e1761236f780334c9dYao, Yuxing
29822037e659c30185f51f522e1761236f780334c9dYao, Yuxing        viewHolder = getViewHolderAtPosition(3);
29922037e659c30185f51f522e1761236f780334c9dYao, Yuxing        assertThat(viewHolder.getSwitch().getVisibility(), is(equalTo(View.VISIBLE)));
30022037e659c30185f51f522e1761236f780334c9dYao, Yuxing        assertThat(viewHolder.getSwitchDivider().getVisibility(), is(equalTo(View.GONE)));
301e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
302e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
303e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
304172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing    public void testTextStartMarginMatchesPrimaryActionType() {
305172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
306172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon, true);
3079b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana
308172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item1 = new TextListItem(mActivity);
309172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item1.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon, false);
3109b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana
311172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item2 = new TextListItem(mActivity);
312172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item2.setPrimaryActionEmptyIcon();
3139b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana
314172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item3 = new TextListItem(mActivity);
315172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item3.setPrimaryActionNoIcon();
316172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
317172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        List<TextListItem> items = Arrays.asList(item0, item1, item2, item3);
318e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        List<Integer> expectedStartMargin = Arrays.asList(R.dimen.car_keyline_4,
319e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                R.dimen.car_keyline_3, R.dimen.car_keyline_3, R.dimen.car_keyline_1);
320e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
321e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
322e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        for (int i = 0; i < items.size(); i++) {
3234e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing            TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(i);
324e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
325e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            int expected = InstrumentationRegistry.getContext().getResources()
326e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                    .getDimensionPixelSize(expectedStartMargin.get(i));
327e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            assertThat(((ViewGroup.MarginLayoutParams) viewHolder.getTitle().getLayoutParams())
328e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                    .getMarginStart(), is(equalTo(expected)));
329e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            assertThat(((ViewGroup.MarginLayoutParams) viewHolder.getBody().getLayoutParams())
330e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                    .getMarginStart(), is(equalTo(expected)));
331e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        }
332e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
333e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
334e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
335e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testItemWithOnlyTitleIsSingleLine() {
336172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        // Only space.
337172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
338172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setTitle(" ");
339172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
340172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        // Underscore.
341172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item1 = new TextListItem(mActivity);
342172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item1.setTitle("______");
343172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
344172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item2 = new TextListItem(mActivity);
345172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item2.setTitle("ALL UPPER CASE");
346172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
347172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        // String wouldn't fit in one line.
348172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item3 = new TextListItem(mActivity);
349172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item3.setTitle(InstrumentationRegistry.getContext().getResources().getString(
3503737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing                R.string.over_uxr_text_length_limit));
351172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
352172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        List<TextListItem> items = Arrays.asList(item0, item1, item2, item3);
353e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
354e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
355e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        double singleLineHeight = InstrumentationRegistry.getContext().getResources().getDimension(
356e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                R.dimen.car_single_line_list_item_height);
357e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
358b226d4dcc396fe8837876dfa113143702dd23c26Anthony Chen        LinearLayoutManager layoutManager =
359b226d4dcc396fe8837876dfa113143702dd23c26Anthony Chen                (LinearLayoutManager) mPagedListView.getRecyclerView().getLayoutManager();
360e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        for (int i = 0; i < items.size(); i++) {
361b226d4dcc396fe8837876dfa113143702dd23c26Anthony Chen            assertThat((double) layoutManager.findViewByPosition(i).getHeight(),
362e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                    is(closeTo(singleLineHeight, 1.0d)));
363e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        }
364e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
365e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
366e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
367e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testItemWithBodyTextIsAtLeastDoubleLine() {
368172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        // Only space.
369172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
370172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setBody(" ");
371172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
372172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        // Underscore.
373172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item1 = new TextListItem(mActivity);
374172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item1.setBody("____");
375172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
376172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        // String wouldn't fit in one line.
377172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item2 = new TextListItem(mActivity);
378172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item2.setBody(InstrumentationRegistry.getContext().getResources().getString(
3793737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing                R.string.over_uxr_text_length_limit));
380172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
381172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        List<TextListItem> items = Arrays.asList(item0, item1, item2);
382e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
383e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
384e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        final int doubleLineHeight =
385e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                (int) InstrumentationRegistry.getContext().getResources().getDimension(
386e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        R.dimen.car_double_line_list_item_height);
387e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
388b226d4dcc396fe8837876dfa113143702dd23c26Anthony Chen        LinearLayoutManager layoutManager =
389b226d4dcc396fe8837876dfa113143702dd23c26Anthony Chen                (LinearLayoutManager) mPagedListView.getRecyclerView().getLayoutManager();
390e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        for (int i = 0; i < items.size(); i++) {
391b226d4dcc396fe8837876dfa113143702dd23c26Anthony Chen            assertThat(layoutManager.findViewByPosition(i).getHeight(),
392e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                    is(greaterThanOrEqualTo(doubleLineHeight)));
393e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        }
394e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
395e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
396e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
397e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testPrimaryIconDrawable() {
398e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        Drawable drawable = InstrumentationRegistry.getContext().getResources().getDrawable(
399e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                android.R.drawable.sym_def_app_icon, null);
400172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
401172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
402172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setPrimaryActionIcon(drawable, true);
403172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
404172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        List<TextListItem> items = Arrays.asList(item0);
405e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
406e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
407e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertTrue(getViewHolderAtPosition(0).getPrimaryIcon().getDrawable().getConstantState()
408e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                .equals(drawable.getConstantState()));
409e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
410e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
411e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
412e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testLargePrimaryIconHasNoStartMargin() {
413172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
414172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon, true);
415172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
416172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        List<TextListItem> items = Arrays.asList(item0);
417e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
418e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
4194e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing        TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0);
420e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(((ViewGroup.MarginLayoutParams) viewHolder.getPrimaryIcon().getLayoutParams())
421e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                .getMarginStart(), is(equalTo(0)));
422e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
423e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
424e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
425e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testSmallPrimaryIconStartMargin() {
426172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
427172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon, false);
428172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
429172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        List<TextListItem> items = Arrays.asList(item0);
430e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
431e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
432e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        int expected = InstrumentationRegistry.getContext().getResources().getDimensionPixelSize(
433e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                R.dimen.car_keyline_1);
434e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
4354e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing        TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0);
436e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(((ViewGroup.MarginLayoutParams) viewHolder.getPrimaryIcon().getLayoutParams())
437e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                .getMarginStart(), is(equalTo(expected)));
438e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
439e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
440e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
4415dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing    public void testSmallPrimaryIconTopMarginRemainsTheSameRegardlessOfTextLength() {
4425dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing        final String longText = InstrumentationRegistry.getContext().getResources().getString(
4433737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing                R.string.over_uxr_text_length_limit);
444172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
445172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        // Single line item.
446172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
447172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon, false);
448172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setTitle("one line text");
449172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
450172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        // Double line item with one line text.
451172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item1 = new TextListItem(mActivity);
452172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item1.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon, false);
453172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item1.setTitle("one line text");
454172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item1.setBody("one line text");
455172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
456172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        // Double line item with long text.
457172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item2 = new TextListItem(mActivity);
458172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item2.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon, false);
459172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item2.setTitle("one line text");
460172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item2.setBody(longText);
461172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
462172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        // Body text only - long text.
463172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item3 = new TextListItem(mActivity);
464172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item3.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon, false);
465172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item3.setBody(longText);
466172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
467172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        // Body text only - one line text.
468172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item4 = new TextListItem(mActivity);
469172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item4.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon, false);
470172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item4.setBody("one line text");
471172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
472172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        List<TextListItem> items = Arrays.asList(item0, item1, item2, item3, item4);
4735dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing        setupPagedListView(items);
4745dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing
4755dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing        for (int i = 1; i < items.size(); i++) {
4765dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing            onView(withId(R.id.recycler_view)).perform(scrollToPosition(i));
4775dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing            // Implementation uses integer division so it may be off by 1 vs centered vertically.
4785dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing            assertThat((double) getViewHolderAtPosition(i - 1).getPrimaryIcon().getTop(),
4795dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing                    is(closeTo(
4805dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing                    (double) getViewHolderAtPosition(i).getPrimaryIcon().getTop(), 1.0d)));
4815dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing        }
4825dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing    }
4835dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing
4845dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing    @Test
485e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testClickingPrimaryActionIsSeparateFromSupplementalAction() {
486e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        final boolean[] clicked = {false, false};
487172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
488172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
489172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setOnClickListener(v -> clicked[0] = true);
490172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setSupplementalIcon(android.R.drawable.sym_def_app_icon, true,
491172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing                v -> clicked[1] = true);
492172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
493172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        List<TextListItem> items = Arrays.asList(item0);
494e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
495e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
496e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        onView(withId(R.id.recycler_view)).perform(actionOnItemAtPosition(0, click()));
497e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertTrue(clicked[0]);
498e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertFalse(clicked[1]);
499e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
500e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        onView(withId(R.id.recycler_view)).perform(
501e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                actionOnItemAtPosition(0, clickChildViewWithId(R.id.supplemental_icon)));
502e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertTrue(clicked[1]);
503e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
504e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
505e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
506e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testClickingSupplementalIcon() {
507e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        final boolean[] clicked = {false};
508172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
509172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
510172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setSupplementalIcon(android.R.drawable.sym_def_app_icon, true,
511172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing                v -> clicked[0] = true);
512172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
513172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        List<TextListItem> items = Arrays.asList(item0);
514e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
515e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
516e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        onView(withId(R.id.recycler_view)).perform(
517e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                actionOnItemAtPosition(0, clickChildViewWithId(R.id.supplemental_icon)));
518e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertTrue(clicked[0]);
519e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
520e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
521e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
522439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing    public void testSupplementalIconWithoutClickListenerIsNotClickable() {
523172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
524172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setSupplementalIcon(android.R.drawable.sym_def_app_icon, true);
525172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
526172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        List<TextListItem> items = Arrays.asList(item0);
527439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing        setupPagedListView(items);
528439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing
5294e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing        TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0);
530439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing        assertFalse(viewHolder.getSupplementalIcon().isClickable());
531439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing    }
532439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing
533439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing    @Test
53422037e659c30185f51f522e1761236f780334c9dYao, Yuxing    public void testCheckingSwitch() {
53522037e659c30185f51f522e1761236f780334c9dYao, Yuxing        final boolean[] clicked = {false, false};
536172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
537172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
538172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setSwitch(false, false, (button, isChecked) -> {
539172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing            // Initial value is false.
540172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing            assertTrue(isChecked);
541172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing            clicked[0] = true;
542172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        });
543172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
544172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item1 = new TextListItem(mActivity);
545172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item1.setSwitch(true, false, (button, isChecked) -> {
546172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing            // Initial value is true.
547172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing            assertFalse(isChecked);
548172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing            clicked[1] = true;
549172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        });
550172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
551172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        List<TextListItem> items = Arrays.asList(item0, item1);
55222037e659c30185f51f522e1761236f780334c9dYao, Yuxing        setupPagedListView(items);
55322037e659c30185f51f522e1761236f780334c9dYao, Yuxing
55422037e659c30185f51f522e1761236f780334c9dYao, Yuxing        onView(withId(R.id.recycler_view)).perform(
55522037e659c30185f51f522e1761236f780334c9dYao, Yuxing                actionOnItemAtPosition(0, clickChildViewWithId(R.id.switch_widget)));
55622037e659c30185f51f522e1761236f780334c9dYao, Yuxing        assertTrue(clicked[0]);
55722037e659c30185f51f522e1761236f780334c9dYao, Yuxing
55822037e659c30185f51f522e1761236f780334c9dYao, Yuxing        onView(withId(R.id.recycler_view)).perform(
55922037e659c30185f51f522e1761236f780334c9dYao, Yuxing                actionOnItemAtPosition(1, clickChildViewWithId(R.id.switch_widget)));
56022037e659c30185f51f522e1761236f780334c9dYao, Yuxing        assertTrue(clicked[1]);
56122037e659c30185f51f522e1761236f780334c9dYao, Yuxing    }
56222037e659c30185f51f522e1761236f780334c9dYao, Yuxing
56322037e659c30185f51f522e1761236f780334c9dYao, Yuxing    @Test
564e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testClickingSupplementalAction() {
565e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        final boolean[] clicked = {false};
566172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
567172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
568172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setAction("action", true, v -> clicked[0] = true);
569172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
570172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        List<TextListItem> items = Arrays.asList(item0);
571e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
572e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
573e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        onView(withId(R.id.recycler_view)).perform(
574e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                actionOnItemAtPosition(0, clickChildViewWithId(R.id.action1)));
575e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertTrue(clicked[0]);
576e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
577e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
578e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
579e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testClickingBothSupplementalActions() {
580e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        final boolean[] clicked = {false, false};
581172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
582172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
583172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setActions("action 1", true, v -> clicked[0] = true,
584172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing                        "action 2", true, v -> clicked[1] = true);
585172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
586172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        List<TextListItem> items = Arrays.asList(item0);
587e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
588e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
589e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        onView(withId(R.id.recycler_view)).perform(
590e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                actionOnItemAtPosition(0, clickChildViewWithId(R.id.action1)));
591e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertTrue(clicked[0]);
592e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertFalse(clicked[1]);
593e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
594e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        onView(withId(R.id.recycler_view)).perform(
595e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                actionOnItemAtPosition(0, clickChildViewWithId(R.id.action2)));
596e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertTrue(clicked[1]);
597e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
598e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
599e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
600172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing    public void testCustomViewBinderBindsLast() {
601e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        final String updatedTitle = "updated title";
602172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
603172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
604172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setTitle("original title");
605172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.addViewBinder((viewHolder) -> viewHolder.getTitle().setText(updatedTitle));
606172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
607172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        List<TextListItem> items = Arrays.asList(item0);
608e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
609e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
6104e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing        TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0);
611e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getTitle().getText(), is(equalTo(updatedTitle)));
612e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
613e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
614e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
615e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testCustomViewBinderOnUnusedViewsHasNoEffect() {
616172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
617172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.addViewBinder((viewHolder) -> viewHolder.getBody().setText("text"));
618172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
619172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        List<TextListItem> items = Arrays.asList(item0);
620e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
621e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
6224e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing        TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0);
623e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getBody().getVisibility(), is(equalTo(View.GONE)));
624e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        // Custom binder interacts with body but has no effect.
625e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        // Expect card height to remain single line.
626e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat((double) viewHolder.itemView.getHeight(), is(closeTo(
627e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                InstrumentationRegistry.getContext().getResources().getDimension(
628e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        R.dimen.car_single_line_list_item_height), 1.0d)));
629e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
630e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
631e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
63220e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing    public void testRevertingViewBinder() throws Throwable {
63320e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
63420e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing        item0.setBody("one item");
63520e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing        item0.addViewBinder(
63620e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing                (viewHolder) -> viewHolder.getBody().setEllipsize(TextUtils.TruncateAt.END),
63720e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing                (viewHolder -> viewHolder.getBody().setEllipsize(null)));
63820e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing
63920e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing        List<TextListItem> items = Arrays.asList(item0);
64020e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing        setupPagedListView(items);
64120e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing
64220e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing        TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0);
64320e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing
64420e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing        // Bind view holder to a new item - the customization made by item0 should be reverted.
64520e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing        TextListItem item1 = new TextListItem(mActivity);
64620e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing        item1.setBody("new item");
64720e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing        mActivityRule.runOnUiThread(() -> item1.bind(viewHolder));
64820e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing
64920e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing        assertThat(viewHolder.getBody().getEllipsize(), is(equalTo(null)));
65020e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing    }
65120e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing
65220e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing    @Test
65320e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing    public void testRemovingViewBinder() {
65420e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
65520e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing        item0.setBody("one item");
65620e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing        ListItem.ViewBinder<TextListItem.ViewHolder> binder =
65720e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing                (viewHolder) -> viewHolder.getTitle().setEllipsize(TextUtils.TruncateAt.END);
65820e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing        item0.addViewBinder(binder);
65920e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing
66020e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing        assertTrue(item0.removeViewBinder(binder));
66120e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing
66220e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing        List<TextListItem> items = Arrays.asList(item0);
66320e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing        setupPagedListView(items);
66420e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing
66520e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing        assertThat(getViewHolderAtPosition(0).getBody().getEllipsize(), is(equalTo(null)));
66620e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing    }
66720e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing
66820e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing    @Test
669e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testSettingTitleOrBodyAsPrimaryText() {
670e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        // Create 2 items, one with Title as primary (default) and one with Body.
671e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        // The primary text, regardless of view, should have consistent look (as primary).
672172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
673172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setTitle("title");
674172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setBody("body");
675172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
676172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item1 = new TextListItem(mActivity);
677172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item1.setTitle("title");
678172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item1.setBody("body", true);
679172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
680172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        List<TextListItem> items = Arrays.asList(item0, item1);
681e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
682e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
6834e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing        TextListItem.ViewHolder titlePrimary = getViewHolderAtPosition(0);
6844e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing        TextListItem.ViewHolder bodyPrimary = getViewHolderAtPosition(1);
685e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(titlePrimary.getTitle().getTextSize(),
686e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                is(equalTo(bodyPrimary.getBody().getTextSize())));
687e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(titlePrimary.getTitle().getTextColors(),
688e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                is(equalTo(bodyPrimary.getBody().getTextColors())));
689e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
690e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
691a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing    @Test
692a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing    public void testNoCarriedOverLayoutParamsForTextView() throws Throwable {
693172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem singleLine = new TextListItem(mActivity);
694172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        singleLine.setTitle("title");
695172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
696a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        setupPagedListView(Arrays.asList(singleLine));
697a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing
698a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        // Manually rebind the view holder of a single line item to a double line item.
699172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem doubleLine = new TextListItem(mActivity);
700172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        doubleLine.setTitle("title");
701172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        doubleLine.setBody("body");
7024e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing        TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0);
703a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        mActivityRule.runOnUiThread(() -> doubleLine.bind(viewHolder));
704a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing
705a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        RelativeLayout.LayoutParams titleLayoutParams =
706a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing                (RelativeLayout.LayoutParams) viewHolder.getTitle().getLayoutParams();
707a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        RelativeLayout.LayoutParams bodyLayoutParams =
708a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing                (RelativeLayout.LayoutParams) viewHolder.getTitle().getLayoutParams();
709a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        assertThat(titleLayoutParams.getRule(RelativeLayout.CENTER_VERTICAL), is(equalTo(0)));
710a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        assertThat(bodyLayoutParams.getRule(RelativeLayout.CENTER_VERTICAL), is(equalTo(0)));
711a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing    }
712a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing
713a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing    @Test
714a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing    public void testNoCarriedOverLayoutParamsForPrimaryIcon() throws Throwable {
715172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem smallIcon = new TextListItem(mActivity);
716172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        smallIcon.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon, false);
717172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        smallIcon.setBody("body");  // Small icon of items with body text should use top margin.
718a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        setupPagedListView(Arrays.asList(smallIcon));
719a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing
720a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        // Manually rebind the view holder.
721172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem largeIcon = new TextListItem(mActivity);
722172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        largeIcon.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon, true);
7234e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing        TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0);
724a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        mActivityRule.runOnUiThread(() -> largeIcon.bind(viewHolder));
725a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing
726a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        RelativeLayout.LayoutParams iconLayoutParams =
727a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing                (RelativeLayout.LayoutParams) viewHolder.getPrimaryIcon().getLayoutParams();
728a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        assertThat(iconLayoutParams.getRule(RelativeLayout.CENTER_VERTICAL),
729a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing                is(equalTo(RelativeLayout.TRUE)));
730a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        assertThat(iconLayoutParams.topMargin, is(equalTo(0)));
731a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing    }
732a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing
733172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing    @Test
73401d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing    public void testNoCarriedOverOnClickListener() throws Throwable {
73501d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing        boolean[] clicked = new boolean[] {false};
73601d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
73701d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing        item0.setOnClickListener(v -> clicked[0] = true);
73801d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing
73901d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing        setupPagedListView(Arrays.asList(item0));
74001d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing
74101d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing        onView(withId(R.id.recycler_view)).perform(actionOnItemAtPosition(0, click()));
74201d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing        assertTrue(clicked[0]);
74301d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing
74401d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing        // item1 does not have onClickListener.
74501d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing        TextListItem item1 = new TextListItem(mActivity);
74601d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing        TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0);
74701d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing        // Manually rebind the view holder.
74801d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing        mActivityRule.runOnUiThread(() -> item1.bind(viewHolder));
74901d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing
75001d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing        // Reset for testing.
75101d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing        clicked[0] = false;
75201d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing        onView(withId(R.id.recycler_view)).perform(actionOnItemAtPosition(0, click()));
75301d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing        assertFalse(clicked[0]);
75401d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing    }
75501d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing
75601d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing    @Test
7572524380fff7e003a2949947561f5ac2fa9591391Yao, Yuxing    public void testUpdateItem() {
758172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item = new TextListItem(mActivity);
759172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        setupPagedListView(Arrays.asList(item));
760172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
761172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        String title = "updated title";
762172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item.setTitle(title);
763172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
7643737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing        refreshUi();
765172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
766172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0);
767172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        assertThat(viewHolder.getTitle().getText(), is(equalTo(title)));
768172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing    }
769172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
7703737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing    @Test
7712524380fff7e003a2949947561f5ac2fa9591391Yao, Yuxing    public void testUxRestrictionsChange() {
7723737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing        String longText = mActivity.getString(R.string.over_uxr_text_length_limit);
7733737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing        TextListItem item = new TextListItem(mActivity);
7743737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing        item.setBody(longText);
7753737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing
7763737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing        setupPagedListView(Arrays.asList(item));
7773737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing
7783737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing        TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0);
7793737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing        // Default behavior without UXR is unrestricted.
7803737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing        assertThat(viewHolder.getBody().getText(), is(equalTo(longText)));
7813737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing
7823737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing        viewHolder.complyWithUxRestrictions(CarUxRestrictionsTestUtils.getFullyRestricted());
7833737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing        refreshUi();
7843737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing
7853737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing        // Verify that the body text length is limited.
7863737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing        assertThat(viewHolder.getBody().getText().length(), is(lessThan(longText.length())));
7873737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing    }
7883737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing
7893737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing    @Test
7903737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing    public void testUxRestrictionsChangesDoNotAlterExistingInputFilters() {
7913737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing        InputFilter filter = new InputFilter.AllCaps(Locale.US);
7923737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing        String bodyText = "bodytext";
7933737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing        TextListItem item = new TextListItem(mActivity);
7943737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing        item.setBody(bodyText);
7953737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing        item.addViewBinder(vh -> vh.getBody().setFilters(new InputFilter[] {filter}));
7963737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing
7973737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing        setupPagedListView(Arrays.asList(item));
7983737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing
7993737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing        TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0);
8003737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing
8013737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing        // Toggle UX restrictions between fully restricted and unrestricted should not affect
8023737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing        // existing filters.
8033737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing        viewHolder.complyWithUxRestrictions(CarUxRestrictionsTestUtils.getFullyRestricted());
8043737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing        refreshUi();
8053737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing        assertTrue(Arrays.asList(viewHolder.getBody().getFilters()).contains(filter));
8063737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing
80732a32d76550734f2c35f5db5b53890d8a2589281Yao, Yuxing        viewHolder.complyWithUxRestrictions(CarUxRestrictionsTestUtils.getBaseline());
8083737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing        refreshUi();
8093737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing        assertTrue(Arrays.asList(viewHolder.getBody().getFilters()).contains(filter));
8103737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing    }
8113737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing
812e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    private static ViewAction clickChildViewWithId(final int id) {
813e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        return new ViewAction() {
814e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            @Override
815e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            public Matcher<View> getConstraints() {
816e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                return null;
817e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            }
818e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
819e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            @Override
820e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            public String getDescription() {
821e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                return "Click on a child view with specific id.";
822e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            }
823e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
824e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            @Override
825e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            public void perform(UiController uiController, View view) {
826e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                View v = view.findViewById(id);
827e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                v.performClick();
828e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            }
829e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        };
830e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
831e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing}
832