TextListItemTest.java revision 9b0ebd7c98d4c0d73c101851014ecc5f4b70471a
1e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing/*
2e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing * Copyright 2017 The Android Open Source Project
3e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing *
4e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing * Licensed under the Apache License, Version 2.0 (the "License");
5e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing * you may not use this file except in compliance with the License.
6e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing * You may obtain a copy of the License at
7e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing *
8e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing *      http://www.apache.org/licenses/LICENSE-2.0
9e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing *
10e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing * Unless required by applicable law or agreed to in writing, software
11e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing * distributed under the License is distributed on an "AS IS" BASIS,
12e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing * See the License for the specific language governing permissions and
14e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing * limitations under the License.
15e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing */
16e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
17e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingpackage androidx.car.widget;
18e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
19e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport static android.support.test.espresso.Espresso.onView;
20e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport static android.support.test.espresso.action.ViewActions.click;
21e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport static android.support.test.espresso.contrib.RecyclerViewActions.actionOnItemAtPosition;
22e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport static android.support.test.espresso.contrib.RecyclerViewActions.scrollToPosition;
23e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport static android.support.test.espresso.matcher.ViewMatchers.withId;
24e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
25e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport static org.hamcrest.Matchers.greaterThanOrEqualTo;
269b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovanaimport static org.hamcrest.Matchers.notNullValue;
27e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport static org.hamcrest.core.Is.is;
28e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport static org.hamcrest.core.IsEqual.equalTo;
29e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport static org.hamcrest.number.IsCloseTo.closeTo;
30fa39e2bca1b284ad7c931d9194287770b7b507faAurimas Liutikasimport static org.junit.Assert.assertFalse;
31e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport static org.junit.Assert.assertThat;
32e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport static org.junit.Assert.assertTrue;
33e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
34e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport android.graphics.drawable.Drawable;
35e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport android.support.test.InstrumentationRegistry;
36e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport android.support.test.espresso.UiController;
37e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport android.support.test.espresso.ViewAction;
38e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport android.support.test.filters.SmallTest;
39e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport android.support.test.rule.ActivityTestRule;
40e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport android.support.test.runner.AndroidJUnit4;
41b226d4dcc396fe8837876dfa113143702dd23c26Anthony Chenimport android.support.v7.widget.LinearLayoutManager;
42e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport android.view.View;
43e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport android.view.ViewGroup;
44a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxingimport android.widget.RelativeLayout;
45e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
46e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport org.hamcrest.Matcher;
47e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport org.junit.Before;
48e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport org.junit.Rule;
49e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport org.junit.Test;
50e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport org.junit.runner.RunWith;
51e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
52e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport java.util.ArrayList;
53e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport java.util.Arrays;
54e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport java.util.List;
55e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
56e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport androidx.car.test.R;
57e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
58e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing/**
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));
115b226d4dcc396fe8837876dfa113143702dd23c26Anthony Chen        verifyViewIsHidden(mPagedListView.getRecyclerView().getLayoutManager().getChildAt(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)
159439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing                        .withAction("text", true, v -> { /* Do nothing. */ })
160e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build(),
161e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                new ListItem.Builder(mActivity)
162439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing                        .withActions("text", true, v -> { /* Do nothing. */ },
163439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing                                 "text", true, v -> { /* Do nothing. */ })
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)
190439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing                        .withAction("text", false, v -> { /* Do nothing. */ })
191e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build(),
192e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                new ListItem.Builder(mActivity)
193439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing                        .withActions("text", false, v -> { /* Do nothing. */ },
194439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing                                "text", false, v -> { /* Do nothing. */ })
195e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build());
196e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
197e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
198e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        ListItemAdapter.ViewHolder viewHolder = getViewHolderAtPosition(0);
199e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getSupplementalIcon().getVisibility(), is(equalTo(View.VISIBLE)));
200e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getSupplementalIconDivider().getVisibility(),
201e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                is(equalTo(View.GONE)));
202e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
203e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        viewHolder = getViewHolderAtPosition(1);
204e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getAction1().getVisibility(), is(equalTo(View.VISIBLE)));
205e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getAction1Divider().getVisibility(), is(equalTo(View.GONE)));
206e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
207e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        viewHolder = getViewHolderAtPosition(2);
208e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getAction1().getVisibility(), is(equalTo(View.VISIBLE)));
209e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getAction1Divider().getVisibility(), is(equalTo(View.GONE)));
210e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getAction2().getVisibility(), is(equalTo(View.VISIBLE)));
211e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getAction2Divider().getVisibility(), is(equalTo(View.GONE)));
212e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
213e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
214e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
2159b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana    public void testCanHideItemDividers() {
2169b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana        List<ListItem> items = Arrays.asList(
2179b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana                new ListItem.Builder(mActivity)
2189b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana                        .withDividerHidden()
2199b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana                        .build(),
2209b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana                new ListItem.Builder(mActivity)
2219b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana                        .build());
2229b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana        setupPagedListView(items);
2239b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana
2249b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana        assertThat(items.get(0).shouldHideDivider(), is(true));
2259b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana        assertThat(items.get(1).shouldHideDivider(), is(false));
2269b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana
2279b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana        PagedListView.DividerVisibilityManager dvm = (PagedListView.DividerVisibilityManager)
2289b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana                mPagedListView.getAdapter();
2299b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana        assertThat(dvm, is(notNullValue()));
2309b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana        assertThat(dvm.shouldHideDivider(0), is(true));
2319b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana        assertThat(dvm.shouldHideDivider(1), is(false));
2329b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana    }
2339b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana
2349b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana    @Test
235e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testTextStartMarginMatchesPrimaryActionType() {
236e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        List<ListItem> items = Arrays.asList(
237e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                new ListItem.Builder(mActivity)
238e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withPrimaryActionIcon(android.R.drawable.sym_def_app_icon, true)
239e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build(),
240e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                new ListItem.Builder(mActivity)
241e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withPrimaryActionIcon(android.R.drawable.sym_def_app_icon, false)
242e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build(),
243e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                new ListItem.Builder(mActivity)
244e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withPrimaryActionEmptyIcon()
245e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build(),
246e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                new ListItem.Builder(mActivity)
247e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withPrimaryActionNoIcon()
248e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build());
249e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        List<Integer> expectedStartMargin = Arrays.asList(R.dimen.car_keyline_4,
250e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                R.dimen.car_keyline_3, R.dimen.car_keyline_3, R.dimen.car_keyline_1);
251e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
252e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
253e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        for (int i = 0; i < items.size(); i++) {
254e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            ListItemAdapter.ViewHolder viewHolder = getViewHolderAtPosition(i);
255e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
256e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            int expected = InstrumentationRegistry.getContext().getResources()
257e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                    .getDimensionPixelSize(expectedStartMargin.get(i));
258e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            assertThat(((ViewGroup.MarginLayoutParams) viewHolder.getTitle().getLayoutParams())
259e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                    .getMarginStart(), is(equalTo(expected)));
260e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            assertThat(((ViewGroup.MarginLayoutParams) viewHolder.getBody().getLayoutParams())
261e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                    .getMarginStart(), is(equalTo(expected)));
262e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        }
263e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
264e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
265e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
266e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testItemWithOnlyTitleIsSingleLine() {
267e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        List<ListItem> items = Arrays.asList(
268e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                // Only space
269e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                new ListItem.Builder(mActivity)
270e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withTitle(" ")
271e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build(),
272e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                // Underscore
273e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                new ListItem.Builder(mActivity)
274e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withTitle("______")
275e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build(),
276e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                new ListItem.Builder(mActivity)
277e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withTitle("ALL UPPER CASE")
278e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build(),
279e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                // String wouldn't fit in one line
280e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                new ListItem.Builder(mActivity)
281e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withTitle(InstrumentationRegistry.getContext().getResources().getString(
282e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                                R.string.over_120_chars))
283e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build());
284e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
285e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
286e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        double singleLineHeight = InstrumentationRegistry.getContext().getResources().getDimension(
287e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                R.dimen.car_single_line_list_item_height);
288e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
289b226d4dcc396fe8837876dfa113143702dd23c26Anthony Chen        LinearLayoutManager layoutManager =
290b226d4dcc396fe8837876dfa113143702dd23c26Anthony Chen                (LinearLayoutManager) mPagedListView.getRecyclerView().getLayoutManager();
291e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        for (int i = 0; i < items.size(); i++) {
292b226d4dcc396fe8837876dfa113143702dd23c26Anthony Chen            assertThat((double) layoutManager.findViewByPosition(i).getHeight(),
293e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                    is(closeTo(singleLineHeight, 1.0d)));
294e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        }
295e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
296e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
297e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
298e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testItemWithBodyTextIsAtLeastDoubleLine() {
299e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        List<ListItem> items = Arrays.asList(
300e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                // Only space
301e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                new ListItem.Builder(mActivity)
302e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withBody(" ")
303e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build(),
304e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                // Underscore
305e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                new ListItem.Builder(mActivity)
306e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withBody("____")
307e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build(),
308e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                // String wouldn't fit in one line
309e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                new ListItem.Builder(mActivity)
310e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withBody(InstrumentationRegistry.getContext().getResources().getString(
311e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                                R.string.over_120_chars))
312e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build());
313e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
314e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
315e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        final int doubleLineHeight =
316e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                (int) InstrumentationRegistry.getContext().getResources().getDimension(
317e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        R.dimen.car_double_line_list_item_height);
318e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
319b226d4dcc396fe8837876dfa113143702dd23c26Anthony Chen        LinearLayoutManager layoutManager =
320b226d4dcc396fe8837876dfa113143702dd23c26Anthony Chen                (LinearLayoutManager) mPagedListView.getRecyclerView().getLayoutManager();
321e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        for (int i = 0; i < items.size(); i++) {
322b226d4dcc396fe8837876dfa113143702dd23c26Anthony Chen            assertThat(layoutManager.findViewByPosition(i).getHeight(),
323e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                    is(greaterThanOrEqualTo(doubleLineHeight)));
324e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        }
325e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
326e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
327e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
328e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testBodyTextLengthLimit() {
329e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        final String longText = InstrumentationRegistry.getContext().getResources().getString(
330e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                R.string.over_120_chars);
331e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        final int limit = InstrumentationRegistry.getContext().getResources().getInteger(
332e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                R.integer.car_list_item_text_length_limit);
333e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        List<ListItem> items = Arrays.asList(
334e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                new ListItem.Builder(mActivity)
335e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withBody(longText)
336e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build());
337e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
338e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
339e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        // + 1 for appended ellipsis.
340e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(getViewHolderAtPosition(0).getBody().getText().length(),
341e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                is(equalTo(limit + 1)));
342e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
343e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
344e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
345e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testPrimaryIconDrawable() {
346e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        Drawable drawable = InstrumentationRegistry.getContext().getResources().getDrawable(
347e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                android.R.drawable.sym_def_app_icon, null);
348e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        List<ListItem> items = Arrays.asList(
349e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                new ListItem.Builder(mActivity)
350e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withPrimaryActionIcon(drawable, true)
351e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build());
352e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
353e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
354e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertTrue(getViewHolderAtPosition(0).getPrimaryIcon().getDrawable().getConstantState()
355e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                .equals(drawable.getConstantState()));
356e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
357e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
358e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
359e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testLargePrimaryIconHasNoStartMargin() {
360e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        List<ListItem> items = Arrays.asList(
361e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                new ListItem.Builder(mActivity)
362e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withPrimaryActionIcon(android.R.drawable.sym_def_app_icon, true)
363e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build());
364e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
365e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
366e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        ListItemAdapter.ViewHolder viewHolder = getViewHolderAtPosition(0);
367e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(((ViewGroup.MarginLayoutParams) viewHolder.getPrimaryIcon().getLayoutParams())
368e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                .getMarginStart(), is(equalTo(0)));
369e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
370e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
371e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
372e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testSmallPrimaryIconStartMargin() {
373e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        List<ListItem> items = Arrays.asList(
374e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                new ListItem.Builder(mActivity)
375e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withPrimaryActionIcon(android.R.drawable.sym_def_app_icon, false)
376e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build());
377e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
378e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
379e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        int expected = InstrumentationRegistry.getContext().getResources().getDimensionPixelSize(
380e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                R.dimen.car_keyline_1);
381e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
382e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        ListItemAdapter.ViewHolder viewHolder = getViewHolderAtPosition(0);
383e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(((ViewGroup.MarginLayoutParams) viewHolder.getPrimaryIcon().getLayoutParams())
384e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                .getMarginStart(), is(equalTo(expected)));
385e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
386e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
387e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
3885dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing    public void testSmallPrimaryIconTopMarginRemainsTheSameRegardlessOfTextLength() {
3895dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing        final String longText = InstrumentationRegistry.getContext().getResources().getString(
3905dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing                R.string.over_120_chars);
3915dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing        List<ListItem> items = Arrays.asList(
3925dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing                // Single line item.
3935dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing                new ListItem.Builder(mActivity)
3945dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing                        .withPrimaryActionIcon(android.R.drawable.sym_def_app_icon, false)
3955dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing                        .withTitle("one line text")
3965dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing                        .build(),
3975dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing                // Double line item with one line text.
3985dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing                new ListItem.Builder(mActivity)
3995dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing                        .withPrimaryActionIcon(android.R.drawable.sym_def_app_icon, false)
4005dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing                        .withTitle("one line text")
4015dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing                        .withBody("one line text")
4025dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing                        .build(),
4035dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing                // Double line item with long text.
4045dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing                new ListItem.Builder(mActivity)
4055dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing                        .withPrimaryActionIcon(android.R.drawable.sym_def_app_icon, false)
4065dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing                        .withTitle("one line text")
4075dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing                        .withBody(longText)
4085dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing                        .build(),
4095dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing                // Body text only - long text.
4105dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing                new ListItem.Builder(mActivity)
4115dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing                        .withPrimaryActionIcon(android.R.drawable.sym_def_app_icon, false)
4125dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing                        .withBody(longText)
4135dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing                        .build(),
4145dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing                // Body text only - one line text.
4155dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing                new ListItem.Builder(mActivity)
4165dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing                        .withPrimaryActionIcon(android.R.drawable.sym_def_app_icon, false)
4175dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing                        .withBody("one line text")
4185dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing                        .build());
4195dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing        setupPagedListView(items);
4205dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing
4215dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing        for (int i = 1; i < items.size(); i++) {
4225dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing            onView(withId(R.id.recycler_view)).perform(scrollToPosition(i));
4235dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing            // Implementation uses integer division so it may be off by 1 vs centered vertically.
4245dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing            assertThat((double) getViewHolderAtPosition(i - 1).getPrimaryIcon().getTop(),
4255dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing                    is(closeTo(
4265dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing                    (double) getViewHolderAtPosition(i).getPrimaryIcon().getTop(), 1.0d)));
4275dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing        }
4285dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing    }
4295dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing
4305dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing    @Test
431e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testClickingPrimaryActionIsSeparateFromSupplementalAction() {
432e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        final boolean[] clicked = {false, false};
433e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        List<ListItem> items = Arrays.asList(
434e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                new ListItem.Builder(mActivity)
435439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing                        .withOnClickListener(v -> clicked[0] = true)
436e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withSupplementalIcon(android.R.drawable.sym_def_app_icon, true,
437439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing                                v -> clicked[1] = true)
438e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build());
439e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
440e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
441e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        onView(withId(R.id.recycler_view)).perform(actionOnItemAtPosition(0, click()));
442e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertTrue(clicked[0]);
443e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertFalse(clicked[1]);
444e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
445e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        onView(withId(R.id.recycler_view)).perform(
446e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                actionOnItemAtPosition(0, clickChildViewWithId(R.id.supplemental_icon)));
447e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertTrue(clicked[1]);
448e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
449e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
450e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
451e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testClickingSupplementalIcon() {
452e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        final boolean[] clicked = {false};
453e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        List<ListItem> items = Arrays.asList(
454e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                new ListItem.Builder(mActivity)
455e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withSupplementalIcon(android.R.drawable.sym_def_app_icon, true,
456439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing                                v -> clicked[0] = true)
457e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build());
458e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
459e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
460e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        onView(withId(R.id.recycler_view)).perform(
461e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                actionOnItemAtPosition(0, clickChildViewWithId(R.id.supplemental_icon)));
462e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertTrue(clicked[0]);
463e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
464e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
465e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
466439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing    public void testSupplementalIconWithoutClickListenerIsNotClickable() {
467439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing        List<ListItem> items = Arrays.asList(
468439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing                new ListItem.Builder(mActivity)
469439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing                        .withSupplementalIcon(android.R.drawable.sym_def_app_icon, true)
470439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing                        .build());
471439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing        setupPagedListView(items);
472439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing
473439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing        ListItemAdapter.ViewHolder viewHolder = getViewHolderAtPosition(0);
474439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing        assertFalse(viewHolder.getSupplementalIcon().isClickable());
475439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing    }
476439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing
477439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing    @Test
478e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testClickingSupplementalAction() {
479e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        final boolean[] clicked = {false};
480e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        List<ListItem> items = Arrays.asList(
481e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                new ListItem.Builder(mActivity)
482439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing                        .withAction("action", true, v -> clicked[0] = true)
483e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build());
484e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
485e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
486e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        onView(withId(R.id.recycler_view)).perform(
487e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                actionOnItemAtPosition(0, clickChildViewWithId(R.id.action1)));
488e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertTrue(clicked[0]);
489e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
490e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
491e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
492e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testClickingBothSupplementalActions() {
493e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        final boolean[] clicked = {false, false};
494e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        List<ListItem> items = Arrays.asList(
495e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                new ListItem.Builder(mActivity)
496439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing                        .withActions("action 1", true, v -> clicked[0] = true,
497439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing                                "action 2", true, v -> clicked[1] = true)
498e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build());
499e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
500e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
501e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        onView(withId(R.id.recycler_view)).perform(
502e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                actionOnItemAtPosition(0, clickChildViewWithId(R.id.action1)));
503e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertTrue(clicked[0]);
504e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertFalse(clicked[1]);
505e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
506e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        onView(withId(R.id.recycler_view)).perform(
507e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                actionOnItemAtPosition(0, clickChildViewWithId(R.id.action2)));
508e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertTrue(clicked[1]);
509e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
510e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
511e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
512e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testCustomViewBinderAreCalledLast() {
513e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        final String updatedTitle = "updated title";
514e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        List<ListItem> items = Arrays.asList(
515e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                new ListItem.Builder(mActivity)
516e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withTitle("original title")
517e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withViewBinder((viewHolder) -> viewHolder.getTitle().setText(updatedTitle))
518e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build());
519e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
520e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
521e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        ListItemAdapter.ViewHolder viewHolder = getViewHolderAtPosition(0);
522e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getTitle().getText(), is(equalTo(updatedTitle)));
523e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
524e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
525e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
526e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testCustomViewBinderOnUnusedViewsHasNoEffect() {
527e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        List<ListItem> items = Arrays.asList(
528e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                new ListItem.Builder(mActivity)
529e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withViewBinder((viewHolder) -> viewHolder.getBody().setText("text"))
530e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build());
531e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
532e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
533e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        ListItemAdapter.ViewHolder viewHolder = getViewHolderAtPosition(0);
534e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(viewHolder.getBody().getVisibility(), is(equalTo(View.GONE)));
535e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        // Custom binder interacts with body but has no effect.
536e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        // Expect card height to remain single line.
537e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat((double) viewHolder.itemView.getHeight(), is(closeTo(
538e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                InstrumentationRegistry.getContext().getResources().getDimension(
539e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        R.dimen.car_single_line_list_item_height), 1.0d)));
540e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
541e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
542e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    @Test
543e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    public void testSettingTitleOrBodyAsPrimaryText() {
544e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        // Create 2 items, one with Title as primary (default) and one with Body.
545e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        // The primary text, regardless of view, should have consistent look (as primary).
546e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        List<ListItem> items = Arrays.asList(
547e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                new ListItem.Builder(mActivity)
548e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withTitle("title")
549e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withBody("body")
550e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build(),
551e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                new ListItem.Builder(mActivity)
552e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withTitle("title")
553e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .withBody("body", true)
554e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                        .build());
555e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        setupPagedListView(items);
556e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
557e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        ListItemAdapter.ViewHolder titlePrimary = getViewHolderAtPosition(0);
558e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        ListItemAdapter.ViewHolder bodyPrimary = getViewHolderAtPosition(1);
559e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(titlePrimary.getTitle().getTextSize(),
560e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                is(equalTo(bodyPrimary.getBody().getTextSize())));
561e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        assertThat(titlePrimary.getTitle().getTextColors(),
562e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                is(equalTo(bodyPrimary.getBody().getTextColors())));
563e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
564e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
565a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing    @Test
566a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing    public void testNoCarriedOverLayoutParamsForTextView() throws Throwable {
567a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        ListItem singleLine = new ListItem.Builder(mActivity).withTitle("t").build();
568a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        setupPagedListView(Arrays.asList(singleLine));
569a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing
570a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        // Manually rebind the view holder of a single line item to a double line item.
571a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        ListItem doubleLine = new ListItem.Builder(mActivity).withTitle("t").withBody("b").build();
572a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        ListItemAdapter.ViewHolder viewHolder = getViewHolderAtPosition(0);
573a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        mActivityRule.runOnUiThread(() -> doubleLine.bind(viewHolder));
574a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing
575a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        RelativeLayout.LayoutParams titleLayoutParams =
576a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing                (RelativeLayout.LayoutParams) viewHolder.getTitle().getLayoutParams();
577a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        RelativeLayout.LayoutParams bodyLayoutParams =
578a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing                (RelativeLayout.LayoutParams) viewHolder.getTitle().getLayoutParams();
579a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        assertThat(titleLayoutParams.getRule(RelativeLayout.CENTER_VERTICAL), is(equalTo(0)));
580a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        assertThat(bodyLayoutParams.getRule(RelativeLayout.CENTER_VERTICAL), is(equalTo(0)));
581a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing    }
582a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing
583a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing    @Test
584a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing    public void testNoCarriedOverLayoutParamsForPrimaryIcon() throws Throwable {
585a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        ListItem smallIcon = new ListItem.Builder(mActivity)
586a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing                .withPrimaryActionIcon(android.R.drawable.sym_def_app_icon, false)
587a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing                .withBody("body")  // Small icon of items with body text should use top margin.
588a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing                .build();
589a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        setupPagedListView(Arrays.asList(smallIcon));
590a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing
591a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        // Manually rebind the view holder.
592a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        ListItem largeIcon = new ListItem.Builder(mActivity)
593a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing                .withPrimaryActionIcon(android.R.drawable.sym_def_app_icon, true)
594a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing                .build();
595a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        ListItemAdapter.ViewHolder viewHolder = getViewHolderAtPosition(0);
596a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        mActivityRule.runOnUiThread(() -> largeIcon.bind(viewHolder));
597a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing
598a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        RelativeLayout.LayoutParams iconLayoutParams =
599a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing                (RelativeLayout.LayoutParams) viewHolder.getPrimaryIcon().getLayoutParams();
600a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        assertThat(iconLayoutParams.getRule(RelativeLayout.CENTER_VERTICAL),
601a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing                is(equalTo(RelativeLayout.TRUE)));
602a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing        assertThat(iconLayoutParams.topMargin, is(equalTo(0)));
603a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing    }
604a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing
605e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    private static ViewAction clickChildViewWithId(final int id) {
606e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        return new ViewAction() {
607e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            @Override
608e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            public Matcher<View> getConstraints() {
609e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                return null;
610e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            }
611e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
612e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            @Override
613e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            public String getDescription() {
614e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                return "Click on a child view with specific id.";
615e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            }
616e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing
617e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            @Override
618e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            public void perform(UiController uiController, View view) {
619e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                View v = view.findViewById(id);
620e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing                v.performClick();
621e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing            }
622e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing        };
623e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing    }
624e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing}
625