1c10ba2544591704e7c4adbe98da6a485a8b19230Kirill Grouchnikov/*
2c10ba2544591704e7c4adbe98da6a485a8b19230Kirill Grouchnikov * Copyright (C) 2016 The Android Open Source Project
3c10ba2544591704e7c4adbe98da6a485a8b19230Kirill Grouchnikov *
4c10ba2544591704e7c4adbe98da6a485a8b19230Kirill Grouchnikov * Licensed under the Apache License, Version 2.0 (the "License");
5c10ba2544591704e7c4adbe98da6a485a8b19230Kirill Grouchnikov * you may not use this file except in compliance with the License.
6c10ba2544591704e7c4adbe98da6a485a8b19230Kirill Grouchnikov * You may obtain a copy of the License at
7c10ba2544591704e7c4adbe98da6a485a8b19230Kirill Grouchnikov *
8c10ba2544591704e7c4adbe98da6a485a8b19230Kirill Grouchnikov *      http://www.apache.org/licenses/LICENSE-2.0
9c10ba2544591704e7c4adbe98da6a485a8b19230Kirill Grouchnikov *
10c10ba2544591704e7c4adbe98da6a485a8b19230Kirill Grouchnikov * Unless required by applicable law or agreed to in writing, software
11c10ba2544591704e7c4adbe98da6a485a8b19230Kirill Grouchnikov * distributed under the License is distributed on an "AS IS" BASIS,
12c10ba2544591704e7c4adbe98da6a485a8b19230Kirill Grouchnikov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c10ba2544591704e7c4adbe98da6a485a8b19230Kirill Grouchnikov * See the License for the specific language governing permissions and
14c10ba2544591704e7c4adbe98da6a485a8b19230Kirill Grouchnikov * limitations under the License.
15c10ba2544591704e7c4adbe98da6a485a8b19230Kirill Grouchnikov */
16c10ba2544591704e7c4adbe98da6a485a8b19230Kirill Grouchnikov
17c10ba2544591704e7c4adbe98da6a485a8b19230Kirill Grouchnikovpackage android.support.design.testutils;
18c10ba2544591704e7c4adbe98da6a485a8b19230Kirill Grouchnikov
19c10ba2544591704e7c4adbe98da6a485a8b19230Kirill Grouchnikovimport android.support.test.espresso.UiController;
20c10ba2544591704e7c4adbe98da6a485a8b19230Kirill Grouchnikovimport android.support.test.espresso.ViewAction;
21c10ba2544591704e7c4adbe98da6a485a8b19230Kirill Grouchnikovimport android.support.v4.widget.DrawerLayout;
22c10ba2544591704e7c4adbe98da6a485a8b19230Kirill Grouchnikovimport android.view.View;
23c10ba2544591704e7c4adbe98da6a485a8b19230Kirill Grouchnikovimport org.hamcrest.Matcher;
24c10ba2544591704e7c4adbe98da6a485a8b19230Kirill Grouchnikov
25c10ba2544591704e7c4adbe98da6a485a8b19230Kirill Grouchnikovimport static android.support.test.espresso.matcher.ViewMatchers.isAssignableFrom;
26c10ba2544591704e7c4adbe98da6a485a8b19230Kirill Grouchnikov
27c10ba2544591704e7c4adbe98da6a485a8b19230Kirill Grouchnikovpublic class DrawerLayoutActions {
28c10ba2544591704e7c4adbe98da6a485a8b19230Kirill Grouchnikov    /**
29c10ba2544591704e7c4adbe98da6a485a8b19230Kirill Grouchnikov     * Opens the drawer at the specified edge gravity.
30c10ba2544591704e7c4adbe98da6a485a8b19230Kirill Grouchnikov     */
31c10ba2544591704e7c4adbe98da6a485a8b19230Kirill Grouchnikov    public static ViewAction openDrawer(final int drawerEdgeGravity) {
32c10ba2544591704e7c4adbe98da6a485a8b19230Kirill Grouchnikov        return new ViewAction() {
33c10ba2544591704e7c4adbe98da6a485a8b19230Kirill Grouchnikov            @Override
34c10ba2544591704e7c4adbe98da6a485a8b19230Kirill Grouchnikov            public Matcher<View> getConstraints() {
35c10ba2544591704e7c4adbe98da6a485a8b19230Kirill Grouchnikov                return isAssignableFrom(DrawerLayout.class);
36c10ba2544591704e7c4adbe98da6a485a8b19230Kirill Grouchnikov            }
37c10ba2544591704e7c4adbe98da6a485a8b19230Kirill Grouchnikov
38c10ba2544591704e7c4adbe98da6a485a8b19230Kirill Grouchnikov            @Override
39c10ba2544591704e7c4adbe98da6a485a8b19230Kirill Grouchnikov            public String getDescription() {
40c10ba2544591704e7c4adbe98da6a485a8b19230Kirill Grouchnikov                return "Opens the drawer";
41c10ba2544591704e7c4adbe98da6a485a8b19230Kirill Grouchnikov            }
42c10ba2544591704e7c4adbe98da6a485a8b19230Kirill Grouchnikov
43c10ba2544591704e7c4adbe98da6a485a8b19230Kirill Grouchnikov            @Override
44c10ba2544591704e7c4adbe98da6a485a8b19230Kirill Grouchnikov            public void perform(UiController uiController, View view) {
45c10ba2544591704e7c4adbe98da6a485a8b19230Kirill Grouchnikov                uiController.loopMainThreadUntilIdle();
46c10ba2544591704e7c4adbe98da6a485a8b19230Kirill Grouchnikov
47c10ba2544591704e7c4adbe98da6a485a8b19230Kirill Grouchnikov                DrawerLayout drawerLayout = (DrawerLayout) view;
48c10ba2544591704e7c4adbe98da6a485a8b19230Kirill Grouchnikov                drawerLayout.openDrawer(drawerEdgeGravity);
49c10ba2544591704e7c4adbe98da6a485a8b19230Kirill Grouchnikov
50c10ba2544591704e7c4adbe98da6a485a8b19230Kirill Grouchnikov                // Wait for a full second to let the inner ViewDragHelper complete the operation
51c10ba2544591704e7c4adbe98da6a485a8b19230Kirill Grouchnikov                uiController.loopMainThreadForAtLeast(1000);
52c10ba2544591704e7c4adbe98da6a485a8b19230Kirill Grouchnikov            }
53c10ba2544591704e7c4adbe98da6a485a8b19230Kirill Grouchnikov        };
54c10ba2544591704e7c4adbe98da6a485a8b19230Kirill Grouchnikov    }
55c10ba2544591704e7c4adbe98da6a485a8b19230Kirill Grouchnikov
56c10ba2544591704e7c4adbe98da6a485a8b19230Kirill Grouchnikov    /**
57c10ba2544591704e7c4adbe98da6a485a8b19230Kirill Grouchnikov     * Closes the drawer at the specified edge gravity.
58c10ba2544591704e7c4adbe98da6a485a8b19230Kirill Grouchnikov     */
59c10ba2544591704e7c4adbe98da6a485a8b19230Kirill Grouchnikov    public static ViewAction closeDrawer(final int drawerEdgeGravity) {
60c10ba2544591704e7c4adbe98da6a485a8b19230Kirill Grouchnikov        return new ViewAction() {
61c10ba2544591704e7c4adbe98da6a485a8b19230Kirill Grouchnikov            @Override
62c10ba2544591704e7c4adbe98da6a485a8b19230Kirill Grouchnikov            public Matcher<View> getConstraints() {
63c10ba2544591704e7c4adbe98da6a485a8b19230Kirill Grouchnikov                return isAssignableFrom(DrawerLayout.class);
64c10ba2544591704e7c4adbe98da6a485a8b19230Kirill Grouchnikov            }
65c10ba2544591704e7c4adbe98da6a485a8b19230Kirill Grouchnikov
66c10ba2544591704e7c4adbe98da6a485a8b19230Kirill Grouchnikov            @Override
67c10ba2544591704e7c4adbe98da6a485a8b19230Kirill Grouchnikov            public String getDescription() {
68c10ba2544591704e7c4adbe98da6a485a8b19230Kirill Grouchnikov                return "Closes the drawer";
69c10ba2544591704e7c4adbe98da6a485a8b19230Kirill Grouchnikov            }
70c10ba2544591704e7c4adbe98da6a485a8b19230Kirill Grouchnikov
71c10ba2544591704e7c4adbe98da6a485a8b19230Kirill Grouchnikov            @Override
72c10ba2544591704e7c4adbe98da6a485a8b19230Kirill Grouchnikov            public void perform(UiController uiController, View view) {
73c10ba2544591704e7c4adbe98da6a485a8b19230Kirill Grouchnikov                uiController.loopMainThreadUntilIdle();
74c10ba2544591704e7c4adbe98da6a485a8b19230Kirill Grouchnikov
75c10ba2544591704e7c4adbe98da6a485a8b19230Kirill Grouchnikov                DrawerLayout drawerLayout = (DrawerLayout) view;
76c10ba2544591704e7c4adbe98da6a485a8b19230Kirill Grouchnikov                drawerLayout.closeDrawer(drawerEdgeGravity);
77c10ba2544591704e7c4adbe98da6a485a8b19230Kirill Grouchnikov
78c10ba2544591704e7c4adbe98da6a485a8b19230Kirill Grouchnikov                // Wait for a full second to let the inner ViewDragHelper complete the operation
79c10ba2544591704e7c4adbe98da6a485a8b19230Kirill Grouchnikov                uiController.loopMainThreadForAtLeast(1000);
80c10ba2544591704e7c4adbe98da6a485a8b19230Kirill Grouchnikov            }
81c10ba2544591704e7c4adbe98da6a485a8b19230Kirill Grouchnikov        };
82c10ba2544591704e7c4adbe98da6a485a8b19230Kirill Grouchnikov    }
83c10ba2544591704e7c4adbe98da6a485a8b19230Kirill Grouchnikov}
84