FragmentLifecycleTest.java revision 39a21dcc947992baaa700181c08fbe8bb8f077d6
139a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell/*
239a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell * Copyright (C) 2016 The Android Open Source Project
339a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell *
439a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell * Licensed under the Apache License, Version 2.0 (the "License");
539a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell * you may not use this file except in compliance with the License.
639a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell * You may obtain a copy of the License at
739a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell *
839a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell *      http://www.apache.org/licenses/LICENSE-2.0
939a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell *
1039a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell * Unless required by applicable law or agreed to in writing, software
1139a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell * distributed under the License is distributed on an "AS IS" BASIS,
1239a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1339a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell * See the License for the specific language governing permissions and
1439a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell * limitations under the License.
1539a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell */
1639a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell
1739a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell
1839a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powellpackage android.support.v4.app;
1939a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell
2039a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powellimport android.support.test.rule.ActivityTestRule;
2139a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powellimport android.support.test.runner.AndroidJUnit4;
2239a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powellimport android.support.v4.app.test.EmptyFragmentTestActivity;
2339a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powellimport android.test.suitebuilder.annotation.MediumTest;
2439a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powellimport android.view.View;
2539a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powellimport org.junit.Rule;
2639a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powellimport org.junit.Test;
2739a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powellimport org.junit.runner.RunWith;
2839a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell
2939a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powellimport static junit.framework.Assert.assertNotNull;
3039a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powellimport static junit.framework.TestCase.*;
3139a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell
3239a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell@RunWith(AndroidJUnit4.class)
3339a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powellpublic class FragmentLifecycleTest {
3439a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell
3539a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell    @Rule
3639a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell    public ActivityTestRule<EmptyFragmentTestActivity> mActivityRule =
3739a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell            new ActivityTestRule<EmptyFragmentTestActivity>(EmptyFragmentTestActivity.class);
3839a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell
3939a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell    @Test
4039a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell    @MediumTest
4139a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell    public void basicLifecycle() throws Throwable {
4239a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        final FragmentManager fm = mActivityRule.getActivity().getSupportFragmentManager();
4339a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        final StrictFragment strictFragment = new StrictFragment();
4439a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell
4539a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        // Add fragment; StrictFragment will throw if it detects any violation
4639a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        // in standard lifecycle method ordering or expected preconditions.
4739a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        fm.beginTransaction().add(strictFragment, "EmptyHeadless").commit();
4839a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        executePendingTransactions(fm);
4939a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell
5039a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        assertTrue("fragment is not added", strictFragment.isAdded());
5139a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        assertFalse("fragment is detached", strictFragment.isDetached());
5239a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        assertTrue("fragment is not resumed", strictFragment.isResumed());
5339a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell
5439a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        // Test removal as well; StrictFragment will throw here too.
5539a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        fm.beginTransaction().remove(strictFragment).commit();
5639a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        executePendingTransactions(fm);
5739a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell
5839a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        assertFalse("fragment is added", strictFragment.isAdded());
5939a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        assertFalse("fragment is resumed", strictFragment.isResumed());
6039a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell
6139a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        // This one is perhaps counterintuitive; "detached" means specifically detached
6239a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        // but still managed by a FragmentManager. The .remove call above
6339a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        // should not enter this state.
6439a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        assertFalse("fragment is detached", strictFragment.isDetached());
6539a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell    }
6639a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell
6739a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell    @Test
6839a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell    @MediumTest
6939a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell    public void detachment() throws Throwable {
7039a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        final FragmentManager fm = mActivityRule.getActivity().getSupportFragmentManager();
7139a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        final StrictFragment f1 = new StrictFragment();
7239a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        final StrictFragment f2 = new StrictFragment();
7339a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell
7439a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        fm.beginTransaction().add(f1, "1").add(f2, "2").commit();
7539a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        executePendingTransactions(fm);
7639a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell
7739a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        assertTrue("fragment 1 is not added", f1.isAdded());
7839a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        assertTrue("fragment 2 is not added", f2.isAdded());
7939a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell
8039a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        // Test detaching fragments using StrictFragment to throw on errors.
8139a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        fm.beginTransaction().detach(f1).detach(f2).commit();
8239a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        executePendingTransactions(fm);
8339a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell
8439a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        assertTrue("fragment 1 is not detached", f1.isDetached());
8539a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        assertTrue("fragment 2 is not detached", f2.isDetached());
8639a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        assertFalse("fragment 1 is added", f1.isAdded());
8739a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        assertFalse("fragment 2 is added", f2.isAdded());
8839a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell
8939a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        // Only reattach f1; leave v2 detached.
9039a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        fm.beginTransaction().attach(f1).commit();
9139a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        executePendingTransactions(fm);
9239a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell
9339a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        assertTrue("fragment 1 is not added", f1.isAdded());
9439a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        assertFalse("fragment 1 is detached", f1.isDetached());
9539a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        assertTrue("fragment 2 is not detached", f2.isDetached());
9639a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell
9739a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        // Remove both from the FragmentManager.
9839a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        fm.beginTransaction().remove(f1).remove(f2).commit();
9939a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        executePendingTransactions(fm);
10039a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell
10139a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        assertFalse("fragment 1 is added", f1.isAdded());
10239a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        assertFalse("fragment 2 is added", f2.isAdded());
10339a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        assertFalse("fragment 1 is detached", f1.isDetached());
10439a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        assertFalse("fragment 2 is detached", f2.isDetached());
10539a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell    }
10639a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell
10739a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell    @Test
10839a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell    @MediumTest
10939a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell    public void basicBackStack() throws Throwable {
11039a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        final FragmentManager fm = mActivityRule.getActivity().getSupportFragmentManager();
11139a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        final StrictFragment f1 = new StrictFragment();
11239a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        final StrictFragment f2 = new StrictFragment();
11339a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell
11439a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        // Add a fragment normally to set up
11539a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        fm.beginTransaction().add(f1, "1").commit();
11639a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        executePendingTransactions(fm);
11739a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell
11839a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        assertTrue("fragment 1 is not added", f1.isAdded());
11939a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell
12039a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        // Remove the first one and add a second. We're not using replace() here since
12139a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        // these fragments are headless and as of this test writing, replace() only works
12239a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        // for fragments with views and a container view id.
12339a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        // Add it to the back stack so we can pop it afterwards.
12439a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        fm.beginTransaction().remove(f1).add(f2, "2").addToBackStack("stack1").commit();
12539a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        executePendingTransactions(fm);
12639a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell
12739a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        assertFalse("fragment 1 is added", f1.isAdded());
12839a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        assertTrue("fragment 2 is not added", f2.isAdded());
12939a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell
13039a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        // Test popping the stack
13139a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        fm.popBackStack();
13239a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        executePendingTransactions(fm);
13339a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell
13439a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        assertFalse("fragment 2 is added", f2.isAdded());
13539a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        assertTrue("fragment 1 is not added", f1.isAdded());
13639a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell    }
13739a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell
13839a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell    @Test
13939a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell    @MediumTest
14039a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell    public void attachBackStack() throws Throwable {
14139a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        final FragmentManager fm = mActivityRule.getActivity().getSupportFragmentManager();
14239a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        final StrictFragment f1 = new StrictFragment();
14339a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        final StrictFragment f2 = new StrictFragment();
14439a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell
14539a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        // Add a fragment normally to set up
14639a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        fm.beginTransaction().add(f1, "1").commit();
14739a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        executePendingTransactions(fm);
14839a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell
14939a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        assertTrue("fragment 1 is not added", f1.isAdded());
15039a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell
15139a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        fm.beginTransaction().detach(f1).add(f2, "2").addToBackStack("stack1").commit();
15239a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        executePendingTransactions(fm);
15339a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell
15439a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        assertTrue("fragment 1 is not detached", f1.isDetached());
15539a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        assertFalse("fragment 2 is detached", f2.isDetached());
15639a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        assertFalse("fragment 1 is added", f1.isAdded());
15739a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        assertTrue("fragment 2 is not added", f2.isAdded());
15839a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell    }
15939a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell
16039a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell    @Test
16139a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell    @MediumTest
16239a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell    public void viewLifecycle() throws Throwable {
16339a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        // Test basic lifecycle when the fragment creates a view
16439a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell
16539a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        final FragmentManager fm = mActivityRule.getActivity().getSupportFragmentManager();
16639a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        final StrictViewFragment f1 = new StrictViewFragment();
16739a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell
16839a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        fm.beginTransaction().add(android.R.id.content, f1).commit();
16939a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        executePendingTransactions(fm);
17039a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell
17139a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        assertTrue("fragment 1 is not added", f1.isAdded());
17239a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        final View view = f1.getView();
17339a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        assertNotNull("fragment 1 returned null from getView", view);
17439a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        assertTrue("fragment 1's view is not attached to a window", view.isAttachedToWindow());
17539a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell
17639a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        fm.beginTransaction().remove(f1).commit();
17739a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        executePendingTransactions(fm);
17839a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell
17939a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        assertFalse("fragment 1 is added", f1.isAdded());
18039a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        assertNull("fragment 1 returned non-null from getView after removal", f1.getView());
18139a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        assertFalse("fragment 1's previous view is still attached to a window",
18239a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell                view.isAttachedToWindow());
18339a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell    }
18439a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell
18539a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell    @Test
18639a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell    @MediumTest
18739a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell    public void viewReplace() throws Throwable {
18839a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        // Replace one view with another, then reverse it with the back stack
18939a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell
19039a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        final FragmentManager fm = mActivityRule.getActivity().getSupportFragmentManager();
19139a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        final StrictViewFragment f1 = new StrictViewFragment();
19239a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        final StrictViewFragment f2 = new StrictViewFragment();
19339a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell
19439a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        fm.beginTransaction().add(android.R.id.content, f1).commit();
19539a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        executePendingTransactions(fm);
19639a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell
19739a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        assertTrue("fragment 1 is not added", f1.isAdded());
19839a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell
19939a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        View origView1 = f1.getView();
20039a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        assertNotNull("fragment 1 returned null view", origView1);
20139a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        assertTrue("fragment 1's view not attached", origView1.isAttachedToWindow());
20239a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell
20339a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        fm.beginTransaction().replace(android.R.id.content, f2).addToBackStack("stack1").commit();
20439a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        executePendingTransactions(fm);
20539a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell
20639a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        assertFalse("fragment 1 is added", f1.isAdded());
20739a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        assertTrue("fragment 2 is added", f2.isAdded());
20839a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        assertNull("fragment 1 returned non-null view", f1.getView());
20939a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        assertFalse("fragment 1's old view still attached", origView1.isAttachedToWindow());
21039a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        View origView2 = f2.getView();
21139a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        assertNotNull("fragment 2 returned null view", origView2);
21239a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        assertTrue("fragment 2's view not attached", origView2.isAttachedToWindow());
21339a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell
21439a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        fm.popBackStack();
21539a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        executePendingTransactions(fm);
21639a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell
21739a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        assertTrue("fragment 1 is not added", f1.isAdded());
21839a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        assertFalse("fragment 2 is added", f2.isAdded());
21939a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        assertNull("fragment 2 returned non-null view", f2.getView());
22039a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        assertFalse("fragment 2's view still attached", origView2.isAttachedToWindow());
22139a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        View newView1 = f1.getView();
22239a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        assertNotSame("fragment 1 had same view from last attachment", origView1, newView1);
22339a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        assertTrue("fragment 1's view not attached", newView1.isAttachedToWindow());
22439a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell    }
22539a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell
22639a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell    private void executePendingTransactions(final FragmentManager fm) throws Throwable {
22739a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        mActivityRule.runOnUiThread(new Runnable() {
22839a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell            @Override
22939a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell            public void run() {
23039a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell                fm.executePendingTransactions();
23139a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell            }
23239a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell        });
23339a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell    }
23439a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell}
235