SwipeDismissFrameLayoutTest.java revision 0bb1bb33c39fa5eef545f8513753a8e3b8dfede7
10bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska/*
20bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska * Copyright (C) 2017 The Android Open Source Project
30bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska *
40bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska * Licensed under the Apache License, Version 2.0 (the "License");
50bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska * you may not use this file except in compliance with the License.
60bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska * You may obtain a copy of the License at
70bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska *
80bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska *      http://www.apache.org/licenses/LICENSE-2.0
90bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska *
100bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska * Unless required by applicable law or agreed to in writing, software
110bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska * distributed under the License is distributed on an "AS IS" BASIS,
120bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska * See the License for the specific language governing permissions and
140bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska * limitations under the License.
150bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska */
160bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
170bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurskapackage android.support.wearable.view;
180bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
190bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurskaimport static android.support.test.espresso.Espresso.onView;
200bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurskaimport static android.support.test.espresso.action.ViewActions.swipeRight;
210bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurskaimport static android.support.test.espresso.matcher.ViewMatchers.withEffectiveVisibility;
220bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurskaimport static android.support.test.espresso.matcher.ViewMatchers.withId;
230bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurskaimport static android.support.wearable.view.util.AsyncViewActions.waitForMatchingView;
240bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurskaimport static android.support.wearable.view.util.MoreViewAssertions.withTranslationX;
250bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
260bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurskaimport static org.hamcrest.Matchers.allOf;
270bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurskaimport static org.junit.Assert.assertFalse;
280bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurskaimport static org.junit.Assert.assertTrue;
290bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
300bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurskaimport android.app.Activity;
310bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurskaimport android.content.Intent;
320bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurskaimport android.support.annotation.IdRes;
330bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurskaimport android.support.test.InstrumentationRegistry;
340bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurskaimport android.support.test.espresso.ViewAction;
350bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurskaimport android.support.test.espresso.action.GeneralLocation;
360bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurskaimport android.support.test.espresso.action.GeneralSwipeAction;
370bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurskaimport android.support.test.espresso.action.Press;
380bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurskaimport android.support.test.espresso.action.Swipe;
390bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurskaimport android.support.test.espresso.matcher.ViewMatchers;
400bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurskaimport android.support.test.filters.SmallTest;
410bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurskaimport android.support.test.rule.ActivityTestRule;
420bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurskaimport android.support.test.runner.AndroidJUnit4;
430bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurskaimport android.support.wearable.test.R;
440bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurskaimport android.support.wearable.view.util.WakeLockRule;
450bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurskaimport android.view.View;
460bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
470bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurskaimport org.junit.Rule;
480bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurskaimport org.junit.Test;
490bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurskaimport org.junit.runner.RunWith;
500bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
510bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska@RunWith(AndroidJUnit4.class)
520bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurskapublic class SwipeDismissFrameLayoutTest {
530bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
540bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    private static final long MAX_WAIT_TIME = 4000; //ms
550bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    private final SwipeDismissFrameLayout.Callback mDismissCallback = new DismissCallback();
560bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
570bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    @Rule
580bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    public final WakeLockRule wakeLock = new WakeLockRule();
590bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
600bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    @Rule
610bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    public final ActivityTestRule<SwipeDismissFrameLayoutTestActivity> activityRule =
620bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska            new ActivityTestRule<>(
630bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                    SwipeDismissFrameLayoutTestActivity.class,
640bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                    true, /** initial touch mode */
650bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                    false /** launchActivity */
660bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska            );
670bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
680bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    private int mLayoutWidth;
690bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
700bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    @Test
710bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    @SmallTest
720bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    public void testCanScrollHorizontally() {
730bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // GIVEN a freshly setup SwipeDismissFrameLayout
740bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        setUpSimpleLayout();
750bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        Activity activity = activityRule.getActivity();
760bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        SwipeDismissFrameLayout testLayout =
770bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                (SwipeDismissFrameLayout) activity.findViewById(R.id.swipe_dismiss_root);
780bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // WHEN we check that the layout is horizontally scrollable from left to right.
790bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // THEN the layout is found to be horizontally swipeable from left to right.
800bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        assertTrue(testLayout.canScrollHorizontally(-20));
810bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // AND the layout is found to NOT be horizontally swipeable from right to left.
820bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        assertFalse(testLayout.canScrollHorizontally(20));
830bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
840bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // WHEN we switch off the swipe-to-dismiss functionality for the layout
850bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        testLayout.setSwipeable(false);
860bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // THEN the layout is found NOT to be horizontally swipeable from left to right.
870bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        assertFalse(testLayout.canScrollHorizontally(-20));
880bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // AND the layout is found to NOT be horizontally swipeable from right to left.
890bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        assertFalse(testLayout.canScrollHorizontally(20));
900bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    }
910bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
920bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    @Test
930bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    @SmallTest
940bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    public void canScrollHorizontallyShouldBeFalseWhenInvisible() {
950bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // GIVEN a freshly setup SwipeDismissFrameLayout
960bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        setUpSimpleLayout();
970bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        Activity activity = activityRule.getActivity();
980bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        final SwipeDismissFrameLayout testLayout =
990bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                (SwipeDismissFrameLayout) activity.findViewById(R.id.swipe_dismiss_root);
1000bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // GIVEN the layout is invisible
1010bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // Note: We have to run this on the main thread, because of thread checks in View.java.
1020bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
1030bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska            @Override
1040bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska            public void run() {
1050bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                testLayout.setVisibility(View.INVISIBLE);
1060bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska            }
1070bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        });
1080bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // WHEN we check that the layout is horizontally scrollable
1090bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // THEN the layout is found to be NOT horizontally swipeable from left to right.
1100bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        assertFalse(testLayout.canScrollHorizontally(-20));
1110bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // AND the layout is found to NOT be horizontally swipeable from right to left.
1120bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        assertFalse(testLayout.canScrollHorizontally(20));
1130bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    }
1140bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
1150bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    @Test
1160bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    @SmallTest
1170bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    public void canScrollHorizontallyShouldBeFalseWhenGone() {
1180bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // GIVEN a freshly setup SwipeDismissFrameLayout
1190bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        setUpSimpleLayout();
1200bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        Activity activity = activityRule.getActivity();
1210bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        final SwipeDismissFrameLayout testLayout =
1220bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                (SwipeDismissFrameLayout) activity.findViewById(R.id.swipe_dismiss_root);
1230bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // GIVEN the layout is gone
1240bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // Note: We have to run this on the main thread, because of thread checks in View.java.
1250bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
1260bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska            @Override
1270bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska            public void run() {
1280bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                testLayout.setVisibility(View.GONE);
1290bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska            }
1300bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        });
1310bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // WHEN we check that the layout is horizontally scrollable
1320bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // THEN the layout is found to be NOT horizontally swipeable from left to right.
1330bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        assertFalse(testLayout.canScrollHorizontally(-20));
1340bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // AND the layout is found to NOT be horizontally swipeable from right to left.
1350bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        assertFalse(testLayout.canScrollHorizontally(20));
1360bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    }
1370bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
1380bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    @Test
1390bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    @SmallTest
1400bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    public void testSwipeDismissEnabledByDefault() {
1410bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // GIVEN a freshly setup SwipeDismissFrameLayout
1420bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        setUpSimpleLayout();
1430bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        Activity activity = activityRule.getActivity();
1440bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        SwipeDismissFrameLayout testLayout =
1450bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                (SwipeDismissFrameLayout) activity.findViewById(R.id.swipe_dismiss_root);
1460bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // WHEN we check that the layout is dismissible
1470bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // THEN the layout is find to be dismissible
1480bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        assertTrue(testLayout.isSwipeable());
1490bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    }
1500bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
1510bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    @Test
1520bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    @SmallTest
1530bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    public void testSwipeDismissesViewIfEnabled() {
1540bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // GIVEN a freshly setup SwipeDismissFrameLayout
1550bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        setUpSimpleLayout();
1560bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // WHEN we perform a swipe to dismiss
1570bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        onView(withId(R.id.swipe_dismiss_root)).perform(swipeRight());
1580bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // THEN the layout is dismissed
1590bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        assertDismissed(R.id.swipe_dismiss_root);
1600bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        assertHidden(R.id.swipe_dismiss_root);
1610bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    }
1620bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
1630bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    @Test
1640bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    @SmallTest
1650bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    public void testSwipeDoesNotDismissViewIfDisabled() {
1660bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // GIVEN a freshly setup SwipeDismissFrameLayout with dismiss turned off.
1670bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        setUpSimpleLayout();
1680bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        Activity activity = activityRule.getActivity();
1690bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        SwipeDismissFrameLayout testLayout =
1700bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                (SwipeDismissFrameLayout) activity.findViewById(R.id.swipe_dismiss_root);
1710bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        testLayout.setSwipeable(false);
1720bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // WHEN we perform a swipe to dismiss
1730bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        onView(withId(R.id.swipe_dismiss_root)).perform(swipeRight());
1740bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // THEN the layout is not dismissed and not hidden
1750bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        assertNotHidden(R.id.swipe_dismiss_root);
1760bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    }
1770bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
1780bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    @Test
1790bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    @SmallTest
1800bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    public void testAddRemoveCallback() {
1810bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // GIVEN a freshly setup SwipeDismissFrameLayout
1820bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        setUpSimpleLayout();
1830bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        Activity activity = activityRule.getActivity();
1840bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        SwipeDismissFrameLayout testLayout =
1850bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                (SwipeDismissFrameLayout) activity.findViewById(R.id.swipe_dismiss_root);
1860bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // WHEN we remove the swipe callback
1870bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        testLayout.removeCallback(mDismissCallback);
1880bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        onView(withId(R.id.swipe_dismiss_root)).perform(swipeRight());
1890bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // THEN the layout is dismissed, but no hidden
1900bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        assertDismissed(R.id.swipe_dismiss_root);
1910bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        assertNotHidden(R.id.swipe_dismiss_root);
1920bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    }
1930bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
1940bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    @Test
1950bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    @SmallTest
1960bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    public void testSwipeDoesNotDismissViewIfScrollable() {
1970bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // GIVEN a freshly setup SwipeDismissFrameLayout with dismiss turned off.
1980bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        setUpSwipeDismissWithRecyclerView();
1990bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // WHEN we perform a swipe to dismiss from the center of the screen.
2000bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        onView(withId(R.id.swipe_dismiss_root)).perform(swipeRightFromCenter());
2010bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // THEN the layout is not dismissed and not hidden
2020bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        assertNotHidden(R.id.swipe_dismiss_root);
2030bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    }
2040bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
2050bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    @Test
2060bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    @SmallTest
2070bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    public void testEdgeSwipeDoesDismissViewIfScrollable() {
2080bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // GIVEN a freshly setup SwipeDismissFrameLayout with dismiss turned off.
2090bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        setUpSwipeDismissWithRecyclerView();
2100bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // WHEN we perform a swipe to dismiss from the left edge of the screen.
2110bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        onView(withId(R.id.swipe_dismiss_root)).perform(swipeRightFromLeftEdge());
2120bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // THEN the layout is dismissed and hidden
2130bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        assertHidden(R.id.swipe_dismiss_root);
2140bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        assertDismissed(R.id.swipe_dismiss_root);
2150bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    }
2160bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
2170bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    @Test
2180bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    @SmallTest
2190bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    public void testSwipeDoesNotDismissViewIfStartsInWrongPosition() {
2200bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // GIVEN a freshly setup SwipeDismissFrameLayout with dismiss turned on, but only for an
2210bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska      // inner
2220bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // circle.
2230bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        setUpSwipeableRegion();
2240bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // WHEN we perform a swipe to dismiss from the left edge of the screen.
2250bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        onView(withId(R.id.swipe_dismiss_root)).perform(swipeRightFromLeftEdge());
2260bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // THEN the layout is not dismissed and not hidden
2270bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        assertNotHidden(R.id.swipe_dismiss_root);
2280bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    }
2290bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
2300bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    @Test
2310bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    @SmallTest
2320bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    public void testSwipeDoesDismissViewIfStartsInRightPosition() {
2330bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // GIVEN a freshly setup SwipeDismissFrameLayout with dismiss turned on, but only for an
2340bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska      // inner
2350bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // circle.
2360bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        setUpSwipeableRegion();
2370bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // WHEN we perform a swipe to dismiss from the center of the screen.
2380bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        onView(withId(R.id.swipe_dismiss_root)).perform(swipeRightFromCenter());
2390bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // THEN the layout is dismissed and hidden
2400bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        assertHidden(R.id.swipe_dismiss_root);
2410bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        assertDismissed(R.id.swipe_dismiss_root);
2420bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    }
2430bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
2440bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    /**
2450bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska     @Test public void testSwipeInPreferenceFragmentAndNavDrawer() {
2460bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska     // GIVEN a freshly setup SwipeDismissFrameLayout with dismiss turned on, but only for an inner
2470bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska     // circle.
2480bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska     setUpPreferenceFragmentAndNavDrawer();
2490bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska     // WHEN we perform a swipe to dismiss from the center of the screen to the bottom.
2500bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska     onView(withId(R.id.drawer_layout)).perform(swipeBottomFromCenter());
2510bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska     // THEN the navigation drawer is shown.
2520bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska     assertPeeking(R.id.top_drawer);
2530bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska     }*/
2540bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
2550bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    /**
2560bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska     * Set ups the simplest possible layout for test cases - a {@link SwipeDismissFrameLayout} with
2570bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska     * a single static child.
2580bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska     */
2590bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    private void setUpSimpleLayout() {
2600bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        activityRule.launchActivity(
2610bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                new Intent()
2620bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                        .putExtra(
2630bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                                LayoutTestActivity.EXTRA_LAYOUT_RESOURCE_ID,
2640bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                                R.layout.swipe_dismiss_layout_testcase_1));
2650bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        setDismissCallback();
2660bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    }
2670bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
2680bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    /**
2690bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska     * Sets up a slightly more involved layout for testing swipe-to-dismiss with scrollable
2700bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska     * containers. This layout contains a {@link SwipeDismissFrameLayout} with a
2710bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska     * {@link android.support.v7.widget.RecyclerView} as a child, ready to accept an adapter.
2720bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska     */
2730bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    private void setUpSwipeDismissWithRecyclerView() {
2740bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        activityRule.launchActivity(
2750bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                new Intent()
2760bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                        .putExtra(
2770bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                                LayoutTestActivity.EXTRA_LAYOUT_RESOURCE_ID,
2780bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                                R.layout.swipe_dismiss_layout_testcase_2));
2790bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        setDismissCallback();
2800bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    }
2810bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
2820bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    /**
2830bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska     * Sets up a {@link SwipeDismissFrameLayout} in which only a certain region is allowed to react
2840bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska     * to swipe-dismiss gestures.
2850bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska     */
2860bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    private void setUpSwipeableRegion() {
2870bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        activityRule.launchActivity(
2880bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                new Intent()
2890bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                        .putExtra(
2900bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                                LayoutTestActivity.EXTRA_LAYOUT_RESOURCE_ID,
2910bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                                R.layout.swipe_dismiss_layout_testcase_1));
2920bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        setCallback(
2930bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                new DismissCallback() {
2940bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                    @Override
2950bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                    public boolean onPreSwipeStart(float x, float y) {
2960bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                        float normalizedX = x - mLayoutWidth / 2;
2970bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                        float normalizedY = y - mLayoutWidth / 2;
2980bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                        float squareX = normalizedX * normalizedX;
2990bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                        float squareY = normalizedY * normalizedY;
3000bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                        // 30 is an arbitrary number limiting the circle.
3010bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                        return Math.sqrt(squareX + squareY) < (mLayoutWidth / 2 - 30);
3020bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                    }
3030bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                });
3040bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    }
3050bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
3060bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    /**
3070bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska     * Sets up a more involved test case where the layout consists of a
3080bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska     * {@link WearableNavigationDrawer} and a
3090bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska     * {@link android.support.wearable.internal.view.SwipeDismissPreferenceFragment}
3100bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska     */
3110bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska  /*
3120bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska  private void setUpPreferenceFragmentAndNavDrawer() {
3130bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    activityRule.launchActivity(
3140bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska      new Intent()
3150bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska          .putExtra(
3160bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska              LayoutTestActivity.EXTRA_LAYOUT_RESOURCE_ID,
3170bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska              R.layout.swipe_dismiss_layout_testcase_3));
3180bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    Activity activity = activityRule.getActivity();
3190bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    InstrumentationRegistry.getInstrumentation().runOnMainSync(() -> {
3200bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska      WearableNavigationDrawer wearableNavigationDrawer =
3210bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska              (WearableNavigationDrawer) activity.findViewById(R.id.top_drawer);
3220bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska      wearableNavigationDrawer.setAdapter(
3230bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska              new WearableNavigationDrawer.WearableNavigationDrawerAdapter() {
3240bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                @Override
3250bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                public String getItemText(int pos) {
3260bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                  return "test";
3270bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                }
3280bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
3290bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                @Override
3300bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                public Drawable getItemDrawable(int pos) {
3310bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                  return null;
3320bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                }
3330bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
3340bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                @Override
3350bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                public void onItemSelected(int pos) {
3360bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                  return;
3370bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                }
3380bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
3390bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                @Override
3400bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                public int getCount() {
3410bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                  return 3;
3420bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                }
3430bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska              });
3440bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    });
3450bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska  }*/
3460bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    private void setDismissCallback() {
3470bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        setCallback(mDismissCallback);
3480bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    }
3490bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
3500bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    private void setCallback(SwipeDismissFrameLayout.Callback callback) {
3510bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        Activity activity = activityRule.getActivity();
3520bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        SwipeDismissFrameLayout testLayout =
3530bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                (SwipeDismissFrameLayout) activity.findViewById(R.id.swipe_dismiss_root);
3540bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        mLayoutWidth = testLayout.getWidth();
3550bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        testLayout.addCallback(callback);
3560bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    }
3570bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
3580bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    private void assertDismissed(@IdRes int layoutId) {
3590bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        onView(withId(layoutId))
3600bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                .perform(
3610bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                        waitForMatchingView(
3620bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                                allOf(withId(layoutId), withTranslationX(mLayoutWidth)),
3630bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                                MAX_WAIT_TIME));
3640bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    }
3650bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
3660bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    /**
3670bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska     * private void assertPeeking(@IdRes int layoutId) {
3680bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska     * onView(withId(layoutId))
3690bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska     * .perform(
3700bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska     * waitForMatchingView(
3710bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska     * allOf(withId(layoutId), isOpened(true)), MAX_WAIT_TIME));
3720bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska     * }
3730bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska     */
3740bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
3750bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    private void assertHidden(@IdRes int layoutId) {
3760bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        onView(withId(layoutId))
3770bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                .perform(
3780bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                        waitForMatchingView(
3790bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                                allOf(withId(layoutId),
3800bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                                        withEffectiveVisibility(ViewMatchers.Visibility.GONE)),
3810bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                                MAX_WAIT_TIME));
3820bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    }
3830bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
3840bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    private void assertNotHidden(@IdRes int layoutId) {
3850bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        onView(withId(layoutId))
3860bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                .perform(
3870bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                        waitForMatchingView(
3880bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                                allOf(withId(layoutId),
3890bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                                        withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE)),
3900bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                                MAX_WAIT_TIME));
3910bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    }
3920bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
3930bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    private static ViewAction swipeRightFromCenter() {
3940bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        return new GeneralSwipeAction(
3950bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                Swipe.SLOW, GeneralLocation.CENTER, GeneralLocation.CENTER_RIGHT, Press.FINGER);
3960bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    }
3970bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
3980bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    private static ViewAction swipeRightFromLeftEdge() {
3990bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        return new GeneralSwipeAction(
4000bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                Swipe.SLOW, GeneralLocation.CENTER_LEFT, GeneralLocation.CENTER_RIGHT,
4010bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                Press.FINGER);
4020bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    }
4030bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
4040bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    private static ViewAction swipeBottomFromCenter() {
4050bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        return new GeneralSwipeAction(
4060bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                Swipe.SLOW, GeneralLocation.TOP_CENTER, GeneralLocation.BOTTOM_CENTER,
4070bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                Press.FINGER);
4080bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    }
4090bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
4100bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
4110bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    /** Helper class hiding the view after a successful swipe-to-dismiss. */
4120bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    private static class DismissCallback extends SwipeDismissFrameLayout.Callback {
4130bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
4140bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        @Override
4150bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        public void onDismissed(SwipeDismissFrameLayout layout) {
4160bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska            layout.setVisibility(View.GONE);
4170bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        }
4180bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    }
4190bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska}
420