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