15efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang/*
25efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang * Copyright (C) 2016 The Android Open Source Project
35efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang *
45efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang * Licensed under the Apache License, Version 2.0 (the "License");
55efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang * you may not use this file except in compliance with the License.
65efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang * You may obtain a copy of the License at
75efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang *
85efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang *      http://www.apache.org/licenses/LICENSE-2.0
95efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang *
105efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang * Unless required by applicable law or agreed to in writing, software
115efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang * distributed under the License is distributed on an "AS IS" BASIS,
125efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang * See the License for the specific language governing permissions and
145efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang * limitations under the License.
155efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang */
165efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Langpackage com.android.settingslib.core.lifecycle;
175efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
18ece840b115d531454d8f59533c7340ea05a4ba54Tony Mantlerimport static android.arch.lifecycle.Lifecycle.Event.ON_START;
19ece840b115d531454d8f59533c7340ea05a4ba54Tony Mantlerimport static com.google.common.truth.Truth.assertThat;
20ece840b115d531454d8f59533c7340ea05a4ba54Tony Mantler
210cc6164081d8b80d5bb9ddcc78543f9e6cccf0d8Fan Zhangimport android.arch.lifecycle.LifecycleOwner;
225efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Langimport android.content.Context;
235efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Langimport android.view.Menu;
245efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Langimport android.view.MenuInflater;
255efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Langimport android.view.MenuItem;
265efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
274ca9ebd5d355b72eb6076b5cce68968ea9d794c3Tony Mantlerimport com.android.settingslib.SettingsLibRobolectricTestRunner;
285efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Langimport com.android.settingslib.core.lifecycle.events.OnAttach;
295efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Langimport com.android.settingslib.core.lifecycle.events.OnCreateOptionsMenu;
305efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Langimport com.android.settingslib.core.lifecycle.events.OnDestroy;
315efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Langimport com.android.settingslib.core.lifecycle.events.OnOptionsItemSelected;
325efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Langimport com.android.settingslib.core.lifecycle.events.OnPause;
335efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Langimport com.android.settingslib.core.lifecycle.events.OnPrepareOptionsMenu;
345efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Langimport com.android.settingslib.core.lifecycle.events.OnResume;
355efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Langimport com.android.settingslib.core.lifecycle.events.OnStart;
365efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Langimport com.android.settingslib.core.lifecycle.events.OnStop;
375efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
38ece840b115d531454d8f59533c7340ea05a4ba54Tony Mantlerimport org.junit.Before;
395efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Langimport org.junit.Test;
405efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Langimport org.junit.runner.RunWith;
415efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Langimport org.robolectric.Robolectric;
42f6631bf618477372bca3d4accae96553af2ae1d3Tony Mantlerimport org.robolectric.android.controller.ActivityController;
43f6631bf618477372bca3d4accae96553af2ae1d3Tony Mantlerimport org.robolectric.android.controller.FragmentController;
445efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
454ca9ebd5d355b72eb6076b5cce68968ea9d794c3Tony Mantler@RunWith(SettingsLibRobolectricTestRunner.class)
465efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Langpublic class LifecycleTest {
475efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
480cc6164081d8b80d5bb9ddcc78543f9e6cccf0d8Fan Zhang    private LifecycleOwner mLifecycleOwner;
49ece840b115d531454d8f59533c7340ea05a4ba54Tony Mantler    private Lifecycle mLifecycle;
50ece840b115d531454d8f59533c7340ea05a4ba54Tony Mantler
515efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang    public static class TestDialogFragment extends ObservableDialogFragment {
525efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
535efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        final TestObserver mFragObserver;
545efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
555efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        public TestDialogFragment() {
565efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang            mFragObserver = new TestObserver();
575efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang            mLifecycle.addObserver(mFragObserver);
585efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        }
595efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang    }
605efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
615efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang    public static class TestFragment extends ObservableFragment {
625efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
635efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        final TestObserver mFragObserver;
645efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
655efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        public TestFragment() {
665efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang            mFragObserver = new TestObserver();
675efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang            getLifecycle().addObserver(mFragObserver);
685efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        }
695efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang    }
705efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
715efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang    public static class TestActivity extends ObservableActivity {
725efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
735efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        final TestObserver mActObserver;
745efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
755efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        public TestActivity() {
765efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang            mActObserver = new TestObserver();
775efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang            getLifecycle().addObserver(mActObserver);
785efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        }
795efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
805efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang    }
815efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
825efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang    public static class TestObserver implements LifecycleObserver, OnAttach, OnStart, OnResume,
835efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang            OnPause, OnStop, OnDestroy, OnCreateOptionsMenu, OnPrepareOptionsMenu,
845efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang            OnOptionsItemSelected {
855efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
865efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        boolean mOnAttachObserved;
875efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        boolean mOnAttachHasContext;
885efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        boolean mOnStartObserved;
895efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        boolean mOnResumeObserved;
905efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        boolean mOnPauseObserved;
915efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        boolean mOnStopObserved;
925efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        boolean mOnDestroyObserved;
935efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        boolean mOnCreateOptionsMenuObserved;
945efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        boolean mOnPrepareOptionsMenuObserved;
955efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        boolean mOnOptionsItemSelectedObserved;
965efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
975efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        @Override
985efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        public void onAttach(Context context) {
995efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang            mOnAttachObserved = true;
1005efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang            mOnAttachHasContext = context != null;
1015efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        }
1025efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
1035efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        @Override
1045efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        public void onStart() {
1055efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang            mOnStartObserved = true;
1065efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        }
1075efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
1085efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        @Override
1095efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        public void onPause() {
1105efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang            mOnPauseObserved = true;
1115efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        }
1125efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
1135efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        @Override
1145efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        public void onResume() {
1155efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang            mOnResumeObserved = true;
1165efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        }
1175efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
1185efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        @Override
1195efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        public void onStop() {
1205efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang            mOnStopObserved = true;
1215efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        }
1225efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
1235efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        @Override
1245efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        public void onDestroy() {
1255efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang            mOnDestroyObserved = true;
1265efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        }
1275efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
1285efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        @Override
1295efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
1305efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang            mOnCreateOptionsMenuObserved = true;
1315efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        }
1325efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
1335efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        @Override
1345efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        public boolean onOptionsItemSelected(MenuItem menuItem) {
1355efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang            mOnOptionsItemSelectedObserved = true;
1365efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang            return true;
1375efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        }
1385efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
1395efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        @Override
1405efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        public void onPrepareOptionsMenu(Menu menu) {
1415efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang            mOnPrepareOptionsMenuObserved = true;
1425efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        }
1435efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang    }
1445efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
145ece840b115d531454d8f59533c7340ea05a4ba54Tony Mantler    @Before
146ece840b115d531454d8f59533c7340ea05a4ba54Tony Mantler    public void setUp() {
1470cc6164081d8b80d5bb9ddcc78543f9e6cccf0d8Fan Zhang        mLifecycleOwner = () -> mLifecycle;
1480cc6164081d8b80d5bb9ddcc78543f9e6cccf0d8Fan Zhang        mLifecycle = new Lifecycle(mLifecycleOwner);
149ece840b115d531454d8f59533c7340ea05a4ba54Tony Mantler    }
150ece840b115d531454d8f59533c7340ea05a4ba54Tony Mantler
1515efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang    @Test
1525efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang    public void runThroughActivityLifecycles_shouldObserveEverything() {
1535efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        ActivityController<TestActivity> ac = Robolectric.buildActivity(TestActivity.class);
1545efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        TestActivity activity = ac.get();
1555efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
1565efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        ac.start();
1575efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        assertThat(activity.mActObserver.mOnStartObserved).isTrue();
1585efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        ac.resume();
1595efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        assertThat(activity.mActObserver.mOnResumeObserved).isTrue();
1605efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        activity.onCreateOptionsMenu(null);
1615efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        assertThat(activity.mActObserver.mOnCreateOptionsMenuObserved).isTrue();
1625efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        activity.onPrepareOptionsMenu(null);
1635efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        assertThat(activity.mActObserver.mOnPrepareOptionsMenuObserved).isTrue();
1645efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        activity.onOptionsItemSelected(null);
1655efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        assertThat(activity.mActObserver.mOnOptionsItemSelectedObserved).isTrue();
1665efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        ac.pause();
1675efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        assertThat(activity.mActObserver.mOnPauseObserved).isTrue();
1685efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        ac.stop();
1695efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        assertThat(activity.mActObserver.mOnStopObserved).isTrue();
1705efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        ac.destroy();
1715efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        assertThat(activity.mActObserver.mOnDestroyObserved).isTrue();
1725efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang    }
1735efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
1745efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang    @Test
1755efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang    public void runThroughDialogFragmentLifecycles_shouldObserveEverything() {
1765efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        FragmentController<TestDialogFragment> fragmentController =
1775efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang                Robolectric.buildFragment(TestDialogFragment.class);
1785efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        TestDialogFragment fragment = fragmentController.get();
1795efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
180f6631bf618477372bca3d4accae96553af2ae1d3Tony Mantler        fragmentController.create().start().resume();
1815efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        fragment.onCreateOptionsMenu(null, null);
1825efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        fragment.onPrepareOptionsMenu(null);
1835efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        fragment.onOptionsItemSelected(null);
1845efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        fragmentController.pause().stop().destroy();
1855efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
1865efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        assertThat(fragment.mFragObserver.mOnAttachObserved).isTrue();
1875efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        assertThat(fragment.mFragObserver.mOnAttachHasContext).isTrue();
1885efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        assertThat(fragment.mFragObserver.mOnStartObserved).isTrue();
1895efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        assertThat(fragment.mFragObserver.mOnResumeObserved).isTrue();
1905efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        assertThat(fragment.mFragObserver.mOnPauseObserved).isTrue();
1915efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        assertThat(fragment.mFragObserver.mOnStopObserved).isTrue();
1925efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        assertThat(fragment.mFragObserver.mOnDestroyObserved).isTrue();
1935efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        assertThat(fragment.mFragObserver.mOnCreateOptionsMenuObserved).isTrue();
1945efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        assertThat(fragment.mFragObserver.mOnPrepareOptionsMenuObserved).isTrue();
1955efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        assertThat(fragment.mFragObserver.mOnOptionsItemSelectedObserved).isTrue();
1965efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang    }
1975efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
1985efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang    @Test
1995efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang    public void runThroughFragmentLifecycles_shouldObserveEverything() {
2005efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        FragmentController<TestFragment> fragmentController =
2015efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang                Robolectric.buildFragment(TestFragment.class);
2025efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        TestFragment fragment = fragmentController.get();
2035efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
204f6631bf618477372bca3d4accae96553af2ae1d3Tony Mantler        fragmentController.create().start().resume();
2055efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        fragment.onCreateOptionsMenu(null, null);
2065efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        fragment.onPrepareOptionsMenu(null);
2075efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        fragment.onOptionsItemSelected(null);
2085efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        fragmentController.pause().stop().destroy();
2095efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
2105efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        assertThat(fragment.mFragObserver.mOnAttachObserved).isTrue();
2115efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        assertThat(fragment.mFragObserver.mOnAttachHasContext).isTrue();
2125efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        assertThat(fragment.mFragObserver.mOnStartObserved).isTrue();
2135efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        assertThat(fragment.mFragObserver.mOnResumeObserved).isTrue();
2145efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        assertThat(fragment.mFragObserver.mOnPauseObserved).isTrue();
2155efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        assertThat(fragment.mFragObserver.mOnStopObserved).isTrue();
2165efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        assertThat(fragment.mFragObserver.mOnDestroyObserved).isTrue();
2175efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        assertThat(fragment.mFragObserver.mOnCreateOptionsMenuObserved).isTrue();
2185efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        assertThat(fragment.mFragObserver.mOnPrepareOptionsMenuObserved).isTrue();
2195efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        assertThat(fragment.mFragObserver.mOnOptionsItemSelectedObserved).isTrue();
2205efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang    }
2215efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
22289cff1ab753290860444da2bd40bf1a9734471daFan Zhang    @Test
22389cff1ab753290860444da2bd40bf1a9734471daFan Zhang    public void addObserverDuringObserve_shoudNotCrash() {
224ece840b115d531454d8f59533c7340ea05a4ba54Tony Mantler        mLifecycle.addObserver(new OnStartObserver(mLifecycle));
225ece840b115d531454d8f59533c7340ea05a4ba54Tony Mantler        mLifecycle.handleLifecycleEvent(ON_START);
22689cff1ab753290860444da2bd40bf1a9734471daFan Zhang    }
22789cff1ab753290860444da2bd40bf1a9734471daFan Zhang
2285efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang    private static class OptionItemAccepter implements LifecycleObserver, OnOptionsItemSelected {
2295efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        public boolean wasCalled = false;
2305efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
2315efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        @Override
2325efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        public boolean onOptionsItemSelected(MenuItem menuItem) {
2335efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang            wasCalled = true;
2345efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang            return false;
2355efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        }
2365efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang    }
2375efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
2385efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang    @Test
2395efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang    public void onOptionItemSelectedShortCircuitsIfAnObserverHandlesTheMenuItem() {
2405efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        FragmentController<TestFragment> fragmentController =
2415efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang                Robolectric.buildFragment(TestFragment.class);
2425efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        TestFragment fragment = fragmentController.get();
2435efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        OptionItemAccepter accepter = new OptionItemAccepter();
2445efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        fragment.getLifecycle().addObserver(accepter);
2455efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
246f6631bf618477372bca3d4accae96553af2ae1d3Tony Mantler        fragmentController.create().start().resume();
2475efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        fragment.onCreateOptionsMenu(null, null);
2485efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        fragment.onPrepareOptionsMenu(null);
2495efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        fragment.onOptionsItemSelected(null);
2505efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        fragmentController.pause().stop().destroy();
2515efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
2525efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        assertThat(accepter.wasCalled).isFalse();
2535efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang    }
25489cff1ab753290860444da2bd40bf1a9734471daFan Zhang
25589cff1ab753290860444da2bd40bf1a9734471daFan Zhang    private class OnStartObserver implements LifecycleObserver, OnStart {
25689cff1ab753290860444da2bd40bf1a9734471daFan Zhang
25789cff1ab753290860444da2bd40bf1a9734471daFan Zhang        private final Lifecycle mLifecycle;
25889cff1ab753290860444da2bd40bf1a9734471daFan Zhang
25989cff1ab753290860444da2bd40bf1a9734471daFan Zhang        public OnStartObserver(Lifecycle lifecycle) {
26089cff1ab753290860444da2bd40bf1a9734471daFan Zhang            mLifecycle = lifecycle;
26189cff1ab753290860444da2bd40bf1a9734471daFan Zhang        }
26289cff1ab753290860444da2bd40bf1a9734471daFan Zhang
26389cff1ab753290860444da2bd40bf1a9734471daFan Zhang        @Override
26489cff1ab753290860444da2bd40bf1a9734471daFan Zhang        public void onStart() {
26589cff1ab753290860444da2bd40bf1a9734471daFan Zhang            mLifecycle.addObserver(new LifecycleObserver() {
26689cff1ab753290860444da2bd40bf1a9734471daFan Zhang            });
26789cff1ab753290860444da2bd40bf1a9734471daFan Zhang        }
26889cff1ab753290860444da2bd40bf1a9734471daFan Zhang    }
2695efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang}
270