blob: 899e873acc4c2bca5e36e75a8a949a076e340e79 [file] [log] [blame]
Adrian Roosef7a4022017-01-19 14:48:35 -08001/*
2 * Copyright (C) 2017 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 */
16
17package com.android.systemui.statusbar.phone;
18
Julia Reynolds30203152017-05-26 13:36:31 -040019import static android.app.NotificationManager.IMPORTANCE_HIGH;
20
21import static junit.framework.Assert.assertFalse;
22import static junit.framework.Assert.assertTrue;
Chris Wren621933f2017-06-14 15:59:03 -040023import static junit.framework.TestCase.fail;
Julia Reynolds30203152017-05-26 13:36:31 -040024
Chris Wren621933f2017-06-14 15:59:03 -040025import static org.mockito.ArgumentMatchers.any;
26import static org.mockito.ArgumentMatchers.anyBoolean;
27import static org.mockito.ArgumentMatchers.anyInt;
28import static org.mockito.ArgumentMatchers.anyString;
Adrian Roosef7a4022017-01-19 14:48:35 -080029import static org.mockito.Mockito.doAnswer;
30import static org.mockito.Mockito.mock;
Chris Wren621933f2017-06-14 15:59:03 -040031import static org.mockito.Mockito.never;
32import static org.mockito.Mockito.times;
Chris Wren621933f2017-06-14 15:59:03 -040033import static org.mockito.Mockito.verify;
Jason Monk9c4faa82017-08-15 09:32:27 -040034import static org.mockito.Mockito.when;
Adrian Roosef7a4022017-01-19 14:48:35 -080035
Julia Reynolds30203152017-05-26 13:36:31 -040036import android.app.Notification;
Charles He2eda2422017-09-24 17:55:21 +010037import android.app.StatusBarManager;
Jason Monk51305372017-06-22 11:41:08 -040038import android.app.trust.TrustManager;
39import android.hardware.fingerprint.FingerprintManager;
Chris Wren27a52fa2017-02-01 14:21:43 -050040import android.metrics.LogMaker;
Jason Monk9c4faa82017-08-15 09:32:27 -040041import android.os.Binder;
Julia Reynolds30203152017-05-26 13:36:31 -040042import android.os.Handler;
43import android.os.HandlerThread;
44import android.os.IPowerManager;
Chris Wren621933f2017-06-14 15:59:03 -040045import android.os.Message;
Julia Reynolds30203152017-05-26 13:36:31 -040046import android.os.PowerManager;
Chris Wren621933f2017-06-14 15:59:03 -040047import android.os.RemoteException;
Julia Reynolds30203152017-05-26 13:36:31 -040048import android.os.UserHandle;
49import android.service.notification.StatusBarNotification;
Adrian Roosef7a4022017-01-19 14:48:35 -080050import android.support.test.filters.SmallTest;
Chris Wren27a52fa2017-02-01 14:21:43 -050051import android.support.test.metricshelper.MetricsAsserts;
Chris Wren621933f2017-06-14 15:59:03 -040052import android.testing.AndroidTestingRunner;
53import android.testing.TestableLooper;
54import android.testing.TestableLooper.MessageHandler;
55import android.testing.TestableLooper.RunWithLooper;
Chris Wren27a52fa2017-02-01 14:21:43 -050056import android.util.DisplayMetrics;
Jason Monk51305372017-06-22 11:41:08 -040057import android.view.ViewGroup.LayoutParams;
Adrian Roosef7a4022017-01-19 14:48:35 -080058
Chris Wrenef319902017-03-07 17:58:31 -050059import com.android.internal.logging.MetricsLogger;
Chris Wren27a52fa2017-02-01 14:21:43 -050060import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
Chris Wrenef319902017-03-07 17:58:31 -050061import com.android.internal.logging.testing.FakeMetricsLogger;
Chris Wren621933f2017-06-14 15:59:03 -040062import com.android.internal.statusbar.IStatusBarService;
Adrian Roosef7a4022017-01-19 14:48:35 -080063import com.android.keyguard.KeyguardHostView.OnDismissAction;
Jason Monk9c4faa82017-08-15 09:32:27 -040064import com.android.systemui.R;
Adrian Roosef7a4022017-01-19 14:48:35 -080065import com.android.systemui.SysuiTestCase;
Jason Monk9c4faa82017-08-15 09:32:27 -040066import com.android.systemui.assist.AssistManager;
Adrian Roos6d5ebb72017-08-03 15:10:22 +020067import com.android.systemui.keyguard.WakefulnessLifecycle;
Julia Reynolds30203152017-05-26 13:36:31 -040068import com.android.systemui.recents.misc.SystemServicesProxy;
Chris Wren27a52fa2017-02-01 14:21:43 -050069import com.android.systemui.statusbar.ActivatableNotificationView;
Jason Monk5ecf80c2017-07-06 15:28:17 -040070import com.android.systemui.statusbar.CommandQueue;
Chris Wren27a52fa2017-02-01 14:21:43 -050071import com.android.systemui.statusbar.KeyguardIndicationController;
72import com.android.systemui.statusbar.NotificationData;
Chris Wren621933f2017-06-14 15:59:03 -040073import com.android.systemui.statusbar.NotificationData.Entry;
74import com.android.systemui.statusbar.StatusBarState;
Jason Monk9c4faa82017-08-15 09:32:27 -040075import com.android.systemui.statusbar.policy.DeviceProvisionedController;
Julia Reynolds30203152017-05-26 13:36:31 -040076import com.android.systemui.statusbar.policy.HeadsUpManager;
Jason Monk9c4faa82017-08-15 09:32:27 -040077import com.android.systemui.statusbar.policy.KeyguardMonitor;
78import com.android.systemui.statusbar.policy.KeyguardMonitorImpl;
Chris Wren27a52fa2017-02-01 14:21:43 -050079import com.android.systemui.statusbar.stack.NotificationStackScrollLayout;
Adrian Roosef7a4022017-01-19 14:48:35 -080080
81import org.junit.Before;
82import org.junit.Test;
83import org.junit.runner.RunWith;
84
Jason Monk51305372017-06-22 11:41:08 -040085import java.io.ByteArrayOutputStream;
86import java.io.PrintWriter;
Chris Wren621933f2017-06-14 15:59:03 -040087import java.util.ArrayList;
88
Adrian Roos02de4982017-02-11 09:35:54 +010089@SmallTest
Chris Wren621933f2017-06-14 15:59:03 -040090@RunWith(AndroidTestingRunner.class)
91@RunWithLooper
Jason Monk2a6ea9c2017-01-26 11:14:51 -050092public class StatusBarTest extends SysuiTestCase {
Adrian Roosef7a4022017-01-19 14:48:35 -080093
94 StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
Chris Wren27a52fa2017-02-01 14:21:43 -050095 UnlockMethodCache mUnlockMethodCache;
96 KeyguardIndicationController mKeyguardIndicationController;
97 NotificationStackScrollLayout mStackScroller;
Chris Wren621933f2017-06-14 15:59:03 -040098 TestableStatusBar mStatusBar;
Chris Wrenef319902017-03-07 17:58:31 -050099 FakeMetricsLogger mMetricsLogger;
Julia Reynolds30203152017-05-26 13:36:31 -0400100 HeadsUpManager mHeadsUpManager;
101 NotificationData mNotificationData;
102 PowerManager mPowerManager;
103 SystemServicesProxy mSystemServicesProxy;
Jorim Jaggifd3b1a12017-06-06 17:04:19 -0700104 NotificationPanelView mNotificationPanelView;
Chris Wren621933f2017-06-14 15:59:03 -0400105 IStatusBarService mBarService;
106 ArrayList<Entry> mNotificationList;
Chris Wren27a52fa2017-02-01 14:21:43 -0500107 private DisplayMetrics mDisplayMetrics = new DisplayMetrics();
108
Adrian Roos02de4982017-02-11 09:35:54 +0100109 @Before
Julia Reynolds30203152017-05-26 13:36:31 -0400110 public void setup() throws Exception {
Jason Monk9c4faa82017-08-15 09:32:27 -0400111 mContext.setTheme(R.style.Theme_SystemUI_Light);
112 mDependency.injectMockDependency(AssistManager.class);
113 mDependency.injectMockDependency(DeviceProvisionedController.class);
114 mDependency.injectTestDependency(KeyguardMonitor.class, mock(KeyguardMonitorImpl.class));
115 CommandQueue commandQueue = mock(CommandQueue.class);
116 when(commandQueue.asBinder()).thenReturn(new Binder());
117 mContext.putComponent(CommandQueue.class, commandQueue);
Jason Monk51305372017-06-22 11:41:08 -0400118 mContext.addMockSystemService(TrustManager.class, mock(TrustManager.class));
119 mContext.addMockSystemService(FingerprintManager.class, mock(FingerprintManager.class));
Adrian Roosef7a4022017-01-19 14:48:35 -0800120 mStatusBarKeyguardViewManager = mock(StatusBarKeyguardViewManager.class);
Chris Wren27a52fa2017-02-01 14:21:43 -0500121 mUnlockMethodCache = mock(UnlockMethodCache.class);
122 mKeyguardIndicationController = mock(KeyguardIndicationController.class);
123 mStackScroller = mock(NotificationStackScrollLayout.class);
Jason Monk9c4faa82017-08-15 09:32:27 -0400124 when(mStackScroller.generateLayoutParams(any())).thenReturn(new LayoutParams(0, 0));
Chris Wrenef319902017-03-07 17:58:31 -0500125 mMetricsLogger = new FakeMetricsLogger();
Julia Reynolds30203152017-05-26 13:36:31 -0400126 mHeadsUpManager = mock(HeadsUpManager.class);
127 mNotificationData = mock(NotificationData.class);
128 mSystemServicesProxy = mock(SystemServicesProxy.class);
Jorim Jaggifd3b1a12017-06-06 17:04:19 -0700129 mNotificationPanelView = mock(NotificationPanelView.class);
Jason Monk51305372017-06-22 11:41:08 -0400130 when(mNotificationPanelView.getLayoutParams()).thenReturn(new LayoutParams(0, 0));
Chris Wren621933f2017-06-14 15:59:03 -0400131 mNotificationList = mock(ArrayList.class);
Julia Reynolds30203152017-05-26 13:36:31 -0400132 IPowerManager powerManagerService = mock(IPowerManager.class);
133 HandlerThread handlerThread = new HandlerThread("TestThread");
134 handlerThread.start();
135 mPowerManager = new PowerManager(mContext, powerManagerService,
136 new Handler(handlerThread.getLooper()));
137 when(powerManagerService.isInteractive()).thenReturn(true);
Chris Wren621933f2017-06-14 15:59:03 -0400138 mBarService = mock(IStatusBarService.class);
Julia Reynolds30203152017-05-26 13:36:31 -0400139
Jason Monk8c09ac72017-03-16 11:53:40 -0400140 mDependency.injectTestDependency(MetricsLogger.class, mMetricsLogger);
Chris Wren27a52fa2017-02-01 14:21:43 -0500141 mStatusBar = new TestableStatusBar(mStatusBarKeyguardViewManager, mUnlockMethodCache,
Julia Reynolds30203152017-05-26 13:36:31 -0400142 mKeyguardIndicationController, mStackScroller, mHeadsUpManager,
Chris Wren621933f2017-06-14 15:59:03 -0400143 mNotificationData, mPowerManager, mSystemServicesProxy, mNotificationPanelView,
144 mBarService);
Jason Monk51305372017-06-22 11:41:08 -0400145 mStatusBar.mContext = mContext;
Jason Monk9c4faa82017-08-15 09:32:27 -0400146 mStatusBar.mComponents = mContext.getComponents();
Adrian Roosef7a4022017-01-19 14:48:35 -0800147 doAnswer(invocation -> {
148 OnDismissAction onDismissAction = (OnDismissAction) invocation.getArguments()[0];
149 onDismissAction.onDismiss();
150 return null;
151 }).when(mStatusBarKeyguardViewManager).dismissWithAction(any(), any(), anyBoolean());
152
153 doAnswer(invocation -> {
154 Runnable runnable = (Runnable) invocation.getArguments()[0];
155 runnable.run();
156 return null;
157 }).when(mStatusBarKeyguardViewManager).addAfterKeyguardGoneRunnable(any());
Chris Wren27a52fa2017-02-01 14:21:43 -0500158
159 when(mStackScroller.getActivatedChild()).thenReturn(null);
Chris Wren621933f2017-06-14 15:59:03 -0400160 TestableLooper.get(this).setMessageHandler(new MessageHandler() {
161 @Override
162 public boolean onMessageHandled(Message m) {
163 if (m.getCallback() == mStatusBar.mVisibilityReporter) {
164 return false;
165 }
166 return true;
167 }
168 });
Adrian Roosef7a4022017-01-19 14:48:35 -0800169 }
170
Adrian Roos02de4982017-02-11 09:35:54 +0100171 @Test
Jason Monk5ecf80c2017-07-06 15:28:17 -0400172 public void testSetBouncerShowing_noCrash() {
173 mStatusBar.mCommandQueue = mock(CommandQueue.class);
174 mStatusBar.setBouncerShowing(true);
175 }
176
177 @Test
Adrian Roosef7a4022017-01-19 14:48:35 -0800178 public void executeRunnableDismissingKeyguard_nullRunnable_showingAndOccluded() {
179 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
180 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(true);
181
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500182 mStatusBar.executeRunnableDismissingKeyguard(null, null, false, false, false);
Adrian Roosef7a4022017-01-19 14:48:35 -0800183 }
184
Adrian Roos02de4982017-02-11 09:35:54 +0100185 @Test
Adrian Roosef7a4022017-01-19 14:48:35 -0800186 public void executeRunnableDismissingKeyguard_nullRunnable_showing() {
187 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
188 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
189
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500190 mStatusBar.executeRunnableDismissingKeyguard(null, null, false, false, false);
Adrian Roosef7a4022017-01-19 14:48:35 -0800191 }
192
Adrian Roos02de4982017-02-11 09:35:54 +0100193 @Test
Adrian Roosef7a4022017-01-19 14:48:35 -0800194 public void executeRunnableDismissingKeyguard_nullRunnable_notShowing() {
195 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(false);
196 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
197
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500198 mStatusBar.executeRunnableDismissingKeyguard(null, null, false, false, false);
Adrian Roosef7a4022017-01-19 14:48:35 -0800199 }
200
Adrian Roos02de4982017-02-11 09:35:54 +0100201 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500202 public void lockscreenStateMetrics_notShowing() {
203 // uninteresting state, except that fingerprint must be non-zero
204 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
205 when(mUnlockMethodCache.canSkipBouncer()).thenReturn(true);
206 // interesting state
207 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(false);
208 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false);
209 when(mUnlockMethodCache.isMethodSecure()).thenReturn(false);
Chris Wren27a52fa2017-02-01 14:21:43 -0500210 mStatusBar.onKeyguardViewManagerStatesUpdated();
211
Chris Wrenef319902017-03-07 17:58:31 -0500212 MetricsAsserts.assertHasLog("missing hidden insecure lockscreen log",
213 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500214 new LogMaker(MetricsEvent.LOCKSCREEN)
215 .setType(MetricsEvent.TYPE_CLOSE)
216 .setSubtype(0));
217 }
218
Adrian Roos02de4982017-02-11 09:35:54 +0100219 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500220 public void lockscreenStateMetrics_notShowing_secure() {
221 // uninteresting state, except that fingerprint must be non-zero
222 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
223 when(mUnlockMethodCache.canSkipBouncer()).thenReturn(true);
224 // interesting state
225 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(false);
226 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false);
227 when(mUnlockMethodCache.isMethodSecure()).thenReturn(true);
228
229 mStatusBar.onKeyguardViewManagerStatesUpdated();
230
Chris Wrenef319902017-03-07 17:58:31 -0500231 MetricsAsserts.assertHasLog("missing hidden secure lockscreen log",
232 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500233 new LogMaker(MetricsEvent.LOCKSCREEN)
234 .setType(MetricsEvent.TYPE_CLOSE)
235 .setSubtype(1));
236 }
237
Adrian Roos02de4982017-02-11 09:35:54 +0100238 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500239 public void lockscreenStateMetrics_isShowing() {
240 // uninteresting state, except that fingerprint must be non-zero
241 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
242 when(mUnlockMethodCache.canSkipBouncer()).thenReturn(true);
243 // interesting state
244 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
245 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false);
246 when(mUnlockMethodCache.isMethodSecure()).thenReturn(false);
247
248 mStatusBar.onKeyguardViewManagerStatesUpdated();
249
Chris Wrenef319902017-03-07 17:58:31 -0500250 MetricsAsserts.assertHasLog("missing insecure lockscreen showing",
251 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500252 new LogMaker(MetricsEvent.LOCKSCREEN)
253 .setType(MetricsEvent.TYPE_OPEN)
254 .setSubtype(0));
255 }
256
Adrian Roos02de4982017-02-11 09:35:54 +0100257 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500258 public void lockscreenStateMetrics_isShowing_secure() {
259 // uninteresting state, except that fingerprint must be non-zero
260 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
261 when(mUnlockMethodCache.canSkipBouncer()).thenReturn(true);
262 // interesting state
263 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
264 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false);
265 when(mUnlockMethodCache.isMethodSecure()).thenReturn(true);
266
267 mStatusBar.onKeyguardViewManagerStatesUpdated();
268
Chris Wrenef319902017-03-07 17:58:31 -0500269 MetricsAsserts.assertHasLog("missing secure lockscreen showing log",
270 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500271 new LogMaker(MetricsEvent.LOCKSCREEN)
272 .setType(MetricsEvent.TYPE_OPEN)
273 .setSubtype(1));
274 }
275
Adrian Roos02de4982017-02-11 09:35:54 +0100276 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500277 public void lockscreenStateMetrics_isShowingBouncer() {
278 // uninteresting state, except that fingerprint must be non-zero
279 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
280 when(mUnlockMethodCache.canSkipBouncer()).thenReturn(true);
281 // interesting state
282 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
283 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(true);
284 when(mUnlockMethodCache.isMethodSecure()).thenReturn(true);
285
286 mStatusBar.onKeyguardViewManagerStatesUpdated();
287
Chris Wrenef319902017-03-07 17:58:31 -0500288 MetricsAsserts.assertHasLog("missing bouncer log",
289 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500290 new LogMaker(MetricsEvent.BOUNCER)
291 .setType(MetricsEvent.TYPE_OPEN)
292 .setSubtype(1));
293 }
294
Adrian Roos02de4982017-02-11 09:35:54 +0100295 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500296 public void onActivatedMetrics() {
297 ActivatableNotificationView view = mock(ActivatableNotificationView.class);
298 mStatusBar.onActivated(view);
299
Chris Wrenef319902017-03-07 17:58:31 -0500300 MetricsAsserts.assertHasLog("missing lockscreen note tap log",
301 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500302 new LogMaker(MetricsEvent.ACTION_LS_NOTE)
303 .setType(MetricsEvent.TYPE_ACTION));
304 }
305
Julia Reynolds30203152017-05-26 13:36:31 -0400306 @Test
307 public void testShouldPeek_nonSuppressedGroupSummary() {
308 when(mPowerManager.isScreenOn()).thenReturn(true);
309 when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false);
310 when(mNotificationData.shouldSuppressScreenOn(any())).thenReturn(false);
311 when(mNotificationData.shouldFilterOut(any())).thenReturn(false);
312 when(mSystemServicesProxy.isDreaming()).thenReturn(false);
313 when(mNotificationData.getImportance(any())).thenReturn(IMPORTANCE_HIGH);
314
315 Notification n = new Notification.Builder(getContext(), "a")
316 .setGroup("a")
317 .setGroupSummary(true)
318 .setGroupAlertBehavior(Notification.GROUP_ALERT_SUMMARY)
319 .build();
320 StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, "a", 0, 0, n,
321 UserHandle.of(0), null, 0);
322 NotificationData.Entry entry = new NotificationData.Entry(sbn);
323
324 assertTrue(mStatusBar.shouldPeek(entry, sbn));
325 }
326
327 @Test
328 public void testShouldPeek_suppressedGroupSummary() {
329 when(mPowerManager.isScreenOn()).thenReturn(true);
330 when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false);
331 when(mNotificationData.shouldSuppressScreenOn(any())).thenReturn(false);
332 when(mNotificationData.shouldFilterOut(any())).thenReturn(false);
333 when(mSystemServicesProxy.isDreaming()).thenReturn(false);
334 when(mNotificationData.getImportance(any())).thenReturn(IMPORTANCE_HIGH);
335
336 Notification n = new Notification.Builder(getContext(), "a")
337 .setGroup("a")
338 .setGroupSummary(true)
339 .setGroupAlertBehavior(Notification.GROUP_ALERT_CHILDREN)
340 .build();
341 StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, "a", 0, 0, n,
342 UserHandle.of(0), null, 0);
343 NotificationData.Entry entry = new NotificationData.Entry(sbn);
344
345 assertFalse(mStatusBar.shouldPeek(entry, sbn));
346 }
347
Chris Wren621933f2017-06-14 15:59:03 -0400348 @Test
Beverly38159ce2017-07-13 16:39:24 -0400349 public void testShouldPeek_suppressedScreenOn_dozing() {
350 when(mPowerManager.isScreenOn()).thenReturn(true);
351 when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false);
352 when(mNotificationData.shouldFilterOut(any())).thenReturn(false);
353 when(mSystemServicesProxy.isDreaming()).thenReturn(false);
354 when(mNotificationData.getImportance(any())).thenReturn(IMPORTANCE_HIGH);
355
356 mStatusBar.mDozing = true;
357 when(mNotificationData.shouldSuppressScreenOn(any())).thenReturn(true);
358 when(mNotificationData.shouldSuppressScreenOff(any())).thenReturn(false);
359
360 Notification n = new Notification.Builder(getContext(), "a").build();
361 StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, "a", 0, 0, n,
362 UserHandle.of(0), null, 0);
363 NotificationData.Entry entry = new NotificationData.Entry(sbn);
364
365 assertTrue(mStatusBar.shouldPeek(entry, sbn));
366 }
367
368 @Test
369 public void testShouldPeek_suppressedScreenOn_noDoze() {
370 when(mPowerManager.isScreenOn()).thenReturn(true);
371 when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false);
372 when(mNotificationData.shouldFilterOut(any())).thenReturn(false);
373 when(mSystemServicesProxy.isDreaming()).thenReturn(false);
374 when(mNotificationData.getImportance(any())).thenReturn(IMPORTANCE_HIGH);
375
376 mStatusBar.mDozing = false;
377 when(mNotificationData.shouldSuppressScreenOn(any())).thenReturn(true);
378 when(mNotificationData.shouldSuppressScreenOff(any())).thenReturn(false);
379
380 Notification n = new Notification.Builder(getContext(), "a").build();
381 StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, "a", 0, 0, n,
382 UserHandle.of(0), null, 0);
383 NotificationData.Entry entry = new NotificationData.Entry(sbn);
384 assertFalse(mStatusBar.shouldPeek(entry, sbn));
385 }
386 @Test
387 public void testShouldPeek_suppressedScreenOff_dozing() {
388 when(mPowerManager.isScreenOn()).thenReturn(true);
389 when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false);
390 when(mNotificationData.shouldFilterOut(any())).thenReturn(false);
391 when(mSystemServicesProxy.isDreaming()).thenReturn(false);
392 when(mNotificationData.getImportance(any())).thenReturn(IMPORTANCE_HIGH);
393
394 mStatusBar.mDozing = true;
395 when(mNotificationData.shouldSuppressScreenOn(any())).thenReturn(false);
396 when(mNotificationData.shouldSuppressScreenOff(any())).thenReturn(true);
397
398 Notification n = new Notification.Builder(getContext(), "a").build();
399 StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, "a", 0, 0, n,
400 UserHandle.of(0), null, 0);
401 NotificationData.Entry entry = new NotificationData.Entry(sbn);
402 assertFalse(mStatusBar.shouldPeek(entry, sbn));
403 }
404
405 @Test
406 public void testShouldPeek_suppressedScreenOff_noDoze() {
407 when(mPowerManager.isScreenOn()).thenReturn(true);
408 when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false);
409 when(mNotificationData.shouldFilterOut(any())).thenReturn(false);
410 when(mSystemServicesProxy.isDreaming()).thenReturn(false);
411 when(mNotificationData.getImportance(any())).thenReturn(IMPORTANCE_HIGH);
412
413 mStatusBar.mDozing = false;
414 when(mNotificationData.shouldSuppressScreenOn(any())).thenReturn(false);
415 when(mNotificationData.shouldSuppressScreenOff(any())).thenReturn(true);
416
417 Notification n = new Notification.Builder(getContext(), "a").build();
418 StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, "a", 0, 0, n,
419 UserHandle.of(0), null, 0);
420 NotificationData.Entry entry = new NotificationData.Entry(sbn);
421 assertTrue(mStatusBar.shouldPeek(entry, sbn));
422 }
423
424
425 @Test
Chris Wren621933f2017-06-14 15:59:03 -0400426 public void testLogHidden() {
427 try {
428 mStatusBar.handleVisibleToUserChanged(false);
429 verify(mBarService, times(1)).onPanelHidden();
430 verify(mBarService, never()).onPanelRevealed(anyBoolean(), anyInt());
431 } catch (RemoteException e) {
432 fail();
433 }
434 }
435
436 @Test
437 public void testPanelOpenForPeek() {
438 when(mHeadsUpManager.hasPinnedHeadsUp()).thenReturn(true);
439 when(mNotificationData.getActiveNotifications()).thenReturn(mNotificationList);
440 when(mNotificationList.size()).thenReturn(5);
441 when(mNotificationPanelView.isFullyCollapsed()).thenReturn(true);
442 mStatusBar.setBarStateForTest(StatusBarState.SHADE);
443
444 try {
445 mStatusBar.handleVisibleToUserChanged(true);
446
447 verify(mBarService, never()).onPanelHidden();
448 verify(mBarService, times(1)).onPanelRevealed(false, 1);
449 } catch (RemoteException e) {
450 fail();
451 }
452 TestableLooper.get(this).processAllMessages();
453 }
454
455 @Test
456 public void testPanelOpenAndClear() {
457 when(mHeadsUpManager.hasPinnedHeadsUp()).thenReturn(false);
458 when(mNotificationData.getActiveNotifications()).thenReturn(mNotificationList);
459 when(mNotificationList.size()).thenReturn(5);
460 when(mNotificationPanelView.isFullyCollapsed()).thenReturn(false);
461 mStatusBar.setBarStateForTest(StatusBarState.SHADE);
462
463 try {
464 mStatusBar.handleVisibleToUserChanged(true);
465
466 verify(mBarService, never()).onPanelHidden();
467 verify(mBarService, times(1)).onPanelRevealed(true, 5);
468 } catch (RemoteException e) {
469 fail();
470 }
471 TestableLooper.get(this).processAllMessages();
472 }
473
474 @Test
475 public void testPanelOpenAndNoClear() {
476 when(mHeadsUpManager.hasPinnedHeadsUp()).thenReturn(false);
477 when(mNotificationData.getActiveNotifications()).thenReturn(mNotificationList);
478 when(mNotificationList.size()).thenReturn(5);
479 when(mNotificationPanelView.isFullyCollapsed()).thenReturn(false);
480 mStatusBar.setBarStateForTest(StatusBarState.KEYGUARD);
481
482 try {
483 mStatusBar.handleVisibleToUserChanged(true);
484
485 verify(mBarService, never()).onPanelHidden();
486 verify(mBarService, times(1)).onPanelRevealed(false, 5);
487 } catch (RemoteException e) {
488 fail();
489 }
490 TestableLooper.get(this).processAllMessages();
491 }
492
Jason Monk51305372017-06-22 11:41:08 -0400493 @Test
Charles He2eda2422017-09-24 17:55:21 +0100494 public void testDisableExpandStatusBar() {
495 mStatusBar.setBarStateForTest(StatusBarState.SHADE);
496 mStatusBar.setUserSetupForTest(true);
497 when(mStatusBar.isDeviceProvisioned()).thenReturn(true);
498
499 mStatusBar.disable(StatusBarManager.DISABLE_NONE,
500 StatusBarManager.DISABLE2_NOTIFICATION_SHADE, false);
501 verify(mNotificationPanelView).setQsExpansionEnabled(false);
502 mStatusBar.animateExpandNotificationsPanel();
503 verify(mNotificationPanelView, never()).expand(anyBoolean());
504 mStatusBar.animateExpandSettingsPanel(null);
505 verify(mNotificationPanelView, never()).expand(anyBoolean());
506
507 mStatusBar.disable(StatusBarManager.DISABLE_NONE, StatusBarManager.DISABLE2_NONE, false);
508 verify(mNotificationPanelView).setQsExpansionEnabled(true);
509 mStatusBar.animateExpandNotificationsPanel();
510 verify(mNotificationPanelView).expand(anyBoolean());
511 mStatusBar.animateExpandSettingsPanel(null);
512 verify(mNotificationPanelView).expand(anyBoolean());
513 }
514
515 @Test
Jason Monk51305372017-06-22 11:41:08 -0400516 public void testDump_DoesNotCrash() {
517 mStatusBar.dump(null, new PrintWriter(new ByteArrayOutputStream()), null);
518 }
519
Jason Monk9c4faa82017-08-15 09:32:27 -0400520 @Test
521 @RunWithLooper(setAsMainLooper = true)
522 public void testUpdateKeyguardState_DoesNotCrash() {
523 mStatusBar.mStatusBarWindow = mock(StatusBarWindowView.class);
524 mStatusBar.mState = StatusBarState.KEYGUARD;
525 mStatusBar.mDozeScrimController = mock(DozeScrimController.class);
526 mStatusBar.mNotificationIconAreaController = mock(NotificationIconAreaController.class);
527 mStatusBar.updateKeyguardState(false, false);
528 }
529
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500530 static class TestableStatusBar extends StatusBar {
Chris Wren27a52fa2017-02-01 14:21:43 -0500531 public TestableStatusBar(StatusBarKeyguardViewManager man,
532 UnlockMethodCache unlock, KeyguardIndicationController key,
Julia Reynolds30203152017-05-26 13:36:31 -0400533 NotificationStackScrollLayout stack, HeadsUpManager hum, NotificationData nd,
Chris Wren621933f2017-06-14 15:59:03 -0400534 PowerManager pm, SystemServicesProxy ssp, NotificationPanelView panelView,
535 IStatusBarService barService) {
Adrian Roosef7a4022017-01-19 14:48:35 -0800536 mStatusBarKeyguardViewManager = man;
Chris Wren27a52fa2017-02-01 14:21:43 -0500537 mUnlockMethodCache = unlock;
538 mKeyguardIndicationController = key;
539 mStackScroller = stack;
Julia Reynolds30203152017-05-26 13:36:31 -0400540 mHeadsUpManager = hum;
541 mNotificationData = nd;
542 mUseHeadsUp = true;
543 mPowerManager = pm;
544 mSystemServicesProxy = ssp;
Jorim Jaggifd3b1a12017-06-06 17:04:19 -0700545 mNotificationPanel = panelView;
Chris Wren621933f2017-06-14 15:59:03 -0400546 mBarService = barService;
Adrian Roos6d5ebb72017-08-03 15:10:22 +0200547 mWakefulnessLifecycle = createAwakeWakefulnessLifecycle();
Jason Monk9c4faa82017-08-15 09:32:27 -0400548 mScrimController = mock(ScrimController.class);
Adrian Roos6d5ebb72017-08-03 15:10:22 +0200549 }
550
551 private WakefulnessLifecycle createAwakeWakefulnessLifecycle() {
552 WakefulnessLifecycle wakefulnessLifecycle = new WakefulnessLifecycle();
553 wakefulnessLifecycle.dispatchStartedWakingUp();
554 wakefulnessLifecycle.dispatchFinishedWakingUp();
555 return wakefulnessLifecycle;
Adrian Roosef7a4022017-01-19 14:48:35 -0800556 }
557
Jason Monk9c4faa82017-08-15 09:32:27 -0400558 @Override
559 protected void updateTheme() {
560 // Do nothing for now, until we have more mocking and StatusBar is smaller.
561 }
562
Chris Wren621933f2017-06-14 15:59:03 -0400563 public void setBarStateForTest(int state) {
564 mState = state;
Adrian Roosef7a4022017-01-19 14:48:35 -0800565 }
Charles He2eda2422017-09-24 17:55:21 +0100566
567 public void setUserSetupForTest(boolean userSetup) {
568 mUserSetup = userSetup;
569 }
Adrian Roosef7a4022017-01-19 14:48:35 -0800570 }
Adrian Roos02de4982017-02-11 09:35:54 +0100571}