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