SwipeDismissFrameLayoutTest.java revision 9a5734f937641667bae07b81dac4fea8514c0aec
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
1721061fa807a55ee22f733683cc3c33c87c484f69Aga Madurskapackage android.support.wearable.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;
2321061fa807a55ee22f733683cc3c33c87c484f69Aga Madurskaimport static android.support.wearable.widget.util.AsyncViewActions.waitForMatchingView;
2437bc8b03d33de5c375c26d915fcb056a42c5abc2Aga Madurskaimport static android.support.wearable.widget.util.MoreViewAssertions
2537bc8b03d33de5c375c26d915fcb056a42c5abc2Aga Madurska        .withPositiveVerticalScrollOffset;
2621061fa807a55ee22f733683cc3c33c87c484f69Aga Madurskaimport static android.support.wearable.widget.util.MoreViewAssertions.withTranslationX;
270bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
280bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurskaimport static org.hamcrest.Matchers.allOf;
290bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurskaimport static org.junit.Assert.assertFalse;
300bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurskaimport static org.junit.Assert.assertTrue;
310bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
320bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurskaimport android.app.Activity;
330bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurskaimport android.content.Intent;
34d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurskaimport android.graphics.RectF;
350bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurskaimport android.support.annotation.IdRes;
360bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurskaimport android.support.test.InstrumentationRegistry;
370bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurskaimport android.support.test.espresso.ViewAction;
380bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurskaimport android.support.test.espresso.action.GeneralLocation;
390bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurskaimport android.support.test.espresso.action.GeneralSwipeAction;
400bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurskaimport android.support.test.espresso.action.Press;
410bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurskaimport android.support.test.espresso.action.Swipe;
420bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurskaimport android.support.test.espresso.matcher.ViewMatchers;
430bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurskaimport android.support.test.filters.SmallTest;
440bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurskaimport android.support.test.rule.ActivityTestRule;
450bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurskaimport android.support.test.runner.AndroidJUnit4;
4637bc8b03d33de5c375c26d915fcb056a42c5abc2Aga Madurskaimport android.support.v7.widget.RecyclerView;
470bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurskaimport android.support.wearable.test.R;
4821061fa807a55ee22f733683cc3c33c87c484f69Aga Madurskaimport android.support.wearable.widget.util.ArcSwipe;
4921061fa807a55ee22f733683cc3c33c87c484f69Aga Madurskaimport android.support.wearable.widget.util.WakeLockRule;
500bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurskaimport android.view.View;
510bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
520bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurskaimport org.junit.Rule;
530bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurskaimport org.junit.Test;
540bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurskaimport org.junit.runner.RunWith;
550bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
560bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska@RunWith(AndroidJUnit4.class)
570bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurskapublic class SwipeDismissFrameLayoutTest {
580bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
590bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    private static final long MAX_WAIT_TIME = 4000; //ms
600bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    private final SwipeDismissFrameLayout.Callback mDismissCallback = new DismissCallback();
610bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
620bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    @Rule
630bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    public final WakeLockRule wakeLock = new WakeLockRule();
640bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
650bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    @Rule
660bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    public final ActivityTestRule<SwipeDismissFrameLayoutTestActivity> activityRule =
670bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska            new ActivityTestRule<>(
680bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                    SwipeDismissFrameLayoutTestActivity.class,
690bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                    true, /** initial touch mode */
700bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                    false /** launchActivity */
710bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska            );
720bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
730bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    private int mLayoutWidth;
74d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska    private int mLayoutHeight;
750bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
760bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    @Test
770bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    @SmallTest
780bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    public void testCanScrollHorizontally() {
790bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // GIVEN a freshly setup SwipeDismissFrameLayout
800bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        setUpSimpleLayout();
810bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        Activity activity = activityRule.getActivity();
820bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        SwipeDismissFrameLayout testLayout =
830bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                (SwipeDismissFrameLayout) activity.findViewById(R.id.swipe_dismiss_root);
840bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // WHEN we check that the layout is horizontally scrollable from left to right.
850bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // THEN the layout is found to be horizontally swipeable from left to right.
860bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        assertTrue(testLayout.canScrollHorizontally(-20));
870bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // AND the layout is found to NOT be horizontally swipeable from right to left.
880bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        assertFalse(testLayout.canScrollHorizontally(20));
890bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
900bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // WHEN we switch off the swipe-to-dismiss functionality for the layout
910bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        testLayout.setSwipeable(false);
920bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // THEN the layout is found NOT to be horizontally swipeable from left to right.
930bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        assertFalse(testLayout.canScrollHorizontally(-20));
940bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // AND the layout is found to NOT be horizontally swipeable from right to left.
950bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        assertFalse(testLayout.canScrollHorizontally(20));
960bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    }
970bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
980bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    @Test
990bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    @SmallTest
1000bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    public void canScrollHorizontallyShouldBeFalseWhenInvisible() {
1010bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // GIVEN a freshly setup SwipeDismissFrameLayout
1020bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        setUpSimpleLayout();
1030bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        Activity activity = activityRule.getActivity();
1040bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        final SwipeDismissFrameLayout testLayout =
1050bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                (SwipeDismissFrameLayout) activity.findViewById(R.id.swipe_dismiss_root);
1060bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // GIVEN the layout is invisible
1070bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // Note: We have to run this on the main thread, because of thread checks in View.java.
1080bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
1090bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska            @Override
1100bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska            public void run() {
1110bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                testLayout.setVisibility(View.INVISIBLE);
1120bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska            }
1130bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        });
1140bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // WHEN we check that the layout is horizontally scrollable
1150bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // THEN the layout is found to be NOT horizontally swipeable from left to right.
1160bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        assertFalse(testLayout.canScrollHorizontally(-20));
1170bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // AND the layout is found to NOT be horizontally swipeable from right to left.
1180bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        assertFalse(testLayout.canScrollHorizontally(20));
1190bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    }
1200bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
1210bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    @Test
1220bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    @SmallTest
1230bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    public void canScrollHorizontallyShouldBeFalseWhenGone() {
1240bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // GIVEN a freshly setup SwipeDismissFrameLayout
1250bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        setUpSimpleLayout();
1260bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        Activity activity = activityRule.getActivity();
1270bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        final SwipeDismissFrameLayout testLayout =
1280bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                (SwipeDismissFrameLayout) activity.findViewById(R.id.swipe_dismiss_root);
1290bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // GIVEN the layout is gone
1300bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // Note: We have to run this on the main thread, because of thread checks in View.java.
1310bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
1320bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska            @Override
1330bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska            public void run() {
1340bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                testLayout.setVisibility(View.GONE);
1350bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska            }
1360bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        });
1370bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // WHEN we check that the layout is horizontally scrollable
1380bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // THEN the layout is found to be NOT horizontally swipeable from left to right.
1390bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        assertFalse(testLayout.canScrollHorizontally(-20));
1400bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // AND the layout is found to NOT be horizontally swipeable from right to left.
1410bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        assertFalse(testLayout.canScrollHorizontally(20));
1420bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    }
1430bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
1440bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    @Test
1450bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    @SmallTest
1460bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    public void testSwipeDismissEnabledByDefault() {
1470bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // GIVEN a freshly setup SwipeDismissFrameLayout
1480bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        setUpSimpleLayout();
1490bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        Activity activity = activityRule.getActivity();
1500bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        SwipeDismissFrameLayout testLayout =
1510bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                (SwipeDismissFrameLayout) activity.findViewById(R.id.swipe_dismiss_root);
1520bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // WHEN we check that the layout is dismissible
1530bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // THEN the layout is find to be dismissible
1540bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        assertTrue(testLayout.isSwipeable());
1550bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    }
1560bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
1570bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    @Test
1580bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    @SmallTest
1590bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    public void testSwipeDismissesViewIfEnabled() {
1600bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // GIVEN a freshly setup SwipeDismissFrameLayout
1610bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        setUpSimpleLayout();
1620bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // WHEN we perform a swipe to dismiss
1630bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        onView(withId(R.id.swipe_dismiss_root)).perform(swipeRight());
1640bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // THEN the layout is dismissed
1650bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        assertDismissed(R.id.swipe_dismiss_root);
1660bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        assertHidden(R.id.swipe_dismiss_root);
1670bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    }
1680bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
1690bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    @Test
1700bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    @SmallTest
1710bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    public void testSwipeDoesNotDismissViewIfDisabled() {
1720bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // GIVEN a freshly setup SwipeDismissFrameLayout with dismiss turned off.
1730bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        setUpSimpleLayout();
1740bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        Activity activity = activityRule.getActivity();
1750bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        SwipeDismissFrameLayout testLayout =
1760bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                (SwipeDismissFrameLayout) activity.findViewById(R.id.swipe_dismiss_root);
1770bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        testLayout.setSwipeable(false);
1780bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // WHEN we perform a swipe to dismiss
1790bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        onView(withId(R.id.swipe_dismiss_root)).perform(swipeRight());
1800bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // THEN the layout is not dismissed and not hidden
1810bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        assertNotHidden(R.id.swipe_dismiss_root);
18237bc8b03d33de5c375c26d915fcb056a42c5abc2Aga Madurska        assertNotDismissed(R.id.swipe_dismiss_root);
1830bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    }
1840bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
1850bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    @Test
1860bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    @SmallTest
1870bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    public void testAddRemoveCallback() {
1880bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // GIVEN a freshly setup SwipeDismissFrameLayout
1890bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        setUpSimpleLayout();
1900bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        Activity activity = activityRule.getActivity();
1910bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        SwipeDismissFrameLayout testLayout =
1920bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                (SwipeDismissFrameLayout) activity.findViewById(R.id.swipe_dismiss_root);
1930bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // WHEN we remove the swipe callback
1940bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        testLayout.removeCallback(mDismissCallback);
1950bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        onView(withId(R.id.swipe_dismiss_root)).perform(swipeRight());
1960bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // THEN the layout is dismissed, but no hidden
1970bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        assertDismissed(R.id.swipe_dismiss_root);
1980bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        assertNotHidden(R.id.swipe_dismiss_root);
1990bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    }
2000bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
2010bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    @Test
2020bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    @SmallTest
20337bc8b03d33de5c375c26d915fcb056a42c5abc2Aga Madurska    public void testSwipeDoesNotDismissViewIfScrollable() throws Throwable {
2040bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // GIVEN a freshly setup SwipeDismissFrameLayout with dismiss turned off.
205d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska        setUpSwipeDismissWithHorizontalRecyclerView();
20637bc8b03d33de5c375c26d915fcb056a42c5abc2Aga Madurska        activityRule.runOnUiThread(new Runnable() {
20737bc8b03d33de5c375c26d915fcb056a42c5abc2Aga Madurska            @Override
20837bc8b03d33de5c375c26d915fcb056a42c5abc2Aga Madurska            public void run() {
20937bc8b03d33de5c375c26d915fcb056a42c5abc2Aga Madurska                Activity activity = activityRule.getActivity();
21037bc8b03d33de5c375c26d915fcb056a42c5abc2Aga Madurska                RecyclerView testLayout = activity.findViewById(R.id.recycler_container);
21137bc8b03d33de5c375c26d915fcb056a42c5abc2Aga Madurska                // Scroll to a position from which the child is scrollable.
21237bc8b03d33de5c375c26d915fcb056a42c5abc2Aga Madurska                testLayout.scrollToPosition(50);
21337bc8b03d33de5c375c26d915fcb056a42c5abc2Aga Madurska            }
21437bc8b03d33de5c375c26d915fcb056a42c5abc2Aga Madurska        });
21537bc8b03d33de5c375c26d915fcb056a42c5abc2Aga Madurska
21637bc8b03d33de5c375c26d915fcb056a42c5abc2Aga Madurska        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
2170bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // WHEN we perform a swipe to dismiss from the center of the screen.
2180bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        onView(withId(R.id.swipe_dismiss_root)).perform(swipeRightFromCenter());
2190bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // THEN the layout is not dismissed and not hidden
2200bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        assertNotHidden(R.id.swipe_dismiss_root);
22137bc8b03d33de5c375c26d915fcb056a42c5abc2Aga Madurska        assertNotDismissed(R.id.swipe_dismiss_root);
2220bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    }
2230bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
22437bc8b03d33de5c375c26d915fcb056a42c5abc2Aga Madurska
2250bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    @Test
2260bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    @SmallTest
2270bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    public void testEdgeSwipeDoesDismissViewIfScrollable() {
2280bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // GIVEN a freshly setup SwipeDismissFrameLayout with dismiss turned off.
229d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska        setUpSwipeDismissWithHorizontalRecyclerView();
2300bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // WHEN we perform a swipe to dismiss from the left edge of the screen.
2310bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        onView(withId(R.id.swipe_dismiss_root)).perform(swipeRightFromLeftEdge());
2320bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // THEN the layout is dismissed and hidden
2330bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        assertHidden(R.id.swipe_dismiss_root);
2340bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        assertDismissed(R.id.swipe_dismiss_root);
2350bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    }
2360bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
2370bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    @Test
2380bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    @SmallTest
2390bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    public void testSwipeDoesNotDismissViewIfStartsInWrongPosition() {
2400bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // GIVEN a freshly setup SwipeDismissFrameLayout with dismiss turned on, but only for an
2415504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska        // inner circle.
2420bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        setUpSwipeableRegion();
2430bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // WHEN we perform a swipe to dismiss from the left edge of the screen.
2440bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        onView(withId(R.id.swipe_dismiss_root)).perform(swipeRightFromLeftEdge());
2450bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // THEN the layout is not dismissed and not hidden
2460bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        assertNotHidden(R.id.swipe_dismiss_root);
24737bc8b03d33de5c375c26d915fcb056a42c5abc2Aga Madurska        assertNotDismissed(R.id.swipe_dismiss_root);
2480bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    }
2490bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
2500bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    @Test
2510bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    @SmallTest
2520bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    public void testSwipeDoesDismissViewIfStartsInRightPosition() {
2530bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // GIVEN a freshly setup SwipeDismissFrameLayout with dismiss turned on, but only for an
2545504220f38bb0552e1d8def09fb1b9a118264b45Aga Madurska        // inner circle.
2550bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        setUpSwipeableRegion();
2560bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // WHEN we perform a swipe to dismiss from the center of the screen.
2570bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        onView(withId(R.id.swipe_dismiss_root)).perform(swipeRightFromCenter());
2580bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        // THEN the layout is dismissed and hidden
2590bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        assertHidden(R.id.swipe_dismiss_root);
2600bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        assertDismissed(R.id.swipe_dismiss_root);
2610bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    }
2620bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
2630bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    /**
2640bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska     @Test public void testSwipeInPreferenceFragmentAndNavDrawer() {
2650bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska     // GIVEN a freshly setup SwipeDismissFrameLayout with dismiss turned on, but only for an inner
2660bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska     // circle.
2670bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska     setUpPreferenceFragmentAndNavDrawer();
2680bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska     // WHEN we perform a swipe to dismiss from the center of the screen to the bottom.
2690bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska     onView(withId(R.id.drawer_layout)).perform(swipeBottomFromCenter());
2700bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska     // THEN the navigation drawer is shown.
2710bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska     assertPeeking(R.id.top_drawer);
2720bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska     }*/
2730bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
274d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska    @Test
275d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska    @SmallTest
276d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska    public void testArcSwipeDoesNotTriggerDismiss() throws Throwable {
277d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska        // GIVEN a freshly setup SwipeDismissFrameLayout with vertically scrollable content
278d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska        setUpSwipeDismissWithVerticalRecyclerView();
279d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska        int center = mLayoutHeight / 2;
280d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska        int halfBound = mLayoutWidth / 2;
281d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska        RectF bounds = new RectF(0, center - halfBound, mLayoutWidth, center + halfBound);
282d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska        // WHEN the view is scrolled on an arc from top to bottom.
283d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska        onView(withId(R.id.swipe_dismiss_root)).perform(swipeTopFromBottomOnArc(bounds));
284d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska        // THEN the layout is not dismissed and not hidden.
285d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska        assertNotHidden(R.id.swipe_dismiss_root);
286d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska        // AND the content view is scrolled.
287d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska        assertScrolledY(R.id.recycler_container);
288d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska    }
289d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska
2900bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    /**
2910bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska     * Set ups the simplest possible layout for test cases - a {@link SwipeDismissFrameLayout} with
2920bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska     * a single static child.
2930bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska     */
2940bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    private void setUpSimpleLayout() {
2950bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        activityRule.launchActivity(
2960bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                new Intent()
2970bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                        .putExtra(
2980bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                                LayoutTestActivity.EXTRA_LAYOUT_RESOURCE_ID,
2990bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                                R.layout.swipe_dismiss_layout_testcase_1));
3000bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        setDismissCallback();
3010bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    }
3020bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
303d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska
3040bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    /**
3050bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska     * Sets up a slightly more involved layout for testing swipe-to-dismiss with scrollable
306d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska     * containers. This layout contains a {@link SwipeDismissFrameLayout} with a horizontal {@link
307d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska     * android.support.v7.widget.RecyclerView} as a child, ready to accept an adapter.
3080bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska     */
309d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska    private void setUpSwipeDismissWithHorizontalRecyclerView() {
310d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska        Intent launchIntent = new Intent();
311d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska        launchIntent.putExtra(LayoutTestActivity.EXTRA_LAYOUT_RESOURCE_ID,
312d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska                R.layout.swipe_dismiss_layout_testcase_2);
313d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska        launchIntent.putExtra(SwipeDismissFrameLayoutTestActivity.EXTRA_LAYOUT_HORIZONTAL, true);
314d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska        activityRule.launchActivity(launchIntent);
315d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska        setDismissCallback();
316d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska    }
317d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska
318d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska    /**
319d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska     * Sets up a slightly more involved layout for testing swipe-to-dismiss with scrollable
320d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska     * containers. This layout contains a {@link SwipeDismissFrameLayout} with a vertical {@link
321d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska     * WearableRecyclerView} as a child, ready to accept an adapter.
322d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska     */
323d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska    private void setUpSwipeDismissWithVerticalRecyclerView() {
324d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska        Intent launchIntent = new Intent();
325d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska        launchIntent.putExtra(LayoutTestActivity.EXTRA_LAYOUT_RESOURCE_ID,
326d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska                R.layout.swipe_dismiss_layout_testcase_2);
327d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska        launchIntent.putExtra(SwipeDismissFrameLayoutTestActivity.EXTRA_LAYOUT_HORIZONTAL, false);
328d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska        activityRule.launchActivity(launchIntent);
3290bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        setDismissCallback();
3300bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    }
3310bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
3320bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    /**
3330bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska     * Sets up a {@link SwipeDismissFrameLayout} in which only a certain region is allowed to react
3340bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska     * to swipe-dismiss gestures.
3350bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska     */
3360bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    private void setUpSwipeableRegion() {
3370bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        activityRule.launchActivity(
3380bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                new Intent()
3390bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                        .putExtra(
3400bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                                LayoutTestActivity.EXTRA_LAYOUT_RESOURCE_ID,
3410bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                                R.layout.swipe_dismiss_layout_testcase_1));
3420bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        setCallback(
3430bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                new DismissCallback() {
3440bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                    @Override
3459a5734f937641667bae07b81dac4fea8514c0aecAga Madurska                    public boolean onPreSwipeStart(SwipeDismissFrameLayout layout, float x,
3469a5734f937641667bae07b81dac4fea8514c0aecAga Madurska                            float y) {
3470bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                        float normalizedX = x - mLayoutWidth / 2;
3480bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                        float normalizedY = y - mLayoutWidth / 2;
3490bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                        float squareX = normalizedX * normalizedX;
3500bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                        float squareY = normalizedY * normalizedY;
3510bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                        // 30 is an arbitrary number limiting the circle.
3520bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                        return Math.sqrt(squareX + squareY) < (mLayoutWidth / 2 - 30);
3530bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                    }
3540bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                });
3550bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    }
3560bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
3570bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    /**
3580bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska     * Sets up a more involved test case where the layout consists of a
3590bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska     * {@link WearableNavigationDrawer} and a
3600bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska     * {@link android.support.wearable.internal.view.SwipeDismissPreferenceFragment}
3610bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska     */
3620bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska  /*
3630bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska  private void setUpPreferenceFragmentAndNavDrawer() {
3640bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    activityRule.launchActivity(
3650bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska      new Intent()
3660bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska          .putExtra(
3670bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska              LayoutTestActivity.EXTRA_LAYOUT_RESOURCE_ID,
3680bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska              R.layout.swipe_dismiss_layout_testcase_3));
3690bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    Activity activity = activityRule.getActivity();
3700bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    InstrumentationRegistry.getInstrumentation().runOnMainSync(() -> {
3710bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska      WearableNavigationDrawer wearableNavigationDrawer =
3720bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska              (WearableNavigationDrawer) activity.findViewById(R.id.top_drawer);
3730bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska      wearableNavigationDrawer.setAdapter(
3740bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska              new WearableNavigationDrawer.WearableNavigationDrawerAdapter() {
3750bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                @Override
3760bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                public String getItemText(int pos) {
3770bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                  return "test";
3780bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                }
3790bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
3800bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                @Override
3810bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                public Drawable getItemDrawable(int pos) {
3820bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                  return null;
3830bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                }
3840bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
3850bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                @Override
3860bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                public void onItemSelected(int pos) {
3870bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                  return;
3880bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                }
3890bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
3900bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                @Override
3910bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                public int getCount() {
3920bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                  return 3;
3930bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                }
3940bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska              });
3950bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    });
3960bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska  }*/
3970bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    private void setDismissCallback() {
3980bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        setCallback(mDismissCallback);
3990bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    }
4000bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
4010bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    private void setCallback(SwipeDismissFrameLayout.Callback callback) {
4020bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        Activity activity = activityRule.getActivity();
4030bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        SwipeDismissFrameLayout testLayout =
4040bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                (SwipeDismissFrameLayout) activity.findViewById(R.id.swipe_dismiss_root);
4050bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        mLayoutWidth = testLayout.getWidth();
406d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska        mLayoutHeight = testLayout.getHeight();
4070bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        testLayout.addCallback(callback);
4080bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    }
4090bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
4100bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    private void assertDismissed(@IdRes int layoutId) {
4110bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        onView(withId(layoutId))
4120bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                .perform(
4130bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                        waitForMatchingView(
4140bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                                allOf(withId(layoutId), withTranslationX(mLayoutWidth)),
4150bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                                MAX_WAIT_TIME));
4160bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    }
4170bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
41837bc8b03d33de5c375c26d915fcb056a42c5abc2Aga Madurska    private static void assertNotDismissed(@IdRes int layoutId) {
41937bc8b03d33de5c375c26d915fcb056a42c5abc2Aga Madurska        onView(withId(layoutId))
42037bc8b03d33de5c375c26d915fcb056a42c5abc2Aga Madurska                .perform(
42137bc8b03d33de5c375c26d915fcb056a42c5abc2Aga Madurska                        waitForMatchingView(
42237bc8b03d33de5c375c26d915fcb056a42c5abc2Aga Madurska                                allOf(withId(layoutId), withTranslationX(0)),
42337bc8b03d33de5c375c26d915fcb056a42c5abc2Aga Madurska                                MAX_WAIT_TIME));
42437bc8b03d33de5c375c26d915fcb056a42c5abc2Aga Madurska    }
42537bc8b03d33de5c375c26d915fcb056a42c5abc2Aga Madurska
4260bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    /**
42737bc8b03d33de5c375c26d915fcb056a42c5abc2Aga Madurska     * private static void assertPeeking(@IdRes int layoutId) {
4280bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska     * onView(withId(layoutId))
4290bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska     * .perform(
4300bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska     * waitForMatchingView(
4310bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska     * allOf(withId(layoutId), isOpened(true)), MAX_WAIT_TIME));
4320bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska     * }
4330bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska     */
4340bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
43537bc8b03d33de5c375c26d915fcb056a42c5abc2Aga Madurska    private static void assertHidden(@IdRes int layoutId) {
4360bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        onView(withId(layoutId))
4370bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                .perform(
4380bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                        waitForMatchingView(
4390bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                                allOf(withId(layoutId),
4400bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                                        withEffectiveVisibility(ViewMatchers.Visibility.GONE)),
4410bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                                MAX_WAIT_TIME));
4420bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    }
4430bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
44437bc8b03d33de5c375c26d915fcb056a42c5abc2Aga Madurska    private static void assertNotHidden(@IdRes int layoutId) {
4450bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        onView(withId(layoutId))
4460bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                .perform(
4470bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                        waitForMatchingView(
4480bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                                allOf(withId(layoutId),
4490bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                                        withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE)),
4500bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                                MAX_WAIT_TIME));
4510bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    }
4520bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
453d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska    private static void assertScrolledY(@IdRes int layoutId) {
454d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska        onView(withId(layoutId))
455d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska                .perform(
456d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska                        waitForMatchingView(
457d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska                                allOf(withId(layoutId), withPositiveVerticalScrollOffset()),
458d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska                                MAX_WAIT_TIME));
459d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska    }
460d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska
4610bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    private static ViewAction swipeRightFromCenter() {
4620bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        return new GeneralSwipeAction(
4630bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                Swipe.SLOW, GeneralLocation.CENTER, GeneralLocation.CENTER_RIGHT, Press.FINGER);
4640bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    }
4650bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
4660bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    private static ViewAction swipeRightFromLeftEdge() {
4670bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        return new GeneralSwipeAction(
4680bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                Swipe.SLOW, GeneralLocation.CENTER_LEFT, GeneralLocation.CENTER_RIGHT,
4690bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                Press.FINGER);
4700bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    }
4710bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
472d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska    private static ViewAction swipeTopFromBottomOnArc(RectF bounds) {
4730bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        return new GeneralSwipeAction(
474d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska                new ArcSwipe(ArcSwipe.Gesture.SLOW_ANTICLOCKWISE, bounds),
475d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska                GeneralLocation.BOTTOM_CENTER,
476d5fc393a5aa24693d35b5ebd6d588613103aafdcAga Madurska                GeneralLocation.TOP_CENTER,
4770bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska                Press.FINGER);
4780bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    }
4790bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
4800bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    /** Helper class hiding the view after a successful swipe-to-dismiss. */
4810bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    private static class DismissCallback extends SwipeDismissFrameLayout.Callback {
4820bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska
4830bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        @Override
4840bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        public void onDismissed(SwipeDismissFrameLayout layout) {
4850bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska            layout.setVisibility(View.GONE);
4860bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska        }
4870bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska    }
4880bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska}
489