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