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