blob: e4c33f11221b0b157d87a51a305d436ddd18f717 [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;
Lucas Dupin311eac82017-12-11 14:40:07 -080029import static org.mockito.ArgumentMatchers.eq;
Adrian Roosef7a4022017-01-19 14:48:35 -080030import static org.mockito.Mockito.doAnswer;
31import static org.mockito.Mockito.mock;
Chris Wren621933f2017-06-14 15:59:03 -040032import static org.mockito.Mockito.never;
33import static org.mockito.Mockito.times;
Chris Wren621933f2017-06-14 15:59:03 -040034import static org.mockito.Mockito.verify;
Jason Monk9c4faa82017-08-15 09:32:27 -040035import static org.mockito.Mockito.when;
Adrian Roosef7a4022017-01-19 14:48:35 -080036
Julia Reynolds30203152017-05-26 13:36:31 -040037import android.app.Notification;
Charles He2eda2422017-09-24 17:55:21 +010038import android.app.StatusBarManager;
Jason Monk51305372017-06-22 11:41:08 -040039import android.app.trust.TrustManager;
40import android.hardware.fingerprint.FingerprintManager;
Chris Wren27a52fa2017-02-01 14:21:43 -050041import android.metrics.LogMaker;
Jason Monk9c4faa82017-08-15 09:32:27 -040042import android.os.Binder;
Julia Reynolds30203152017-05-26 13:36:31 -040043import android.os.Handler;
44import android.os.HandlerThread;
45import android.os.IPowerManager;
Chris Wren621933f2017-06-14 15:59:03 -040046import android.os.Message;
Julia Reynolds30203152017-05-26 13:36:31 -040047import android.os.PowerManager;
Chris Wren621933f2017-06-14 15:59:03 -040048import android.os.RemoteException;
Julia Reynolds30203152017-05-26 13:36:31 -040049import android.os.UserHandle;
50import android.service.notification.StatusBarNotification;
Adrian Roosef7a4022017-01-19 14:48:35 -080051import android.support.test.filters.SmallTest;
Chris Wren27a52fa2017-02-01 14:21:43 -050052import android.support.test.metricshelper.MetricsAsserts;
Chris Wren621933f2017-06-14 15:59:03 -040053import android.testing.AndroidTestingRunner;
54import android.testing.TestableLooper;
55import android.testing.TestableLooper.MessageHandler;
56import android.testing.TestableLooper.RunWithLooper;
Chris Wren27a52fa2017-02-01 14:21:43 -050057import android.util.DisplayMetrics;
Eliot Courtney09322282017-11-09 15:31:19 +090058import android.util.SparseArray;
Jason Monk51305372017-06-22 11:41:08 -040059import android.view.ViewGroup.LayoutParams;
Adrian Roosef7a4022017-01-19 14:48:35 -080060
Chris Wrenef319902017-03-07 17:58:31 -050061import com.android.internal.logging.MetricsLogger;
Chris Wren27a52fa2017-02-01 14:21:43 -050062import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
Chris Wrenef319902017-03-07 17:58:31 -050063import com.android.internal.logging.testing.FakeMetricsLogger;
Chris Wren621933f2017-06-14 15:59:03 -040064import com.android.internal.statusbar.IStatusBarService;
Adrian Roosef7a4022017-01-19 14:48:35 -080065import com.android.keyguard.KeyguardHostView.OnDismissAction;
Jason Monk9c4faa82017-08-15 09:32:27 -040066import com.android.systemui.R;
Adrian Roosef7a4022017-01-19 14:48:35 -080067import com.android.systemui.SysuiTestCase;
Jason Monk9c4faa82017-08-15 09:32:27 -040068import com.android.systemui.assist.AssistManager;
Adrian Roos6d5ebb72017-08-03 15:10:22 +020069import com.android.systemui.keyguard.WakefulnessLifecycle;
Julia Reynolds30203152017-05-26 13:36:31 -040070import com.android.systemui.recents.misc.SystemServicesProxy;
Chris Wren27a52fa2017-02-01 14:21:43 -050071import com.android.systemui.statusbar.ActivatableNotificationView;
Jason Monk5ecf80c2017-07-06 15:28:17 -040072import com.android.systemui.statusbar.CommandQueue;
Chris Wren27a52fa2017-02-01 14:21:43 -050073import com.android.systemui.statusbar.KeyguardIndicationController;
74import com.android.systemui.statusbar.NotificationData;
Chris Wren621933f2017-06-14 15:59:03 -040075import com.android.systemui.statusbar.NotificationData.Entry;
Eliot Courtney09322282017-11-09 15:31:19 +090076import com.android.systemui.statusbar.NotificationLockscreenUserManager;
Chris Wren621933f2017-06-14 15:59:03 -040077import com.android.systemui.statusbar.StatusBarState;
Jason Monk9c4faa82017-08-15 09:32:27 -040078import com.android.systemui.statusbar.policy.DeviceProvisionedController;
Julia Reynolds30203152017-05-26 13:36:31 -040079import com.android.systemui.statusbar.policy.HeadsUpManager;
Jason Monk9c4faa82017-08-15 09:32:27 -040080import com.android.systemui.statusbar.policy.KeyguardMonitor;
81import com.android.systemui.statusbar.policy.KeyguardMonitorImpl;
Chris Wren27a52fa2017-02-01 14:21:43 -050082import com.android.systemui.statusbar.stack.NotificationStackScrollLayout;
Adrian Roosef7a4022017-01-19 14:48:35 -080083
84import org.junit.Before;
85import org.junit.Test;
86import org.junit.runner.RunWith;
87
Jason Monk51305372017-06-22 11:41:08 -040088import java.io.ByteArrayOutputStream;
89import java.io.PrintWriter;
Chris Wren621933f2017-06-14 15:59:03 -040090import java.util.ArrayList;
91
Adrian Roos02de4982017-02-11 09:35:54 +010092@SmallTest
Chris Wren621933f2017-06-14 15:59:03 -040093@RunWith(AndroidTestingRunner.class)
94@RunWithLooper
Jason Monk2a6ea9c2017-01-26 11:14:51 -050095public class StatusBarTest extends SysuiTestCase {
Adrian Roosef7a4022017-01-19 14:48:35 -080096
97 StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
Chris Wren27a52fa2017-02-01 14:21:43 -050098 UnlockMethodCache mUnlockMethodCache;
99 KeyguardIndicationController mKeyguardIndicationController;
100 NotificationStackScrollLayout mStackScroller;
Chris Wren621933f2017-06-14 15:59:03 -0400101 TestableStatusBar mStatusBar;
Chris Wrenef319902017-03-07 17:58:31 -0500102 FakeMetricsLogger mMetricsLogger;
Julia Reynolds30203152017-05-26 13:36:31 -0400103 HeadsUpManager mHeadsUpManager;
104 NotificationData mNotificationData;
105 PowerManager mPowerManager;
106 SystemServicesProxy mSystemServicesProxy;
Jorim Jaggifd3b1a12017-06-06 17:04:19 -0700107 NotificationPanelView mNotificationPanelView;
Lucas Dupinc2e75462017-12-06 13:59:25 -0800108 ScrimController mScrimController;
Chris Wren621933f2017-06-14 15:59:03 -0400109 IStatusBarService mBarService;
110 ArrayList<Entry> mNotificationList;
Lucas Dupin311eac82017-12-11 14:40:07 -0800111 FingerprintUnlockController mFingerprintUnlockController;
Chris Wren27a52fa2017-02-01 14:21:43 -0500112 private DisplayMetrics mDisplayMetrics = new DisplayMetrics();
113
Adrian Roos02de4982017-02-11 09:35:54 +0100114 @Before
Julia Reynolds30203152017-05-26 13:36:31 -0400115 public void setup() throws Exception {
Jason Monk9c4faa82017-08-15 09:32:27 -0400116 mContext.setTheme(R.style.Theme_SystemUI_Light);
117 mDependency.injectMockDependency(AssistManager.class);
118 mDependency.injectMockDependency(DeviceProvisionedController.class);
119 mDependency.injectTestDependency(KeyguardMonitor.class, mock(KeyguardMonitorImpl.class));
120 CommandQueue commandQueue = mock(CommandQueue.class);
121 when(commandQueue.asBinder()).thenReturn(new Binder());
122 mContext.putComponent(CommandQueue.class, commandQueue);
Jason Monk51305372017-06-22 11:41:08 -0400123 mContext.addMockSystemService(TrustManager.class, mock(TrustManager.class));
124 mContext.addMockSystemService(FingerprintManager.class, mock(FingerprintManager.class));
Adrian Roosef7a4022017-01-19 14:48:35 -0800125 mStatusBarKeyguardViewManager = mock(StatusBarKeyguardViewManager.class);
Chris Wren27a52fa2017-02-01 14:21:43 -0500126 mUnlockMethodCache = mock(UnlockMethodCache.class);
127 mKeyguardIndicationController = mock(KeyguardIndicationController.class);
128 mStackScroller = mock(NotificationStackScrollLayout.class);
Jason Monk9c4faa82017-08-15 09:32:27 -0400129 when(mStackScroller.generateLayoutParams(any())).thenReturn(new LayoutParams(0, 0));
Chris Wrenef319902017-03-07 17:58:31 -0500130 mMetricsLogger = new FakeMetricsLogger();
Julia Reynolds30203152017-05-26 13:36:31 -0400131 mHeadsUpManager = mock(HeadsUpManager.class);
132 mNotificationData = mock(NotificationData.class);
133 mSystemServicesProxy = mock(SystemServicesProxy.class);
Jorim Jaggifd3b1a12017-06-06 17:04:19 -0700134 mNotificationPanelView = mock(NotificationPanelView.class);
Jason Monk51305372017-06-22 11:41:08 -0400135 when(mNotificationPanelView.getLayoutParams()).thenReturn(new LayoutParams(0, 0));
Chris Wren621933f2017-06-14 15:59:03 -0400136 mNotificationList = mock(ArrayList.class);
Lucas Dupinc2e75462017-12-06 13:59:25 -0800137 mScrimController = mock(ScrimController.class);
Lucas Dupin311eac82017-12-11 14:40:07 -0800138 mFingerprintUnlockController = mock(FingerprintUnlockController.class);
Julia Reynolds30203152017-05-26 13:36:31 -0400139 IPowerManager powerManagerService = mock(IPowerManager.class);
140 HandlerThread handlerThread = new HandlerThread("TestThread");
141 handlerThread.start();
142 mPowerManager = new PowerManager(mContext, powerManagerService,
143 new Handler(handlerThread.getLooper()));
144 when(powerManagerService.isInteractive()).thenReturn(true);
Chris Wren621933f2017-06-14 15:59:03 -0400145 mBarService = mock(IStatusBarService.class);
Julia Reynolds30203152017-05-26 13:36:31 -0400146
Jason Monk8c09ac72017-03-16 11:53:40 -0400147 mDependency.injectTestDependency(MetricsLogger.class, mMetricsLogger);
Chris Wren27a52fa2017-02-01 14:21:43 -0500148 mStatusBar = new TestableStatusBar(mStatusBarKeyguardViewManager, mUnlockMethodCache,
Julia Reynolds30203152017-05-26 13:36:31 -0400149 mKeyguardIndicationController, mStackScroller, mHeadsUpManager,
Chris Wren621933f2017-06-14 15:59:03 -0400150 mNotificationData, mPowerManager, mSystemServicesProxy, mNotificationPanelView,
Lucas Dupin311eac82017-12-11 14:40:07 -0800151 mBarService, mScrimController, mFingerprintUnlockController);
Jason Monk51305372017-06-22 11:41:08 -0400152 mStatusBar.mContext = mContext;
Jason Monk9c4faa82017-08-15 09:32:27 -0400153 mStatusBar.mComponents = mContext.getComponents();
Adrian Roosef7a4022017-01-19 14:48:35 -0800154 doAnswer(invocation -> {
155 OnDismissAction onDismissAction = (OnDismissAction) invocation.getArguments()[0];
156 onDismissAction.onDismiss();
157 return null;
158 }).when(mStatusBarKeyguardViewManager).dismissWithAction(any(), any(), anyBoolean());
159
160 doAnswer(invocation -> {
161 Runnable runnable = (Runnable) invocation.getArguments()[0];
162 runnable.run();
163 return null;
164 }).when(mStatusBarKeyguardViewManager).addAfterKeyguardGoneRunnable(any());
Chris Wren27a52fa2017-02-01 14:21:43 -0500165
166 when(mStackScroller.getActivatedChild()).thenReturn(null);
Chris Wren621933f2017-06-14 15:59:03 -0400167 TestableLooper.get(this).setMessageHandler(new MessageHandler() {
168 @Override
169 public boolean onMessageHandled(Message m) {
170 if (m.getCallback() == mStatusBar.mVisibilityReporter) {
171 return false;
172 }
173 return true;
174 }
175 });
Adrian Roosef7a4022017-01-19 14:48:35 -0800176 }
177
Adrian Roos02de4982017-02-11 09:35:54 +0100178 @Test
Jason Monk5ecf80c2017-07-06 15:28:17 -0400179 public void testSetBouncerShowing_noCrash() {
180 mStatusBar.mCommandQueue = mock(CommandQueue.class);
181 mStatusBar.setBouncerShowing(true);
182 }
183
184 @Test
Adrian Roosef7a4022017-01-19 14:48:35 -0800185 public void executeRunnableDismissingKeyguard_nullRunnable_showingAndOccluded() {
186 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
187 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(true);
188
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500189 mStatusBar.executeRunnableDismissingKeyguard(null, null, false, false, false);
Adrian Roosef7a4022017-01-19 14:48:35 -0800190 }
191
Adrian Roos02de4982017-02-11 09:35:54 +0100192 @Test
Adrian Roosef7a4022017-01-19 14:48:35 -0800193 public void executeRunnableDismissingKeyguard_nullRunnable_showing() {
194 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
195 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
196
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500197 mStatusBar.executeRunnableDismissingKeyguard(null, null, false, false, false);
Adrian Roosef7a4022017-01-19 14:48:35 -0800198 }
199
Adrian Roos02de4982017-02-11 09:35:54 +0100200 @Test
Adrian Roosef7a4022017-01-19 14:48:35 -0800201 public void executeRunnableDismissingKeyguard_nullRunnable_notShowing() {
202 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(false);
203 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
204
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500205 mStatusBar.executeRunnableDismissingKeyguard(null, null, false, false, false);
Adrian Roosef7a4022017-01-19 14:48:35 -0800206 }
207
Adrian Roos02de4982017-02-11 09:35:54 +0100208 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500209 public void lockscreenStateMetrics_notShowing() {
210 // uninteresting state, except that fingerprint must be non-zero
211 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
212 when(mUnlockMethodCache.canSkipBouncer()).thenReturn(true);
213 // interesting state
214 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(false);
215 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false);
216 when(mUnlockMethodCache.isMethodSecure()).thenReturn(false);
Chris Wren27a52fa2017-02-01 14:21:43 -0500217 mStatusBar.onKeyguardViewManagerStatesUpdated();
218
Chris Wrenef319902017-03-07 17:58:31 -0500219 MetricsAsserts.assertHasLog("missing hidden insecure lockscreen log",
220 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500221 new LogMaker(MetricsEvent.LOCKSCREEN)
222 .setType(MetricsEvent.TYPE_CLOSE)
223 .setSubtype(0));
224 }
225
Adrian Roos02de4982017-02-11 09:35:54 +0100226 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500227 public void lockscreenStateMetrics_notShowing_secure() {
228 // uninteresting state, except that fingerprint must be non-zero
229 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
230 when(mUnlockMethodCache.canSkipBouncer()).thenReturn(true);
231 // interesting state
232 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(false);
233 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false);
234 when(mUnlockMethodCache.isMethodSecure()).thenReturn(true);
235
236 mStatusBar.onKeyguardViewManagerStatesUpdated();
237
Chris Wrenef319902017-03-07 17:58:31 -0500238 MetricsAsserts.assertHasLog("missing hidden secure lockscreen log",
239 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500240 new LogMaker(MetricsEvent.LOCKSCREEN)
241 .setType(MetricsEvent.TYPE_CLOSE)
242 .setSubtype(1));
243 }
244
Adrian Roos02de4982017-02-11 09:35:54 +0100245 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500246 public void lockscreenStateMetrics_isShowing() {
247 // uninteresting state, except that fingerprint must be non-zero
248 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
249 when(mUnlockMethodCache.canSkipBouncer()).thenReturn(true);
250 // interesting state
251 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
252 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false);
253 when(mUnlockMethodCache.isMethodSecure()).thenReturn(false);
254
255 mStatusBar.onKeyguardViewManagerStatesUpdated();
256
Chris Wrenef319902017-03-07 17:58:31 -0500257 MetricsAsserts.assertHasLog("missing insecure lockscreen showing",
258 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500259 new LogMaker(MetricsEvent.LOCKSCREEN)
260 .setType(MetricsEvent.TYPE_OPEN)
261 .setSubtype(0));
262 }
263
Adrian Roos02de4982017-02-11 09:35:54 +0100264 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500265 public void lockscreenStateMetrics_isShowing_secure() {
266 // uninteresting state, except that fingerprint must be non-zero
267 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
268 when(mUnlockMethodCache.canSkipBouncer()).thenReturn(true);
269 // interesting state
270 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
271 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false);
272 when(mUnlockMethodCache.isMethodSecure()).thenReturn(true);
273
274 mStatusBar.onKeyguardViewManagerStatesUpdated();
275
Chris Wrenef319902017-03-07 17:58:31 -0500276 MetricsAsserts.assertHasLog("missing secure lockscreen showing log",
277 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500278 new LogMaker(MetricsEvent.LOCKSCREEN)
279 .setType(MetricsEvent.TYPE_OPEN)
280 .setSubtype(1));
281 }
282
Adrian Roos02de4982017-02-11 09:35:54 +0100283 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500284 public void lockscreenStateMetrics_isShowingBouncer() {
285 // uninteresting state, except that fingerprint must be non-zero
286 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
287 when(mUnlockMethodCache.canSkipBouncer()).thenReturn(true);
288 // interesting state
289 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
290 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(true);
291 when(mUnlockMethodCache.isMethodSecure()).thenReturn(true);
292
293 mStatusBar.onKeyguardViewManagerStatesUpdated();
294
Chris Wrenef319902017-03-07 17:58:31 -0500295 MetricsAsserts.assertHasLog("missing bouncer log",
296 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500297 new LogMaker(MetricsEvent.BOUNCER)
298 .setType(MetricsEvent.TYPE_OPEN)
299 .setSubtype(1));
300 }
301
Adrian Roos02de4982017-02-11 09:35:54 +0100302 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500303 public void onActivatedMetrics() {
304 ActivatableNotificationView view = mock(ActivatableNotificationView.class);
305 mStatusBar.onActivated(view);
306
Chris Wrenef319902017-03-07 17:58:31 -0500307 MetricsAsserts.assertHasLog("missing lockscreen note tap log",
308 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500309 new LogMaker(MetricsEvent.ACTION_LS_NOTE)
310 .setType(MetricsEvent.TYPE_ACTION));
311 }
312
Julia Reynolds30203152017-05-26 13:36:31 -0400313 @Test
314 public void testShouldPeek_nonSuppressedGroupSummary() {
315 when(mPowerManager.isScreenOn()).thenReturn(true);
316 when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false);
317 when(mNotificationData.shouldSuppressScreenOn(any())).thenReturn(false);
318 when(mNotificationData.shouldFilterOut(any())).thenReturn(false);
319 when(mSystemServicesProxy.isDreaming()).thenReturn(false);
320 when(mNotificationData.getImportance(any())).thenReturn(IMPORTANCE_HIGH);
321
322 Notification n = new Notification.Builder(getContext(), "a")
323 .setGroup("a")
324 .setGroupSummary(true)
325 .setGroupAlertBehavior(Notification.GROUP_ALERT_SUMMARY)
326 .build();
327 StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, "a", 0, 0, n,
328 UserHandle.of(0), null, 0);
329 NotificationData.Entry entry = new NotificationData.Entry(sbn);
330
331 assertTrue(mStatusBar.shouldPeek(entry, sbn));
332 }
333
334 @Test
335 public void testShouldPeek_suppressedGroupSummary() {
336 when(mPowerManager.isScreenOn()).thenReturn(true);
337 when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false);
338 when(mNotificationData.shouldSuppressScreenOn(any())).thenReturn(false);
339 when(mNotificationData.shouldFilterOut(any())).thenReturn(false);
340 when(mSystemServicesProxy.isDreaming()).thenReturn(false);
341 when(mNotificationData.getImportance(any())).thenReturn(IMPORTANCE_HIGH);
342
343 Notification n = new Notification.Builder(getContext(), "a")
344 .setGroup("a")
345 .setGroupSummary(true)
346 .setGroupAlertBehavior(Notification.GROUP_ALERT_CHILDREN)
347 .build();
348 StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, "a", 0, 0, n,
349 UserHandle.of(0), null, 0);
350 NotificationData.Entry entry = new NotificationData.Entry(sbn);
351
352 assertFalse(mStatusBar.shouldPeek(entry, sbn));
353 }
354
Chris Wren621933f2017-06-14 15:59:03 -0400355 @Test
Beverly38159ce2017-07-13 16:39:24 -0400356 public void testShouldPeek_suppressedScreenOn_dozing() {
357 when(mPowerManager.isScreenOn()).thenReturn(true);
358 when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false);
359 when(mNotificationData.shouldFilterOut(any())).thenReturn(false);
360 when(mSystemServicesProxy.isDreaming()).thenReturn(false);
361 when(mNotificationData.getImportance(any())).thenReturn(IMPORTANCE_HIGH);
362
363 mStatusBar.mDozing = true;
364 when(mNotificationData.shouldSuppressScreenOn(any())).thenReturn(true);
365 when(mNotificationData.shouldSuppressScreenOff(any())).thenReturn(false);
366
367 Notification n = new Notification.Builder(getContext(), "a").build();
368 StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, "a", 0, 0, n,
369 UserHandle.of(0), null, 0);
370 NotificationData.Entry entry = new NotificationData.Entry(sbn);
371
372 assertTrue(mStatusBar.shouldPeek(entry, sbn));
373 }
374
375 @Test
376 public void testShouldPeek_suppressedScreenOn_noDoze() {
377 when(mPowerManager.isScreenOn()).thenReturn(true);
378 when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false);
379 when(mNotificationData.shouldFilterOut(any())).thenReturn(false);
380 when(mSystemServicesProxy.isDreaming()).thenReturn(false);
381 when(mNotificationData.getImportance(any())).thenReturn(IMPORTANCE_HIGH);
382
383 mStatusBar.mDozing = false;
384 when(mNotificationData.shouldSuppressScreenOn(any())).thenReturn(true);
385 when(mNotificationData.shouldSuppressScreenOff(any())).thenReturn(false);
386
387 Notification n = new Notification.Builder(getContext(), "a").build();
388 StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, "a", 0, 0, n,
389 UserHandle.of(0), null, 0);
390 NotificationData.Entry entry = new NotificationData.Entry(sbn);
391 assertFalse(mStatusBar.shouldPeek(entry, sbn));
392 }
393 @Test
394 public void testShouldPeek_suppressedScreenOff_dozing() {
395 when(mPowerManager.isScreenOn()).thenReturn(true);
396 when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false);
397 when(mNotificationData.shouldFilterOut(any())).thenReturn(false);
398 when(mSystemServicesProxy.isDreaming()).thenReturn(false);
399 when(mNotificationData.getImportance(any())).thenReturn(IMPORTANCE_HIGH);
400
401 mStatusBar.mDozing = true;
402 when(mNotificationData.shouldSuppressScreenOn(any())).thenReturn(false);
403 when(mNotificationData.shouldSuppressScreenOff(any())).thenReturn(true);
404
405 Notification n = new Notification.Builder(getContext(), "a").build();
406 StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, "a", 0, 0, n,
407 UserHandle.of(0), null, 0);
408 NotificationData.Entry entry = new NotificationData.Entry(sbn);
409 assertFalse(mStatusBar.shouldPeek(entry, sbn));
410 }
411
412 @Test
413 public void testShouldPeek_suppressedScreenOff_noDoze() {
414 when(mPowerManager.isScreenOn()).thenReturn(true);
415 when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false);
416 when(mNotificationData.shouldFilterOut(any())).thenReturn(false);
417 when(mSystemServicesProxy.isDreaming()).thenReturn(false);
418 when(mNotificationData.getImportance(any())).thenReturn(IMPORTANCE_HIGH);
419
420 mStatusBar.mDozing = false;
421 when(mNotificationData.shouldSuppressScreenOn(any())).thenReturn(false);
422 when(mNotificationData.shouldSuppressScreenOff(any())).thenReturn(true);
423
424 Notification n = new Notification.Builder(getContext(), "a").build();
425 StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, "a", 0, 0, n,
426 UserHandle.of(0), null, 0);
427 NotificationData.Entry entry = new NotificationData.Entry(sbn);
428 assertTrue(mStatusBar.shouldPeek(entry, sbn));
429 }
430
431
432 @Test
Chris Wren621933f2017-06-14 15:59:03 -0400433 public void testLogHidden() {
434 try {
435 mStatusBar.handleVisibleToUserChanged(false);
Selim Cinek1a891a92017-12-04 17:41:27 +0100436 waitForUiOffloadThread();
Chris Wren621933f2017-06-14 15:59:03 -0400437 verify(mBarService, times(1)).onPanelHidden();
438 verify(mBarService, never()).onPanelRevealed(anyBoolean(), anyInt());
439 } catch (RemoteException e) {
440 fail();
441 }
442 }
443
444 @Test
445 public void testPanelOpenForPeek() {
446 when(mHeadsUpManager.hasPinnedHeadsUp()).thenReturn(true);
447 when(mNotificationData.getActiveNotifications()).thenReturn(mNotificationList);
448 when(mNotificationList.size()).thenReturn(5);
449 when(mNotificationPanelView.isFullyCollapsed()).thenReturn(true);
450 mStatusBar.setBarStateForTest(StatusBarState.SHADE);
451
452 try {
453 mStatusBar.handleVisibleToUserChanged(true);
Selim Cinek1a891a92017-12-04 17:41:27 +0100454 waitForUiOffloadThread();
Chris Wren621933f2017-06-14 15:59:03 -0400455 verify(mBarService, never()).onPanelHidden();
456 verify(mBarService, times(1)).onPanelRevealed(false, 1);
457 } catch (RemoteException e) {
458 fail();
459 }
460 TestableLooper.get(this).processAllMessages();
461 }
462
463 @Test
464 public void testPanelOpenAndClear() {
465 when(mHeadsUpManager.hasPinnedHeadsUp()).thenReturn(false);
466 when(mNotificationData.getActiveNotifications()).thenReturn(mNotificationList);
467 when(mNotificationList.size()).thenReturn(5);
468 when(mNotificationPanelView.isFullyCollapsed()).thenReturn(false);
469 mStatusBar.setBarStateForTest(StatusBarState.SHADE);
470
471 try {
472 mStatusBar.handleVisibleToUserChanged(true);
Selim Cinek1a891a92017-12-04 17:41:27 +0100473 waitForUiOffloadThread();
Chris Wren621933f2017-06-14 15:59:03 -0400474 verify(mBarService, never()).onPanelHidden();
475 verify(mBarService, times(1)).onPanelRevealed(true, 5);
476 } catch (RemoteException e) {
477 fail();
478 }
479 TestableLooper.get(this).processAllMessages();
480 }
481
482 @Test
483 public void testPanelOpenAndNoClear() {
484 when(mHeadsUpManager.hasPinnedHeadsUp()).thenReturn(false);
485 when(mNotificationData.getActiveNotifications()).thenReturn(mNotificationList);
486 when(mNotificationList.size()).thenReturn(5);
487 when(mNotificationPanelView.isFullyCollapsed()).thenReturn(false);
488 mStatusBar.setBarStateForTest(StatusBarState.KEYGUARD);
489
490 try {
491 mStatusBar.handleVisibleToUserChanged(true);
Selim Cinek1a891a92017-12-04 17:41:27 +0100492 waitForUiOffloadThread();
Chris Wren621933f2017-06-14 15:59:03 -0400493 verify(mBarService, never()).onPanelHidden();
494 verify(mBarService, times(1)).onPanelRevealed(false, 5);
495 } catch (RemoteException e) {
496 fail();
497 }
498 TestableLooper.get(this).processAllMessages();
499 }
500
Jason Monk51305372017-06-22 11:41:08 -0400501 @Test
Charles He2eda2422017-09-24 17:55:21 +0100502 public void testDisableExpandStatusBar() {
503 mStatusBar.setBarStateForTest(StatusBarState.SHADE);
504 mStatusBar.setUserSetupForTest(true);
505 when(mStatusBar.isDeviceProvisioned()).thenReturn(true);
506
507 mStatusBar.disable(StatusBarManager.DISABLE_NONE,
508 StatusBarManager.DISABLE2_NOTIFICATION_SHADE, false);
509 verify(mNotificationPanelView).setQsExpansionEnabled(false);
510 mStatusBar.animateExpandNotificationsPanel();
511 verify(mNotificationPanelView, never()).expand(anyBoolean());
512 mStatusBar.animateExpandSettingsPanel(null);
513 verify(mNotificationPanelView, never()).expand(anyBoolean());
514
515 mStatusBar.disable(StatusBarManager.DISABLE_NONE, StatusBarManager.DISABLE2_NONE, false);
516 verify(mNotificationPanelView).setQsExpansionEnabled(true);
517 mStatusBar.animateExpandNotificationsPanel();
518 verify(mNotificationPanelView).expand(anyBoolean());
519 mStatusBar.animateExpandSettingsPanel(null);
520 verify(mNotificationPanelView).expand(anyBoolean());
521 }
522
523 @Test
Jason Monk51305372017-06-22 11:41:08 -0400524 public void testDump_DoesNotCrash() {
525 mStatusBar.dump(null, new PrintWriter(new ByteArrayOutputStream()), null);
526 }
527
Jason Monk9c4faa82017-08-15 09:32:27 -0400528 @Test
529 @RunWithLooper(setAsMainLooper = true)
530 public void testUpdateKeyguardState_DoesNotCrash() {
531 mStatusBar.mStatusBarWindow = mock(StatusBarWindowView.class);
532 mStatusBar.mState = StatusBarState.KEYGUARD;
533 mStatusBar.mDozeScrimController = mock(DozeScrimController.class);
534 mStatusBar.mNotificationIconAreaController = mock(NotificationIconAreaController.class);
Eliot Courtney09322282017-11-09 15:31:19 +0900535 mStatusBar.mLockscreenUserManager = mock(NotificationLockscreenUserManager.class);
536 when(mStatusBar.mLockscreenUserManager.getCurrentProfiles()).thenReturn(
537 new SparseArray<>());
Jason Monk9c4faa82017-08-15 09:32:27 -0400538 mStatusBar.updateKeyguardState(false, false);
539 }
540
Lucas Dupinc2e75462017-12-06 13:59:25 -0800541 @Test
542 public void testFingerprintNotification_UpdatesScrims() {
543 mStatusBar.mStatusBarWindowManager = mock(StatusBarWindowManager.class);
Lucas Dupinc2e75462017-12-06 13:59:25 -0800544 mStatusBar.mDozeScrimController = mock(DozeScrimController.class);
545 mStatusBar.notifyFpAuthModeChanged();
546 verify(mScrimController).transitionTo(any(), any());
547 }
548
Lucas Dupin311eac82017-12-11 14:40:07 -0800549 @Test
550 public void testFingerprintUnlock_UpdatesScrims() {
551 // Simulate unlocking from AoD with fingerprint.
552 when(mFingerprintUnlockController.getMode())
553 .thenReturn(FingerprintUnlockController.MODE_WAKE_AND_UNLOCK);
554 mStatusBar.updateScrimController();
555 verify(mScrimController).transitionTo(eq(ScrimState.UNLOCKED), any());
556 }
557
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500558 static class TestableStatusBar extends StatusBar {
Chris Wren27a52fa2017-02-01 14:21:43 -0500559 public TestableStatusBar(StatusBarKeyguardViewManager man,
560 UnlockMethodCache unlock, KeyguardIndicationController key,
Julia Reynolds30203152017-05-26 13:36:31 -0400561 NotificationStackScrollLayout stack, HeadsUpManager hum, NotificationData nd,
Chris Wren621933f2017-06-14 15:59:03 -0400562 PowerManager pm, SystemServicesProxy ssp, NotificationPanelView panelView,
Lucas Dupin311eac82017-12-11 14:40:07 -0800563 IStatusBarService barService, ScrimController scrimController,
564 FingerprintUnlockController fingerprintUnlockController) {
Adrian Roosef7a4022017-01-19 14:48:35 -0800565 mStatusBarKeyguardViewManager = man;
Chris Wren27a52fa2017-02-01 14:21:43 -0500566 mUnlockMethodCache = unlock;
567 mKeyguardIndicationController = key;
568 mStackScroller = stack;
Julia Reynolds30203152017-05-26 13:36:31 -0400569 mHeadsUpManager = hum;
570 mNotificationData = nd;
571 mUseHeadsUp = true;
572 mPowerManager = pm;
573 mSystemServicesProxy = ssp;
Jorim Jaggifd3b1a12017-06-06 17:04:19 -0700574 mNotificationPanel = panelView;
Chris Wren621933f2017-06-14 15:59:03 -0400575 mBarService = barService;
Adrian Roos6d5ebb72017-08-03 15:10:22 +0200576 mWakefulnessLifecycle = createAwakeWakefulnessLifecycle();
Lucas Dupinc2e75462017-12-06 13:59:25 -0800577 mScrimController = scrimController;
Lucas Dupin311eac82017-12-11 14:40:07 -0800578 mFingerprintUnlockController = fingerprintUnlockController;
Adrian Roos6d5ebb72017-08-03 15:10:22 +0200579 }
580
581 private WakefulnessLifecycle createAwakeWakefulnessLifecycle() {
582 WakefulnessLifecycle wakefulnessLifecycle = new WakefulnessLifecycle();
583 wakefulnessLifecycle.dispatchStartedWakingUp();
584 wakefulnessLifecycle.dispatchFinishedWakingUp();
585 return wakefulnessLifecycle;
Adrian Roosef7a4022017-01-19 14:48:35 -0800586 }
587
Jason Monk9c4faa82017-08-15 09:32:27 -0400588 @Override
589 protected void updateTheme() {
590 // Do nothing for now, until we have more mocking and StatusBar is smaller.
591 }
592
Chris Wren621933f2017-06-14 15:59:03 -0400593 public void setBarStateForTest(int state) {
594 mState = state;
Adrian Roosef7a4022017-01-19 14:48:35 -0800595 }
Charles He2eda2422017-09-24 17:55:21 +0100596
597 public void setUserSetupForTest(boolean userSetup) {
598 mUserSetup = userSetup;
599 }
Adrian Roosef7a4022017-01-19 14:48:35 -0800600 }
Eliot Courtney09322282017-11-09 15:31:19 +0900601}