15504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska/* 25504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska * Copyright (C) 2017 The Android Open Source Project 35504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska * 45504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska * Licensed under the Apache License, Version 2.0 (the "License"); 55504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska * you may not use this file except in compliance with the License. 65504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska * You may obtain a copy of the License at 75504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska * 85504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska * http://www.apache.org/licenses/LICENSE-2.0 95504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska * 105504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska * Unless required by applicable law or agreed to in writing, software 115504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska * distributed under the License is distributed on an "AS IS" BASIS, 125504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska * See the License for the specific language governing permissions and 145504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska * limitations under the License. 155504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska */ 165504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska 17ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikaspackage androidx.wear.widget; 185504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska 195504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurskaimport static android.support.test.espresso.Espresso.onView; 205504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurskaimport static android.support.test.espresso.matcher.ViewMatchers.withId; 21d75a466859fee504b717c529094e318d1278f831Aurimas Liutikas 22ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport static androidx.wear.widget.util.AsyncViewActions.waitForMatchingView; 23ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport static androidx.wear.widget.util.MoreViewAssertions.withNoVerticalScrollOffset; 24ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport static androidx.wear.widget.util.MoreViewAssertions.withPositiveVerticalScrollOffset; 255504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska 265504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurskaimport static org.hamcrest.Matchers.allOf; 27fa39e2bca1b284ad7c931d9194287770b7b507faAurimas Liutikasimport static org.junit.Assert.assertEquals; 28fa39e2bca1b284ad7c931d9194287770b7b507faAurimas Liutikasimport static org.junit.Assert.assertFalse; 29fa39e2bca1b284ad7c931d9194287770b7b507faAurimas Liutikasimport static org.junit.Assert.assertNotNull; 30fa39e2bca1b284ad7c931d9194287770b7b507faAurimas Liutikasimport static org.junit.Assert.assertTrue; 315504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska 325504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurskaimport android.app.Activity; 335504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurskaimport android.support.test.InstrumentationRegistry; 345504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurskaimport android.support.test.espresso.ViewAction; 355504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurskaimport android.support.test.espresso.action.GeneralLocation; 365504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurskaimport android.support.test.espresso.action.GeneralSwipeAction; 375504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurskaimport android.support.test.espresso.action.Press; 385504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurskaimport android.support.test.espresso.action.Swipe; 395504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurskaimport android.support.test.filters.MediumTest; 405504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurskaimport android.support.test.rule.ActivityTestRule; 415504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurskaimport android.support.test.runner.AndroidJUnit4; 42d75a466859fee504b717c529094e318d1278f831Aurimas Liutikasimport android.view.View; 43d75a466859fee504b717c529094e318d1278f831Aurimas Liutikas 44d75a466859fee504b717c529094e318d1278f831Aurimas Liutikasimport androidx.annotation.IdRes; 45ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport androidx.recyclerview.widget.RecyclerView; 46ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport androidx.wear.test.R; 47ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport androidx.wear.widget.util.WakeLockRule; 485504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska 495504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurskaimport org.junit.Before; 505504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurskaimport org.junit.Rule; 515504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurskaimport org.junit.Test; 525504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurskaimport org.junit.runner.RunWith; 535504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurskaimport org.mockito.Mock; 545504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurskaimport org.mockito.MockitoAnnotations; 555504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska 565504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska@MediumTest 575504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska@RunWith(AndroidJUnit4.class) 585504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurskapublic class WearableRecyclerViewTest { 595504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska 605504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska private static final long MAX_WAIT_TIME = 10000; 615504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska @Mock 6288e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska WearableRecyclerView.LayoutManager mMockChildLayoutManager; 635504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska 645504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska @Rule 655504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska public final WakeLockRule wakeLock = new WakeLockRule(); 665504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska 675504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska @Rule 685504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska public final ActivityTestRule<WearableRecyclerViewTestActivity> mActivityRule = 695504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska new ActivityTestRule<>(WearableRecyclerViewTestActivity.class, true, true); 705504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska 715504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska @Before 725504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska public void setUp() { 735504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska MockitoAnnotations.initMocks(this); 745504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska } 755504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska 765504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska @Test 775504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska public void testCaseInitState() { 785504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska WearableRecyclerView wrv = new WearableRecyclerView(mActivityRule.getActivity()); 7988e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska wrv.setLayoutManager(new WearableLinearLayoutManager(wrv.getContext())); 805504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska 81384f1eb2f7ab1de3c22824e7490884743b6eaa6eAga Madurska assertFalse(wrv.isEdgeItemsCenteringEnabled()); 825504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska assertFalse(wrv.isCircularScrollingGestureEnabled()); 83fa39e2bca1b284ad7c931d9194287770b7b507faAurimas Liutikas assertEquals(1.0f, wrv.getBezelFraction(), 0.01f); 84fa39e2bca1b284ad7c931d9194287770b7b507faAurimas Liutikas assertEquals(180.0f, wrv.getScrollDegreesPerScreen(), 0.01f); 855504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska } 865504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska 875504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska @Test 885504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska public void testEdgeItemsCenteringOnAndOff() throws Throwable { 895504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska mActivityRule.runOnUiThread(new Runnable() { 905504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska @Override 915504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska public void run() { 925504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska WearableRecyclerView wrv = 935504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska (WearableRecyclerView) mActivityRule.getActivity().findViewById(R.id.wrv); 945504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska wrv.setEdgeItemsCenteringEnabled(true); 955504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska } 965504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska }); 975504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska 985504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska InstrumentationRegistry.getInstrumentation().waitForIdleSync(); 995504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska 1005504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska mActivityRule.runOnUiThread(new Runnable() { 1015504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska @Override 1025504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska public void run() { 1035504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska WearableRecyclerView wrv = 1045504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska (WearableRecyclerView) mActivityRule.getActivity().findViewById(R.id.wrv); 1055504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska View child = wrv.getChildAt(0); 1065504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska assertNotNull("child", child); 1075504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska assertEquals((wrv.getHeight() - child.getHeight()) / 2, child.getTop()); 1085504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska } 1095504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska }); 1105504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska 1115504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska mActivityRule.runOnUiThread(new Runnable() { 1125504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska @Override 1135504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska public void run() { 1145504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska WearableRecyclerView wrv = 1155504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska (WearableRecyclerView) mActivityRule.getActivity().findViewById(R.id.wrv); 1165504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska wrv.setEdgeItemsCenteringEnabled(false); 1175504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska } 1185504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska }); 1195504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska 1205504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska InstrumentationRegistry.getInstrumentation().waitForIdleSync(); 1215504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska 1225504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska mActivityRule.runOnUiThread(new Runnable() { 1235504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska @Override 1245504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska public void run() { 1255504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska WearableRecyclerView wrv = 1265504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska (WearableRecyclerView) mActivityRule.getActivity().findViewById(R.id.wrv); 1275504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska View child = wrv.getChildAt(0); 1285504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska assertNotNull("child", child); 1295504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska assertEquals(0, child.getTop()); 1305504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska 1315504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska } 1325504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska }); 1335504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska } 1345504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska 1355504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska @Test 13624f3f30b387212965b3b9c43ea73f7ba70ef47aaAga Madurska public void testEdgeItemsCenteringBeforeChildrenDrawn() throws Throwable { 13724f3f30b387212965b3b9c43ea73f7ba70ef47aaAga Madurska mActivityRule.runOnUiThread(new Runnable() { 13824f3f30b387212965b3b9c43ea73f7ba70ef47aaAga Madurska @Override 13924f3f30b387212965b3b9c43ea73f7ba70ef47aaAga Madurska public void run() { 14024f3f30b387212965b3b9c43ea73f7ba70ef47aaAga Madurska Activity activity = mActivityRule.getActivity(); 14124f3f30b387212965b3b9c43ea73f7ba70ef47aaAga Madurska WearableRecyclerView wrv = (WearableRecyclerView) activity.findViewById(R.id.wrv); 14224f3f30b387212965b3b9c43ea73f7ba70ef47aaAga Madurska RecyclerView.Adapter<WearableRecyclerView.ViewHolder> adapter = wrv.getAdapter(); 14324f3f30b387212965b3b9c43ea73f7ba70ef47aaAga Madurska wrv.setAdapter(null); 14424f3f30b387212965b3b9c43ea73f7ba70ef47aaAga Madurska wrv.setEdgeItemsCenteringEnabled(true); 14524f3f30b387212965b3b9c43ea73f7ba70ef47aaAga Madurska wrv.setAdapter(adapter); 14624f3f30b387212965b3b9c43ea73f7ba70ef47aaAga Madurska } 14724f3f30b387212965b3b9c43ea73f7ba70ef47aaAga Madurska }); 14824f3f30b387212965b3b9c43ea73f7ba70ef47aaAga Madurska InstrumentationRegistry.getInstrumentation().waitForIdleSync(); 14924f3f30b387212965b3b9c43ea73f7ba70ef47aaAga Madurska 15024f3f30b387212965b3b9c43ea73f7ba70ef47aaAga Madurska mActivityRule.runOnUiThread(new Runnable() { 15124f3f30b387212965b3b9c43ea73f7ba70ef47aaAga Madurska @Override 15224f3f30b387212965b3b9c43ea73f7ba70ef47aaAga Madurska public void run() { 15324f3f30b387212965b3b9c43ea73f7ba70ef47aaAga Madurska WearableRecyclerView wrv = 15424f3f30b387212965b3b9c43ea73f7ba70ef47aaAga Madurska (WearableRecyclerView) mActivityRule.getActivity().findViewById(R.id.wrv); 15524f3f30b387212965b3b9c43ea73f7ba70ef47aaAga Madurska // Verify the first child 15624f3f30b387212965b3b9c43ea73f7ba70ef47aaAga Madurska View child = wrv.getChildAt(0); 15724f3f30b387212965b3b9c43ea73f7ba70ef47aaAga Madurska assertNotNull("child", child); 15824f3f30b387212965b3b9c43ea73f7ba70ef47aaAga Madurska assertEquals((wrv.getHeight() - child.getHeight()) / 2, child.getTop()); 15924f3f30b387212965b3b9c43ea73f7ba70ef47aaAga Madurska } 16024f3f30b387212965b3b9c43ea73f7ba70ef47aaAga Madurska }); 16124f3f30b387212965b3b9c43ea73f7ba70ef47aaAga Madurska } 16224f3f30b387212965b3b9c43ea73f7ba70ef47aaAga Madurska 16324f3f30b387212965b3b9c43ea73f7ba70ef47aaAga Madurska @Test 1645504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska public void testCircularScrollingGesture() throws Throwable { 1655504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska onView(withId(R.id.wrv)).perform(swipeDownFromTopRight()); 1665504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska assertNotScrolledY(R.id.wrv); 1675504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska 1685504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska mActivityRule.runOnUiThread(new Runnable() { 1695504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska @Override 1705504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska public void run() { 1715504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska WearableRecyclerView wrv = 1725504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska (WearableRecyclerView) mActivityRule.getActivity().findViewById(R.id.wrv); 1735504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska wrv.setCircularScrollingGestureEnabled(true); 1745504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska } 1755504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska }); 1765504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska 1775504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska onView(withId(R.id.wrv)).perform(swipeDownFromTopRight()); 1785504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska assertScrolledY(R.id.wrv); 1795504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska } 1805504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska 1815504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska @Test 1825504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska public void testCurvedOffsettingHelper() throws Throwable { 1835504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska mActivityRule.runOnUiThread(new Runnable() { 1845504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska @Override 1855504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska public void run() { 1865504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska WearableRecyclerView wrv = 1875504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska (WearableRecyclerView) mActivityRule.getActivity().findViewById(R.id.wrv); 18888e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska wrv.setLayoutManager(new WearableLinearLayoutManager(wrv.getContext())); 1895504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska } 1905504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska }); 1915504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska 1925504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska InstrumentationRegistry.getInstrumentation().waitForIdleSync(); 1935504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska 1945504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska onView(withId(R.id.wrv)).perform(swipeDownFromTopRight()); 1955504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska 1965504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska mActivityRule.runOnUiThread(new Runnable() { 1975504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska @Override 1985504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska public void run() { 1995504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska Activity activity = mActivityRule.getActivity(); 2005504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska WearableRecyclerView wrv = (WearableRecyclerView) activity.findViewById(R.id.wrv); 2015504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska if (activity.getResources().getConfiguration().isScreenRound()) { 2025504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska View child = wrv.getChildAt(0); 2035504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska assertTrue(child.getLeft() > 0); 2045504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska } else { 2055504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska for (int i = 0; i < wrv.getChildCount(); i++) { 2065504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska assertEquals(0, wrv.getChildAt(i).getLeft()); 2075504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska } 2085504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska } 2095504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska } 2105504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska }); 2115504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska } 2125504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska 2135504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska private static ViewAction swipeDownFromTopRight() { 2145504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska return new GeneralSwipeAction( 2155504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska Swipe.FAST, GeneralLocation.TOP_RIGHT, GeneralLocation.BOTTOM_RIGHT, 2165504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska Press.FINGER); 2175504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska } 2185504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska 2195504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska private void assertScrolledY(@IdRes int layoutId) { 2205504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska onView(withId(layoutId)).perform(waitForMatchingView( 2215504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska allOf(withId(layoutId), withPositiveVerticalScrollOffset()), MAX_WAIT_TIME)); 2225504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska } 2235504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska 2245504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska private void assertNotScrolledY(@IdRes int layoutId) { 2255504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska onView(withId(layoutId)).perform(waitForMatchingView( 2265504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska allOf(withId(layoutId), withNoVerticalScrollOffset()), MAX_WAIT_TIME)); 2275504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska } 2285504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska} 229