17b9be8b61c445bf43925f5300a022aac3f3ba910Sergey Vasilinets/* 27b9be8b61c445bf43925f5300a022aac3f3ba910Sergey Vasilinets * Copyright (C) 2017 The Android Open Source Project 37b9be8b61c445bf43925f5300a022aac3f3ba910Sergey Vasilinets * 47b9be8b61c445bf43925f5300a022aac3f3ba910Sergey Vasilinets * Licensed under the Apache License, Version 2.0 (the "License"); 57b9be8b61c445bf43925f5300a022aac3f3ba910Sergey Vasilinets * you may not use this file except in compliance with the License. 67b9be8b61c445bf43925f5300a022aac3f3ba910Sergey Vasilinets * You may obtain a copy of the License at 77b9be8b61c445bf43925f5300a022aac3f3ba910Sergey Vasilinets * 87b9be8b61c445bf43925f5300a022aac3f3ba910Sergey Vasilinets * http://www.apache.org/licenses/LICENSE-2.0 97b9be8b61c445bf43925f5300a022aac3f3ba910Sergey Vasilinets * 107b9be8b61c445bf43925f5300a022aac3f3ba910Sergey Vasilinets * Unless required by applicable law or agreed to in writing, software 117b9be8b61c445bf43925f5300a022aac3f3ba910Sergey Vasilinets * distributed under the License is distributed on an "AS IS" BASIS, 127b9be8b61c445bf43925f5300a022aac3f3ba910Sergey Vasilinets * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137b9be8b61c445bf43925f5300a022aac3f3ba910Sergey Vasilinets * See the License for the specific language governing permissions and 147b9be8b61c445bf43925f5300a022aac3f3ba910Sergey Vasilinets * limitations under the License. 157b9be8b61c445bf43925f5300a022aac3f3ba910Sergey Vasilinets */ 167b9be8b61c445bf43925f5300a022aac3f3ba910Sergey Vasilinets 17bdc4c86d3dff74f6634a38e2f7b316b0e823a2c8Alan Viverettepackage androidx.lifecycle; 187b9be8b61c445bf43925f5300a022aac3f3ba910Sergey Vasilinets 197b9be8b61c445bf43925f5300a022aac3f3ba910Sergey Vasilinets 20bdc4c86d3dff74f6634a38e2f7b316b0e823a2c8Alan Viveretteimport static androidx.lifecycle.Lifecycle.Event.ON_CREATE; 21bdc4c86d3dff74f6634a38e2f7b316b0e823a2c8Alan Viveretteimport static androidx.lifecycle.Lifecycle.Event.ON_DESTROY; 22bdc4c86d3dff74f6634a38e2f7b316b0e823a2c8Alan Viveretteimport static androidx.lifecycle.Lifecycle.Event.ON_PAUSE; 23bdc4c86d3dff74f6634a38e2f7b316b0e823a2c8Alan Viveretteimport static androidx.lifecycle.Lifecycle.Event.ON_RESUME; 24bdc4c86d3dff74f6634a38e2f7b316b0e823a2c8Alan Viveretteimport static androidx.lifecycle.Lifecycle.Event.ON_START; 25bdc4c86d3dff74f6634a38e2f7b316b0e823a2c8Alan Viveretteimport static androidx.lifecycle.Lifecycle.Event.ON_STOP; 26bdc4c86d3dff74f6634a38e2f7b316b0e823a2c8Alan Viveretteimport static androidx.lifecycle.TestUtils.recreateActivity; 277b9be8b61c445bf43925f5300a022aac3f3ba910Sergey Vasilinets 287b9be8b61c445bf43925f5300a022aac3f3ba910Sergey Vasilinetsimport static org.hamcrest.MatcherAssert.assertThat; 297b9be8b61c445bf43925f5300a022aac3f3ba910Sergey Vasilinetsimport static org.hamcrest.Matchers.is; 307b9be8b61c445bf43925f5300a022aac3f3ba910Sergey Vasilinetsimport static org.hamcrest.Matchers.iterableWithSize; 317b9be8b61c445bf43925f5300a022aac3f3ba910Sergey Vasilinets 327b9be8b61c445bf43925f5300a022aac3f3ba910Sergey Vasilinetsimport static java.util.Arrays.asList; 337b9be8b61c445bf43925f5300a022aac3f3ba910Sergey Vasilinets 347b9be8b61c445bf43925f5300a022aac3f3ba910Sergey Vasilinetsimport android.support.test.filters.SmallTest; 357b9be8b61c445bf43925f5300a022aac3f3ba910Sergey Vasilinetsimport android.support.test.rule.ActivityTestRule; 367b9be8b61c445bf43925f5300a022aac3f3ba910Sergey Vasilinetsimport android.support.test.runner.AndroidJUnit4; 37bdc4c86d3dff74f6634a38e2f7b316b0e823a2c8Alan Viverette 38bdc4c86d3dff74f6634a38e2f7b316b0e823a2c8Alan Viveretteimport androidx.fragment.app.Fragment; 39bdc4c86d3dff74f6634a38e2f7b316b0e823a2c8Alan Viveretteimport androidx.fragment.app.FragmentActivity; 40bdc4c86d3dff74f6634a38e2f7b316b0e823a2c8Alan Viveretteimport androidx.fragment.app.FragmentManager; 41bdc4c86d3dff74f6634a38e2f7b316b0e823a2c8Alan Viveretteimport androidx.lifecycle.Lifecycle.Event; 42bdc4c86d3dff74f6634a38e2f7b316b0e823a2c8Alan Viveretteimport androidx.lifecycle.testapp.EmptyActivity; 43bdc4c86d3dff74f6634a38e2f7b316b0e823a2c8Alan Viveretteimport androidx.lifecycle.testapp.R; 447b9be8b61c445bf43925f5300a022aac3f3ba910Sergey Vasilinets 457b9be8b61c445bf43925f5300a022aac3f3ba910Sergey Vasilinetsimport org.junit.Rule; 467b9be8b61c445bf43925f5300a022aac3f3ba910Sergey Vasilinetsimport org.junit.Test; 477b9be8b61c445bf43925f5300a022aac3f3ba910Sergey Vasilinetsimport org.junit.runner.RunWith; 487b9be8b61c445bf43925f5300a022aac3f3ba910Sergey Vasilinets 497b9be8b61c445bf43925f5300a022aac3f3ba910Sergey Vasilinetsimport java.util.ArrayList; 507b9be8b61c445bf43925f5300a022aac3f3ba910Sergey Vasilinets 517b9be8b61c445bf43925f5300a022aac3f3ba910Sergey Vasilinets@SmallTest 527b9be8b61c445bf43925f5300a022aac3f3ba910Sergey Vasilinets@RunWith(AndroidJUnit4.class) 537b9be8b61c445bf43925f5300a022aac3f3ba910Sergey Vasilinetspublic class FragmentInBackStackLifecycleTest { 547b9be8b61c445bf43925f5300a022aac3f3ba910Sergey Vasilinets @Rule 557b9be8b61c445bf43925f5300a022aac3f3ba910Sergey Vasilinets public ActivityTestRule<EmptyActivity> activityTestRule = new ActivityTestRule<>( 567b9be8b61c445bf43925f5300a022aac3f3ba910Sergey Vasilinets EmptyActivity.class); 577b9be8b61c445bf43925f5300a022aac3f3ba910Sergey Vasilinets 587b9be8b61c445bf43925f5300a022aac3f3ba910Sergey Vasilinets @Test 597b9be8b61c445bf43925f5300a022aac3f3ba910Sergey Vasilinets public void test() throws Throwable { 607b9be8b61c445bf43925f5300a022aac3f3ba910Sergey Vasilinets final ArrayList<Event> collectedEvents = new ArrayList<>(); 617b9be8b61c445bf43925f5300a022aac3f3ba910Sergey Vasilinets LifecycleObserver collectingObserver = new LifecycleObserver() { 627b9be8b61c445bf43925f5300a022aac3f3ba910Sergey Vasilinets @OnLifecycleEvent(Event.ON_ANY) 63c395aedcfc50c7191423c42b47b349abb9af17a2Sergey Vasilinets void onAny(@SuppressWarnings("unused") LifecycleOwner owner, Event event) { 647b9be8b61c445bf43925f5300a022aac3f3ba910Sergey Vasilinets collectedEvents.add(event); 657b9be8b61c445bf43925f5300a022aac3f3ba910Sergey Vasilinets } 667b9be8b61c445bf43925f5300a022aac3f3ba910Sergey Vasilinets }; 677b9be8b61c445bf43925f5300a022aac3f3ba910Sergey Vasilinets final FragmentActivity activity = activityTestRule.getActivity(); 687b9be8b61c445bf43925f5300a022aac3f3ba910Sergey Vasilinets activityTestRule.runOnUiThread(() -> { 697b9be8b61c445bf43925f5300a022aac3f3ba910Sergey Vasilinets FragmentManager fm = activity.getSupportFragmentManager(); 70c395aedcfc50c7191423c42b47b349abb9af17a2Sergey Vasilinets Fragment fragment = new Fragment(); 717b9be8b61c445bf43925f5300a022aac3f3ba910Sergey Vasilinets fm.beginTransaction().add(R.id.fragment_container, fragment, "tag").addToBackStack(null) 727b9be8b61c445bf43925f5300a022aac3f3ba910Sergey Vasilinets .commit(); 737b9be8b61c445bf43925f5300a022aac3f3ba910Sergey Vasilinets fm.executePendingTransactions(); 747b9be8b61c445bf43925f5300a022aac3f3ba910Sergey Vasilinets 757b9be8b61c445bf43925f5300a022aac3f3ba910Sergey Vasilinets fragment.getLifecycle().addObserver(collectingObserver); 76c395aedcfc50c7191423c42b47b349abb9af17a2Sergey Vasilinets Fragment fragment2 = new Fragment(); 777b9be8b61c445bf43925f5300a022aac3f3ba910Sergey Vasilinets fm.beginTransaction().replace(R.id.fragment_container, fragment2).addToBackStack(null) 787b9be8b61c445bf43925f5300a022aac3f3ba910Sergey Vasilinets .commit(); 797b9be8b61c445bf43925f5300a022aac3f3ba910Sergey Vasilinets fm.executePendingTransactions(); 807b9be8b61c445bf43925f5300a022aac3f3ba910Sergey Vasilinets assertThat(collectedEvents, is(asList(ON_CREATE, ON_START, ON_RESUME, 817b9be8b61c445bf43925f5300a022aac3f3ba910Sergey Vasilinets ON_PAUSE, ON_STOP))); 827b9be8b61c445bf43925f5300a022aac3f3ba910Sergey Vasilinets collectedEvents.clear(); 837b9be8b61c445bf43925f5300a022aac3f3ba910Sergey Vasilinets }); 847b9be8b61c445bf43925f5300a022aac3f3ba910Sergey Vasilinets EmptyActivity newActivity = recreateActivity(activityTestRule.getActivity(), 857b9be8b61c445bf43925f5300a022aac3f3ba910Sergey Vasilinets activityTestRule); 867b9be8b61c445bf43925f5300a022aac3f3ba910Sergey Vasilinets 87c395aedcfc50c7191423c42b47b349abb9af17a2Sergey Vasilinets //noinspection ArraysAsListWithZeroOrOneArgument 887b9be8b61c445bf43925f5300a022aac3f3ba910Sergey Vasilinets assertThat(collectedEvents, is(asList(ON_DESTROY))); 897b9be8b61c445bf43925f5300a022aac3f3ba910Sergey Vasilinets collectedEvents.clear(); 907b9be8b61c445bf43925f5300a022aac3f3ba910Sergey Vasilinets EmptyActivity lastActivity = recreateActivity(newActivity, activityTestRule); 917b9be8b61c445bf43925f5300a022aac3f3ba910Sergey Vasilinets activityTestRule.runOnUiThread(() -> { 927b9be8b61c445bf43925f5300a022aac3f3ba910Sergey Vasilinets FragmentManager fm = lastActivity.getSupportFragmentManager(); 93c395aedcfc50c7191423c42b47b349abb9af17a2Sergey Vasilinets Fragment fragment = fm.findFragmentByTag("tag"); 947b9be8b61c445bf43925f5300a022aac3f3ba910Sergey Vasilinets fragment.getLifecycle().addObserver(collectingObserver); 957b9be8b61c445bf43925f5300a022aac3f3ba910Sergey Vasilinets assertThat(collectedEvents, iterableWithSize(0)); 967b9be8b61c445bf43925f5300a022aac3f3ba910Sergey Vasilinets fm.popBackStackImmediate(); 977b9be8b61c445bf43925f5300a022aac3f3ba910Sergey Vasilinets assertThat(collectedEvents, is(asList(ON_CREATE, ON_START, ON_RESUME))); 987b9be8b61c445bf43925f5300a022aac3f3ba910Sergey Vasilinets }); 997b9be8b61c445bf43925f5300a022aac3f3ba910Sergey Vasilinets } 1007b9be8b61c445bf43925f5300a022aac3f3ba910Sergey Vasilinets 1017b9be8b61c445bf43925f5300a022aac3f3ba910Sergey Vasilinets 1027b9be8b61c445bf43925f5300a022aac3f3ba910Sergey Vasilinets} 103