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