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