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