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
381f428040204ce6b234cf3be304051ceb9e90a9e7Aurimas Liutikasimport android.annotation.SuppressLint;
391f428040204ce6b234cf3be304051ceb9e90a9e7Aurimas Liutikasimport android.app.Activity;
401f428040204ce6b234cf3be304051ceb9e90a9e7Aurimas Liutikasimport android.content.pm.PackageManager;
41c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viveretteimport android.support.annotation.RequiresApi;
42bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banesimport android.support.test.annotation.UiThreadTest;
4358641eb8513b7181a73a9db3ea7b68ba10d1c15eChris Banesimport android.support.test.filters.SdkSuppress;
44754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikasimport android.support.test.filters.SmallTest;
45e91ec2c1719ac56156909abeb69bd8f934632b8eChris Banesimport android.support.v7.appcompat.test.R;
46e91ec2c1719ac56156909abeb69bd8f934632b8eChris Banesimport android.support.v7.custom.FitWindowsContentLayout;
47a37e9311de7ff4407104965ff66146f87e55ba5cKirill Grouchnikovimport android.support.v7.testutils.BaseTestActivity;
48bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banesimport android.support.v7.view.ActionMode;
49bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banesimport android.view.Menu;
50e91ec2c1719ac56156909abeb69bd8f934632b8eChris Banesimport android.view.View;
51e91ec2c1719ac56156909abeb69bd8f934632b8eChris Banesimport android.view.WindowInsets;
52e91ec2c1719ac56156909abeb69bd8f934632b8eChris Banes
53bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banesimport org.junit.Test;
54daea069fe33cc750bcb733ebcb6206d2dcedae76Chris Banes
5558641eb8513b7181a73a9db3ea7b68ba10d1c15eChris Banes@SmallTest
56cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banespublic abstract class BaseBasicsTestCase<A extends BaseTestActivity>
57cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes        extends BaseInstrumentationTestCase<A> {
58cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes
59cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes    protected BaseBasicsTestCase(Class<A> activityClass) {
60cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes        super(activityClass);
61cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes    }
62cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes
63cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes    @Test
64cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes    public void testActionBarExists() {
65cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes        assertNotNull("ActionBar is not null", getActivity().getSupportActionBar());
66cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes    }
67cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes
68cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes    @Test
69733d0b2acb07ede7455b9d020901a10586053923Chris Banes    public void testDefaultActionBarTitle() {
70cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes        assertEquals(getActivity().getTitle(), getActivity().getSupportActionBar().getTitle());
71cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes    }
72cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes
7342e7d6fafcde7bfe261dd7d8d75ee53ca0cd6790Aurimas Liutikas    @UiThreadTest
74cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes    @Test
7542e7d6fafcde7bfe261dd7d8d75ee53ca0cd6790Aurimas Liutikas    public void testSetActionBarTitle() {
76cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes        final String newTitle = "hello";
7742e7d6fafcde7bfe261dd7d8d75ee53ca0cd6790Aurimas Liutikas        mActivityTestRule.getActivity().setTitle(newTitle);
7842e7d6fafcde7bfe261dd7d8d75ee53ca0cd6790Aurimas Liutikas        assertEquals("New title is set to ActionBar",
7942e7d6fafcde7bfe261dd7d8d75ee53ca0cd6790Aurimas Liutikas                newTitle, mActivityTestRule.getActivity().getSupportActionBar().getTitle());
80cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes    }
81733d0b2acb07ede7455b9d020901a10586053923Chris Banes
82733d0b2acb07ede7455b9d020901a10586053923Chris Banes    @Test
8358641eb8513b7181a73a9db3ea7b68ba10d1c15eChris Banes    @SdkSuppress(minSdkVersion = 16)
84c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette    @RequiresApi(16)
85e91ec2c1719ac56156909abeb69bd8f934632b8eChris Banes    public void testFitSystemWindowsReachesContent() {
86e91ec2c1719ac56156909abeb69bd8f934632b8eChris Banes        final FitWindowsContentLayout content =
87e91ec2c1719ac56156909abeb69bd8f934632b8eChris Banes                (FitWindowsContentLayout) getActivity().findViewById(R.id.test_content);
88e91ec2c1719ac56156909abeb69bd8f934632b8eChris Banes        assertNotNull(content);
8958641eb8513b7181a73a9db3ea7b68ba10d1c15eChris Banes
901f428040204ce6b234cf3be304051ceb9e90a9e7Aurimas Liutikas        if (!canShowSystemUi(getActivity())) {
911f428040204ce6b234cf3be304051ceb9e90a9e7Aurimas Liutikas            // Device cannot show system UI so setSystemUiVisibility will do nothing.
921f428040204ce6b234cf3be304051ceb9e90a9e7Aurimas Liutikas            return;
931f428040204ce6b234cf3be304051ceb9e90a9e7Aurimas Liutikas        }
941f428040204ce6b234cf3be304051ceb9e90a9e7Aurimas Liutikas
9558641eb8513b7181a73a9db3ea7b68ba10d1c15eChris Banes        // Call setSystemUiVisibility with flags which will cause window insets to be dispatched
9658641eb8513b7181a73a9db3ea7b68ba10d1c15eChris Banes        final int flags = View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
9758641eb8513b7181a73a9db3ea7b68ba10d1c15eChris Banes        onView(withId(R.id.test_content)).perform(setSystemUiVisibility(flags));
9858641eb8513b7181a73a9db3ea7b68ba10d1c15eChris Banes
99e91ec2c1719ac56156909abeb69bd8f934632b8eChris Banes        assertTrue(content.getFitsSystemWindowsCalled());
100e91ec2c1719ac56156909abeb69bd8f934632b8eChris Banes    }
101e91ec2c1719ac56156909abeb69bd8f934632b8eChris Banes
102e91ec2c1719ac56156909abeb69bd8f934632b8eChris Banes    @Test
10358641eb8513b7181a73a9db3ea7b68ba10d1c15eChris Banes    @SdkSuppress(minSdkVersion = 21)
104c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette    @RequiresApi(21)
105e91ec2c1719ac56156909abeb69bd8f934632b8eChris Banes    public void testOnApplyWindowInsetsReachesContent() {
106e91ec2c1719ac56156909abeb69bd8f934632b8eChris Banes        final View content = getActivity().findViewById(R.id.test_content);
107e91ec2c1719ac56156909abeb69bd8f934632b8eChris Banes        assertNotNull(content);
108e91ec2c1719ac56156909abeb69bd8f934632b8eChris Banes
1091f428040204ce6b234cf3be304051ceb9e90a9e7Aurimas Liutikas        if (!canShowSystemUi(getActivity())) {
1101f428040204ce6b234cf3be304051ceb9e90a9e7Aurimas Liutikas            // Device cannot show system UI so setSystemUiVisibility will do nothing.
1111f428040204ce6b234cf3be304051ceb9e90a9e7Aurimas Liutikas            return;
1121f428040204ce6b234cf3be304051ceb9e90a9e7Aurimas Liutikas        }
1131f428040204ce6b234cf3be304051ceb9e90a9e7Aurimas Liutikas
11458641eb8513b7181a73a9db3ea7b68ba10d1c15eChris Banes        // Create a spy of one of our test listener and set it on our content
11558641eb8513b7181a73a9db3ea7b68ba10d1c15eChris Banes        final View.OnApplyWindowInsetsListener spyListener
11658641eb8513b7181a73a9db3ea7b68ba10d1c15eChris Banes                = spy(new TestOnApplyWindowInsetsListener());
11758641eb8513b7181a73a9db3ea7b68ba10d1c15eChris Banes        content.setOnApplyWindowInsetsListener(spyListener);
11858641eb8513b7181a73a9db3ea7b68ba10d1c15eChris Banes
11958641eb8513b7181a73a9db3ea7b68ba10d1c15eChris Banes        // Call setSystemUiVisibility with flags which will cause window insets to be dispatched
12058641eb8513b7181a73a9db3ea7b68ba10d1c15eChris Banes        final int flags = View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
12158641eb8513b7181a73a9db3ea7b68ba10d1c15eChris Banes        onView(withId(R.id.test_content)).perform(setSystemUiVisibility(flags));
12258641eb8513b7181a73a9db3ea7b68ba10d1c15eChris Banes
12358641eb8513b7181a73a9db3ea7b68ba10d1c15eChris Banes        // Verify that the listener was called at least once
12458641eb8513b7181a73a9db3ea7b68ba10d1c15eChris Banes        verify(spyListener, atLeastOnce())
12558641eb8513b7181a73a9db3ea7b68ba10d1c15eChris Banes                .onApplyWindowInsets(eq(content), any(WindowInsets.class));
126e91ec2c1719ac56156909abeb69bd8f934632b8eChris Banes    }
127bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes
128bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes    @Test
129bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes    @UiThreadTest
130bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes    public void testSupportActionModeCallbacks() {
131bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        final A activity = getActivity();
132bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes
133bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        // Create a mock action mode callback which returns true from onCreateActionMode
134bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        final ActionMode.Callback callback = mock(ActionMode.Callback.class);
135bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        when(callback.onCreateActionMode(any(ActionMode.class), any(Menu.class))).thenReturn(true);
136bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes
137bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        // Start an action mode
138bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        final ActionMode actionMode = activity.startSupportActionMode(callback);
139bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        assertNotNull(actionMode);
140bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes
141bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        // Now verify that onCreateActionMode and onPrepareActionMode are called once
142bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        verify(callback).onCreateActionMode(any(ActionMode.class), any(Menu.class));
143bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        verify(callback).onPrepareActionMode(any(ActionMode.class), any(Menu.class));
144bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes
145bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        // Now finish and verify that onDestroyActionMode is called once, and there are no more
146bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        // interactions
147bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        actionMode.finish();
148bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        verify(callback).onDestroyActionMode(any(ActionMode.class));
149bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        verifyNoMoreInteractions(callback);
150bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes    }
151bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes
152bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes    @Test
153bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes    @UiThreadTest
154bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes    public void testSupportActionModeCallbacksInvalidate() {
155bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        final A activity = getActivity();
156bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes
157bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        // Create a mock action mode callback which returns true from onCreateActionMode
158bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        final ActionMode.Callback callback = mock(ActionMode.Callback.class);
159bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        when(callback.onCreateActionMode(any(ActionMode.class), any(Menu.class))).thenReturn(true);
160bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes
161bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        // Start an action mode
162bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        final ActionMode actionMode = activity.startSupportActionMode(callback);
163bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        // Assert that one was created
164bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        assertNotNull(actionMode);
165bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        // Reset the mock so that any callback counts from the create are reset
166bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        reset(callback);
167bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes
168bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        // Now invalidate the action mode
169bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        actionMode.invalidate();
170bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes
171bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        // Now verify that onCreateActionMode is not called, and onPrepareActionMode is called once
172bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        verify(callback, never()).onCreateActionMode(any(ActionMode.class), any(Menu.class));
173bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        verify(callback).onPrepareActionMode(any(ActionMode.class), any(Menu.class));
174bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes    }
175bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes
176bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes    @Test
177bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes    @UiThreadTest
178bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes    public void testSupportActionModeCallbacksWithFalseOnCreate() {
179bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        final A activity = getActivity();
180bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes
181bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        // Create a mock action mode callback which returns true from onCreateActionMode
182bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        final ActionMode.Callback callback = mock(ActionMode.Callback.class);
183bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        when(callback.onCreateActionMode(any(ActionMode.class), any(Menu.class))).thenReturn(false);
184bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes
185bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        // Start an action mode
186bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        final ActionMode actionMode = activity.startSupportActionMode(callback);
187bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes
188bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        // Now verify that onCreateActionMode is called once
189bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        verify(callback).onCreateActionMode(any(ActionMode.class), any(Menu.class));
190bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes
191bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        // Now verify that onPrepareActionMode is not called (since onCreateActionMode
192bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        // returns false)
193bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        verify(callback, never()).onPrepareActionMode(any(ActionMode.class), any(Menu.class));
194bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes
195bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        // Assert that an action mode was not created
196bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        assertNull(actionMode);
197bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes    }
198bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes
1991f428040204ce6b234cf3be304051ceb9e90a9e7Aurimas Liutikas    @SuppressWarnings("deprecation")
2001f428040204ce6b234cf3be304051ceb9e90a9e7Aurimas Liutikas    @SuppressLint("InlinedApi")
2011f428040204ce6b234cf3be304051ceb9e90a9e7Aurimas Liutikas    private static boolean canShowSystemUi(Activity activity) {
2021f428040204ce6b234cf3be304051ceb9e90a9e7Aurimas Liutikas        PackageManager manager = activity.getPackageManager();
2031f428040204ce6b234cf3be304051ceb9e90a9e7Aurimas Liutikas        return !manager.hasSystemFeature(PackageManager.FEATURE_TELEVISION)
2041f428040204ce6b234cf3be304051ceb9e90a9e7Aurimas Liutikas                && !manager.hasSystemFeature(PackageManager.FEATURE_LEANBACK)
2051f428040204ce6b234cf3be304051ceb9e90a9e7Aurimas Liutikas                && !manager.hasSystemFeature(PackageManager.FEATURE_WATCH);
2061f428040204ce6b234cf3be304051ceb9e90a9e7Aurimas Liutikas    }
2071f428040204ce6b234cf3be304051ceb9e90a9e7Aurimas Liutikas
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