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