130c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov/*
230c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov * Copyright (C) 2015 The Android Open Source Project
330c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov *
430c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov * Licensed under the Apache License, Version 2.0 (the "License");
530c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov * you may not use this file except in compliance with the License.
630c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov * You may obtain a copy of the License at
730c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov *
830c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov *      http://www.apache.org/licenses/LICENSE-2.0
930c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov *
1030c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov * Unless required by applicable law or agreed to in writing, software
1130c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov * distributed under the License is distributed on an "AS IS" BASIS,
1230c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1330c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov * See the License for the specific language governing permissions and
1430c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov * limitations under the License.
1530c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov */
1630c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov
1721f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikovpackage android.support.v7.testutils;
1830c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov
1930c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikovimport static android.support.test.espresso.matcher.ViewMatchers.isAssignableFrom;
2030c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov
213eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banesimport android.support.annotation.Nullable;
223eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banesimport android.support.test.espresso.Espresso;
233eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banesimport android.support.test.espresso.IdlingResource;
2430c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikovimport android.support.test.espresso.UiController;
2530c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikovimport android.support.test.espresso.ViewAction;
2630c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikovimport android.support.v4.widget.DrawerLayout;
2730c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikovimport android.view.View;
2830c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov
2930c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikovimport org.hamcrest.Matcher;
3030c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov
3130c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikovpublic class DrawerLayoutActions {
3230c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov    /**
333eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes     * Drawer listener that serves as Espresso's {@link IdlingResource} and notifies the registered
343eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes     * callback when the drawer gets to STATE_IDLE state.
353eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes     */
363eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes    private static class CustomDrawerListener
373eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes            implements DrawerLayout.DrawerListener, IdlingResource {
383eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes        private int mCurrState = DrawerLayout.STATE_IDLE;
393eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes
403eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes        @Nullable private IdlingResource.ResourceCallback mCallback;
413eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes
423eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes        private boolean mNeedsIdle = false;
433eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes
443eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes        @Override
453eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes        public void registerIdleTransitionCallback(ResourceCallback resourceCallback) {
463eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes            mCallback = resourceCallback;
473eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes        }
483eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes
493eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes        @Override
503eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes        public String getName() {
513eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes            return "Drawer listener";
523eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes        }
533eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes
543eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes        @Override
553eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes        public boolean isIdleNow() {
563eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes            if (!mNeedsIdle) {
573eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes                return true;
583eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes            } else {
593eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes                return mCurrState == DrawerLayout.STATE_IDLE;
603eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes            }
613eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes        }
623eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes
633eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes        @Override
643eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes        public void onDrawerClosed(View drawer) {
653eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes            if (mCurrState == DrawerLayout.STATE_IDLE) {
663eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes                if (mCallback != null) {
673eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes                    mCallback.onTransitionToIdle();
683eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes                }
693eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes            }
703eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes        }
713eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes
723eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes        @Override
733eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes        public void onDrawerOpened(View drawer) {
743eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes            if (mCurrState == DrawerLayout.STATE_IDLE) {
753eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes                if (mCallback != null) {
763eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes                    mCallback.onTransitionToIdle();
773eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes                }
783eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes            }
793eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes        }
803eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes
813eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes        @Override
823eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes        public void onDrawerSlide(View drawer, float slideOffset) {
833eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes        }
843eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes
853eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes        @Override
863eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes        public void onDrawerStateChanged(int state) {
873eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes            mCurrState = state;
883eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes            if (state == DrawerLayout.STATE_IDLE) {
893eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes                if (mCallback != null) {
903eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes                    mCallback.onTransitionToIdle();
913eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes                }
923eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes            }
933eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes        }
943eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes    }
953eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes
963eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes    private abstract static class WrappedViewAction implements ViewAction {
973eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes    }
983eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes
993eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes    public static ViewAction wrap(final ViewAction baseAction) {
1003eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes        if (baseAction instanceof WrappedViewAction) {
1013eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes            throw new IllegalArgumentException("Don't wrap and already wrapped action");
1023eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes        }
1033eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes
1043eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes        return new WrappedViewAction() {
1053eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes            @Override
1063eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes            public Matcher<View> getConstraints() {
1073eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes                return baseAction.getConstraints();
1083eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes            }
1093eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes
1103eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes            @Override
1113eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes            public String getDescription() {
1123eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes                return baseAction.getDescription();
1133eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes            }
1143eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes
1153eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes            @Override
1163eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes            public final void perform(UiController uiController, View view) {
1173eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes                final DrawerLayout drawer = (DrawerLayout) view;
1183eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes                // Add a custom tracker listener
1193eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes                final CustomDrawerListener customListener = new CustomDrawerListener();
1203eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes                drawer.addDrawerListener(customListener);
1213eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes
1223eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes                // Note that we're running the following block in a try-finally construct. This
1233eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes                // is needed since some of the wrapped actions are going to throw (expected)
1243eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes                // exceptions. If that happens, we still need to clean up after ourselves to
1253eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes                // leave the system (Espesso) in a good state.
1263eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes                try {
1273eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes                    // Register our listener as idling resource so that Espresso waits until the
1283eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes                    // wrapped action results in the drawer getting to the STATE_IDLE state
1293eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes                    Espresso.registerIdlingResources(customListener);
1303eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes                    baseAction.perform(uiController, view);
1313eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes                    customListener.mNeedsIdle = true;
1323eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes                    uiController.loopMainThreadUntilIdle();
1333eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes                    customListener.mNeedsIdle = false;
1343eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes                } finally {
1353eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes                    // Unregister our idling resource
1363eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes                    Espresso.unregisterIdlingResources(customListener);
1373eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes                    // And remove our tracker listener from DrawerLayout
1383eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes                    drawer.removeDrawerListener(customListener);
1393eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes                }
1403eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes            }
1413eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes        };
1423eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes    }
1433eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes
1443eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes    /**
145431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov     * Opens the drawer at the specified edge gravity.
14630c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov     */
147ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas    public static ViewAction openDrawer(final int drawerEdgeGravity, final boolean animate) {
148ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas        return wrap(new ViewAction() {
149ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas            @Override
150ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas            public Matcher<View> getConstraints() {
151ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas                return isAssignableFrom(DrawerLayout.class);
152ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas            }
153ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas
154ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas            @Override
155ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas            public String getDescription() {
156ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas                return "Opens the drawer";
157ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas            }
158ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas
159ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas            @Override
160ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas            public void perform(UiController uiController, View view) {
161ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas                uiController.loopMainThreadUntilIdle();
162ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas
163ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas                DrawerLayout drawerLayout = (DrawerLayout) view;
164ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas                drawerLayout.openDrawer(drawerEdgeGravity, animate);
165ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas            }
166ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas        });
167ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas    }
168ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas
169ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas    /**
170ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas     * Opens the drawer at the specified edge gravity.
171ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas     */
17230c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov    public static ViewAction openDrawer(final int drawerEdgeGravity) {
1733eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes        return wrap(new ViewAction() {
17430c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov            @Override
17530c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov            public Matcher<View> getConstraints() {
17630c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov                return isAssignableFrom(DrawerLayout.class);
17730c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov            }
17830c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov
17930c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov            @Override
18030c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov            public String getDescription() {
18130c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov                return "Opens the drawer";
18230c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov            }
18330c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov
18430c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov            @Override
18530c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov            public void perform(UiController uiController, View view) {
18630c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov                uiController.loopMainThreadUntilIdle();
18730c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov
18830c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov                DrawerLayout drawerLayout = (DrawerLayout) view;
18930c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov                drawerLayout.openDrawer(drawerEdgeGravity);
19030c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov            }
1913eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes        });
19230c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov    }
19330c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov
19430c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov    /**
195431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov     * Opens the drawer.
196431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov     */
197431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov    public static ViewAction openDrawer(final View drawerView) {
1983eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes        return wrap(new ViewAction() {
199431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov            @Override
200431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov            public Matcher<View> getConstraints() {
201431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov                return isAssignableFrom(DrawerLayout.class);
202431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov            }
203431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov
204431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov            @Override
205431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov            public String getDescription() {
206431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov                return "Opens the drawer";
207431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov            }
208431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov
209431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov            @Override
210431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov            public void perform(UiController uiController, View view) {
211431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov                uiController.loopMainThreadUntilIdle();
212431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov
213431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov                DrawerLayout drawerLayout = (DrawerLayout) view;
214431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov                drawerLayout.openDrawer(drawerView);
215431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov            }
2163eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes        });
217431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov    }
218431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov
219431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov    /**
220431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov     * Closes the drawer at the specified edge gravity.
22130c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov     */
22230c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov    public static ViewAction closeDrawer(final int drawerEdgeGravity) {
2233eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes        return wrap(new ViewAction() {
22430c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov            @Override
22530c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov            public Matcher<View> getConstraints() {
22630c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov                return isAssignableFrom(DrawerLayout.class);
22730c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov            }
22830c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov
22930c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov            @Override
23030c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov            public String getDescription() {
23130c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov                return "Closes the drawer";
23230c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov            }
23330c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov
23430c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov            @Override
23530c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov            public void perform(UiController uiController, View view) {
23630c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov                uiController.loopMainThreadUntilIdle();
23730c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov
23830c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov                DrawerLayout drawerLayout = (DrawerLayout) view;
23930c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov                drawerLayout.closeDrawer(drawerEdgeGravity);
24030c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov            }
2413eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes        });
24230c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov    }
243431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov
244431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov    /**
245ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas     * Closes the drawer at the specified edge gravity.
246ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas     */
247ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas    public static ViewAction closeDrawer(final int drawerEdgeGravity, final boolean animate) {
248ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas        return wrap(new ViewAction() {
249ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas            @Override
250ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas            public Matcher<View> getConstraints() {
251ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas                return isAssignableFrom(DrawerLayout.class);
252ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas            }
253ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas
254ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas            @Override
255ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas            public String getDescription() {
256ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas                return "Closes the drawer";
257ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas            }
258ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas
259ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas            @Override
260ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas            public void perform(UiController uiController, View view) {
261ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas                uiController.loopMainThreadUntilIdle();
262ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas
263ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas                DrawerLayout drawerLayout = (DrawerLayout) view;
264ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas                drawerLayout.closeDrawer(drawerEdgeGravity, animate);
265ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas            }
266ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas        });
267ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas    }
268ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas
269ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas    /**
270431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov     * Closes the drawer.
271431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov     */
272431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov    public static ViewAction closeDrawer(final View drawerView) {
2733eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes        return wrap(new ViewAction() {
274431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov            @Override
275431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov            public Matcher<View> getConstraints() {
276431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov                return isAssignableFrom(DrawerLayout.class);
277431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov            }
278431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov
279431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov            @Override
280431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov            public String getDescription() {
281431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov                return "Closes the drawer";
282431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov            }
283431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov
284431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov            @Override
285431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov            public void perform(UiController uiController, View view) {
286431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov                uiController.loopMainThreadUntilIdle();
287431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov
288431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov                DrawerLayout drawerLayout = (DrawerLayout) view;
289431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov                drawerLayout.closeDrawer(drawerView);
290431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov            }
2913eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes        });
292431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov    }
293431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov
294431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov    /**
295431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov     * Sets the lock mode for the drawer at the specified edge gravity.
296431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov     */
297431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov    public static ViewAction setDrawerLockMode(final int lockMode, final int drawerEdgeGravity) {
298df1317cf003b4b6c16f1657018c91519d279f13bKirill Grouchnikov        return wrap(new ViewAction() {
299431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov            @Override
300431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov            public Matcher<View> getConstraints() {
301431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov                return isAssignableFrom(DrawerLayout.class);
302431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov            }
303431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov
304431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov            @Override
305431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov            public String getDescription() {
306431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov                return "Sets drawer lock mode";
307431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov            }
308431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov
309431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov            @Override
310431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov            public void perform(UiController uiController, View view) {
311431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov                uiController.loopMainThreadUntilIdle();
312431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov
313431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov                DrawerLayout drawerLayout = (DrawerLayout) view;
314431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov                drawerLayout.setDrawerLockMode(lockMode, drawerEdgeGravity);
315431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov
316431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov                uiController.loopMainThreadUntilIdle();
317431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov            }
318df1317cf003b4b6c16f1657018c91519d279f13bKirill Grouchnikov        });
319431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov    }
320431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov
321431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov    /**
322431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov     * Sets the lock mode for the drawer.
323431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov     */
324431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov    public static ViewAction setDrawerLockMode(final int lockMode, final View drawerView) {
325df1317cf003b4b6c16f1657018c91519d279f13bKirill Grouchnikov        return wrap(new ViewAction() {
326431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov            @Override
327431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov            public Matcher<View> getConstraints() {
328431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov                return isAssignableFrom(DrawerLayout.class);
329431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov            }
330431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov
331431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov            @Override
332431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov            public String getDescription() {
333431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov                return "Sets drawer lock mode";
334431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov            }
335431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov
336431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov            @Override
337431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov            public void perform(UiController uiController, View view) {
338431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov                uiController.loopMainThreadUntilIdle();
339431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov
340431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov                DrawerLayout drawerLayout = (DrawerLayout) view;
341431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov                drawerLayout.setDrawerLockMode(lockMode, drawerView);
342431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov
343431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov                uiController.loopMainThreadUntilIdle();
344431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov            }
345df1317cf003b4b6c16f1657018c91519d279f13bKirill Grouchnikov        });
346431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov    }
34730c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov}
348