TextListItemTest.java revision 20e9f85df9325d7dc79750be2527bd8dd1c38fcb
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; 26e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport static org.hamcrest.core.Is.is; 27e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport static org.hamcrest.core.IsEqual.equalTo; 28e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport static org.hamcrest.number.IsCloseTo.closeTo; 29fa39e2bca1b284ad7c931d9194287770b7b507faAurimas Liutikasimport static org.junit.Assert.assertFalse; 30e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport static org.junit.Assert.assertThat; 31e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport static org.junit.Assert.assertTrue; 32e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 33e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport android.graphics.drawable.Drawable; 34e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport android.support.test.InstrumentationRegistry; 35e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport android.support.test.espresso.UiController; 36e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport android.support.test.espresso.ViewAction; 37e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport android.support.test.filters.SmallTest; 38e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport android.support.test.rule.ActivityTestRule; 39e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport android.support.test.runner.AndroidJUnit4; 40b226d4dcc396fe8837876dfa113143702dd23c26Anthony Chenimport android.support.v7.widget.LinearLayoutManager; 4120e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxingimport android.text.TextUtils; 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() { 113172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item = new TextListItem(mActivity); 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() { 120172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item0 = new TextListItem(mActivity); 121172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item0.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon, true); 122172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 123172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item1 = new TextListItem(mActivity); 124172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item1.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon, false); 125172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 126172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing List<TextListItem> items = Arrays.asList(item0, item1); 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() { 137172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item0 = new TextListItem(mActivity); 138172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item0.setTitle("title"); 139172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 140172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item1 = new TextListItem(mActivity); 141172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item1.setBody("body"); 142172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 143172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing List<TextListItem> items = Arrays.asList(item0, item1); 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() { 154172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item0 = new TextListItem(mActivity); 155172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item0.setSupplementalIcon(android.R.drawable.sym_def_app_icon, true); 156172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 157172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item1 = new TextListItem(mActivity); 158172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item1.setAction("text", true, v -> { /* Do nothing. */ }); 159172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 160172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 161172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item2 = new TextListItem(mActivity); 162172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item2.setActions("text", true, v -> { /* Do nothing. */ }, 163172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing "text", true, v -> { /* Do nothing. */ }); 164172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 165172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing List<TextListItem> items = Arrays.asList(item0, item1, item2); 166e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing setupPagedListView(items); 167e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 1684e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0); 169e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertThat(viewHolder.getSupplementalIcon().getVisibility(), is(equalTo(View.VISIBLE))); 170e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertThat(viewHolder.getSupplementalIconDivider().getVisibility(), 171e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing is(equalTo(View.VISIBLE))); 172e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 173e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing viewHolder = getViewHolderAtPosition(1); 174e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertThat(viewHolder.getAction1().getVisibility(), is(equalTo(View.VISIBLE))); 175e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertThat(viewHolder.getAction1Divider().getVisibility(), is(equalTo(View.VISIBLE))); 176e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 177e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing viewHolder = getViewHolderAtPosition(2); 178e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertThat(viewHolder.getAction1().getVisibility(), is(equalTo(View.VISIBLE))); 179e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertThat(viewHolder.getAction1Divider().getVisibility(), is(equalTo(View.VISIBLE))); 180e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertThat(viewHolder.getAction2().getVisibility(), is(equalTo(View.VISIBLE))); 181e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertThat(viewHolder.getAction2Divider().getVisibility(), is(equalTo(View.VISIBLE))); 182e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 183e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 184e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing @Test 18522037e659c30185f51f522e1761236f780334c9dYao, Yuxing public void testSwitchVisibleAndCheckedState() { 186172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item0 = new TextListItem(mActivity); 187172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item0.setSwitch(true, true, null); 188172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 189172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item1 = new TextListItem(mActivity); 190172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item1.setSwitch(false, true, null); 191172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 192172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing List<TextListItem> items = Arrays.asList(item0, item1); 19322037e659c30185f51f522e1761236f780334c9dYao, Yuxing setupPagedListView(items); 19422037e659c30185f51f522e1761236f780334c9dYao, Yuxing 1954e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0); 19622037e659c30185f51f522e1761236f780334c9dYao, Yuxing assertThat(viewHolder.getSwitch().getVisibility(), is(equalTo(View.VISIBLE))); 19722037e659c30185f51f522e1761236f780334c9dYao, Yuxing assertThat(viewHolder.getSwitch().isChecked(), is(equalTo(true))); 19822037e659c30185f51f522e1761236f780334c9dYao, Yuxing assertThat(viewHolder.getSwitchDivider().getVisibility(), is(equalTo(View.VISIBLE))); 19922037e659c30185f51f522e1761236f780334c9dYao, Yuxing 20022037e659c30185f51f522e1761236f780334c9dYao, Yuxing viewHolder = getViewHolderAtPosition(1); 20122037e659c30185f51f522e1761236f780334c9dYao, Yuxing assertThat(viewHolder.getSwitch().getVisibility(), is(equalTo(View.VISIBLE))); 20222037e659c30185f51f522e1761236f780334c9dYao, Yuxing assertThat(viewHolder.getSwitch().isChecked(), is(equalTo(false))); 20322037e659c30185f51f522e1761236f780334c9dYao, Yuxing assertThat(viewHolder.getSwitchDivider().getVisibility(), is(equalTo(View.VISIBLE))); 20422037e659c30185f51f522e1761236f780334c9dYao, Yuxing } 20522037e659c30185f51f522e1761236f780334c9dYao, Yuxing 20622037e659c30185f51f522e1761236f780334c9dYao, Yuxing @Test 207e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing public void testDividersAreOptional() { 208172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item0 = new TextListItem(mActivity); 209172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item0.setSupplementalIcon(android.R.drawable.sym_def_app_icon, false); 210172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 211172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item1 = new TextListItem(mActivity); 212172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item1.setAction("text", false, v -> { /* Do nothing. */ }); 213172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 214172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item2 = new TextListItem(mActivity); 215172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item2.setActions("text", false, v -> { /* Do nothing. */ }, 216172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing "text", false, v -> { /* Do nothing. */ }); 217172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 218172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item3 = new TextListItem(mActivity); 219172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item3.setSwitch(true, false, null); 220172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 221172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing List<TextListItem> items = Arrays.asList(item0, item1, item2, item3); 222e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing setupPagedListView(items); 223e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 2244e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0); 225e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertThat(viewHolder.getSupplementalIcon().getVisibility(), is(equalTo(View.VISIBLE))); 226e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertThat(viewHolder.getSupplementalIconDivider().getVisibility(), 227e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing is(equalTo(View.GONE))); 228e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 229e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing viewHolder = getViewHolderAtPosition(1); 230e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertThat(viewHolder.getAction1().getVisibility(), is(equalTo(View.VISIBLE))); 231e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertThat(viewHolder.getAction1Divider().getVisibility(), is(equalTo(View.GONE))); 232e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 233e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing viewHolder = getViewHolderAtPosition(2); 234e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertThat(viewHolder.getAction1().getVisibility(), is(equalTo(View.VISIBLE))); 235e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertThat(viewHolder.getAction1Divider().getVisibility(), is(equalTo(View.GONE))); 236e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertThat(viewHolder.getAction2().getVisibility(), is(equalTo(View.VISIBLE))); 237e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertThat(viewHolder.getAction2Divider().getVisibility(), is(equalTo(View.GONE))); 23822037e659c30185f51f522e1761236f780334c9dYao, Yuxing 23922037e659c30185f51f522e1761236f780334c9dYao, Yuxing viewHolder = getViewHolderAtPosition(3); 24022037e659c30185f51f522e1761236f780334c9dYao, Yuxing assertThat(viewHolder.getSwitch().getVisibility(), is(equalTo(View.VISIBLE))); 24122037e659c30185f51f522e1761236f780334c9dYao, Yuxing assertThat(viewHolder.getSwitchDivider().getVisibility(), is(equalTo(View.GONE))); 242e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 243e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 244e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing @Test 245172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing public void testTextStartMarginMatchesPrimaryActionType() { 246172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item0 = new TextListItem(mActivity); 247172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item0.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon, true); 2489b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana 249172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item1 = new TextListItem(mActivity); 250172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item1.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon, false); 2519b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana 252172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item2 = new TextListItem(mActivity); 253172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item2.setPrimaryActionEmptyIcon(); 2549b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana 255172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item3 = new TextListItem(mActivity); 256172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item3.setPrimaryActionNoIcon(); 257172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 258172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing List<TextListItem> items = Arrays.asList(item0, item1, item2, item3); 259e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing List<Integer> expectedStartMargin = Arrays.asList(R.dimen.car_keyline_4, 260e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing R.dimen.car_keyline_3, R.dimen.car_keyline_3, R.dimen.car_keyline_1); 261e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing setupPagedListView(items); 262e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 263e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing for (int i = 0; i < items.size(); i++) { 2644e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(i); 265e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 266e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing int expected = InstrumentationRegistry.getContext().getResources() 267e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing .getDimensionPixelSize(expectedStartMargin.get(i)); 268e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertThat(((ViewGroup.MarginLayoutParams) viewHolder.getTitle().getLayoutParams()) 269e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing .getMarginStart(), is(equalTo(expected))); 270e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertThat(((ViewGroup.MarginLayoutParams) viewHolder.getBody().getLayoutParams()) 271e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing .getMarginStart(), is(equalTo(expected))); 272e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 273e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 274e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 275e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing @Test 276e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing public void testItemWithOnlyTitleIsSingleLine() { 277172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing // Only space. 278172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item0 = new TextListItem(mActivity); 279172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item0.setTitle(" "); 280172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 281172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing // Underscore. 282172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item1 = new TextListItem(mActivity); 283172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item1.setTitle("______"); 284172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 285172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item2 = new TextListItem(mActivity); 286172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item2.setTitle("ALL UPPER CASE"); 287172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 288172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing // String wouldn't fit in one line. 289172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item3 = new TextListItem(mActivity); 290172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item3.setTitle(InstrumentationRegistry.getContext().getResources().getString( 291172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing R.string.over_120_chars)); 292172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 293172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing List<TextListItem> items = Arrays.asList(item0, item1, item2, item3); 294e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing setupPagedListView(items); 295e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 296e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing double singleLineHeight = InstrumentationRegistry.getContext().getResources().getDimension( 297e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing R.dimen.car_single_line_list_item_height); 298e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 299b226d4dcc396fe8837876dfa113143702dd23c26Anthony Chen LinearLayoutManager layoutManager = 300b226d4dcc396fe8837876dfa113143702dd23c26Anthony Chen (LinearLayoutManager) mPagedListView.getRecyclerView().getLayoutManager(); 301e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing for (int i = 0; i < items.size(); i++) { 302b226d4dcc396fe8837876dfa113143702dd23c26Anthony Chen assertThat((double) layoutManager.findViewByPosition(i).getHeight(), 303e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing is(closeTo(singleLineHeight, 1.0d))); 304e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 305e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 306e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 307e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing @Test 308e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing public void testItemWithBodyTextIsAtLeastDoubleLine() { 309172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing // Only space. 310172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item0 = new TextListItem(mActivity); 311172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item0.setBody(" "); 312172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 313172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing // Underscore. 314172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item1 = new TextListItem(mActivity); 315172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item1.setBody("____"); 316172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 317172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing // String wouldn't fit in one line. 318172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item2 = new TextListItem(mActivity); 319172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item2.setBody(InstrumentationRegistry.getContext().getResources().getString( 320172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing R.string.over_120_chars)); 321172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 322172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing List<TextListItem> items = Arrays.asList(item0, item1, item2); 323e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing setupPagedListView(items); 324e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 325e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing final int doubleLineHeight = 326e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing (int) InstrumentationRegistry.getContext().getResources().getDimension( 327e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing R.dimen.car_double_line_list_item_height); 328e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 329b226d4dcc396fe8837876dfa113143702dd23c26Anthony Chen LinearLayoutManager layoutManager = 330b226d4dcc396fe8837876dfa113143702dd23c26Anthony Chen (LinearLayoutManager) mPagedListView.getRecyclerView().getLayoutManager(); 331e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing for (int i = 0; i < items.size(); i++) { 332b226d4dcc396fe8837876dfa113143702dd23c26Anthony Chen assertThat(layoutManager.findViewByPosition(i).getHeight(), 333e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing is(greaterThanOrEqualTo(doubleLineHeight))); 334e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 335e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 336e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 337e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing @Test 338e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing public void testBodyTextLengthLimit() { 339e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing final String longText = InstrumentationRegistry.getContext().getResources().getString( 340e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing R.string.over_120_chars); 341e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing final int limit = InstrumentationRegistry.getContext().getResources().getInteger( 342e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing R.integer.car_list_item_text_length_limit); 343172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 344172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item0 = new TextListItem(mActivity); 345172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item0.setBody(longText); 346172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 347172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing List<TextListItem> items = Arrays.asList(item0); 348e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing setupPagedListView(items); 349e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 350e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing // + 1 for appended ellipsis. 351e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertThat(getViewHolderAtPosition(0).getBody().getText().length(), 352e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing is(equalTo(limit + 1))); 353e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 354e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 355e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing @Test 356e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing public void testPrimaryIconDrawable() { 357e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing Drawable drawable = InstrumentationRegistry.getContext().getResources().getDrawable( 358e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing android.R.drawable.sym_def_app_icon, null); 359172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 360172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item0 = new TextListItem(mActivity); 361172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item0.setPrimaryActionIcon(drawable, true); 362172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 363172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing List<TextListItem> items = Arrays.asList(item0); 364e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing setupPagedListView(items); 365e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 366e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertTrue(getViewHolderAtPosition(0).getPrimaryIcon().getDrawable().getConstantState() 367e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing .equals(drawable.getConstantState())); 368e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 369e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 370e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing @Test 371e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing public void testLargePrimaryIconHasNoStartMargin() { 372172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item0 = new TextListItem(mActivity); 373172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item0.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon, true); 374172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 375172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing List<TextListItem> items = Arrays.asList(item0); 376e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing setupPagedListView(items); 377e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 3784e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0); 379e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertThat(((ViewGroup.MarginLayoutParams) viewHolder.getPrimaryIcon().getLayoutParams()) 380e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing .getMarginStart(), is(equalTo(0))); 381e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 382e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 383e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing @Test 384e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing public void testSmallPrimaryIconStartMargin() { 385172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item0 = new TextListItem(mActivity); 386172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item0.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon, false); 387172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 388172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing List<TextListItem> items = Arrays.asList(item0); 389e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing setupPagedListView(items); 390e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 391e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing int expected = InstrumentationRegistry.getContext().getResources().getDimensionPixelSize( 392e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing R.dimen.car_keyline_1); 393e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 3944e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0); 395e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertThat(((ViewGroup.MarginLayoutParams) viewHolder.getPrimaryIcon().getLayoutParams()) 396e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing .getMarginStart(), is(equalTo(expected))); 397e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 398e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 399e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing @Test 4005dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing public void testSmallPrimaryIconTopMarginRemainsTheSameRegardlessOfTextLength() { 4015dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing final String longText = InstrumentationRegistry.getContext().getResources().getString( 4025dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing R.string.over_120_chars); 403172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 404172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing // Single line item. 405172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item0 = new TextListItem(mActivity); 406172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item0.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon, false); 407172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item0.setTitle("one line text"); 408172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 409172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing // Double line item with one line text. 410172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item1 = new TextListItem(mActivity); 411172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item1.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon, false); 412172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item1.setTitle("one line text"); 413172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item1.setBody("one line text"); 414172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 415172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing // Double line item with long text. 416172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item2 = new TextListItem(mActivity); 417172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item2.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon, false); 418172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item2.setTitle("one line text"); 419172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item2.setBody(longText); 420172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 421172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing // Body text only - long text. 422172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item3 = new TextListItem(mActivity); 423172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item3.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon, false); 424172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item3.setBody(longText); 425172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 426172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing // Body text only - one line text. 427172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item4 = new TextListItem(mActivity); 428172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item4.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon, false); 429172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item4.setBody("one line text"); 430172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 431172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing List<TextListItem> items = Arrays.asList(item0, item1, item2, item3, item4); 4325dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing setupPagedListView(items); 4335dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing 4345dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing for (int i = 1; i < items.size(); i++) { 4355dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing onView(withId(R.id.recycler_view)).perform(scrollToPosition(i)); 4365dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing // Implementation uses integer division so it may be off by 1 vs centered vertically. 4375dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing assertThat((double) getViewHolderAtPosition(i - 1).getPrimaryIcon().getTop(), 4385dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing is(closeTo( 4395dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing (double) getViewHolderAtPosition(i).getPrimaryIcon().getTop(), 1.0d))); 4405dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing } 4415dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing } 4425dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing 4435dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing @Test 444e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing public void testClickingPrimaryActionIsSeparateFromSupplementalAction() { 445e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing final boolean[] clicked = {false, false}; 446172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 447172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item0 = new TextListItem(mActivity); 448172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item0.setOnClickListener(v -> clicked[0] = true); 449172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item0.setSupplementalIcon(android.R.drawable.sym_def_app_icon, true, 450172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing v -> clicked[1] = true); 451172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 452172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing List<TextListItem> items = Arrays.asList(item0); 453e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing setupPagedListView(items); 454e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 455e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing onView(withId(R.id.recycler_view)).perform(actionOnItemAtPosition(0, click())); 456e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertTrue(clicked[0]); 457e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertFalse(clicked[1]); 458e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 459e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing onView(withId(R.id.recycler_view)).perform( 460e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing actionOnItemAtPosition(0, clickChildViewWithId(R.id.supplemental_icon))); 461e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertTrue(clicked[1]); 462e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 463e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 464e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing @Test 465e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing public void testClickingSupplementalIcon() { 466e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing final boolean[] clicked = {false}; 467172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 468172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item0 = new TextListItem(mActivity); 469172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item0.setSupplementalIcon(android.R.drawable.sym_def_app_icon, true, 470172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing v -> clicked[0] = true); 471172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 472172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing List<TextListItem> items = Arrays.asList(item0); 473e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing setupPagedListView(items); 474e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 475e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing onView(withId(R.id.recycler_view)).perform( 476e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing actionOnItemAtPosition(0, clickChildViewWithId(R.id.supplemental_icon))); 477e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertTrue(clicked[0]); 478e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 479e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 480e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing @Test 481439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing public void testSupplementalIconWithoutClickListenerIsNotClickable() { 482172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item0 = new TextListItem(mActivity); 483172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item0.setSupplementalIcon(android.R.drawable.sym_def_app_icon, true); 484172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 485172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing List<TextListItem> items = Arrays.asList(item0); 486439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing setupPagedListView(items); 487439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing 4884e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0); 489439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing assertFalse(viewHolder.getSupplementalIcon().isClickable()); 490439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing } 491439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing 492439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing @Test 49322037e659c30185f51f522e1761236f780334c9dYao, Yuxing public void testCheckingSwitch() { 49422037e659c30185f51f522e1761236f780334c9dYao, Yuxing final boolean[] clicked = {false, false}; 495172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 496172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item0 = new TextListItem(mActivity); 497172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item0.setSwitch(false, false, (button, isChecked) -> { 498172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing // Initial value is false. 499172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing assertTrue(isChecked); 500172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing clicked[0] = true; 501172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing }); 502172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 503172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item1 = new TextListItem(mActivity); 504172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item1.setSwitch(true, false, (button, isChecked) -> { 505172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing // Initial value is true. 506172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing assertFalse(isChecked); 507172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing clicked[1] = true; 508172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing }); 509172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 510172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing List<TextListItem> items = Arrays.asList(item0, item1); 51122037e659c30185f51f522e1761236f780334c9dYao, Yuxing setupPagedListView(items); 51222037e659c30185f51f522e1761236f780334c9dYao, Yuxing 51322037e659c30185f51f522e1761236f780334c9dYao, Yuxing onView(withId(R.id.recycler_view)).perform( 51422037e659c30185f51f522e1761236f780334c9dYao, Yuxing actionOnItemAtPosition(0, clickChildViewWithId(R.id.switch_widget))); 51522037e659c30185f51f522e1761236f780334c9dYao, Yuxing assertTrue(clicked[0]); 51622037e659c30185f51f522e1761236f780334c9dYao, Yuxing 51722037e659c30185f51f522e1761236f780334c9dYao, Yuxing onView(withId(R.id.recycler_view)).perform( 51822037e659c30185f51f522e1761236f780334c9dYao, Yuxing actionOnItemAtPosition(1, clickChildViewWithId(R.id.switch_widget))); 51922037e659c30185f51f522e1761236f780334c9dYao, Yuxing assertTrue(clicked[1]); 52022037e659c30185f51f522e1761236f780334c9dYao, Yuxing } 52122037e659c30185f51f522e1761236f780334c9dYao, Yuxing 52222037e659c30185f51f522e1761236f780334c9dYao, Yuxing @Test 523e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing public void testClickingSupplementalAction() { 524e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing final boolean[] clicked = {false}; 525172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 526172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item0 = new TextListItem(mActivity); 527172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item0.setAction("action", true, v -> clicked[0] = true); 528172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 529172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing List<TextListItem> items = Arrays.asList(item0); 530e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing setupPagedListView(items); 531e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 532e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing onView(withId(R.id.recycler_view)).perform( 533e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing actionOnItemAtPosition(0, clickChildViewWithId(R.id.action1))); 534e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertTrue(clicked[0]); 535e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 536e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 537e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing @Test 538e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing public void testClickingBothSupplementalActions() { 539e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing final boolean[] clicked = {false, false}; 540172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 541172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item0 = new TextListItem(mActivity); 542172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item0.setActions("action 1", true, v -> clicked[0] = true, 543172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing "action 2", true, v -> clicked[1] = true); 544172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 545172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing List<TextListItem> items = Arrays.asList(item0); 546e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing setupPagedListView(items); 547e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 548e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing onView(withId(R.id.recycler_view)).perform( 549e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing actionOnItemAtPosition(0, clickChildViewWithId(R.id.action1))); 550e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertTrue(clicked[0]); 551e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertFalse(clicked[1]); 552e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 553e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing onView(withId(R.id.recycler_view)).perform( 554e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing actionOnItemAtPosition(0, clickChildViewWithId(R.id.action2))); 555e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertTrue(clicked[1]); 556e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 557e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 558e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing @Test 559172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing public void testCustomViewBinderBindsLast() { 560e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing final String updatedTitle = "updated title"; 561172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 562172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item0 = new TextListItem(mActivity); 563172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item0.setTitle("original title"); 564172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item0.addViewBinder((viewHolder) -> viewHolder.getTitle().setText(updatedTitle)); 565172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 566172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing List<TextListItem> items = Arrays.asList(item0); 567e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing setupPagedListView(items); 568e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 5694e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0); 570e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertThat(viewHolder.getTitle().getText(), is(equalTo(updatedTitle))); 571e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 572e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 573e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing @Test 574e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing public void testCustomViewBinderOnUnusedViewsHasNoEffect() { 575172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item0 = new TextListItem(mActivity); 576172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item0.addViewBinder((viewHolder) -> viewHolder.getBody().setText("text")); 577172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 578172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing List<TextListItem> items = Arrays.asList(item0); 579e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing setupPagedListView(items); 580e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 5814e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0); 582e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertThat(viewHolder.getBody().getVisibility(), is(equalTo(View.GONE))); 583e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing // Custom binder interacts with body but has no effect. 584e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing // Expect card height to remain single line. 585e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertThat((double) viewHolder.itemView.getHeight(), is(closeTo( 586e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing InstrumentationRegistry.getContext().getResources().getDimension( 587e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing R.dimen.car_single_line_list_item_height), 1.0d))); 588e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 589e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 590e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing @Test 59120e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing public void testRevertingViewBinder() throws Throwable { 59220e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing TextListItem item0 = new TextListItem(mActivity); 59320e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing item0.setBody("one item"); 59420e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing item0.addViewBinder( 59520e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing (viewHolder) -> viewHolder.getBody().setEllipsize(TextUtils.TruncateAt.END), 59620e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing (viewHolder -> viewHolder.getBody().setEllipsize(null))); 59720e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing 59820e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing List<TextListItem> items = Arrays.asList(item0); 59920e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing setupPagedListView(items); 60020e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing 60120e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0); 60220e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing 60320e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing // Bind view holder to a new item - the customization made by item0 should be reverted. 60420e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing TextListItem item1 = new TextListItem(mActivity); 60520e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing item1.setBody("new item"); 60620e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing mActivityRule.runOnUiThread(() -> item1.bind(viewHolder)); 60720e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing 60820e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing assertThat(viewHolder.getBody().getEllipsize(), is(equalTo(null))); 60920e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing } 61020e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing 61120e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing @Test 61220e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing public void testRemovingViewBinder() { 61320e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing TextListItem item0 = new TextListItem(mActivity); 61420e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing item0.setBody("one item"); 61520e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing ListItem.ViewBinder<TextListItem.ViewHolder> binder = 61620e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing (viewHolder) -> viewHolder.getTitle().setEllipsize(TextUtils.TruncateAt.END); 61720e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing item0.addViewBinder(binder); 61820e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing 61920e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing assertTrue(item0.removeViewBinder(binder)); 62020e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing 62120e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing List<TextListItem> items = Arrays.asList(item0); 62220e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing setupPagedListView(items); 62320e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing 62420e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing assertThat(getViewHolderAtPosition(0).getBody().getEllipsize(), is(equalTo(null))); 62520e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing } 62620e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing 62720e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing @Test 628e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing public void testSettingTitleOrBodyAsPrimaryText() { 629e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing // Create 2 items, one with Title as primary (default) and one with Body. 630e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing // The primary text, regardless of view, should have consistent look (as primary). 631172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item0 = new TextListItem(mActivity); 632172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item0.setTitle("title"); 633172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item0.setBody("body"); 634172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 635172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item1 = new TextListItem(mActivity); 636172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item1.setTitle("title"); 637172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item1.setBody("body", true); 638172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 639172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing List<TextListItem> items = Arrays.asList(item0, item1); 640e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing setupPagedListView(items); 641e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 6424e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing TextListItem.ViewHolder titlePrimary = getViewHolderAtPosition(0); 6434e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing TextListItem.ViewHolder bodyPrimary = getViewHolderAtPosition(1); 644e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertThat(titlePrimary.getTitle().getTextSize(), 645e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing is(equalTo(bodyPrimary.getBody().getTextSize()))); 646e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertThat(titlePrimary.getTitle().getTextColors(), 647e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing is(equalTo(bodyPrimary.getBody().getTextColors()))); 648e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 649e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 650a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing @Test 651a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing public void testNoCarriedOverLayoutParamsForTextView() throws Throwable { 652172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem singleLine = new TextListItem(mActivity); 653172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing singleLine.setTitle("title"); 654172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 655a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing setupPagedListView(Arrays.asList(singleLine)); 656a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing 657a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing // Manually rebind the view holder of a single line item to a double line item. 658172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem doubleLine = new TextListItem(mActivity); 659172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing doubleLine.setTitle("title"); 660172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing doubleLine.setBody("body"); 6614e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0); 662a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing mActivityRule.runOnUiThread(() -> doubleLine.bind(viewHolder)); 663a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing 664a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing RelativeLayout.LayoutParams titleLayoutParams = 665a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing (RelativeLayout.LayoutParams) viewHolder.getTitle().getLayoutParams(); 666a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing RelativeLayout.LayoutParams bodyLayoutParams = 667a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing (RelativeLayout.LayoutParams) viewHolder.getTitle().getLayoutParams(); 668a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing assertThat(titleLayoutParams.getRule(RelativeLayout.CENTER_VERTICAL), is(equalTo(0))); 669a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing assertThat(bodyLayoutParams.getRule(RelativeLayout.CENTER_VERTICAL), is(equalTo(0))); 670a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing } 671a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing 672a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing @Test 673a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing public void testNoCarriedOverLayoutParamsForPrimaryIcon() throws Throwable { 674172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem smallIcon = new TextListItem(mActivity); 675172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing smallIcon.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon, false); 676172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing smallIcon.setBody("body"); // Small icon of items with body text should use top margin. 677a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing setupPagedListView(Arrays.asList(smallIcon)); 678a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing 679a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing // Manually rebind the view holder. 680172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem largeIcon = new TextListItem(mActivity); 681172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing largeIcon.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon, true); 6824e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0); 683a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing mActivityRule.runOnUiThread(() -> largeIcon.bind(viewHolder)); 684a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing 685a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing RelativeLayout.LayoutParams iconLayoutParams = 686a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing (RelativeLayout.LayoutParams) viewHolder.getPrimaryIcon().getLayoutParams(); 687a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing assertThat(iconLayoutParams.getRule(RelativeLayout.CENTER_VERTICAL), 688a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing is(equalTo(RelativeLayout.TRUE))); 689a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing assertThat(iconLayoutParams.topMargin, is(equalTo(0))); 690a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing } 691a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing 692172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing @Test 693172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing public void testUpdateItem() throws Throwable { 694172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item = new TextListItem(mActivity); 695172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing setupPagedListView(Arrays.asList(item)); 696172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 697172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing String title = "updated title"; 698172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item.setTitle(title); 699172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing mActivityRule.runOnUiThread(() -> mPagedListView.getAdapter().notifyItemChanged(0)); 700172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 701172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing // Wait for paged list view to layout by using espresso to scroll to a position. 702172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing onView(withId(R.id.recycler_view)).perform(scrollToPosition(0)); 703172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 704172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0); 705172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing assertThat(viewHolder.getTitle().getText(), is(equalTo(title))); 706172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing } 707172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 708e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing private static ViewAction clickChildViewWithId(final int id) { 709e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing return new ViewAction() { 710e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing @Override 711e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing public Matcher<View> getConstraints() { 712e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing return null; 713e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 714e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 715e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing @Override 716e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing public String getDescription() { 717e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing return "Click on a child view with specific id."; 718e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 719e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 720e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing @Override 721e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing public void perform(UiController uiController, View view) { 722e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing View v = view.findViewById(id); 723e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing v.performClick(); 724e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 725e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing }; 726e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 727e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing} 728