1990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount/*
2ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikas * Copyright 2018 The Android Open Source Project
3990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount *
4990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount * Licensed under the Apache License, Version 2.0 (the "License");
5990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount * you may not use this file except in compliance with the License.
6990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount * You may obtain a copy of the License at
7990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount *
8990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount *      http://www.apache.org/licenses/LICENSE-2.0
9990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount *
10990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount * Unless required by applicable law or agreed to in writing, software
11990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount * distributed under the License is distributed on an "AS IS" BASIS,
12990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount * See the License for the specific language governing permissions and
14990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount * limitations under the License.
15990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount */
16ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikaspackage androidx.fragment.app;
17990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
18990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mountimport static org.junit.Assert.assertEquals;
19fa39e2bca1b284ad7c931d9194287770b7b507faAurimas Liutikasimport static org.junit.Assert.assertFalse;
20fa39e2bca1b284ad7c931d9194287770b7b507faAurimas Liutikasimport static org.junit.Assert.assertNotNull;
21fa39e2bca1b284ad7c931d9194287770b7b507faAurimas Liutikasimport static org.junit.Assert.assertNull;
22fa39e2bca1b284ad7c931d9194287770b7b507faAurimas Liutikasimport static org.junit.Assert.assertSame;
23990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mountimport static org.junit.Assert.assertTrue;
24990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mountimport static org.junit.Assert.fail;
25990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
26990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mountimport android.app.Instrumentation;
27aa3a5538c003c6098185d1c948e22054e2f27488George Mountimport android.os.Bundle;
28990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mountimport android.support.test.InstrumentationRegistry;
29990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mountimport android.support.test.filters.MediumTest;
30990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mountimport android.support.test.rule.ActivityTestRule;
31990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mountimport android.support.test.runner.AndroidJUnit4;
321780bc94be2d26adc4a9c2daa2aed87cb535fbcfGeorge Mountimport android.view.LayoutInflater;
33990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mountimport android.view.View;
34990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mountimport android.view.ViewGroup;
35990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
36320113721c2e14bbc2403809046fa2959a665c11Aurimas Liutikasimport androidx.annotation.Nullable;
37320113721c2e14bbc2403809046fa2959a665c11Aurimas Liutikasimport androidx.fragment.app.test.FragmentTestActivity;
38320113721c2e14bbc2403809046fa2959a665c11Aurimas Liutikasimport androidx.fragment.test.R;
39320113721c2e14bbc2403809046fa2959a665c11Aurimas Liutikas
40990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mountimport org.junit.Before;
41990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mountimport org.junit.Rule;
42990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mountimport org.junit.Test;
43990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mountimport org.junit.runner.RunWith;
44990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
45990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount@MediumTest
46990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount@RunWith(AndroidJUnit4.class)
47990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mountpublic class FragmentViewTests {
48990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    @Rule
49990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    public ActivityTestRule<FragmentTestActivity> mActivityRule =
50990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount            new ActivityTestRule<FragmentTestActivity>(FragmentTestActivity.class);
51990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
52990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    private Instrumentation mInstrumentation;
53990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
54990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    @Before
55990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    public void setupInstrumentation() {
56990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        mInstrumentation = InstrumentationRegistry.getInstrumentation();
57990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    }
58990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
59990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    // Test that adding a fragment adds the Views in the proper order. Popping the back stack
60990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    // should remove the correct Views.
61990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    @Test
62990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    public void addFragments() throws Throwable {
63990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.setContentView(mActivityRule, R.layout.simple_container);
64990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        ViewGroup container = (ViewGroup)
65990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                mActivityRule.getActivity().findViewById(R.id.fragmentContainer);
66990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        final FragmentManager fm = mActivityRule.getActivity().getSupportFragmentManager();
67990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
68990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        // One fragment with a view
69990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        final StrictViewFragment fragment1 = new StrictViewFragment();
70990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        fm.beginTransaction().add(R.id.fragmentContainer, fragment1).addToBackStack(null).commit();
71990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.executePendingTransactions(mActivityRule);
72990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.assertChildren(container, fragment1);
73990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
74990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        // Add another on top
75990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        final StrictViewFragment fragment2 = new StrictViewFragment();
76990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        fm.beginTransaction().add(R.id.fragmentContainer, fragment2).addToBackStack(null).commit();
77990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.executePendingTransactions(mActivityRule);
78990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.assertChildren(container, fragment1, fragment2);
79990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
80990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        // Now add two in one transaction:
81990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        final StrictViewFragment fragment3 = new StrictViewFragment();
82990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        final StrictViewFragment fragment4 = new StrictViewFragment();
83990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        fm.beginTransaction()
84990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                .add(R.id.fragmentContainer, fragment3)
85990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                .add(R.id.fragmentContainer, fragment4)
86990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                .addToBackStack(null)
87990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                .commit();
88990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.executePendingTransactions(mActivityRule);
89990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.assertChildren(container, fragment1, fragment2, fragment3, fragment4);
90990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
91990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        fm.popBackStack();
92990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.executePendingTransactions(mActivityRule);
93990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.assertChildren(container, fragment1, fragment2);
94990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
95990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        fm.popBackStack();
96990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.executePendingTransactions(mActivityRule);
97990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        assertEquals(1, container.getChildCount());
98990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.assertChildren(container, fragment1);
99990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
100990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        fm.popBackStack();
101990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.executePendingTransactions(mActivityRule);
102990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.assertChildren(container);
103990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    }
104990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
105990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    // Add fragments to multiple containers in the same transaction. Make sure that
106990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    // they pop correctly, too.
107990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    @Test
108990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    public void addTwoContainers() throws Throwable {
109990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.setContentView(mActivityRule, R.layout.double_container);
110990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        ViewGroup container1 = (ViewGroup)
111990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                mActivityRule.getActivity().findViewById(R.id.fragmentContainer1);
112990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        ViewGroup container2 = (ViewGroup)
113990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                mActivityRule.getActivity().findViewById(R.id.fragmentContainer2);
114990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        final FragmentManager fm = mActivityRule.getActivity().getSupportFragmentManager();
115990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
116990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        final StrictViewFragment fragment1 = new StrictViewFragment();
117990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        fm.beginTransaction().add(R.id.fragmentContainer1, fragment1).addToBackStack(null).commit();
118990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.executePendingTransactions(mActivityRule);
119990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.assertChildren(container1, fragment1);
120990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
121990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        final StrictViewFragment fragment2 = new StrictViewFragment();
122990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        fm.beginTransaction().add(R.id.fragmentContainer2, fragment2).addToBackStack(null).commit();
123990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.executePendingTransactions(mActivityRule);
124990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.assertChildren(container2, fragment2);
125990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
126990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        final StrictViewFragment fragment3 = new StrictViewFragment();
127990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        final StrictViewFragment fragment4 = new StrictViewFragment();
128990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        fm.beginTransaction()
129990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                .add(R.id.fragmentContainer1, fragment3)
130990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                .add(R.id.fragmentContainer2, fragment4)
131990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                .addToBackStack(null)
132990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                .commit();
133990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.executePendingTransactions(mActivityRule);
134990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
135990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.assertChildren(container1, fragment1, fragment3);
136990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.assertChildren(container2, fragment2, fragment4);
137990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
138990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        fm.popBackStack();
139990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.executePendingTransactions(mActivityRule);
140990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.assertChildren(container1, fragment1);
141990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.assertChildren(container2, fragment2);
142990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
143990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        fm.popBackStack();
144990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.executePendingTransactions(mActivityRule);
145990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.assertChildren(container1, fragment1);
146990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.assertChildren(container2);
147990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
148990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        fm.popBackStack();
149990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.executePendingTransactions(mActivityRule);
150990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        assertEquals(0, container1.getChildCount());
151990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    }
152990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
153990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    // When you add a fragment that's has already been added, it should throw.
154990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    @Test
155990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    public void doubleAdd() throws Throwable {
156990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.setContentView(mActivityRule, R.layout.simple_container);
157990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        final FragmentManager fm = mActivityRule.getActivity().getSupportFragmentManager();
158990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        final StrictViewFragment fragment1 = new StrictViewFragment();
159990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        fm.beginTransaction().add(R.id.fragmentContainer, fragment1).commit();
160990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.executePendingTransactions(mActivityRule);
161990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
162990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        mInstrumentation.runOnMainSync(new Runnable() {
163990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount            @Override
164990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount            public void run() {
165990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                try {
166990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                    fm.beginTransaction()
167990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                            .add(R.id.fragmentContainer, fragment1)
168990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                            .addToBackStack(null)
169990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                            .commit();
170990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                    fm.executePendingTransactions();
171990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                    fail("Adding a fragment that is already added should be an error");
172990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                } catch (IllegalStateException e) {
173990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                    // expected
174990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                }
175990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount            }
176990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        });
177990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    }
178990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
179990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    // Make sure that removed fragments remove the right Views. Popping the back stack should
180990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    // add the Views back properly
181990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    @Test
182990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    public void removeFragments() throws Throwable {
183990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.setContentView(mActivityRule, R.layout.simple_container);
184990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        ViewGroup container = (ViewGroup)
185990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                mActivityRule.getActivity().findViewById(R.id.fragmentContainer);
186990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        final FragmentManager fm = mActivityRule.getActivity().getSupportFragmentManager();
187990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        final StrictViewFragment fragment1 = new StrictViewFragment();
188990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        final StrictViewFragment fragment2 = new StrictViewFragment();
189990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        final StrictViewFragment fragment3 = new StrictViewFragment();
190990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        final StrictViewFragment fragment4 = new StrictViewFragment();
191990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        fm.beginTransaction()
192990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                .add(R.id.fragmentContainer, fragment1, "1")
193990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                .add(R.id.fragmentContainer, fragment2, "2")
194990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                .add(R.id.fragmentContainer, fragment3, "3")
195990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                .add(R.id.fragmentContainer, fragment4, "4")
196990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                .commit();
197990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.executePendingTransactions(mActivityRule);
198990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.assertChildren(container, fragment1, fragment2, fragment3, fragment4);
199990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
200990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        // Remove a view
201990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        fm.beginTransaction().remove(fragment4).addToBackStack(null).commit();
202990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.executePendingTransactions(mActivityRule);
203990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
204990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        assertEquals(3, container.getChildCount());
205990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.assertChildren(container, fragment1, fragment2, fragment3);
206990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
207990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        // remove another one
208990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        fm.beginTransaction().remove(fragment2).addToBackStack(null).commit();
209990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.executePendingTransactions(mActivityRule);
210990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.assertChildren(container, fragment1, fragment3);
211990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
212990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        // Now remove the remaining:
213990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        fm.beginTransaction()
214990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                .remove(fragment3)
215990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                .remove(fragment1)
216990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                .addToBackStack(null)
217990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                .commit();
218990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.executePendingTransactions(mActivityRule);
219990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.assertChildren(container);
220990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
221990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        fm.popBackStack();
222990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.executePendingTransactions(mActivityRule);
223990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        final Fragment replacement1 = fm.findFragmentByTag("1");
224990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        final Fragment replacement3 = fm.findFragmentByTag("3");
225990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.assertChildren(container, replacement1, replacement3);
226990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
227990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        fm.popBackStack();
228990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.executePendingTransactions(mActivityRule);
229990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        final Fragment replacement2 = fm.findFragmentByTag("2");
230990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.assertChildren(container, replacement1, replacement3, replacement2);
231990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
232990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        fm.popBackStack();
233990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.executePendingTransactions(mActivityRule);
234990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        final Fragment replacement4 = fm.findFragmentByTag("4");
235990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.assertChildren(container, replacement1, replacement3, replacement2,
236990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                replacement4);
237990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    }
238990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
239990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    // Removing a hidden fragment should remove the View and popping should bring it back hidden
240990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    @Test
241990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    public void removeHiddenView() throws Throwable {
242990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.setContentView(mActivityRule, R.layout.simple_container);
243990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        ViewGroup container = (ViewGroup)
244990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                mActivityRule.getActivity().findViewById(R.id.fragmentContainer);
245990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        final FragmentManager fm = mActivityRule.getActivity().getSupportFragmentManager();
246990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        final StrictViewFragment fragment1 = new StrictViewFragment();
247990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        fm.beginTransaction().add(R.id.fragmentContainer, fragment1, "1").hide(fragment1).commit();
248990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.executePendingTransactions(mActivityRule);
249990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.assertChildren(container, fragment1);
250990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        assertTrue(fragment1.isHidden());
251990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
252990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        fm.beginTransaction().remove(fragment1).addToBackStack(null).commit();
253990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.executePendingTransactions(mActivityRule);
254990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.assertChildren(container);
255990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
256990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        fm.popBackStack();
257990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.executePendingTransactions(mActivityRule);
258990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        final Fragment replacement1 = fm.findFragmentByTag("1");
259990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.assertChildren(container, replacement1);
260990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        assertTrue(replacement1.isHidden());
261990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        assertEquals(View.GONE, replacement1.getView().getVisibility());
262990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    }
263990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
264990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    // Removing a detached fragment should do nothing to the View and popping should bring
265990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    // the Fragment back detached
266990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    @Test
267990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    public void removeDetatchedView() throws Throwable {
268990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.setContentView(mActivityRule, R.layout.simple_container);
269990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        ViewGroup container = (ViewGroup)
270990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                mActivityRule.getActivity().findViewById(R.id.fragmentContainer);
271990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        final FragmentManager fm = mActivityRule.getActivity().getSupportFragmentManager();
272990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        final StrictViewFragment fragment1 = new StrictViewFragment();
273990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        fm.beginTransaction()
274990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                .add(R.id.fragmentContainer, fragment1, "1")
275990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                .detach(fragment1)
276990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                .commit();
277990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.executePendingTransactions(mActivityRule);
278990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.assertChildren(container);
279990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        assertTrue(fragment1.isDetached());
280990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
281990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        fm.beginTransaction().remove(fragment1).addToBackStack(null).commit();
282990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.executePendingTransactions(mActivityRule);
283990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.assertChildren(container);
284990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
285990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        fm.popBackStack();
286990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.executePendingTransactions(mActivityRule);
287990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        final Fragment replacement1 = fm.findFragmentByTag("1");
288990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.assertChildren(container);
289990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        assertTrue(replacement1.isDetached());
290990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    }
291990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
292990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    // Unlike adding the same fragment twice, you should be able to add and then remove and then
293990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    // add the same fragment in one transaction.
294990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    @Test
295990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    public void addRemoveAdd() throws Throwable {
296990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.setContentView(mActivityRule, R.layout.simple_container);
297990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        ViewGroup container = (ViewGroup)
298990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                mActivityRule.getActivity().findViewById(R.id.fragmentContainer);
299990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        final FragmentManager fm = mActivityRule.getActivity().getSupportFragmentManager();
300990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        final StrictViewFragment fragment = new StrictViewFragment();
301990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        fm.beginTransaction()
302990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                .add(R.id.fragmentContainer, fragment)
303990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                .remove(fragment)
304990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                .add(R.id.fragmentContainer, fragment)
305990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                .addToBackStack(null)
306990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                .commit();
307990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.executePendingTransactions(mActivityRule);
308990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.assertChildren(container, fragment);
309990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
310990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        fm.popBackStack();
311990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.executePendingTransactions(mActivityRule);
312990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.assertChildren(container);
313990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    }
314990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
315d50cf1504e5a5c80aec83c9a45923cd5c6bbef56George Mount    // Removing a fragment that isn't in should not throw
316990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    @Test
317990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    public void removeNothThere() throws Throwable {
318990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.setContentView(mActivityRule, R.layout.simple_container);
319990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        final FragmentManager fm = mActivityRule.getActivity().getSupportFragmentManager();
320990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        final StrictViewFragment fragment = new StrictViewFragment();
321990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        fm.beginTransaction().remove(fragment).commit();
322d50cf1504e5a5c80aec83c9a45923cd5c6bbef56George Mount        FragmentTestUtil.executePendingTransactions(mActivityRule);
323990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    }
324990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
325990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    // Hide a fragment and its View should be GONE. Then pop it and the View should be VISIBLE
326990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    @Test
327990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    public void hideFragment() throws Throwable {
328990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.setContentView(mActivityRule, R.layout.simple_container);
329990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        ViewGroup container = (ViewGroup)
330990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                mActivityRule.getActivity().findViewById(R.id.fragmentContainer);
331990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        final FragmentManager fm = mActivityRule.getActivity().getSupportFragmentManager();
332990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        final StrictViewFragment fragment = new StrictViewFragment();
333990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        fm.beginTransaction().add(R.id.fragmentContainer, fragment).commit();
334990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.executePendingTransactions(mActivityRule);
335990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
336990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.assertChildren(container, fragment);
337990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        assertEquals(View.VISIBLE, fragment.getView().getVisibility());
338990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
339990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        fm.beginTransaction().hide(fragment).addToBackStack(null).commit();
340990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.executePendingTransactions(mActivityRule);
341990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
342990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.assertChildren(container, fragment);
343990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        assertTrue(fragment.isHidden());
344990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        assertEquals(View.GONE, fragment.getView().getVisibility());
345990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
346990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        fm.popBackStack();
347990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.executePendingTransactions(mActivityRule);
348990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
349990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.assertChildren(container, fragment);
350990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        assertFalse(fragment.isHidden());
351990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        assertEquals(View.VISIBLE, fragment.getView().getVisibility());
352990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    }
353990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
354d50cf1504e5a5c80aec83c9a45923cd5c6bbef56George Mount    // Hiding a hidden fragment should not throw
355990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    @Test
356990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    public void doubleHide() throws Throwable {
357990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.setContentView(mActivityRule, R.layout.simple_container);
358990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        final FragmentManager fm = mActivityRule.getActivity().getSupportFragmentManager();
359990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        final StrictViewFragment fragment = new StrictViewFragment();
360990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        fm.beginTransaction()
361990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                .add(R.id.fragmentContainer, fragment)
362990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                .hide(fragment)
363990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                .hide(fragment)
364990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                .commit();
365d50cf1504e5a5c80aec83c9a45923cd5c6bbef56George Mount        FragmentTestUtil.executePendingTransactions(mActivityRule);
366990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    }
367990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
368d50cf1504e5a5c80aec83c9a45923cd5c6bbef56George Mount    // Hiding a non-existing fragment should not throw
369990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    @Test
370990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    public void hideUnAdded() throws Throwable {
371990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.setContentView(mActivityRule, R.layout.simple_container);
372990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        final FragmentManager fm = mActivityRule.getActivity().getSupportFragmentManager();
373990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        final StrictViewFragment fragment = new StrictViewFragment();
374990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        fm.beginTransaction()
375990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                .hide(fragment)
376990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                .commit();
377d50cf1504e5a5c80aec83c9a45923cd5c6bbef56George Mount        FragmentTestUtil.executePendingTransactions(mActivityRule);
378990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    }
379990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
380990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    // Show a hidden fragment and its View should be VISIBLE. Then pop it and the View should be
381990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    // GONE.
382990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    @Test
383990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    public void showFragment() throws Throwable {
384990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.setContentView(mActivityRule, R.layout.simple_container);
385990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        ViewGroup container = (ViewGroup)
386990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                mActivityRule.getActivity().findViewById(R.id.fragmentContainer);
387990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        final FragmentManager fm = mActivityRule.getActivity().getSupportFragmentManager();
388990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        final StrictViewFragment fragment = new StrictViewFragment();
389990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        fm.beginTransaction().add(R.id.fragmentContainer, fragment).hide(fragment).commit();
390990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.executePendingTransactions(mActivityRule);
391990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
392990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.assertChildren(container, fragment);
393990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        assertTrue(fragment.isHidden());
394990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        assertEquals(View.GONE, fragment.getView().getVisibility());
395990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
396990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        fm.beginTransaction().show(fragment).addToBackStack(null).commit();
397990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.executePendingTransactions(mActivityRule);
398990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
399990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.assertChildren(container, fragment);
400990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        assertFalse(fragment.isHidden());
401990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        assertEquals(View.VISIBLE, fragment.getView().getVisibility());
402990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
403990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        fm.popBackStack();
404990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.executePendingTransactions(mActivityRule);
405990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
406990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.assertChildren(container, fragment);
407990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        assertTrue(fragment.isHidden());
408990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        assertEquals(View.GONE, fragment.getView().getVisibility());
409990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    }
410990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
411d50cf1504e5a5c80aec83c9a45923cd5c6bbef56George Mount    // Showing a shown fragment should not throw
412990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    @Test
413990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    public void showShown() throws Throwable {
414990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.setContentView(mActivityRule, R.layout.simple_container);
415990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        final FragmentManager fm = mActivityRule.getActivity().getSupportFragmentManager();
416990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        final StrictViewFragment fragment = new StrictViewFragment();
417990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        fm.beginTransaction()
418990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                .add(R.id.fragmentContainer, fragment)
419990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                .show(fragment)
420990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                .commit();
421d50cf1504e5a5c80aec83c9a45923cd5c6bbef56George Mount        FragmentTestUtil.executePendingTransactions(mActivityRule);
422990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    }
423990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
424d50cf1504e5a5c80aec83c9a45923cd5c6bbef56George Mount    // Showing a non-existing fragment should not throw
425990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    @Test
426990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    public void showUnAdded() throws Throwable {
427990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.setContentView(mActivityRule, R.layout.simple_container);
428990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        final FragmentManager fm = mActivityRule.getActivity().getSupportFragmentManager();
429990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        final StrictViewFragment fragment = new StrictViewFragment();
430990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        fm.beginTransaction()
431990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                .show(fragment)
432990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                .commit();
433d50cf1504e5a5c80aec83c9a45923cd5c6bbef56George Mount        FragmentTestUtil.executePendingTransactions(mActivityRule);
434990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    }
435990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
436990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    // Detaching a fragment should remove the View from the hierarchy. Then popping it should
437990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    // bring it back VISIBLE
438990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    @Test
439990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    public void detachFragment() throws Throwable {
440990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.setContentView(mActivityRule, R.layout.simple_container);
441990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        ViewGroup container = (ViewGroup)
442990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                mActivityRule.getActivity().findViewById(R.id.fragmentContainer);
443990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        final FragmentManager fm = mActivityRule.getActivity().getSupportFragmentManager();
444990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        final StrictViewFragment fragment = new StrictViewFragment();
445990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        fm.beginTransaction().add(R.id.fragmentContainer, fragment).commit();
446990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.executePendingTransactions(mActivityRule);
447990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
448990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.assertChildren(container, fragment);
449990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        assertFalse(fragment.isDetached());
450990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        assertEquals(View.VISIBLE, fragment.getView().getVisibility());
451990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
452990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        fm.beginTransaction().detach(fragment).addToBackStack(null).commit();
453990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.executePendingTransactions(mActivityRule);
454990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
455990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.assertChildren(container);
456990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        assertTrue(fragment.isDetached());
457990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
458990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        fm.popBackStack();
459990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.executePendingTransactions(mActivityRule);
460990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
461990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.assertChildren(container, fragment);
462990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        assertFalse(fragment.isDetached());
463990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        assertEquals(View.VISIBLE, fragment.getView().getVisibility());
464990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    }
465990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
466990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    // Detaching a hidden fragment should remove the View from the hierarchy. Then popping it should
467990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    // bring it back hidden
468990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    @Test
469990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    public void detachHiddenFragment() throws Throwable {
470990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.setContentView(mActivityRule, R.layout.simple_container);
471990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        ViewGroup container = (ViewGroup)
472990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                mActivityRule.getActivity().findViewById(R.id.fragmentContainer);
473990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        final FragmentManager fm = mActivityRule.getActivity().getSupportFragmentManager();
474990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        final StrictViewFragment fragment = new StrictViewFragment();
475990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        fm.beginTransaction().add(R.id.fragmentContainer, fragment).hide(fragment).commit();
476990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.executePendingTransactions(mActivityRule);
477990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
478990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.assertChildren(container, fragment);
479990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        assertFalse(fragment.isDetached());
480990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        assertTrue(fragment.isHidden());
481990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        assertEquals(View.GONE, fragment.getView().getVisibility());
482990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
483990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        fm.beginTransaction().detach(fragment).addToBackStack(null).commit();
484990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.executePendingTransactions(mActivityRule);
485990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
486990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.assertChildren(container);
487990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        assertTrue(fragment.isHidden());
488990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        assertTrue(fragment.isDetached());
489990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
490990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        fm.popBackStack();
491990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.executePendingTransactions(mActivityRule);
492990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
493990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.assertChildren(container, fragment);
494990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        assertTrue(fragment.isHidden());
495990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        assertFalse(fragment.isDetached());
496990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        assertEquals(View.GONE, fragment.getView().getVisibility());
497990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    }
498990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
499d50cf1504e5a5c80aec83c9a45923cd5c6bbef56George Mount    // Detaching a detached fragment should not throw
500990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    @Test
501990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    public void detachDetatched() throws Throwable {
502990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.setContentView(mActivityRule, R.layout.simple_container);
503990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        final FragmentManager fm = mActivityRule.getActivity().getSupportFragmentManager();
504990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        final StrictViewFragment fragment = new StrictViewFragment();
505990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        fm.beginTransaction()
506990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                .add(R.id.fragmentContainer, fragment)
507990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                .detach(fragment)
508990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                .detach(fragment)
509990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                .commit();
510d50cf1504e5a5c80aec83c9a45923cd5c6bbef56George Mount        FragmentTestUtil.executePendingTransactions(mActivityRule);
511990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    }
512990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
513d50cf1504e5a5c80aec83c9a45923cd5c6bbef56George Mount    // Detaching a non-existing fragment should not throw
514990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    @Test
515990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    public void detachUnAdded() throws Throwable {
516990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.setContentView(mActivityRule, R.layout.simple_container);
517990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        final FragmentManager fm = mActivityRule.getActivity().getSupportFragmentManager();
518990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        final StrictViewFragment fragment = new StrictViewFragment();
519990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        fm.beginTransaction()
520990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                .detach(fragment)
521990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                .commit();
522d50cf1504e5a5c80aec83c9a45923cd5c6bbef56George Mount        FragmentTestUtil.executePendingTransactions(mActivityRule);
523990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    }
524990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
525990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    // Attaching a fragment should add the View back into the hierarchy. Then popping it should
526990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    // remove it again
527990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    @Test
528990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    public void attachFragment() throws Throwable {
529990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.setContentView(mActivityRule, R.layout.simple_container);
530990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        ViewGroup container = (ViewGroup)
531990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                mActivityRule.getActivity().findViewById(R.id.fragmentContainer);
532990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        final FragmentManager fm = mActivityRule.getActivity().getSupportFragmentManager();
533990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        final StrictViewFragment fragment = new StrictViewFragment();
534990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        fm.beginTransaction().add(R.id.fragmentContainer, fragment).detach(fragment).commit();
535990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.executePendingTransactions(mActivityRule);
536990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
537990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.assertChildren(container);
538990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        assertTrue(fragment.isDetached());
539990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
540990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        fm.beginTransaction().attach(fragment).addToBackStack(null).commit();
541990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.executePendingTransactions(mActivityRule);
542990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
543990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.assertChildren(container, fragment);
544990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        assertFalse(fragment.isDetached());
545990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        assertEquals(View.VISIBLE, fragment.getView().getVisibility());
546990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
547990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        fm.popBackStack();
548990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.executePendingTransactions(mActivityRule);
549990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
550990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.assertChildren(container);
551990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        assertTrue(fragment.isDetached());
552990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    }
553990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
554990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    // Attaching a hidden fragment should add the View as GONE the hierarchy. Then popping it should
555990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    // remove it again.
556990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    @Test
557990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    public void attachHiddenFragment() throws Throwable {
558990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.setContentView(mActivityRule, R.layout.simple_container);
559990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        ViewGroup container = (ViewGroup)
560990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                mActivityRule.getActivity().findViewById(R.id.fragmentContainer);
561990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        final FragmentManager fm = mActivityRule.getActivity().getSupportFragmentManager();
562990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        final StrictViewFragment fragment = new StrictViewFragment();
563990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        fm.beginTransaction()
564990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                .add(R.id.fragmentContainer, fragment)
565990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                .hide(fragment)
566990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                .detach(fragment)
567990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                .commit();
568990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.executePendingTransactions(mActivityRule);
569990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
570990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.assertChildren(container);
571990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        assertTrue(fragment.isDetached());
572990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        assertTrue(fragment.isHidden());
573990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
574990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        fm.beginTransaction().attach(fragment).addToBackStack(null).commit();
575990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.executePendingTransactions(mActivityRule);
576990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
577990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.assertChildren(container, fragment);
578990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        assertTrue(fragment.isHidden());
579990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        assertFalse(fragment.isDetached());
580990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        assertEquals(View.GONE, fragment.getView().getVisibility());
581990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
582990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        fm.popBackStack();
583990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.executePendingTransactions(mActivityRule);
584990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
585990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.assertChildren(container);
586990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        assertTrue(fragment.isDetached());
587990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        assertTrue(fragment.isHidden());
588990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    }
589990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
590d50cf1504e5a5c80aec83c9a45923cd5c6bbef56George Mount    // Attaching an attached fragment should not throw
591990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    @Test
592990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    public void attachAttached() throws Throwable {
593990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.setContentView(mActivityRule, R.layout.simple_container);
594990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        final FragmentManager fm = mActivityRule.getActivity().getSupportFragmentManager();
595990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        final StrictViewFragment fragment = new StrictViewFragment();
596990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        fm.beginTransaction()
597990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                .add(R.id.fragmentContainer, fragment)
598990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                .attach(fragment)
599990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                .commit();
600d50cf1504e5a5c80aec83c9a45923cd5c6bbef56George Mount        FragmentTestUtil.executePendingTransactions(mActivityRule);
601990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    }
602990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
603d50cf1504e5a5c80aec83c9a45923cd5c6bbef56George Mount    // Attaching a non-existing fragment should not throw
604990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    @Test
605990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    public void attachUnAdded() throws Throwable {
606990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.setContentView(mActivityRule, R.layout.simple_container);
607990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        final FragmentManager fm = mActivityRule.getActivity().getSupportFragmentManager();
608990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        final StrictViewFragment fragment = new StrictViewFragment();
609990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        fm.beginTransaction()
610990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                .attach(fragment)
611990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                .commit();
612d50cf1504e5a5c80aec83c9a45923cd5c6bbef56George Mount        FragmentTestUtil.executePendingTransactions(mActivityRule);
613990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    }
614990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
615990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    // Simple replace of one fragment in a container. Popping should replace it back again
616990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    @Test
617990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    public void replaceOne() throws Throwable {
618990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.setContentView(mActivityRule, R.layout.simple_container);
619990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        ViewGroup container = (ViewGroup)
620990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                mActivityRule.getActivity().findViewById(R.id.fragmentContainer);
621990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        final FragmentManager fm = mActivityRule.getActivity().getSupportFragmentManager();
622990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        final StrictViewFragment fragment1 = new StrictViewFragment();
623990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        fm.beginTransaction().add(R.id.fragmentContainer, fragment1, "1").commit();
624990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.executePendingTransactions(mActivityRule);
625990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
626990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.assertChildren(container, fragment1);
627990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
628990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        final StrictViewFragment fragment2 = new StrictViewFragment();
629990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        fm.beginTransaction()
630990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                .replace(R.id.fragmentContainer, fragment2)
631990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                .addToBackStack(null)
632990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                .commit();
633990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.executePendingTransactions(mActivityRule);
634990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
635990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.assertChildren(container, fragment2);
636990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        assertEquals(View.VISIBLE, fragment2.getView().getVisibility());
637990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
638990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        fm.popBackStack();
639990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.executePendingTransactions(mActivityRule);
640990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
641990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        Fragment replacement1 = fm.findFragmentByTag("1");
642990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        assertNotNull(replacement1);
643990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.assertChildren(container, replacement1);
644990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        assertFalse(replacement1.isHidden());
645990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        assertTrue(replacement1.isAdded());
646990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        assertFalse(replacement1.isDetached());
647990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        assertEquals(View.VISIBLE, replacement1.getView().getVisibility());
648990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    }
649990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
650990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    // Replace of multiple fragments in a container. Popping should replace it back again
651990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    @Test
652990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    public void replaceTwo() throws Throwable {
653990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.setContentView(mActivityRule, R.layout.simple_container);
654990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        ViewGroup container = (ViewGroup)
655990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                mActivityRule.getActivity().findViewById(R.id.fragmentContainer);
656990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        final FragmentManager fm = mActivityRule.getActivity().getSupportFragmentManager();
657990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        final StrictViewFragment fragment1 = new StrictViewFragment();
658990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        final StrictViewFragment fragment2 = new StrictViewFragment();
659990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        fm.beginTransaction()
660990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                .add(R.id.fragmentContainer, fragment1, "1")
661990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                .add(R.id.fragmentContainer, fragment2, "2")
662990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                .hide(fragment2)
663990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                .commit();
664990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.executePendingTransactions(mActivityRule);
665990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
666990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.assertChildren(container, fragment1, fragment2);
667990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
668990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        final StrictViewFragment fragment3 = new StrictViewFragment();
669990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        fm.beginTransaction()
670990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                .replace(R.id.fragmentContainer, fragment3)
671990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                .addToBackStack(null)
672990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                .commit();
673990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.executePendingTransactions(mActivityRule);
674990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
675990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.assertChildren(container, fragment3);
676990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        assertEquals(View.VISIBLE, fragment3.getView().getVisibility());
677990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
678990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        fm.popBackStack();
679990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.executePendingTransactions(mActivityRule);
680990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
681990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        Fragment replacement1 = fm.findFragmentByTag("1");
682990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        Fragment replacement2 = fm.findFragmentByTag("2");
683990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        assertNotNull(replacement1);
684990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        assertNotNull(replacement2);
685990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.assertChildren(container, replacement1, replacement2);
686990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        assertFalse(replacement1.isHidden());
687990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        assertTrue(replacement1.isAdded());
688990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        assertFalse(replacement1.isDetached());
689990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        assertEquals(View.VISIBLE, replacement1.getView().getVisibility());
690990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
691990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        // fragment2 was hidden, so it should be returned hidden
692990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        assertTrue(replacement2.isHidden());
693990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        assertTrue(replacement2.isAdded());
694990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        assertFalse(replacement2.isDetached());
695990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        assertEquals(View.GONE, replacement2.getView().getVisibility());
696990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    }
697990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
698990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    // Replace of empty container. Should act as add and popping should just remove the fragment
699990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    @Test
700990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    public void replaceZero() throws Throwable {
701990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.setContentView(mActivityRule, R.layout.simple_container);
702990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        ViewGroup container = (ViewGroup)
703990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                mActivityRule.getActivity().findViewById(R.id.fragmentContainer);
704990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        final FragmentManager fm = mActivityRule.getActivity().getSupportFragmentManager();
705990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
706990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        final StrictViewFragment fragment = new StrictViewFragment();
707990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        fm.beginTransaction()
708990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                .replace(R.id.fragmentContainer, fragment)
709990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                .addToBackStack(null)
710990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                .commit();
711990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.executePendingTransactions(mActivityRule);
712990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
713990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.assertChildren(container, fragment);
714990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        assertEquals(View.VISIBLE, fragment.getView().getVisibility());
715990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
716990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        fm.popBackStack();
717990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.executePendingTransactions(mActivityRule);
718990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
719990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.assertChildren(container);
720990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    }
721990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
722990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    // Replace a fragment that exists with itself
723990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    @Test
724990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    public void replaceExisting() throws Throwable {
725990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.setContentView(mActivityRule, R.layout.simple_container);
726990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        ViewGroup container = (ViewGroup)
727990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                mActivityRule.getActivity().findViewById(R.id.fragmentContainer);
728990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        final FragmentManager fm = mActivityRule.getActivity().getSupportFragmentManager();
729990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        final StrictViewFragment fragment1 = new StrictViewFragment();
730990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        final StrictViewFragment fragment2 = new StrictViewFragment();
731990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        fm.beginTransaction()
732990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                .add(R.id.fragmentContainer, fragment1, "1")
733990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                .add(R.id.fragmentContainer, fragment2, "2")
734990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                .commit();
735990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.executePendingTransactions(mActivityRule);
736990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
737990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.assertChildren(container, fragment1, fragment2);
738990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
739990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        fm.beginTransaction()
740990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                .replace(R.id.fragmentContainer, fragment1)
741990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                .addToBackStack(null)
742990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                .commit();
743990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.executePendingTransactions(mActivityRule);
744990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
745990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.assertChildren(container, fragment1);
746990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
747990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        fm.popBackStack();
748990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.executePendingTransactions(mActivityRule);
749990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
750990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        final Fragment replacement1 = fm.findFragmentByTag("1");
751990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        final Fragment replacement2 = fm.findFragmentByTag("2");
752990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
753990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        assertSame(fragment1, replacement1);
754990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.assertChildren(container, replacement1, replacement2);
755990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    }
756990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
757990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    // Have two replace operations in the same transaction to ensure that they
758990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    // don't interfere with each other
759990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    @Test
760990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    public void replaceReplace() throws Throwable {
761990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.setContentView(mActivityRule, R.layout.double_container);
762990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        ViewGroup container1 = (ViewGroup)
763990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                mActivityRule.getActivity().findViewById(R.id.fragmentContainer1);
764990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        ViewGroup container2 = (ViewGroup)
765990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                mActivityRule.getActivity().findViewById(R.id.fragmentContainer2);
766990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        final FragmentManager fm = mActivityRule.getActivity().getSupportFragmentManager();
767990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
768990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        final StrictViewFragment fragment1 = new StrictViewFragment();
769990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        final StrictViewFragment fragment2 = new StrictViewFragment();
770990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        final StrictViewFragment fragment3 = new StrictViewFragment();
771990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        final StrictViewFragment fragment4 = new StrictViewFragment();
772990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        final StrictViewFragment fragment5 = new StrictViewFragment();
773990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        fm.beginTransaction()
774990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                .add(R.id.fragmentContainer1, fragment1)
775990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                .add(R.id.fragmentContainer2, fragment2)
776990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                .replace(R.id.fragmentContainer1, fragment3)
777990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                .replace(R.id.fragmentContainer2, fragment4)
778990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                .replace(R.id.fragmentContainer1, fragment5)
779990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                .addToBackStack(null)
780990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                .commit();
781990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.executePendingTransactions(mActivityRule);
782990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
783990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        assertChildren(container1, fragment5);
784990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        assertChildren(container2, fragment4);
785990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
786990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        fm.popBackStack();
787990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.executePendingTransactions(mActivityRule);
788990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
789990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        assertChildren(container1);
790990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        assertChildren(container2);
791990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    }
792990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
793990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    // Test to prevent regressions in FragmentManager fragment replace method. See b/24693644
794990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    @Test
795990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    public void testReplaceFragment() throws Throwable {
796990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.setContentView(mActivityRule, R.layout.simple_container);
797990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        final FragmentManager fm = mActivityRule.getActivity().getSupportFragmentManager();
798990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        StrictViewFragment fragmentA = new StrictViewFragment();
799990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        fragmentA.setLayoutId(R.layout.text_a);
800990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
801990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        fm.beginTransaction()
802990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                .add(R.id.fragmentContainer, fragmentA)
803990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                .addToBackStack(null)
804990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                .commit();
805990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.executePendingTransactions(mActivityRule);
806990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
807990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        assertNotNull(findViewById(R.id.textA));
808990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        assertNull(findViewById(R.id.textB));
809990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        assertNull(findViewById(R.id.textC));
810990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
811990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        StrictViewFragment fragmentB = new StrictViewFragment();
812990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        fragmentB.setLayoutId(R.layout.text_b);
813990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        fm.beginTransaction()
814990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                .add(R.id.fragmentContainer, fragmentB)
815990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                .addToBackStack(null)
816990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                .commit();
817990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.executePendingTransactions(mActivityRule);
818990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        assertNotNull(findViewById(R.id.textA));
819990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        assertNotNull(findViewById(R.id.textB));
820990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        assertNull(findViewById(R.id.textC));
821990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
822990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        StrictViewFragment fragmentC = new StrictViewFragment();
823990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        fragmentC.setLayoutId(R.layout.text_c);
824990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        fm.beginTransaction()
825990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                .replace(R.id.fragmentContainer, fragmentC)
826990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                .addToBackStack(null)
827990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                .commit();
828990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        FragmentTestUtil.executePendingTransactions(mActivityRule);
829990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        assertNull(findViewById(R.id.textA));
830990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        assertNull(findViewById(R.id.textB));
831990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        assertNotNull(findViewById(R.id.textC));
832990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    }
833990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
834aa3a5538c003c6098185d1c948e22054e2f27488George Mount    // Test that adding a fragment with invisible or gone views does not end up with the view
835aa3a5538c003c6098185d1c948e22054e2f27488George Mount    // being visible
836aa3a5538c003c6098185d1c948e22054e2f27488George Mount    @Test
837aa3a5538c003c6098185d1c948e22054e2f27488George Mount    public void addInvisibleAndGoneFragments() throws Throwable {
838aa3a5538c003c6098185d1c948e22054e2f27488George Mount        FragmentTestUtil.setContentView(mActivityRule, R.layout.simple_container);
839aa3a5538c003c6098185d1c948e22054e2f27488George Mount        ViewGroup container = (ViewGroup)
840aa3a5538c003c6098185d1c948e22054e2f27488George Mount                mActivityRule.getActivity().findViewById(R.id.fragmentContainer);
841aa3a5538c003c6098185d1c948e22054e2f27488George Mount        final FragmentManager fm = mActivityRule.getActivity().getSupportFragmentManager();
842aa3a5538c003c6098185d1c948e22054e2f27488George Mount
843aa3a5538c003c6098185d1c948e22054e2f27488George Mount        final StrictViewFragment fragment1 = new InvisibleFragment();
844aa3a5538c003c6098185d1c948e22054e2f27488George Mount        fm.beginTransaction().add(R.id.fragmentContainer, fragment1).addToBackStack(null).commit();
845aa3a5538c003c6098185d1c948e22054e2f27488George Mount        FragmentTestUtil.executePendingTransactions(mActivityRule);
846aa3a5538c003c6098185d1c948e22054e2f27488George Mount        FragmentTestUtil.assertChildren(container, fragment1);
847aa3a5538c003c6098185d1c948e22054e2f27488George Mount
848aa3a5538c003c6098185d1c948e22054e2f27488George Mount        assertEquals(View.INVISIBLE, fragment1.getView().getVisibility());
849aa3a5538c003c6098185d1c948e22054e2f27488George Mount
850aa3a5538c003c6098185d1c948e22054e2f27488George Mount        final InvisibleFragment fragment2 = new InvisibleFragment();
851aa3a5538c003c6098185d1c948e22054e2f27488George Mount        fragment2.visibility = View.GONE;
852aa3a5538c003c6098185d1c948e22054e2f27488George Mount        fm.beginTransaction()
853aa3a5538c003c6098185d1c948e22054e2f27488George Mount                .replace(R.id.fragmentContainer, fragment2)
854aa3a5538c003c6098185d1c948e22054e2f27488George Mount                .addToBackStack(null)
855aa3a5538c003c6098185d1c948e22054e2f27488George Mount                .commit();
856aa3a5538c003c6098185d1c948e22054e2f27488George Mount        FragmentTestUtil.executePendingTransactions(mActivityRule);
857aa3a5538c003c6098185d1c948e22054e2f27488George Mount        FragmentTestUtil.assertChildren(container, fragment2);
858aa3a5538c003c6098185d1c948e22054e2f27488George Mount
859aa3a5538c003c6098185d1c948e22054e2f27488George Mount        assertEquals(View.GONE, fragment2.getView().getVisibility());
860aa3a5538c003c6098185d1c948e22054e2f27488George Mount    }
861aa3a5538c003c6098185d1c948e22054e2f27488George Mount
862e7e8d3d3a5211abc960351923b8b2bac85f6adecGeorge Mount    // Test to ensure that popping and adding a fragment properly track the fragments added
863e7e8d3d3a5211abc960351923b8b2bac85f6adecGeorge Mount    // and removed.
864e7e8d3d3a5211abc960351923b8b2bac85f6adecGeorge Mount    @Test
865e7e8d3d3a5211abc960351923b8b2bac85f6adecGeorge Mount    public void popAdd() throws Throwable {
866e7e8d3d3a5211abc960351923b8b2bac85f6adecGeorge Mount        FragmentTestUtil.setContentView(mActivityRule, R.layout.simple_container);
867e7e8d3d3a5211abc960351923b8b2bac85f6adecGeorge Mount        ViewGroup container = (ViewGroup)
868e7e8d3d3a5211abc960351923b8b2bac85f6adecGeorge Mount                mActivityRule.getActivity().findViewById(R.id.fragmentContainer);
869e7e8d3d3a5211abc960351923b8b2bac85f6adecGeorge Mount        final FragmentManager fm = mActivityRule.getActivity().getSupportFragmentManager();
870e7e8d3d3a5211abc960351923b8b2bac85f6adecGeorge Mount
871e7e8d3d3a5211abc960351923b8b2bac85f6adecGeorge Mount        // One fragment with a view
872e7e8d3d3a5211abc960351923b8b2bac85f6adecGeorge Mount        final StrictViewFragment fragment1 = new StrictViewFragment();
873e7e8d3d3a5211abc960351923b8b2bac85f6adecGeorge Mount        fm.beginTransaction().add(R.id.fragmentContainer, fragment1).addToBackStack(null).commit();
874e7e8d3d3a5211abc960351923b8b2bac85f6adecGeorge Mount        FragmentTestUtil.executePendingTransactions(mActivityRule);
875e7e8d3d3a5211abc960351923b8b2bac85f6adecGeorge Mount        FragmentTestUtil.assertChildren(container, fragment1);
876e7e8d3d3a5211abc960351923b8b2bac85f6adecGeorge Mount
877e7e8d3d3a5211abc960351923b8b2bac85f6adecGeorge Mount        final StrictViewFragment fragment2 = new StrictViewFragment();
878e7e8d3d3a5211abc960351923b8b2bac85f6adecGeorge Mount        final StrictViewFragment fragment3 = new StrictViewFragment();
879e7e8d3d3a5211abc960351923b8b2bac85f6adecGeorge Mount        mInstrumentation.runOnMainSync(new Runnable() {
880e7e8d3d3a5211abc960351923b8b2bac85f6adecGeorge Mount            @Override
881e7e8d3d3a5211abc960351923b8b2bac85f6adecGeorge Mount            public void run() {
882e7e8d3d3a5211abc960351923b8b2bac85f6adecGeorge Mount                fm.popBackStack();
883e7e8d3d3a5211abc960351923b8b2bac85f6adecGeorge Mount                fm.beginTransaction()
884e7e8d3d3a5211abc960351923b8b2bac85f6adecGeorge Mount                        .replace(R.id.fragmentContainer, fragment2)
885e7e8d3d3a5211abc960351923b8b2bac85f6adecGeorge Mount                        .addToBackStack(null)
886e7e8d3d3a5211abc960351923b8b2bac85f6adecGeorge Mount                        .commit();
887e7e8d3d3a5211abc960351923b8b2bac85f6adecGeorge Mount                fm.executePendingTransactions();
888e7e8d3d3a5211abc960351923b8b2bac85f6adecGeorge Mount                fm.popBackStack();
889e7e8d3d3a5211abc960351923b8b2bac85f6adecGeorge Mount                fm.beginTransaction()
890e7e8d3d3a5211abc960351923b8b2bac85f6adecGeorge Mount                        .replace(R.id.fragmentContainer, fragment3)
891e7e8d3d3a5211abc960351923b8b2bac85f6adecGeorge Mount                        .addToBackStack(null)
892e7e8d3d3a5211abc960351923b8b2bac85f6adecGeorge Mount                        .commit();
893e7e8d3d3a5211abc960351923b8b2bac85f6adecGeorge Mount                fm.executePendingTransactions();
894e7e8d3d3a5211abc960351923b8b2bac85f6adecGeorge Mount            }
895e7e8d3d3a5211abc960351923b8b2bac85f6adecGeorge Mount        });
896e7e8d3d3a5211abc960351923b8b2bac85f6adecGeorge Mount        FragmentTestUtil.assertChildren(container, fragment3);
897e7e8d3d3a5211abc960351923b8b2bac85f6adecGeorge Mount    }
898e7e8d3d3a5211abc960351923b8b2bac85f6adecGeorge Mount
899fda5be2466024a656152015c45a7681361d399bbGeorge Mount    // Ensure that ordered transactions are executed individually rather than together.
900f284a0dc76d73ef7132dd1187a43d9a7ad0258deGeorge Mount    // This forces references from one fragment to another that should be executed earlier
901f284a0dc76d73ef7132dd1187a43d9a7ad0258deGeorge Mount    // to work.
9021780bc94be2d26adc4a9c2daa2aed87cb535fbcfGeorge Mount    @Test
903fda5be2466024a656152015c45a7681361d399bbGeorge Mount    public void orderedOperationsTogether() throws Throwable {
904f284a0dc76d73ef7132dd1187a43d9a7ad0258deGeorge Mount        FragmentTestUtil.setContentView(mActivityRule, R.layout.simple_container);
905f284a0dc76d73ef7132dd1187a43d9a7ad0258deGeorge Mount        ViewGroup container = (ViewGroup)
906f284a0dc76d73ef7132dd1187a43d9a7ad0258deGeorge Mount                mActivityRule.getActivity().findViewById(R.id.fragmentContainer);
907f284a0dc76d73ef7132dd1187a43d9a7ad0258deGeorge Mount        final FragmentManager fm = mActivityRule.getActivity().getSupportFragmentManager();
908f284a0dc76d73ef7132dd1187a43d9a7ad0258deGeorge Mount
909f284a0dc76d73ef7132dd1187a43d9a7ad0258deGeorge Mount        final StrictViewFragment fragment1 = new StrictViewFragment();
910f284a0dc76d73ef7132dd1187a43d9a7ad0258deGeorge Mount        fragment1.setLayoutId(R.layout.scene1);
911f284a0dc76d73ef7132dd1187a43d9a7ad0258deGeorge Mount        final StrictViewFragment fragment2 = new StrictViewFragment();
912f284a0dc76d73ef7132dd1187a43d9a7ad0258deGeorge Mount        fragment2.setLayoutId(R.layout.fragment_a);
913f284a0dc76d73ef7132dd1187a43d9a7ad0258deGeorge Mount
914f284a0dc76d73ef7132dd1187a43d9a7ad0258deGeorge Mount        mActivityRule.runOnUiThread(new Runnable() {
915f284a0dc76d73ef7132dd1187a43d9a7ad0258deGeorge Mount            @Override
916f284a0dc76d73ef7132dd1187a43d9a7ad0258deGeorge Mount            public void run() {
917f284a0dc76d73ef7132dd1187a43d9a7ad0258deGeorge Mount                fm.beginTransaction()
918f284a0dc76d73ef7132dd1187a43d9a7ad0258deGeorge Mount                        .add(R.id.fragmentContainer, fragment1)
919fda5be2466024a656152015c45a7681361d399bbGeorge Mount                        .setReorderingAllowed(false)
920f284a0dc76d73ef7132dd1187a43d9a7ad0258deGeorge Mount                        .addToBackStack(null)
921f284a0dc76d73ef7132dd1187a43d9a7ad0258deGeorge Mount                        .commit();
922f284a0dc76d73ef7132dd1187a43d9a7ad0258deGeorge Mount                fm.beginTransaction()
923f284a0dc76d73ef7132dd1187a43d9a7ad0258deGeorge Mount                        .add(R.id.squareContainer, fragment2)
924fda5be2466024a656152015c45a7681361d399bbGeorge Mount                        .setReorderingAllowed(false)
925f284a0dc76d73ef7132dd1187a43d9a7ad0258deGeorge Mount                        .addToBackStack(null)
926f284a0dc76d73ef7132dd1187a43d9a7ad0258deGeorge Mount                        .commit();
927f284a0dc76d73ef7132dd1187a43d9a7ad0258deGeorge Mount                fm.executePendingTransactions();
928f284a0dc76d73ef7132dd1187a43d9a7ad0258deGeorge Mount            }
929f284a0dc76d73ef7132dd1187a43d9a7ad0258deGeorge Mount        });
930f284a0dc76d73ef7132dd1187a43d9a7ad0258deGeorge Mount        FragmentTestUtil.assertChildren(container, fragment1);
931f284a0dc76d73ef7132dd1187a43d9a7ad0258deGeorge Mount        assertNotNull(findViewById(R.id.textA));
932f284a0dc76d73ef7132dd1187a43d9a7ad0258deGeorge Mount    }
933f284a0dc76d73ef7132dd1187a43d9a7ad0258deGeorge Mount
9341780bc94be2d26adc4a9c2daa2aed87cb535fbcfGeorge Mount    // Ensure that there is no problem if the child fragment manager is used before
9351780bc94be2d26adc4a9c2daa2aed87cb535fbcfGeorge Mount    // the View has been added.
9361780bc94be2d26adc4a9c2daa2aed87cb535fbcfGeorge Mount    @Test
9371780bc94be2d26adc4a9c2daa2aed87cb535fbcfGeorge Mount    public void childFragmentManager() throws Throwable {
9381780bc94be2d26adc4a9c2daa2aed87cb535fbcfGeorge Mount        FragmentTestUtil.setContentView(mActivityRule, R.layout.simple_container);
9391780bc94be2d26adc4a9c2daa2aed87cb535fbcfGeorge Mount        ViewGroup container = (ViewGroup)
9401780bc94be2d26adc4a9c2daa2aed87cb535fbcfGeorge Mount                mActivityRule.getActivity().findViewById(R.id.fragmentContainer);
9411780bc94be2d26adc4a9c2daa2aed87cb535fbcfGeorge Mount        final FragmentManager fm = mActivityRule.getActivity().getSupportFragmentManager();
9421780bc94be2d26adc4a9c2daa2aed87cb535fbcfGeorge Mount
9431780bc94be2d26adc4a9c2daa2aed87cb535fbcfGeorge Mount        final StrictViewFragment fragment1 = new ParentFragment();
9441780bc94be2d26adc4a9c2daa2aed87cb535fbcfGeorge Mount        fragment1.setLayoutId(R.layout.double_container);
9451780bc94be2d26adc4a9c2daa2aed87cb535fbcfGeorge Mount
9461780bc94be2d26adc4a9c2daa2aed87cb535fbcfGeorge Mount        fm.beginTransaction()
9471780bc94be2d26adc4a9c2daa2aed87cb535fbcfGeorge Mount                .add(R.id.fragmentContainer, fragment1)
9481780bc94be2d26adc4a9c2daa2aed87cb535fbcfGeorge Mount                .addToBackStack(null)
9491780bc94be2d26adc4a9c2daa2aed87cb535fbcfGeorge Mount                .commit();
9501780bc94be2d26adc4a9c2daa2aed87cb535fbcfGeorge Mount
9511780bc94be2d26adc4a9c2daa2aed87cb535fbcfGeorge Mount        FragmentTestUtil.executePendingTransactions(mActivityRule);
9521780bc94be2d26adc4a9c2daa2aed87cb535fbcfGeorge Mount
9531780bc94be2d26adc4a9c2daa2aed87cb535fbcfGeorge Mount        FragmentTestUtil.assertChildren(container, fragment1);
9541780bc94be2d26adc4a9c2daa2aed87cb535fbcfGeorge Mount        ViewGroup innerContainer = (ViewGroup)
9551780bc94be2d26adc4a9c2daa2aed87cb535fbcfGeorge Mount                fragment1.getView().findViewById(R.id.fragmentContainer1);
9561780bc94be2d26adc4a9c2daa2aed87cb535fbcfGeorge Mount
9571780bc94be2d26adc4a9c2daa2aed87cb535fbcfGeorge Mount        Fragment fragment2 = fragment1.getChildFragmentManager().findFragmentByTag("inner");
9581780bc94be2d26adc4a9c2daa2aed87cb535fbcfGeorge Mount        FragmentTestUtil.assertChildren(innerContainer, fragment2);
9591780bc94be2d26adc4a9c2daa2aed87cb535fbcfGeorge Mount    }
9601780bc94be2d26adc4a9c2daa2aed87cb535fbcfGeorge Mount
961fda5be2466024a656152015c45a7681361d399bbGeorge Mount    // Popping the backstack with ordered fragments should execute the operations together.
96237e785570b316db48ae8843d101f383899ea4d61George Mount    // When a non-backstack fragment will be raised, it should not be destroyed.
96337e785570b316db48ae8843d101f383899ea4d61George Mount    @Test
96437e785570b316db48ae8843d101f383899ea4d61George Mount    public void popToNonBackStackFragment() throws Throwable {
96537e785570b316db48ae8843d101f383899ea4d61George Mount        FragmentTestUtil.setContentView(mActivityRule, R.layout.simple_container);
96637e785570b316db48ae8843d101f383899ea4d61George Mount        final FragmentManager fm = mActivityRule.getActivity().getSupportFragmentManager();
96737e785570b316db48ae8843d101f383899ea4d61George Mount
96837e785570b316db48ae8843d101f383899ea4d61George Mount        final SimpleViewFragment fragment1 = new SimpleViewFragment();
96937e785570b316db48ae8843d101f383899ea4d61George Mount
97037e785570b316db48ae8843d101f383899ea4d61George Mount        fm.beginTransaction()
97137e785570b316db48ae8843d101f383899ea4d61George Mount                .add(R.id.fragmentContainer, fragment1)
97237e785570b316db48ae8843d101f383899ea4d61George Mount                .commit();
97337e785570b316db48ae8843d101f383899ea4d61George Mount
97437e785570b316db48ae8843d101f383899ea4d61George Mount        FragmentTestUtil.executePendingTransactions(mActivityRule);
97537e785570b316db48ae8843d101f383899ea4d61George Mount
97637e785570b316db48ae8843d101f383899ea4d61George Mount        final SimpleViewFragment fragment2 = new SimpleViewFragment();
97737e785570b316db48ae8843d101f383899ea4d61George Mount
97837e785570b316db48ae8843d101f383899ea4d61George Mount        fm.beginTransaction()
97937e785570b316db48ae8843d101f383899ea4d61George Mount                .replace(R.id.fragmentContainer, fragment2)
98037e785570b316db48ae8843d101f383899ea4d61George Mount                .addToBackStack("two")
98137e785570b316db48ae8843d101f383899ea4d61George Mount                .commit();
98237e785570b316db48ae8843d101f383899ea4d61George Mount
98337e785570b316db48ae8843d101f383899ea4d61George Mount        FragmentTestUtil.executePendingTransactions(mActivityRule);
98437e785570b316db48ae8843d101f383899ea4d61George Mount
98537e785570b316db48ae8843d101f383899ea4d61George Mount        final SimpleViewFragment fragment3 = new SimpleViewFragment();
98637e785570b316db48ae8843d101f383899ea4d61George Mount
98737e785570b316db48ae8843d101f383899ea4d61George Mount        fm.beginTransaction()
98837e785570b316db48ae8843d101f383899ea4d61George Mount                .replace(R.id.fragmentContainer, fragment3)
98937e785570b316db48ae8843d101f383899ea4d61George Mount                .addToBackStack("three")
99037e785570b316db48ae8843d101f383899ea4d61George Mount                .commit();
99137e785570b316db48ae8843d101f383899ea4d61George Mount
99237e785570b316db48ae8843d101f383899ea4d61George Mount        FragmentTestUtil.executePendingTransactions(mActivityRule);
99337e785570b316db48ae8843d101f383899ea4d61George Mount
9940846eb5fb991505a85c8288b52d7fa58ebade9b2George Mount        assertEquals(1, fragment1.onCreateViewCount);
9950846eb5fb991505a85c8288b52d7fa58ebade9b2George Mount        assertEquals(1, fragment2.onCreateViewCount);
9960846eb5fb991505a85c8288b52d7fa58ebade9b2George Mount        assertEquals(1, fragment3.onCreateViewCount);
9970846eb5fb991505a85c8288b52d7fa58ebade9b2George Mount
99837e785570b316db48ae8843d101f383899ea4d61George Mount        FragmentTestUtil.popBackStackImmediate(mActivityRule, "two",
99937e785570b316db48ae8843d101f383899ea4d61George Mount                FragmentManager.POP_BACK_STACK_INCLUSIVE);
100037e785570b316db48ae8843d101f383899ea4d61George Mount
100137e785570b316db48ae8843d101f383899ea4d61George Mount        ViewGroup container = (ViewGroup)
100237e785570b316db48ae8843d101f383899ea4d61George Mount                mActivityRule.getActivity().findViewById(R.id.fragmentContainer);
100337e785570b316db48ae8843d101f383899ea4d61George Mount
100437e785570b316db48ae8843d101f383899ea4d61George Mount        FragmentTestUtil.assertChildren(container, fragment1);
10050846eb5fb991505a85c8288b52d7fa58ebade9b2George Mount
10060846eb5fb991505a85c8288b52d7fa58ebade9b2George Mount        assertEquals(2, fragment1.onCreateViewCount);
10070846eb5fb991505a85c8288b52d7fa58ebade9b2George Mount        assertEquals(1, fragment2.onCreateViewCount);
10080846eb5fb991505a85c8288b52d7fa58ebade9b2George Mount        assertEquals(1, fragment3.onCreateViewCount);
100937e785570b316db48ae8843d101f383899ea4d61George Mount    }
101037e785570b316db48ae8843d101f383899ea4d61George Mount
1011990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    private View findViewById(int viewId) {
1012990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        return mActivityRule.getActivity().findViewById(viewId);
1013990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    }
1014990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
1015990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    private void assertChildren(ViewGroup container, Fragment... fragments) {
1016990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        final int numFragments = fragments == null ? 0 : fragments.length;
1017990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        assertEquals("There aren't the correct number of fragment Views in its container",
1018990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                numFragments, container.getChildCount());
1019990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        for (int i = 0; i < numFragments; i++) {
1020990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount            assertEquals("Wrong Fragment View order for [" + i + "]", container.getChildAt(i),
1021990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                    fragments[i].getView());
1022990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        }
1023990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    }
1024aa3a5538c003c6098185d1c948e22054e2f27488George Mount
1025aa3a5538c003c6098185d1c948e22054e2f27488George Mount    public static class InvisibleFragment extends StrictViewFragment {
1026aa3a5538c003c6098185d1c948e22054e2f27488George Mount        public int visibility = View.INVISIBLE;
1027aa3a5538c003c6098185d1c948e22054e2f27488George Mount
1028aa3a5538c003c6098185d1c948e22054e2f27488George Mount        @Override
1029aa3a5538c003c6098185d1c948e22054e2f27488George Mount        public void onViewCreated(View view, Bundle savedInstanceState) {
1030aa3a5538c003c6098185d1c948e22054e2f27488George Mount            view.setVisibility(visibility);
1031aa3a5538c003c6098185d1c948e22054e2f27488George Mount            super.onViewCreated(view, savedInstanceState);
1032aa3a5538c003c6098185d1c948e22054e2f27488George Mount        }
1033aa3a5538c003c6098185d1c948e22054e2f27488George Mount    }
10341780bc94be2d26adc4a9c2daa2aed87cb535fbcfGeorge Mount
10351780bc94be2d26adc4a9c2daa2aed87cb535fbcfGeorge Mount    public static class ParentFragment extends StrictViewFragment {
10361780bc94be2d26adc4a9c2daa2aed87cb535fbcfGeorge Mount        public ParentFragment() {
10371780bc94be2d26adc4a9c2daa2aed87cb535fbcfGeorge Mount            setLayoutId(R.layout.double_container);
10381780bc94be2d26adc4a9c2daa2aed87cb535fbcfGeorge Mount        }
10391780bc94be2d26adc4a9c2daa2aed87cb535fbcfGeorge Mount
10401780bc94be2d26adc4a9c2daa2aed87cb535fbcfGeorge Mount        @Override
10411780bc94be2d26adc4a9c2daa2aed87cb535fbcfGeorge Mount        public View onCreateView(LayoutInflater inflater, ViewGroup container,
10421780bc94be2d26adc4a9c2daa2aed87cb535fbcfGeorge Mount                                 Bundle savedInstanceState) {
10431780bc94be2d26adc4a9c2daa2aed87cb535fbcfGeorge Mount            View view = super.onCreateView(inflater, container, savedInstanceState);
10441780bc94be2d26adc4a9c2daa2aed87cb535fbcfGeorge Mount            final StrictViewFragment fragment2 = new StrictViewFragment();
10451780bc94be2d26adc4a9c2daa2aed87cb535fbcfGeorge Mount            fragment2.setLayoutId(R.layout.fragment_a);
10461780bc94be2d26adc4a9c2daa2aed87cb535fbcfGeorge Mount
10471780bc94be2d26adc4a9c2daa2aed87cb535fbcfGeorge Mount            getChildFragmentManager().beginTransaction()
10481780bc94be2d26adc4a9c2daa2aed87cb535fbcfGeorge Mount                    .add(R.id.fragmentContainer1, fragment2, "inner")
10491780bc94be2d26adc4a9c2daa2aed87cb535fbcfGeorge Mount                    .addToBackStack(null)
10501780bc94be2d26adc4a9c2daa2aed87cb535fbcfGeorge Mount                    .commit();
10511780bc94be2d26adc4a9c2daa2aed87cb535fbcfGeorge Mount            getChildFragmentManager().executePendingTransactions();
10521780bc94be2d26adc4a9c2daa2aed87cb535fbcfGeorge Mount            return view;
10531780bc94be2d26adc4a9c2daa2aed87cb535fbcfGeorge Mount        }
10541780bc94be2d26adc4a9c2daa2aed87cb535fbcfGeorge Mount    }
105537e785570b316db48ae8843d101f383899ea4d61George Mount
105637e785570b316db48ae8843d101f383899ea4d61George Mount    public static class SimpleViewFragment extends Fragment {
10570846eb5fb991505a85c8288b52d7fa58ebade9b2George Mount        public int onCreateViewCount;
10580846eb5fb991505a85c8288b52d7fa58ebade9b2George Mount
105937e785570b316db48ae8843d101f383899ea4d61George Mount        @Nullable
106037e785570b316db48ae8843d101f383899ea4d61George Mount        @Override
106137e785570b316db48ae8843d101f383899ea4d61George Mount        public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
106237e785570b316db48ae8843d101f383899ea4d61George Mount                @Nullable Bundle savedInstanceState) {
10630846eb5fb991505a85c8288b52d7fa58ebade9b2George Mount            onCreateViewCount++;
106437e785570b316db48ae8843d101f383899ea4d61George Mount            return inflater.inflate(R.layout.fragment_a, container, false);
106537e785570b316db48ae8843d101f383899ea4d61George Mount        }
106637e785570b316db48ae8843d101f383899ea4d61George Mount    }
1067990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount}
1068