LifecycleTest.java revision ece840b115d531454d8f59533c7340ea05a4ba54
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 Mantler 20ece840b115d531454d8f59533c7340ea05a4ba54Tony Mantlerimport static com.google.common.truth.Truth.assertThat; 21ece840b115d531454d8f59533c7340ea05a4ba54Tony Mantler 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.TestConfig; 295efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Langimport com.android.settingslib.core.lifecycle.events.OnAttach; 305efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Langimport com.android.settingslib.core.lifecycle.events.OnCreateOptionsMenu; 315efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Langimport com.android.settingslib.core.lifecycle.events.OnDestroy; 325efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Langimport com.android.settingslib.core.lifecycle.events.OnOptionsItemSelected; 335efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Langimport com.android.settingslib.core.lifecycle.events.OnPause; 345efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Langimport com.android.settingslib.core.lifecycle.events.OnPrepareOptionsMenu; 355efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Langimport com.android.settingslib.core.lifecycle.events.OnResume; 365efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Langimport com.android.settingslib.core.lifecycle.events.OnStart; 375efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Langimport com.android.settingslib.core.lifecycle.events.OnStop; 385efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang 39ece840b115d531454d8f59533c7340ea05a4ba54Tony Mantlerimport org.junit.Before; 405efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Langimport org.junit.Test; 415efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Langimport org.junit.runner.RunWith; 425efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Langimport org.robolectric.Robolectric; 43f6631bf618477372bca3d4accae96553af2ae1d3Tony Mantlerimport org.robolectric.android.controller.ActivityController; 44f6631bf618477372bca3d4accae96553af2ae1d3Tony Mantlerimport org.robolectric.android.controller.FragmentController; 455efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Langimport org.robolectric.annotation.Config; 465efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang 474ca9ebd5d355b72eb6076b5cce68968ea9d794c3Tony Mantler@RunWith(SettingsLibRobolectricTestRunner.class) 485efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) 495efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Langpublic class LifecycleTest { 505efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang 51ece840b115d531454d8f59533c7340ea05a4ba54Tony Mantler private Lifecycle mLifecycle; 52ece840b115d531454d8f59533c7340ea05a4ba54Tony Mantler 535efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang public static class TestDialogFragment extends ObservableDialogFragment { 545efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang 555efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang final TestObserver mFragObserver; 565efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang 575efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang public TestDialogFragment() { 585efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang mFragObserver = new TestObserver(); 595efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang mLifecycle.addObserver(mFragObserver); 605efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang } 615efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang } 625efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang 635efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang public static class TestFragment extends ObservableFragment { 645efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang 655efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang final TestObserver mFragObserver; 665efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang 675efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang public TestFragment() { 685efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang mFragObserver = new TestObserver(); 695efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang getLifecycle().addObserver(mFragObserver); 705efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang } 715efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang } 725efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang 735efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang public static class TestActivity extends ObservableActivity { 745efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang 755efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang final TestObserver mActObserver; 765efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang 775efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang public TestActivity() { 785efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang mActObserver = new TestObserver(); 795efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang getLifecycle().addObserver(mActObserver); 805efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang } 815efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang 825efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang } 835efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang 845efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang public static class TestObserver implements LifecycleObserver, OnAttach, OnStart, OnResume, 855efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang OnPause, OnStop, OnDestroy, OnCreateOptionsMenu, OnPrepareOptionsMenu, 865efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang OnOptionsItemSelected { 875efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang 885efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang boolean mOnAttachObserved; 895efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang boolean mOnAttachHasContext; 905efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang boolean mOnStartObserved; 915efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang boolean mOnResumeObserved; 925efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang boolean mOnPauseObserved; 935efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang boolean mOnStopObserved; 945efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang boolean mOnDestroyObserved; 955efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang boolean mOnCreateOptionsMenuObserved; 965efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang boolean mOnPrepareOptionsMenuObserved; 975efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang boolean mOnOptionsItemSelectedObserved; 985efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang 995efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang @Override 1005efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang public void onAttach(Context context) { 1015efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang mOnAttachObserved = true; 1025efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang mOnAttachHasContext = context != null; 1035efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang } 1045efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang 1055efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang @Override 1065efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang public void onStart() { 1075efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang mOnStartObserved = true; 1085efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang } 1095efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang 1105efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang @Override 1115efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang public void onPause() { 1125efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang mOnPauseObserved = true; 1135efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang } 1145efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang 1155efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang @Override 1165efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang public void onResume() { 1175efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang mOnResumeObserved = true; 1185efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang } 1195efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang 1205efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang @Override 1215efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang public void onStop() { 1225efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang mOnStopObserved = true; 1235efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang } 1245efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang 1255efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang @Override 1265efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang public void onDestroy() { 1275efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang mOnDestroyObserved = true; 1285efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang } 1295efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang 1305efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang @Override 1315efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 1325efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang mOnCreateOptionsMenuObserved = true; 1335efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang } 1345efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang 1355efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang @Override 1365efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang public boolean onOptionsItemSelected(MenuItem menuItem) { 1375efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang mOnOptionsItemSelectedObserved = true; 1385efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang return true; 1395efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang } 1405efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang 1415efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang @Override 1425efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang public void onPrepareOptionsMenu(Menu menu) { 1435efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang mOnPrepareOptionsMenuObserved = true; 1445efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang } 1455efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang } 1465efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang 147ece840b115d531454d8f59533c7340ea05a4ba54Tony Mantler @Before 148ece840b115d531454d8f59533c7340ea05a4ba54Tony Mantler public void setUp() { 149ece840b115d531454d8f59533c7340ea05a4ba54Tony Mantler mLifecycle = new Lifecycle(() -> mLifecycle); 150ece840b115d531454d8f59533c7340ea05a4ba54Tony Mantler } 151ece840b115d531454d8f59533c7340ea05a4ba54Tony Mantler 1525efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang @Test 1535efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang public void runThroughActivityLifecycles_shouldObserveEverything() { 1545efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang ActivityController<TestActivity> ac = Robolectric.buildActivity(TestActivity.class); 1555efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang TestActivity activity = ac.get(); 1565efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang 1575efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang ac.start(); 1585efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang assertThat(activity.mActObserver.mOnStartObserved).isTrue(); 1595efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang ac.resume(); 1605efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang assertThat(activity.mActObserver.mOnResumeObserved).isTrue(); 1615efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang activity.onCreateOptionsMenu(null); 1625efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang assertThat(activity.mActObserver.mOnCreateOptionsMenuObserved).isTrue(); 1635efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang activity.onPrepareOptionsMenu(null); 1645efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang assertThat(activity.mActObserver.mOnPrepareOptionsMenuObserved).isTrue(); 1655efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang activity.onOptionsItemSelected(null); 1665efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang assertThat(activity.mActObserver.mOnOptionsItemSelectedObserved).isTrue(); 1675efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang ac.pause(); 1685efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang assertThat(activity.mActObserver.mOnPauseObserved).isTrue(); 1695efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang ac.stop(); 1705efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang assertThat(activity.mActObserver.mOnStopObserved).isTrue(); 1715efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang ac.destroy(); 1725efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang assertThat(activity.mActObserver.mOnDestroyObserved).isTrue(); 1735efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang } 1745efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang 1755efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang @Test 1765efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang public void runThroughDialogFragmentLifecycles_shouldObserveEverything() { 1775efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang FragmentController<TestDialogFragment> fragmentController = 1785efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang Robolectric.buildFragment(TestDialogFragment.class); 1795efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang TestDialogFragment fragment = fragmentController.get(); 1805efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang 181f6631bf618477372bca3d4accae96553af2ae1d3Tony Mantler fragmentController.create().start().resume(); 1825efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang fragment.onCreateOptionsMenu(null, null); 1835efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang fragment.onPrepareOptionsMenu(null); 1845efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang fragment.onOptionsItemSelected(null); 1855efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang fragmentController.pause().stop().destroy(); 1865efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang 1875efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang assertThat(fragment.mFragObserver.mOnAttachObserved).isTrue(); 1885efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang assertThat(fragment.mFragObserver.mOnAttachHasContext).isTrue(); 1895efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang assertThat(fragment.mFragObserver.mOnStartObserved).isTrue(); 1905efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang assertThat(fragment.mFragObserver.mOnResumeObserved).isTrue(); 1915efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang assertThat(fragment.mFragObserver.mOnPauseObserved).isTrue(); 1925efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang assertThat(fragment.mFragObserver.mOnStopObserved).isTrue(); 1935efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang assertThat(fragment.mFragObserver.mOnDestroyObserved).isTrue(); 1945efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang assertThat(fragment.mFragObserver.mOnCreateOptionsMenuObserved).isTrue(); 1955efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang assertThat(fragment.mFragObserver.mOnPrepareOptionsMenuObserved).isTrue(); 1965efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang assertThat(fragment.mFragObserver.mOnOptionsItemSelectedObserved).isTrue(); 1975efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang } 1985efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang 1995efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang @Test 2005efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang public void runThroughFragmentLifecycles_shouldObserveEverything() { 2015efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang FragmentController<TestFragment> fragmentController = 2025efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang Robolectric.buildFragment(TestFragment.class); 2035efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang TestFragment fragment = fragmentController.get(); 2045efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang 205f6631bf618477372bca3d4accae96553af2ae1d3Tony Mantler fragmentController.create().start().resume(); 2065efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang fragment.onCreateOptionsMenu(null, null); 2075efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang fragment.onPrepareOptionsMenu(null); 2085efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang fragment.onOptionsItemSelected(null); 2095efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang fragmentController.pause().stop().destroy(); 2105efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang 2115efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang assertThat(fragment.mFragObserver.mOnAttachObserved).isTrue(); 2125efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang assertThat(fragment.mFragObserver.mOnAttachHasContext).isTrue(); 2135efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang assertThat(fragment.mFragObserver.mOnStartObserved).isTrue(); 2145efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang assertThat(fragment.mFragObserver.mOnResumeObserved).isTrue(); 2155efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang assertThat(fragment.mFragObserver.mOnPauseObserved).isTrue(); 2165efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang assertThat(fragment.mFragObserver.mOnStopObserved).isTrue(); 2175efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang assertThat(fragment.mFragObserver.mOnDestroyObserved).isTrue(); 2185efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang assertThat(fragment.mFragObserver.mOnCreateOptionsMenuObserved).isTrue(); 2195efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang assertThat(fragment.mFragObserver.mOnPrepareOptionsMenuObserved).isTrue(); 2205efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang assertThat(fragment.mFragObserver.mOnOptionsItemSelectedObserved).isTrue(); 2215efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang } 2225efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang 22389cff1ab753290860444da2bd40bf1a9734471daFan Zhang @Test 22489cff1ab753290860444da2bd40bf1a9734471daFan Zhang public void addObserverDuringObserve_shoudNotCrash() { 225ece840b115d531454d8f59533c7340ea05a4ba54Tony Mantler mLifecycle.addObserver(new OnStartObserver(mLifecycle)); 226ece840b115d531454d8f59533c7340ea05a4ba54Tony Mantler mLifecycle.handleLifecycleEvent(ON_START); 22789cff1ab753290860444da2bd40bf1a9734471daFan Zhang } 22889cff1ab753290860444da2bd40bf1a9734471daFan Zhang 2295efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang private static class OptionItemAccepter implements LifecycleObserver, OnOptionsItemSelected { 2305efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang public boolean wasCalled = false; 2315efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang 2325efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang @Override 2335efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang public boolean onOptionsItemSelected(MenuItem menuItem) { 2345efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang wasCalled = true; 2355efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang return false; 2365efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang } 2375efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang } 2385efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang 2395efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang @Test 2405efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang public void onOptionItemSelectedShortCircuitsIfAnObserverHandlesTheMenuItem() { 2415efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang FragmentController<TestFragment> fragmentController = 2425efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang Robolectric.buildFragment(TestFragment.class); 2435efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang TestFragment fragment = fragmentController.get(); 2445efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang OptionItemAccepter accepter = new OptionItemAccepter(); 2455efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang fragment.getLifecycle().addObserver(accepter); 2465efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang 247f6631bf618477372bca3d4accae96553af2ae1d3Tony Mantler fragmentController.create().start().resume(); 2485efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang fragment.onCreateOptionsMenu(null, null); 2495efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang fragment.onPrepareOptionsMenu(null); 2505efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang fragment.onOptionsItemSelected(null); 2515efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang fragmentController.pause().stop().destroy(); 2525efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang 2535efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang assertThat(accepter.wasCalled).isFalse(); 2545efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang } 25589cff1ab753290860444da2bd40bf1a9734471daFan Zhang 25689cff1ab753290860444da2bd40bf1a9734471daFan Zhang private class OnStartObserver implements LifecycleObserver, OnStart { 25789cff1ab753290860444da2bd40bf1a9734471daFan Zhang 25889cff1ab753290860444da2bd40bf1a9734471daFan Zhang private final Lifecycle mLifecycle; 25989cff1ab753290860444da2bd40bf1a9734471daFan Zhang 26089cff1ab753290860444da2bd40bf1a9734471daFan Zhang public OnStartObserver(Lifecycle lifecycle) { 26189cff1ab753290860444da2bd40bf1a9734471daFan Zhang mLifecycle = lifecycle; 26289cff1ab753290860444da2bd40bf1a9734471daFan Zhang } 26389cff1ab753290860444da2bd40bf1a9734471daFan Zhang 26489cff1ab753290860444da2bd40bf1a9734471daFan Zhang @Override 26589cff1ab753290860444da2bd40bf1a9734471daFan Zhang public void onStart() { 26689cff1ab753290860444da2bd40bf1a9734471daFan Zhang mLifecycle.addObserver(new LifecycleObserver() { 26789cff1ab753290860444da2bd40bf1a9734471daFan Zhang }); 26889cff1ab753290860444da2bd40bf1a9734471daFan Zhang } 26989cff1ab753290860444da2bd40bf1a9734471daFan Zhang } 2705efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang} 271