1 /* 2 * Copyright (C) 2017 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 18 package android.fragment.cts; 19 20 import android.app.FragmentManager; 21 import android.support.test.rule.ActivityTestRule; 22 import android.support.test.runner.AndroidJUnit4; 23 import android.test.suitebuilder.annotation.MediumTest; 24 import org.junit.Rule; 25 import org.junit.Test; 26 import org.junit.runner.RunWith; 27 28 import static android.fragment.cts.FragmentTestUtil.executePendingTransactions; 29 import static android.fragment.cts.FragmentTestUtil.popBackStackImmediate; 30 import static junit.framework.TestCase.*; 31 32 @MediumTest 33 @RunWith(AndroidJUnit4.class) 34 public class PrimaryNavFragmentTest { 35 @Rule 36 public ActivityTestRule<FragmentTestActivity> mActivityRule = 37 new ActivityTestRule<>(FragmentTestActivity.class); 38 39 @Test 40 public void delegateBackToPrimaryNav() throws Throwable { 41 final FragmentManager fm = mActivityRule.getActivity().getFragmentManager(); 42 final StrictFragment strictFragment = new StrictFragment(); 43 44 fm.beginTransaction().add(strictFragment, null).setPrimaryNavigationFragment(strictFragment) 45 .commit(); 46 executePendingTransactions(mActivityRule, fm); 47 48 assertSame("new fragment is not primary nav fragment", strictFragment, 49 fm.getPrimaryNavigationFragment()); 50 51 final StrictFragment child = new StrictFragment(); 52 FragmentManager cfm = strictFragment.getChildFragmentManager(); 53 cfm.beginTransaction().add(child, null).addToBackStack(null).commit(); 54 executePendingTransactions(mActivityRule, cfm); 55 56 assertEquals("child transaction not on back stack", 1, cfm.getBackStackEntryCount()); 57 58 // Should execute the pop for the child fragmentmanager 59 assertTrue("popBackStackImmediate returned no action performed", 60 popBackStackImmediate(mActivityRule, fm)); 61 62 assertEquals("child transaction still on back stack", 0, cfm.getBackStackEntryCount()); 63 } 64 65 @Test 66 public void popPrimaryNav() throws Throwable { 67 final FragmentManager fm = mActivityRule.getActivity().getFragmentManager(); 68 final StrictFragment strictFragment1 = new StrictFragment(); 69 70 fm.beginTransaction().add(strictFragment1, null) 71 .setPrimaryNavigationFragment(strictFragment1) 72 .commit(); 73 executePendingTransactions(mActivityRule, fm); 74 75 assertSame("new fragment is not primary nav fragment", strictFragment1, 76 fm.getPrimaryNavigationFragment()); 77 78 fm.beginTransaction().remove(strictFragment1).addToBackStack(null).commit(); 79 executePendingTransactions(mActivityRule, fm); 80 81 assertNull("primary nav fragment is not null after remove", 82 fm.getPrimaryNavigationFragment()); 83 84 popBackStackImmediate(mActivityRule, fm); 85 86 assertSame("primary nav fragment was not restored on pop", strictFragment1, 87 fm.getPrimaryNavigationFragment()); 88 89 final StrictFragment strictFragment2 = new StrictFragment(); 90 fm.beginTransaction().remove(strictFragment1).add(strictFragment2, null) 91 .setPrimaryNavigationFragment(strictFragment2).addToBackStack(null).commit(); 92 executePendingTransactions(mActivityRule, fm); 93 94 assertSame("primary nav fragment not updated to new fragment", strictFragment2, 95 fm.getPrimaryNavigationFragment()); 96 97 popBackStackImmediate(mActivityRule, fm); 98 99 assertSame("primary nav fragment not restored on pop", strictFragment1, 100 fm.getPrimaryNavigationFragment()); 101 102 fm.beginTransaction().setPrimaryNavigationFragment(strictFragment1) 103 .addToBackStack(null).commit(); 104 executePendingTransactions(mActivityRule, fm); 105 106 assertSame("primary nav fragment not retained when set again in new transaction", 107 strictFragment1, fm.getPrimaryNavigationFragment()); 108 popBackStackImmediate(mActivityRule, fm); 109 110 assertSame("same primary nav fragment not retained when set primary nav transaction popped", 111 strictFragment1, fm.getPrimaryNavigationFragment()); 112 } 113 114 @Test 115 public void replacePrimaryNav() throws Throwable { 116 final FragmentManager fm = mActivityRule.getActivity().getFragmentManager(); 117 final StrictFragment strictFragment1 = new StrictFragment(); 118 119 fm.beginTransaction().add(android.R.id.content, strictFragment1) 120 .setPrimaryNavigationFragment(strictFragment1).commit(); 121 executePendingTransactions(mActivityRule, fm); 122 123 assertSame("new fragment is not primary nav fragment", strictFragment1, 124 fm.getPrimaryNavigationFragment()); 125 126 final StrictFragment strictFragment2 = new StrictFragment(); 127 fm.beginTransaction().replace(android.R.id.content, strictFragment2) 128 .addToBackStack(null).commit(); 129 130 executePendingTransactions(mActivityRule, fm); 131 132 assertNull("primary nav fragment not null after replace", 133 fm.getPrimaryNavigationFragment()); 134 135 popBackStackImmediate(mActivityRule, fm); 136 137 assertSame("primary nav fragment not restored after popping replace", strictFragment1, 138 fm.getPrimaryNavigationFragment()); 139 140 fm.beginTransaction().setPrimaryNavigationFragment(null).commit(); 141 executePendingTransactions(mActivityRule, fm); 142 143 assertNull("primary nav fragment not null after explicit set to null", 144 fm.getPrimaryNavigationFragment()); 145 146 fm.beginTransaction().replace(android.R.id.content, strictFragment2) 147 .setPrimaryNavigationFragment(strictFragment2).addToBackStack(null).commit(); 148 executePendingTransactions(mActivityRule, fm); 149 150 assertSame("primary nav fragment not set correctly after replace", strictFragment2, 151 fm.getPrimaryNavigationFragment()); 152 153 popBackStackImmediate(mActivityRule, fm); 154 155 assertNull("primary nav fragment not null after popping replace", 156 fm.getPrimaryNavigationFragment()); 157 } 158 } 159