TextListItemTest.java revision 4e832ea4269fff1780e0726c16bc37584957ba10
1e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing/* 2e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing * Copyright 2017 The Android Open Source Project 3e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing * 4e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing * Licensed under the Apache License, Version 2.0 (the "License"); 5e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing * you may not use this file except in compliance with the License. 6e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing * You may obtain a copy of the License at 7e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing * 8e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing * http://www.apache.org/licenses/LICENSE-2.0 9e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing * 10e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing * Unless required by applicable law or agreed to in writing, software 11e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing * distributed under the License is distributed on an "AS IS" BASIS, 12e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing * See the License for the specific language governing permissions and 14e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing * limitations under the License. 15e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing */ 16e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 17e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingpackage androidx.car.widget; 18e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 19e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport static android.support.test.espresso.Espresso.onView; 20e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport static android.support.test.espresso.action.ViewActions.click; 21e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport static android.support.test.espresso.contrib.RecyclerViewActions.actionOnItemAtPosition; 22e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport static android.support.test.espresso.contrib.RecyclerViewActions.scrollToPosition; 23e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport static android.support.test.espresso.matcher.ViewMatchers.withId; 24e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 25e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport static org.hamcrest.Matchers.greaterThanOrEqualTo; 269b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovanaimport static org.hamcrest.Matchers.notNullValue; 27e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport static org.hamcrest.core.Is.is; 28e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport static org.hamcrest.core.IsEqual.equalTo; 29e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport static org.hamcrest.number.IsCloseTo.closeTo; 30fa39e2bca1b284ad7c931d9194287770b7b507faAurimas Liutikasimport static org.junit.Assert.assertFalse; 31e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport static org.junit.Assert.assertThat; 32e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport static org.junit.Assert.assertTrue; 33e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 34e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport android.graphics.drawable.Drawable; 35e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport android.support.test.InstrumentationRegistry; 36e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport android.support.test.espresso.UiController; 37e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport android.support.test.espresso.ViewAction; 38e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport android.support.test.filters.SmallTest; 39e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport android.support.test.rule.ActivityTestRule; 40e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport android.support.test.runner.AndroidJUnit4; 41b226d4dcc396fe8837876dfa113143702dd23c26Anthony Chenimport android.support.v7.widget.LinearLayoutManager; 42e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport android.view.View; 43e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport android.view.ViewGroup; 44a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxingimport android.widget.RelativeLayout; 45e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 46e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport org.hamcrest.Matcher; 47e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport org.junit.Before; 48e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport org.junit.Rule; 49e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport org.junit.Test; 50e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport org.junit.runner.RunWith; 51e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 52e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport java.util.ArrayList; 53e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport java.util.Arrays; 54e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport java.util.List; 55e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 56e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport androidx.car.test.R; 57e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 58e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing/** 594e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing* Tests the layout configuration in {@link TextListItem}. 60e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing */ 61e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing@RunWith(AndroidJUnit4.class) 62e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing@SmallTest 634e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxingpublic class TextListItemTest { 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 784e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing private void setupPagedListView(List<TextListItem> 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 1054e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing private TextListItem.ViewHolder getViewHolderAtPosition(int position) { 1064e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing return (TextListItem.ViewHolder) mPagedListView.getRecyclerView() 107e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing .findViewHolderForAdapterPosition( 108e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing position); 109e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 110e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 111e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing @Test 112e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing public void testEmptyItemHidesAllViews() { 1134e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing TextListItem item = new TextListItem.Builder(mActivity).build(); 114e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing setupPagedListView(Arrays.asList(item)); 115b226d4dcc396fe8837876dfa113143702dd23c26Anthony Chen verifyViewIsHidden(mPagedListView.getRecyclerView().getLayoutManager().getChildAt(0)); 116e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 117e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 118e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing @Test 119e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing public void testPrimaryActionVisible() { 1204e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing List<TextListItem> items = Arrays.asList( 1214e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing new TextListItem.Builder(mActivity) 122e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing .withPrimaryActionIcon(android.R.drawable.sym_def_app_icon, true) 123e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing .build(), 1244e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing new TextListItem.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() { 1374e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing List<TextListItem> items = Arrays.asList( 1384e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing new TextListItem.Builder(mActivity) 139e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing .withTitle("title") 140e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing .build(), 1414e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing new TextListItem.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() { 1544e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing List<TextListItem> items = Arrays.asList( 1554e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing new TextListItem.Builder(mActivity) 156e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing .withSupplementalIcon(android.R.drawable.sym_def_app_icon, true) 157e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing .build(), 1584e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing new TextListItem.Builder(mActivity) 159439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing .withAction("text", true, v -> { /* Do nothing. */ }) 160e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing .build(), 1614e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing new TextListItem.Builder(mActivity) 162439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing .withActions("text", true, v -> { /* Do nothing. */ }, 163439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing "text", true, v -> { /* Do nothing. */ }) 164e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing .build()); 165e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing setupPagedListView(items); 166e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 1674e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing TextListItem.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 18422037e659c30185f51f522e1761236f780334c9dYao, Yuxing public void testSwitchVisibleAndCheckedState() { 1854e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing List<TextListItem> items = Arrays.asList( 1864e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing new TextListItem.Builder(mActivity) 18722037e659c30185f51f522e1761236f780334c9dYao, Yuxing .withSwitch(true, true, null) 18822037e659c30185f51f522e1761236f780334c9dYao, Yuxing .build(), 1894e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing new TextListItem.Builder(mActivity) 19022037e659c30185f51f522e1761236f780334c9dYao, Yuxing .withSwitch(false, true, null) 19122037e659c30185f51f522e1761236f780334c9dYao, Yuxing .build()); 19222037e659c30185f51f522e1761236f780334c9dYao, Yuxing setupPagedListView(items); 19322037e659c30185f51f522e1761236f780334c9dYao, Yuxing 1944e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0); 19522037e659c30185f51f522e1761236f780334c9dYao, Yuxing assertThat(viewHolder.getSwitch().getVisibility(), is(equalTo(View.VISIBLE))); 19622037e659c30185f51f522e1761236f780334c9dYao, Yuxing assertThat(viewHolder.getSwitch().isChecked(), is(equalTo(true))); 19722037e659c30185f51f522e1761236f780334c9dYao, Yuxing assertThat(viewHolder.getSwitchDivider().getVisibility(), is(equalTo(View.VISIBLE))); 19822037e659c30185f51f522e1761236f780334c9dYao, Yuxing 19922037e659c30185f51f522e1761236f780334c9dYao, Yuxing viewHolder = getViewHolderAtPosition(1); 20022037e659c30185f51f522e1761236f780334c9dYao, Yuxing assertThat(viewHolder.getSwitch().getVisibility(), is(equalTo(View.VISIBLE))); 20122037e659c30185f51f522e1761236f780334c9dYao, Yuxing assertThat(viewHolder.getSwitch().isChecked(), is(equalTo(false))); 20222037e659c30185f51f522e1761236f780334c9dYao, Yuxing assertThat(viewHolder.getSwitchDivider().getVisibility(), is(equalTo(View.VISIBLE))); 20322037e659c30185f51f522e1761236f780334c9dYao, Yuxing } 20422037e659c30185f51f522e1761236f780334c9dYao, Yuxing 20522037e659c30185f51f522e1761236f780334c9dYao, Yuxing @Test 206e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing public void testDividersAreOptional() { 2074e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing List<TextListItem> items = Arrays.asList( 2084e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing new TextListItem.Builder(mActivity) 209e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing .withSupplementalIcon(android.R.drawable.sym_def_app_icon, false) 210e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing .build(), 2114e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing new TextListItem.Builder(mActivity) 212439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing .withAction("text", false, v -> { /* Do nothing. */ }) 213e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing .build(), 2144e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing new TextListItem.Builder(mActivity) 215439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing .withActions("text", false, v -> { /* Do nothing. */ }, 216439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing "text", false, v -> { /* Do nothing. */ }) 21722037e659c30185f51f522e1761236f780334c9dYao, Yuxing .build(), 2184e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing new TextListItem.Builder(mActivity) 21922037e659c30185f51f522e1761236f780334c9dYao, Yuxing .withSwitch(true, false, null) 220e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing .build()); 221e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing setupPagedListView(items); 222e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 2234e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0); 224e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertThat(viewHolder.getSupplementalIcon().getVisibility(), is(equalTo(View.VISIBLE))); 225e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertThat(viewHolder.getSupplementalIconDivider().getVisibility(), 226e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing is(equalTo(View.GONE))); 227e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 228e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing viewHolder = getViewHolderAtPosition(1); 229e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertThat(viewHolder.getAction1().getVisibility(), is(equalTo(View.VISIBLE))); 230e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertThat(viewHolder.getAction1Divider().getVisibility(), is(equalTo(View.GONE))); 231e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 232e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing viewHolder = getViewHolderAtPosition(2); 233e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertThat(viewHolder.getAction1().getVisibility(), is(equalTo(View.VISIBLE))); 234e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertThat(viewHolder.getAction1Divider().getVisibility(), is(equalTo(View.GONE))); 235e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertThat(viewHolder.getAction2().getVisibility(), is(equalTo(View.VISIBLE))); 236e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertThat(viewHolder.getAction2Divider().getVisibility(), is(equalTo(View.GONE))); 23722037e659c30185f51f522e1761236f780334c9dYao, Yuxing 23822037e659c30185f51f522e1761236f780334c9dYao, Yuxing viewHolder = getViewHolderAtPosition(3); 23922037e659c30185f51f522e1761236f780334c9dYao, Yuxing assertThat(viewHolder.getSwitch().getVisibility(), is(equalTo(View.VISIBLE))); 24022037e659c30185f51f522e1761236f780334c9dYao, Yuxing assertThat(viewHolder.getSwitchDivider().getVisibility(), is(equalTo(View.GONE))); 241e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 242e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 243e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing @Test 2449b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana public void testCanHideItemDividers() { 2454e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing List<TextListItem> items = Arrays.asList( 2464e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing new TextListItem.Builder(mActivity) 2479b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana .withDividerHidden() 2489b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana .build(), 2494e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing new TextListItem.Builder(mActivity) 2509b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana .build()); 2519b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana setupPagedListView(items); 2529b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana 2539b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana assertThat(items.get(0).shouldHideDivider(), is(true)); 2549b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana assertThat(items.get(1).shouldHideDivider(), is(false)); 2559b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana 2569b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana PagedListView.DividerVisibilityManager dvm = (PagedListView.DividerVisibilityManager) 2579b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana mPagedListView.getAdapter(); 2589b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana assertThat(dvm, is(notNullValue())); 2599b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana assertThat(dvm.shouldHideDivider(0), is(true)); 2609b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana assertThat(dvm.shouldHideDivider(1), is(false)); 2619b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana } 2629b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana 2639b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana @Test 264e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing public void testTextStartMarginMatchesPrimaryActionType() { 2654e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing List<TextListItem> items = Arrays.asList( 2664e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing new TextListItem.Builder(mActivity) 267e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing .withPrimaryActionIcon(android.R.drawable.sym_def_app_icon, true) 268e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing .build(), 2694e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing new TextListItem.Builder(mActivity) 270e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing .withPrimaryActionIcon(android.R.drawable.sym_def_app_icon, false) 271e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing .build(), 2724e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing new TextListItem.Builder(mActivity) 273e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing .withPrimaryActionEmptyIcon() 274e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing .build(), 2754e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing new TextListItem.Builder(mActivity) 276e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing .withPrimaryActionNoIcon() 277e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing .build()); 278e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing List<Integer> expectedStartMargin = Arrays.asList(R.dimen.car_keyline_4, 279e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing R.dimen.car_keyline_3, R.dimen.car_keyline_3, R.dimen.car_keyline_1); 280e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing setupPagedListView(items); 281e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 282e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing for (int i = 0; i < items.size(); i++) { 2834e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(i); 284e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 285e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing int expected = InstrumentationRegistry.getContext().getResources() 286e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing .getDimensionPixelSize(expectedStartMargin.get(i)); 287e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertThat(((ViewGroup.MarginLayoutParams) viewHolder.getTitle().getLayoutParams()) 288e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing .getMarginStart(), is(equalTo(expected))); 289e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertThat(((ViewGroup.MarginLayoutParams) viewHolder.getBody().getLayoutParams()) 290e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing .getMarginStart(), is(equalTo(expected))); 291e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 292e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 293e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 294e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing @Test 295e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing public void testItemWithOnlyTitleIsSingleLine() { 2964e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing List<TextListItem> items = Arrays.asList( 297e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing // Only space 2984e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing new TextListItem.Builder(mActivity) 299e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing .withTitle(" ") 300e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing .build(), 301e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing // Underscore 3024e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing new TextListItem.Builder(mActivity) 303e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing .withTitle("______") 304e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing .build(), 3054e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing new TextListItem.Builder(mActivity) 306e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing .withTitle("ALL UPPER CASE") 307e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing .build(), 308e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing // String wouldn't fit in one line 3094e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing new TextListItem.Builder(mActivity) 310e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing .withTitle(InstrumentationRegistry.getContext().getResources().getString( 311e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing R.string.over_120_chars)) 312e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing .build()); 313e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing setupPagedListView(items); 314e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 315e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing double singleLineHeight = InstrumentationRegistry.getContext().getResources().getDimension( 316e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing R.dimen.car_single_line_list_item_height); 317e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 318b226d4dcc396fe8837876dfa113143702dd23c26Anthony Chen LinearLayoutManager layoutManager = 319b226d4dcc396fe8837876dfa113143702dd23c26Anthony Chen (LinearLayoutManager) mPagedListView.getRecyclerView().getLayoutManager(); 320e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing for (int i = 0; i < items.size(); i++) { 321b226d4dcc396fe8837876dfa113143702dd23c26Anthony Chen assertThat((double) layoutManager.findViewByPosition(i).getHeight(), 322e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing is(closeTo(singleLineHeight, 1.0d))); 323e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 324e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 325e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 326e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing @Test 327e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing public void testItemWithBodyTextIsAtLeastDoubleLine() { 3284e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing List<TextListItem> items = Arrays.asList( 329e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing // Only space 3304e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing new TextListItem.Builder(mActivity) 331e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing .withBody(" ") 332e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing .build(), 333e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing // Underscore 3344e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing new TextListItem.Builder(mActivity) 335e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing .withBody("____") 336e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing .build(), 337e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing // String wouldn't fit in one line 3384e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing new TextListItem.Builder(mActivity) 339e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing .withBody(InstrumentationRegistry.getContext().getResources().getString( 340e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing R.string.over_120_chars)) 341e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing .build()); 342e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing setupPagedListView(items); 343e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 344e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing final int doubleLineHeight = 345e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing (int) InstrumentationRegistry.getContext().getResources().getDimension( 346e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing R.dimen.car_double_line_list_item_height); 347e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 348b226d4dcc396fe8837876dfa113143702dd23c26Anthony Chen LinearLayoutManager layoutManager = 349b226d4dcc396fe8837876dfa113143702dd23c26Anthony Chen (LinearLayoutManager) mPagedListView.getRecyclerView().getLayoutManager(); 350e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing for (int i = 0; i < items.size(); i++) { 351b226d4dcc396fe8837876dfa113143702dd23c26Anthony Chen assertThat(layoutManager.findViewByPosition(i).getHeight(), 352e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing is(greaterThanOrEqualTo(doubleLineHeight))); 353e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 354e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 355e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 356e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing @Test 357e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing public void testBodyTextLengthLimit() { 358e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing final String longText = InstrumentationRegistry.getContext().getResources().getString( 359e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing R.string.over_120_chars); 360e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing final int limit = InstrumentationRegistry.getContext().getResources().getInteger( 361e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing R.integer.car_list_item_text_length_limit); 3624e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing List<TextListItem> items = Arrays.asList( 3634e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing new TextListItem.Builder(mActivity) 364e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing .withBody(longText) 365e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing .build()); 366e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing setupPagedListView(items); 367e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 368e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing // + 1 for appended ellipsis. 369e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertThat(getViewHolderAtPosition(0).getBody().getText().length(), 370e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing is(equalTo(limit + 1))); 371e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 372e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 373e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing @Test 374e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing public void testPrimaryIconDrawable() { 375e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing Drawable drawable = InstrumentationRegistry.getContext().getResources().getDrawable( 376e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing android.R.drawable.sym_def_app_icon, null); 3774e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing List<TextListItem> items = Arrays.asList( 3784e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing new TextListItem.Builder(mActivity) 379e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing .withPrimaryActionIcon(drawable, true) 380e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing .build()); 381e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing setupPagedListView(items); 382e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 383e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertTrue(getViewHolderAtPosition(0).getPrimaryIcon().getDrawable().getConstantState() 384e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing .equals(drawable.getConstantState())); 385e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 386e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 387e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing @Test 388e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing public void testLargePrimaryIconHasNoStartMargin() { 3894e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing List<TextListItem> items = Arrays.asList( 3904e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing new TextListItem.Builder(mActivity) 391e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing .withPrimaryActionIcon(android.R.drawable.sym_def_app_icon, true) 392e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing .build()); 393e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing setupPagedListView(items); 394e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 3954e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0); 396e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertThat(((ViewGroup.MarginLayoutParams) viewHolder.getPrimaryIcon().getLayoutParams()) 397e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing .getMarginStart(), is(equalTo(0))); 398e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 399e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 400e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing @Test 401e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing public void testSmallPrimaryIconStartMargin() { 4024e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing List<TextListItem> items = Arrays.asList( 4034e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing new TextListItem.Builder(mActivity) 404e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing .withPrimaryActionIcon(android.R.drawable.sym_def_app_icon, false) 405e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing .build()); 406e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing setupPagedListView(items); 407e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 408e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing int expected = InstrumentationRegistry.getContext().getResources().getDimensionPixelSize( 409e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing R.dimen.car_keyline_1); 410e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 4114e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0); 412e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertThat(((ViewGroup.MarginLayoutParams) viewHolder.getPrimaryIcon().getLayoutParams()) 413e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing .getMarginStart(), is(equalTo(expected))); 414e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 415e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 416e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing @Test 4175dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing public void testSmallPrimaryIconTopMarginRemainsTheSameRegardlessOfTextLength() { 4185dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing final String longText = InstrumentationRegistry.getContext().getResources().getString( 4195dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing R.string.over_120_chars); 4204e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing List<TextListItem> items = Arrays.asList( 4215dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing // Single line item. 4224e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing new TextListItem.Builder(mActivity) 4235dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing .withPrimaryActionIcon(android.R.drawable.sym_def_app_icon, false) 4245dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing .withTitle("one line text") 4255dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing .build(), 4265dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing // Double line item with one line text. 4274e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing new TextListItem.Builder(mActivity) 4285dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing .withPrimaryActionIcon(android.R.drawable.sym_def_app_icon, false) 4295dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing .withTitle("one line text") 4305dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing .withBody("one line text") 4315dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing .build(), 4325dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing // Double line item with long text. 4334e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing new TextListItem.Builder(mActivity) 4345dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing .withPrimaryActionIcon(android.R.drawable.sym_def_app_icon, false) 4355dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing .withTitle("one line text") 4365dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing .withBody(longText) 4375dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing .build(), 4385dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing // Body text only - long text. 4394e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing new TextListItem.Builder(mActivity) 4405dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing .withPrimaryActionIcon(android.R.drawable.sym_def_app_icon, false) 4415dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing .withBody(longText) 4425dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing .build(), 4435dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing // Body text only - one line text. 4444e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing new TextListItem.Builder(mActivity) 4455dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing .withPrimaryActionIcon(android.R.drawable.sym_def_app_icon, false) 4465dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing .withBody("one line text") 4475dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing .build()); 4485dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing setupPagedListView(items); 4495dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing 4505dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing for (int i = 1; i < items.size(); i++) { 4515dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing onView(withId(R.id.recycler_view)).perform(scrollToPosition(i)); 4525dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing // Implementation uses integer division so it may be off by 1 vs centered vertically. 4535dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing assertThat((double) getViewHolderAtPosition(i - 1).getPrimaryIcon().getTop(), 4545dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing is(closeTo( 4555dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing (double) getViewHolderAtPosition(i).getPrimaryIcon().getTop(), 1.0d))); 4565dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing } 4575dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing } 4585dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing 4595dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing @Test 460e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing public void testClickingPrimaryActionIsSeparateFromSupplementalAction() { 461e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing final boolean[] clicked = {false, false}; 4624e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing List<TextListItem> items = Arrays.asList( 4634e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing new TextListItem.Builder(mActivity) 464439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing .withOnClickListener(v -> clicked[0] = true) 465e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing .withSupplementalIcon(android.R.drawable.sym_def_app_icon, true, 466439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing v -> clicked[1] = true) 467e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing .build()); 468e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing setupPagedListView(items); 469e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 470e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing onView(withId(R.id.recycler_view)).perform(actionOnItemAtPosition(0, click())); 471e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertTrue(clicked[0]); 472e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertFalse(clicked[1]); 473e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 474e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing onView(withId(R.id.recycler_view)).perform( 475e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing actionOnItemAtPosition(0, clickChildViewWithId(R.id.supplemental_icon))); 476e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertTrue(clicked[1]); 477e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 478e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 479e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing @Test 480e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing public void testClickingSupplementalIcon() { 481e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing final boolean[] clicked = {false}; 4824e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing List<TextListItem> items = Arrays.asList( 4834e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing new TextListItem.Builder(mActivity) 484e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing .withSupplementalIcon(android.R.drawable.sym_def_app_icon, true, 485439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing v -> clicked[0] = true) 486e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing .build()); 487e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing setupPagedListView(items); 488e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 489e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing onView(withId(R.id.recycler_view)).perform( 490e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing actionOnItemAtPosition(0, clickChildViewWithId(R.id.supplemental_icon))); 491e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertTrue(clicked[0]); 492e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 493e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 494e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing @Test 495439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing public void testSupplementalIconWithoutClickListenerIsNotClickable() { 4964e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing List<TextListItem> items = Arrays.asList( 4974e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing new TextListItem.Builder(mActivity) 498439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing .withSupplementalIcon(android.R.drawable.sym_def_app_icon, true) 499439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing .build()); 500439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing setupPagedListView(items); 501439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing 5024e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0); 503439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing assertFalse(viewHolder.getSupplementalIcon().isClickable()); 504439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing } 505439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing 506439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing @Test 50722037e659c30185f51f522e1761236f780334c9dYao, Yuxing public void testCheckingSwitch() { 50822037e659c30185f51f522e1761236f780334c9dYao, Yuxing final boolean[] clicked = {false, false}; 5094e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing List<TextListItem> items = Arrays.asList( 5104e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing new TextListItem.Builder(mActivity) 51122037e659c30185f51f522e1761236f780334c9dYao, Yuxing .withSwitch(false, false, (button, isChecked) -> { 51222037e659c30185f51f522e1761236f780334c9dYao, Yuxing // Initial value is false. 51322037e659c30185f51f522e1761236f780334c9dYao, Yuxing assertTrue(isChecked); 51422037e659c30185f51f522e1761236f780334c9dYao, Yuxing clicked[0] = true; 51522037e659c30185f51f522e1761236f780334c9dYao, Yuxing }) 51622037e659c30185f51f522e1761236f780334c9dYao, Yuxing .build(), 5174e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing new TextListItem.Builder(mActivity) 51822037e659c30185f51f522e1761236f780334c9dYao, Yuxing .withSwitch(true, false, (button, isChecked) -> { 51922037e659c30185f51f522e1761236f780334c9dYao, Yuxing // Initial value is true. 52022037e659c30185f51f522e1761236f780334c9dYao, Yuxing assertFalse(isChecked); 52122037e659c30185f51f522e1761236f780334c9dYao, Yuxing clicked[1] = true; 52222037e659c30185f51f522e1761236f780334c9dYao, Yuxing }) 52322037e659c30185f51f522e1761236f780334c9dYao, Yuxing .build()); 52422037e659c30185f51f522e1761236f780334c9dYao, Yuxing setupPagedListView(items); 52522037e659c30185f51f522e1761236f780334c9dYao, Yuxing 52622037e659c30185f51f522e1761236f780334c9dYao, Yuxing onView(withId(R.id.recycler_view)).perform( 52722037e659c30185f51f522e1761236f780334c9dYao, Yuxing actionOnItemAtPosition(0, clickChildViewWithId(R.id.switch_widget))); 52822037e659c30185f51f522e1761236f780334c9dYao, Yuxing assertTrue(clicked[0]); 52922037e659c30185f51f522e1761236f780334c9dYao, Yuxing 53022037e659c30185f51f522e1761236f780334c9dYao, Yuxing onView(withId(R.id.recycler_view)).perform( 53122037e659c30185f51f522e1761236f780334c9dYao, Yuxing actionOnItemAtPosition(1, clickChildViewWithId(R.id.switch_widget))); 53222037e659c30185f51f522e1761236f780334c9dYao, Yuxing assertTrue(clicked[1]); 53322037e659c30185f51f522e1761236f780334c9dYao, Yuxing } 53422037e659c30185f51f522e1761236f780334c9dYao, Yuxing 53522037e659c30185f51f522e1761236f780334c9dYao, Yuxing @Test 536e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing public void testClickingSupplementalAction() { 537e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing final boolean[] clicked = {false}; 5384e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing List<TextListItem> items = Arrays.asList( 5394e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing new TextListItem.Builder(mActivity) 540439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing .withAction("action", true, v -> clicked[0] = true) 541e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing .build()); 542e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing setupPagedListView(items); 543e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 544e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing onView(withId(R.id.recycler_view)).perform( 545e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing actionOnItemAtPosition(0, clickChildViewWithId(R.id.action1))); 546e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertTrue(clicked[0]); 547e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 548e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 549e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing @Test 550e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing public void testClickingBothSupplementalActions() { 551e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing final boolean[] clicked = {false, false}; 5524e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing List<TextListItem> items = Arrays.asList( 5534e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing new TextListItem.Builder(mActivity) 554439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing .withActions("action 1", true, v -> clicked[0] = true, 555439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing "action 2", true, v -> clicked[1] = true) 556e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing .build()); 557e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing setupPagedListView(items); 558e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 559e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing onView(withId(R.id.recycler_view)).perform( 560e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing actionOnItemAtPosition(0, clickChildViewWithId(R.id.action1))); 561e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertTrue(clicked[0]); 562e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertFalse(clicked[1]); 563e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 564e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing onView(withId(R.id.recycler_view)).perform( 565e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing actionOnItemAtPosition(0, clickChildViewWithId(R.id.action2))); 566e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertTrue(clicked[1]); 567e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 568e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 569e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing @Test 570e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing public void testCustomViewBinderAreCalledLast() { 571e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing final String updatedTitle = "updated title"; 5724e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing List<TextListItem> items = Arrays.asList( 5734e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing new TextListItem.Builder(mActivity) 574e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing .withTitle("original title") 575e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing .withViewBinder((viewHolder) -> viewHolder.getTitle().setText(updatedTitle)) 576e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing .build()); 577e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing setupPagedListView(items); 578e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 5794e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0); 580e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertThat(viewHolder.getTitle().getText(), is(equalTo(updatedTitle))); 581e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 582e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 583e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing @Test 584e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing public void testCustomViewBinderOnUnusedViewsHasNoEffect() { 5854e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing List<TextListItem> items = Arrays.asList( 5864e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing new TextListItem.Builder(mActivity) 587e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing .withViewBinder((viewHolder) -> viewHolder.getBody().setText("text")) 588e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing .build()); 589e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing setupPagedListView(items); 590e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 5914e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0); 592e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertThat(viewHolder.getBody().getVisibility(), is(equalTo(View.GONE))); 593e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing // Custom binder interacts with body but has no effect. 594e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing // Expect card height to remain single line. 595e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertThat((double) viewHolder.itemView.getHeight(), is(closeTo( 596e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing InstrumentationRegistry.getContext().getResources().getDimension( 597e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing R.dimen.car_single_line_list_item_height), 1.0d))); 598e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 599e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 600e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing @Test 601e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing public void testSettingTitleOrBodyAsPrimaryText() { 602e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing // Create 2 items, one with Title as primary (default) and one with Body. 603e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing // The primary text, regardless of view, should have consistent look (as primary). 6044e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing List<TextListItem> items = Arrays.asList( 6054e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing new TextListItem.Builder(mActivity) 606e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing .withTitle("title") 607e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing .withBody("body") 608e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing .build(), 6094e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing new TextListItem.Builder(mActivity) 610e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing .withTitle("title") 611e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing .withBody("body", true) 612e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing .build()); 613e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing setupPagedListView(items); 614e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 6154e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing TextListItem.ViewHolder titlePrimary = getViewHolderAtPosition(0); 6164e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing TextListItem.ViewHolder bodyPrimary = getViewHolderAtPosition(1); 617e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertThat(titlePrimary.getTitle().getTextSize(), 618e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing is(equalTo(bodyPrimary.getBody().getTextSize()))); 619e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertThat(titlePrimary.getTitle().getTextColors(), 620e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing is(equalTo(bodyPrimary.getBody().getTextColors()))); 621e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 622e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 623a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing @Test 624a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing public void testNoCarriedOverLayoutParamsForTextView() throws Throwable { 6254e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing TextListItem singleLine = new TextListItem.Builder(mActivity).withTitle("t").build(); 626a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing setupPagedListView(Arrays.asList(singleLine)); 627a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing 628a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing // Manually rebind the view holder of a single line item to a double line item. 6294e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing TextListItem doubleLine = new TextListItem.Builder(mActivity).withTitle("t").withBody("b") 6304e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing .build(); 6314e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0); 632a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing mActivityRule.runOnUiThread(() -> doubleLine.bind(viewHolder)); 633a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing 634a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing RelativeLayout.LayoutParams titleLayoutParams = 635a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing (RelativeLayout.LayoutParams) viewHolder.getTitle().getLayoutParams(); 636a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing RelativeLayout.LayoutParams bodyLayoutParams = 637a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing (RelativeLayout.LayoutParams) viewHolder.getTitle().getLayoutParams(); 638a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing assertThat(titleLayoutParams.getRule(RelativeLayout.CENTER_VERTICAL), is(equalTo(0))); 639a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing assertThat(bodyLayoutParams.getRule(RelativeLayout.CENTER_VERTICAL), is(equalTo(0))); 640a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing } 641a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing 642a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing @Test 643a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing public void testNoCarriedOverLayoutParamsForPrimaryIcon() throws Throwable { 6444e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing TextListItem smallIcon = new TextListItem.Builder(mActivity) 645a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing .withPrimaryActionIcon(android.R.drawable.sym_def_app_icon, false) 646a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing .withBody("body") // Small icon of items with body text should use top margin. 647a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing .build(); 648a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing setupPagedListView(Arrays.asList(smallIcon)); 649a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing 650a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing // Manually rebind the view holder. 6514e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing TextListItem largeIcon = new TextListItem.Builder(mActivity) 652a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing .withPrimaryActionIcon(android.R.drawable.sym_def_app_icon, true) 653a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing .build(); 6544e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0); 655a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing mActivityRule.runOnUiThread(() -> largeIcon.bind(viewHolder)); 656a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing 657a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing RelativeLayout.LayoutParams iconLayoutParams = 658a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing (RelativeLayout.LayoutParams) viewHolder.getPrimaryIcon().getLayoutParams(); 659a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing assertThat(iconLayoutParams.getRule(RelativeLayout.CENTER_VERTICAL), 660a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing is(equalTo(RelativeLayout.TRUE))); 661a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing assertThat(iconLayoutParams.topMargin, is(equalTo(0))); 662a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing } 663a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing 664e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing private static ViewAction clickChildViewWithId(final int id) { 665e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing return new ViewAction() { 666e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing @Override 667e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing public Matcher<View> getConstraints() { 668e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing return null; 669e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 670e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 671e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing @Override 672e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing public String getDescription() { 673e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing return "Click on a child view with specific id."; 674e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 675e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 676e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing @Override 677e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing public void perform(UiController uiController, View view) { 678e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing View v = view.findViewById(id); 679e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing v.performClick(); 680e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 681e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing }; 682e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 683e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing} 684