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