1cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes/*
2cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes * Copyright (C) 2015 The Android Open Source Project
3cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes *
4cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes * Licensed under the Apache License, Version 2.0 (the "License");
5cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes * you may not use this file except in compliance with the License.
6cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes * You may obtain a copy of the License at
7cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes *
8cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes *      http://www.apache.org/licenses/LICENSE-2.0
9cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes *
10cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes * Unless required by applicable law or agreed to in writing, software
11cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes * distributed under the License is distributed on an "AS IS" BASIS,
12cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes * See the License for the specific language governing permissions and
14cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes * limitations under the License.
15cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes */
16cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes
17cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banespackage android.support.v7.app;
18cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes
1958641eb8513b7181a73a9db3ea7b68ba10d1c15eChris Banesimport static android.support.test.espresso.Espresso.onView;
2058641eb8513b7181a73a9db3ea7b68ba10d1c15eChris Banesimport static android.support.test.espresso.matcher.ViewMatchers.withId;
2158641eb8513b7181a73a9db3ea7b68ba10d1c15eChris Banesimport static android.support.v7.testutils.TestUtilsActions.setSystemUiVisibility;
2258641eb8513b7181a73a9db3ea7b68ba10d1c15eChris Banes
23bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banesimport static org.junit.Assert.assertEquals;
24bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banesimport static org.junit.Assert.assertNotNull;
25bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banesimport static org.junit.Assert.assertNull;
26bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banesimport static org.junit.Assert.assertTrue;
27bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banesimport static org.mockito.Matchers.any;
2858641eb8513b7181a73a9db3ea7b68ba10d1c15eChris Banesimport static org.mockito.Matchers.eq;
2958641eb8513b7181a73a9db3ea7b68ba10d1c15eChris Banesimport static org.mockito.Mockito.atLeastOnce;
30bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banesimport static org.mockito.Mockito.mock;
31bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banesimport static org.mockito.Mockito.never;
32bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banesimport static org.mockito.Mockito.reset;
3358641eb8513b7181a73a9db3ea7b68ba10d1c15eChris Banesimport static org.mockito.Mockito.spy;
34bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banesimport static org.mockito.Mockito.verify;
35bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banesimport static org.mockito.Mockito.verifyNoMoreInteractions;
36bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banesimport static org.mockito.Mockito.when;
3724391daa4e5831395924e2f48df86e19294cc211Chris Banes
38e91ec2c1719ac56156909abeb69bd8f934632b8eChris Banesimport android.os.Build;
39bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banesimport android.support.test.annotation.UiThreadTest;
4058641eb8513b7181a73a9db3ea7b68ba10d1c15eChris Banesimport android.support.test.filters.SdkSuppress;
41e91ec2c1719ac56156909abeb69bd8f934632b8eChris Banesimport android.support.v7.appcompat.test.R;
42e91ec2c1719ac56156909abeb69bd8f934632b8eChris Banesimport android.support.v7.custom.FitWindowsContentLayout;
43a37e9311de7ff4407104965ff66146f87e55ba5cKirill Grouchnikovimport android.support.v7.testutils.BaseTestActivity;
4424391daa4e5831395924e2f48df86e19294cc211Chris Banesimport android.support.v7.testutils.TestUtils;
45bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banesimport android.support.v7.view.ActionMode;
46daea069fe33cc750bcb733ebcb6206d2dcedae76Chris Banesimport android.test.suitebuilder.annotation.SmallTest;
47bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banesimport android.view.Menu;
48e91ec2c1719ac56156909abeb69bd8f934632b8eChris Banesimport android.view.View;
49e91ec2c1719ac56156909abeb69bd8f934632b8eChris Banesimport android.view.WindowInsets;
50e91ec2c1719ac56156909abeb69bd8f934632b8eChris Banes
51bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banesimport org.junit.Test;
52daea069fe33cc750bcb733ebcb6206d2dcedae76Chris Banes
5358641eb8513b7181a73a9db3ea7b68ba10d1c15eChris Banes@SmallTest
54cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banespublic abstract class BaseBasicsTestCase<A extends BaseTestActivity>
55cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes        extends BaseInstrumentationTestCase<A> {
56cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes
57cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes    protected BaseBasicsTestCase(Class<A> activityClass) {
58cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes        super(activityClass);
59cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes    }
60cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes
61cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes    @Test
62cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes    public void testActionBarExists() {
63cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes        assertNotNull("ActionBar is not null", getActivity().getSupportActionBar());
64cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes    }
65cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes
66cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes    @Test
67733d0b2acb07ede7455b9d020901a10586053923Chris Banes    public void testDefaultActionBarTitle() {
68cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes        assertEquals(getActivity().getTitle(), getActivity().getSupportActionBar().getTitle());
69cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes    }
70cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes
71cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes    @Test
72cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes    public void testSetActionBarTitle() throws Throwable {
73cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes        final String newTitle = "hello";
74cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes        runTestOnUiThread(new Runnable() {
75cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes            @Override
76cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes            public void run() {
77cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes                getActivity().setTitle(newTitle);
78cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes                assertEquals("New title is set to ActionBar",
79cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes                        newTitle, getActivity().getSupportActionBar().getTitle());
80cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes            }
81cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes        });
82cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes    }
83733d0b2acb07ede7455b9d020901a10586053923Chris Banes
84733d0b2acb07ede7455b9d020901a10586053923Chris Banes    @Test
85733d0b2acb07ede7455b9d020901a10586053923Chris Banes    public void testMenuInvalidationAfterDestroy() throws Throwable {
86733d0b2acb07ede7455b9d020901a10586053923Chris Banes        final A activity = getActivity();
8724391daa4e5831395924e2f48df86e19294cc211Chris Banes        // Reset to make sure that we don't have a menu currently
8824391daa4e5831395924e2f48df86e19294cc211Chris Banes        activity.reset();
8924391daa4e5831395924e2f48df86e19294cc211Chris Banes        assertNull(activity.getMenu());
90733d0b2acb07ede7455b9d020901a10586053923Chris Banes
9124391daa4e5831395924e2f48df86e19294cc211Chris Banes        // Now destroy the Activity
9224391daa4e5831395924e2f48df86e19294cc211Chris Banes        activity.finish();
9324391daa4e5831395924e2f48df86e19294cc211Chris Banes        TestUtils.waitForActivityDestroyed(activity);
94733d0b2acb07ede7455b9d020901a10586053923Chris Banes
9524391daa4e5831395924e2f48df86e19294cc211Chris Banes        // Now dispatch a menu invalidation and wait for an idle sync
9624391daa4e5831395924e2f48df86e19294cc211Chris Banes        activity.supportInvalidateOptionsMenu();
9724391daa4e5831395924e2f48df86e19294cc211Chris Banes        getInstrumentation().waitForIdleSync();
98733d0b2acb07ede7455b9d020901a10586053923Chris Banes
99733d0b2acb07ede7455b9d020901a10586053923Chris Banes        // Make sure that we don't have a menu given to use after being destroyed
100733d0b2acb07ede7455b9d020901a10586053923Chris Banes        assertNull(activity.getMenu());
101733d0b2acb07ede7455b9d020901a10586053923Chris Banes    }
102e91ec2c1719ac56156909abeb69bd8f934632b8eChris Banes
103e91ec2c1719ac56156909abeb69bd8f934632b8eChris Banes    @Test
10458641eb8513b7181a73a9db3ea7b68ba10d1c15eChris Banes    @SdkSuppress(minSdkVersion = 16)
105e91ec2c1719ac56156909abeb69bd8f934632b8eChris Banes    public void testFitSystemWindowsReachesContent() {
106e91ec2c1719ac56156909abeb69bd8f934632b8eChris Banes        final FitWindowsContentLayout content =
107e91ec2c1719ac56156909abeb69bd8f934632b8eChris Banes                (FitWindowsContentLayout) getActivity().findViewById(R.id.test_content);
108e91ec2c1719ac56156909abeb69bd8f934632b8eChris Banes        assertNotNull(content);
10958641eb8513b7181a73a9db3ea7b68ba10d1c15eChris Banes
11058641eb8513b7181a73a9db3ea7b68ba10d1c15eChris Banes        // Call setSystemUiVisibility with flags which will cause window insets to be dispatched
11158641eb8513b7181a73a9db3ea7b68ba10d1c15eChris Banes        final int flags = View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
11258641eb8513b7181a73a9db3ea7b68ba10d1c15eChris Banes        onView(withId(R.id.test_content)).perform(setSystemUiVisibility(flags));
11358641eb8513b7181a73a9db3ea7b68ba10d1c15eChris Banes
114e91ec2c1719ac56156909abeb69bd8f934632b8eChris Banes        assertTrue(content.getFitsSystemWindowsCalled());
115e91ec2c1719ac56156909abeb69bd8f934632b8eChris Banes    }
116e91ec2c1719ac56156909abeb69bd8f934632b8eChris Banes
117e91ec2c1719ac56156909abeb69bd8f934632b8eChris Banes    @Test
11858641eb8513b7181a73a9db3ea7b68ba10d1c15eChris Banes    @SdkSuppress(minSdkVersion = 21)
119e91ec2c1719ac56156909abeb69bd8f934632b8eChris Banes    public void testOnApplyWindowInsetsReachesContent() {
120e91ec2c1719ac56156909abeb69bd8f934632b8eChris Banes        final View content = getActivity().findViewById(R.id.test_content);
121e91ec2c1719ac56156909abeb69bd8f934632b8eChris Banes        assertNotNull(content);
122e91ec2c1719ac56156909abeb69bd8f934632b8eChris Banes
12358641eb8513b7181a73a9db3ea7b68ba10d1c15eChris Banes        // Create a spy of one of our test listener and set it on our content
12458641eb8513b7181a73a9db3ea7b68ba10d1c15eChris Banes        final View.OnApplyWindowInsetsListener spyListener
12558641eb8513b7181a73a9db3ea7b68ba10d1c15eChris Banes                = spy(new TestOnApplyWindowInsetsListener());
12658641eb8513b7181a73a9db3ea7b68ba10d1c15eChris Banes        content.setOnApplyWindowInsetsListener(spyListener);
12758641eb8513b7181a73a9db3ea7b68ba10d1c15eChris Banes
12858641eb8513b7181a73a9db3ea7b68ba10d1c15eChris Banes        // Call setSystemUiVisibility with flags which will cause window insets to be dispatched
12958641eb8513b7181a73a9db3ea7b68ba10d1c15eChris Banes        final int flags = View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
13058641eb8513b7181a73a9db3ea7b68ba10d1c15eChris Banes        onView(withId(R.id.test_content)).perform(setSystemUiVisibility(flags));
13158641eb8513b7181a73a9db3ea7b68ba10d1c15eChris Banes
13258641eb8513b7181a73a9db3ea7b68ba10d1c15eChris Banes        // Verify that the listener was called at least once
13358641eb8513b7181a73a9db3ea7b68ba10d1c15eChris Banes        verify(spyListener, atLeastOnce())
13458641eb8513b7181a73a9db3ea7b68ba10d1c15eChris Banes                .onApplyWindowInsets(eq(content), any(WindowInsets.class));
135e91ec2c1719ac56156909abeb69bd8f934632b8eChris Banes    }
136bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes
137bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes    @Test
138bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes    @UiThreadTest
139bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes    public void testSupportActionModeCallbacks() {
140bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        final A activity = getActivity();
141bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes
142bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        // Create a mock action mode callback which returns true from onCreateActionMode
143bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        final ActionMode.Callback callback = mock(ActionMode.Callback.class);
144bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        when(callback.onCreateActionMode(any(ActionMode.class), any(Menu.class))).thenReturn(true);
145bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes
146bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        // Start an action mode
147bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        final ActionMode actionMode = activity.startSupportActionMode(callback);
148bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        assertNotNull(actionMode);
149bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes
150bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        // Now verify that onCreateActionMode and onPrepareActionMode are called once
151bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        verify(callback).onCreateActionMode(any(ActionMode.class), any(Menu.class));
152bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        verify(callback).onPrepareActionMode(any(ActionMode.class), any(Menu.class));
153bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes
154bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        // Now finish and verify that onDestroyActionMode is called once, and there are no more
155bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        // interactions
156bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        actionMode.finish();
157bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        verify(callback).onDestroyActionMode(any(ActionMode.class));
158bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        verifyNoMoreInteractions(callback);
159bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes    }
160bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes
161bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes    @Test
162bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes    @UiThreadTest
163bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes    public void testSupportActionModeCallbacksInvalidate() {
164bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        final A activity = getActivity();
165bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes
166bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        // Create a mock action mode callback which returns true from onCreateActionMode
167bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        final ActionMode.Callback callback = mock(ActionMode.Callback.class);
168bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        when(callback.onCreateActionMode(any(ActionMode.class), any(Menu.class))).thenReturn(true);
169bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes
170bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        // Start an action mode
171bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        final ActionMode actionMode = activity.startSupportActionMode(callback);
172bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        // Assert that one was created
173bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        assertNotNull(actionMode);
174bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        // Reset the mock so that any callback counts from the create are reset
175bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        reset(callback);
176bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes
177bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        // Now invalidate the action mode
178bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        actionMode.invalidate();
179bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes
180bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        // Now verify that onCreateActionMode is not called, and onPrepareActionMode is called once
181bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        verify(callback, never()).onCreateActionMode(any(ActionMode.class), any(Menu.class));
182bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        verify(callback).onPrepareActionMode(any(ActionMode.class), any(Menu.class));
183bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes    }
184bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes
185bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes    @Test
186bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes    @UiThreadTest
187bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes    public void testSupportActionModeCallbacksWithFalseOnCreate() {
188bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        final A activity = getActivity();
189bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes
190bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        // Create a mock action mode callback which returns true from onCreateActionMode
191bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        final ActionMode.Callback callback = mock(ActionMode.Callback.class);
192bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        when(callback.onCreateActionMode(any(ActionMode.class), any(Menu.class))).thenReturn(false);
193bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes
194bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        // Start an action mode
195bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        final ActionMode actionMode = activity.startSupportActionMode(callback);
196bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes
197bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        // Now verify that onCreateActionMode is called once
198bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        verify(callback).onCreateActionMode(any(ActionMode.class), any(Menu.class));
199bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes
200bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        // Now verify that onPrepareActionMode is not called (since onCreateActionMode
201bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        // returns false)
202bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        verify(callback, never()).onPrepareActionMode(any(ActionMode.class), any(Menu.class));
203bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes
204bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        // Assert that an action mode was not created
205bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        assertNull(actionMode);
206bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes    }
207bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes
208bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes    protected void testSupportActionModeAppCompatCallbacks(final boolean fromWindow) {
209bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        final A activity = getActivity();
210bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes
211bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        // Create a mock action mode callback which returns true from onCreateActionMode
212bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        final ActionMode.Callback amCallback = mock(ActionMode.Callback.class);
213bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        when(amCallback.onCreateActionMode(any(ActionMode.class), any(Menu.class)))
214bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes                .thenReturn(true);
215bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes
216bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        // Create a mock AppCompatCallback, which returns null from
217bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        // onWindowStartingSupportActionMode, and set it on the Activity
218bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        final AppCompatCallback apCallback = mock(AppCompatCallback.class);
219bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        when(apCallback.onWindowStartingSupportActionMode(any(ActionMode.Callback.class)))
220bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes                .thenReturn(null);
221bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        activity.setAppCompatCallback(apCallback);
222bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes
223bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        // Start an action mode with the action mode callback
224bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        final ActionMode actionMode = activity.startSupportActionMode(amCallback);
225bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes
226bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        if (fromWindow) {
227bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes            // Verify that the callback's onWindowStartingSupportActionMode was called
228bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes            verify(apCallback).onWindowStartingSupportActionMode(any(ActionMode.Callback.class));
229bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        }
230bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes
231bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        // Now assert that an action mode was created
232bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        assertNotNull(actionMode);
233bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes
234bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        // Now verify that onSupportActionModeStarted is called once
235bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        verify(apCallback).onSupportActionModeStarted(any(ActionMode.class));
236bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes
237bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        // Now finish and verify that onDestroyActionMode is called once
238bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        actionMode.finish();
239bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        verify(apCallback).onSupportActionModeFinished(any(ActionMode.class));
240bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes    }
24158641eb8513b7181a73a9db3ea7b68ba10d1c15eChris Banes
24258641eb8513b7181a73a9db3ea7b68ba10d1c15eChris Banes    public static class TestOnApplyWindowInsetsListener
24358641eb8513b7181a73a9db3ea7b68ba10d1c15eChris Banes            implements View.OnApplyWindowInsetsListener {
24458641eb8513b7181a73a9db3ea7b68ba10d1c15eChris Banes        @Override
24558641eb8513b7181a73a9db3ea7b68ba10d1c15eChris Banes        public WindowInsets onApplyWindowInsets(View view, WindowInsets windowInsets) {
24658641eb8513b7181a73a9db3ea7b68ba10d1c15eChris Banes            return windowInsets;
24758641eb8513b7181a73a9db3ea7b68ba10d1c15eChris Banes        }
24858641eb8513b7181a73a9db3ea7b68ba10d1c15eChris Banes    }
249cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes}
250