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