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