TextListItemTest.java revision 32a32d76550734f2c35f5db5b53890d8a2589281
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 21522037e659c30185f51f522e1761236f780334c9dYao, Yuxing public void testSwitchVisibleAndCheckedState() { 216172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item0 = new TextListItem(mActivity); 217172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item0.setSwitch(true, true, null); 218172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 219172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item1 = new TextListItem(mActivity); 220172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item1.setSwitch(false, true, null); 221172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 222172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing List<TextListItem> items = Arrays.asList(item0, item1); 22322037e659c30185f51f522e1761236f780334c9dYao, Yuxing setupPagedListView(items); 22422037e659c30185f51f522e1761236f780334c9dYao, Yuxing 2254e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0); 22622037e659c30185f51f522e1761236f780334c9dYao, Yuxing assertThat(viewHolder.getSwitch().getVisibility(), is(equalTo(View.VISIBLE))); 22722037e659c30185f51f522e1761236f780334c9dYao, Yuxing assertThat(viewHolder.getSwitch().isChecked(), is(equalTo(true))); 22822037e659c30185f51f522e1761236f780334c9dYao, Yuxing assertThat(viewHolder.getSwitchDivider().getVisibility(), is(equalTo(View.VISIBLE))); 22922037e659c30185f51f522e1761236f780334c9dYao, Yuxing 23022037e659c30185f51f522e1761236f780334c9dYao, Yuxing viewHolder = getViewHolderAtPosition(1); 23122037e659c30185f51f522e1761236f780334c9dYao, Yuxing assertThat(viewHolder.getSwitch().getVisibility(), is(equalTo(View.VISIBLE))); 23222037e659c30185f51f522e1761236f780334c9dYao, Yuxing assertThat(viewHolder.getSwitch().isChecked(), is(equalTo(false))); 23322037e659c30185f51f522e1761236f780334c9dYao, Yuxing assertThat(viewHolder.getSwitchDivider().getVisibility(), is(equalTo(View.VISIBLE))); 23422037e659c30185f51f522e1761236f780334c9dYao, Yuxing } 235a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing 236a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing @Test 237a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing public void testSetSwitchState() { 238a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing TextListItem item0 = new TextListItem(mActivity); 239a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing item0.setSwitch(true, true, null); 240a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing 241a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing setupPagedListView(Arrays.asList(item0)); 242a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing 243a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing item0.setSwitchState(false); 2443737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing 2453737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing refreshUi(); 246a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing 247a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0); 248a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing assertThat(viewHolder.getSwitch().getVisibility(), is(equalTo(View.VISIBLE))); 249a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing assertThat(viewHolder.getSwitch().isChecked(), is(equalTo(false))); 250a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing } 251a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing 252a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing @Test 253a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing public void testSetSwitchStateHasNoEffectIfSwitchIsNotEnabled() { 254a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing TextListItem item0 = new TextListItem(mActivity); 255a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing setupPagedListView(Arrays.asList(item0)); 256a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing 257a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing item0.setSwitchState(false); 2583737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing 2593737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing refreshUi(); 260a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing 261a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0); 262a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing assertThat(viewHolder.getSwitch().getVisibility(), is(not(equalTo(View.VISIBLE)))); 263a92a509e61fef9b8065f4c5aeeb8727f3724202eYao, Yuxing } 26422037e659c30185f51f522e1761236f780334c9dYao, Yuxing 26522037e659c30185f51f522e1761236f780334c9dYao, Yuxing @Test 266e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing public void testDividersAreOptional() { 267172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item0 = new TextListItem(mActivity); 268172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item0.setSupplementalIcon(android.R.drawable.sym_def_app_icon, false); 269172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 270172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item1 = new TextListItem(mActivity); 271172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item1.setAction("text", false, v -> { /* Do nothing. */ }); 272172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 273172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item2 = new TextListItem(mActivity); 274172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item2.setActions("text", false, v -> { /* Do nothing. */ }, 275172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing "text", false, v -> { /* Do nothing. */ }); 276172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 277172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item3 = new TextListItem(mActivity); 278172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item3.setSwitch(true, false, null); 279172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 280172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing List<TextListItem> items = Arrays.asList(item0, item1, item2, item3); 281e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing setupPagedListView(items); 282e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 2834e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0); 284e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertThat(viewHolder.getSupplementalIcon().getVisibility(), is(equalTo(View.VISIBLE))); 285e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertThat(viewHolder.getSupplementalIconDivider().getVisibility(), 286e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing is(equalTo(View.GONE))); 287e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 288e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing viewHolder = getViewHolderAtPosition(1); 289e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertThat(viewHolder.getAction1().getVisibility(), is(equalTo(View.VISIBLE))); 290e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertThat(viewHolder.getAction1Divider().getVisibility(), is(equalTo(View.GONE))); 291e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 292e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing viewHolder = getViewHolderAtPosition(2); 293e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertThat(viewHolder.getAction1().getVisibility(), is(equalTo(View.VISIBLE))); 294e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertThat(viewHolder.getAction1Divider().getVisibility(), is(equalTo(View.GONE))); 295e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertThat(viewHolder.getAction2().getVisibility(), is(equalTo(View.VISIBLE))); 296e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertThat(viewHolder.getAction2Divider().getVisibility(), is(equalTo(View.GONE))); 29722037e659c30185f51f522e1761236f780334c9dYao, Yuxing 29822037e659c30185f51f522e1761236f780334c9dYao, Yuxing viewHolder = getViewHolderAtPosition(3); 29922037e659c30185f51f522e1761236f780334c9dYao, Yuxing assertThat(viewHolder.getSwitch().getVisibility(), is(equalTo(View.VISIBLE))); 30022037e659c30185f51f522e1761236f780334c9dYao, Yuxing assertThat(viewHolder.getSwitchDivider().getVisibility(), is(equalTo(View.GONE))); 301e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 302e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 303e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing @Test 304172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing public void testTextStartMarginMatchesPrimaryActionType() { 305172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item0 = new TextListItem(mActivity); 306172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item0.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon, true); 3079b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana 308172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item1 = new TextListItem(mActivity); 309172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item1.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon, false); 3109b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana 311172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item2 = new TextListItem(mActivity); 312172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item2.setPrimaryActionEmptyIcon(); 3139b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana 314172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item3 = new TextListItem(mActivity); 315172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item3.setPrimaryActionNoIcon(); 316172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 317172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing List<TextListItem> items = Arrays.asList(item0, item1, item2, item3); 318e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing List<Integer> expectedStartMargin = Arrays.asList(R.dimen.car_keyline_4, 319e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing R.dimen.car_keyline_3, R.dimen.car_keyline_3, R.dimen.car_keyline_1); 320e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing setupPagedListView(items); 321e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 322e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing for (int i = 0; i < items.size(); i++) { 3234e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(i); 324e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 325e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing int expected = InstrumentationRegistry.getContext().getResources() 326e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing .getDimensionPixelSize(expectedStartMargin.get(i)); 327e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertThat(((ViewGroup.MarginLayoutParams) viewHolder.getTitle().getLayoutParams()) 328e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing .getMarginStart(), is(equalTo(expected))); 329e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertThat(((ViewGroup.MarginLayoutParams) viewHolder.getBody().getLayoutParams()) 330e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing .getMarginStart(), is(equalTo(expected))); 331e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 332e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 333e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 334e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing @Test 335e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing public void testItemWithOnlyTitleIsSingleLine() { 336172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing // Only space. 337172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item0 = new TextListItem(mActivity); 338172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item0.setTitle(" "); 339172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 340172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing // Underscore. 341172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item1 = new TextListItem(mActivity); 342172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item1.setTitle("______"); 343172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 344172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item2 = new TextListItem(mActivity); 345172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item2.setTitle("ALL UPPER CASE"); 346172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 347172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing // String wouldn't fit in one line. 348172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item3 = new TextListItem(mActivity); 349172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item3.setTitle(InstrumentationRegistry.getContext().getResources().getString( 3503737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing R.string.over_uxr_text_length_limit)); 351172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 352172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing List<TextListItem> items = Arrays.asList(item0, item1, item2, item3); 353e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing setupPagedListView(items); 354e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 355e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing double singleLineHeight = InstrumentationRegistry.getContext().getResources().getDimension( 356e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing R.dimen.car_single_line_list_item_height); 357e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 358b226d4dcc396fe8837876dfa113143702dd23c26Anthony Chen LinearLayoutManager layoutManager = 359b226d4dcc396fe8837876dfa113143702dd23c26Anthony Chen (LinearLayoutManager) mPagedListView.getRecyclerView().getLayoutManager(); 360e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing for (int i = 0; i < items.size(); i++) { 361b226d4dcc396fe8837876dfa113143702dd23c26Anthony Chen assertThat((double) layoutManager.findViewByPosition(i).getHeight(), 362e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing is(closeTo(singleLineHeight, 1.0d))); 363e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 364e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 365e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 366e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing @Test 367e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing public void testItemWithBodyTextIsAtLeastDoubleLine() { 368172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing // Only space. 369172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item0 = new TextListItem(mActivity); 370172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item0.setBody(" "); 371172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 372172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing // Underscore. 373172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item1 = new TextListItem(mActivity); 374172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item1.setBody("____"); 375172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 376172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing // String wouldn't fit in one line. 377172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item2 = new TextListItem(mActivity); 378172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item2.setBody(InstrumentationRegistry.getContext().getResources().getString( 3793737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing R.string.over_uxr_text_length_limit)); 380172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 381172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing List<TextListItem> items = Arrays.asList(item0, item1, item2); 382e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing setupPagedListView(items); 383e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 384e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing final int doubleLineHeight = 385e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing (int) InstrumentationRegistry.getContext().getResources().getDimension( 386e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing R.dimen.car_double_line_list_item_height); 387e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 388b226d4dcc396fe8837876dfa113143702dd23c26Anthony Chen LinearLayoutManager layoutManager = 389b226d4dcc396fe8837876dfa113143702dd23c26Anthony Chen (LinearLayoutManager) mPagedListView.getRecyclerView().getLayoutManager(); 390e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing for (int i = 0; i < items.size(); i++) { 391b226d4dcc396fe8837876dfa113143702dd23c26Anthony Chen assertThat(layoutManager.findViewByPosition(i).getHeight(), 392e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing is(greaterThanOrEqualTo(doubleLineHeight))); 393e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 394e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 395e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 396e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing @Test 397e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing public void testPrimaryIconDrawable() { 398e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing Drawable drawable = InstrumentationRegistry.getContext().getResources().getDrawable( 399e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing android.R.drawable.sym_def_app_icon, null); 400172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 401172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item0 = new TextListItem(mActivity); 402172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item0.setPrimaryActionIcon(drawable, true); 403172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 404172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing List<TextListItem> items = Arrays.asList(item0); 405e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing setupPagedListView(items); 406e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 407e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertTrue(getViewHolderAtPosition(0).getPrimaryIcon().getDrawable().getConstantState() 408e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing .equals(drawable.getConstantState())); 409e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 410e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 411e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing @Test 412e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing public void testLargePrimaryIconHasNoStartMargin() { 413172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item0 = new TextListItem(mActivity); 414172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item0.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon, true); 415172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 416172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing List<TextListItem> items = Arrays.asList(item0); 417e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing setupPagedListView(items); 418e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 4194e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0); 420e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertThat(((ViewGroup.MarginLayoutParams) viewHolder.getPrimaryIcon().getLayoutParams()) 421e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing .getMarginStart(), is(equalTo(0))); 422e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 423e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 424e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing @Test 425e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing public void testSmallPrimaryIconStartMargin() { 426172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item0 = new TextListItem(mActivity); 427172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item0.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon, false); 428172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 429172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing List<TextListItem> items = Arrays.asList(item0); 430e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing setupPagedListView(items); 431e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 432e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing int expected = InstrumentationRegistry.getContext().getResources().getDimensionPixelSize( 433e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing R.dimen.car_keyline_1); 434e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 4354e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0); 436e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertThat(((ViewGroup.MarginLayoutParams) viewHolder.getPrimaryIcon().getLayoutParams()) 437e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing .getMarginStart(), is(equalTo(expected))); 438e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 439e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 440e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing @Test 4415dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing public void testSmallPrimaryIconTopMarginRemainsTheSameRegardlessOfTextLength() { 4425dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing final String longText = InstrumentationRegistry.getContext().getResources().getString( 4433737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing R.string.over_uxr_text_length_limit); 444172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 445172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing // Single line item. 446172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item0 = new TextListItem(mActivity); 447172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item0.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon, false); 448172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item0.setTitle("one line text"); 449172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 450172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing // Double line item with one line text. 451172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item1 = new TextListItem(mActivity); 452172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item1.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon, false); 453172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item1.setTitle("one line text"); 454172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item1.setBody("one line text"); 455172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 456172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing // Double line item with long text. 457172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item2 = new TextListItem(mActivity); 458172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item2.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon, false); 459172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item2.setTitle("one line text"); 460172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item2.setBody(longText); 461172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 462172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing // Body text only - long text. 463172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item3 = new TextListItem(mActivity); 464172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item3.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon, false); 465172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item3.setBody(longText); 466172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 467172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing // Body text only - one line text. 468172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item4 = new TextListItem(mActivity); 469172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item4.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon, false); 470172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item4.setBody("one line text"); 471172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 472172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing List<TextListItem> items = Arrays.asList(item0, item1, item2, item3, item4); 4735dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing setupPagedListView(items); 4745dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing 4755dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing for (int i = 1; i < items.size(); i++) { 4765dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing onView(withId(R.id.recycler_view)).perform(scrollToPosition(i)); 4775dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing // Implementation uses integer division so it may be off by 1 vs centered vertically. 4785dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing assertThat((double) getViewHolderAtPosition(i - 1).getPrimaryIcon().getTop(), 4795dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing is(closeTo( 4805dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing (double) getViewHolderAtPosition(i).getPrimaryIcon().getTop(), 1.0d))); 4815dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing } 4825dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing } 4835dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing 4845dbc4a83b9c6ea77dd85720a40de7dfc200ee872Yao, Yuxing @Test 485e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing public void testClickingPrimaryActionIsSeparateFromSupplementalAction() { 486e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing final boolean[] clicked = {false, false}; 487172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 488172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item0 = new TextListItem(mActivity); 489172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item0.setOnClickListener(v -> clicked[0] = true); 490172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item0.setSupplementalIcon(android.R.drawable.sym_def_app_icon, true, 491172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing v -> clicked[1] = true); 492172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 493172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing List<TextListItem> items = Arrays.asList(item0); 494e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing setupPagedListView(items); 495e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 496e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing onView(withId(R.id.recycler_view)).perform(actionOnItemAtPosition(0, click())); 497e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertTrue(clicked[0]); 498e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertFalse(clicked[1]); 499e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 500e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing onView(withId(R.id.recycler_view)).perform( 501e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing actionOnItemAtPosition(0, clickChildViewWithId(R.id.supplemental_icon))); 502e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertTrue(clicked[1]); 503e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 504e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 505e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing @Test 506e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing public void testClickingSupplementalIcon() { 507e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing final boolean[] clicked = {false}; 508172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 509172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item0 = new TextListItem(mActivity); 510172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item0.setSupplementalIcon(android.R.drawable.sym_def_app_icon, true, 511172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing v -> clicked[0] = true); 512172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 513172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing List<TextListItem> items = Arrays.asList(item0); 514e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing setupPagedListView(items); 515e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 516e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing onView(withId(R.id.recycler_view)).perform( 517e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing actionOnItemAtPosition(0, clickChildViewWithId(R.id.supplemental_icon))); 518e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertTrue(clicked[0]); 519e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 520e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 521e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing @Test 522439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing public void testSupplementalIconWithoutClickListenerIsNotClickable() { 523172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item0 = new TextListItem(mActivity); 524172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item0.setSupplementalIcon(android.R.drawable.sym_def_app_icon, true); 525172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 526172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing List<TextListItem> items = Arrays.asList(item0); 527439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing setupPagedListView(items); 528439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing 5294e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0); 530439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing assertFalse(viewHolder.getSupplementalIcon().isClickable()); 531439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing } 532439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing 533439968fcab76ed121a8c514ae904840cac9b2076Yao, Yuxing @Test 53422037e659c30185f51f522e1761236f780334c9dYao, Yuxing public void testCheckingSwitch() { 53522037e659c30185f51f522e1761236f780334c9dYao, Yuxing final boolean[] clicked = {false, false}; 536172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 537172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item0 = new TextListItem(mActivity); 538172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item0.setSwitch(false, false, (button, isChecked) -> { 539172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing // Initial value is false. 540172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing assertTrue(isChecked); 541172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing clicked[0] = true; 542172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing }); 543172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 544172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item1 = new TextListItem(mActivity); 545172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item1.setSwitch(true, false, (button, isChecked) -> { 546172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing // Initial value is true. 547172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing assertFalse(isChecked); 548172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing clicked[1] = true; 549172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing }); 550172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 551172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing List<TextListItem> items = Arrays.asList(item0, item1); 55222037e659c30185f51f522e1761236f780334c9dYao, Yuxing setupPagedListView(items); 55322037e659c30185f51f522e1761236f780334c9dYao, Yuxing 55422037e659c30185f51f522e1761236f780334c9dYao, Yuxing onView(withId(R.id.recycler_view)).perform( 55522037e659c30185f51f522e1761236f780334c9dYao, Yuxing actionOnItemAtPosition(0, clickChildViewWithId(R.id.switch_widget))); 55622037e659c30185f51f522e1761236f780334c9dYao, Yuxing assertTrue(clicked[0]); 55722037e659c30185f51f522e1761236f780334c9dYao, Yuxing 55822037e659c30185f51f522e1761236f780334c9dYao, Yuxing onView(withId(R.id.recycler_view)).perform( 55922037e659c30185f51f522e1761236f780334c9dYao, Yuxing actionOnItemAtPosition(1, clickChildViewWithId(R.id.switch_widget))); 56022037e659c30185f51f522e1761236f780334c9dYao, Yuxing assertTrue(clicked[1]); 56122037e659c30185f51f522e1761236f780334c9dYao, Yuxing } 56222037e659c30185f51f522e1761236f780334c9dYao, Yuxing 56322037e659c30185f51f522e1761236f780334c9dYao, Yuxing @Test 564e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing public void testClickingSupplementalAction() { 565e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing final boolean[] clicked = {false}; 566172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 567172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item0 = new TextListItem(mActivity); 568172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item0.setAction("action", true, v -> clicked[0] = true); 569172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 570172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing List<TextListItem> items = Arrays.asList(item0); 571e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing setupPagedListView(items); 572e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 573e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing onView(withId(R.id.recycler_view)).perform( 574e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing actionOnItemAtPosition(0, clickChildViewWithId(R.id.action1))); 575e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertTrue(clicked[0]); 576e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 577e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 578e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing @Test 579e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing public void testClickingBothSupplementalActions() { 580e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing final boolean[] clicked = {false, false}; 581172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 582172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item0 = new TextListItem(mActivity); 583172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item0.setActions("action 1", true, v -> clicked[0] = true, 584172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing "action 2", true, v -> clicked[1] = true); 585172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 586172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing List<TextListItem> items = Arrays.asList(item0); 587e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing setupPagedListView(items); 588e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 589e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing onView(withId(R.id.recycler_view)).perform( 590e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing actionOnItemAtPosition(0, clickChildViewWithId(R.id.action1))); 591e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertTrue(clicked[0]); 592e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertFalse(clicked[1]); 593e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 594e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing onView(withId(R.id.recycler_view)).perform( 595e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing actionOnItemAtPosition(0, clickChildViewWithId(R.id.action2))); 596e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertTrue(clicked[1]); 597e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 598e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 599e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing @Test 600172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing public void testCustomViewBinderBindsLast() { 601e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing final String updatedTitle = "updated title"; 602172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 603172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item0 = new TextListItem(mActivity); 604172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item0.setTitle("original title"); 605172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item0.addViewBinder((viewHolder) -> viewHolder.getTitle().setText(updatedTitle)); 606172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 607172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing List<TextListItem> items = Arrays.asList(item0); 608e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing setupPagedListView(items); 609e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 6104e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0); 611e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertThat(viewHolder.getTitle().getText(), is(equalTo(updatedTitle))); 612e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 613e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 614e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing @Test 615e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing public void testCustomViewBinderOnUnusedViewsHasNoEffect() { 616172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item0 = new TextListItem(mActivity); 617172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item0.addViewBinder((viewHolder) -> viewHolder.getBody().setText("text")); 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.getBody().getVisibility(), is(equalTo(View.GONE))); 624e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing // Custom binder interacts with body but has no effect. 625e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing // Expect card height to remain single line. 626e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertThat((double) viewHolder.itemView.getHeight(), is(closeTo( 627e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing InstrumentationRegistry.getContext().getResources().getDimension( 628e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing R.dimen.car_single_line_list_item_height), 1.0d))); 629e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 630e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 631e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing @Test 63220e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing public void testRevertingViewBinder() throws Throwable { 63320e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing TextListItem item0 = new TextListItem(mActivity); 63420e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing item0.setBody("one item"); 63520e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing item0.addViewBinder( 63620e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing (viewHolder) -> viewHolder.getBody().setEllipsize(TextUtils.TruncateAt.END), 63720e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing (viewHolder -> viewHolder.getBody().setEllipsize(null))); 63820e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing 63920e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing List<TextListItem> items = Arrays.asList(item0); 64020e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing setupPagedListView(items); 64120e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing 64220e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0); 64320e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing 64420e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing // Bind view holder to a new item - the customization made by item0 should be reverted. 64520e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing TextListItem item1 = new TextListItem(mActivity); 64620e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing item1.setBody("new item"); 64720e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing mActivityRule.runOnUiThread(() -> item1.bind(viewHolder)); 64820e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing 64920e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing assertThat(viewHolder.getBody().getEllipsize(), is(equalTo(null))); 65020e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing } 65120e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing 65220e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing @Test 65320e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing public void testRemovingViewBinder() { 65420e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing TextListItem item0 = new TextListItem(mActivity); 65520e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing item0.setBody("one item"); 65620e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing ListItem.ViewBinder<TextListItem.ViewHolder> binder = 65720e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing (viewHolder) -> viewHolder.getTitle().setEllipsize(TextUtils.TruncateAt.END); 65820e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing item0.addViewBinder(binder); 65920e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing 66020e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing assertTrue(item0.removeViewBinder(binder)); 66120e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing 66220e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing List<TextListItem> items = Arrays.asList(item0); 66320e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing setupPagedListView(items); 66420e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing 66520e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing assertThat(getViewHolderAtPosition(0).getBody().getEllipsize(), is(equalTo(null))); 66620e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing } 66720e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing 66820e9f85df9325d7dc79750be2527bd8dd1c38fcbYao, Yuxing @Test 669e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing public void testSettingTitleOrBodyAsPrimaryText() { 670e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing // Create 2 items, one with Title as primary (default) and one with Body. 671e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing // The primary text, regardless of view, should have consistent look (as primary). 672172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item0 = new TextListItem(mActivity); 673172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item0.setTitle("title"); 674172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item0.setBody("body"); 675172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 676172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item1 = new TextListItem(mActivity); 677172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item1.setTitle("title"); 678172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item1.setBody("body", true); 679172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 680172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing List<TextListItem> items = Arrays.asList(item0, item1); 681e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing setupPagedListView(items); 682e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 6834e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing TextListItem.ViewHolder titlePrimary = getViewHolderAtPosition(0); 6844e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing TextListItem.ViewHolder bodyPrimary = getViewHolderAtPosition(1); 685e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertThat(titlePrimary.getTitle().getTextSize(), 686e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing is(equalTo(bodyPrimary.getBody().getTextSize()))); 687e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing assertThat(titlePrimary.getTitle().getTextColors(), 688e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing is(equalTo(bodyPrimary.getBody().getTextColors()))); 689e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 690e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 691a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing @Test 692a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing public void testNoCarriedOverLayoutParamsForTextView() throws Throwable { 693172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem singleLine = new TextListItem(mActivity); 694172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing singleLine.setTitle("title"); 695172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 696a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing setupPagedListView(Arrays.asList(singleLine)); 697a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing 698a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing // Manually rebind the view holder of a single line item to a double line item. 699172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem doubleLine = new TextListItem(mActivity); 700172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing doubleLine.setTitle("title"); 701172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing doubleLine.setBody("body"); 7024e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0); 703a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing mActivityRule.runOnUiThread(() -> doubleLine.bind(viewHolder)); 704a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing 705a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing RelativeLayout.LayoutParams titleLayoutParams = 706a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing (RelativeLayout.LayoutParams) viewHolder.getTitle().getLayoutParams(); 707a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing RelativeLayout.LayoutParams bodyLayoutParams = 708a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing (RelativeLayout.LayoutParams) viewHolder.getTitle().getLayoutParams(); 709a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing assertThat(titleLayoutParams.getRule(RelativeLayout.CENTER_VERTICAL), is(equalTo(0))); 710a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing assertThat(bodyLayoutParams.getRule(RelativeLayout.CENTER_VERTICAL), is(equalTo(0))); 711a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing } 712a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing 713a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing @Test 714a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing public void testNoCarriedOverLayoutParamsForPrimaryIcon() throws Throwable { 715172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem smallIcon = new TextListItem(mActivity); 716172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing smallIcon.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon, false); 717172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing smallIcon.setBody("body"); // Small icon of items with body text should use top margin. 718a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing setupPagedListView(Arrays.asList(smallIcon)); 719a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing 720a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing // Manually rebind the view holder. 721172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem largeIcon = new TextListItem(mActivity); 722172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing largeIcon.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon, true); 7234e832ea4269fff1780e0726c16bc37584957ba10Yao, Yuxing TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0); 724a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing mActivityRule.runOnUiThread(() -> largeIcon.bind(viewHolder)); 725a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing 726a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing RelativeLayout.LayoutParams iconLayoutParams = 727a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing (RelativeLayout.LayoutParams) viewHolder.getPrimaryIcon().getLayoutParams(); 728a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing assertThat(iconLayoutParams.getRule(RelativeLayout.CENTER_VERTICAL), 729a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing is(equalTo(RelativeLayout.TRUE))); 730a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing assertThat(iconLayoutParams.topMargin, is(equalTo(0))); 731a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing } 732a565726ba2ad8cba4d28e206495dafc1d4eebdd5Yao, Yuxing 733172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing @Test 73401d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing public void testNoCarriedOverOnClickListener() throws Throwable { 73501d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing boolean[] clicked = new boolean[] {false}; 73601d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing TextListItem item0 = new TextListItem(mActivity); 73701d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing item0.setOnClickListener(v -> clicked[0] = true); 73801d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing 73901d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing setupPagedListView(Arrays.asList(item0)); 74001d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing 74101d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing onView(withId(R.id.recycler_view)).perform(actionOnItemAtPosition(0, click())); 74201d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing assertTrue(clicked[0]); 74301d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing 74401d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing // item1 does not have onClickListener. 74501d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing TextListItem item1 = new TextListItem(mActivity); 74601d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0); 74701d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing // Manually rebind the view holder. 74801d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing mActivityRule.runOnUiThread(() -> item1.bind(viewHolder)); 74901d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing 75001d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing // Reset for testing. 75101d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing clicked[0] = false; 75201d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing onView(withId(R.id.recycler_view)).perform(actionOnItemAtPosition(0, click())); 75301d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing assertFalse(clicked[0]); 75401d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing } 75501d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing 75601d01f75491903e13913da5ac050ee86b31dc464Yao, Yuxing @Test 7572524380fff7e003a2949947561f5ac2fa9591391Yao, Yuxing public void testUpdateItem() { 758172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item = new TextListItem(mActivity); 759172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing setupPagedListView(Arrays.asList(item)); 760172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 761172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing String title = "updated title"; 762172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item.setTitle(title); 763172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 7643737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing refreshUi(); 765172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 766172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0); 767172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing assertThat(viewHolder.getTitle().getText(), is(equalTo(title))); 768172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing } 769172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 7703737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing @Test 7712524380fff7e003a2949947561f5ac2fa9591391Yao, Yuxing public void testUxRestrictionsChange() { 7723737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing String longText = mActivity.getString(R.string.over_uxr_text_length_limit); 7733737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing TextListItem item = new TextListItem(mActivity); 7743737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing item.setBody(longText); 7753737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing 7763737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing setupPagedListView(Arrays.asList(item)); 7773737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing 7783737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0); 7793737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing // Default behavior without UXR is unrestricted. 7803737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing assertThat(viewHolder.getBody().getText(), is(equalTo(longText))); 7813737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing 7823737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing viewHolder.complyWithUxRestrictions(CarUxRestrictionsTestUtils.getFullyRestricted()); 7833737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing refreshUi(); 7843737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing 7853737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing // Verify that the body text length is limited. 7863737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing assertThat(viewHolder.getBody().getText().length(), is(lessThan(longText.length()))); 7873737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing } 7883737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing 7893737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing @Test 7903737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing public void testUxRestrictionsChangesDoNotAlterExistingInputFilters() { 7913737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing InputFilter filter = new InputFilter.AllCaps(Locale.US); 7923737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing String bodyText = "bodytext"; 7933737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing TextListItem item = new TextListItem(mActivity); 7943737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing item.setBody(bodyText); 7953737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing item.addViewBinder(vh -> vh.getBody().setFilters(new InputFilter[] {filter})); 7963737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing 7973737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing setupPagedListView(Arrays.asList(item)); 7983737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing 7993737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing TextListItem.ViewHolder viewHolder = getViewHolderAtPosition(0); 8003737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing 8013737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing // Toggle UX restrictions between fully restricted and unrestricted should not affect 8023737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing // existing filters. 8033737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing viewHolder.complyWithUxRestrictions(CarUxRestrictionsTestUtils.getFullyRestricted()); 8043737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing refreshUi(); 8053737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing assertTrue(Arrays.asList(viewHolder.getBody().getFilters()).contains(filter)); 8063737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing 80732a32d76550734f2c35f5db5b53890d8a2589281Yao, Yuxing viewHolder.complyWithUxRestrictions(CarUxRestrictionsTestUtils.getBaseline()); 8083737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing refreshUi(); 8093737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing assertTrue(Arrays.asList(viewHolder.getBody().getFilters()).contains(filter)); 8103737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing } 8113737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing 812e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing private static ViewAction clickChildViewWithId(final int id) { 813e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing return new ViewAction() { 814e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing @Override 815e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing public Matcher<View> getConstraints() { 816e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing return null; 817e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 818e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 819e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing @Override 820e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing public String getDescription() { 821e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing return "Click on a child view with specific id."; 822e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 823e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing 824e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing @Override 825e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing public void perform(UiController uiController, View view) { 826e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing View v = view.findViewById(id); 827e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing v.performClick(); 828e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 829e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing }; 830e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing } 831e048d0d3137fbee6430d3481aaa7269d221a7d45Yao, Yuxing} 832