1af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri/* 2af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri * Copyright (C) 2016 The Android Open Source Project 3af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri * 4af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri * Licensed under the Apache License, Version 2.0 (the "License"); 5af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri * you may not use this file except in compliance with the License. 6af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri * You may obtain a copy of the License at 7af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri * 8af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri * http://www.apache.org/licenses/LICENSE-2.0 9af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri * 10af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri * Unless required by applicable law or agreed to in writing, software 11af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri * distributed under the License is distributed on an "AS IS" BASIS, 12af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri * See the License for the specific language governing permissions and 14af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri * limitations under the License. 15af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri */ 16af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarripackage android.support.v4.app; 17af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri 18cfedb8d5ab2b14e025e8202fb6d0a2356e56c18fGeorge Mountimport static junit.framework.TestCase.assertEquals; 19af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarriimport static junit.framework.TestCase.assertFalse; 20af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarriimport static junit.framework.TestCase.assertTrue; 21af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri 228b60e88655f6d4191e55b1dd8706e4ae2ae21b04George Mountimport static org.junit.Assert.assertNotSame; 238b60e88655f6d4191e55b1dd8706e4ae2ae21b04George Mountimport static org.junit.Assert.assertNull; 248b60e88655f6d4191e55b1dd8706e4ae2ae21b04George Mountimport static org.junit.Assert.assertSame; 250765353c002bfdf681c982565810aa4be3499dd0George Mount 260765353c002bfdf681c982565810aa4be3499dd0George Mountimport android.app.Activity; 2747844337986f365dae294fb434de0c0f7f8df5dbGeorge Mountimport android.app.Instrumentation; 280765353c002bfdf681c982565810aa4be3499dd0George Mountimport android.content.Intent; 2947844337986f365dae294fb434de0c0f7f8df5dbGeorge Mountimport android.os.Bundle; 3096221034e4a23a2abb83f772a0281bb197ac5ac0George Mountimport android.os.SystemClock; 318b60e88655f6d4191e55b1dd8706e4ae2ae21b04George Mountimport android.support.annotation.Nullable; 32af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarriimport android.support.fragment.test.R; 33af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarriimport android.support.test.InstrumentationRegistry; 3447844337986f365dae294fb434de0c0f7f8df5dbGeorge Mountimport android.support.test.annotation.UiThreadTest; 35754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikasimport android.support.test.filters.MediumTest; 36af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarriimport android.support.test.rule.ActivityTestRule; 37af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarriimport android.support.test.runner.AndroidJUnit4; 38af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarriimport android.support.v4.app.test.FragmentTestActivity; 390765353c002bfdf681c982565810aa4be3499dd0George Mountimport android.support.v4.app.test.NewIntentActivity; 408b60e88655f6d4191e55b1dd8706e4ae2ae21b04George Mountimport android.view.LayoutInflater; 418b60e88655f6d4191e55b1dd8706e4ae2ae21b04George Mountimport android.view.View; 428b60e88655f6d4191e55b1dd8706e4ae2ae21b04George Mountimport android.view.ViewGroup; 43af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri 44ff3deb363de36fc9bab1ec6eb4f0f48e4c3556f4George Mountimport org.junit.After; 45af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarriimport org.junit.Before; 46af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarriimport org.junit.Rule; 47af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarriimport org.junit.Test; 48af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarriimport org.junit.runner.RunWith; 49af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri 5043db3168ca4a4d309f059363054ba60bc22a9ef3George Mountimport java.util.Collection; 510765353c002bfdf681c982565810aa4be3499dd0George Mountimport java.util.concurrent.TimeUnit; 5296221034e4a23a2abb83f772a0281bb197ac5ac0George Mount 53af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri/** 54af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri * Tests usage of the {@link FragmentTransaction} class. 55af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri */ 56754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikas@MediumTest 57af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri@RunWith(AndroidJUnit4.class) 58af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarripublic class FragmentTransactionTest { 59af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri 60af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri @Rule 61af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri public ActivityTestRule<FragmentTestActivity> mActivityRule = 62af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri new ActivityTestRule<>(FragmentTestActivity.class); 63af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri 64af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri private FragmentTestActivity mActivity; 65ff3deb363de36fc9bab1ec6eb4f0f48e4c3556f4George Mount private int mOnBackStackChangedTimes; 66ff3deb363de36fc9bab1ec6eb4f0f48e4c3556f4George Mount private FragmentManager.OnBackStackChangedListener mOnBackStackChangedListener; 67af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri 68af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri @Before 69af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri public void setUp() { 70af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri mActivity = mActivityRule.getActivity(); 71ff3deb363de36fc9bab1ec6eb4f0f48e4c3556f4George Mount mOnBackStackChangedTimes = 0; 72ff3deb363de36fc9bab1ec6eb4f0f48e4c3556f4George Mount mOnBackStackChangedListener = new FragmentManager.OnBackStackChangedListener() { 73ff3deb363de36fc9bab1ec6eb4f0f48e4c3556f4George Mount @Override 74ff3deb363de36fc9bab1ec6eb4f0f48e4c3556f4George Mount public void onBackStackChanged() { 75ff3deb363de36fc9bab1ec6eb4f0f48e4c3556f4George Mount mOnBackStackChangedTimes++; 76ff3deb363de36fc9bab1ec6eb4f0f48e4c3556f4George Mount } 77ff3deb363de36fc9bab1ec6eb4f0f48e4c3556f4George Mount }; 78ff3deb363de36fc9bab1ec6eb4f0f48e4c3556f4George Mount mActivity.getSupportFragmentManager() 79ff3deb363de36fc9bab1ec6eb4f0f48e4c3556f4George Mount .addOnBackStackChangedListener(mOnBackStackChangedListener); 80ff3deb363de36fc9bab1ec6eb4f0f48e4c3556f4George Mount } 81ff3deb363de36fc9bab1ec6eb4f0f48e4c3556f4George Mount 82ff3deb363de36fc9bab1ec6eb4f0f48e4c3556f4George Mount @After 83ff3deb363de36fc9bab1ec6eb4f0f48e4c3556f4George Mount public void tearDown() { 84ff3deb363de36fc9bab1ec6eb4f0f48e4c3556f4George Mount mActivity.getSupportFragmentManager() 85ff3deb363de36fc9bab1ec6eb4f0f48e4c3556f4George Mount .removeOnBackStackChangedListener(mOnBackStackChangedListener); 86ff3deb363de36fc9bab1ec6eb4f0f48e4c3556f4George Mount mOnBackStackChangedListener = null; 87af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri } 88af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri 89af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri @Test 90c90b24ff959edb955ff48e345c074a98368a90adAurimas Liutikas public void testAddTransactionWithValidFragment() throws Throwable { 91af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri final Fragment fragment = new CorrectFragment(); 92c90b24ff959edb955ff48e345c074a98368a90adAurimas Liutikas mActivityRule.runOnUiThread(new Runnable() { 93af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri @Override 94af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri public void run() { 95af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri mActivity.getSupportFragmentManager().beginTransaction() 96af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri .add(R.id.content, fragment) 97af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri .addToBackStack(null) 98af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri .commit(); 99af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri mActivity.getSupportFragmentManager().executePendingTransactions(); 100ff3deb363de36fc9bab1ec6eb4f0f48e4c3556f4George Mount assertEquals(1, mOnBackStackChangedTimes); 101af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri } 102af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri }); 103af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri InstrumentationRegistry.getInstrumentation().waitForIdleSync(); 104af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri assertTrue(fragment.isAdded()); 105af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri } 106af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri 107af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri @Test 108c90b24ff959edb955ff48e345c074a98368a90adAurimas Liutikas public void testAddTransactionWithPrivateFragment() throws Throwable { 109af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri final Fragment fragment = new PrivateFragment(); 110c90b24ff959edb955ff48e345c074a98368a90adAurimas Liutikas mActivityRule.runOnUiThread(new Runnable() { 111af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri @Override 112af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri public void run() { 113af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri boolean exceptionThrown = false; 114af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri try { 115af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri mActivity.getSupportFragmentManager().beginTransaction() 116af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri .add(R.id.content, fragment) 117af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri .addToBackStack(null) 118af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri .commit(); 119af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri mActivity.getSupportFragmentManager().executePendingTransactions(); 120ff3deb363de36fc9bab1ec6eb4f0f48e4c3556f4George Mount assertEquals(1, mOnBackStackChangedTimes); 121af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri } catch (IllegalStateException e) { 122af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri exceptionThrown = true; 123af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri } finally { 124af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri assertTrue("Exception should be thrown", exceptionThrown); 125af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri assertFalse("Fragment shouldn't be added", fragment.isAdded()); 126af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri } 127af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri } 128af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri }); 129af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri InstrumentationRegistry.getInstrumentation().waitForIdleSync(); 130af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri } 131af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri 132af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri @Test 133c90b24ff959edb955ff48e345c074a98368a90adAurimas Liutikas public void testAddTransactionWithPackagePrivateFragment() throws Throwable { 134af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri final Fragment fragment = new PackagePrivateFragment(); 135c90b24ff959edb955ff48e345c074a98368a90adAurimas Liutikas mActivityRule.runOnUiThread(new Runnable() { 136af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri @Override 137af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri public void run() { 138af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri boolean exceptionThrown = false; 139af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri try { 140af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri mActivity.getSupportFragmentManager().beginTransaction() 141af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri .add(R.id.content, fragment) 142af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri .addToBackStack(null) 143af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri .commit(); 144af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri mActivity.getSupportFragmentManager().executePendingTransactions(); 145ff3deb363de36fc9bab1ec6eb4f0f48e4c3556f4George Mount assertEquals(1, mOnBackStackChangedTimes); 146af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri } catch (IllegalStateException e) { 147af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri exceptionThrown = true; 148af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri } finally { 149af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri assertTrue("Exception should be thrown", exceptionThrown); 150af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri assertFalse("Fragment shouldn't be added", fragment.isAdded()); 151af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri } 152af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri } 153af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri }); 154af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri InstrumentationRegistry.getInstrumentation().waitForIdleSync(); 155af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri } 156af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri 157af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri @Test 158c90b24ff959edb955ff48e345c074a98368a90adAurimas Liutikas public void testAddTransactionWithAnonymousFragment() throws Throwable { 159af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri final Fragment fragment = new Fragment() {}; 160c90b24ff959edb955ff48e345c074a98368a90adAurimas Liutikas mActivityRule.runOnUiThread(new Runnable() { 161af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri @Override 162af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri public void run() { 163af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri boolean exceptionThrown = false; 164af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri try { 165af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri mActivity.getSupportFragmentManager().beginTransaction() 166af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri .add(R.id.content, fragment) 167af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri .addToBackStack(null) 168af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri .commit(); 169af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri mActivity.getSupportFragmentManager().executePendingTransactions(); 170ff3deb363de36fc9bab1ec6eb4f0f48e4c3556f4George Mount assertEquals(1, mOnBackStackChangedTimes); 171af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri } catch (IllegalStateException e) { 172af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri exceptionThrown = true; 173af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri } finally { 174af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri assertTrue("Exception should be thrown", exceptionThrown); 175af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri assertFalse("Fragment shouldn't be added", fragment.isAdded()); 176af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri } 177af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri } 178af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri }); 179af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri InstrumentationRegistry.getInstrumentation().waitForIdleSync(); 180af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri } 181af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri 182af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri @Test 1838b60e88655f6d4191e55b1dd8706e4ae2ae21b04George Mount public void testGetLayoutInflater() throws Throwable { 1848b60e88655f6d4191e55b1dd8706e4ae2ae21b04George Mount mActivityRule.runOnUiThread(new Runnable() { 1858b60e88655f6d4191e55b1dd8706e4ae2ae21b04George Mount @Override 1868b60e88655f6d4191e55b1dd8706e4ae2ae21b04George Mount public void run() { 1878b60e88655f6d4191e55b1dd8706e4ae2ae21b04George Mount final OnGetLayoutInflaterFragment fragment1 = new OnGetLayoutInflaterFragment(); 1888b60e88655f6d4191e55b1dd8706e4ae2ae21b04George Mount assertEquals(0, fragment1.onGetLayoutInflaterCalls); 1898b60e88655f6d4191e55b1dd8706e4ae2ae21b04George Mount mActivity.getSupportFragmentManager().beginTransaction() 1908b60e88655f6d4191e55b1dd8706e4ae2ae21b04George Mount .add(R.id.content, fragment1) 1918b60e88655f6d4191e55b1dd8706e4ae2ae21b04George Mount .addToBackStack(null) 1928b60e88655f6d4191e55b1dd8706e4ae2ae21b04George Mount .commit(); 1938b60e88655f6d4191e55b1dd8706e4ae2ae21b04George Mount mActivity.getSupportFragmentManager().executePendingTransactions(); 1948b60e88655f6d4191e55b1dd8706e4ae2ae21b04George Mount assertEquals(1, fragment1.onGetLayoutInflaterCalls); 1958b60e88655f6d4191e55b1dd8706e4ae2ae21b04George Mount assertEquals(fragment1.layoutInflater, fragment1.getLayoutInflater()); 1968b60e88655f6d4191e55b1dd8706e4ae2ae21b04George Mount // getLayoutInflater() didn't force onGetLayoutInflater() 1978b60e88655f6d4191e55b1dd8706e4ae2ae21b04George Mount assertEquals(1, fragment1.onGetLayoutInflaterCalls); 1988b60e88655f6d4191e55b1dd8706e4ae2ae21b04George Mount 1998b60e88655f6d4191e55b1dd8706e4ae2ae21b04George Mount LayoutInflater layoutInflater = fragment1.layoutInflater; 2008b60e88655f6d4191e55b1dd8706e4ae2ae21b04George Mount // Replacing fragment1 won't detach it, so the value won't be cleared 2018b60e88655f6d4191e55b1dd8706e4ae2ae21b04George Mount final OnGetLayoutInflaterFragment fragment2 = new OnGetLayoutInflaterFragment(); 2028b60e88655f6d4191e55b1dd8706e4ae2ae21b04George Mount mActivity.getSupportFragmentManager().beginTransaction() 2038b60e88655f6d4191e55b1dd8706e4ae2ae21b04George Mount .replace(R.id.content, fragment2) 2048b60e88655f6d4191e55b1dd8706e4ae2ae21b04George Mount .addToBackStack(null) 2058b60e88655f6d4191e55b1dd8706e4ae2ae21b04George Mount .commit(); 2068b60e88655f6d4191e55b1dd8706e4ae2ae21b04George Mount mActivity.getSupportFragmentManager().executePendingTransactions(); 2078b60e88655f6d4191e55b1dd8706e4ae2ae21b04George Mount 2088b60e88655f6d4191e55b1dd8706e4ae2ae21b04George Mount assertSame(layoutInflater, fragment1.getLayoutInflater()); 2098b60e88655f6d4191e55b1dd8706e4ae2ae21b04George Mount assertEquals(1, fragment1.onGetLayoutInflaterCalls); 2108b60e88655f6d4191e55b1dd8706e4ae2ae21b04George Mount 2118b60e88655f6d4191e55b1dd8706e4ae2ae21b04George Mount // Popping it should cause onCreateView again, so a new LayoutInflater... 2128b60e88655f6d4191e55b1dd8706e4ae2ae21b04George Mount mActivity.getSupportFragmentManager().popBackStackImmediate(); 2138b60e88655f6d4191e55b1dd8706e4ae2ae21b04George Mount assertNotSame(layoutInflater, fragment1.getLayoutInflater()); 2148b60e88655f6d4191e55b1dd8706e4ae2ae21b04George Mount assertEquals(2, fragment1.onGetLayoutInflaterCalls); 2158b60e88655f6d4191e55b1dd8706e4ae2ae21b04George Mount layoutInflater = fragment1.layoutInflater; 2168b60e88655f6d4191e55b1dd8706e4ae2ae21b04George Mount assertSame(layoutInflater, fragment1.getLayoutInflater()); 2178b60e88655f6d4191e55b1dd8706e4ae2ae21b04George Mount 2188b60e88655f6d4191e55b1dd8706e4ae2ae21b04George Mount // Popping it should detach it, clearing the cached value again 2198b60e88655f6d4191e55b1dd8706e4ae2ae21b04George Mount mActivity.getSupportFragmentManager().popBackStackImmediate(); 2208b60e88655f6d4191e55b1dd8706e4ae2ae21b04George Mount 2218b60e88655f6d4191e55b1dd8706e4ae2ae21b04George Mount // once it is detached, the getLayoutInflater() will default to throw 2228b60e88655f6d4191e55b1dd8706e4ae2ae21b04George Mount // an exception, but we've made it return null instead. 2238b60e88655f6d4191e55b1dd8706e4ae2ae21b04George Mount assertEquals(2, fragment1.onGetLayoutInflaterCalls); 2248b60e88655f6d4191e55b1dd8706e4ae2ae21b04George Mount assertNull(fragment1.getLayoutInflater()); 2258b60e88655f6d4191e55b1dd8706e4ae2ae21b04George Mount assertEquals(3, fragment1.onGetLayoutInflaterCalls); 2268b60e88655f6d4191e55b1dd8706e4ae2ae21b04George Mount } 2278b60e88655f6d4191e55b1dd8706e4ae2ae21b04George Mount }); 2288b60e88655f6d4191e55b1dd8706e4ae2ae21b04George Mount } 2298b60e88655f6d4191e55b1dd8706e4ae2ae21b04George Mount 2308b60e88655f6d4191e55b1dd8706e4ae2ae21b04George Mount @Test 231c90b24ff959edb955ff48e345c074a98368a90adAurimas Liutikas public void testAddTransactionWithNonStaticFragment() throws Throwable { 232af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri final Fragment fragment = new NonStaticFragment(); 233c90b24ff959edb955ff48e345c074a98368a90adAurimas Liutikas mActivityRule.runOnUiThread(new Runnable() { 234af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri @Override 235af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri public void run() { 236af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri boolean exceptionThrown = false; 237af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri try { 238af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri mActivity.getSupportFragmentManager().beginTransaction() 239af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri .add(R.id.content, fragment) 240af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri .addToBackStack(null) 241af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri .commit(); 242af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri mActivity.getSupportFragmentManager().executePendingTransactions(); 243ff3deb363de36fc9bab1ec6eb4f0f48e4c3556f4George Mount assertEquals(1, mOnBackStackChangedTimes); 244af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri } catch (IllegalStateException e) { 245af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri exceptionThrown = true; 246af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri } finally { 247af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri assertTrue("Exception should be thrown", exceptionThrown); 248af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri assertFalse("Fragment shouldn't be added", fragment.isAdded()); 249af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri } 250af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri } 251af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri }); 252af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri InstrumentationRegistry.getInstrumentation().waitForIdleSync(); 253af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri } 254af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri 2555e2b030b851bde2b4569104a01b4acf6960327a6Adam Powell @Test 2565e2b030b851bde2b4569104a01b4acf6960327a6Adam Powell public void testPostOnCommit() throws Throwable { 2575e2b030b851bde2b4569104a01b4acf6960327a6Adam Powell mActivityRule.runOnUiThread(new Runnable() { 2585e2b030b851bde2b4569104a01b4acf6960327a6Adam Powell @Override 2595e2b030b851bde2b4569104a01b4acf6960327a6Adam Powell public void run() { 2605e2b030b851bde2b4569104a01b4acf6960327a6Adam Powell final boolean[] ran = new boolean[1]; 2615e2b030b851bde2b4569104a01b4acf6960327a6Adam Powell FragmentManager fm = mActivityRule.getActivity().getSupportFragmentManager(); 2621d1dad664f27bc66fa52e4b0a294a5efb5af0ea1Adam Powell fm.beginTransaction().runOnCommit(new Runnable() { 2635e2b030b851bde2b4569104a01b4acf6960327a6Adam Powell @Override 2645e2b030b851bde2b4569104a01b4acf6960327a6Adam Powell public void run() { 2655e2b030b851bde2b4569104a01b4acf6960327a6Adam Powell ran[0] = true; 2665e2b030b851bde2b4569104a01b4acf6960327a6Adam Powell } 2675e2b030b851bde2b4569104a01b4acf6960327a6Adam Powell }).commit(); 2685e2b030b851bde2b4569104a01b4acf6960327a6Adam Powell fm.executePendingTransactions(); 2695e2b030b851bde2b4569104a01b4acf6960327a6Adam Powell 2701d1dad664f27bc66fa52e4b0a294a5efb5af0ea1Adam Powell assertTrue("runOnCommit runnable never ran", ran[0]); 2715e2b030b851bde2b4569104a01b4acf6960327a6Adam Powell 2725e2b030b851bde2b4569104a01b4acf6960327a6Adam Powell ran[0] = false; 2735e2b030b851bde2b4569104a01b4acf6960327a6Adam Powell 2745e2b030b851bde2b4569104a01b4acf6960327a6Adam Powell boolean threw = false; 2755e2b030b851bde2b4569104a01b4acf6960327a6Adam Powell try { 2761d1dad664f27bc66fa52e4b0a294a5efb5af0ea1Adam Powell fm.beginTransaction().runOnCommit(new Runnable() { 2775e2b030b851bde2b4569104a01b4acf6960327a6Adam Powell @Override 2785e2b030b851bde2b4569104a01b4acf6960327a6Adam Powell public void run() { 2795e2b030b851bde2b4569104a01b4acf6960327a6Adam Powell ran[0] = true; 2805e2b030b851bde2b4569104a01b4acf6960327a6Adam Powell } 2815e2b030b851bde2b4569104a01b4acf6960327a6Adam Powell }).addToBackStack(null).commit(); 2825e2b030b851bde2b4569104a01b4acf6960327a6Adam Powell } catch (IllegalStateException ise) { 2835e2b030b851bde2b4569104a01b4acf6960327a6Adam Powell threw = true; 2845e2b030b851bde2b4569104a01b4acf6960327a6Adam Powell } 2855e2b030b851bde2b4569104a01b4acf6960327a6Adam Powell 2865e2b030b851bde2b4569104a01b4acf6960327a6Adam Powell fm.executePendingTransactions(); 2875e2b030b851bde2b4569104a01b4acf6960327a6Adam Powell 2881d1dad664f27bc66fa52e4b0a294a5efb5af0ea1Adam Powell assertTrue("runOnCommit was allowed to be called for back stack transaction", 2895e2b030b851bde2b4569104a01b4acf6960327a6Adam Powell threw); 2901d1dad664f27bc66fa52e4b0a294a5efb5af0ea1Adam Powell assertFalse("runOnCommit runnable for back stack transaction was run", ran[0]); 2915e2b030b851bde2b4569104a01b4acf6960327a6Adam Powell } 2925e2b030b851bde2b4569104a01b4acf6960327a6Adam Powell }); 2935e2b030b851bde2b4569104a01b4acf6960327a6Adam Powell } 2945e2b030b851bde2b4569104a01b4acf6960327a6Adam Powell 29547844337986f365dae294fb434de0c0f7f8df5dbGeorge Mount /** 29647844337986f365dae294fb434de0c0f7f8df5dbGeorge Mount * Test to ensure that when onBackPressed() is received that there is no crash. 29747844337986f365dae294fb434de0c0f7f8df5dbGeorge Mount */ 29847844337986f365dae294fb434de0c0f7f8df5dbGeorge Mount @Test 29947844337986f365dae294fb434de0c0f7f8df5dbGeorge Mount @UiThreadTest 30047844337986f365dae294fb434de0c0f7f8df5dbGeorge Mount public void crashOnBackPressed() throws Throwable { 30147844337986f365dae294fb434de0c0f7f8df5dbGeorge Mount Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation(); 30247844337986f365dae294fb434de0c0f7f8df5dbGeorge Mount Bundle outState = new Bundle(); 30347844337986f365dae294fb434de0c0f7f8df5dbGeorge Mount FragmentTestActivity activity = mActivityRule.getActivity(); 30447844337986f365dae294fb434de0c0f7f8df5dbGeorge Mount instrumentation.callActivityOnSaveInstanceState(activity, outState); 30547844337986f365dae294fb434de0c0f7f8df5dbGeorge Mount activity.onBackPressed(); 30647844337986f365dae294fb434de0c0f7f8df5dbGeorge Mount } 30747844337986f365dae294fb434de0c0f7f8df5dbGeorge Mount 30896221034e4a23a2abb83f772a0281bb197ac5ac0George Mount // Ensure that getFragments() works during transactions, even if it is run off thread 30996221034e4a23a2abb83f772a0281bb197ac5ac0George Mount @Test 31096221034e4a23a2abb83f772a0281bb197ac5ac0George Mount public void getFragmentsOffThread() throws Throwable { 31196221034e4a23a2abb83f772a0281bb197ac5ac0George Mount final FragmentManager fm = mActivity.getSupportFragmentManager(); 31296221034e4a23a2abb83f772a0281bb197ac5ac0George Mount 31396221034e4a23a2abb83f772a0281bb197ac5ac0George Mount // Make sure that adding a fragment works 31496221034e4a23a2abb83f772a0281bb197ac5ac0George Mount Fragment fragment = new CorrectFragment(); 31596221034e4a23a2abb83f772a0281bb197ac5ac0George Mount fm.beginTransaction() 31696221034e4a23a2abb83f772a0281bb197ac5ac0George Mount .add(R.id.content, fragment) 31796221034e4a23a2abb83f772a0281bb197ac5ac0George Mount .addToBackStack(null) 31896221034e4a23a2abb83f772a0281bb197ac5ac0George Mount .commit(); 31996221034e4a23a2abb83f772a0281bb197ac5ac0George Mount 32096221034e4a23a2abb83f772a0281bb197ac5ac0George Mount FragmentTestUtil.executePendingTransactions(mActivityRule); 32143db3168ca4a4d309f059363054ba60bc22a9ef3George Mount Collection<Fragment> fragments = fm.getFragments(); 32296221034e4a23a2abb83f772a0281bb197ac5ac0George Mount assertEquals(1, fragments.size()); 32343db3168ca4a4d309f059363054ba60bc22a9ef3George Mount assertTrue(fragments.contains(fragment)); 32496221034e4a23a2abb83f772a0281bb197ac5ac0George Mount 32596221034e4a23a2abb83f772a0281bb197ac5ac0George Mount // Removed fragments shouldn't show 32696221034e4a23a2abb83f772a0281bb197ac5ac0George Mount fm.beginTransaction() 32796221034e4a23a2abb83f772a0281bb197ac5ac0George Mount .remove(fragment) 32896221034e4a23a2abb83f772a0281bb197ac5ac0George Mount .addToBackStack(null) 32996221034e4a23a2abb83f772a0281bb197ac5ac0George Mount .commit(); 33096221034e4a23a2abb83f772a0281bb197ac5ac0George Mount FragmentTestUtil.executePendingTransactions(mActivityRule); 33196221034e4a23a2abb83f772a0281bb197ac5ac0George Mount assertTrue(fm.getFragments().isEmpty()); 33296221034e4a23a2abb83f772a0281bb197ac5ac0George Mount 33396221034e4a23a2abb83f772a0281bb197ac5ac0George Mount // Now try detached fragments 33496221034e4a23a2abb83f772a0281bb197ac5ac0George Mount FragmentTestUtil.popBackStackImmediate(mActivityRule); 33596221034e4a23a2abb83f772a0281bb197ac5ac0George Mount fm.beginTransaction() 33696221034e4a23a2abb83f772a0281bb197ac5ac0George Mount .detach(fragment) 33796221034e4a23a2abb83f772a0281bb197ac5ac0George Mount .addToBackStack(null) 33896221034e4a23a2abb83f772a0281bb197ac5ac0George Mount .commit(); 33996221034e4a23a2abb83f772a0281bb197ac5ac0George Mount FragmentTestUtil.executePendingTransactions(mActivityRule); 34096221034e4a23a2abb83f772a0281bb197ac5ac0George Mount assertTrue(fm.getFragments().isEmpty()); 34196221034e4a23a2abb83f772a0281bb197ac5ac0George Mount 34296221034e4a23a2abb83f772a0281bb197ac5ac0George Mount // Now try hidden fragments 34396221034e4a23a2abb83f772a0281bb197ac5ac0George Mount FragmentTestUtil.popBackStackImmediate(mActivityRule); 34496221034e4a23a2abb83f772a0281bb197ac5ac0George Mount fm.beginTransaction() 34596221034e4a23a2abb83f772a0281bb197ac5ac0George Mount .hide(fragment) 34696221034e4a23a2abb83f772a0281bb197ac5ac0George Mount .addToBackStack(null) 34796221034e4a23a2abb83f772a0281bb197ac5ac0George Mount .commit(); 34896221034e4a23a2abb83f772a0281bb197ac5ac0George Mount FragmentTestUtil.executePendingTransactions(mActivityRule); 34996221034e4a23a2abb83f772a0281bb197ac5ac0George Mount fragments = fm.getFragments(); 35096221034e4a23a2abb83f772a0281bb197ac5ac0George Mount assertEquals(1, fragments.size()); 35143db3168ca4a4d309f059363054ba60bc22a9ef3George Mount assertTrue(fragments.contains(fragment)); 35296221034e4a23a2abb83f772a0281bb197ac5ac0George Mount 35396221034e4a23a2abb83f772a0281bb197ac5ac0George Mount // And showing it again shouldn't change anything: 35496221034e4a23a2abb83f772a0281bb197ac5ac0George Mount FragmentTestUtil.popBackStackImmediate(mActivityRule); 35596221034e4a23a2abb83f772a0281bb197ac5ac0George Mount fragments = fm.getFragments(); 35696221034e4a23a2abb83f772a0281bb197ac5ac0George Mount assertEquals(1, fragments.size()); 35743db3168ca4a4d309f059363054ba60bc22a9ef3George Mount assertTrue(fragments.contains(fragment)); 35896221034e4a23a2abb83f772a0281bb197ac5ac0George Mount 35996221034e4a23a2abb83f772a0281bb197ac5ac0George Mount // Now pop back to the start state 36096221034e4a23a2abb83f772a0281bb197ac5ac0George Mount FragmentTestUtil.popBackStackImmediate(mActivityRule); 36196221034e4a23a2abb83f772a0281bb197ac5ac0George Mount 36296221034e4a23a2abb83f772a0281bb197ac5ac0George Mount // We can't force concurrency, but we can do it lots of times and hope that 36396221034e4a23a2abb83f772a0281bb197ac5ac0George Mount // we hit it. 36496221034e4a23a2abb83f772a0281bb197ac5ac0George Mount for (int i = 0; i < 100; i++) { 36543db3168ca4a4d309f059363054ba60bc22a9ef3George Mount Fragment fragment2 = new CorrectFragment(); 36696221034e4a23a2abb83f772a0281bb197ac5ac0George Mount fm.beginTransaction() 36743db3168ca4a4d309f059363054ba60bc22a9ef3George Mount .add(R.id.content, fragment2) 36896221034e4a23a2abb83f772a0281bb197ac5ac0George Mount .addToBackStack(null) 36996221034e4a23a2abb83f772a0281bb197ac5ac0George Mount .commit(); 37096221034e4a23a2abb83f772a0281bb197ac5ac0George Mount getFragmentsUntilSize(1); 37196221034e4a23a2abb83f772a0281bb197ac5ac0George Mount 37296221034e4a23a2abb83f772a0281bb197ac5ac0George Mount fm.popBackStack(); 37396221034e4a23a2abb83f772a0281bb197ac5ac0George Mount getFragmentsUntilSize(0); 37496221034e4a23a2abb83f772a0281bb197ac5ac0George Mount } 37596221034e4a23a2abb83f772a0281bb197ac5ac0George Mount } 37696221034e4a23a2abb83f772a0281bb197ac5ac0George Mount 377875d9733f354fc93e72c7e8d849c9b5333950183George Mount /** 378875d9733f354fc93e72c7e8d849c9b5333950183George Mount * When a FragmentManager is detached, it should allow commitAllowingStateLoss() 379875d9733f354fc93e72c7e8d849c9b5333950183George Mount * and commitNowAllowingStateLoss() by just dropping the transaction. 380875d9733f354fc93e72c7e8d849c9b5333950183George Mount */ 381875d9733f354fc93e72c7e8d849c9b5333950183George Mount @Test 382875d9733f354fc93e72c7e8d849c9b5333950183George Mount public void commitAllowStateLossDetached() throws Throwable { 383875d9733f354fc93e72c7e8d849c9b5333950183George Mount Fragment fragment1 = new CorrectFragment(); 384875d9733f354fc93e72c7e8d849c9b5333950183George Mount mActivity.getSupportFragmentManager() 385875d9733f354fc93e72c7e8d849c9b5333950183George Mount .beginTransaction() 386875d9733f354fc93e72c7e8d849c9b5333950183George Mount .add(fragment1, "1") 387875d9733f354fc93e72c7e8d849c9b5333950183George Mount .commit(); 388875d9733f354fc93e72c7e8d849c9b5333950183George Mount FragmentTestUtil.executePendingTransactions(mActivityRule); 389875d9733f354fc93e72c7e8d849c9b5333950183George Mount final FragmentManager fm = fragment1.getChildFragmentManager(); 390875d9733f354fc93e72c7e8d849c9b5333950183George Mount mActivity.getSupportFragmentManager() 391875d9733f354fc93e72c7e8d849c9b5333950183George Mount .beginTransaction() 392875d9733f354fc93e72c7e8d849c9b5333950183George Mount .remove(fragment1) 393875d9733f354fc93e72c7e8d849c9b5333950183George Mount .commit(); 394875d9733f354fc93e72c7e8d849c9b5333950183George Mount FragmentTestUtil.executePendingTransactions(mActivityRule); 395875d9733f354fc93e72c7e8d849c9b5333950183George Mount assertEquals(0, mActivity.getSupportFragmentManager().getFragments().size()); 396875d9733f354fc93e72c7e8d849c9b5333950183George Mount assertEquals(0, fm.getFragments().size()); 397875d9733f354fc93e72c7e8d849c9b5333950183George Mount 398875d9733f354fc93e72c7e8d849c9b5333950183George Mount // Now the fragment1's fragment manager should allow commitAllowingStateLoss 399875d9733f354fc93e72c7e8d849c9b5333950183George Mount // by doing nothing since it has been detached. 400875d9733f354fc93e72c7e8d849c9b5333950183George Mount Fragment fragment2 = new CorrectFragment(); 401875d9733f354fc93e72c7e8d849c9b5333950183George Mount fm.beginTransaction() 402875d9733f354fc93e72c7e8d849c9b5333950183George Mount .add(fragment2, "2") 403875d9733f354fc93e72c7e8d849c9b5333950183George Mount .commitAllowingStateLoss(); 404875d9733f354fc93e72c7e8d849c9b5333950183George Mount FragmentTestUtil.executePendingTransactions(mActivityRule); 405875d9733f354fc93e72c7e8d849c9b5333950183George Mount assertEquals(0, fm.getFragments().size()); 406875d9733f354fc93e72c7e8d849c9b5333950183George Mount 407875d9733f354fc93e72c7e8d849c9b5333950183George Mount // It should also allow commitNowAllowingStateLoss by doing nothing 408875d9733f354fc93e72c7e8d849c9b5333950183George Mount mActivityRule.runOnUiThread(new Runnable() { 409875d9733f354fc93e72c7e8d849c9b5333950183George Mount @Override 410875d9733f354fc93e72c7e8d849c9b5333950183George Mount public void run() { 411875d9733f354fc93e72c7e8d849c9b5333950183George Mount Fragment fragment3 = new CorrectFragment(); 412875d9733f354fc93e72c7e8d849c9b5333950183George Mount fm.beginTransaction() 413875d9733f354fc93e72c7e8d849c9b5333950183George Mount .add(fragment3, "3") 414875d9733f354fc93e72c7e8d849c9b5333950183George Mount .commitNowAllowingStateLoss(); 415875d9733f354fc93e72c7e8d849c9b5333950183George Mount assertEquals(0, fm.getFragments().size()); 416875d9733f354fc93e72c7e8d849c9b5333950183George Mount } 417875d9733f354fc93e72c7e8d849c9b5333950183George Mount }); 418875d9733f354fc93e72c7e8d849c9b5333950183George Mount } 419875d9733f354fc93e72c7e8d849c9b5333950183George Mount 4200765353c002bfdf681c982565810aa4be3499dd0George Mount /** 4210765353c002bfdf681c982565810aa4be3499dd0George Mount * onNewIntent() should note that the state is not saved so that child fragment 4220765353c002bfdf681c982565810aa4be3499dd0George Mount * managers can execute transactions. 4230765353c002bfdf681c982565810aa4be3499dd0George Mount */ 4240765353c002bfdf681c982565810aa4be3499dd0George Mount @Test 4250765353c002bfdf681c982565810aa4be3499dd0George Mount public void newIntentUnlocks() throws Throwable { 4260765353c002bfdf681c982565810aa4be3499dd0George Mount Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation(); 4270765353c002bfdf681c982565810aa4be3499dd0George Mount Intent intent1 = new Intent(mActivity, NewIntentActivity.class) 4280765353c002bfdf681c982565810aa4be3499dd0George Mount .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 4290765353c002bfdf681c982565810aa4be3499dd0George Mount NewIntentActivity newIntentActivity = 4300765353c002bfdf681c982565810aa4be3499dd0George Mount (NewIntentActivity) instrumentation.startActivitySync(intent1); 4310765353c002bfdf681c982565810aa4be3499dd0George Mount FragmentTestUtil.waitForExecution(mActivityRule); 4320765353c002bfdf681c982565810aa4be3499dd0George Mount 4330765353c002bfdf681c982565810aa4be3499dd0George Mount Intent intent2 = new Intent(mActivity, FragmentTestActivity.class); 4340765353c002bfdf681c982565810aa4be3499dd0George Mount intent2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 4350765353c002bfdf681c982565810aa4be3499dd0George Mount Activity coveringActivity = instrumentation.startActivitySync(intent2); 4360765353c002bfdf681c982565810aa4be3499dd0George Mount FragmentTestUtil.waitForExecution(mActivityRule); 4370765353c002bfdf681c982565810aa4be3499dd0George Mount 4380765353c002bfdf681c982565810aa4be3499dd0George Mount Intent intent3 = new Intent(mActivity, NewIntentActivity.class) 4390765353c002bfdf681c982565810aa4be3499dd0George Mount .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 4400765353c002bfdf681c982565810aa4be3499dd0George Mount mActivity.startActivity(intent3); 4410765353c002bfdf681c982565810aa4be3499dd0George Mount assertTrue(newIntentActivity.newIntent.await(1, TimeUnit.SECONDS)); 4420765353c002bfdf681c982565810aa4be3499dd0George Mount FragmentTestUtil.waitForExecution(mActivityRule); 4430765353c002bfdf681c982565810aa4be3499dd0George Mount 4440765353c002bfdf681c982565810aa4be3499dd0George Mount for (Fragment fragment : newIntentActivity.getSupportFragmentManager().getFragments()) { 4450765353c002bfdf681c982565810aa4be3499dd0George Mount // There really should only be one fragment in newIntentActivity. 4460765353c002bfdf681c982565810aa4be3499dd0George Mount assertEquals(1, fragment.getChildFragmentManager().getFragments().size()); 4470765353c002bfdf681c982565810aa4be3499dd0George Mount } 4480765353c002bfdf681c982565810aa4be3499dd0George Mount } 4490765353c002bfdf681c982565810aa4be3499dd0George Mount 45096221034e4a23a2abb83f772a0281bb197ac5ac0George Mount private void getFragmentsUntilSize(int expectedSize) { 45196221034e4a23a2abb83f772a0281bb197ac5ac0George Mount final long endTime = SystemClock.uptimeMillis() + 3000; 45296221034e4a23a2abb83f772a0281bb197ac5ac0George Mount 45396221034e4a23a2abb83f772a0281bb197ac5ac0George Mount do { 45496221034e4a23a2abb83f772a0281bb197ac5ac0George Mount assertTrue(SystemClock.uptimeMillis() < endTime); 45596221034e4a23a2abb83f772a0281bb197ac5ac0George Mount } while (mActivity.getSupportFragmentManager().getFragments().size() != expectedSize); 45696221034e4a23a2abb83f772a0281bb197ac5ac0George Mount } 45796221034e4a23a2abb83f772a0281bb197ac5ac0George Mount 458af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri public static class CorrectFragment extends Fragment {} 459af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri 460af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri private static class PrivateFragment extends Fragment {} 461af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri 462af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri static class PackagePrivateFragment extends Fragment {} 463af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri 464af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri private class NonStaticFragment extends Fragment {} 4658b60e88655f6d4191e55b1dd8706e4ae2ae21b04George Mount 4668b60e88655f6d4191e55b1dd8706e4ae2ae21b04George Mount public static class OnGetLayoutInflaterFragment extends Fragment { 4678b60e88655f6d4191e55b1dd8706e4ae2ae21b04George Mount public int onGetLayoutInflaterCalls = 0; 4688b60e88655f6d4191e55b1dd8706e4ae2ae21b04George Mount public LayoutInflater layoutInflater; 4698b60e88655f6d4191e55b1dd8706e4ae2ae21b04George Mount 4708b60e88655f6d4191e55b1dd8706e4ae2ae21b04George Mount @Override 4718b60e88655f6d4191e55b1dd8706e4ae2ae21b04George Mount public LayoutInflater onGetLayoutInflater(Bundle savedInstanceState) { 4728b60e88655f6d4191e55b1dd8706e4ae2ae21b04George Mount onGetLayoutInflaterCalls++; 4738b60e88655f6d4191e55b1dd8706e4ae2ae21b04George Mount try { 4748b60e88655f6d4191e55b1dd8706e4ae2ae21b04George Mount layoutInflater = super.onGetLayoutInflater(savedInstanceState); 4758b60e88655f6d4191e55b1dd8706e4ae2ae21b04George Mount } catch (Exception e) { 4768b60e88655f6d4191e55b1dd8706e4ae2ae21b04George Mount return null; 4778b60e88655f6d4191e55b1dd8706e4ae2ae21b04George Mount } 4788b60e88655f6d4191e55b1dd8706e4ae2ae21b04George Mount return layoutInflater; 4798b60e88655f6d4191e55b1dd8706e4ae2ae21b04George Mount } 4808b60e88655f6d4191e55b1dd8706e4ae2ae21b04George Mount 4818b60e88655f6d4191e55b1dd8706e4ae2ae21b04George Mount @Nullable 4828b60e88655f6d4191e55b1dd8706e4ae2ae21b04George Mount @Override 4838b60e88655f6d4191e55b1dd8706e4ae2ae21b04George Mount public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, 4848b60e88655f6d4191e55b1dd8706e4ae2ae21b04George Mount @Nullable Bundle savedInstanceState) { 4858b60e88655f6d4191e55b1dd8706e4ae2ae21b04George Mount return inflater.inflate(R.layout.fragment_a, container, false); 4868b60e88655f6d4191e55b1dd8706e4ae2ae21b04George Mount } 4878b60e88655f6d4191e55b1dd8706e4ae2ae21b04George Mount } 488af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri} 489