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