1/*
2 * Copyright (C) 2015 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package android.support.design.testutils;
18
19import static android.support.test.espresso.matcher.ViewMatchers.isAssignableFrom;
20import static android.support.test.espresso.matcher.ViewMatchers.isDisplayingAtLeast;
21
22import android.support.annotation.Nullable;
23import android.support.test.espresso.UiController;
24import android.support.test.espresso.ViewAction;
25import android.support.v4.view.PagerAdapter;
26import android.support.v4.view.ViewPager;
27import android.view.View;
28
29import org.hamcrest.Matcher;
30
31public class ViewPagerActions {
32    /**
33     * Moves <code>ViewPager</code> to the right by one page.
34     */
35    public static ViewAction scrollRight() {
36        return new ViewAction() {
37            @Override
38            public Matcher<View> getConstraints() {
39                return isDisplayingAtLeast(90);
40            }
41
42            @Override
43            public String getDescription() {
44                return "ViewPager scroll one page to the right";
45            }
46
47            @Override
48            public void perform(UiController uiController, View view) {
49                uiController.loopMainThreadUntilIdle();
50
51                ViewPager viewPager = (ViewPager) view;
52                int current = viewPager.getCurrentItem();
53                viewPager.setCurrentItem(current + 1, false);
54
55                uiController.loopMainThreadUntilIdle();
56            }
57        };
58    }
59
60    /**
61     * Moves <code>ViewPager</code> to the left by one page.
62     */
63    public static ViewAction scrollLeft() {
64        return new ViewAction() {
65            @Override
66            public Matcher<View> getConstraints() {
67                return isDisplayingAtLeast(90);
68            }
69
70            @Override
71            public String getDescription() {
72                return "ViewPager scroll one page to the left";
73            }
74
75            @Override
76            public void perform(UiController uiController, View view) {
77                uiController.loopMainThreadUntilIdle();
78
79                ViewPager viewPager = (ViewPager) view;
80                int current = viewPager.getCurrentItem();
81                viewPager.setCurrentItem(current - 1, false);
82
83                uiController.loopMainThreadUntilIdle();
84            }
85        };
86    }
87
88    /**
89     * Moves <code>ViewPager</code> to the last page.
90     */
91    public static ViewAction scrollToLast() {
92        return new ViewAction() {
93            @Override
94            public Matcher<View> getConstraints() {
95                return isDisplayingAtLeast(90);
96            }
97
98            @Override
99            public String getDescription() {
100                return "ViewPager scroll to last page";
101            }
102
103            @Override
104            public void perform(UiController uiController, View view) {
105                uiController.loopMainThreadUntilIdle();
106
107                ViewPager viewPager = (ViewPager) view;
108                int size = viewPager.getAdapter().getCount();
109                if (size > 0) {
110                    viewPager.setCurrentItem(size - 1, false);
111                }
112
113                uiController.loopMainThreadUntilIdle();
114            }
115        };
116    }
117
118    /**
119     * Moves <code>ViewPager</code> to the first page.
120     */
121    public static ViewAction scrollToFirst() {
122        return new ViewAction() {
123            @Override
124            public Matcher<View> getConstraints() {
125                return isDisplayingAtLeast(90);
126            }
127
128            @Override
129            public String getDescription() {
130                return "ViewPager scroll to first page";
131            }
132
133            @Override
134            public void perform(UiController uiController, View view) {
135                uiController.loopMainThreadUntilIdle();
136
137                ViewPager viewPager = (ViewPager) view;
138                int size = viewPager.getAdapter().getCount();
139                if (size > 0) {
140                    viewPager.setCurrentItem(0, false);
141                }
142
143                uiController.loopMainThreadUntilIdle();
144            }
145        };
146    }
147
148    /**
149     * Moves <code>ViewPager</code> to specific page.
150     */
151    public static ViewAction scrollToPage(final int page) {
152        return new ViewAction() {
153            @Override
154            public Matcher<View> getConstraints() {
155                return isDisplayingAtLeast(90);
156            }
157
158            @Override
159            public String getDescription() {
160                return "ViewPager move to a specific page";
161            }
162
163            @Override
164            public void perform(UiController uiController, View view) {
165                uiController.loopMainThreadUntilIdle();
166
167                ViewPager viewPager = (ViewPager) view;
168                viewPager.setCurrentItem(page, false);
169
170                uiController.loopMainThreadUntilIdle();
171            }
172        };
173    }
174
175    /**
176     * Sets the specified adapter on <code>ViewPager</code>.
177     */
178    public static ViewAction setAdapter(final @Nullable PagerAdapter adapter) {
179        return new ViewAction() {
180            @Override
181            public Matcher<View> getConstraints() {
182                return isAssignableFrom(ViewPager.class);
183            }
184
185            @Override
186            public String getDescription() {
187                return "ViewPager set adapter";
188            }
189
190            @Override
191            public void perform(UiController uiController, View view) {
192                uiController.loopMainThreadUntilIdle();
193
194                ViewPager viewPager = (ViewPager) view;
195                viewPager.setAdapter(adapter);
196
197                uiController.loopMainThreadUntilIdle();
198            }
199        };
200    }
201}
202