blob: 713f7843eaea86ed3f8e60172202ed8f8d4b5e45 [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;
Eliot Courtney09322282017-11-09 15:31:19 +090057import android.util.SparseArray;
Jason Monk51305372017-06-22 11:41:08 -040058import android.view.ViewGroup.LayoutParams;
Adrian Roosef7a4022017-01-19 14:48:35 -080059
Chris Wrenef319902017-03-07 17:58:31 -050060import com.android.internal.logging.MetricsLogger;
Chris Wren27a52fa2017-02-01 14:21:43 -050061import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
Chris Wrenef319902017-03-07 17:58:31 -050062import com.android.internal.logging.testing.FakeMetricsLogger;
Chris Wren621933f2017-06-14 15:59:03 -040063import com.android.internal.statusbar.IStatusBarService;
Adrian Roosef7a4022017-01-19 14:48:35 -080064import com.android.keyguard.KeyguardHostView.OnDismissAction;
Jason Monk9c4faa82017-08-15 09:32:27 -040065import com.android.systemui.R;
Adrian Roosef7a4022017-01-19 14:48:35 -080066import com.android.systemui.SysuiTestCase;
Jason Monk9c4faa82017-08-15 09:32:27 -040067import com.android.systemui.assist.AssistManager;
Adrian Roos6d5ebb72017-08-03 15:10:22 +020068import com.android.systemui.keyguard.WakefulnessLifecycle;
Julia Reynolds30203152017-05-26 13:36:31 -040069import com.android.systemui.recents.misc.SystemServicesProxy;
Chris Wren27a52fa2017-02-01 14:21:43 -050070import com.android.systemui.statusbar.ActivatableNotificationView;
Jason Monk5ecf80c2017-07-06 15:28:17 -040071import com.android.systemui.statusbar.CommandQueue;
Chris Wren27a52fa2017-02-01 14:21:43 -050072import com.android.systemui.statusbar.KeyguardIndicationController;
73import com.android.systemui.statusbar.NotificationData;
Chris Wren621933f2017-06-14 15:59:03 -040074import com.android.systemui.statusbar.NotificationData.Entry;
Eliot Courtney09322282017-11-09 15:31:19 +090075import com.android.systemui.statusbar.NotificationLockscreenUserManager;
Chris Wren621933f2017-06-14 15:59:03 -040076import com.android.systemui.statusbar.StatusBarState;
Jason Monk9c4faa82017-08-15 09:32:27 -040077import com.android.systemui.statusbar.policy.DeviceProvisionedController;
Julia Reynolds30203152017-05-26 13:36:31 -040078import com.android.systemui.statusbar.policy.HeadsUpManager;
Jason Monk9c4faa82017-08-15 09:32:27 -040079import com.android.systemui.statusbar.policy.KeyguardMonitor;
80import com.android.systemui.statusbar.policy.KeyguardMonitorImpl;
Chris Wren27a52fa2017-02-01 14:21:43 -050081import com.android.systemui.statusbar.stack.NotificationStackScrollLayout;
Adrian Roosef7a4022017-01-19 14:48:35 -080082
83import org.junit.Before;
84import org.junit.Test;
85import org.junit.runner.RunWith;
86
Jason Monk51305372017-06-22 11:41:08 -040087import java.io.ByteArrayOutputStream;
88import java.io.PrintWriter;
Chris Wren621933f2017-06-14 15:59:03 -040089import java.util.ArrayList;
90
Adrian Roos02de4982017-02-11 09:35:54 +010091@SmallTest
Chris Wren621933f2017-06-14 15:59:03 -040092@RunWith(AndroidTestingRunner.class)
93@RunWithLooper
Jason Monk2a6ea9c2017-01-26 11:14:51 -050094public class StatusBarTest extends SysuiTestCase {
Adrian Roosef7a4022017-01-19 14:48:35 -080095
96 StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
Chris Wren27a52fa2017-02-01 14:21:43 -050097 UnlockMethodCache mUnlockMethodCache;
98 KeyguardIndicationController mKeyguardIndicationController;
99 NotificationStackScrollLayout mStackScroller;
Chris Wren621933f2017-06-14 15:59:03 -0400100 TestableStatusBar mStatusBar;
Chris Wrenef319902017-03-07 17:58:31 -0500101 FakeMetricsLogger mMetricsLogger;
Julia Reynolds30203152017-05-26 13:36:31 -0400102 HeadsUpManager mHeadsUpManager;
103 NotificationData mNotificationData;
104 PowerManager mPowerManager;
105 SystemServicesProxy mSystemServicesProxy;
Jorim Jaggifd3b1a12017-06-06 17:04:19 -0700106 NotificationPanelView mNotificationPanelView;
Chris Wren621933f2017-06-14 15:59:03 -0400107 IStatusBarService mBarService;
108 ArrayList<Entry> mNotificationList;
Chris Wren27a52fa2017-02-01 14:21:43 -0500109 private DisplayMetrics mDisplayMetrics = new DisplayMetrics();
110
Adrian Roos02de4982017-02-11 09:35:54 +0100111 @Before
Julia Reynolds30203152017-05-26 13:36:31 -0400112 public void setup() throws Exception {
Jason Monk9c4faa82017-08-15 09:32:27 -0400113 mContext.setTheme(R.style.Theme_SystemUI_Light);
114 mDependency.injectMockDependency(AssistManager.class);
115 mDependency.injectMockDependency(DeviceProvisionedController.class);
116 mDependency.injectTestDependency(KeyguardMonitor.class, mock(KeyguardMonitorImpl.class));
117 CommandQueue commandQueue = mock(CommandQueue.class);
118 when(commandQueue.asBinder()).thenReturn(new Binder());
119 mContext.putComponent(CommandQueue.class, commandQueue);
Jason Monk51305372017-06-22 11:41:08 -0400120 mContext.addMockSystemService(TrustManager.class, mock(TrustManager.class));
121 mContext.addMockSystemService(FingerprintManager.class, mock(FingerprintManager.class));
Adrian Roosef7a4022017-01-19 14:48:35 -0800122 mStatusBarKeyguardViewManager = mock(StatusBarKeyguardViewManager.class);
Chris Wren27a52fa2017-02-01 14:21:43 -0500123 mUnlockMethodCache = mock(UnlockMethodCache.class);
124 mKeyguardIndicationController = mock(KeyguardIndicationController.class);
125 mStackScroller = mock(NotificationStackScrollLayout.class);
Jason Monk9c4faa82017-08-15 09:32:27 -0400126 when(mStackScroller.generateLayoutParams(any())).thenReturn(new LayoutParams(0, 0));
Chris Wrenef319902017-03-07 17:58:31 -0500127 mMetricsLogger = new FakeMetricsLogger();
Julia Reynolds30203152017-05-26 13:36:31 -0400128 mHeadsUpManager = mock(HeadsUpManager.class);
129 mNotificationData = mock(NotificationData.class);
130 mSystemServicesProxy = mock(SystemServicesProxy.class);
Jorim Jaggifd3b1a12017-06-06 17:04:19 -0700131 mNotificationPanelView = mock(NotificationPanelView.class);
Jason Monk51305372017-06-22 11:41:08 -0400132 when(mNotificationPanelView.getLayoutParams()).thenReturn(new LayoutParams(0, 0));
Chris Wren621933f2017-06-14 15:59:03 -0400133 mNotificationList = mock(ArrayList.class);
Julia Reynolds30203152017-05-26 13:36:31 -0400134 IPowerManager powerManagerService = mock(IPowerManager.class);
135 HandlerThread handlerThread = new HandlerThread("TestThread");
136 handlerThread.start();
137 mPowerManager = new PowerManager(mContext, powerManagerService,
138 new Handler(handlerThread.getLooper()));
139 when(powerManagerService.isInteractive()).thenReturn(true);
Chris Wren621933f2017-06-14 15:59:03 -0400140 mBarService = mock(IStatusBarService.class);
Julia Reynolds30203152017-05-26 13:36:31 -0400141
Jason Monk8c09ac72017-03-16 11:53:40 -0400142 mDependency.injectTestDependency(MetricsLogger.class, mMetricsLogger);
Chris Wren27a52fa2017-02-01 14:21:43 -0500143 mStatusBar = new TestableStatusBar(mStatusBarKeyguardViewManager, mUnlockMethodCache,
Julia Reynolds30203152017-05-26 13:36:31 -0400144 mKeyguardIndicationController, mStackScroller, mHeadsUpManager,
Chris Wren621933f2017-06-14 15:59:03 -0400145 mNotificationData, mPowerManager, mSystemServicesProxy, mNotificationPanelView,
146 mBarService);
Jason Monk51305372017-06-22 11:41:08 -0400147 mStatusBar.mContext = mContext;
Jason Monk9c4faa82017-08-15 09:32:27 -0400148 mStatusBar.mComponents = mContext.getComponents();
Adrian Roosef7a4022017-01-19 14:48:35 -0800149 doAnswer(invocation -> {
150 OnDismissAction onDismissAction = (OnDismissAction) invocation.getArguments()[0];
151 onDismissAction.onDismiss();
152 return null;
153 }).when(mStatusBarKeyguardViewManager).dismissWithAction(any(), any(), anyBoolean());
154
155 doAnswer(invocation -> {
156 Runnable runnable = (Runnable) invocation.getArguments()[0];
157 runnable.run();
158 return null;
159 }).when(mStatusBarKeyguardViewManager).addAfterKeyguardGoneRunnable(any());
Chris Wren27a52fa2017-02-01 14:21:43 -0500160
161 when(mStackScroller.getActivatedChild()).thenReturn(null);
Chris Wren621933f2017-06-14 15:59:03 -0400162 TestableLooper.get(this).setMessageHandler(new MessageHandler() {
163 @Override
164 public boolean onMessageHandled(Message m) {
165 if (m.getCallback() == mStatusBar.mVisibilityReporter) {
166 return false;
167 }
168 return true;
169 }
170 });
Adrian Roosef7a4022017-01-19 14:48:35 -0800171 }
172
Adrian Roos02de4982017-02-11 09:35:54 +0100173 @Test
Jason Monk5ecf80c2017-07-06 15:28:17 -0400174 public void testSetBouncerShowing_noCrash() {
175 mStatusBar.mCommandQueue = mock(CommandQueue.class);
176 mStatusBar.setBouncerShowing(true);
177 }
178
179 @Test
Adrian Roosef7a4022017-01-19 14:48:35 -0800180 public void executeRunnableDismissingKeyguard_nullRunnable_showingAndOccluded() {
181 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
182 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(true);
183
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500184 mStatusBar.executeRunnableDismissingKeyguard(null, null, false, false, false);
Adrian Roosef7a4022017-01-19 14:48:35 -0800185 }
186
Adrian Roos02de4982017-02-11 09:35:54 +0100187 @Test
Adrian Roosef7a4022017-01-19 14:48:35 -0800188 public void executeRunnableDismissingKeyguard_nullRunnable_showing() {
189 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
190 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
191
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500192 mStatusBar.executeRunnableDismissingKeyguard(null, null, false, false, false);
Adrian Roosef7a4022017-01-19 14:48:35 -0800193 }
194
Adrian Roos02de4982017-02-11 09:35:54 +0100195 @Test
Adrian Roosef7a4022017-01-19 14:48:35 -0800196 public void executeRunnableDismissingKeyguard_nullRunnable_notShowing() {
197 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(false);
198 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
199
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500200 mStatusBar.executeRunnableDismissingKeyguard(null, null, false, false, false);
Adrian Roosef7a4022017-01-19 14:48:35 -0800201 }
202
Adrian Roos02de4982017-02-11 09:35:54 +0100203 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500204 public void lockscreenStateMetrics_notShowing() {
205 // uninteresting state, except that fingerprint must be non-zero
206 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
207 when(mUnlockMethodCache.canSkipBouncer()).thenReturn(true);
208 // interesting state
209 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(false);
210 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false);
211 when(mUnlockMethodCache.isMethodSecure()).thenReturn(false);
Chris Wren27a52fa2017-02-01 14:21:43 -0500212 mStatusBar.onKeyguardViewManagerStatesUpdated();
213
Chris Wrenef319902017-03-07 17:58:31 -0500214 MetricsAsserts.assertHasLog("missing hidden insecure lockscreen log",
215 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500216 new LogMaker(MetricsEvent.LOCKSCREEN)
217 .setType(MetricsEvent.TYPE_CLOSE)
218 .setSubtype(0));
219 }
220
Adrian Roos02de4982017-02-11 09:35:54 +0100221 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500222 public void lockscreenStateMetrics_notShowing_secure() {
223 // uninteresting state, except that fingerprint must be non-zero
224 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
225 when(mUnlockMethodCache.canSkipBouncer()).thenReturn(true);
226 // interesting state
227 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(false);
228 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false);
229 when(mUnlockMethodCache.isMethodSecure()).thenReturn(true);
230
231 mStatusBar.onKeyguardViewManagerStatesUpdated();
232
Chris Wrenef319902017-03-07 17:58:31 -0500233 MetricsAsserts.assertHasLog("missing hidden secure lockscreen log",
234 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500235 new LogMaker(MetricsEvent.LOCKSCREEN)
236 .setType(MetricsEvent.TYPE_CLOSE)
237 .setSubtype(1));
238 }
239
Adrian Roos02de4982017-02-11 09:35:54 +0100240 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500241 public void lockscreenStateMetrics_isShowing() {
242 // uninteresting state, except that fingerprint must be non-zero
243 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
244 when(mUnlockMethodCache.canSkipBouncer()).thenReturn(true);
245 // interesting state
246 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
247 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false);
248 when(mUnlockMethodCache.isMethodSecure()).thenReturn(false);
249
250 mStatusBar.onKeyguardViewManagerStatesUpdated();
251
Chris Wrenef319902017-03-07 17:58:31 -0500252 MetricsAsserts.assertHasLog("missing insecure lockscreen showing",
253 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500254 new LogMaker(MetricsEvent.LOCKSCREEN)
255 .setType(MetricsEvent.TYPE_OPEN)
256 .setSubtype(0));
257 }
258
Adrian Roos02de4982017-02-11 09:35:54 +0100259 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500260 public void lockscreenStateMetrics_isShowing_secure() {
261 // uninteresting state, except that fingerprint must be non-zero
262 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
263 when(mUnlockMethodCache.canSkipBouncer()).thenReturn(true);
264 // interesting state
265 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
266 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false);
267 when(mUnlockMethodCache.isMethodSecure()).thenReturn(true);
268
269 mStatusBar.onKeyguardViewManagerStatesUpdated();
270
Chris Wrenef319902017-03-07 17:58:31 -0500271 MetricsAsserts.assertHasLog("missing secure lockscreen showing log",
272 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500273 new LogMaker(MetricsEvent.LOCKSCREEN)
274 .setType(MetricsEvent.TYPE_OPEN)
275 .setSubtype(1));
276 }
277
Adrian Roos02de4982017-02-11 09:35:54 +0100278 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500279 public void lockscreenStateMetrics_isShowingBouncer() {
280 // uninteresting state, except that fingerprint must be non-zero
281 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
282 when(mUnlockMethodCache.canSkipBouncer()).thenReturn(true);
283 // interesting state
284 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
285 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(true);
286 when(mUnlockMethodCache.isMethodSecure()).thenReturn(true);
287
288 mStatusBar.onKeyguardViewManagerStatesUpdated();
289
Chris Wrenef319902017-03-07 17:58:31 -0500290 MetricsAsserts.assertHasLog("missing bouncer log",
291 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500292 new LogMaker(MetricsEvent.BOUNCER)
293 .setType(MetricsEvent.TYPE_OPEN)
294 .setSubtype(1));
295 }
296
Adrian Roos02de4982017-02-11 09:35:54 +0100297 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500298 public void onActivatedMetrics() {
299 ActivatableNotificationView view = mock(ActivatableNotificationView.class);
300 mStatusBar.onActivated(view);
301
Chris Wrenef319902017-03-07 17:58:31 -0500302 MetricsAsserts.assertHasLog("missing lockscreen note tap log",
303 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500304 new LogMaker(MetricsEvent.ACTION_LS_NOTE)
305 .setType(MetricsEvent.TYPE_ACTION));
306 }
307
Julia Reynolds30203152017-05-26 13:36:31 -0400308 @Test
309 public void testShouldPeek_nonSuppressedGroupSummary() {
310 when(mPowerManager.isScreenOn()).thenReturn(true);
311 when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false);
312 when(mNotificationData.shouldSuppressScreenOn(any())).thenReturn(false);
313 when(mNotificationData.shouldFilterOut(any())).thenReturn(false);
314 when(mSystemServicesProxy.isDreaming()).thenReturn(false);
315 when(mNotificationData.getImportance(any())).thenReturn(IMPORTANCE_HIGH);
316
317 Notification n = new Notification.Builder(getContext(), "a")
318 .setGroup("a")
319 .setGroupSummary(true)
320 .setGroupAlertBehavior(Notification.GROUP_ALERT_SUMMARY)
321 .build();
322 StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, "a", 0, 0, n,
323 UserHandle.of(0), null, 0);
324 NotificationData.Entry entry = new NotificationData.Entry(sbn);
325
326 assertTrue(mStatusBar.shouldPeek(entry, sbn));
327 }
328
329 @Test
330 public void testShouldPeek_suppressedGroupSummary() {
331 when(mPowerManager.isScreenOn()).thenReturn(true);
332 when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false);
333 when(mNotificationData.shouldSuppressScreenOn(any())).thenReturn(false);
334 when(mNotificationData.shouldFilterOut(any())).thenReturn(false);
335 when(mSystemServicesProxy.isDreaming()).thenReturn(false);
336 when(mNotificationData.getImportance(any())).thenReturn(IMPORTANCE_HIGH);
337
338 Notification n = new Notification.Builder(getContext(), "a")
339 .setGroup("a")
340 .setGroupSummary(true)
341 .setGroupAlertBehavior(Notification.GROUP_ALERT_CHILDREN)
342 .build();
343 StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, "a", 0, 0, n,
344 UserHandle.of(0), null, 0);
345 NotificationData.Entry entry = new NotificationData.Entry(sbn);
346
347 assertFalse(mStatusBar.shouldPeek(entry, sbn));
348 }
349
Chris Wren621933f2017-06-14 15:59:03 -0400350 @Test
Beverly38159ce2017-07-13 16:39:24 -0400351 public void testShouldPeek_suppressedScreenOn_dozing() {
352 when(mPowerManager.isScreenOn()).thenReturn(true);
353 when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false);
354 when(mNotificationData.shouldFilterOut(any())).thenReturn(false);
355 when(mSystemServicesProxy.isDreaming()).thenReturn(false);
356 when(mNotificationData.getImportance(any())).thenReturn(IMPORTANCE_HIGH);
357
358 mStatusBar.mDozing = true;
359 when(mNotificationData.shouldSuppressScreenOn(any())).thenReturn(true);
360 when(mNotificationData.shouldSuppressScreenOff(any())).thenReturn(false);
361
362 Notification n = new Notification.Builder(getContext(), "a").build();
363 StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, "a", 0, 0, n,
364 UserHandle.of(0), null, 0);
365 NotificationData.Entry entry = new NotificationData.Entry(sbn);
366
367 assertTrue(mStatusBar.shouldPeek(entry, sbn));
368 }
369
370 @Test
371 public void testShouldPeek_suppressedScreenOn_noDoze() {
372 when(mPowerManager.isScreenOn()).thenReturn(true);
373 when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false);
374 when(mNotificationData.shouldFilterOut(any())).thenReturn(false);
375 when(mSystemServicesProxy.isDreaming()).thenReturn(false);
376 when(mNotificationData.getImportance(any())).thenReturn(IMPORTANCE_HIGH);
377
378 mStatusBar.mDozing = false;
379 when(mNotificationData.shouldSuppressScreenOn(any())).thenReturn(true);
380 when(mNotificationData.shouldSuppressScreenOff(any())).thenReturn(false);
381
382 Notification n = new Notification.Builder(getContext(), "a").build();
383 StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, "a", 0, 0, n,
384 UserHandle.of(0), null, 0);
385 NotificationData.Entry entry = new NotificationData.Entry(sbn);
386 assertFalse(mStatusBar.shouldPeek(entry, sbn));
387 }
388 @Test
389 public void testShouldPeek_suppressedScreenOff_dozing() {
390 when(mPowerManager.isScreenOn()).thenReturn(true);
391 when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false);
392 when(mNotificationData.shouldFilterOut(any())).thenReturn(false);
393 when(mSystemServicesProxy.isDreaming()).thenReturn(false);
394 when(mNotificationData.getImportance(any())).thenReturn(IMPORTANCE_HIGH);
395
396 mStatusBar.mDozing = true;
397 when(mNotificationData.shouldSuppressScreenOn(any())).thenReturn(false);
398 when(mNotificationData.shouldSuppressScreenOff(any())).thenReturn(true);
399
400 Notification n = new Notification.Builder(getContext(), "a").build();
401 StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, "a", 0, 0, n,
402 UserHandle.of(0), null, 0);
403 NotificationData.Entry entry = new NotificationData.Entry(sbn);
404 assertFalse(mStatusBar.shouldPeek(entry, sbn));
405 }
406
407 @Test
408 public void testShouldPeek_suppressedScreenOff_noDoze() {
409 when(mPowerManager.isScreenOn()).thenReturn(true);
410 when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false);
411 when(mNotificationData.shouldFilterOut(any())).thenReturn(false);
412 when(mSystemServicesProxy.isDreaming()).thenReturn(false);
413 when(mNotificationData.getImportance(any())).thenReturn(IMPORTANCE_HIGH);
414
415 mStatusBar.mDozing = false;
416 when(mNotificationData.shouldSuppressScreenOn(any())).thenReturn(false);
417 when(mNotificationData.shouldSuppressScreenOff(any())).thenReturn(true);
418
419 Notification n = new Notification.Builder(getContext(), "a").build();
420 StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, "a", 0, 0, n,
421 UserHandle.of(0), null, 0);
422 NotificationData.Entry entry = new NotificationData.Entry(sbn);
423 assertTrue(mStatusBar.shouldPeek(entry, sbn));
424 }
425
426
427 @Test
Chris Wren621933f2017-06-14 15:59:03 -0400428 public void testLogHidden() {
429 try {
430 mStatusBar.handleVisibleToUserChanged(false);
431 verify(mBarService, times(1)).onPanelHidden();
432 verify(mBarService, never()).onPanelRevealed(anyBoolean(), anyInt());
433 } catch (RemoteException e) {
434 fail();
435 }
436 }
437
438 @Test
439 public void testPanelOpenForPeek() {
440 when(mHeadsUpManager.hasPinnedHeadsUp()).thenReturn(true);
441 when(mNotificationData.getActiveNotifications()).thenReturn(mNotificationList);
442 when(mNotificationList.size()).thenReturn(5);
443 when(mNotificationPanelView.isFullyCollapsed()).thenReturn(true);
444 mStatusBar.setBarStateForTest(StatusBarState.SHADE);
445
446 try {
447 mStatusBar.handleVisibleToUserChanged(true);
448
449 verify(mBarService, never()).onPanelHidden();
450 verify(mBarService, times(1)).onPanelRevealed(false, 1);
451 } catch (RemoteException e) {
452 fail();
453 }
454 TestableLooper.get(this).processAllMessages();
455 }
456
457 @Test
458 public void testPanelOpenAndClear() {
459 when(mHeadsUpManager.hasPinnedHeadsUp()).thenReturn(false);
460 when(mNotificationData.getActiveNotifications()).thenReturn(mNotificationList);
461 when(mNotificationList.size()).thenReturn(5);
462 when(mNotificationPanelView.isFullyCollapsed()).thenReturn(false);
463 mStatusBar.setBarStateForTest(StatusBarState.SHADE);
464
465 try {
466 mStatusBar.handleVisibleToUserChanged(true);
467
468 verify(mBarService, never()).onPanelHidden();
469 verify(mBarService, times(1)).onPanelRevealed(true, 5);
470 } catch (RemoteException e) {
471 fail();
472 }
473 TestableLooper.get(this).processAllMessages();
474 }
475
476 @Test
477 public void testPanelOpenAndNoClear() {
478 when(mHeadsUpManager.hasPinnedHeadsUp()).thenReturn(false);
479 when(mNotificationData.getActiveNotifications()).thenReturn(mNotificationList);
480 when(mNotificationList.size()).thenReturn(5);
481 when(mNotificationPanelView.isFullyCollapsed()).thenReturn(false);
482 mStatusBar.setBarStateForTest(StatusBarState.KEYGUARD);
483
484 try {
485 mStatusBar.handleVisibleToUserChanged(true);
486
487 verify(mBarService, never()).onPanelHidden();
488 verify(mBarService, times(1)).onPanelRevealed(false, 5);
489 } catch (RemoteException e) {
490 fail();
491 }
492 TestableLooper.get(this).processAllMessages();
493 }
494
Jason Monk51305372017-06-22 11:41:08 -0400495 @Test
Charles He2eda2422017-09-24 17:55:21 +0100496 public void testDisableExpandStatusBar() {
497 mStatusBar.setBarStateForTest(StatusBarState.SHADE);
498 mStatusBar.setUserSetupForTest(true);
499 when(mStatusBar.isDeviceProvisioned()).thenReturn(true);
500
501 mStatusBar.disable(StatusBarManager.DISABLE_NONE,
502 StatusBarManager.DISABLE2_NOTIFICATION_SHADE, false);
503 verify(mNotificationPanelView).setQsExpansionEnabled(false);
504 mStatusBar.animateExpandNotificationsPanel();
505 verify(mNotificationPanelView, never()).expand(anyBoolean());
506 mStatusBar.animateExpandSettingsPanel(null);
507 verify(mNotificationPanelView, never()).expand(anyBoolean());
508
509 mStatusBar.disable(StatusBarManager.DISABLE_NONE, StatusBarManager.DISABLE2_NONE, false);
510 verify(mNotificationPanelView).setQsExpansionEnabled(true);
511 mStatusBar.animateExpandNotificationsPanel();
512 verify(mNotificationPanelView).expand(anyBoolean());
513 mStatusBar.animateExpandSettingsPanel(null);
514 verify(mNotificationPanelView).expand(anyBoolean());
515 }
516
517 @Test
Jason Monk51305372017-06-22 11:41:08 -0400518 public void testDump_DoesNotCrash() {
519 mStatusBar.dump(null, new PrintWriter(new ByteArrayOutputStream()), null);
520 }
521
Jason Monk9c4faa82017-08-15 09:32:27 -0400522 @Test
523 @RunWithLooper(setAsMainLooper = true)
524 public void testUpdateKeyguardState_DoesNotCrash() {
525 mStatusBar.mStatusBarWindow = mock(StatusBarWindowView.class);
526 mStatusBar.mState = StatusBarState.KEYGUARD;
527 mStatusBar.mDozeScrimController = mock(DozeScrimController.class);
528 mStatusBar.mNotificationIconAreaController = mock(NotificationIconAreaController.class);
Eliot Courtney09322282017-11-09 15:31:19 +0900529 mStatusBar.mLockscreenUserManager = mock(NotificationLockscreenUserManager.class);
530 when(mStatusBar.mLockscreenUserManager.getCurrentProfiles()).thenReturn(
531 new SparseArray<>());
Jason Monk9c4faa82017-08-15 09:32:27 -0400532 mStatusBar.updateKeyguardState(false, false);
533 }
534
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500535 static class TestableStatusBar extends StatusBar {
Chris Wren27a52fa2017-02-01 14:21:43 -0500536 public TestableStatusBar(StatusBarKeyguardViewManager man,
537 UnlockMethodCache unlock, KeyguardIndicationController key,
Julia Reynolds30203152017-05-26 13:36:31 -0400538 NotificationStackScrollLayout stack, HeadsUpManager hum, NotificationData nd,
Chris Wren621933f2017-06-14 15:59:03 -0400539 PowerManager pm, SystemServicesProxy ssp, NotificationPanelView panelView,
540 IStatusBarService barService) {
Adrian Roosef7a4022017-01-19 14:48:35 -0800541 mStatusBarKeyguardViewManager = man;
Chris Wren27a52fa2017-02-01 14:21:43 -0500542 mUnlockMethodCache = unlock;
543 mKeyguardIndicationController = key;
544 mStackScroller = stack;
Julia Reynolds30203152017-05-26 13:36:31 -0400545 mHeadsUpManager = hum;
546 mNotificationData = nd;
547 mUseHeadsUp = true;
548 mPowerManager = pm;
549 mSystemServicesProxy = ssp;
Jorim Jaggifd3b1a12017-06-06 17:04:19 -0700550 mNotificationPanel = panelView;
Chris Wren621933f2017-06-14 15:59:03 -0400551 mBarService = barService;
Adrian Roos6d5ebb72017-08-03 15:10:22 +0200552 mWakefulnessLifecycle = createAwakeWakefulnessLifecycle();
Jason Monk9c4faa82017-08-15 09:32:27 -0400553 mScrimController = mock(ScrimController.class);
Adrian Roos6d5ebb72017-08-03 15:10:22 +0200554 }
555
556 private WakefulnessLifecycle createAwakeWakefulnessLifecycle() {
557 WakefulnessLifecycle wakefulnessLifecycle = new WakefulnessLifecycle();
558 wakefulnessLifecycle.dispatchStartedWakingUp();
559 wakefulnessLifecycle.dispatchFinishedWakingUp();
560 return wakefulnessLifecycle;
Adrian Roosef7a4022017-01-19 14:48:35 -0800561 }
562
Jason Monk9c4faa82017-08-15 09:32:27 -0400563 @Override
564 protected void updateTheme() {
565 // Do nothing for now, until we have more mocking and StatusBar is smaller.
566 }
567
Chris Wren621933f2017-06-14 15:59:03 -0400568 public void setBarStateForTest(int state) {
569 mState = state;
Adrian Roosef7a4022017-01-19 14:48:35 -0800570 }
Charles He2eda2422017-09-24 17:55:21 +0100571
572 public void setUserSetupForTest(boolean userSetup) {
573 mUserSetup = userSetup;
574 }
Adrian Roosef7a4022017-01-19 14:48:35 -0800575 }
Eliot Courtney09322282017-11-09 15:31:19 +0900576}