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