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
17ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikaspackage androidx.appcompat.testutils;
1830c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov
1930c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikovimport static android.support.test.espresso.matcher.ViewMatchers.isAssignableFrom;
2030c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov
213eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banesimport android.support.test.espresso.Espresso;
223eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banesimport android.support.test.espresso.IdlingResource;
2330c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikovimport android.support.test.espresso.UiController;
2430c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikovimport android.support.test.espresso.ViewAction;
2530c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikovimport android.view.View;
2630c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov
273de8a4e8305507475d7890205184946a25cf45e7Aurimas Liutikasimport androidx.annotation.Nullable;
283de8a4e8305507475d7890205184946a25cf45e7Aurimas Liutikasimport androidx.drawerlayout.widget.DrawerLayout;
293de8a4e8305507475d7890205184946a25cf45e7Aurimas Liutikas
3030c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikovimport org.hamcrest.Matcher;
3130c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov
3230c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikovpublic class DrawerLayoutActions {
3330c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov    /**
343eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes     * Drawer listener that serves as Espresso's {@link IdlingResource} and notifies the registered
353eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes     * callback when the drawer gets to STATE_IDLE state.
363eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes     */
373eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes    private static class CustomDrawerListener
383eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes            implements DrawerLayout.DrawerListener, IdlingResource {
393eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes        private int mCurrState = DrawerLayout.STATE_IDLE;
403eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes
413eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes        @Nullable private IdlingResource.ResourceCallback mCallback;
423eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes
433eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes        private boolean mNeedsIdle = false;
443eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes
453eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes        @Override
463eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes        public void registerIdleTransitionCallback(ResourceCallback resourceCallback) {
473eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes            mCallback = resourceCallback;
483eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes        }
493eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes
503eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes        @Override
513eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes        public String getName() {
523eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes            return "Drawer listener";
533eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes        }
543eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes
553eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes        @Override
563eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes        public boolean isIdleNow() {
573eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes            if (!mNeedsIdle) {
583eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes                return true;
593eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes            } else {
603eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes                return mCurrState == DrawerLayout.STATE_IDLE;
613eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes            }
623eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes        }
633eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes
643eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes        @Override
653eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes        public void onDrawerClosed(View drawer) {
663eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes            if (mCurrState == DrawerLayout.STATE_IDLE) {
673eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes                if (mCallback != null) {
683eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes                    mCallback.onTransitionToIdle();
693eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes                }
703eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes            }
713eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes        }
723eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes
733eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes        @Override
743eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes        public void onDrawerOpened(View drawer) {
753eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes            if (mCurrState == DrawerLayout.STATE_IDLE) {
763eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes                if (mCallback != null) {
773eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes                    mCallback.onTransitionToIdle();
783eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes                }
793eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes            }
803eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes        }
813eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes
823eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes        @Override
833eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes        public void onDrawerSlide(View drawer, float slideOffset) {
843eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes        }
853eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes
863eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes        @Override
873eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes        public void onDrawerStateChanged(int state) {
883eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes            mCurrState = state;
893eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes            if (state == DrawerLayout.STATE_IDLE) {
903eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes                if (mCallback != null) {
913eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes                    mCallback.onTransitionToIdle();
923eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes                }
933eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes            }
943eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes        }
953eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes    }
963eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes
973eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes    private abstract static class WrappedViewAction implements ViewAction {
983eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes    }
993eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes
1003eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes    public static ViewAction wrap(final ViewAction baseAction) {
1013eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes        if (baseAction instanceof WrappedViewAction) {
1023eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes            throw new IllegalArgumentException("Don't wrap and already wrapped action");
1033eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes        }
1043eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes
1053eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes        return new WrappedViewAction() {
1063eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes            @Override
1073eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes            public Matcher<View> getConstraints() {
1083eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes                return baseAction.getConstraints();
1093eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes            }
1103eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes
1113eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes            @Override
1123eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes            public String getDescription() {
1133eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes                return baseAction.getDescription();
1143eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes            }
1153eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes
1163eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes            @Override
1173eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes            public final void perform(UiController uiController, View view) {
1183eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes                final DrawerLayout drawer = (DrawerLayout) view;
1193eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes                // Add a custom tracker listener
1203eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes                final CustomDrawerListener customListener = new CustomDrawerListener();
1213eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes                drawer.addDrawerListener(customListener);
1223eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes
1233eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes                // Note that we're running the following block in a try-finally construct. This
1243eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes                // is needed since some of the wrapped actions are going to throw (expected)
1253eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes                // exceptions. If that happens, we still need to clean up after ourselves to
1263eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes                // leave the system (Espesso) in a good state.
1273eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes                try {
1283eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes                    // Register our listener as idling resource so that Espresso waits until the
1293eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes                    // wrapped action results in the drawer getting to the STATE_IDLE state
1303eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes                    Espresso.registerIdlingResources(customListener);
1313eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes                    baseAction.perform(uiController, view);
1323eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes                    customListener.mNeedsIdle = true;
1333eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes                    uiController.loopMainThreadUntilIdle();
1343eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes                    customListener.mNeedsIdle = false;
1353eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes                } finally {
1363eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes                    // Unregister our idling resource
1373eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes                    Espresso.unregisterIdlingResources(customListener);
1383eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes                    // And remove our tracker listener from DrawerLayout
1393eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes                    drawer.removeDrawerListener(customListener);
1403eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes                }
1413eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes            }
1423eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes        };
1433eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes    }
1443eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes
1453eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes    /**
146431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov     * Opens the drawer at the specified edge gravity.
14730c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov     */
148ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas    public static ViewAction openDrawer(final int drawerEdgeGravity, final boolean animate) {
149ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas        return wrap(new ViewAction() {
150ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas            @Override
151ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas            public Matcher<View> getConstraints() {
152ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas                return isAssignableFrom(DrawerLayout.class);
153ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas            }
154ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas
155ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas            @Override
156ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas            public String getDescription() {
157ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas                return "Opens the drawer";
158ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas            }
159ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas
160ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas            @Override
161ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas            public void perform(UiController uiController, View view) {
162ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas                uiController.loopMainThreadUntilIdle();
163ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas
164ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas                DrawerLayout drawerLayout = (DrawerLayout) view;
165ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas                drawerLayout.openDrawer(drawerEdgeGravity, animate);
166ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas            }
167ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas        });
168ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas    }
169ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas
170ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas    /**
171ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas     * Opens the drawer at the specified edge gravity.
172ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas     */
17330c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov    public static ViewAction openDrawer(final int drawerEdgeGravity) {
1743eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes        return wrap(new ViewAction() {
17530c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov            @Override
17630c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov            public Matcher<View> getConstraints() {
17730c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov                return isAssignableFrom(DrawerLayout.class);
17830c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov            }
17930c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov
18030c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov            @Override
18130c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov            public String getDescription() {
18230c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov                return "Opens the drawer";
18330c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov            }
18430c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov
18530c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov            @Override
18630c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov            public void perform(UiController uiController, View view) {
18730c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov                uiController.loopMainThreadUntilIdle();
18830c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov
18930c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov                DrawerLayout drawerLayout = (DrawerLayout) view;
19030c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov                drawerLayout.openDrawer(drawerEdgeGravity);
19130c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov            }
1923eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes        });
19330c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov    }
19430c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov
19530c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov    /**
196431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov     * Opens the drawer.
197431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov     */
198431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov    public static ViewAction openDrawer(final View drawerView) {
1993eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes        return wrap(new ViewAction() {
200431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov            @Override
201431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov            public Matcher<View> getConstraints() {
202431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov                return isAssignableFrom(DrawerLayout.class);
203431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov            }
204431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov
205431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov            @Override
206431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov            public String getDescription() {
207431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov                return "Opens the drawer";
208431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov            }
209431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov
210431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov            @Override
211431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov            public void perform(UiController uiController, View view) {
212431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov                uiController.loopMainThreadUntilIdle();
213431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov
214431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov                DrawerLayout drawerLayout = (DrawerLayout) view;
215431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov                drawerLayout.openDrawer(drawerView);
216431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov            }
2173eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes        });
218431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov    }
219431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov
220431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov    /**
221431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov     * Closes the drawer at the specified edge gravity.
22230c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov     */
22330c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov    public static ViewAction closeDrawer(final int drawerEdgeGravity) {
2243eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes        return wrap(new ViewAction() {
22530c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov            @Override
22630c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov            public Matcher<View> getConstraints() {
22730c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov                return isAssignableFrom(DrawerLayout.class);
22830c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov            }
22930c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov
23030c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov            @Override
23130c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov            public String getDescription() {
23230c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov                return "Closes the drawer";
23330c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov            }
23430c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov
23530c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov            @Override
23630c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov            public void perform(UiController uiController, View view) {
23730c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov                uiController.loopMainThreadUntilIdle();
23830c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov
23930c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov                DrawerLayout drawerLayout = (DrawerLayout) view;
24030c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov                drawerLayout.closeDrawer(drawerEdgeGravity);
24130c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov            }
2423eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes        });
24330c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov    }
244431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov
245431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov    /**
246ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas     * Closes the drawer at the specified edge gravity.
247ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas     */
248ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas    public static ViewAction closeDrawer(final int drawerEdgeGravity, final boolean animate) {
249ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas        return wrap(new ViewAction() {
250ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas            @Override
251ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas            public Matcher<View> getConstraints() {
252ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas                return isAssignableFrom(DrawerLayout.class);
253ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas            }
254ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas
255ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas            @Override
256ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas            public String getDescription() {
257ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas                return "Closes the drawer";
258ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas            }
259ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas
260ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas            @Override
261ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas            public void perform(UiController uiController, View view) {
262ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas                uiController.loopMainThreadUntilIdle();
263ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas
264ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas                DrawerLayout drawerLayout = (DrawerLayout) view;
265ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas                drawerLayout.closeDrawer(drawerEdgeGravity, animate);
266ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas            }
267ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas        });
268ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas    }
269ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas
270ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas    /**
271431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov     * Closes the drawer.
272431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov     */
273431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov    public static ViewAction closeDrawer(final View drawerView) {
2743eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes        return wrap(new ViewAction() {
275431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov            @Override
276431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov            public Matcher<View> getConstraints() {
277431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov                return isAssignableFrom(DrawerLayout.class);
278431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov            }
279431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov
280431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov            @Override
281431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov            public String getDescription() {
282431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov                return "Closes the drawer";
283431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov            }
284431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov
285431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov            @Override
286431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov            public void perform(UiController uiController, View view) {
287431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov                uiController.loopMainThreadUntilIdle();
288431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov
289431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov                DrawerLayout drawerLayout = (DrawerLayout) view;
290431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov                drawerLayout.closeDrawer(drawerView);
291431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov            }
2923eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes        });
293431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov    }
294431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov
295431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov    /**
296431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov     * Sets the lock mode for the drawer at the specified edge gravity.
297431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov     */
298431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov    public static ViewAction setDrawerLockMode(final int lockMode, final int drawerEdgeGravity) {
299df1317cf003b4b6c16f1657018c91519d279f13bKirill Grouchnikov        return wrap(new ViewAction() {
300431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov            @Override
301431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov            public Matcher<View> getConstraints() {
302431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov                return isAssignableFrom(DrawerLayout.class);
303431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov            }
304431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov
305431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov            @Override
306431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov            public String getDescription() {
307431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov                return "Sets drawer lock mode";
308431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov            }
309431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov
310431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov            @Override
311431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov            public void perform(UiController uiController, View view) {
312431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov                uiController.loopMainThreadUntilIdle();
313431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov
314431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov                DrawerLayout drawerLayout = (DrawerLayout) view;
315431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov                drawerLayout.setDrawerLockMode(lockMode, drawerEdgeGravity);
316431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov
317431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov                uiController.loopMainThreadUntilIdle();
318431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov            }
319df1317cf003b4b6c16f1657018c91519d279f13bKirill Grouchnikov        });
320431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov    }
321431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov
322431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov    /**
323431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov     * Sets the lock mode for the drawer.
324431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov     */
325431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov    public static ViewAction setDrawerLockMode(final int lockMode, final View drawerView) {
326df1317cf003b4b6c16f1657018c91519d279f13bKirill Grouchnikov        return wrap(new ViewAction() {
327431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov            @Override
328431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov            public Matcher<View> getConstraints() {
329431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov                return isAssignableFrom(DrawerLayout.class);
330431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov            }
331431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov
332431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov            @Override
333431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov            public String getDescription() {
334431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov                return "Sets drawer lock mode";
335431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov            }
336431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov
337431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov            @Override
338431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov            public void perform(UiController uiController, View view) {
339431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov                uiController.loopMainThreadUntilIdle();
340431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov
341431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov                DrawerLayout drawerLayout = (DrawerLayout) view;
342431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov                drawerLayout.setDrawerLockMode(lockMode, drawerView);
343431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov
344431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov                uiController.loopMainThreadUntilIdle();
345431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov            }
346df1317cf003b4b6c16f1657018c91519d279f13bKirill Grouchnikov        });
347431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov    }
34830c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov}
349