blob: 585633226e59fd73138858926030455092292ba7 [file] [log] [blame]
Juan Lang5efe8f02017-05-04 16:59:46 -07001/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16package com.android.settingslib.core.lifecycle;
17
18import android.content.Context;
19import android.view.Menu;
20import android.view.MenuInflater;
21import android.view.MenuItem;
22
23import com.android.settingslib.SettingLibRobolectricTestRunner;
24import com.android.settingslib.TestConfig;
25import com.android.settingslib.core.lifecycle.events.OnAttach;
26import com.android.settingslib.core.lifecycle.events.OnCreateOptionsMenu;
27import com.android.settingslib.core.lifecycle.events.OnDestroy;
28import com.android.settingslib.core.lifecycle.events.OnOptionsItemSelected;
29import com.android.settingslib.core.lifecycle.events.OnPause;
30import com.android.settingslib.core.lifecycle.events.OnPrepareOptionsMenu;
31import com.android.settingslib.core.lifecycle.events.OnResume;
32import com.android.settingslib.core.lifecycle.events.OnStart;
33import com.android.settingslib.core.lifecycle.events.OnStop;
34
35import org.junit.Test;
36import org.junit.runner.RunWith;
37import org.robolectric.Robolectric;
38import org.robolectric.annotation.Config;
39import org.robolectric.util.ActivityController;
40import org.robolectric.util.FragmentController;
41
42import static com.google.common.truth.Truth.assertThat;
43
44@RunWith(SettingLibRobolectricTestRunner.class)
45@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
46public class LifecycleTest {
47
48 public static class TestDialogFragment extends ObservableDialogFragment {
49
50 final TestObserver mFragObserver;
51
52 public TestDialogFragment() {
53 mFragObserver = new TestObserver();
54 mLifecycle.addObserver(mFragObserver);
55 }
56 }
57
58 public static class TestFragment extends ObservableFragment {
59
60 final TestObserver mFragObserver;
61
62 public TestFragment() {
63 mFragObserver = new TestObserver();
64 getLifecycle().addObserver(mFragObserver);
65 }
66 }
67
68 public static class TestActivity extends ObservableActivity {
69
70 final TestObserver mActObserver;
71
72 public TestActivity() {
73 mActObserver = new TestObserver();
74 getLifecycle().addObserver(mActObserver);
75 }
76
77 }
78
79 public static class TestObserver implements LifecycleObserver, OnAttach, OnStart, OnResume,
80 OnPause, OnStop, OnDestroy, OnCreateOptionsMenu, OnPrepareOptionsMenu,
81 OnOptionsItemSelected {
82
83 boolean mOnAttachObserved;
84 boolean mOnAttachHasContext;
85 boolean mOnStartObserved;
86 boolean mOnResumeObserved;
87 boolean mOnPauseObserved;
88 boolean mOnStopObserved;
89 boolean mOnDestroyObserved;
90 boolean mOnCreateOptionsMenuObserved;
91 boolean mOnPrepareOptionsMenuObserved;
92 boolean mOnOptionsItemSelectedObserved;
93
94 @Override
95 public void onAttach(Context context) {
96 mOnAttachObserved = true;
97 mOnAttachHasContext = context != null;
98 }
99
100 @Override
101 public void onStart() {
102 mOnStartObserved = true;
103 }
104
105 @Override
106 public void onPause() {
107 mOnPauseObserved = true;
108 }
109
110 @Override
111 public void onResume() {
112 mOnResumeObserved = true;
113 }
114
115 @Override
116 public void onStop() {
117 mOnStopObserved = true;
118 }
119
120 @Override
121 public void onDestroy() {
122 mOnDestroyObserved = true;
123 }
124
125 @Override
126 public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
127 mOnCreateOptionsMenuObserved = true;
128 }
129
130 @Override
131 public boolean onOptionsItemSelected(MenuItem menuItem) {
132 mOnOptionsItemSelectedObserved = true;
133 return true;
134 }
135
136 @Override
137 public void onPrepareOptionsMenu(Menu menu) {
138 mOnPrepareOptionsMenuObserved = true;
139 }
140 }
141
142 @Test
143 public void runThroughActivityLifecycles_shouldObserveEverything() {
144 ActivityController<TestActivity> ac = Robolectric.buildActivity(TestActivity.class);
145 TestActivity activity = ac.get();
146
147 ac.start();
148 assertThat(activity.mActObserver.mOnStartObserved).isTrue();
149 ac.resume();
150 assertThat(activity.mActObserver.mOnResumeObserved).isTrue();
151 activity.onCreateOptionsMenu(null);
152 assertThat(activity.mActObserver.mOnCreateOptionsMenuObserved).isTrue();
153 activity.onPrepareOptionsMenu(null);
154 assertThat(activity.mActObserver.mOnPrepareOptionsMenuObserved).isTrue();
155 activity.onOptionsItemSelected(null);
156 assertThat(activity.mActObserver.mOnOptionsItemSelectedObserved).isTrue();
157 ac.pause();
158 assertThat(activity.mActObserver.mOnPauseObserved).isTrue();
159 ac.stop();
160 assertThat(activity.mActObserver.mOnStopObserved).isTrue();
161 ac.destroy();
162 assertThat(activity.mActObserver.mOnDestroyObserved).isTrue();
163 }
164
165 @Test
166 public void runThroughDialogFragmentLifecycles_shouldObserveEverything() {
167 FragmentController<TestDialogFragment> fragmentController =
168 Robolectric.buildFragment(TestDialogFragment.class);
169 TestDialogFragment fragment = fragmentController.get();
170
171 fragmentController.attach().create().start().resume();
172 fragment.onCreateOptionsMenu(null, null);
173 fragment.onPrepareOptionsMenu(null);
174 fragment.onOptionsItemSelected(null);
175 fragmentController.pause().stop().destroy();
176
177 assertThat(fragment.mFragObserver.mOnAttachObserved).isTrue();
178 assertThat(fragment.mFragObserver.mOnAttachHasContext).isTrue();
179 assertThat(fragment.mFragObserver.mOnStartObserved).isTrue();
180 assertThat(fragment.mFragObserver.mOnResumeObserved).isTrue();
181 assertThat(fragment.mFragObserver.mOnPauseObserved).isTrue();
182 assertThat(fragment.mFragObserver.mOnStopObserved).isTrue();
183 assertThat(fragment.mFragObserver.mOnDestroyObserved).isTrue();
184 assertThat(fragment.mFragObserver.mOnCreateOptionsMenuObserved).isTrue();
185 assertThat(fragment.mFragObserver.mOnPrepareOptionsMenuObserved).isTrue();
186 assertThat(fragment.mFragObserver.mOnOptionsItemSelectedObserved).isTrue();
187 }
188
189 @Test
190 public void runThroughFragmentLifecycles_shouldObserveEverything() {
191 FragmentController<TestFragment> fragmentController =
192 Robolectric.buildFragment(TestFragment.class);
193 TestFragment fragment = fragmentController.get();
194
195 fragmentController.attach().create().start().resume();
196 fragment.onCreateOptionsMenu(null, null);
197 fragment.onPrepareOptionsMenu(null);
198 fragment.onOptionsItemSelected(null);
199 fragmentController.pause().stop().destroy();
200
201 assertThat(fragment.mFragObserver.mOnAttachObserved).isTrue();
202 assertThat(fragment.mFragObserver.mOnAttachHasContext).isTrue();
203 assertThat(fragment.mFragObserver.mOnStartObserved).isTrue();
204 assertThat(fragment.mFragObserver.mOnResumeObserved).isTrue();
205 assertThat(fragment.mFragObserver.mOnPauseObserved).isTrue();
206 assertThat(fragment.mFragObserver.mOnStopObserved).isTrue();
207 assertThat(fragment.mFragObserver.mOnDestroyObserved).isTrue();
208 assertThat(fragment.mFragObserver.mOnCreateOptionsMenuObserved).isTrue();
209 assertThat(fragment.mFragObserver.mOnPrepareOptionsMenuObserved).isTrue();
210 assertThat(fragment.mFragObserver.mOnOptionsItemSelectedObserved).isTrue();
211 }
212
Fan Zhang89cff1a2017-06-03 17:46:55 -0700213 @Test
214 public void addObserverDuringObserve_shoudNotCrash() {
215 Lifecycle lifecycle = new Lifecycle();
216 lifecycle.addObserver(new OnStartObserver(lifecycle));
217 lifecycle.onStart();
218 }
219
Juan Lang5efe8f02017-05-04 16:59:46 -0700220 private static class OptionItemAccepter implements LifecycleObserver, OnOptionsItemSelected {
221 public boolean wasCalled = false;
222
223 @Override
224 public boolean onOptionsItemSelected(MenuItem menuItem) {
225 wasCalled = true;
226 return false;
227 }
228 }
229
230 @Test
231 public void onOptionItemSelectedShortCircuitsIfAnObserverHandlesTheMenuItem() {
232 FragmentController<TestFragment> fragmentController =
233 Robolectric.buildFragment(TestFragment.class);
234 TestFragment fragment = fragmentController.get();
235 OptionItemAccepter accepter = new OptionItemAccepter();
236 fragment.getLifecycle().addObserver(accepter);
237
238 fragmentController.attach().create().start().resume();
239 fragment.onCreateOptionsMenu(null, null);
240 fragment.onPrepareOptionsMenu(null);
241 fragment.onOptionsItemSelected(null);
242 fragmentController.pause().stop().destroy();
243
244 assertThat(accepter.wasCalled).isFalse();
245 }
Fan Zhang89cff1a2017-06-03 17:46:55 -0700246
247 private class OnStartObserver implements LifecycleObserver, OnStart {
248
249 private final Lifecycle mLifecycle;
250
251 public OnStartObserver(Lifecycle lifecycle) {
252 mLifecycle = lifecycle;
253 }
254
255 @Override
256 public void onStart() {
257 mLifecycle.addObserver(new LifecycleObserver() {
258 });
259 }
260 }
Juan Lang5efe8f02017-05-04 16:59:46 -0700261}