1394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov/* 2394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov * Copyright (C) 2015 The Android Open Source Project 3394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov * 4394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov * Licensed under the Apache License, Version 2.0 (the "License"); 5394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov * you may not use this file except in compliance with the License. 6394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov * You may obtain a copy of the License at 7394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov * 8394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov * http://www.apache.org/licenses/LICENSE-2.0 9394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov * 10394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov * Unless required by applicable law or agreed to in writing, software 11394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov * distributed under the License is distributed on an "AS IS" BASIS, 12394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov * See the License for the specific language governing permissions and 14394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov * limitations under the License. 15394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov */ 16394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov 17394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikovpackage android.support.design.testutils; 18394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov 19005d6d4b81b7f1c80bec1d2d6e0f4e2b85436660Kirill Grouchnikovimport static android.support.test.espresso.matcher.ViewMatchers.isAssignableFrom; 20005d6d4b81b7f1c80bec1d2d6e0f4e2b85436660Kirill Grouchnikovimport static android.support.test.espresso.matcher.ViewMatchers.isDisplayingAtLeast; 21005d6d4b81b7f1c80bec1d2d6e0f4e2b85436660Kirill Grouchnikov 22e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikovimport android.support.annotation.Nullable; 23394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikovimport android.support.test.espresso.UiController; 24394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikovimport android.support.test.espresso.ViewAction; 25394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikovimport android.support.v4.view.PagerAdapter; 26394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikovimport android.support.v4.view.ViewPager; 27394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikovimport android.view.View; 28394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov 29005d6d4b81b7f1c80bec1d2d6e0f4e2b85436660Kirill Grouchnikovimport org.hamcrest.Matcher; 30394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov 31394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikovpublic class ViewPagerActions { 32394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov /** 33394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov * Moves <code>ViewPager</code> to the right by one page. 34394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov */ 35394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov public static ViewAction scrollRight() { 36394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov return new ViewAction() { 37394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov @Override 38394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov public Matcher<View> getConstraints() { 39394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov return isDisplayingAtLeast(90); 40394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov } 41394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov 42394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov @Override 43394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov public String getDescription() { 44394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov return "ViewPager scroll one page to the right"; 45394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov } 46394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov 47394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov @Override 48394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov public void perform(UiController uiController, View view) { 49394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov uiController.loopMainThreadUntilIdle(); 50394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov 51394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov ViewPager viewPager = (ViewPager) view; 52394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov int current = viewPager.getCurrentItem(); 53394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov viewPager.setCurrentItem(current + 1, false); 54394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov 55394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov uiController.loopMainThreadUntilIdle(); 56394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov } 57394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov }; 58394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov } 59394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov 60394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov /** 61394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov * Moves <code>ViewPager</code> to the left by one page. 62394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov */ 63394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov public static ViewAction scrollLeft() { 64394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov return new ViewAction() { 65394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov @Override 66394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov public Matcher<View> getConstraints() { 67394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov return isDisplayingAtLeast(90); 68394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov } 69394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov 70394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov @Override 71394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov public String getDescription() { 72394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov return "ViewPager scroll one page to the left"; 73394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov } 74394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov 75394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov @Override 76394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov public void perform(UiController uiController, View view) { 77394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov uiController.loopMainThreadUntilIdle(); 78394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov 79394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov ViewPager viewPager = (ViewPager) view; 80394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov int current = viewPager.getCurrentItem(); 81394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov viewPager.setCurrentItem(current - 1, false); 82394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov 83394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov uiController.loopMainThreadUntilIdle(); 84394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov } 85394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov }; 86394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov } 87394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov 88394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov /** 89394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov * Moves <code>ViewPager</code> to the last page. 90394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov */ 91394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov public static ViewAction scrollToLast() { 92394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov return new ViewAction() { 93394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov @Override 94394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov public Matcher<View> getConstraints() { 95394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov return isDisplayingAtLeast(90); 96394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov } 97394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov 98394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov @Override 99394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov public String getDescription() { 100394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov return "ViewPager scroll to last page"; 101394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov } 102394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov 103394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov @Override 104394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov public void perform(UiController uiController, View view) { 105394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov uiController.loopMainThreadUntilIdle(); 106394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov 107394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov ViewPager viewPager = (ViewPager) view; 108394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov int size = viewPager.getAdapter().getCount(); 109394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov if (size > 0) { 110394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov viewPager.setCurrentItem(size - 1, false); 111394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov } 112394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov 113394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov uiController.loopMainThreadUntilIdle(); 114394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov } 115394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov }; 116394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov } 117394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov 118394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov /** 119394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov * Moves <code>ViewPager</code> to the first page. 120394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov */ 121394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov public static ViewAction scrollToFirst() { 122394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov return new ViewAction() { 123394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov @Override 124394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov public Matcher<View> getConstraints() { 125394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov return isDisplayingAtLeast(90); 126394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov } 127394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov 128394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov @Override 129394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov public String getDescription() { 130394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov return "ViewPager scroll to first page"; 131394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov } 132394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov 133394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov @Override 134394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov public void perform(UiController uiController, View view) { 135394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov uiController.loopMainThreadUntilIdle(); 136394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov 137394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov ViewPager viewPager = (ViewPager) view; 138394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov int size = viewPager.getAdapter().getCount(); 139394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov if (size > 0) { 140394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov viewPager.setCurrentItem(0, false); 141394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov } 142394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov 143394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov uiController.loopMainThreadUntilIdle(); 144394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov } 145394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov }; 146394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov } 147394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov 148394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov /** 149394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov * Moves <code>ViewPager</code> to specific page. 150394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov */ 151394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov public static ViewAction scrollToPage(final int page) { 152394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov return new ViewAction() { 153394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov @Override 154394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov public Matcher<View> getConstraints() { 155394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov return isDisplayingAtLeast(90); 156394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov } 157394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov 158394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov @Override 159394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov public String getDescription() { 1605a81ee1ca18fbf1200c8326b36e9b38959af73f8Aurimas Liutikas return "ViewPager move to a specific page"; 161394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov } 162394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov 163394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov @Override 164394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov public void perform(UiController uiController, View view) { 165394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov uiController.loopMainThreadUntilIdle(); 166394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov 167394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov ViewPager viewPager = (ViewPager) view; 168394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov viewPager.setCurrentItem(page, false); 169394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov 170394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov uiController.loopMainThreadUntilIdle(); 171394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov } 172394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov }; 173394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov } 174394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov 175394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov /** 176e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov * Sets the specified adapter on <code>ViewPager</code>. 177394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov */ 178e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov public static ViewAction setAdapter(final @Nullable PagerAdapter adapter) { 179394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov return new ViewAction() { 180394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov @Override 181394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov public Matcher<View> getConstraints() { 182394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov return isAssignableFrom(ViewPager.class); 183394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov } 184394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov 185394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov @Override 186394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov public String getDescription() { 187394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov return "ViewPager set adapter"; 188394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov } 189394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov 190394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov @Override 191394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov public void perform(UiController uiController, View view) { 192394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov uiController.loopMainThreadUntilIdle(); 193394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov 194394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov ViewPager viewPager = (ViewPager) view; 195394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov viewPager.setAdapter(adapter); 196394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov 197394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov uiController.loopMainThreadUntilIdle(); 198394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov } 199394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov }; 200394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov } 201394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov} 202