TextListItemTest.java revision a565726ba2ad8cba4d28e206495dafc1d4eebdd5
1e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing/*
2e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing * Copyright 2017 The Android Open Source Project
3e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing *
4e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing * Licensed under the Apache License, Version 2.0 (the "License");
5e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing * you may not use this file except in compliance with the License.
6e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing * You may obtain a copy of the License at
7e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing *
8e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing *      http://www.apache.org/licenses/LICENSE-2.0
9e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing *
10e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing * Unless required by applicable law or agreed to in writing, software
11e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing * distributed under the License is distributed on an "AS IS" BASIS,
12e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing * See the License for the specific language governing permissions and
14e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing * limitations under the License.
15e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing */
16e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
17e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingpackage androidx.car.widget;
18e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
19e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport static android.support.test.espresso.Espresso.onView;
20e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport static android.support.test.espresso.action.ViewActions.click;
21e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport static android.support.test.espresso.contrib.RecyclerViewActions.actionOnItemAtPosition;
22e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport static android.support.test.espresso.contrib.RecyclerViewActions.scrollToPosition;
23e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport static android.support.test.espresso.matcher.ViewMatchers.withId;
24e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
25e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport static junit.framework.TestCase.assertFalse;
26e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
27e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport static org.hamcrest.Matchers.greaterThanOrEqualTo;
28e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport static org.hamcrest.Matchers.instanceOf;
29e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport static org.hamcrest.core.Is.is;
30e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport static org.hamcrest.core.IsEqual.equalTo;
31e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport static org.hamcrest.number.IsCloseTo.closeTo;
32e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport static org.junit.Assert.assertThat;
33e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport static org.junit.Assert.assertTrue;
34e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
35e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport android.graphics.drawable.Drawable;
36e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport android.support.test.InstrumentationRegistry;
37e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport android.support.test.espresso.UiController;
38e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport android.support.test.espresso.ViewAction;
39e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport android.support.test.filters.SmallTest;
40e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport android.support.test.rule.ActivityTestRule;
41e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport android.support.test.runner.AndroidJUnit4;
42e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport android.support.v7.widget.CardView;
43e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport android.view.View;
44e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport android.view.ViewGroup;
45a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxingimport android.widget.RelativeLayout;
46e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
47e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport org.hamcrest.Matcher;
48e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport org.junit.Before;
49e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport org.junit.Rule;
50e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport org.junit.Test;
51e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport org.junit.runner.RunWith;
52e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
53e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport java.util.ArrayList;
54e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport java.util.Arrays;
55e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport java.util.List;
56e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
57e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport androidx.car.test.R;
58e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
59e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing/**
60e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing* Tests the layout configuration in {@link ListItem}.
61e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing */
62e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing@RunWith(AndroidJUnit4.class)
63e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing@SmallTest
64e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingpublic class ListItemTest {
65e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
66e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Rule
67e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public ActivityTestRule<PagedListViewTestActivity> mActivityRule =
68e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            new ActivityTestRule<>(PagedListViewTestActivity.class);
69e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
70e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    private PagedListViewTestActivity mActivity;
71e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    private PagedListView mPagedListView;
72e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
73e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Before
74e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void setUp() {
75e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        mActivity = mActivityRule.getActivity();
76e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        mPagedListView = mActivity.findViewById(R.id.paged_list_view);
77e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
78e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
79e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    private void setupPagedListView(List<ListItem> items) {
80e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        ListItemProvider provider = new ListItemProvider.ListProvider(
81e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                new ArrayList<>(items));
82e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        try {
83e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            mActivityRule.runOnUiThread(() -> {
84e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                mPagedListView.setAdapter(new ListItemAdapter(mActivity, provider));
85e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            });
86e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        } catch (Throwable throwable) {
87e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            throwable.printStackTrace();
88e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            throw new RuntimeException(throwable);
89e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        }
90e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        // Wait for paged list view to layout by using espresso to scroll to a position.
91e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        onView(withId(R.id.recycler_view)).perform(scrollToPosition(0));
92e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
93e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
94e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    private static void verifyViewIsHidden(View view) {
95e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        if (view instanceof ViewGroup) {
96e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            ViewGroup viewGroup = (ViewGroup) view;
97e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            final int childCount = viewGroup.getChildCount();
98e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            for (int i = 0; i < childCount; i++) {
99e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                verifyViewIsHidden(viewGroup.getChildAt(i));
100e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            }
101e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        } else {
102e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            assertThat(view.getVisibility(), is(equalTo(View.GONE)));
103e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        }
104e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
105e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
106e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    private ListItemAdapter.ViewHolder getViewHolderAtPosition(int position) {
107e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        return (ListItemAdapter.ViewHolder) mPagedListView.getRecyclerView()
108e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                .findViewHolderForAdapterPosition(
109e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                position);
110e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
111e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
112e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
113e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testEmptyItemHidesAllViews() {
114e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        ListItem item = new ListItem.Builder(mActivity).build();
115e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(Arrays.asList(item));
116e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        verifyViewIsHidden(mPagedListView.findViewByPosition(0));
117e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
118e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
119e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
120e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testPrimaryActionVisible() {
121e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        List<ListItem> items = Arrays.asList(
122e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                new ListItem.Builder(mActivity)
123e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withPrimaryActionIcon(android.R.drawable.sym_def_app_icon, true)
124e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build(),
125e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                new ListItem.Builder(mActivity)
126e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withPrimaryActionIcon(android.R.drawable.sym_def_app_icon, false)
127e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build());
128e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
129e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
130e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(getViewHolderAtPosition(0).getPrimaryIcon().getVisibility(),
131e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                is(equalTo(View.VISIBLE)));
132e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(getViewHolderAtPosition(1).getPrimaryIcon().getVisibility(),
133e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                is(equalTo(View.VISIBLE)));
134e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
135e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
136e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
137e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testTextVisible() {
138e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        List<ListItem> items = Arrays.asList(
139e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                new ListItem.Builder(mActivity)
140e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withTitle("title")
141e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build(),
142e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                new ListItem.Builder(mActivity)
143e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withBody("body")
144e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build());
145e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
146e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
147e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(getViewHolderAtPosition(0).getTitle().getVisibility(),
148e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                is(equalTo(View.VISIBLE)));
149e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(getViewHolderAtPosition(1).getBody().getVisibility(),
150e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                is(equalTo(View.VISIBLE)));
151e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
152e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
153e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
154e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testSupplementalActionVisible() {
155e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        List<ListItem> items = Arrays.asList(
156e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                new ListItem.Builder(mActivity)
157e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withSupplementalIcon(android.R.drawable.sym_def_app_icon, true)
158e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build(),
159e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                new ListItem.Builder(mActivity)
160e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withAction("text", true, null)
161e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build(),
162e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                new ListItem.Builder(mActivity)
163e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withActions("text", true, null,
164e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                                 "text", true, null)
165e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build());
166e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
167e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
168e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        ListItemAdapter.ViewHolder viewHolder = getViewHolderAtPosition(0);
169e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getSupplementalIcon().getVisibility(), is(equalTo(View.VISIBLE)));
170e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getSupplementalIconDivider().getVisibility(),
171e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                is(equalTo(View.VISIBLE)));
172e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
173e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        viewHolder = getViewHolderAtPosition(1);
174e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getAction1().getVisibility(), is(equalTo(View.VISIBLE)));
175e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getAction1Divider().getVisibility(), is(equalTo(View.VISIBLE)));
176e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
177e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        viewHolder = getViewHolderAtPosition(2);
178e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getAction1().getVisibility(), is(equalTo(View.VISIBLE)));
179e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getAction1Divider().getVisibility(), is(equalTo(View.VISIBLE)));
180e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getAction2().getVisibility(), is(equalTo(View.VISIBLE)));
181e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getAction2Divider().getVisibility(), is(equalTo(View.VISIBLE)));
182e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
183e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
184e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
185e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testDividersAreOptional() {
186e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        List<ListItem> items = Arrays.asList(
187e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                new ListItem.Builder(mActivity)
188e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withSupplementalIcon(android.R.drawable.sym_def_app_icon, false)
189e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build(),
190e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                new ListItem.Builder(mActivity)
191e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withAction("text", false, null)
192e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build(),
193e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                new ListItem.Builder(mActivity)
194e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withActions("text", false, null,
195e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                                "text", false, null)
196e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build());
197e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
198e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
199e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
200e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
201e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        ListItemAdapter.ViewHolder viewHolder = getViewHolderAtPosition(0);
202e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getSupplementalIcon().getVisibility(), is(equalTo(View.VISIBLE)));
203e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getSupplementalIconDivider().getVisibility(),
204e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                is(equalTo(View.GONE)));
205e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
206e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        viewHolder = getViewHolderAtPosition(1);
207e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getAction1().getVisibility(), is(equalTo(View.VISIBLE)));
208e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getAction1Divider().getVisibility(), is(equalTo(View.GONE)));
209e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
210e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        viewHolder = getViewHolderAtPosition(2);
211e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getAction1().getVisibility(), is(equalTo(View.VISIBLE)));
212e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getAction1Divider().getVisibility(), is(equalTo(View.GONE)));
213e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getAction2().getVisibility(), is(equalTo(View.VISIBLE)));
214e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getAction2Divider().getVisibility(), is(equalTo(View.GONE)));
215e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
216e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
217e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
218e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testTextStartMarginMatchesPrimaryActionType() {
219e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        List<ListItem> items = Arrays.asList(
220e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                new ListItem.Builder(mActivity)
221e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withPrimaryActionIcon(android.R.drawable.sym_def_app_icon, true)
222e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build(),
223e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                new ListItem.Builder(mActivity)
224e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withPrimaryActionIcon(android.R.drawable.sym_def_app_icon, false)
225e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build(),
226e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                new ListItem.Builder(mActivity)
227e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withPrimaryActionEmptyIcon()
228e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build(),
229e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                new ListItem.Builder(mActivity)
230e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withPrimaryActionNoIcon()
231e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build());
232e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        List<Integer> expectedStartMargin = Arrays.asList(R.dimen.car_keyline_4,
233e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                R.dimen.car_keyline_3, R.dimen.car_keyline_3, R.dimen.car_keyline_1);
234e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
235e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
236e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        for (int i = 0; i < items.size(); i++) {
237e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            ListItemAdapter.ViewHolder viewHolder = getViewHolderAtPosition(i);
238e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
239e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            int expected = InstrumentationRegistry.getContext().getResources()
240e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                    .getDimensionPixelSize(expectedStartMargin.get(i));
241e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            assertThat(((ViewGroup.MarginLayoutParams) viewHolder.getTitle().getLayoutParams())
242e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                    .getMarginStart(), is(equalTo(expected)));
243e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            assertThat(((ViewGroup.MarginLayoutParams) viewHolder.getBody().getLayoutParams())
244e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                    .getMarginStart(), is(equalTo(expected)));
245e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        }
246e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
247e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
248e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
249e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testItemWithOnlyTitleIsSingleLine() {
250e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        List<ListItem> items = Arrays.asList(
251e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                // Only space
252e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                new ListItem.Builder(mActivity)
253e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withTitle(" ")
254e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build(),
255e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                // Underscore
256e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                new ListItem.Builder(mActivity)
257e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withTitle("______")
258e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build(),
259e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                new ListItem.Builder(mActivity)
260e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withTitle("ALL UPPER CASE")
261e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build(),
262e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                // String wouldn't fit in one line
263e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                new ListItem.Builder(mActivity)
264e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withTitle(InstrumentationRegistry.getContext().getResources().getString(
265e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                                R.string.over_120_chars))
266e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build());
267e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
268e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
269e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        double singleLineHeight = InstrumentationRegistry.getContext().getResources().getDimension(
270e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                R.dimen.car_single_line_list_item_height);
271e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
272e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        for (int i = 0; i < items.size(); i++) {
273e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            assertThat((double) mPagedListView.findViewByPosition(i).getHeight(),
274e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                    is(closeTo(singleLineHeight, 1.0d)));
275e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        }
276e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
277e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
278e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
279e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testItemWithBodyTextIsAtLeastDoubleLine() {
280e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        List<ListItem> items = Arrays.asList(
281e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                // Only space
282e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                new ListItem.Builder(mActivity)
283e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withBody(" ")
284e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build(),
285e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                // Underscore
286e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                new ListItem.Builder(mActivity)
287e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withBody("____")
288e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build(),
289e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                // String wouldn't fit in one line
290e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                new ListItem.Builder(mActivity)
291e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withBody(InstrumentationRegistry.getContext().getResources().getString(
292e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                                R.string.over_120_chars))
293e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build());
294e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
295e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
296e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        final int doubleLineHeight =
297e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                (int) InstrumentationRegistry.getContext().getResources().getDimension(
298e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        R.dimen.car_double_line_list_item_height);
299e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
300e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        for (int i = 0; i < items.size(); i++) {
301e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            assertThat(mPagedListView.findViewByPosition(i).getHeight(),
302e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                    is(greaterThanOrEqualTo(doubleLineHeight)));
303e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        }
304e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
305e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
306e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
307e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testBodyTextLengthLimit() {
308e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        final String longText = InstrumentationRegistry.getContext().getResources().getString(
309e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                R.string.over_120_chars);
310e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        final int limit = InstrumentationRegistry.getContext().getResources().getInteger(
311e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                R.integer.car_list_item_text_length_limit);
312e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        List<ListItem> items = Arrays.asList(
313e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                new ListItem.Builder(mActivity)
314e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withBody(longText)
315e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build());
316e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
317e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
318e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        // + 1 for appended ellipsis.
319e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(getViewHolderAtPosition(0).getBody().getText().length(),
320e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                is(equalTo(limit + 1)));
321e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
322e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
323e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
324e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testPrimaryIconDrawable() {
325e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        Drawable drawable = InstrumentationRegistry.getContext().getResources().getDrawable(
326e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                android.R.drawable.sym_def_app_icon, null);
327e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        List<ListItem> items = Arrays.asList(
328e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                new ListItem.Builder(mActivity)
329e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withPrimaryActionIcon(drawable, true)
330e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build());
331e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
332e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
333e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertTrue(getViewHolderAtPosition(0).getPrimaryIcon().getDrawable().getConstantState()
334e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                .equals(drawable.getConstantState()));
335e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
336e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
337e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
338e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testLargePrimaryIconHasNoStartMargin() {
339e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        List<ListItem> items = Arrays.asList(
340e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                new ListItem.Builder(mActivity)
341e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withPrimaryActionIcon(android.R.drawable.sym_def_app_icon, true)
342e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build());
343e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
344e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
345e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        ListItemAdapter.ViewHolder viewHolder = getViewHolderAtPosition(0);
346e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(((ViewGroup.MarginLayoutParams) viewHolder.getPrimaryIcon().getLayoutParams())
347e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                .getMarginStart(), is(equalTo(0)));
348e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
349e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
350e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
351e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testSmallPrimaryIconStartMargin() {
352e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        List<ListItem> items = Arrays.asList(
353e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                new ListItem.Builder(mActivity)
354e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withPrimaryActionIcon(android.R.drawable.sym_def_app_icon, false)
355e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build());
356e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
357e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
358e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        int expected = InstrumentationRegistry.getContext().getResources().getDimensionPixelSize(
359e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                R.dimen.car_keyline_1);
360e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
361e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        ListItemAdapter.ViewHolder viewHolder = getViewHolderAtPosition(0);
362e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(((ViewGroup.MarginLayoutParams) viewHolder.getPrimaryIcon().getLayoutParams())
363e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                .getMarginStart(), is(equalTo(expected)));
364e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
365e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
366e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
367e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testClickingPrimaryActionIsSeparateFromSupplementalAction() {
368e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        final boolean[] clicked = {false, false};
369e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        List<ListItem> items = Arrays.asList(
370e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                new ListItem.Builder(mActivity)
371e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withOnClickListener((v) -> clicked[0] = true)
372e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withSupplementalIcon(android.R.drawable.sym_def_app_icon, true,
373e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                                (v) -> clicked[1] = true)
374e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build());
375e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
376e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
377e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        onView(withId(R.id.recycler_view)).perform(actionOnItemAtPosition(0, click()));
378e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertTrue(clicked[0]);
379e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertFalse(clicked[1]);
380e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
381e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        onView(withId(R.id.recycler_view)).perform(
382e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                actionOnItemAtPosition(0, clickChildViewWithId(R.id.supplemental_icon)));
383e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertTrue(clicked[1]);
384e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
385e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
386e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
387e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testClickingSupplementalIcon() {
388e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        final boolean[] clicked = {false};
389e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        List<ListItem> items = Arrays.asList(
390e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                new ListItem.Builder(mActivity)
391e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withSupplementalIcon(android.R.drawable.sym_def_app_icon, true,
392e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                                (v) -> clicked[0] = true)
393e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build());
394e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
395e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
396e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        onView(withId(R.id.recycler_view)).perform(
397e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                actionOnItemAtPosition(0, clickChildViewWithId(R.id.supplemental_icon)));
398e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertTrue(clicked[0]);
399e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
400e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
401e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
402e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testClickingSupplementalAction() {
403e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        final boolean[] clicked = {false};
404e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        List<ListItem> items = Arrays.asList(
405e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                new ListItem.Builder(mActivity)
406e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withAction("action", true, (v) -> clicked[0] = true)
407e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build());
408e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
409e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
410e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        onView(withId(R.id.recycler_view)).perform(
411e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                actionOnItemAtPosition(0, clickChildViewWithId(R.id.action1)));
412e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertTrue(clicked[0]);
413e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
414e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
415e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
416e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testClickingBothSupplementalActions() {
417e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        final boolean[] clicked = {false, false};
418e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        List<ListItem> items = Arrays.asList(
419e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                new ListItem.Builder(mActivity)
420e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withActions("action 1", true, (v) -> clicked[0] = true,
421e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                                "action 2", true, (v) -> clicked[1] = true)
422e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build());
423e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
424e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
425e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        onView(withId(R.id.recycler_view)).perform(
426e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                actionOnItemAtPosition(0, clickChildViewWithId(R.id.action1)));
427e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertTrue(clicked[0]);
428e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertFalse(clicked[1]);
429e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
430e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        onView(withId(R.id.recycler_view)).perform(
431e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                actionOnItemAtPosition(0, clickChildViewWithId(R.id.action2)));
432e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertTrue(clicked[1]);
433e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
434e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
435e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
436e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testCustomViewBinderAreCalledLast() {
437e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        final String updatedTitle = "updated title";
438e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        List<ListItem> items = Arrays.asList(
439e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                new ListItem.Builder(mActivity)
440e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withTitle("original title")
441e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withViewBinder((viewHolder) -> viewHolder.getTitle().setText(updatedTitle))
442e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build());
443e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
444e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
445e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        ListItemAdapter.ViewHolder viewHolder = getViewHolderAtPosition(0);
446e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getTitle().getText(), is(equalTo(updatedTitle)));
447e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
448e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
449e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
450e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testCustomViewBinderOnUnusedViewsHasNoEffect() {
451e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        List<ListItem> items = Arrays.asList(
452e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                new ListItem.Builder(mActivity)
453e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withViewBinder((viewHolder) -> viewHolder.getBody().setText("text"))
454e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build());
455e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
456e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
457e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        ListItemAdapter.ViewHolder viewHolder = getViewHolderAtPosition(0);
458e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getBody().getVisibility(), is(equalTo(View.GONE)));
459e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        // Custom binder interacts with body but has no effect.
460e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        // Expect card height to remain single line.
461e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat((double) viewHolder.itemView.getHeight(), is(closeTo(
462e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                InstrumentationRegistry.getContext().getResources().getDimension(
463e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        R.dimen.car_single_line_list_item_height), 1.0d)));
464e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
465e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
466e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
467e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testCardLookUsesCardView() {
468e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        List<ListItem> items = Arrays.asList(
469e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                new ListItem.Builder(mActivity)
470e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withCardLook()
471e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build());
472e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
473e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
474e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        ListItemAdapter.ViewHolder viewHolder = getViewHolderAtPosition(0);
475e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.itemView, is(instanceOf(CardView.class)));
476e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
477e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
478e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
479e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testSettingTitleOrBodyAsPrimaryText() {
480e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        // Create 2 items, one with Title as primary (default) and one with Body.
481e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        // The primary text, regardless of view, should have consistent look (as primary).
482e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        List<ListItem> items = Arrays.asList(
483e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                new ListItem.Builder(mActivity)
484e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withTitle("title")
485e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withBody("body")
486e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build(),
487e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                new ListItem.Builder(mActivity)
488e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withTitle("title")
489e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withBody("body", true)
490e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build());
491e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
492e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
493e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        ListItemAdapter.ViewHolder titlePrimary = getViewHolderAtPosition(0);
494e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        ListItemAdapter.ViewHolder bodyPrimary = getViewHolderAtPosition(1);
495e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(titlePrimary.getTitle().getTextSize(),
496e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                is(equalTo(bodyPrimary.getBody().getTextSize())));
497e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(titlePrimary.getTitle().getTextColors(),
498e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                is(equalTo(bodyPrimary.getBody().getTextColors())));
499e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
500e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
501a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing    @Test
502a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing    public void testNoCarriedOverLayoutParamsForTextView() throws Throwable {
503a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        ListItem singleLine = new ListItem.Builder(mActivity).withTitle("t").build();
504a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        setupPagedListView(Arrays.asList(singleLine));
505a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing
506a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        // Manually rebind the view holder of a single line item to a double line item.
507a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        ListItem doubleLine = new ListItem.Builder(mActivity).withTitle("t").withBody("b").build();
508a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        ListItemAdapter.ViewHolder viewHolder = getViewHolderAtPosition(0);
509a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        mActivityRule.runOnUiThread(() -> doubleLine.bind(viewHolder));
510a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing
511a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        RelativeLayout.LayoutParams titleLayoutParams =
512a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing                (RelativeLayout.LayoutParams) viewHolder.getTitle().getLayoutParams();
513a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        RelativeLayout.LayoutParams bodyLayoutParams =
514a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing                (RelativeLayout.LayoutParams) viewHolder.getTitle().getLayoutParams();
515a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        assertThat(titleLayoutParams.getRule(RelativeLayout.CENTER_VERTICAL), is(equalTo(0)));
516a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        assertThat(bodyLayoutParams.getRule(RelativeLayout.CENTER_VERTICAL), is(equalTo(0)));
517a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing    }
518a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing
519a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing    @Test
520a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing    public void testNoCarriedOverLayoutParamsForPrimaryIcon() throws Throwable {
521a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        ListItem smallIcon = new ListItem.Builder(mActivity)
522a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing                .withPrimaryActionIcon(android.R.drawable.sym_def_app_icon, false)
523a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing                .withBody("body")  // Small icon of items with body text should use top margin.
524a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing                .build();
525a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        setupPagedListView(Arrays.asList(smallIcon));
526a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing
527a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        // Manually rebind the view holder.
528a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        ListItem largeIcon = new ListItem.Builder(mActivity)
529a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing                .withPrimaryActionIcon(android.R.drawable.sym_def_app_icon, true)
530a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing                .build();
531a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        ListItemAdapter.ViewHolder viewHolder = getViewHolderAtPosition(0);
532a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        mActivityRule.runOnUiThread(() -> largeIcon.bind(viewHolder));
533a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing
534a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        RelativeLayout.LayoutParams iconLayoutParams =
535a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing                (RelativeLayout.LayoutParams) viewHolder.getPrimaryIcon().getLayoutParams();
536a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        assertThat(iconLayoutParams.getRule(RelativeLayout.CENTER_VERTICAL),
537a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing                is(equalTo(RelativeLayout.TRUE)));
538a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        assertThat(iconLayoutParams.topMargin, is(equalTo(0)));
539a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing    }
540a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing
541e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    private static ViewAction clickChildViewWithId(final int id) {
542e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        return new ViewAction() {
543e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            @Override
544e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            public Matcher<View> getConstraints() {
545e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                return null;
546e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            }
547e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
548e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            @Override
549e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            public String getDescription() {
550e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                return "Click on a child view with specific id.";
551e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            }
552e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
553e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            @Override
554e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            public void perform(UiController uiController, View view) {
555e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                View v = view.findViewById(id);
556e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                v.performClick();
557e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            }
558e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        };
559e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
560e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing}
561