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
179b028c55b13889bf75b5dd43b5b0f4051834ae1dAga Madurskapackage android.support.wear.widget;
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;
239b028c55b13889bf75b5dd43b5b0f4051834ae1dAga Madurskaimport static android.support.wear.widget.util.AsyncViewActions.waitForMatchingView;
242a5560c99cc4e4dfce9514223ef253b9733a2943Aga Madurskaimport static android.support.wear.widget.util.MoreViewAssertions.withPositiveVerticalScrollOffset;
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;
32d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurskaimport android.graphics.RectF;
330bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurskaimport android.support.annotation.IdRes;
340bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurskaimport android.support.test.InstrumentationRegistry;
350bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurskaimport android.support.test.espresso.ViewAction;
360bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurskaimport android.support.test.espresso.action.GeneralLocation;
370bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurskaimport android.support.test.espresso.action.GeneralSwipeAction;
380bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurskaimport android.support.test.espresso.action.Press;
390bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurskaimport android.support.test.espresso.action.Swipe;
400bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurskaimport android.support.test.espresso.matcher.ViewMatchers;
410bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurskaimport android.support.test.filters.SmallTest;
420bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurskaimport android.support.test.rule.ActivityTestRule;
430bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurskaimport android.support.test.runner.AndroidJUnit4;
4437bc8b03d33de5c375c26d915fcb056a42c5abc2Aga Madurskaimport android.support.v7.widget.RecyclerView;
459b028c55b13889bf75b5dd43b5b0f4051834ae1dAga Madurskaimport android.support.wear.test.R;
469b028c55b13889bf75b5dd43b5b0f4051834ae1dAga Madurskaimport android.support.wear.widget.util.ArcSwipe;
479b028c55b13889bf75b5dd43b5b0f4051834ae1dAga Madurskaimport android.support.wear.widget.util.WakeLockRule;
480bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurskaimport android.view.View;
490bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
500bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurskaimport org.junit.Rule;
510bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurskaimport org.junit.Test;
520bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurskaimport org.junit.runner.RunWith;
530bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
540bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska@RunWith(AndroidJUnit4.class)
550bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurskapublic class SwipeDismissFrameLayoutTest {
560bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
570bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    private static final long MAX_WAIT_TIME = 4000; //ms
580bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    private final SwipeDismissFrameLayout.Callback mDismissCallback = new DismissCallback();
590bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
600bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    @Rule
610bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    public final WakeLockRule wakeLock = new WakeLockRule();
620bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
630bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    @Rule
640bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    public final ActivityTestRule<SwipeDismissFrameLayoutTestActivity> activityRule =
650bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska            new ActivityTestRule<>(
660bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                    SwipeDismissFrameLayoutTestActivity.class,
670bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                    true, /** initial touch mode */
680bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                    false /** launchActivity */
690bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska            );
700bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
710bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    private int mLayoutWidth;
72d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska    private int mLayoutHeight;
730bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
740bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    @Test
750bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    @SmallTest
760bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    public void testCanScrollHorizontally() {
770bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // GIVEN a freshly setup SwipeDismissFrameLayout
780bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        setUpSimpleLayout();
790bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        Activity activity = activityRule.getActivity();
800bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        SwipeDismissFrameLayout testLayout =
810bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                (SwipeDismissFrameLayout) activity.findViewById(R.id.swipe_dismiss_root);
820bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // WHEN we check that the layout is horizontally scrollable from left to right.
830bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // THEN the layout is found to be horizontally swipeable from left to right.
840bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        assertTrue(testLayout.canScrollHorizontally(-20));
850bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // AND the layout is found to NOT be horizontally swipeable from right to left.
860bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        assertFalse(testLayout.canScrollHorizontally(20));
870bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
880bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // WHEN we switch off the swipe-to-dismiss functionality for the layout
890bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        testLayout.setSwipeable(false);
900bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // THEN the layout is found NOT to be horizontally swipeable from left to right.
910bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        assertFalse(testLayout.canScrollHorizontally(-20));
920bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // AND the layout is found to NOT be horizontally swipeable from right to left.
930bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        assertFalse(testLayout.canScrollHorizontally(20));
940bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    }
950bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
960bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    @Test
970bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    @SmallTest
980bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    public void canScrollHorizontallyShouldBeFalseWhenInvisible() {
990bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // GIVEN a freshly setup SwipeDismissFrameLayout
1000bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        setUpSimpleLayout();
1010bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        Activity activity = activityRule.getActivity();
1022a5560c99cc4e4dfce9514223ef253b9733a2943Aga Madurska        final SwipeDismissFrameLayout testLayout = activity.findViewById(R.id.swipe_dismiss_root);
1030bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // GIVEN the layout is invisible
1040bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // Note: We have to run this on the main thread, because of thread checks in View.java.
1050bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
1060bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska            @Override
1070bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska            public void run() {
1080bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                testLayout.setVisibility(View.INVISIBLE);
1090bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska            }
1100bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        });
1110bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // WHEN we check that the layout is horizontally scrollable
1120bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // THEN the layout is found to be NOT horizontally swipeable from left to right.
1130bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        assertFalse(testLayout.canScrollHorizontally(-20));
1140bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // AND the layout is found to NOT be horizontally swipeable from right to left.
1150bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        assertFalse(testLayout.canScrollHorizontally(20));
1160bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    }
1170bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
1180bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    @Test
1190bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    @SmallTest
1200bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    public void canScrollHorizontallyShouldBeFalseWhenGone() {
1210bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // GIVEN a freshly setup SwipeDismissFrameLayout
1220bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        setUpSimpleLayout();
1230bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        Activity activity = activityRule.getActivity();
1240bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        final SwipeDismissFrameLayout testLayout =
1250bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                (SwipeDismissFrameLayout) activity.findViewById(R.id.swipe_dismiss_root);
1260bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // GIVEN the layout is gone
1270bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // Note: We have to run this on the main thread, because of thread checks in View.java.
1280bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
1290bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska            @Override
1300bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska            public void run() {
1310bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                testLayout.setVisibility(View.GONE);
1320bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska            }
1330bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        });
1340bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // WHEN we check that the layout is horizontally scrollable
1350bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // THEN the layout is found to be NOT horizontally swipeable from left to right.
1360bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        assertFalse(testLayout.canScrollHorizontally(-20));
1370bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // AND the layout is found to NOT be horizontally swipeable from right to left.
1380bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        assertFalse(testLayout.canScrollHorizontally(20));
1390bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    }
1400bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
1410bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    @Test
1420bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    @SmallTest
1430bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    public void testSwipeDismissEnabledByDefault() {
1440bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // GIVEN a freshly setup SwipeDismissFrameLayout
1450bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        setUpSimpleLayout();
1460bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        Activity activity = activityRule.getActivity();
1470bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        SwipeDismissFrameLayout testLayout =
1480bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                (SwipeDismissFrameLayout) activity.findViewById(R.id.swipe_dismiss_root);
1490bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // WHEN we check that the layout is dismissible
1500bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // THEN the layout is find to be dismissible
1510bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        assertTrue(testLayout.isSwipeable());
1520bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    }
1530bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
1540bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    @Test
1550bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    @SmallTest
1560bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    public void testSwipeDismissesViewIfEnabled() {
1570bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // GIVEN a freshly setup SwipeDismissFrameLayout
1580bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        setUpSimpleLayout();
1590bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // WHEN we perform a swipe to dismiss
1600bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        onView(withId(R.id.swipe_dismiss_root)).perform(swipeRight());
1612a5560c99cc4e4dfce9514223ef253b9733a2943Aga Madurska        // AND hidden
1620bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        assertHidden(R.id.swipe_dismiss_root);
1630bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    }
1640bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
1650bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    @Test
1660bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    @SmallTest
1670bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    public void testSwipeDoesNotDismissViewIfDisabled() {
1680bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // GIVEN a freshly setup SwipeDismissFrameLayout with dismiss turned off.
1690bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        setUpSimpleLayout();
1700bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        Activity activity = activityRule.getActivity();
1710bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        SwipeDismissFrameLayout testLayout =
1720bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                (SwipeDismissFrameLayout) activity.findViewById(R.id.swipe_dismiss_root);
1730bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        testLayout.setSwipeable(false);
1740bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // WHEN we perform a swipe to dismiss
1750bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        onView(withId(R.id.swipe_dismiss_root)).perform(swipeRight());
1762a5560c99cc4e4dfce9514223ef253b9733a2943Aga Madurska        // THEN the layout is not hidden
1770bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        assertNotHidden(R.id.swipe_dismiss_root);
1780bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    }
1790bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
1800bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    @Test
1810bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    @SmallTest
1820bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    public void testAddRemoveCallback() {
1830bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // GIVEN a freshly setup SwipeDismissFrameLayout
1840bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        setUpSimpleLayout();
1850bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        Activity activity = activityRule.getActivity();
1862a5560c99cc4e4dfce9514223ef253b9733a2943Aga Madurska        SwipeDismissFrameLayout testLayout = activity.findViewById(R.id.swipe_dismiss_root);
1870bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // WHEN we remove the swipe callback
1880bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        testLayout.removeCallback(mDismissCallback);
1890bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        onView(withId(R.id.swipe_dismiss_root)).perform(swipeRight());
1902a5560c99cc4e4dfce9514223ef253b9733a2943Aga Madurska        // THEN the layout is not hidden
1910bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        assertNotHidden(R.id.swipe_dismiss_root);
1920bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    }
1930bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
1940bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    @Test
1950bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    @SmallTest
19637bc8b03d33de5c375c26d915fcb056a42c5abc2Aga Madurska    public void testSwipeDoesNotDismissViewIfScrollable() throws Throwable {
1970bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // GIVEN a freshly setup SwipeDismissFrameLayout with dismiss turned off.
198d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska        setUpSwipeDismissWithHorizontalRecyclerView();
19937bc8b03d33de5c375c26d915fcb056a42c5abc2Aga Madurska        activityRule.runOnUiThread(new Runnable() {
20037bc8b03d33de5c375c26d915fcb056a42c5abc2Aga Madurska            @Override
20137bc8b03d33de5c375c26d915fcb056a42c5abc2Aga Madurska            public void run() {
20237bc8b03d33de5c375c26d915fcb056a42c5abc2Aga Madurska                Activity activity = activityRule.getActivity();
20337bc8b03d33de5c375c26d915fcb056a42c5abc2Aga Madurska                RecyclerView testLayout = activity.findViewById(R.id.recycler_container);
20437bc8b03d33de5c375c26d915fcb056a42c5abc2Aga Madurska                // Scroll to a position from which the child is scrollable.
20537bc8b03d33de5c375c26d915fcb056a42c5abc2Aga Madurska                testLayout.scrollToPosition(50);
20637bc8b03d33de5c375c26d915fcb056a42c5abc2Aga Madurska            }
20737bc8b03d33de5c375c26d915fcb056a42c5abc2Aga Madurska        });
20837bc8b03d33de5c375c26d915fcb056a42c5abc2Aga Madurska
20937bc8b03d33de5c375c26d915fcb056a42c5abc2Aga Madurska        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
2100bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // WHEN we perform a swipe to dismiss from the center of the screen.
2110bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        onView(withId(R.id.swipe_dismiss_root)).perform(swipeRightFromCenter());
2122a5560c99cc4e4dfce9514223ef253b9733a2943Aga Madurska        // THEN the layout is not hidden
2130bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        assertNotHidden(R.id.swipe_dismiss_root);
2140bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    }
2150bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
21637bc8b03d33de5c375c26d915fcb056a42c5abc2Aga Madurska
2170bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    @Test
2180bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    @SmallTest
2190bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    public void testEdgeSwipeDoesDismissViewIfScrollable() {
2200bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // GIVEN a freshly setup SwipeDismissFrameLayout with dismiss turned off.
221d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska        setUpSwipeDismissWithHorizontalRecyclerView();
2220bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // WHEN we perform a swipe to dismiss from the left edge of the screen.
2230bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        onView(withId(R.id.swipe_dismiss_root)).perform(swipeRightFromLeftEdge());
2242a5560c99cc4e4dfce9514223ef253b9733a2943Aga Madurska        // THEN the layout is hidden
2250bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        assertHidden(R.id.swipe_dismiss_root);
2260bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    }
2270bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
2280bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    @Test
2290bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    @SmallTest
2300bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    public void testSwipeDoesNotDismissViewIfStartsInWrongPosition() {
2310bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // GIVEN a freshly setup SwipeDismissFrameLayout with dismiss turned on, but only for an
2325504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska        // inner circle.
2330bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        setUpSwipeableRegion();
2340bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // WHEN we perform a swipe to dismiss from the left edge of the screen.
2350bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        onView(withId(R.id.swipe_dismiss_root)).perform(swipeRightFromLeftEdge());
2362a5560c99cc4e4dfce9514223ef253b9733a2943Aga Madurska        // THEN the layout is not not hidden
2370bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        assertNotHidden(R.id.swipe_dismiss_root);
2380bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    }
2390bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
2400bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    @Test
2410bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    @SmallTest
2420bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    public void testSwipeDoesDismissViewIfStartsInRightPosition() {
2430bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // GIVEN a freshly setup SwipeDismissFrameLayout with dismiss turned on, but only for an
2445504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska        // inner circle.
2450bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        setUpSwipeableRegion();
2460bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // WHEN we perform a swipe to dismiss from the center of the screen.
2470bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        onView(withId(R.id.swipe_dismiss_root)).perform(swipeRightFromCenter());
2482a5560c99cc4e4dfce9514223ef253b9733a2943Aga Madurska        // THEN the layout is hidden
2490bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        assertHidden(R.id.swipe_dismiss_root);
2500bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    }
2510bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
2520bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    /**
2530bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska     @Test public void testSwipeInPreferenceFragmentAndNavDrawer() {
2540bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska     // GIVEN a freshly setup SwipeDismissFrameLayout with dismiss turned on, but only for an inner
2550bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska     // circle.
2560bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska     setUpPreferenceFragmentAndNavDrawer();
2570bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska     // WHEN we perform a swipe to dismiss from the center of the screen to the bottom.
2580bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska     onView(withId(R.id.drawer_layout)).perform(swipeBottomFromCenter());
2590bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska     // THEN the navigation drawer is shown.
2600bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska     assertPeeking(R.id.top_drawer);
2610bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska     }*/
2620bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
263d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska    @Test
264d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska    @SmallTest
265d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska    public void testArcSwipeDoesNotTriggerDismiss() throws Throwable {
266d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska        // GIVEN a freshly setup SwipeDismissFrameLayout with vertically scrollable content
267d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska        setUpSwipeDismissWithVerticalRecyclerView();
268d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska        int center = mLayoutHeight / 2;
269d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska        int halfBound = mLayoutWidth / 2;
270d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska        RectF bounds = new RectF(0, center - halfBound, mLayoutWidth, center + halfBound);
271d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska        // WHEN the view is scrolled on an arc from top to bottom.
272d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska        onView(withId(R.id.swipe_dismiss_root)).perform(swipeTopFromBottomOnArc(bounds));
273d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska        // THEN the layout is not dismissed and not hidden.
274d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska        assertNotHidden(R.id.swipe_dismiss_root);
275d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska        // AND the content view is scrolled.
276d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska        assertScrolledY(R.id.recycler_container);
277d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska    }
278d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska
2790bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    /**
2800bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska     * Set ups the simplest possible layout for test cases - a {@link SwipeDismissFrameLayout} with
2810bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska     * a single static child.
2820bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska     */
2830bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    private void setUpSimpleLayout() {
2840bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        activityRule.launchActivity(
2850bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                new Intent()
2860bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                        .putExtra(
2870bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                                LayoutTestActivity.EXTRA_LAYOUT_RESOURCE_ID,
2880bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                                R.layout.swipe_dismiss_layout_testcase_1));
2890bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        setDismissCallback();
2900bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    }
2910bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
292d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska
2930bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    /**
2940bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska     * Sets up a slightly more involved layout for testing swipe-to-dismiss with scrollable
295d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska     * containers. This layout contains a {@link SwipeDismissFrameLayout} with a horizontal {@link
296d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska     * android.support.v7.widget.RecyclerView} as a child, ready to accept an adapter.
2970bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska     */
298d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska    private void setUpSwipeDismissWithHorizontalRecyclerView() {
299d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska        Intent launchIntent = new Intent();
300d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska        launchIntent.putExtra(LayoutTestActivity.EXTRA_LAYOUT_RESOURCE_ID,
301d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska                R.layout.swipe_dismiss_layout_testcase_2);
302d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska        launchIntent.putExtra(SwipeDismissFrameLayoutTestActivity.EXTRA_LAYOUT_HORIZONTAL, true);
303d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska        activityRule.launchActivity(launchIntent);
304d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska        setDismissCallback();
305d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska    }
306d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska
307d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska    /**
308d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska     * Sets up a slightly more involved layout for testing swipe-to-dismiss with scrollable
309d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska     * containers. This layout contains a {@link SwipeDismissFrameLayout} with a vertical {@link
310d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska     * WearableRecyclerView} as a child, ready to accept an adapter.
311d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska     */
312d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska    private void setUpSwipeDismissWithVerticalRecyclerView() {
313d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska        Intent launchIntent = new Intent();
314d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska        launchIntent.putExtra(LayoutTestActivity.EXTRA_LAYOUT_RESOURCE_ID,
315d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska                R.layout.swipe_dismiss_layout_testcase_2);
316d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska        launchIntent.putExtra(SwipeDismissFrameLayoutTestActivity.EXTRA_LAYOUT_HORIZONTAL, false);
317d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska        activityRule.launchActivity(launchIntent);
3180bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        setDismissCallback();
3190bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    }
3200bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
3210bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    /**
3220bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska     * Sets up a {@link SwipeDismissFrameLayout} in which only a certain region is allowed to react
3230bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska     * to swipe-dismiss gestures.
3240bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska     */
3250bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    private void setUpSwipeableRegion() {
3260bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        activityRule.launchActivity(
3270bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                new Intent()
3280bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                        .putExtra(
3290bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                                LayoutTestActivity.EXTRA_LAYOUT_RESOURCE_ID,
3300bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                                R.layout.swipe_dismiss_layout_testcase_1));
3310bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        setCallback(
3320bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                new DismissCallback() {
3330bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                    @Override
3349a5734f937641667bae07b81dac4fea8514c0aecAga Madurska                    public boolean onPreSwipeStart(SwipeDismissFrameLayout layout, float x,
3359a5734f937641667bae07b81dac4fea8514c0aecAga Madurska                            float y) {
3360bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                        float normalizedX = x - mLayoutWidth / 2;
3370bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                        float normalizedY = y - mLayoutWidth / 2;
3380bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                        float squareX = normalizedX * normalizedX;
3390bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                        float squareY = normalizedY * normalizedY;
3400bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                        // 30 is an arbitrary number limiting the circle.
3410bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                        return Math.sqrt(squareX + squareY) < (mLayoutWidth / 2 - 30);
3420bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                    }
3430bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                });
3440bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    }
3450bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
3460bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    /**
3470bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska     * Sets up a more involved test case where the layout consists of a
348cf17fde3b0839053f0c8806ef7f4cfa7250895b1Alan Viverette     * {@code WearableNavigationDrawer} and a
349cf17fde3b0839053f0c8806ef7f4cfa7250895b1Alan Viverette     * {@code android.support.wear.internal.view.SwipeDismissPreferenceFragment}
3500bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska     */
3510bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska  /*
3520bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska  private void setUpPreferenceFragmentAndNavDrawer() {
3530bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    activityRule.launchActivity(
3540bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska      new Intent()
3550bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska          .putExtra(
3560bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska              LayoutTestActivity.EXTRA_LAYOUT_RESOURCE_ID,
3570bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska              R.layout.swipe_dismiss_layout_testcase_3));
3580bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    Activity activity = activityRule.getActivity();
3590bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    InstrumentationRegistry.getInstrumentation().runOnMainSync(() -> {
3600bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska      WearableNavigationDrawer wearableNavigationDrawer =
3610bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska              (WearableNavigationDrawer) activity.findViewById(R.id.top_drawer);
3620bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska      wearableNavigationDrawer.setAdapter(
3630bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska              new WearableNavigationDrawer.WearableNavigationDrawerAdapter() {
3640bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                @Override
3650bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                public String getItemText(int pos) {
3660bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                  return "test";
3670bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                }
3680bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
3690bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                @Override
3700bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                public Drawable getItemDrawable(int pos) {
3710bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                  return null;
3720bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                }
3730bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
3740bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                @Override
3750bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                public void onItemSelected(int pos) {
3760bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                  return;
3770bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                }
3780bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
3790bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                @Override
3800bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                public int getCount() {
3810bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                  return 3;
3820bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                }
3830bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska              });
3840bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    });
3850bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska  }*/
3860bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    private void setDismissCallback() {
3870bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        setCallback(mDismissCallback);
3880bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    }
3890bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
3900bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    private void setCallback(SwipeDismissFrameLayout.Callback callback) {
3910bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        Activity activity = activityRule.getActivity();
3922a5560c99cc4e4dfce9514223ef253b9733a2943Aga Madurska        SwipeDismissFrameLayout testLayout = activity.findViewById(R.id.swipe_dismiss_root);
3930bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        mLayoutWidth = testLayout.getWidth();
394d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska        mLayoutHeight = testLayout.getHeight();
3950bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        testLayout.addCallback(callback);
3960bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    }
3970bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
3980bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    /**
39937bc8b03d33de5c375c26d915fcb056a42c5abc2Aga Madurska     * private static void assertPeeking(@IdRes int layoutId) {
4000bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska     * onView(withId(layoutId))
4010bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska     * .perform(
4020bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska     * waitForMatchingView(
4030bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska     * allOf(withId(layoutId), isOpened(true)), MAX_WAIT_TIME));
4040bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska     * }
4050bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska     */
4060bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
40737bc8b03d33de5c375c26d915fcb056a42c5abc2Aga Madurska    private static void assertHidden(@IdRes int layoutId) {
4080bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        onView(withId(layoutId))
4090bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                .perform(
4100bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                        waitForMatchingView(
4110bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                                allOf(withId(layoutId),
4120bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                                        withEffectiveVisibility(ViewMatchers.Visibility.GONE)),
4130bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                                MAX_WAIT_TIME));
4140bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    }
4150bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
41637bc8b03d33de5c375c26d915fcb056a42c5abc2Aga Madurska    private static void assertNotHidden(@IdRes int layoutId) {
4170bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        onView(withId(layoutId))
4180bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                .perform(
4190bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                        waitForMatchingView(
4200bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                                allOf(withId(layoutId),
4210bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                                        withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE)),
4220bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                                MAX_WAIT_TIME));
4230bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    }
4240bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
425d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska    private static void assertScrolledY(@IdRes int layoutId) {
426d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska        onView(withId(layoutId))
427d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska                .perform(
428d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska                        waitForMatchingView(
429d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska                                allOf(withId(layoutId), withPositiveVerticalScrollOffset()),
430d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska                                MAX_WAIT_TIME));
431d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska    }
432d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska
4330bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    private static ViewAction swipeRightFromCenter() {
4340bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        return new GeneralSwipeAction(
4350bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                Swipe.SLOW, GeneralLocation.CENTER, GeneralLocation.CENTER_RIGHT, Press.FINGER);
4360bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    }
4370bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
4380bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    private static ViewAction swipeRightFromLeftEdge() {
4390bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        return new GeneralSwipeAction(
4400bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                Swipe.SLOW, GeneralLocation.CENTER_LEFT, GeneralLocation.CENTER_RIGHT,
4410bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                Press.FINGER);
4420bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    }
4430bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
444d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska    private static ViewAction swipeTopFromBottomOnArc(RectF bounds) {
4450bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        return new GeneralSwipeAction(
446d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska                new ArcSwipe(ArcSwipe.Gesture.SLOW_ANTICLOCKWISE, bounds),
447d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska                GeneralLocation.BOTTOM_CENTER,
448d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska                GeneralLocation.TOP_CENTER,
4490bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                Press.FINGER);
4500bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    }
4510bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
4520bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    /** Helper class hiding the view after a successful swipe-to-dismiss. */
4530bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    private static class DismissCallback extends SwipeDismissFrameLayout.Callback {
4540bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
4550bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        @Override
4560bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        public void onDismissed(SwipeDismissFrameLayout layout) {
4570bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska            layout.setVisibility(View.GONE);
4580bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        }
4590bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    }
4600bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska}
461