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 */ 16522ead667d2efbd7675b89b11aec769ec37baa20Alan Viverette 1730c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikovpackage android.support.v7.app; 1830c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov 19754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikasimport static android.support.test.espresso.Espresso.onView; 20754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikasimport static android.support.test.espresso.matcher.ViewMatchers.withId; 21754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikasimport static android.support.v7.testutils.DrawerLayoutActions.closeDrawer; 22754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikasimport static android.support.v7.testutils.DrawerLayoutActions.openDrawer; 23754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikasimport static android.support.v7.testutils.DrawerLayoutActions.setDrawerLockMode; 24754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikasimport static android.support.v7.testutils.DrawerLayoutActions.wrap; 25754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikasimport static android.support.v7.testutils.TestUtilsMatchers.inAscendingOrder; 26754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikasimport static android.support.v7.testutils.TestUtilsMatchers.inDescendingOrder; 27754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikasimport static android.support.v7.testutils.TestUtilsMatchers.inRange; 28754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikas 29754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikasimport static org.hamcrest.MatcherAssert.assertThat; 30754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikasimport static org.junit.Assert.assertEquals; 31754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikasimport static org.junit.Assert.assertFalse; 32754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikasimport static org.junit.Assert.assertTrue; 33754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikasimport static org.junit.Assert.fail; 34754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikasimport static org.mockito.Mockito.any; 35754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikasimport static org.mockito.Mockito.atLeastOnce; 36754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikasimport static org.mockito.Mockito.eq; 37754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikasimport static org.mockito.Mockito.inOrder; 38754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikasimport static org.mockito.Mockito.mock; 39754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikasimport static org.mockito.Mockito.never; 40754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikasimport static org.mockito.Mockito.times; 41754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikasimport static org.mockito.Mockito.verify; 42754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikas 4324391daa4e5831395924e2f48df86e19294cc211Chris Banesimport android.os.Build; 44bb2fd572a11bcd12f767b3ecab6fbdf9112279afKirill Grouchnikovimport android.support.test.espresso.action.GeneralLocation; 45bb2fd572a11bcd12f767b3ecab6fbdf9112279afKirill Grouchnikovimport android.support.test.espresso.action.GeneralSwipeAction; 4624391daa4e5831395924e2f48df86e19294cc211Chris Banesimport android.support.test.espresso.action.Press; 47bb2fd572a11bcd12f767b3ecab6fbdf9112279afKirill Grouchnikovimport android.support.test.espresso.action.Swipe; 48522ead667d2efbd7675b89b11aec769ec37baa20Alan Viveretteimport android.support.test.filters.FlakyTest; 494bb57b2c7c5e8fa607119bd5089535d5862cb979Aurimas Liutikasimport android.support.test.filters.LargeTest; 50754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikasimport android.support.test.filters.MediumTest; 51522ead667d2efbd7675b89b11aec769ec37baa20Alan Viveretteimport android.support.test.filters.Suppress; 528d3b808ab4720ef4e9d58f2bba4e31f741d3898cAurimas Liutikasimport android.support.test.rule.ActivityTestRule; 538d3b808ab4720ef4e9d58f2bba4e31f741d3898cAurimas Liutikasimport android.support.test.runner.AndroidJUnit4; 5430c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikovimport android.support.v4.view.GravityCompat; 5521f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikovimport android.support.v4.widget.DrawerLayout; 5630c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikovimport android.support.v7.appcompat.test.R; 5724391daa4e5831395924e2f48df86e19294cc211Chris Banesimport android.support.v7.custom.CustomDrawerLayout; 583eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banesimport android.view.View; 59754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikas 603eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banesimport org.junit.Before; 618d3b808ab4720ef4e9d58f2bba4e31f741d3898cAurimas Liutikasimport org.junit.Rule; 623eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banesimport org.junit.Test; 638d3b808ab4720ef4e9d58f2bba4e31f741d3898cAurimas Liutikasimport org.junit.runner.RunWith; 6421f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikovimport org.mockito.ArgumentCaptor; 6521f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikovimport org.mockito.InOrder; 6630c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov 678d3b808ab4720ef4e9d58f2bba4e31f741d3898cAurimas Liutikas@RunWith(AndroidJUnit4.class) 688d3b808ab4720ef4e9d58f2bba4e31f741d3898cAurimas Liutikaspublic class DrawerLayoutTest { 698d3b808ab4720ef4e9d58f2bba4e31f741d3898cAurimas Liutikas @Rule 708d3b808ab4720ef4e9d58f2bba4e31f741d3898cAurimas Liutikas public final ActivityTestRule<DrawerLayoutActivity> mActivityTestRule = 718d3b808ab4720ef4e9d58f2bba4e31f741d3898cAurimas Liutikas new ActivityTestRule<DrawerLayoutActivity>(DrawerLayoutActivity.class); 728d3b808ab4720ef4e9d58f2bba4e31f741d3898cAurimas Liutikas 7379bdaf9f66d9000feb54d8f4011fc412dd7829bcKirill Grouchnikov private CustomDrawerLayout mDrawerLayout; 7479bdaf9f66d9000feb54d8f4011fc412dd7829bcKirill Grouchnikov 7579bdaf9f66d9000feb54d8f4011fc412dd7829bcKirill Grouchnikov private View mStartDrawer; 7679bdaf9f66d9000feb54d8f4011fc412dd7829bcKirill Grouchnikov 7779bdaf9f66d9000feb54d8f4011fc412dd7829bcKirill Grouchnikov private View mContentView; 7830c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov 7924391daa4e5831395924e2f48df86e19294cc211Chris Banes @Before 80431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov public void setUp() { 81431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov final DrawerLayoutActivity activity = mActivityTestRule.getActivity(); 8279bdaf9f66d9000feb54d8f4011fc412dd7829bcKirill Grouchnikov mDrawerLayout = (CustomDrawerLayout) activity.findViewById(R.id.drawer_layout); 8379bdaf9f66d9000feb54d8f4011fc412dd7829bcKirill Grouchnikov mStartDrawer = mDrawerLayout.findViewById(R.id.start_drawer); 8479bdaf9f66d9000feb54d8f4011fc412dd7829bcKirill Grouchnikov mContentView = mDrawerLayout.findViewById(R.id.content); 8530c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov 8630c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov // Close the drawer to reset the state for the next test 873eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes onView(withId(R.id.drawer_layout)).perform(closeDrawer(GravityCompat.START)); 8830c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov } 8930c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov 9021f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov // Tests for opening and closing the drawer and checking the open state 9121f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov 9221f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov @Test 93e6cf359406cd7baaa0659b54c1b7d8ac45db122aAurimas Liutikas @LargeTest 94bb2fd572a11bcd12f767b3ecab6fbdf9112279afKirill Grouchnikov public void testDrawerOpenCloseViaAPI() { 9530c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov assertFalse("Initial state", mDrawerLayout.isDrawerOpen(GravityCompat.START)); 9630c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov 97bb2fd572a11bcd12f767b3ecab6fbdf9112279afKirill Grouchnikov for (int i = 0; i < 5; i++) { 983eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes onView(withId(R.id.drawer_layout)).perform(openDrawer(GravityCompat.START)); 99bb2fd572a11bcd12f767b3ecab6fbdf9112279afKirill Grouchnikov assertTrue("Opened drawer #" + i, mDrawerLayout.isDrawerOpen(GravityCompat.START)); 10030c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov 1013eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes onView(withId(R.id.drawer_layout)).perform(closeDrawer(GravityCompat.START)); 102bb2fd572a11bcd12f767b3ecab6fbdf9112279afKirill Grouchnikov assertFalse("Closed drawer #" + i, mDrawerLayout.isDrawerOpen(GravityCompat.START)); 103bb2fd572a11bcd12f767b3ecab6fbdf9112279afKirill Grouchnikov } 104bb2fd572a11bcd12f767b3ecab6fbdf9112279afKirill Grouchnikov } 10530c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov 106bb2fd572a11bcd12f767b3ecab6fbdf9112279afKirill Grouchnikov @Test 107431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov @MediumTest 108ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas public void testDrawerOpenCloseNoAnimationViaAPI() { 109ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas assertFalse("Initial state", mDrawerLayout.isDrawerOpen(GravityCompat.START)); 110ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas 111ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas for (int i = 0; i < 5; i++) { 112ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas onView(withId(R.id.drawer_layout)).perform(openDrawer(GravityCompat.START, false)); 113ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas assertTrue("Opened drawer #" + i, mDrawerLayout.isDrawerOpen(GravityCompat.START)); 114ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas 115ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas onView(withId(R.id.drawer_layout)).perform(closeDrawer(GravityCompat.START, false)); 116ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas assertFalse("Closed drawer #" + i, mDrawerLayout.isDrawerOpen(GravityCompat.START)); 117ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas } 118ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas } 119ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas 120ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas @Test 121e6cf359406cd7baaa0659b54c1b7d8ac45db122aAurimas Liutikas @LargeTest 12242e7d6fafcde7bfe261dd7d8d75ee53ca0cd6790Aurimas Liutikas public void testDrawerOpenCloseFocus() throws Throwable { 12385ac705f8f1e9f1a6b4b7bb2bda72ad13eb303e4Yuichi Araki assertFalse("Initial state", mDrawerLayout.isDrawerOpen(GravityCompat.START)); 12485ac705f8f1e9f1a6b4b7bb2bda72ad13eb303e4Yuichi Araki 12542e7d6fafcde7bfe261dd7d8d75ee53ca0cd6790Aurimas Liutikas mActivityTestRule.runOnUiThread(new Runnable() { 12685ac705f8f1e9f1a6b4b7bb2bda72ad13eb303e4Yuichi Araki @Override 12785ac705f8f1e9f1a6b4b7bb2bda72ad13eb303e4Yuichi Araki public void run() { 12885ac705f8f1e9f1a6b4b7bb2bda72ad13eb303e4Yuichi Araki mContentView.setFocusableInTouchMode(true); 12985ac705f8f1e9f1a6b4b7bb2bda72ad13eb303e4Yuichi Araki mContentView.setOnFocusChangeListener(new View.OnFocusChangeListener() { 13085ac705f8f1e9f1a6b4b7bb2bda72ad13eb303e4Yuichi Araki @Override 13185ac705f8f1e9f1a6b4b7bb2bda72ad13eb303e4Yuichi Araki public void onFocusChange(View v, boolean hasFocus) { 13285ac705f8f1e9f1a6b4b7bb2bda72ad13eb303e4Yuichi Araki fail("Unnecessary focus change"); 13385ac705f8f1e9f1a6b4b7bb2bda72ad13eb303e4Yuichi Araki } 13485ac705f8f1e9f1a6b4b7bb2bda72ad13eb303e4Yuichi Araki }); 13585ac705f8f1e9f1a6b4b7bb2bda72ad13eb303e4Yuichi Araki } 13685ac705f8f1e9f1a6b4b7bb2bda72ad13eb303e4Yuichi Araki }); 13785ac705f8f1e9f1a6b4b7bb2bda72ad13eb303e4Yuichi Araki 13885ac705f8f1e9f1a6b4b7bb2bda72ad13eb303e4Yuichi Araki onView(withId(R.id.drawer_layout)).perform(openDrawer(GravityCompat.START)); 13985ac705f8f1e9f1a6b4b7bb2bda72ad13eb303e4Yuichi Araki assertTrue("Opened drawer", mDrawerLayout.isDrawerOpen(GravityCompat.START)); 14085ac705f8f1e9f1a6b4b7bb2bda72ad13eb303e4Yuichi Araki 14185ac705f8f1e9f1a6b4b7bb2bda72ad13eb303e4Yuichi Araki onView(withId(R.id.drawer_layout)).perform(closeDrawer(GravityCompat.START)); 14285ac705f8f1e9f1a6b4b7bb2bda72ad13eb303e4Yuichi Araki assertFalse("Closed drawer", mDrawerLayout.isDrawerOpen(GravityCompat.START)); 14385ac705f8f1e9f1a6b4b7bb2bda72ad13eb303e4Yuichi Araki } 14485ac705f8f1e9f1a6b4b7bb2bda72ad13eb303e4Yuichi Araki 14585ac705f8f1e9f1a6b4b7bb2bda72ad13eb303e4Yuichi Araki @Test 146e6cf359406cd7baaa0659b54c1b7d8ac45db122aAurimas Liutikas @LargeTest 147bb2fd572a11bcd12f767b3ecab6fbdf9112279afKirill Grouchnikov public void testDrawerOpenCloseWithRedundancyViaAPI() { 148bb2fd572a11bcd12f767b3ecab6fbdf9112279afKirill Grouchnikov assertFalse("Initial state", mDrawerLayout.isDrawerOpen(GravityCompat.START)); 14930c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov 150bb2fd572a11bcd12f767b3ecab6fbdf9112279afKirill Grouchnikov for (int i = 0; i < 5; i++) { 1513eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes onView(withId(R.id.drawer_layout)).perform(openDrawer(GravityCompat.START)); 152bb2fd572a11bcd12f767b3ecab6fbdf9112279afKirill Grouchnikov assertTrue("Opened drawer #" + i, mDrawerLayout.isDrawerOpen(GravityCompat.START)); 153bb2fd572a11bcd12f767b3ecab6fbdf9112279afKirill Grouchnikov 154bb2fd572a11bcd12f767b3ecab6fbdf9112279afKirill Grouchnikov // Try opening the drawer when it's already opened 1553eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes onView(withId(R.id.drawer_layout)).perform(openDrawer(GravityCompat.START)); 156bb2fd572a11bcd12f767b3ecab6fbdf9112279afKirill Grouchnikov assertTrue("Opened drawer is still opened #" + i, 157bb2fd572a11bcd12f767b3ecab6fbdf9112279afKirill Grouchnikov mDrawerLayout.isDrawerOpen(GravityCompat.START)); 158bb2fd572a11bcd12f767b3ecab6fbdf9112279afKirill Grouchnikov 1593eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes onView(withId(R.id.drawer_layout)).perform(closeDrawer(GravityCompat.START)); 160bb2fd572a11bcd12f767b3ecab6fbdf9112279afKirill Grouchnikov assertFalse("Closed drawer #" + i, mDrawerLayout.isDrawerOpen(GravityCompat.START)); 161bb2fd572a11bcd12f767b3ecab6fbdf9112279afKirill Grouchnikov 162bb2fd572a11bcd12f767b3ecab6fbdf9112279afKirill Grouchnikov // Try closing the drawer when it's already closed 1633eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes onView(withId(R.id.drawer_layout)).perform(closeDrawer(GravityCompat.START)); 164bb2fd572a11bcd12f767b3ecab6fbdf9112279afKirill Grouchnikov assertFalse("Closed drawer is still closed #" + i, 165bb2fd572a11bcd12f767b3ecab6fbdf9112279afKirill Grouchnikov mDrawerLayout.isDrawerOpen(GravityCompat.START)); 166bb2fd572a11bcd12f767b3ecab6fbdf9112279afKirill Grouchnikov } 167bb2fd572a11bcd12f767b3ecab6fbdf9112279afKirill Grouchnikov } 168bb2fd572a11bcd12f767b3ecab6fbdf9112279afKirill Grouchnikov 169bb2fd572a11bcd12f767b3ecab6fbdf9112279afKirill Grouchnikov @Test 170431713be0958fd0f4d878f5f25755575191fb8baKirill Grouchnikov @MediumTest 171ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas public void testDrawerOpenCloseNoAnimationWithRedundancyViaAPI() { 172ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas assertFalse("Initial state", mDrawerLayout.isDrawerOpen(GravityCompat.START)); 173ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas 174ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas for (int i = 0; i < 5; i++) { 175ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas onView(withId(R.id.drawer_layout)).perform(openDrawer(GravityCompat.START, false)); 176ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas assertTrue("Opened drawer #" + i, mDrawerLayout.isDrawerOpen(GravityCompat.START)); 177ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas 178ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas // Try opening the drawer when it's already opened 179ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas onView(withId(R.id.drawer_layout)).perform(openDrawer(GravityCompat.START, false)); 180ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas assertTrue("Opened drawer is still opened #" + i, 181ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas mDrawerLayout.isDrawerOpen(GravityCompat.START)); 182ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas 183ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas onView(withId(R.id.drawer_layout)).perform(closeDrawer(GravityCompat.START, false)); 184ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas assertFalse("Closed drawer #" + i, mDrawerLayout.isDrawerOpen(GravityCompat.START)); 185ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas 186ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas // Try closing the drawer when it's already closed 187ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas onView(withId(R.id.drawer_layout)).perform(closeDrawer(GravityCompat.START, false)); 188ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas assertFalse("Closed drawer is still closed #" + i, 189ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas mDrawerLayout.isDrawerOpen(GravityCompat.START)); 190ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas } 191ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas } 192ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas 193ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas @Test 194e6cf359406cd7baaa0659b54c1b7d8ac45db122aAurimas Liutikas @LargeTest 195bb2fd572a11bcd12f767b3ecab6fbdf9112279afKirill Grouchnikov public void testDrawerOpenCloseViaSwipes() { 196bb2fd572a11bcd12f767b3ecab6fbdf9112279afKirill Grouchnikov assertFalse("Initial state", mDrawerLayout.isDrawerOpen(GravityCompat.START)); 197bb2fd572a11bcd12f767b3ecab6fbdf9112279afKirill Grouchnikov 1983eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes // Note that we're using GeneralSwipeAction instead of swipeLeft() / swipeRight(). 1993eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes // Those Espresso actions use edge fuzzying which doesn't work well with edge-based 2003eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes // detection of swiping the drawers open in DrawerLayout. 2013eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes // It's critically important to wrap the GeneralSwipeAction to "wait" until the 2023eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes // DrawerLayout has settled to STATE_IDLE state before continuing to query the drawer 2033eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes // open / close state. This is done in DrawerLayoutActions.wrap method. 204bb2fd572a11bcd12f767b3ecab6fbdf9112279afKirill Grouchnikov for (int i = 0; i < 5; i++) { 205bb2fd572a11bcd12f767b3ecab6fbdf9112279afKirill Grouchnikov onView(withId(R.id.drawer_layout)).perform( 2063eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes wrap(new GeneralSwipeAction(Swipe.FAST, GeneralLocation.CENTER_LEFT, 2073eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes GeneralLocation.CENTER_RIGHT, Press.FINGER))); 208bb2fd572a11bcd12f767b3ecab6fbdf9112279afKirill Grouchnikov assertTrue("Opened drawer #" + i, mDrawerLayout.isDrawerOpen(GravityCompat.START)); 209bb2fd572a11bcd12f767b3ecab6fbdf9112279afKirill Grouchnikov 210bb2fd572a11bcd12f767b3ecab6fbdf9112279afKirill Grouchnikov onView(withId(R.id.drawer_layout)).perform( 2113eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes wrap(new GeneralSwipeAction(Swipe.FAST, GeneralLocation.CENTER_RIGHT, 2123eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes GeneralLocation.CENTER_LEFT, Press.FINGER))); 213bb2fd572a11bcd12f767b3ecab6fbdf9112279afKirill Grouchnikov assertFalse("Closed drawer #" + i, mDrawerLayout.isDrawerOpen(GravityCompat.START)); 214bb2fd572a11bcd12f767b3ecab6fbdf9112279afKirill Grouchnikov } 215bb2fd572a11bcd12f767b3ecab6fbdf9112279afKirill Grouchnikov } 216bb2fd572a11bcd12f767b3ecab6fbdf9112279afKirill Grouchnikov 217bb2fd572a11bcd12f767b3ecab6fbdf9112279afKirill Grouchnikov @Test 2184bb57b2c7c5e8fa607119bd5089535d5862cb979Aurimas Liutikas @LargeTest 219bb2fd572a11bcd12f767b3ecab6fbdf9112279afKirill Grouchnikov public void testDrawerOpenCloseWithRedundancyViaSwipes() { 220bb2fd572a11bcd12f767b3ecab6fbdf9112279afKirill Grouchnikov assertFalse("Initial state", mDrawerLayout.isDrawerOpen(GravityCompat.START)); 221bb2fd572a11bcd12f767b3ecab6fbdf9112279afKirill Grouchnikov 2223eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes // Note that we're using GeneralSwipeAction instead of swipeLeft() / swipeRight(). 2233eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes // Those Espresso actions use edge fuzzying which doesn't work well with edge-based 2243eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes // detection of swiping the drawers open in DrawerLayout. 2253eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes // It's critically important to wrap the GeneralSwipeAction to "wait" until the 2263eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes // DrawerLayout has settled to STATE_IDLE state before continuing to query the drawer 2273eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes // open / close state. This is done in DrawerLayoutActions.wrap method. 228bb2fd572a11bcd12f767b3ecab6fbdf9112279afKirill Grouchnikov for (int i = 0; i < 5; i++) { 229bb2fd572a11bcd12f767b3ecab6fbdf9112279afKirill Grouchnikov onView(withId(R.id.drawer_layout)).perform( 2303eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes wrap(new GeneralSwipeAction(Swipe.FAST, GeneralLocation.CENTER_LEFT, 2313eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes GeneralLocation.CENTER_RIGHT, Press.FINGER))); 232bb2fd572a11bcd12f767b3ecab6fbdf9112279afKirill Grouchnikov assertTrue("Opened drawer #" + i, mDrawerLayout.isDrawerOpen(GravityCompat.START)); 233bb2fd572a11bcd12f767b3ecab6fbdf9112279afKirill Grouchnikov 234bb2fd572a11bcd12f767b3ecab6fbdf9112279afKirill Grouchnikov // Try opening the drawer when it's already opened 235bb2fd572a11bcd12f767b3ecab6fbdf9112279afKirill Grouchnikov onView(withId(R.id.drawer_layout)).perform( 2363eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes wrap(new GeneralSwipeAction(Swipe.FAST, GeneralLocation.CENTER_LEFT, 2373eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes GeneralLocation.CENTER_RIGHT, Press.FINGER))); 238bb2fd572a11bcd12f767b3ecab6fbdf9112279afKirill Grouchnikov assertTrue("Opened drawer is still opened #" + i, 239bb2fd572a11bcd12f767b3ecab6fbdf9112279afKirill Grouchnikov mDrawerLayout.isDrawerOpen(GravityCompat.START)); 240bb2fd572a11bcd12f767b3ecab6fbdf9112279afKirill Grouchnikov 241bb2fd572a11bcd12f767b3ecab6fbdf9112279afKirill Grouchnikov onView(withId(R.id.drawer_layout)).perform( 2423eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes wrap(new GeneralSwipeAction(Swipe.FAST, GeneralLocation.CENTER_RIGHT, 2433eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes GeneralLocation.CENTER_LEFT, Press.FINGER))); 244bb2fd572a11bcd12f767b3ecab6fbdf9112279afKirill Grouchnikov assertFalse("Closed drawer #" + i, mDrawerLayout.isDrawerOpen(GravityCompat.START)); 245bb2fd572a11bcd12f767b3ecab6fbdf9112279afKirill Grouchnikov 246bb2fd572a11bcd12f767b3ecab6fbdf9112279afKirill Grouchnikov // Try closing the drawer when it's already closed 247bb2fd572a11bcd12f767b3ecab6fbdf9112279afKirill Grouchnikov onView(withId(R.id.drawer_layout)).perform( 2483eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes wrap(new GeneralSwipeAction(Swipe.FAST, GeneralLocation.CENTER_RIGHT, 2493eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes GeneralLocation.CENTER_LEFT, Press.FINGER))); 250bb2fd572a11bcd12f767b3ecab6fbdf9112279afKirill Grouchnikov assertFalse("Closed drawer is still closed #" + i, 251bb2fd572a11bcd12f767b3ecab6fbdf9112279afKirill Grouchnikov mDrawerLayout.isDrawerOpen(GravityCompat.START)); 252bb2fd572a11bcd12f767b3ecab6fbdf9112279afKirill Grouchnikov } 25330c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov } 25479bdaf9f66d9000feb54d8f4011fc412dd7829bcKirill Grouchnikov 25579bdaf9f66d9000feb54d8f4011fc412dd7829bcKirill Grouchnikov @Test 25635232c6eaeb9b99f390cb8ef0ac83bf45fa0b3faAurimas Liutikas @MediumTest 25779bdaf9f66d9000feb54d8f4011fc412dd7829bcKirill Grouchnikov public void testDrawerHeight() { 25879bdaf9f66d9000feb54d8f4011fc412dd7829bcKirill Grouchnikov // Open the drawer so it becomes visible 2593eb01e183e6eef7610881c8b9c0914afbe23b442Chris Banes onView(withId(R.id.drawer_layout)).perform(openDrawer(GravityCompat.START)); 26079bdaf9f66d9000feb54d8f4011fc412dd7829bcKirill Grouchnikov 26179bdaf9f66d9000feb54d8f4011fc412dd7829bcKirill Grouchnikov final int drawerLayoutHeight = mDrawerLayout.getHeight(); 26279bdaf9f66d9000feb54d8f4011fc412dd7829bcKirill Grouchnikov final int startDrawerHeight = mStartDrawer.getHeight(); 26379bdaf9f66d9000feb54d8f4011fc412dd7829bcKirill Grouchnikov final int contentHeight = mContentView.getHeight(); 26479bdaf9f66d9000feb54d8f4011fc412dd7829bcKirill Grouchnikov 26579bdaf9f66d9000feb54d8f4011fc412dd7829bcKirill Grouchnikov // On all devices the height of the drawer layout and the drawer should be identical. 26679bdaf9f66d9000feb54d8f4011fc412dd7829bcKirill Grouchnikov assertEquals("Drawer layout and drawer heights", drawerLayoutHeight, startDrawerHeight); 26779bdaf9f66d9000feb54d8f4011fc412dd7829bcKirill Grouchnikov 26879bdaf9f66d9000feb54d8f4011fc412dd7829bcKirill Grouchnikov if (Build.VERSION.SDK_INT < 21) { 26979bdaf9f66d9000feb54d8f4011fc412dd7829bcKirill Grouchnikov // On pre-L devices the content height should be the same as the drawer layout height. 27079bdaf9f66d9000feb54d8f4011fc412dd7829bcKirill Grouchnikov assertEquals("Drawer layout and content heights on pre-L", 27179bdaf9f66d9000feb54d8f4011fc412dd7829bcKirill Grouchnikov drawerLayoutHeight, contentHeight); 27279bdaf9f66d9000feb54d8f4011fc412dd7829bcKirill Grouchnikov } else { 27379bdaf9f66d9000feb54d8f4011fc412dd7829bcKirill Grouchnikov // Our drawer layout is configured with android:fitsSystemWindows="true" which should be 27479bdaf9f66d9000feb54d8f4011fc412dd7829bcKirill Grouchnikov // respected on L+ devices to extend the drawer layout into the system status bar. 27579bdaf9f66d9000feb54d8f4011fc412dd7829bcKirill Grouchnikov // The start drawer is also configured with the same attribute so it should have the 27679bdaf9f66d9000feb54d8f4011fc412dd7829bcKirill Grouchnikov // same height as the drawer layout. The main content does not have that attribute 27779bdaf9f66d9000feb54d8f4011fc412dd7829bcKirill Grouchnikov // specified, so it should have its height reduced by the height of the system status 27879bdaf9f66d9000feb54d8f4011fc412dd7829bcKirill Grouchnikov // bar. 27979bdaf9f66d9000feb54d8f4011fc412dd7829bcKirill Grouchnikov 28021ac42b40fc351a6799d7d3d439e4feb1c2c1987Dake Gu final int[] contentViewLocationOnScreen = new int[2]; 28121ac42b40fc351a6799d7d3d439e4feb1c2c1987Dake Gu mContentView.getLocationOnScreen(contentViewLocationOnScreen); 28221ac42b40fc351a6799d7d3d439e4feb1c2c1987Dake Gu final int statusBarHeight = contentViewLocationOnScreen[1]; 28379bdaf9f66d9000feb54d8f4011fc412dd7829bcKirill Grouchnikov // Get the system window top inset that was propagated to the top-level DrawerLayout 28479bdaf9f66d9000feb54d8f4011fc412dd7829bcKirill Grouchnikov // during its layout. 28579bdaf9f66d9000feb54d8f4011fc412dd7829bcKirill Grouchnikov int drawerTopInset = mDrawerLayout.getSystemWindowInsetTop(); 28621ac42b40fc351a6799d7d3d439e4feb1c2c1987Dake Gu if (statusBarHeight > 0) { 28721ac42b40fc351a6799d7d3d439e4feb1c2c1987Dake Gu assertEquals("Drawer top inset is positive on L+", statusBarHeight, drawerTopInset); 28821ac42b40fc351a6799d7d3d439e4feb1c2c1987Dake Gu } else { 28921ac42b40fc351a6799d7d3d439e4feb1c2c1987Dake Gu assertEquals("Drawer top inset 0 due to no status bar", 0, drawerTopInset); 29021ac42b40fc351a6799d7d3d439e4feb1c2c1987Dake Gu } 29179bdaf9f66d9000feb54d8f4011fc412dd7829bcKirill Grouchnikov assertEquals("Drawer layout and drawer heights on L+", 29279bdaf9f66d9000feb54d8f4011fc412dd7829bcKirill Grouchnikov drawerLayoutHeight - drawerTopInset, contentHeight); 29379bdaf9f66d9000feb54d8f4011fc412dd7829bcKirill Grouchnikov } 29479bdaf9f66d9000feb54d8f4011fc412dd7829bcKirill Grouchnikov } 29521f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov 29621f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov // Tests for listener(s) being notified of various events 29721f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov 29821f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov @Test 29935232c6eaeb9b99f390cb8ef0ac83bf45fa0b3faAurimas Liutikas @MediumTest 30021f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov public void testDrawerListenerCallbacksOnOpeningViaAPI() { 30121f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov // Register a mock listener 30221f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov DrawerLayout.DrawerListener mockedListener = mock(DrawerLayout.DrawerListener.class); 30321f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov mDrawerLayout.addDrawerListener(mockedListener); 30421f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov 30521f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov // Open the drawer so it becomes visible 30621f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov onView(withId(R.id.drawer_layout)).perform(openDrawer(GravityCompat.START)); 30721f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov 30821f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov // We expect that our listener has been notified that the drawer has been opened 30921f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov // with the reference to our drawer 31021f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov verify(mockedListener, times(1)).onDrawerOpened(mStartDrawer); 31121f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov // We expect that our listener has not been notified that the drawer has been closed 31221f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov verify(mockedListener, never()).onDrawerClosed(any(View.class)); 31321f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov 31421f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov // We expect that our listener has been notified at least once on the drawer slide 31521f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov // event. We expect that all such callbacks pass the reference to our drawer as the first 31621f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov // parameter, and we capture the float slide values for further analysis 31721f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov ArgumentCaptor<Float> floatSlideCaptor = ArgumentCaptor.forClass(float.class); 31821f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov verify(mockedListener, atLeastOnce()).onDrawerSlide(eq(mStartDrawer), 31921f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov floatSlideCaptor.capture()); 32021f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov // Now we verify that calls to onDrawerSlide "gave" us an increasing sequence of values 32121f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov // in [0..1] range. Note that we don't have any expectation on how many times onDrawerSlide 32221f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov // is called since that depends on the hardware capabilities of the device and the current 32321f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov // load on the CPU / GPU. 32421f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov assertThat(floatSlideCaptor.getAllValues(), inRange(0.0f, 1.0f)); 32521f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov assertThat(floatSlideCaptor.getAllValues(), inAscendingOrder()); 32621f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov 32721f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov // We expect that our listener will be called with specific state changes 32821f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov InOrder inOrder = inOrder(mockedListener); 32921f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov inOrder.verify(mockedListener).onDrawerStateChanged(DrawerLayout.STATE_SETTLING); 33021f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov inOrder.verify(mockedListener).onDrawerStateChanged(DrawerLayout.STATE_IDLE); 33121f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov 33221f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov mDrawerLayout.removeDrawerListener(mockedListener); 33321f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov } 33421f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov 33521f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov @Test 33635232c6eaeb9b99f390cb8ef0ac83bf45fa0b3faAurimas Liutikas @MediumTest 337ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas public void testDrawerListenerCallbacksOnOpeningNoAnimationViaAPI() { 338ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas // Register a mock listener 339ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas DrawerLayout.DrawerListener mockedListener = mock(DrawerLayout.DrawerListener.class); 340ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas mDrawerLayout.addDrawerListener(mockedListener); 341ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas 342ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas // Open the drawer so it becomes visible 343ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas onView(withId(R.id.drawer_layout)).perform(openDrawer(GravityCompat.START, false)); 344ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas 345ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas // We expect that our listener has been notified that the drawer has been opened 346ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas // with the reference to our drawer 347ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas verify(mockedListener, times(1)).onDrawerOpened(mStartDrawer); 348ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas // We expect that our listener has not been notified that the drawer has been closed 349ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas verify(mockedListener, never()).onDrawerClosed(any(View.class)); 350ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas 351ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas verify(mockedListener, times(1)).onDrawerSlide(any(View.class), eq(1f)); 352ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas 353ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas // Request to open the drawer again 354ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas onView(withId(R.id.drawer_layout)).perform(openDrawer(GravityCompat.START, false)); 355ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas 356ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas // We expect that our listener has not been notified again that the drawer has been opened 357ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas verify(mockedListener, times(1)).onDrawerOpened(mStartDrawer); 358ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas // We expect that our listener has not been notified that the drawer has been closed 359ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas verify(mockedListener, never()).onDrawerClosed(any(View.class)); 360ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas 361ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas mDrawerLayout.removeDrawerListener(mockedListener); 362ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas } 363ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas 364ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas @Test 36535232c6eaeb9b99f390cb8ef0ac83bf45fa0b3faAurimas Liutikas @LargeTest 36621f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov public void testDrawerListenerCallbacksOnClosingViaAPI() { 36721f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov // Open the drawer so it becomes visible 36821f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov onView(withId(R.id.drawer_layout)).perform(openDrawer(GravityCompat.START)); 36921f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov 37021f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov // Register a mock listener 37121f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov DrawerLayout.DrawerListener mockedListener = mock(DrawerLayout.DrawerListener.class); 37221f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov mDrawerLayout.addDrawerListener(mockedListener); 37321f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov 37421f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov // Close the drawer 37521f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov onView(withId(R.id.drawer_layout)).perform(closeDrawer(GravityCompat.START)); 37621f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov 37721f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov // We expect that our listener has not been notified that the drawer has been opened 37821f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov verify(mockedListener, never()).onDrawerOpened(any(View.class)); 37921f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov // We expect that our listener has been notified that the drawer has been closed 38021f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov // with the reference to our drawer 38121f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov verify(mockedListener, times(1)).onDrawerClosed(mStartDrawer); 38221f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov 38321f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov // We expect that our listener has been notified at least once on the drawer slide 38421f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov // event. We expect that all such callbacks pass the reference to our drawer as the first 38521f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov // parameter, and we capture the float slide values for further analysis 38621f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov ArgumentCaptor<Float> floatSlideCaptor = ArgumentCaptor.forClass(float.class); 38721f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov verify(mockedListener, atLeastOnce()).onDrawerSlide(eq(mStartDrawer), 38821f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov floatSlideCaptor.capture()); 38921f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov // Now we verify that calls to onDrawerSlide "gave" us a decreasing sequence of values 39021f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov // in [0..1] range. Note that we don't have any expectation on how many times onDrawerSlide 39121f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov // is called since that depends on the hardware capabilities of the device and the current 39221f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov // load on the CPU / GPU. 39321f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov assertThat(floatSlideCaptor.getAllValues(), inRange(0.0f, 1.0f)); 39421f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov assertThat(floatSlideCaptor.getAllValues(), inDescendingOrder()); 39521f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov 39621f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov // We expect that our listener will be called with specific state changes 39721f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov InOrder inOrder = inOrder(mockedListener); 39821f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov inOrder.verify(mockedListener).onDrawerStateChanged(DrawerLayout.STATE_SETTLING); 39921f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov inOrder.verify(mockedListener).onDrawerStateChanged(DrawerLayout.STATE_IDLE); 40021f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov 40121f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov mDrawerLayout.removeDrawerListener(mockedListener); 40221f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov } 40321f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov 40421f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov @Test 40535232c6eaeb9b99f390cb8ef0ac83bf45fa0b3faAurimas Liutikas @MediumTest 406ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas public void testDrawerListenerCallbacksOnClosingNoAnimationViaAPI() { 407ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas // Open the drawer so it becomes visible 408ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas onView(withId(R.id.drawer_layout)).perform(openDrawer(GravityCompat.START, false)); 409ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas 410ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas // Register a mock listener 411ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas DrawerLayout.DrawerListener mockedListener = mock(DrawerLayout.DrawerListener.class); 412ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas mDrawerLayout.addDrawerListener(mockedListener); 413ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas 414ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas // Close the drawer 415ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas onView(withId(R.id.drawer_layout)).perform(closeDrawer(GravityCompat.START, false)); 416ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas 417ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas // We expect that our listener has not been notified that the drawer has been opened 418ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas verify(mockedListener, never()).onDrawerOpened(any(View.class)); 419ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas // We expect that our listener has been notified that the drawer has been closed 420ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas // with the reference to our drawer 421ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas verify(mockedListener, times(1)).onDrawerClosed(mStartDrawer); 422ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas 423ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas verify(mockedListener, times(1)).onDrawerSlide(any(View.class), eq(0f)); 424ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas 425ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas // Attempt to close the drawer again. 426ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas onView(withId(R.id.drawer_layout)).perform(closeDrawer(GravityCompat.START, false)); 427ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas 428ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas // We expect that our listener has not been notified that the drawer has been opened 429ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas verify(mockedListener, never()).onDrawerOpened(any(View.class)); 430ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas // We expect that our listener has not been notified again that the drawer has been closed 431ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas verify(mockedListener, times(1)).onDrawerClosed(mStartDrawer); 432ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas 433ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas mDrawerLayout.removeDrawerListener(mockedListener); 434ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas } 435ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas 436522ead667d2efbd7675b89b11aec769ec37baa20Alan Viverette @Suppress 437522ead667d2efbd7675b89b11aec769ec37baa20Alan Viverette @FlakyTest(bugId = 33659300) 438ee4afb511cf51d082e3226f442799a59725bdac2Aurimas Liutikas @Test 43935232c6eaeb9b99f390cb8ef0ac83bf45fa0b3faAurimas Liutikas @MediumTest 44021f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov public void testDrawerListenerCallbacksOnOpeningViaSwipes() { 44121f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov // Register a mock listener 44221f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov DrawerLayout.DrawerListener mockedListener = mock(DrawerLayout.DrawerListener.class); 44321f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov mDrawerLayout.addDrawerListener(mockedListener); 44421f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov 44521f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov // Open the drawer so it becomes visible 44621f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov // Note that we're using GeneralSwipeAction instead of swipeLeft() / swipeRight(). 44721f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov // Those Espresso actions use edge fuzzying which doesn't work well with edge-based 44821f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov // detection of swiping the drawers open in DrawerLayout. 44921f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov // It's critically important to wrap the GeneralSwipeAction to "wait" until the 45021f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov // DrawerLayout has settled to STATE_IDLE state before continuing to query the drawer 45121f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov // open / close state. This is done in DrawerLayoutActions.wrap method. 45221f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov onView(withId(R.id.drawer_layout)).perform( 45321f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov wrap(new GeneralSwipeAction(Swipe.FAST, GeneralLocation.CENTER_LEFT, 45421f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov GeneralLocation.CENTER_RIGHT, Press.FINGER))); 45521f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov 45621f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov // We expect that our listener has been notified that the drawer has been opened 45721f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov // with the reference to our drawer 45821f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov verify(mockedListener, times(1)).onDrawerOpened(mStartDrawer); 45921f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov // We expect that our listener has not been notified that the drawer has been closed 46021f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov verify(mockedListener, never()).onDrawerClosed(any(View.class)); 46121f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov 46221f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov // We expect that our listener has been notified at least once on the drawer slide 46321f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov // event. We expect that all such callbacks pass the reference to our drawer as the first 46421f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov // parameter, and we capture the float slide values for further analysis 46521f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov ArgumentCaptor<Float> floatSlideCaptor = ArgumentCaptor.forClass(float.class); 46621f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov verify(mockedListener, atLeastOnce()).onDrawerSlide(eq(mStartDrawer), 46721f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov floatSlideCaptor.capture()); 46821f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov // Now we verify that calls to onDrawerSlide "gave" us an increasing sequence of values 46921f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov // in [0..1] range. Note that we don't have any expectation on how many times onDrawerSlide 47021f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov // is called since that depends on the hardware capabilities of the device and the current 47121f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov // load on the CPU / GPU. 47221f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov assertThat(floatSlideCaptor.getAllValues(), inRange(0.0f, 1.0f)); 47321f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov assertThat(floatSlideCaptor.getAllValues(), inAscendingOrder()); 47421f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov 47521f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov // We expect that our listener will be called with specific state changes 47621f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov InOrder inOrder = inOrder(mockedListener); 47721f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov inOrder.verify(mockedListener).onDrawerStateChanged(DrawerLayout.STATE_DRAGGING); 47821f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov inOrder.verify(mockedListener).onDrawerStateChanged(DrawerLayout.STATE_IDLE); 47921f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov 48021f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov mDrawerLayout.removeDrawerListener(mockedListener); 48121f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov } 48221f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov 48321f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov @Test 48435232c6eaeb9b99f390cb8ef0ac83bf45fa0b3faAurimas Liutikas @LargeTest 48521f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov public void testDrawerListenerCallbacksOnClosingViaSwipes() { 48621f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov // Open the drawer so it becomes visible 48721f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov onView(withId(R.id.drawer_layout)).perform(openDrawer(GravityCompat.START)); 48821f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov 48921f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov // Register a mock listener 49021f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov DrawerLayout.DrawerListener mockedListener = mock(DrawerLayout.DrawerListener.class); 49121f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov mDrawerLayout.addDrawerListener(mockedListener); 49221f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov 49321f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov // Close the drawer 49421f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov // Note that we're using GeneralSwipeAction instead of swipeLeft() / swipeRight(). 49521f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov // Those Espresso actions use edge fuzzying which doesn't work well with edge-based 49621f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov // detection of swiping the drawers open in DrawerLayout. 49721f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov // It's critically important to wrap the GeneralSwipeAction to "wait" until the 49821f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov // DrawerLayout has settled to STATE_IDLE state before continuing to query the drawer 49921f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov // open / close state. This is done in DrawerLayoutActions.wrap method. 50021f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov onView(withId(R.id.drawer_layout)).perform( 50121f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov wrap(new GeneralSwipeAction(Swipe.FAST, GeneralLocation.CENTER_RIGHT, 50221f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov GeneralLocation.CENTER_LEFT, Press.FINGER))); 50321f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov 50421f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov // We expect that our listener has not been notified that the drawer has been opened 50521f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov verify(mockedListener, never()).onDrawerOpened(any(View.class)); 50621f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov // We expect that our listener has been notified that the drawer has been closed 50721f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov // with the reference to our drawer 50821f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov verify(mockedListener, times(1)).onDrawerClosed(mStartDrawer); 50921f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov 51021f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov // We expect that our listener has been notified at least once on the drawer slide 51121f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov // event. We expect that all such callbacks pass the reference to our drawer as the first 51221f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov // parameter, and we capture the float slide values for further analysis 51321f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov ArgumentCaptor<Float> floatSlideCaptor = ArgumentCaptor.forClass(float.class); 51421f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov verify(mockedListener, atLeastOnce()).onDrawerSlide(eq(mStartDrawer), 51521f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov floatSlideCaptor.capture()); 51621f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov // Now we verify that calls to onDrawerSlide "gave" us a decreasing sequence of values 51721f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov // in [0..1] range. Note that we don't have any expectation on how many times onDrawerSlide 51821f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov // is called since that depends on the hardware capabilities of the device and the current 51921f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov // load on the CPU / GPU. 52021f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov assertThat(floatSlideCaptor.getAllValues(), inRange(0.0f, 1.0f)); 52121f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov assertThat(floatSlideCaptor.getAllValues(), inDescendingOrder()); 52221f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov 52321f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov // We expect that our listener will be called with specific state changes 52421f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov InOrder inOrder = inOrder(mockedListener); 52521f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov inOrder.verify(mockedListener).onDrawerStateChanged(DrawerLayout.STATE_DRAGGING); 52621f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov inOrder.verify(mockedListener).onDrawerStateChanged(DrawerLayout.STATE_IDLE); 52721f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov 52821f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov mDrawerLayout.removeDrawerListener(mockedListener); 52921f78eb90b3217aa5cf69c3ffd359506468b55f4Kirill Grouchnikov } 530df1317cf003b4b6c16f1657018c91519d279f13bKirill Grouchnikov 531df1317cf003b4b6c16f1657018c91519d279f13bKirill Grouchnikov @Test 53235232c6eaeb9b99f390cb8ef0ac83bf45fa0b3faAurimas Liutikas @LargeTest 533df1317cf003b4b6c16f1657018c91519d279f13bKirill Grouchnikov public void testDrawerLockUnlock() { 534df1317cf003b4b6c16f1657018c91519d279f13bKirill Grouchnikov assertEquals("Drawer is unlocked in initial state", 535df1317cf003b4b6c16f1657018c91519d279f13bKirill Grouchnikov DrawerLayout.LOCK_MODE_UNLOCKED, mDrawerLayout.getDrawerLockMode(mStartDrawer)); 536df1317cf003b4b6c16f1657018c91519d279f13bKirill Grouchnikov 537df1317cf003b4b6c16f1657018c91519d279f13bKirill Grouchnikov // Lock the drawer open 538df1317cf003b4b6c16f1657018c91519d279f13bKirill Grouchnikov onView(withId(R.id.drawer_layout)).perform( 539df1317cf003b4b6c16f1657018c91519d279f13bKirill Grouchnikov setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_OPEN, GravityCompat.START)); 540df1317cf003b4b6c16f1657018c91519d279f13bKirill Grouchnikov // Check that it's locked open 541df1317cf003b4b6c16f1657018c91519d279f13bKirill Grouchnikov assertEquals("Drawer is now locked open", 542df1317cf003b4b6c16f1657018c91519d279f13bKirill Grouchnikov DrawerLayout.LOCK_MODE_LOCKED_OPEN, mDrawerLayout.getDrawerLockMode(mStartDrawer)); 543df1317cf003b4b6c16f1657018c91519d279f13bKirill Grouchnikov // and also opened 544df1317cf003b4b6c16f1657018c91519d279f13bKirill Grouchnikov assertTrue("Drawer is also opened", mDrawerLayout.isDrawerOpen(mStartDrawer)); 545df1317cf003b4b6c16f1657018c91519d279f13bKirill Grouchnikov 546df1317cf003b4b6c16f1657018c91519d279f13bKirill Grouchnikov // Unlock the drawer 547df1317cf003b4b6c16f1657018c91519d279f13bKirill Grouchnikov onView(withId(R.id.drawer_layout)).perform( 548df1317cf003b4b6c16f1657018c91519d279f13bKirill Grouchnikov setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED, mStartDrawer)); 549df1317cf003b4b6c16f1657018c91519d279f13bKirill Grouchnikov // Check that it's still opened 550df1317cf003b4b6c16f1657018c91519d279f13bKirill Grouchnikov assertTrue("Drawer is still opened", mDrawerLayout.isDrawerOpen(mStartDrawer)); 551df1317cf003b4b6c16f1657018c91519d279f13bKirill Grouchnikov // Close the drawer 552df1317cf003b4b6c16f1657018c91519d279f13bKirill Grouchnikov onView(withId(R.id.drawer_layout)).perform(closeDrawer(mStartDrawer)); 553df1317cf003b4b6c16f1657018c91519d279f13bKirill Grouchnikov // Check that the drawer is unlocked 554df1317cf003b4b6c16f1657018c91519d279f13bKirill Grouchnikov assertEquals("Start drawer is now unlocked", 555df1317cf003b4b6c16f1657018c91519d279f13bKirill Grouchnikov DrawerLayout.LOCK_MODE_UNLOCKED, mDrawerLayout.getDrawerLockMode(mStartDrawer)); 556df1317cf003b4b6c16f1657018c91519d279f13bKirill Grouchnikov 557df1317cf003b4b6c16f1657018c91519d279f13bKirill Grouchnikov // Open the drawer and then clock it closed 558df1317cf003b4b6c16f1657018c91519d279f13bKirill Grouchnikov onView(withId(R.id.drawer_layout)).perform(openDrawer(mStartDrawer)); 559df1317cf003b4b6c16f1657018c91519d279f13bKirill Grouchnikov onView(withId(R.id.drawer_layout)).perform( 560df1317cf003b4b6c16f1657018c91519d279f13bKirill Grouchnikov setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED, GravityCompat.START)); 561df1317cf003b4b6c16f1657018c91519d279f13bKirill Grouchnikov // Check that the drawer is locked close 562df1317cf003b4b6c16f1657018c91519d279f13bKirill Grouchnikov assertEquals("Drawer is now locked close", 563df1317cf003b4b6c16f1657018c91519d279f13bKirill Grouchnikov DrawerLayout.LOCK_MODE_LOCKED_CLOSED, 564df1317cf003b4b6c16f1657018c91519d279f13bKirill Grouchnikov mDrawerLayout.getDrawerLockMode(mStartDrawer)); 565df1317cf003b4b6c16f1657018c91519d279f13bKirill Grouchnikov // and also closed 566df1317cf003b4b6c16f1657018c91519d279f13bKirill Grouchnikov assertFalse("Drawer is also closed", mDrawerLayout.isDrawerOpen(mStartDrawer)); 567df1317cf003b4b6c16f1657018c91519d279f13bKirill Grouchnikov 568df1317cf003b4b6c16f1657018c91519d279f13bKirill Grouchnikov // Unlock the drawer 569df1317cf003b4b6c16f1657018c91519d279f13bKirill Grouchnikov onView(withId(R.id.drawer_layout)).perform( 570df1317cf003b4b6c16f1657018c91519d279f13bKirill Grouchnikov setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED, mStartDrawer)); 571df1317cf003b4b6c16f1657018c91519d279f13bKirill Grouchnikov // Check that it's still closed 572df1317cf003b4b6c16f1657018c91519d279f13bKirill Grouchnikov assertFalse("Drawer is still closed", mDrawerLayout.isDrawerOpen(mStartDrawer)); 573df1317cf003b4b6c16f1657018c91519d279f13bKirill Grouchnikov } 57430c25a404365719cbe21a0886ddbe8be544c8e90Kirill Grouchnikov} 575