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