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 25a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxingimport static org.hamcrest.CoreMatchers.not; 26e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport static org.hamcrest.Matchers.greaterThanOrEqualTo; 273737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxingimport static org.hamcrest.Matchers.lessThan; 28e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport static org.hamcrest.core.Is.is; 29e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport static org.hamcrest.core.IsEqual.equalTo; 30e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport static org.hamcrest.number.IsCloseTo.closeTo; 3132a32d76550734f2c35f5db5b53890d8a2589281Yao, Yuxing 32fa39e2bca1b284ad7c931d9194287770b7b507faAurimas Liutikasimport static org.junit.Assert.assertFalse; 33e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport static org.junit.Assert.assertThat; 34e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport static org.junit.Assert.assertTrue; 35e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 363737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxingimport android.content.pm.PackageManager; 37e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport android.graphics.drawable.Drawable; 38e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport android.support.test.InstrumentationRegistry; 39e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport android.support.test.espresso.UiController; 40e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport android.support.test.espresso.ViewAction; 41e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport android.support.test.filters.SmallTest; 42e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport android.support.test.rule.ActivityTestRule; 43e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport android.support.test.runner.AndroidJUnit4; 443737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxingimport android.text.InputFilter; 4520e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxingimport android.text.TextUtils; 46e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport android.view.View; 47e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport android.view.ViewGroup; 48a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxingimport android.widget.RelativeLayout; 49e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 50e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport org.hamcrest.Matcher; 513737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxingimport org.junit.Assume; 52e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport org.junit.Before; 53e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport org.junit.Rule; 54e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport org.junit.Test; 55e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport org.junit.runner.RunWith; 56e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 57e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport java.util.ArrayList; 58e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport java.util.Arrays; 59e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport java.util.List; 603737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxingimport java.util.Locale; 61e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 62e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxingimport androidx.car.test.R; 633737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxingimport androidx.car.utils.CarUxRestrictionsTestUtils; 6432a32d76550734f2c35f5db5b53890d8a2589281Yao, Yuxingimport androidx.recyclerview.widget.LinearLayoutManager; 65e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 66e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing/** 674e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing* Tests the layout configuration in {@link TextListItem}. 68e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing */ 69e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing@RunWith(AndroidJUnit4.class) 70e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing@SmallTest 714e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxingpublic class TextListItemTest { 72e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 73e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing @Rule 74e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing public ActivityTestRule<PagedListViewTestActivity> mActivityRule = 75e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing new ActivityTestRule<>(PagedListViewTestActivity.class); 76e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 77e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing private PagedListViewTestActivity mActivity; 78e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing private PagedListView mPagedListView; 79a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing private ListItemAdapter mAdapter; 80e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 813737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing private boolean isAutoDevice() { 823737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing PackageManager packageManager = mActivityRule.getActivity().getPackageManager(); 833737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing return packageManager.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE); 843737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing } 853737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing 86e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing @Before 87e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing public void setUp() { 883737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing Assume.assumeTrue(isAutoDevice()); 893737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing 90e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing mActivity = mActivityRule.getActivity(); 91e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing mPagedListView = mActivity.findViewById(R.id.paged_list_view); 92e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 93e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 943737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing private void refreshUi() { 953737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing try { 963737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing mActivityRule.runOnUiThread(() -> { 973737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing mAdapter.notifyDataSetChanged(); 983737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing }); 993737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing } catch (Throwable throwable) { 1003737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing throwable.printStackTrace(); 1013737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing throw new RuntimeException(throwable); 1023737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing } 1033737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing // Wait for paged list view to layout by using espresso to scroll to a position. 1043737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing onView(withId(R.id.recycler_view)).perform(scrollToPosition(0)); 1053737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing } 1063737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing 1074e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing private void setupPagedListView(List<TextListItem> items) { 108e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing ListItemProvider provider = new ListItemProvider.ListProvider( 109e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing new ArrayList<>(items)); 110e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing try { 111a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing mAdapter = new ListItemAdapter(mActivity, provider); 112e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing mActivityRule.runOnUiThread(() -> { 113a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing mPagedListView.setAdapter(mAdapter); 114e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing }); 115e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } catch (Throwable throwable) { 116e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing throwable.printStackTrace(); 117e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing throw new RuntimeException(throwable); 118e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 1193737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing 1203737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing refreshUi(); 121e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 122e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 123e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing private static void verifyViewIsHidden(View view) { 124e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing if (view instanceof ViewGroup) { 125e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing ViewGroup viewGroup = (ViewGroup) view; 126e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing final int childCount = viewGroup.getChildCount(); 127e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing for (int i = 0; i < childCount; i++) { 128e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing verifyViewIsHidden(viewGroup.getChildAt(i)); 129e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 130e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } else { 131e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertThat(view.getVisibility(), is(equalTo(View.GONE))); 132e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 133e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 134e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 1354e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing private TextListItem.ViewHolder getViewHolderAtPosition(int position) { 1364e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing return (TextListItem.ViewHolder) mPagedListView.getRecyclerView() 137e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing .findViewHolderForAdapterPosition( 138e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing position); 139e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 140e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 141e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing @Test 142e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing public void testEmptyItemHidesAllViews() { 143172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item = new TextListItem(mActivity); 144e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing setupPagedListView(Arrays.asList(item)); 145b226d4dcc396fe8837876dfa113143702dd23c26Anthony Chen verifyViewIsHidden(mPagedListView.getRecyclerView().getLayoutManager().getChildAt(0)); 146e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 147e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 148e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing @Test 149e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing public void testPrimaryActionVisible() { 150172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item0 = new TextListItem(mActivity); 151172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item0.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon, true); 152172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 153172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item1 = new TextListItem(mActivity); 154172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item1.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon, false); 155172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 156172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing List<TextListItem> items = Arrays.asList(item0, item1); 157e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing setupPagedListView(items); 158e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 159e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertThat(getViewHolderAtPosition(0).getPrimaryIcon().getVisibility(), 160e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing is(equalTo(View.VISIBLE))); 161e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertThat(getViewHolderAtPosition(1).getPrimaryIcon().getVisibility(), 162e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing is(equalTo(View.VISIBLE))); 163e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 164e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 165e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing @Test 166e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing public void testTextVisible() { 167172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item0 = new TextListItem(mActivity); 168172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item0.setTitle("title"); 169172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 170172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item1 = new TextListItem(mActivity); 171172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item1.setBody("body"); 172172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 173172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing List<TextListItem> items = Arrays.asList(item0, item1); 174e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing setupPagedListView(items); 175e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 176e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertThat(getViewHolderAtPosition(0).getTitle().getVisibility(), 177e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing is(equalTo(View.VISIBLE))); 178e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertThat(getViewHolderAtPosition(1).getBody().getVisibility(), 179e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing is(equalTo(View.VISIBLE))); 180e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 181e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 182e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing @Test 183e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing public void testSupplementalActionVisible() { 184172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item0 = new TextListItem(mActivity); 185172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item0.setSupplementalIcon(android.R.drawable.sym_def_app_icon, true); 186172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 187172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item1 = new TextListItem(mActivity); 188172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item1.setAction("text", true, v -> { /* Do nothing. */ }); 189172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 190172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 191172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item2 = new TextListItem(mActivity); 192172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item2.setActions("text", true, v -> { /* Do nothing. */ }, 193172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing "text", true, v -> { /* Do nothing. */ }); 194172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 195172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing List<TextListItem> items = Arrays.asList(item0, item1, item2); 196e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing setupPagedListView(items); 197e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 1984e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0); 199e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertThat(viewHolder.getSupplementalIcon().getVisibility(), is(equalTo(View.VISIBLE))); 200e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertThat(viewHolder.getSupplementalIconDivider().getVisibility(), 201e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing is(equalTo(View.VISIBLE))); 202e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 203e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing viewHolder = getViewHolderAtPosition(1); 204e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertThat(viewHolder.getAction1().getVisibility(), is(equalTo(View.VISIBLE))); 205e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertThat(viewHolder.getAction1Divider().getVisibility(), is(equalTo(View.VISIBLE))); 206e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 207e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing viewHolder = getViewHolderAtPosition(2); 208e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertThat(viewHolder.getAction1().getVisibility(), is(equalTo(View.VISIBLE))); 209e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertThat(viewHolder.getAction1Divider().getVisibility(), is(equalTo(View.VISIBLE))); 210e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertThat(viewHolder.getAction2().getVisibility(), is(equalTo(View.VISIBLE))); 211e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertThat(viewHolder.getAction2Divider().getVisibility(), is(equalTo(View.VISIBLE))); 212e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 213e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 214e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing @Test 21565ec7f1338516c11ea1442912a22d50033fe8fb8Yao, Yuxing public void testSetSupplementalActionWithDrawable() { 21665ec7f1338516c11ea1442912a22d50033fe8fb8Yao, Yuxing Drawable drawable = mActivity.getDrawable(android.R.drawable.sym_def_app_icon); 21765ec7f1338516c11ea1442912a22d50033fe8fb8Yao, Yuxing TextListItem item = new TextListItem(mActivity); 21865ec7f1338516c11ea1442912a22d50033fe8fb8Yao, Yuxing item.setSupplementalIcon(drawable, true); 21965ec7f1338516c11ea1442912a22d50033fe8fb8Yao, Yuxing 22065ec7f1338516c11ea1442912a22d50033fe8fb8Yao, Yuxing setupPagedListView(Arrays.asList(item)); 22165ec7f1338516c11ea1442912a22d50033fe8fb8Yao, Yuxing 22265ec7f1338516c11ea1442912a22d50033fe8fb8Yao, Yuxing assertThat(getViewHolderAtPosition(0).getSupplementalIcon().getDrawable(), 22365ec7f1338516c11ea1442912a22d50033fe8fb8Yao, Yuxing is(equalTo(drawable))); 22465ec7f1338516c11ea1442912a22d50033fe8fb8Yao, Yuxing } 22565ec7f1338516c11ea1442912a22d50033fe8fb8Yao, Yuxing 22665ec7f1338516c11ea1442912a22d50033fe8fb8Yao, Yuxing @Test 22722037e659c30185f51f522e1761236f780334c9dYao, Yuxing public void testSwitchVisibleAndCheckedState() { 228172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item0 = new TextListItem(mActivity); 229172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item0.setSwitch(true, true, null); 230172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 231172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item1 = new TextListItem(mActivity); 232172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item1.setSwitch(false, true, null); 233172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 234172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing List<TextListItem> items = Arrays.asList(item0, item1); 23522037e659c30185f51f522e1761236f780334c9dYao, Yuxing setupPagedListView(items); 23622037e659c30185f51f522e1761236f780334c9dYao, Yuxing 2374e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0); 23822037e659c30185f51f522e1761236f780334c9dYao, Yuxing assertThat(viewHolder.getSwitch().getVisibility(), is(equalTo(View.VISIBLE))); 23922037e659c30185f51f522e1761236f780334c9dYao, Yuxing assertThat(viewHolder.getSwitch().isChecked(), is(equalTo(true))); 24022037e659c30185f51f522e1761236f780334c9dYao, Yuxing assertThat(viewHolder.getSwitchDivider().getVisibility(), is(equalTo(View.VISIBLE))); 24122037e659c30185f51f522e1761236f780334c9dYao, Yuxing 24222037e659c30185f51f522e1761236f780334c9dYao, Yuxing viewHolder = getViewHolderAtPosition(1); 24322037e659c30185f51f522e1761236f780334c9dYao, Yuxing assertThat(viewHolder.getSwitch().getVisibility(), is(equalTo(View.VISIBLE))); 24422037e659c30185f51f522e1761236f780334c9dYao, Yuxing assertThat(viewHolder.getSwitch().isChecked(), is(equalTo(false))); 24522037e659c30185f51f522e1761236f780334c9dYao, Yuxing assertThat(viewHolder.getSwitchDivider().getVisibility(), is(equalTo(View.VISIBLE))); 24622037e659c30185f51f522e1761236f780334c9dYao, Yuxing } 247a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing 248a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing @Test 249a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing public void testSetSwitchState() { 250a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing TextListItem item0 = new TextListItem(mActivity); 251a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing item0.setSwitch(true, true, null); 252a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing 253a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing setupPagedListView(Arrays.asList(item0)); 254a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing 255a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing item0.setSwitchState(false); 2563737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing 2573737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing refreshUi(); 258a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing 259a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0); 260a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing assertThat(viewHolder.getSwitch().getVisibility(), is(equalTo(View.VISIBLE))); 261a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing assertThat(viewHolder.getSwitch().isChecked(), is(equalTo(false))); 262a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing } 263a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing 264a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing @Test 265a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing public void testSetSwitchStateHasNoEffectIfSwitchIsNotEnabled() { 266a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing TextListItem item0 = new TextListItem(mActivity); 267a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing setupPagedListView(Arrays.asList(item0)); 268a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing 269a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing item0.setSwitchState(false); 2703737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing 2713737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing refreshUi(); 272a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing 273a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0); 274a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing assertThat(viewHolder.getSwitch().getVisibility(), is(not(equalTo(View.VISIBLE)))); 275a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing } 27622037e659c30185f51f522e1761236f780334c9dYao, Yuxing 27722037e659c30185f51f522e1761236f780334c9dYao, Yuxing @Test 278e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing public void testDividersAreOptional() { 279172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item0 = new TextListItem(mActivity); 280172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item0.setSupplementalIcon(android.R.drawable.sym_def_app_icon, false); 281172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 282172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item1 = new TextListItem(mActivity); 283172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item1.setAction("text", false, v -> { /* Do nothing. */ }); 284172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 285172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item2 = new TextListItem(mActivity); 286172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item2.setActions("text", false, v -> { /* Do nothing. */ }, 287172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing "text", false, v -> { /* Do nothing. */ }); 288172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 289172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item3 = new TextListItem(mActivity); 290172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item3.setSwitch(true, false, null); 291172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 292172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing List<TextListItem> items = Arrays.asList(item0, item1, item2, item3); 293e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing setupPagedListView(items); 294e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 2954e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0); 296e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertThat(viewHolder.getSupplementalIcon().getVisibility(), is(equalTo(View.VISIBLE))); 297e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertThat(viewHolder.getSupplementalIconDivider().getVisibility(), 298e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing is(equalTo(View.GONE))); 299e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 300e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing viewHolder = getViewHolderAtPosition(1); 301e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertThat(viewHolder.getAction1().getVisibility(), is(equalTo(View.VISIBLE))); 302e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertThat(viewHolder.getAction1Divider().getVisibility(), is(equalTo(View.GONE))); 303e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 304e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing viewHolder = getViewHolderAtPosition(2); 305e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertThat(viewHolder.getAction1().getVisibility(), is(equalTo(View.VISIBLE))); 306e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertThat(viewHolder.getAction1Divider().getVisibility(), is(equalTo(View.GONE))); 307e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertThat(viewHolder.getAction2().getVisibility(), is(equalTo(View.VISIBLE))); 308e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertThat(viewHolder.getAction2Divider().getVisibility(), is(equalTo(View.GONE))); 30922037e659c30185f51f522e1761236f780334c9dYao, Yuxing 31022037e659c30185f51f522e1761236f780334c9dYao, Yuxing viewHolder = getViewHolderAtPosition(3); 31122037e659c30185f51f522e1761236f780334c9dYao, Yuxing assertThat(viewHolder.getSwitch().getVisibility(), is(equalTo(View.VISIBLE))); 31222037e659c30185f51f522e1761236f780334c9dYao, Yuxing assertThat(viewHolder.getSwitchDivider().getVisibility(), is(equalTo(View.GONE))); 313e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 314e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 315e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing @Test 316172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing public void testTextStartMarginMatchesPrimaryActionType() { 317172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item0 = new TextListItem(mActivity); 318172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item0.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon, true); 3199b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana 320172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item1 = new TextListItem(mActivity); 321172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item1.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon, false); 3229b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana 323172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item2 = new TextListItem(mActivity); 324172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item2.setPrimaryActionEmptyIcon(); 3259b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana 326172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item3 = new TextListItem(mActivity); 327172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item3.setPrimaryActionNoIcon(); 328172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 329172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing List<TextListItem> items = Arrays.asList(item0, item1, item2, item3); 330e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing List<Integer> expectedStartMargin = Arrays.asList(R.dimen.car_keyline_4, 331e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing R.dimen.car_keyline_3, R.dimen.car_keyline_3, R.dimen.car_keyline_1); 332e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing setupPagedListView(items); 333e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 334e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing for (int i = 0; i < items.size(); i++) { 3354e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(i); 336e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 337e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing int expected = InstrumentationRegistry.getContext().getResources() 338e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing .getDimensionPixelSize(expectedStartMargin.get(i)); 339e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertThat(((ViewGroup.MarginLayoutParams) viewHolder.getTitle().getLayoutParams()) 340e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing .getMarginStart(), is(equalTo(expected))); 341e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertThat(((ViewGroup.MarginLayoutParams) viewHolder.getBody().getLayoutParams()) 342e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing .getMarginStart(), is(equalTo(expected))); 343e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 344e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 345e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 346e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing @Test 347e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing public void testItemWithOnlyTitleIsSingleLine() { 348172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing // Only space. 349172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item0 = new TextListItem(mActivity); 350172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item0.setTitle(" "); 351172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 352172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing // Underscore. 353172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item1 = new TextListItem(mActivity); 354172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item1.setTitle("______"); 355172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 356172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item2 = new TextListItem(mActivity); 357172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item2.setTitle("ALL UPPER CASE"); 358172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 359172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing // String wouldn't fit in one line. 360172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item3 = new TextListItem(mActivity); 361172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item3.setTitle(InstrumentationRegistry.getContext().getResources().getString( 3623737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing R.string.over_uxr_text_length_limit)); 363172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 364172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing List<TextListItem> items = Arrays.asList(item0, item1, item2, item3); 365e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing setupPagedListView(items); 366e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 367e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing double singleLineHeight = InstrumentationRegistry.getContext().getResources().getDimension( 368e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing R.dimen.car_single_line_list_item_height); 369e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 370b226d4dcc396fe8837876dfa113143702dd23c26Anthony Chen LinearLayoutManager layoutManager = 371b226d4dcc396fe8837876dfa113143702dd23c26Anthony Chen (LinearLayoutManager) mPagedListView.getRecyclerView().getLayoutManager(); 372e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing for (int i = 0; i < items.size(); i++) { 373b226d4dcc396fe8837876dfa113143702dd23c26Anthony Chen assertThat((double) layoutManager.findViewByPosition(i).getHeight(), 374e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing is(closeTo(singleLineHeight, 1.0d))); 375e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 376e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 377e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 378e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing @Test 379e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing public void testItemWithBodyTextIsAtLeastDoubleLine() { 380172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing // Only space. 381172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item0 = new TextListItem(mActivity); 382172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item0.setBody(" "); 383172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 384172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing // Underscore. 385172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item1 = new TextListItem(mActivity); 386172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item1.setBody("____"); 387172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 388172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing // String wouldn't fit in one line. 389172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item2 = new TextListItem(mActivity); 390172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item2.setBody(InstrumentationRegistry.getContext().getResources().getString( 3913737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing R.string.over_uxr_text_length_limit)); 392172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 393172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing List<TextListItem> items = Arrays.asList(item0, item1, item2); 394e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing setupPagedListView(items); 395e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 396e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing final int doubleLineHeight = 397e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing (int) InstrumentationRegistry.getContext().getResources().getDimension( 398e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing R.dimen.car_double_line_list_item_height); 399e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 400b226d4dcc396fe8837876dfa113143702dd23c26Anthony Chen LinearLayoutManager layoutManager = 401b226d4dcc396fe8837876dfa113143702dd23c26Anthony Chen (LinearLayoutManager) mPagedListView.getRecyclerView().getLayoutManager(); 402e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing for (int i = 0; i < items.size(); i++) { 403b226d4dcc396fe8837876dfa113143702dd23c26Anthony Chen assertThat(layoutManager.findViewByPosition(i).getHeight(), 404e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing is(greaterThanOrEqualTo(doubleLineHeight))); 405e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 406e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 407e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 408e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing @Test 409e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing public void testPrimaryIconDrawable() { 410e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing Drawable drawable = InstrumentationRegistry.getContext().getResources().getDrawable( 411e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing android.R.drawable.sym_def_app_icon, null); 412172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 413172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item0 = new TextListItem(mActivity); 414172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item0.setPrimaryActionIcon(drawable, true); 415172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 416172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing List<TextListItem> items = Arrays.asList(item0); 417e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing setupPagedListView(items); 418e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 419e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertTrue(getViewHolderAtPosition(0).getPrimaryIcon().getDrawable().getConstantState() 420e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing .equals(drawable.getConstantState())); 421e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 422e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 423e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing @Test 424e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing public void testLargePrimaryIconHasNoStartMargin() { 425172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item0 = new TextListItem(mActivity); 426172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item0.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon, true); 427172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 428172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing List<TextListItem> items = Arrays.asList(item0); 429e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing setupPagedListView(items); 430e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 4314e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0); 432e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertThat(((ViewGroup.MarginLayoutParams) viewHolder.getPrimaryIcon().getLayoutParams()) 433e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing .getMarginStart(), is(equalTo(0))); 434e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 435e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 436e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing @Test 437e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing public void testSmallPrimaryIconStartMargin() { 438172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item0 = new TextListItem(mActivity); 439172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item0.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon, false); 440172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 441172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing List<TextListItem> items = Arrays.asList(item0); 442e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing setupPagedListView(items); 443e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 444e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing int expected = InstrumentationRegistry.getContext().getResources().getDimensionPixelSize( 445e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing R.dimen.car_keyline_1); 446e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 4474e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0); 448e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertThat(((ViewGroup.MarginLayoutParams) viewHolder.getPrimaryIcon().getLayoutParams()) 449e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing .getMarginStart(), is(equalTo(expected))); 450e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 451e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 452e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing @Test 4535dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing public void testSmallPrimaryIconTopMarginRemainsTheSameRegardlessOfTextLength() { 4545dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing final String longText = InstrumentationRegistry.getContext().getResources().getString( 4553737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing R.string.over_uxr_text_length_limit); 456172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 457172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing // Single line item. 458172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item0 = new TextListItem(mActivity); 459172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item0.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon, false); 460172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item0.setTitle("one line text"); 461172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 462172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing // Double line item with one line text. 463172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item1 = new TextListItem(mActivity); 464172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item1.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon, false); 465172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item1.setTitle("one line text"); 466172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item1.setBody("one line text"); 467172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 468172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing // Double line item with long text. 469172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item2 = new TextListItem(mActivity); 470172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item2.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon, false); 471172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item2.setTitle("one line text"); 472172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item2.setBody(longText); 473172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 474172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing // Body text only - long text. 475172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item3 = new TextListItem(mActivity); 476172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item3.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon, false); 477172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item3.setBody(longText); 478172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 479172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing // Body text only - one line text. 480172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item4 = new TextListItem(mActivity); 481172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item4.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon, false); 482172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item4.setBody("one line text"); 483172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 484172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing List<TextListItem> items = Arrays.asList(item0, item1, item2, item3, item4); 4855dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing setupPagedListView(items); 4865dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing 4875dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing for (int i = 1; i < items.size(); i++) { 4885dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing onView(withId(R.id.recycler_view)).perform(scrollToPosition(i)); 4895dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing // Implementation uses integer division so it may be off by 1 vs centered vertically. 4905dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing assertThat((double) getViewHolderAtPosition(i - 1).getPrimaryIcon().getTop(), 4915dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing is(closeTo( 4925dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing (double) getViewHolderAtPosition(i).getPrimaryIcon().getTop(), 1.0d))); 4935dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing } 4945dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing } 4955dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing 4965dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing @Test 497e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing public void testClickingPrimaryActionIsSeparateFromSupplementalAction() { 498e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing final boolean[] clicked = {false, false}; 499172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 500172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item0 = new TextListItem(mActivity); 501172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item0.setOnClickListener(v -> clicked[0] = true); 502172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item0.setSupplementalIcon(android.R.drawable.sym_def_app_icon, true, 503172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing v -> clicked[1] = true); 504172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 505172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing List<TextListItem> items = Arrays.asList(item0); 506e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing setupPagedListView(items); 507e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 508e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing onView(withId(R.id.recycler_view)).perform(actionOnItemAtPosition(0, click())); 509e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertTrue(clicked[0]); 510e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertFalse(clicked[1]); 511e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 512e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing onView(withId(R.id.recycler_view)).perform( 513e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing actionOnItemAtPosition(0, clickChildViewWithId(R.id.supplemental_icon))); 514e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertTrue(clicked[1]); 515e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 516e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 517e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing @Test 518e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing public void testClickingSupplementalIcon() { 519e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing final boolean[] clicked = {false}; 520172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 521172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item0 = new TextListItem(mActivity); 522172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item0.setSupplementalIcon(android.R.drawable.sym_def_app_icon, true, 523172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing v -> clicked[0] = true); 524172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 525172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing List<TextListItem> items = Arrays.asList(item0); 526e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing setupPagedListView(items); 527e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 528e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing onView(withId(R.id.recycler_view)).perform( 529e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing actionOnItemAtPosition(0, clickChildViewWithId(R.id.supplemental_icon))); 530e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertTrue(clicked[0]); 531e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 532e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 533e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing @Test 534439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing public void testSupplementalIconWithoutClickListenerIsNotClickable() { 535172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item0 = new TextListItem(mActivity); 536172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item0.setSupplementalIcon(android.R.drawable.sym_def_app_icon, true); 537172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 538172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing List<TextListItem> items = Arrays.asList(item0); 539439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing setupPagedListView(items); 540439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing 5414e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0); 542439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing assertFalse(viewHolder.getSupplementalIcon().isClickable()); 543439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing } 544439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing 545439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing @Test 54622037e659c30185f51f522e1761236f780334c9dYao, Yuxing public void testCheckingSwitch() { 54722037e659c30185f51f522e1761236f780334c9dYao, Yuxing final boolean[] clicked = {false, false}; 548172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 549172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item0 = new TextListItem(mActivity); 550172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item0.setSwitch(false, false, (button, isChecked) -> { 551172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing // Initial value is false. 552172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing assertTrue(isChecked); 553172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing clicked[0] = true; 554172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing }); 555172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 556172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item1 = new TextListItem(mActivity); 557172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item1.setSwitch(true, false, (button, isChecked) -> { 558172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing // Initial value is true. 559172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing assertFalse(isChecked); 560172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing clicked[1] = true; 561172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing }); 562172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 563172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing List<TextListItem> items = Arrays.asList(item0, item1); 56422037e659c30185f51f522e1761236f780334c9dYao, Yuxing setupPagedListView(items); 56522037e659c30185f51f522e1761236f780334c9dYao, Yuxing 56622037e659c30185f51f522e1761236f780334c9dYao, Yuxing onView(withId(R.id.recycler_view)).perform( 56722037e659c30185f51f522e1761236f780334c9dYao, Yuxing actionOnItemAtPosition(0, clickChildViewWithId(R.id.switch_widget))); 56822037e659c30185f51f522e1761236f780334c9dYao, Yuxing assertTrue(clicked[0]); 56922037e659c30185f51f522e1761236f780334c9dYao, Yuxing 57022037e659c30185f51f522e1761236f780334c9dYao, Yuxing onView(withId(R.id.recycler_view)).perform( 57122037e659c30185f51f522e1761236f780334c9dYao, Yuxing actionOnItemAtPosition(1, clickChildViewWithId(R.id.switch_widget))); 57222037e659c30185f51f522e1761236f780334c9dYao, Yuxing assertTrue(clicked[1]); 57322037e659c30185f51f522e1761236f780334c9dYao, Yuxing } 57422037e659c30185f51f522e1761236f780334c9dYao, Yuxing 57522037e659c30185f51f522e1761236f780334c9dYao, Yuxing @Test 576e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing public void testClickingSupplementalAction() { 577e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing final boolean[] clicked = {false}; 578172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 579172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item0 = new TextListItem(mActivity); 580172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item0.setAction("action", true, v -> clicked[0] = true); 581172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 582172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing List<TextListItem> items = Arrays.asList(item0); 583e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing setupPagedListView(items); 584e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 585e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing onView(withId(R.id.recycler_view)).perform( 586e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing actionOnItemAtPosition(0, clickChildViewWithId(R.id.action1))); 587e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertTrue(clicked[0]); 588e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 589e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 590e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing @Test 591e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing public void testClickingBothSupplementalActions() { 592e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing final boolean[] clicked = {false, false}; 593172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 594172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item0 = new TextListItem(mActivity); 595172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item0.setActions("action 1", true, v -> clicked[0] = true, 596172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing "action 2", true, v -> clicked[1] = true); 597172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 598172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing List<TextListItem> items = Arrays.asList(item0); 599e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing setupPagedListView(items); 600e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 601e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing onView(withId(R.id.recycler_view)).perform( 602e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing actionOnItemAtPosition(0, clickChildViewWithId(R.id.action1))); 603e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertTrue(clicked[0]); 604e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertFalse(clicked[1]); 605e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 606e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing onView(withId(R.id.recycler_view)).perform( 607e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing actionOnItemAtPosition(0, clickChildViewWithId(R.id.action2))); 608e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertTrue(clicked[1]); 609e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 610e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 611e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing @Test 612172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing public void testCustomViewBinderBindsLast() { 613e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing final String updatedTitle = "updated title"; 614172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 615172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item0 = new TextListItem(mActivity); 616172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item0.setTitle("original title"); 617172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item0.addViewBinder((viewHolder) -> viewHolder.getTitle().setText(updatedTitle)); 618172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 619172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing List<TextListItem> items = Arrays.asList(item0); 620e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing setupPagedListView(items); 621e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 6224e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0); 623e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertThat(viewHolder.getTitle().getText(), is(equalTo(updatedTitle))); 624e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 625e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 626e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing @Test 627e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing public void testCustomViewBinderOnUnusedViewsHasNoEffect() { 628172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item0 = new TextListItem(mActivity); 629172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item0.addViewBinder((viewHolder) -> viewHolder.getBody().setText("text")); 630172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 631172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing List<TextListItem> items = Arrays.asList(item0); 632e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing setupPagedListView(items); 633e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 6344e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0); 635e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertThat(viewHolder.getBody().getVisibility(), is(equalTo(View.GONE))); 636e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing // Custom binder interacts with body but has no effect. 637e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing // Expect card height to remain single line. 638e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertThat((double) viewHolder.itemView.getHeight(), is(closeTo( 639e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing InstrumentationRegistry.getContext().getResources().getDimension( 640e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing R.dimen.car_single_line_list_item_height), 1.0d))); 641e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 642e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 643e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing @Test 64420e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing public void testRevertingViewBinder() throws Throwable { 64520e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing TextListItem item0 = new TextListItem(mActivity); 64620e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing item0.setBody("one item"); 64720e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing item0.addViewBinder( 64820e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing (viewHolder) -> viewHolder.getBody().setEllipsize(TextUtils.TruncateAt.END), 64920e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing (viewHolder -> viewHolder.getBody().setEllipsize(null))); 65020e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing 65120e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing List<TextListItem> items = Arrays.asList(item0); 65220e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing setupPagedListView(items); 65320e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing 65420e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0); 65520e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing 65620e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing // Bind view holder to a new item - the customization made by item0 should be reverted. 65720e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing TextListItem item1 = new TextListItem(mActivity); 65820e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing item1.setBody("new item"); 65920e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing mActivityRule.runOnUiThread(() -> item1.bind(viewHolder)); 66020e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing 66120e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing assertThat(viewHolder.getBody().getEllipsize(), is(equalTo(null))); 66220e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing } 66320e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing 66420e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing @Test 66520e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing public void testRemovingViewBinder() { 66620e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing TextListItem item0 = new TextListItem(mActivity); 66720e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing item0.setBody("one item"); 66820e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing ListItem.ViewBinder<TextListItem.ViewHolder> binder = 66920e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing (viewHolder) -> viewHolder.getTitle().setEllipsize(TextUtils.TruncateAt.END); 67020e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing item0.addViewBinder(binder); 67120e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing 67220e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing assertTrue(item0.removeViewBinder(binder)); 67320e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing 67420e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing List<TextListItem> items = Arrays.asList(item0); 67520e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing setupPagedListView(items); 67620e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing 67720e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing assertThat(getViewHolderAtPosition(0).getBody().getEllipsize(), is(equalTo(null))); 67820e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing } 67920e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing 68020e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing @Test 681e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing public void testSettingTitleOrBodyAsPrimaryText() { 682e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing // Create 2 items, one with Title as primary (default) and one with Body. 683e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing // The primary text, regardless of view, should have consistent look (as primary). 684172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item0 = new TextListItem(mActivity); 685172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item0.setTitle("title"); 686172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item0.setBody("body"); 687172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 688172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item1 = new TextListItem(mActivity); 689172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item1.setTitle("title"); 690172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item1.setBody("body", true); 691172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 692172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing List<TextListItem> items = Arrays.asList(item0, item1); 693e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing setupPagedListView(items); 694e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 6954e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing TextListItem.ViewHolder titlePrimary = getViewHolderAtPosition(0); 6964e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing TextListItem.ViewHolder bodyPrimary = getViewHolderAtPosition(1); 697e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertThat(titlePrimary.getTitle().getTextSize(), 698e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing is(equalTo(bodyPrimary.getBody().getTextSize()))); 699e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertThat(titlePrimary.getTitle().getTextColors(), 700e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing is(equalTo(bodyPrimary.getBody().getTextColors()))); 701e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 702e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 703a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing @Test 704a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing public void testNoCarriedOverLayoutParamsForTextView() throws Throwable { 705172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem singleLine = new TextListItem(mActivity); 706172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing singleLine.setTitle("title"); 707172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 708a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing setupPagedListView(Arrays.asList(singleLine)); 709a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing 710a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing // Manually rebind the view holder of a single line item to a double line item. 711172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem doubleLine = new TextListItem(mActivity); 712172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing doubleLine.setTitle("title"); 713172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing doubleLine.setBody("body"); 7144e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0); 715a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing mActivityRule.runOnUiThread(() -> doubleLine.bind(viewHolder)); 716a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing 717a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing RelativeLayout.LayoutParams titleLayoutParams = 718a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing (RelativeLayout.LayoutParams) viewHolder.getTitle().getLayoutParams(); 719a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing RelativeLayout.LayoutParams bodyLayoutParams = 720a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing (RelativeLayout.LayoutParams) viewHolder.getTitle().getLayoutParams(); 721a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing assertThat(titleLayoutParams.getRule(RelativeLayout.CENTER_VERTICAL), is(equalTo(0))); 722a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing assertThat(bodyLayoutParams.getRule(RelativeLayout.CENTER_VERTICAL), is(equalTo(0))); 723a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing } 724a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing 725a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing @Test 726a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing public void testNoCarriedOverLayoutParamsForPrimaryIcon() throws Throwable { 727172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem smallIcon = new TextListItem(mActivity); 728172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing smallIcon.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon, false); 729172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing smallIcon.setBody("body"); // Small icon of items with body text should use top margin. 730a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing setupPagedListView(Arrays.asList(smallIcon)); 731a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing 732a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing // Manually rebind the view holder. 733172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem largeIcon = new TextListItem(mActivity); 734172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing largeIcon.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon, true); 7354e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0); 736a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing mActivityRule.runOnUiThread(() -> largeIcon.bind(viewHolder)); 737a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing 738a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing RelativeLayout.LayoutParams iconLayoutParams = 739a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing (RelativeLayout.LayoutParams) viewHolder.getPrimaryIcon().getLayoutParams(); 740a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing assertThat(iconLayoutParams.getRule(RelativeLayout.CENTER_VERTICAL), 741a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing is(equalTo(RelativeLayout.TRUE))); 742a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing assertThat(iconLayoutParams.topMargin, is(equalTo(0))); 743a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing } 744a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing 745172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing @Test 74601d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing public void testNoCarriedOverOnClickListener() throws Throwable { 74701d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing boolean[] clicked = new boolean[] {false}; 74801d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing TextListItem item0 = new TextListItem(mActivity); 74901d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing item0.setOnClickListener(v -> clicked[0] = true); 75001d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing 75101d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing setupPagedListView(Arrays.asList(item0)); 75201d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing 75301d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing onView(withId(R.id.recycler_view)).perform(actionOnItemAtPosition(0, click())); 75401d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing assertTrue(clicked[0]); 75501d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing 75601d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing // item1 does not have onClickListener. 75701d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing TextListItem item1 = new TextListItem(mActivity); 75801d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0); 75901d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing // Manually rebind the view holder. 76001d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing mActivityRule.runOnUiThread(() -> item1.bind(viewHolder)); 76101d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing 76201d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing // Reset for testing. 76301d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing clicked[0] = false; 76401d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing onView(withId(R.id.recycler_view)).perform(actionOnItemAtPosition(0, click())); 76501d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing assertFalse(clicked[0]); 76601d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing } 76701d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing 76801d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing @Test 7692524380fff7e003a2949947561f5ac2fa9591391Yao, Yuxing public void testUpdateItem() { 770172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item = new TextListItem(mActivity); 771172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing setupPagedListView(Arrays.asList(item)); 772172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 773172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing String title = "updated title"; 774172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item.setTitle(title); 775172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 7763737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing refreshUi(); 777172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 778172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0); 779172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing assertThat(viewHolder.getTitle().getText(), is(equalTo(title))); 780172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing } 781172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 7823737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing @Test 7832524380fff7e003a2949947561f5ac2fa9591391Yao, Yuxing public void testUxRestrictionsChange() { 7843737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing String longText = mActivity.getString(R.string.over_uxr_text_length_limit); 7853737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing TextListItem item = new TextListItem(mActivity); 7863737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing item.setBody(longText); 7873737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing 7883737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing setupPagedListView(Arrays.asList(item)); 7893737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing 7903737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0); 7913737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing // Default behavior without UXR is unrestricted. 7923737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing assertThat(viewHolder.getBody().getText(), is(equalTo(longText))); 7933737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing 7943737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing viewHolder.complyWithUxRestrictions(CarUxRestrictionsTestUtils.getFullyRestricted()); 7953737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing refreshUi(); 7963737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing 7973737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing // Verify that the body text length is limited. 7983737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing assertThat(viewHolder.getBody().getText().length(), is(lessThan(longText.length()))); 7993737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing } 8003737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing 8013737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing @Test 8023737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing public void testUxRestrictionsChangesDoNotAlterExistingInputFilters() { 8033737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing InputFilter filter = new InputFilter.AllCaps(Locale.US); 8043737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing String bodyText = "bodytext"; 8053737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing TextListItem item = new TextListItem(mActivity); 8063737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing item.setBody(bodyText); 8073737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing item.addViewBinder(vh -> vh.getBody().setFilters(new InputFilter[] {filter})); 8083737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing 8093737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing setupPagedListView(Arrays.asList(item)); 8103737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing 8113737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0); 8123737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing 8133737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing // Toggle UX restrictions between fully restricted and unrestricted should not affect 8143737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing // existing filters. 8153737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing viewHolder.complyWithUxRestrictions(CarUxRestrictionsTestUtils.getFullyRestricted()); 8163737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing refreshUi(); 8173737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing assertTrue(Arrays.asList(viewHolder.getBody().getFilters()).contains(filter)); 8183737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing 81932a32d76550734f2c35f5db5b53890d8a2589281Yao, Yuxing viewHolder.complyWithUxRestrictions(CarUxRestrictionsTestUtils.getBaseline()); 8203737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing refreshUi(); 8213737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing assertTrue(Arrays.asList(viewHolder.getBody().getFilters()).contains(filter)); 8223737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing } 8233737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing 824e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing private static ViewAction clickChildViewWithId(final int id) { 825e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing return new ViewAction() { 826e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing @Override 827e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing public Matcher<View> getConstraints() { 828e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing return null; 829e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 830e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 831e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing @Override 832e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing public String getDescription() { 833e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing return "Click on a child view with specific id."; 834e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 835e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 836e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing @Override 837e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing public void perform(UiController uiController, View view) { 838e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing View v = view.findViewById(id); 839e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing v.performClick(); 840e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 841e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing }; 842e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 843e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing} 844