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
21565ec7f1338516c11ea1442912a22d50033fe8fb8Yao, Yuxing    public void testSetSupplementalActionWithDrawable() {
21665ec7f1338516c11ea1442912a22d50033fe8fb8Yao, Yuxing        Drawable drawable = mActivity.getDrawable(android.R.drawable.sym_def_app_icon);
21765ec7f1338516c11ea1442912a22d50033fe8fb8Yao, Yuxing        TextListItem item = new TextListItem(mActivity);
21865ec7f1338516c11ea1442912a22d50033fe8fb8Yao, Yuxing        item.setSupplementalIcon(drawable, true);
21965ec7f1338516c11ea1442912a22d50033fe8fb8Yao, Yuxing
22065ec7f1338516c11ea1442912a22d50033fe8fb8Yao, Yuxing        setupPagedListView(Arrays.asList(item));
22165ec7f1338516c11ea1442912a22d50033fe8fb8Yao, Yuxing
22265ec7f1338516c11ea1442912a22d50033fe8fb8Yao, Yuxing        assertThat(getViewHolderAtPosition(0).getSupplementalIcon().getDrawable(),
22365ec7f1338516c11ea1442912a22d50033fe8fb8Yao, Yuxing                is(equalTo(drawable)));
22465ec7f1338516c11ea1442912a22d50033fe8fb8Yao, Yuxing    }
22565ec7f1338516c11ea1442912a22d50033fe8fb8Yao, Yuxing
22665ec7f1338516c11ea1442912a22d50033fe8fb8Yao, Yuxing    @Test
22722037e659c30185f51f522e1761236f780334c9dYao, Yuxing    public void testSwitchVisibleAndCheckedState() {
228172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
229172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setSwitch(true, true, null);
230172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
231172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item1 = new TextListItem(mActivity);
232172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item1.setSwitch(false, true, null);
233172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
234172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        List<TextListItem> items = Arrays.asList(item0, item1);
23522037e659c30185f51f522e1761236f780334c9dYao, Yuxing        setupPagedListView(items);
23622037e659c30185f51f522e1761236f780334c9dYao, Yuxing
2374e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing        TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0);
23822037e659c30185f51f522e1761236f780334c9dYao, Yuxing        assertThat(viewHolder.getSwitch().getVisibility(), is(equalTo(View.VISIBLE)));
23922037e659c30185f51f522e1761236f780334c9dYao, Yuxing        assertThat(viewHolder.getSwitch().isChecked(), is(equalTo(true)));
24022037e659c30185f51f522e1761236f780334c9dYao, Yuxing        assertThat(viewHolder.getSwitchDivider().getVisibility(), is(equalTo(View.VISIBLE)));
24122037e659c30185f51f522e1761236f780334c9dYao, Yuxing
24222037e659c30185f51f522e1761236f780334c9dYao, Yuxing        viewHolder = getViewHolderAtPosition(1);
24322037e659c30185f51f522e1761236f780334c9dYao, Yuxing        assertThat(viewHolder.getSwitch().getVisibility(), is(equalTo(View.VISIBLE)));
24422037e659c30185f51f522e1761236f780334c9dYao, Yuxing        assertThat(viewHolder.getSwitch().isChecked(), is(equalTo(false)));
24522037e659c30185f51f522e1761236f780334c9dYao, Yuxing        assertThat(viewHolder.getSwitchDivider().getVisibility(), is(equalTo(View.VISIBLE)));
24622037e659c30185f51f522e1761236f780334c9dYao, Yuxing    }
247a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing
248a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing    @Test
249a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing    public void testSetSwitchState() {
250a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
251a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing        item0.setSwitch(true, true, null);
252a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing
253a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing        setupPagedListView(Arrays.asList(item0));
254a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing
255a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing        item0.setSwitchState(false);
2563737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing
2573737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing        refreshUi();
258a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing
259a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing        TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0);
260a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing        assertThat(viewHolder.getSwitch().getVisibility(), is(equalTo(View.VISIBLE)));
261a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing        assertThat(viewHolder.getSwitch().isChecked(), is(equalTo(false)));
262a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing    }
263a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing
264a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing    @Test
265a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing    public void testSetSwitchStateHasNoEffectIfSwitchIsNotEnabled() {
266a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
267a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing        setupPagedListView(Arrays.asList(item0));
268a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing
269a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing        item0.setSwitchState(false);
2703737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing
2713737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing        refreshUi();
272a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing
273a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing        TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0);
274a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing        assertThat(viewHolder.getSwitch().getVisibility(), is(not(equalTo(View.VISIBLE))));
275a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing    }
27622037e659c30185f51f522e1761236f780334c9dYao, Yuxing
27722037e659c30185f51f522e1761236f780334c9dYao, Yuxing    @Test
278e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testDividersAreOptional() {
279172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
280172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setSupplementalIcon(android.R.drawable.sym_def_app_icon, false);
281172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
282172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item1 = new TextListItem(mActivity);
283172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item1.setAction("text", false, v -> { /* Do nothing. */ });
284172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
285172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item2 = new TextListItem(mActivity);
286172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item2.setActions("text", false, v -> { /* Do nothing. */ },
287172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing                "text", false, v -> { /* Do nothing. */ });
288172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
289172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item3 = new TextListItem(mActivity);
290172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item3.setSwitch(true, false, null);
291172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
292172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        List<TextListItem> items = Arrays.asList(item0, item1, item2, item3);
293e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
294e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
2954e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing        TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0);
296e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getSupplementalIcon().getVisibility(), is(equalTo(View.VISIBLE)));
297e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getSupplementalIconDivider().getVisibility(),
298e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                is(equalTo(View.GONE)));
299e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
300e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        viewHolder = getViewHolderAtPosition(1);
301e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getAction1().getVisibility(), is(equalTo(View.VISIBLE)));
302e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getAction1Divider().getVisibility(), is(equalTo(View.GONE)));
303e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
304e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        viewHolder = getViewHolderAtPosition(2);
305e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getAction1().getVisibility(), is(equalTo(View.VISIBLE)));
306e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getAction1Divider().getVisibility(), is(equalTo(View.GONE)));
307e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getAction2().getVisibility(), is(equalTo(View.VISIBLE)));
308e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getAction2Divider().getVisibility(), is(equalTo(View.GONE)));
30922037e659c30185f51f522e1761236f780334c9dYao, Yuxing
31022037e659c30185f51f522e1761236f780334c9dYao, Yuxing        viewHolder = getViewHolderAtPosition(3);
31122037e659c30185f51f522e1761236f780334c9dYao, Yuxing        assertThat(viewHolder.getSwitch().getVisibility(), is(equalTo(View.VISIBLE)));
31222037e659c30185f51f522e1761236f780334c9dYao, Yuxing        assertThat(viewHolder.getSwitchDivider().getVisibility(), is(equalTo(View.GONE)));
313e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
314e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
315e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
316172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing    public void testTextStartMarginMatchesPrimaryActionType() {
317172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
318172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon, true);
3199b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana
320172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item1 = new TextListItem(mActivity);
321172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item1.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon, false);
3229b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana
323172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item2 = new TextListItem(mActivity);
324172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item2.setPrimaryActionEmptyIcon();
3259b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana
326172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item3 = new TextListItem(mActivity);
327172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item3.setPrimaryActionNoIcon();
328172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
329172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        List<TextListItem> items = Arrays.asList(item0, item1, item2, item3);
330e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        List<Integer> expectedStartMargin = Arrays.asList(R.dimen.car_keyline_4,
331e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                R.dimen.car_keyline_3, R.dimen.car_keyline_3, R.dimen.car_keyline_1);
332e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
333e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
334e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        for (int i = 0; i < items.size(); i++) {
3354e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing            TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(i);
336e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
337e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            int expected = InstrumentationRegistry.getContext().getResources()
338e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                    .getDimensionPixelSize(expectedStartMargin.get(i));
339e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            assertThat(((ViewGroup.MarginLayoutParams) viewHolder.getTitle().getLayoutParams())
340e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                    .getMarginStart(), is(equalTo(expected)));
341e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            assertThat(((ViewGroup.MarginLayoutParams) viewHolder.getBody().getLayoutParams())
342e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                    .getMarginStart(), is(equalTo(expected)));
343e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        }
344e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
345e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
346e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
347e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testItemWithOnlyTitleIsSingleLine() {
348172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        // Only space.
349172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
350172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setTitle(" ");
351172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
352172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        // Underscore.
353172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item1 = new TextListItem(mActivity);
354172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item1.setTitle("______");
355172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
356172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item2 = new TextListItem(mActivity);
357172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item2.setTitle("ALL UPPER CASE");
358172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
359172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        // String wouldn't fit in one line.
360172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item3 = new TextListItem(mActivity);
361172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item3.setTitle(InstrumentationRegistry.getContext().getResources().getString(
3623737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing                R.string.over_uxr_text_length_limit));
363172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
364172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        List<TextListItem> items = Arrays.asList(item0, item1, item2, item3);
365e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
366e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
367e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        double singleLineHeight = InstrumentationRegistry.getContext().getResources().getDimension(
368e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                R.dimen.car_single_line_list_item_height);
369e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
370b226d4dcc396fe8837876dfa113143702dd23c26Anthony Chen        LinearLayoutManager layoutManager =
371b226d4dcc396fe8837876dfa113143702dd23c26Anthony Chen                (LinearLayoutManager) mPagedListView.getRecyclerView().getLayoutManager();
372e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        for (int i = 0; i < items.size(); i++) {
373b226d4dcc396fe8837876dfa113143702dd23c26Anthony Chen            assertThat((double) layoutManager.findViewByPosition(i).getHeight(),
374e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                    is(closeTo(singleLineHeight, 1.0d)));
375e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        }
376e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
377e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
378e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
379e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testItemWithBodyTextIsAtLeastDoubleLine() {
380172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        // Only space.
381172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
382172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setBody(" ");
383172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
384172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        // Underscore.
385172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item1 = new TextListItem(mActivity);
386172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item1.setBody("____");
387172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
388172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        // String wouldn't fit in one line.
389172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item2 = new TextListItem(mActivity);
390172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item2.setBody(InstrumentationRegistry.getContext().getResources().getString(
3913737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing                R.string.over_uxr_text_length_limit));
392172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
393172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        List<TextListItem> items = Arrays.asList(item0, item1, item2);
394e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
395e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
396e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        final int doubleLineHeight =
397e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                (int) InstrumentationRegistry.getContext().getResources().getDimension(
398e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        R.dimen.car_double_line_list_item_height);
399e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
400b226d4dcc396fe8837876dfa113143702dd23c26Anthony Chen        LinearLayoutManager layoutManager =
401b226d4dcc396fe8837876dfa113143702dd23c26Anthony Chen                (LinearLayoutManager) mPagedListView.getRecyclerView().getLayoutManager();
402e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        for (int i = 0; i < items.size(); i++) {
403b226d4dcc396fe8837876dfa113143702dd23c26Anthony Chen            assertThat(layoutManager.findViewByPosition(i).getHeight(),
404e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                    is(greaterThanOrEqualTo(doubleLineHeight)));
405e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        }
406e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
407e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
408e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
409e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testPrimaryIconDrawable() {
410e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        Drawable drawable = InstrumentationRegistry.getContext().getResources().getDrawable(
411e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                android.R.drawable.sym_def_app_icon, null);
412172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
413172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
414172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setPrimaryActionIcon(drawable, true);
415172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
416172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        List<TextListItem> items = Arrays.asList(item0);
417e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
418e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
419e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertTrue(getViewHolderAtPosition(0).getPrimaryIcon().getDrawable().getConstantState()
420e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                .equals(drawable.getConstantState()));
421e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
422e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
423e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
424e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testLargePrimaryIconHasNoStartMargin() {
425172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
426172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon, true);
427172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
428172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        List<TextListItem> items = Arrays.asList(item0);
429e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
430e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
4314e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing        TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0);
432e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(((ViewGroup.MarginLayoutParams) viewHolder.getPrimaryIcon().getLayoutParams())
433e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                .getMarginStart(), is(equalTo(0)));
434e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
435e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
436e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
437e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testSmallPrimaryIconStartMargin() {
438172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
439172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon, false);
440172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
441172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        List<TextListItem> items = Arrays.asList(item0);
442e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
443e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
444e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        int expected = InstrumentationRegistry.getContext().getResources().getDimensionPixelSize(
445e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                R.dimen.car_keyline_1);
446e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
4474e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing        TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0);
448e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(((ViewGroup.MarginLayoutParams) viewHolder.getPrimaryIcon().getLayoutParams())
449e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                .getMarginStart(), is(equalTo(expected)));
450e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
451e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
452e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
4535dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing    public void testSmallPrimaryIconTopMarginRemainsTheSameRegardlessOfTextLength() {
4545dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing        final String longText = InstrumentationRegistry.getContext().getResources().getString(
4553737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing                R.string.over_uxr_text_length_limit);
456172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
457172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        // Single line item.
458172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
459172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon, false);
460172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setTitle("one line text");
461172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
462172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        // Double line item with one line text.
463172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item1 = new TextListItem(mActivity);
464172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item1.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon, false);
465172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item1.setTitle("one line text");
466172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item1.setBody("one line text");
467172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
468172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        // Double line item with long text.
469172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item2 = new TextListItem(mActivity);
470172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item2.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon, false);
471172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item2.setTitle("one line text");
472172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item2.setBody(longText);
473172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
474172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        // Body text only - long text.
475172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item3 = new TextListItem(mActivity);
476172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item3.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon, false);
477172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item3.setBody(longText);
478172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
479172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        // Body text only - one line text.
480172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item4 = new TextListItem(mActivity);
481172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item4.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon, false);
482172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item4.setBody("one line text");
483172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
484172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        List<TextListItem> items = Arrays.asList(item0, item1, item2, item3, item4);
4855dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing        setupPagedListView(items);
4865dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing
4875dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing        for (int i = 1; i < items.size(); i++) {
4885dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing            onView(withId(R.id.recycler_view)).perform(scrollToPosition(i));
4895dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing            // Implementation uses integer division so it may be off by 1 vs centered vertically.
4905dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing            assertThat((double) getViewHolderAtPosition(i - 1).getPrimaryIcon().getTop(),
4915dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing                    is(closeTo(
4925dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing                    (double) getViewHolderAtPosition(i).getPrimaryIcon().getTop(), 1.0d)));
4935dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing        }
4945dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing    }
4955dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing
4965dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing    @Test
497e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testClickingPrimaryActionIsSeparateFromSupplementalAction() {
498e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        final boolean[] clicked = {false, false};
499172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
500172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
501172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setOnClickListener(v -> clicked[0] = true);
502172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setSupplementalIcon(android.R.drawable.sym_def_app_icon, true,
503172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing                v -> clicked[1] = true);
504172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
505172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        List<TextListItem> items = Arrays.asList(item0);
506e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
507e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
508e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        onView(withId(R.id.recycler_view)).perform(actionOnItemAtPosition(0, click()));
509e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertTrue(clicked[0]);
510e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertFalse(clicked[1]);
511e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
512e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        onView(withId(R.id.recycler_view)).perform(
513e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                actionOnItemAtPosition(0, clickChildViewWithId(R.id.supplemental_icon)));
514e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertTrue(clicked[1]);
515e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
516e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
517e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
518e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testClickingSupplementalIcon() {
519e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        final boolean[] clicked = {false};
520172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
521172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
522172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setSupplementalIcon(android.R.drawable.sym_def_app_icon, true,
523172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing                v -> clicked[0] = true);
524172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
525172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        List<TextListItem> items = Arrays.asList(item0);
526e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
527e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
528e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        onView(withId(R.id.recycler_view)).perform(
529e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                actionOnItemAtPosition(0, clickChildViewWithId(R.id.supplemental_icon)));
530e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertTrue(clicked[0]);
531e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
532e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
533e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
534439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing    public void testSupplementalIconWithoutClickListenerIsNotClickable() {
535172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
536172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setSupplementalIcon(android.R.drawable.sym_def_app_icon, true);
537172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
538172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        List<TextListItem> items = Arrays.asList(item0);
539439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing        setupPagedListView(items);
540439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing
5414e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing        TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0);
542439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing        assertFalse(viewHolder.getSupplementalIcon().isClickable());
543439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing    }
544439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing
545439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing    @Test
54622037e659c30185f51f522e1761236f780334c9dYao, Yuxing    public void testCheckingSwitch() {
54722037e659c30185f51f522e1761236f780334c9dYao, Yuxing        final boolean[] clicked = {false, false};
548172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
549172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
550172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setSwitch(false, false, (button, isChecked) -> {
551172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing            // Initial value is false.
552172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing            assertTrue(isChecked);
553172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing            clicked[0] = true;
554172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        });
555172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
556172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item1 = new TextListItem(mActivity);
557172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item1.setSwitch(true, false, (button, isChecked) -> {
558172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing            // Initial value is true.
559172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing            assertFalse(isChecked);
560172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing            clicked[1] = true;
561172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        });
562172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
563172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        List<TextListItem> items = Arrays.asList(item0, item1);
56422037e659c30185f51f522e1761236f780334c9dYao, Yuxing        setupPagedListView(items);
56522037e659c30185f51f522e1761236f780334c9dYao, Yuxing
56622037e659c30185f51f522e1761236f780334c9dYao, Yuxing        onView(withId(R.id.recycler_view)).perform(
56722037e659c30185f51f522e1761236f780334c9dYao, Yuxing                actionOnItemAtPosition(0, clickChildViewWithId(R.id.switch_widget)));
56822037e659c30185f51f522e1761236f780334c9dYao, Yuxing        assertTrue(clicked[0]);
56922037e659c30185f51f522e1761236f780334c9dYao, Yuxing
57022037e659c30185f51f522e1761236f780334c9dYao, Yuxing        onView(withId(R.id.recycler_view)).perform(
57122037e659c30185f51f522e1761236f780334c9dYao, Yuxing                actionOnItemAtPosition(1, clickChildViewWithId(R.id.switch_widget)));
57222037e659c30185f51f522e1761236f780334c9dYao, Yuxing        assertTrue(clicked[1]);
57322037e659c30185f51f522e1761236f780334c9dYao, Yuxing    }
57422037e659c30185f51f522e1761236f780334c9dYao, Yuxing
57522037e659c30185f51f522e1761236f780334c9dYao, Yuxing    @Test
576e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testClickingSupplementalAction() {
577e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        final boolean[] clicked = {false};
578172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
579172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
580172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setAction("action", true, v -> clicked[0] = true);
581172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
582172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        List<TextListItem> items = Arrays.asList(item0);
583e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
584e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
585e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        onView(withId(R.id.recycler_view)).perform(
586e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                actionOnItemAtPosition(0, clickChildViewWithId(R.id.action1)));
587e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertTrue(clicked[0]);
588e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
589e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
590e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
591e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testClickingBothSupplementalActions() {
592e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        final boolean[] clicked = {false, false};
593172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
594172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
595172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setActions("action 1", true, v -> clicked[0] = true,
596172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing                        "action 2", true, v -> clicked[1] = true);
597172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
598172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        List<TextListItem> items = Arrays.asList(item0);
599e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
600e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
601e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        onView(withId(R.id.recycler_view)).perform(
602e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                actionOnItemAtPosition(0, clickChildViewWithId(R.id.action1)));
603e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertTrue(clicked[0]);
604e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertFalse(clicked[1]);
605e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
606e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        onView(withId(R.id.recycler_view)).perform(
607e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                actionOnItemAtPosition(0, clickChildViewWithId(R.id.action2)));
608e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertTrue(clicked[1]);
609e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
610e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
611e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
612172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing    public void testCustomViewBinderBindsLast() {
613e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        final String updatedTitle = "updated title";
614172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
615172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
616172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setTitle("original title");
617172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.addViewBinder((viewHolder) -> viewHolder.getTitle().setText(updatedTitle));
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.getTitle().getText(), is(equalTo(updatedTitle)));
624e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
625e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
626e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
627e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testCustomViewBinderOnUnusedViewsHasNoEffect() {
628172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
629172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.addViewBinder((viewHolder) -> viewHolder.getBody().setText("text"));
630172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
631172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        List<TextListItem> items = Arrays.asList(item0);
632e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
633e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
6344e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing        TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0);
635e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getBody().getVisibility(), is(equalTo(View.GONE)));
636e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        // Custom binder interacts with body but has no effect.
637e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        // Expect card height to remain single line.
638e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat((double) viewHolder.itemView.getHeight(), is(closeTo(
639e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                InstrumentationRegistry.getContext().getResources().getDimension(
640e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        R.dimen.car_single_line_list_item_height), 1.0d)));
641e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
642e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
643e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
64420e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing    public void testRevertingViewBinder() throws Throwable {
64520e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
64620e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing        item0.setBody("one item");
64720e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing        item0.addViewBinder(
64820e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing                (viewHolder) -> viewHolder.getBody().setEllipsize(TextUtils.TruncateAt.END),
64920e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing                (viewHolder -> viewHolder.getBody().setEllipsize(null)));
65020e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing
65120e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing        List<TextListItem> items = Arrays.asList(item0);
65220e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing        setupPagedListView(items);
65320e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing
65420e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing        TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0);
65520e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing
65620e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing        // Bind view holder to a new item - the customization made by item0 should be reverted.
65720e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing        TextListItem item1 = new TextListItem(mActivity);
65820e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing        item1.setBody("new item");
65920e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing        mActivityRule.runOnUiThread(() -> item1.bind(viewHolder));
66020e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing
66120e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing        assertThat(viewHolder.getBody().getEllipsize(), is(equalTo(null)));
66220e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing    }
66320e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing
66420e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing    @Test
66520e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing    public void testRemovingViewBinder() {
66620e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
66720e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing        item0.setBody("one item");
66820e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing        ListItem.ViewBinder<TextListItem.ViewHolder> binder =
66920e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing                (viewHolder) -> viewHolder.getTitle().setEllipsize(TextUtils.TruncateAt.END);
67020e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing        item0.addViewBinder(binder);
67120e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing
67220e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing        assertTrue(item0.removeViewBinder(binder));
67320e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing
67420e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing        List<TextListItem> items = Arrays.asList(item0);
67520e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing        setupPagedListView(items);
67620e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing
67720e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing        assertThat(getViewHolderAtPosition(0).getBody().getEllipsize(), is(equalTo(null)));
67820e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing    }
67920e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing
68020e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing    @Test
681e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testSettingTitleOrBodyAsPrimaryText() {
682e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        // Create 2 items, one with Title as primary (default) and one with Body.
683e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        // The primary text, regardless of view, should have consistent look (as primary).
684172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
685172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setTitle("title");
686172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item0.setBody("body");
687172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
688172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item1 = new TextListItem(mActivity);
689172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item1.setTitle("title");
690172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item1.setBody("body", true);
691172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
692172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        List<TextListItem> items = Arrays.asList(item0, item1);
693e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
694e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
6954e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing        TextListItem.ViewHolder titlePrimary = getViewHolderAtPosition(0);
6964e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing        TextListItem.ViewHolder bodyPrimary = getViewHolderAtPosition(1);
697e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(titlePrimary.getTitle().getTextSize(),
698e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                is(equalTo(bodyPrimary.getBody().getTextSize())));
699e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(titlePrimary.getTitle().getTextColors(),
700e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                is(equalTo(bodyPrimary.getBody().getTextColors())));
701e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
702e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
703a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing    @Test
704a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing    public void testNoCarriedOverLayoutParamsForTextView() throws Throwable {
705172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem singleLine = new TextListItem(mActivity);
706172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        singleLine.setTitle("title");
707172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
708a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        setupPagedListView(Arrays.asList(singleLine));
709a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing
710a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        // Manually rebind the view holder of a single line item to a double line item.
711172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem doubleLine = new TextListItem(mActivity);
712172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        doubleLine.setTitle("title");
713172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        doubleLine.setBody("body");
7144e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing        TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0);
715a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        mActivityRule.runOnUiThread(() -> doubleLine.bind(viewHolder));
716a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing
717a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        RelativeLayout.LayoutParams titleLayoutParams =
718a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing                (RelativeLayout.LayoutParams) viewHolder.getTitle().getLayoutParams();
719a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        RelativeLayout.LayoutParams bodyLayoutParams =
720a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing                (RelativeLayout.LayoutParams) viewHolder.getTitle().getLayoutParams();
721a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        assertThat(titleLayoutParams.getRule(RelativeLayout.CENTER_VERTICAL), is(equalTo(0)));
722a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        assertThat(bodyLayoutParams.getRule(RelativeLayout.CENTER_VERTICAL), is(equalTo(0)));
723a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing    }
724a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing
725a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing    @Test
726a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing    public void testNoCarriedOverLayoutParamsForPrimaryIcon() throws Throwable {
727172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem smallIcon = new TextListItem(mActivity);
728172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        smallIcon.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon, false);
729172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        smallIcon.setBody("body");  // Small icon of items with body text should use top margin.
730a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        setupPagedListView(Arrays.asList(smallIcon));
731a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing
732a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        // Manually rebind the view holder.
733172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem largeIcon = new TextListItem(mActivity);
734172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        largeIcon.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon, true);
7354e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing        TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0);
736a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        mActivityRule.runOnUiThread(() -> largeIcon.bind(viewHolder));
737a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing
738a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        RelativeLayout.LayoutParams iconLayoutParams =
739a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing                (RelativeLayout.LayoutParams) viewHolder.getPrimaryIcon().getLayoutParams();
740a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        assertThat(iconLayoutParams.getRule(RelativeLayout.CENTER_VERTICAL),
741a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing                is(equalTo(RelativeLayout.TRUE)));
742a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        assertThat(iconLayoutParams.topMargin, is(equalTo(0)));
743a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing    }
744a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing
745172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing    @Test
74601d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing    public void testNoCarriedOverOnClickListener() throws Throwable {
74701d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing        boolean[] clicked = new boolean[] {false};
74801d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing        TextListItem item0 = new TextListItem(mActivity);
74901d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing        item0.setOnClickListener(v -> clicked[0] = true);
75001d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing
75101d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing        setupPagedListView(Arrays.asList(item0));
75201d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing
75301d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing        onView(withId(R.id.recycler_view)).perform(actionOnItemAtPosition(0, click()));
75401d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing        assertTrue(clicked[0]);
75501d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing
75601d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing        // item1 does not have onClickListener.
75701d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing        TextListItem item1 = new TextListItem(mActivity);
75801d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing        TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0);
75901d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing        // Manually rebind the view holder.
76001d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing        mActivityRule.runOnUiThread(() -> item1.bind(viewHolder));
76101d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing
76201d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing        // Reset for testing.
76301d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing        clicked[0] = false;
76401d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing        onView(withId(R.id.recycler_view)).perform(actionOnItemAtPosition(0, click()));
76501d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing        assertFalse(clicked[0]);
76601d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing    }
76701d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing
76801d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing    @Test
7692524380fff7e003a2949947561f5ac2fa9591391Yao, Yuxing    public void testUpdateItem() {
770172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem item = new TextListItem(mActivity);
771172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        setupPagedListView(Arrays.asList(item));
772172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
773172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        String title = "updated title";
774172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        item.setTitle(title);
775172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
7763737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing        refreshUi();
777172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
778172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0);
779172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing        assertThat(viewHolder.getTitle().getText(), is(equalTo(title)));
780172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing    }
781172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing
7823737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing    @Test
7832524380fff7e003a2949947561f5ac2fa9591391Yao, Yuxing    public void testUxRestrictionsChange() {
7843737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing        String longText = mActivity.getString(R.string.over_uxr_text_length_limit);
7853737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing        TextListItem item = new TextListItem(mActivity);
7863737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing        item.setBody(longText);
7873737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing
7883737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing        setupPagedListView(Arrays.asList(item));
7893737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing
7903737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing        TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0);
7913737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing        // Default behavior without UXR is unrestricted.
7923737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing        assertThat(viewHolder.getBody().getText(), is(equalTo(longText)));
7933737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing
7943737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing        viewHolder.complyWithUxRestrictions(CarUxRestrictionsTestUtils.getFullyRestricted());
7953737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing        refreshUi();
7963737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing
7973737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing        // Verify that the body text length is limited.
7983737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing        assertThat(viewHolder.getBody().getText().length(), is(lessThan(longText.length())));
7993737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing    }
8003737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing
8013737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing    @Test
8023737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing    public void testUxRestrictionsChangesDoNotAlterExistingInputFilters() {
8033737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing        InputFilter filter = new InputFilter.AllCaps(Locale.US);
8043737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing        String bodyText = "bodytext";
8053737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing        TextListItem item = new TextListItem(mActivity);
8063737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing        item.setBody(bodyText);
8073737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing        item.addViewBinder(vh -> vh.getBody().setFilters(new InputFilter[] {filter}));
8083737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing
8093737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing        setupPagedListView(Arrays.asList(item));
8103737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing
8113737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing        TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0);
8123737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing
8133737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing        // Toggle UX restrictions between fully restricted and unrestricted should not affect
8143737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing        // existing filters.
8153737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing        viewHolder.complyWithUxRestrictions(CarUxRestrictionsTestUtils.getFullyRestricted());
8163737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing        refreshUi();
8173737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing        assertTrue(Arrays.asList(viewHolder.getBody().getFilters()).contains(filter));
8183737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing
81932a32d76550734f2c35f5db5b53890d8a2589281Yao, Yuxing        viewHolder.complyWithUxRestrictions(CarUxRestrictionsTestUtils.getBaseline());
8203737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing        refreshUi();
8213737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing        assertTrue(Arrays.asList(viewHolder.getBody().getFilters()).contains(filter));
8223737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing    }
8233737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing
824e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    private static ViewAction clickChildViewWithId(final int id) {
825e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        return new ViewAction() {
826e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            @Override
827e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            public Matcher<View> getConstraints() {
828e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                return null;
829e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            }
830e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
831e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            @Override
832e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            public String getDescription() {
833e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                return "Click on a child view with specific id.";
834e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            }
835e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
836e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            @Override
837e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            public void perform(UiController uiController, View view) {
838e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                View v = view.findViewById(id);
839e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                v.performClick();
840e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            }
841e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        };
842e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
843e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing}
844