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