1a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount/* 2a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount * Copyright (C) 2015 The Android Open Source Project 3a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount * 4a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount * Licensed under the Apache License, Version 2.0 (the "License"); 5a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount * you may not use this file except in compliance with the License. 6a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount * You may obtain a copy of the License at 7a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount * 8a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount * http://www.apache.org/licenses/LICENSE-2.0 9a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount * 10a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount * Unless required by applicable law or agreed to in writing, software 11a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount * distributed under the License is distributed on an "AS IS" BASIS, 12a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount * See the License for the specific language governing permissions and 14a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount * limitations under the License. 15a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount */ 16a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mountpackage android.support.v4.app; 17a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount 18a0926f64b419cfd95b7d092f7bd6bee818ccc7e1George Mountimport android.os.Build.VERSION; 19a0926f64b419cfd95b7d092f7bd6bee818ccc7e1George Mountimport android.os.Build.VERSION_CODES; 20a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mountimport android.support.v4.app.test.FragmentTestActivity; 21a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mountimport android.support.v4.app.test.FragmentTestActivity.TestFragment; 22a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mountimport android.support.v4.test.R; 23a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mountimport android.support.v4.view.ViewCompat; 24a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mountimport android.test.ActivityInstrumentationTestCase2; 25daea069fe33cc750bcb733ebcb6206d2dcedae76Chris Banesimport android.test.suitebuilder.annotation.MediumTest; 26a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mountimport android.view.View; 27a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount 28daea069fe33cc750bcb733ebcb6206d2dcedae76Chris Banes@MediumTest 29a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mountpublic class FragmentTransitionTest extends 30a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount ActivityInstrumentationTestCase2<FragmentTestActivity> { 31a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount private TestFragment mStartFragment; 32a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount private TestFragment mMidFragment; 33a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount private TestFragment mEndFragment; 34a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount private FragmentTestActivity mActivity; 35a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount 36a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount public FragmentTransitionTest() { 37a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount super(FragmentTestActivity.class); 38a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount } 39a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount 40a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount @Override 41a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount protected void setUp() throws Exception { 42a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount super.setUp(); 43a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount mStartFragment = null; 44a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount mMidFragment = null; 45a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount mEndFragment = null; 46a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount mActivity = getActivity(); 47a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount } 48a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount 49a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount public void testFragmentTransition() throws Throwable { 50a0926f64b419cfd95b7d092f7bd6bee818ccc7e1George Mount if (VERSION.SDK_INT < VERSION_CODES.LOLLIPOP) { 51a0926f64b419cfd95b7d092f7bd6bee818ccc7e1George Mount return; 52a0926f64b419cfd95b7d092f7bd6bee818ccc7e1George Mount } 53a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount launchStartFragment(); 54a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount runTestOnUiThread(new Runnable() { 55a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount @Override 56a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount public void run() { 57a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount final View sharedElement = mActivity.findViewById(R.id.hello); 58a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount assertEquals("source", ViewCompat.getTransitionName(sharedElement)); 59a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount 60a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount mEndFragment = TestFragment.create(R.layout.fragment_end); 61a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount mActivity.getSupportFragmentManager().beginTransaction() 62a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount .replace(R.id.content, mEndFragment) 63a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount .addSharedElement(sharedElement, "destination") 64a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount .addToBackStack(null) 65a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount .commit(); 66a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount mActivity.getSupportFragmentManager().executePendingTransactions(); 67a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount } 68a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount }); 69a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount waitForEnd(mEndFragment, TestFragment.ENTER); 70a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount assertTrue(mEndFragment.wasEndCalled(TestFragment.ENTER)); 71a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount assertTrue(mStartFragment.wasEndCalled(TestFragment.EXIT)); 72a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount assertTrue(mEndFragment.wasEndCalled(TestFragment.SHARED_ELEMENT_ENTER)); 73a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount runTestOnUiThread(new Runnable() { 74a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount @Override 75a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount public void run() { 76a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount final View textView = mActivity.findViewById(R.id.hello); 77a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount assertEquals("destination", ViewCompat.getTransitionName(textView)); 78a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount mActivity.getSupportFragmentManager().popBackStack(); 79a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount mActivity.getSupportFragmentManager().executePendingTransactions(); 80a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount } 81a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount }); 82a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount waitForEnd(mStartFragment, TestFragment.REENTER); 83a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount assertTrue(mStartFragment.wasEndCalled(TestFragment.REENTER)); 84a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount assertTrue(mEndFragment.wasEndCalled(TestFragment.RETURN)); 85a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount } 86a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount 87a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount public void testFirstOutLastInTransition() throws Throwable { 88a0926f64b419cfd95b7d092f7bd6bee818ccc7e1George Mount if (VERSION.SDK_INT < VERSION_CODES.LOLLIPOP) { 89a0926f64b419cfd95b7d092f7bd6bee818ccc7e1George Mount return; 90a0926f64b419cfd95b7d092f7bd6bee818ccc7e1George Mount } 91a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount launchStartFragment(); 92a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount runTestOnUiThread(new Runnable() { 93a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount @Override 94a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount public void run() { 95a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount mMidFragment = TestFragment.create(R.layout.fragment_middle); 96a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount mEndFragment = TestFragment.create(R.layout.fragment_end); 97a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount mActivity.getSupportFragmentManager().beginTransaction() 98a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount .replace(R.id.content, mMidFragment) 99a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount .replace(R.id.content, mEndFragment) 100a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount .addToBackStack(null) 101a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount .commit(); 102a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount mActivity.getSupportFragmentManager().executePendingTransactions(); 103a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount } 104a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount }); 105a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount waitForEnd(mEndFragment, TestFragment.ENTER); 106a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount assertTrue(mEndFragment.wasEndCalled(TestFragment.ENTER)); 107a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount assertFalse(mEndFragment.wasEndCalled(TestFragment.EXIT)); 108a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount assertFalse(mEndFragment.wasEndCalled(TestFragment.RETURN)); 109a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount assertFalse(mEndFragment.wasEndCalled(TestFragment.REENTER)); 110a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount 111a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount assertTrue(mStartFragment.wasEndCalled(TestFragment.EXIT)); 112a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount assertFalse(mStartFragment.wasEndCalled(TestFragment.ENTER)); 113a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount assertFalse(mStartFragment.wasEndCalled(TestFragment.RETURN)); 114a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount assertFalse(mStartFragment.wasEndCalled(TestFragment.REENTER)); 115a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount 116a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount assertFalse(mMidFragment.wasStartCalled(TestFragment.ENTER)); 117a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount assertFalse(mMidFragment.wasStartCalled(TestFragment.EXIT)); 118a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount assertFalse(mMidFragment.wasStartCalled(TestFragment.REENTER)); 119a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount assertFalse(mMidFragment.wasStartCalled(TestFragment.RETURN)); 120a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount 121a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount mStartFragment.clearNotifications(); 122a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount mEndFragment.clearNotifications(); 123a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount 124a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount runTestOnUiThread(new Runnable() { 125a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount @Override 126a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount public void run() { 127a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount mActivity.getSupportFragmentManager().popBackStack(); 128a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount mActivity.getSupportFragmentManager().executePendingTransactions(); 129a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount } 130a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount }); 131a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount waitForEnd(mEndFragment, TestFragment.RETURN); 132a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount assertTrue(mEndFragment.wasEndCalled(TestFragment.RETURN)); 133a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount assertFalse(mMidFragment.wasStartCalled(TestFragment.ENTER)); 134a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount assertFalse(mMidFragment.wasStartCalled(TestFragment.EXIT)); 135a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount assertFalse(mMidFragment.wasStartCalled(TestFragment.REENTER)); 136a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount assertFalse(mMidFragment.wasStartCalled(TestFragment.RETURN)); 137a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount 138a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount assertTrue(mStartFragment.wasStartCalled(TestFragment.REENTER)); 139a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount assertFalse(mStartFragment.wasStartCalled(TestFragment.ENTER)); 140a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount assertFalse(mStartFragment.wasStartCalled(TestFragment.EXIT)); 141a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount assertFalse(mStartFragment.wasStartCalled(TestFragment.RETURN)); 142a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount } 143a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount 144a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount public void testPopTwo() throws Throwable { 145a0926f64b419cfd95b7d092f7bd6bee818ccc7e1George Mount if (VERSION.SDK_INT < VERSION_CODES.LOLLIPOP) { 146a0926f64b419cfd95b7d092f7bd6bee818ccc7e1George Mount return; 147a0926f64b419cfd95b7d092f7bd6bee818ccc7e1George Mount } 148a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount launchStartFragment(); 149a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount runTestOnUiThread(new Runnable() { 150a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount @Override 151a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount public void run() { 152a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount mMidFragment = TestFragment.create(R.layout.fragment_middle); 153a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount mActivity.getSupportFragmentManager().beginTransaction() 154a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount .replace(R.id.content, mMidFragment) 155a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount .addToBackStack(null) 156a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount .commit(); 157a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount mActivity.getSupportFragmentManager().executePendingTransactions(); 158a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount } 159a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount }); 160a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount waitForEnd(mMidFragment, TestFragment.ENTER); 161a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount runTestOnUiThread(new Runnable() { 162a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount @Override 163a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount public void run() { 164a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount mEndFragment = TestFragment.create(R.layout.fragment_end); 165a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount mActivity.getSupportFragmentManager().beginTransaction() 166a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount .replace(R.id.content, mEndFragment) 167a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount .addToBackStack(null) 168a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount .commit(); 169a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount mActivity.getSupportFragmentManager().executePendingTransactions(); 170a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount } 171a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount }); 172a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount waitForEnd(mEndFragment, TestFragment.ENTER); 173a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount assertTrue(mEndFragment.wasEndCalled(TestFragment.ENTER)); 174a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount assertFalse(mEndFragment.wasEndCalled(TestFragment.EXIT)); 175a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount assertFalse(mEndFragment.wasEndCalled(TestFragment.RETURN)); 176a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount assertFalse(mEndFragment.wasEndCalled(TestFragment.REENTER)); 177a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount 178a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount assertTrue(mStartFragment.wasEndCalled(TestFragment.EXIT)); 179a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount assertFalse(mStartFragment.wasEndCalled(TestFragment.ENTER)); 180a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount assertFalse(mStartFragment.wasEndCalled(TestFragment.RETURN)); 181a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount assertFalse(mStartFragment.wasEndCalled(TestFragment.REENTER)); 182a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount 183a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount assertTrue(mMidFragment.wasStartCalled(TestFragment.ENTER)); 184a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount assertTrue(mMidFragment.wasStartCalled(TestFragment.EXIT)); 185a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount assertFalse(mMidFragment.wasStartCalled(TestFragment.REENTER)); 186a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount assertFalse(mMidFragment.wasStartCalled(TestFragment.RETURN)); 187a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount 188a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount mStartFragment.clearNotifications(); 189a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount mMidFragment.clearNotifications(); 190a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount mEndFragment.clearNotifications(); 191a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount 192a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount runTestOnUiThread(new Runnable() { 193a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount @Override 194a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount public void run() { 195a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount FragmentManager fm = mActivity.getSupportFragmentManager(); 196a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount int id = fm.getBackStackEntryAt(0).getId(); 197a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount fm.popBackStack(id, FragmentManager.POP_BACK_STACK_INCLUSIVE); 198a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount fm.executePendingTransactions(); 199a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount } 200a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount }); 201a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount waitForEnd(mEndFragment, TestFragment.RETURN); 202a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount assertTrue(mEndFragment.wasEndCalled(TestFragment.RETURN)); 203a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount 204a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount assertFalse(mMidFragment.wasStartCalled(TestFragment.ENTER)); 205a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount assertFalse(mMidFragment.wasStartCalled(TestFragment.EXIT)); 206a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount assertFalse(mMidFragment.wasStartCalled(TestFragment.REENTER)); 207a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount assertFalse(mMidFragment.wasStartCalled(TestFragment.RETURN)); 208a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount 209a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount assertTrue(mStartFragment.wasStartCalled(TestFragment.REENTER)); 210a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount assertFalse(mStartFragment.wasStartCalled(TestFragment.ENTER)); 211a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount assertFalse(mStartFragment.wasStartCalled(TestFragment.EXIT)); 212a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount assertFalse(mStartFragment.wasStartCalled(TestFragment.RETURN)); 213a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount } 214a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount 215a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount public void testNullTransition() throws Throwable { 216a0926f64b419cfd95b7d092f7bd6bee818ccc7e1George Mount if (VERSION.SDK_INT < VERSION_CODES.LOLLIPOP) { 217a0926f64b419cfd95b7d092f7bd6bee818ccc7e1George Mount return; 218a0926f64b419cfd95b7d092f7bd6bee818ccc7e1George Mount } 219a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount getInstrumentation().waitForIdleSync(); 220a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount runTestOnUiThread(new Runnable() { 221a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount @Override 222a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount public void run() { 223a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount mStartFragment = TestFragment.create(R.layout.fragment_start); 224a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount mStartFragment.clearTransitions(); 225a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount mActivity.getSupportFragmentManager().beginTransaction() 226a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount .replace(R.id.content, mStartFragment) 227a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount .commit(); 228a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount mActivity.getSupportFragmentManager().executePendingTransactions(); 229a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount } 230a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount }); 231a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount waitForStart(mStartFragment, TestFragment.ENTER); 232a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount // No transitions 233a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount assertFalse(mStartFragment.wasStartCalled(TestFragment.ENTER)); 234a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount 235a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount runTestOnUiThread(new Runnable() { 236a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount @Override 237a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount public void run() { 238a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount mMidFragment = TestFragment.create(R.layout.fragment_middle); 239a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount mEndFragment = TestFragment.create(R.layout.fragment_end); 240a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount mEndFragment.clearTransitions(); 241a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount mActivity.getSupportFragmentManager().beginTransaction() 242a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount .replace(R.id.content, mMidFragment) 243a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount .replace(R.id.content, mEndFragment) 244a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount .addToBackStack(null) 245a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount .commit(); 246a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount mActivity.getSupportFragmentManager().executePendingTransactions(); 247a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount } 248a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount }); 249a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount waitForStart(mEndFragment, TestFragment.ENTER); 250a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount assertFalse(mEndFragment.wasEndCalled(TestFragment.ENTER)); 251a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount assertFalse(mEndFragment.wasEndCalled(TestFragment.EXIT)); 252a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount assertFalse(mEndFragment.wasEndCalled(TestFragment.RETURN)); 253a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount assertFalse(mEndFragment.wasEndCalled(TestFragment.REENTER)); 254a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount 255a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount assertFalse(mStartFragment.wasEndCalled(TestFragment.EXIT)); 256a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount assertFalse(mStartFragment.wasEndCalled(TestFragment.ENTER)); 257a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount assertFalse(mStartFragment.wasEndCalled(TestFragment.RETURN)); 258a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount assertFalse(mStartFragment.wasEndCalled(TestFragment.REENTER)); 259a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount 260a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount assertFalse(mMidFragment.wasStartCalled(TestFragment.ENTER)); 261a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount assertFalse(mMidFragment.wasStartCalled(TestFragment.EXIT)); 262a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount assertFalse(mMidFragment.wasStartCalled(TestFragment.REENTER)); 263a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount assertFalse(mMidFragment.wasStartCalled(TestFragment.RETURN)); 264a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount 265a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount runTestOnUiThread(new Runnable() { 266a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount @Override 267a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount public void run() { 268a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount mActivity.getSupportFragmentManager().popBackStack(); 269a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount mActivity.getSupportFragmentManager().executePendingTransactions(); 270a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount } 271a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount }); 272a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount waitForStart(mEndFragment, TestFragment.RETURN); 273a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount assertFalse(mEndFragment.wasEndCalled(TestFragment.RETURN)); 274a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount assertFalse(mMidFragment.wasStartCalled(TestFragment.ENTER)); 275a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount assertFalse(mMidFragment.wasStartCalled(TestFragment.EXIT)); 276a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount assertFalse(mMidFragment.wasStartCalled(TestFragment.REENTER)); 277a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount assertFalse(mMidFragment.wasStartCalled(TestFragment.RETURN)); 278a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount 279a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount assertFalse(mStartFragment.wasStartCalled(TestFragment.REENTER)); 280a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount assertFalse(mStartFragment.wasStartCalled(TestFragment.ENTER)); 281a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount assertFalse(mStartFragment.wasStartCalled(TestFragment.EXIT)); 282a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount assertFalse(mStartFragment.wasStartCalled(TestFragment.RETURN)); 283a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount } 284a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount 285a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount public void testRemoveAdded() throws Throwable { 286a0926f64b419cfd95b7d092f7bd6bee818ccc7e1George Mount if (VERSION.SDK_INT < VERSION_CODES.LOLLIPOP) { 287a0926f64b419cfd95b7d092f7bd6bee818ccc7e1George Mount return; 288a0926f64b419cfd95b7d092f7bd6bee818ccc7e1George Mount } 289a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount launchStartFragment(); 290a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount runTestOnUiThread(new Runnable() { 291a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount @Override 292a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount public void run() { 293a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount mEndFragment = TestFragment.create(R.layout.fragment_end); 294a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount mActivity.getSupportFragmentManager().beginTransaction() 295a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount .replace(R.id.content, mEndFragment) 296a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount .replace(R.id.content, mStartFragment) 297a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount .replace(R.id.content, mEndFragment) 298a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount .addToBackStack(null) 299a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount .commit(); 300a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount mActivity.getSupportFragmentManager().executePendingTransactions(); 301a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount } 302a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount }); 303a0926f64b419cfd95b7d092f7bd6bee818ccc7e1George Mount assertTrue(waitForEnd(mEndFragment, TestFragment.ENTER)); 304a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount runTestOnUiThread(new Runnable() { 305a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount @Override 306a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount public void run() { 307a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount mActivity.getSupportFragmentManager().popBackStack(); 308a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount mActivity.getSupportFragmentManager().executePendingTransactions(); 309a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount } 310a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount }); 311a0926f64b419cfd95b7d092f7bd6bee818ccc7e1George Mount assertTrue(waitForEnd(mStartFragment, TestFragment.REENTER)); 312a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount } 313a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount 314a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount public void testAddRemoved() throws Throwable { 315a0926f64b419cfd95b7d092f7bd6bee818ccc7e1George Mount if (VERSION.SDK_INT < VERSION_CODES.LOLLIPOP) { 316a0926f64b419cfd95b7d092f7bd6bee818ccc7e1George Mount return; 317a0926f64b419cfd95b7d092f7bd6bee818ccc7e1George Mount } 318a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount launchStartFragment(); 319a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount runTestOnUiThread(new Runnable() { 320a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount @Override 321a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount public void run() { 322a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount mEndFragment = TestFragment.create(R.layout.fragment_end); 323a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount mActivity.getSupportFragmentManager().beginTransaction() 324a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount .replace(R.id.content, mEndFragment) 325a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount .replace(R.id.content, mStartFragment) 326a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount .addToBackStack(null) 327a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount .commit(); 328a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount mActivity.getSupportFragmentManager().executePendingTransactions(); 329a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount } 330a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount }); 331a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount waitForStart(mStartFragment, TestFragment.ENTER); 332a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount assertFalse(mStartFragment.wasStartCalled(TestFragment.ENTER)); 333a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount assertFalse(mStartFragment.wasStartCalled(TestFragment.EXIT)); 334a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount assertFalse(mEndFragment.wasStartCalled(TestFragment.ENTER)); 335a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount assertFalse(mEndFragment.wasStartCalled(TestFragment.EXIT)); 336a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount runTestOnUiThread(new Runnable() { 337a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount @Override 338a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount public void run() { 339a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount mActivity.getSupportFragmentManager().popBackStack(); 340a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount mActivity.getSupportFragmentManager().executePendingTransactions(); 341a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount } 342a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount }); 343a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount waitForStart(mStartFragment, TestFragment.REENTER); 344a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount assertFalse(mStartFragment.wasStartCalled(TestFragment.REENTER)); 345a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount assertFalse(mStartFragment.wasStartCalled(TestFragment.RETURN)); 346a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount assertFalse(mEndFragment.wasStartCalled(TestFragment.REENTER)); 347a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount assertFalse(mEndFragment.wasStartCalled(TestFragment.RETURN)); 348a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount } 349a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount 350a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount private void launchStartFragment() throws Throwable { 351a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount getInstrumentation().waitForIdleSync(); 352a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount runTestOnUiThread(new Runnable() { 353a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount @Override 354a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount public void run() { 355a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount mStartFragment = TestFragment.create(R.layout.fragment_start); 356a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount mActivity.getSupportFragmentManager().beginTransaction() 357a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount .replace(R.id.content, mStartFragment) 358a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount .commit(); 359a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount mActivity.getSupportFragmentManager().executePendingTransactions(); 360a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount } 361a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount }); 362a0926f64b419cfd95b7d092f7bd6bee818ccc7e1George Mount assertTrue(waitForEnd(mStartFragment, TestFragment.ENTER)); 363a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount mStartFragment.clearNotifications(); 364a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount } 365a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount 366a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount private boolean waitForStart(TestFragment fragment, int key) throws InterruptedException { 367a0926f64b419cfd95b7d092f7bd6bee818ccc7e1George Mount boolean started = fragment.waitForStart(key); 368a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount getInstrumentation().waitForIdleSync(); 369a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount return started; 370a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount } 371a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount 372a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount private boolean waitForEnd(TestFragment fragment, int key) throws InterruptedException { 373a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount if (!waitForStart(fragment, key)) { 374a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount return false; 375a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount } 376a0926f64b419cfd95b7d092f7bd6bee818ccc7e1George Mount final boolean ended = fragment.waitForEnd(key); 377a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount getInstrumentation().waitForIdleSync(); 378a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount return ended; 379a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount } 380a1f95ec10cc7e88dcc1c57c92ac5d0c37c2d9553George Mount} 381