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