blob: 0aeb7b6bf34cba717738271c69dabc6b65843ed3 [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;
Lucas Dupinc2e75462017-12-06 13:59:25 -0800107 ScrimController mScrimController;
Chris Wren621933f2017-06-14 15:59:03 -0400108 IStatusBarService mBarService;
109 ArrayList<Entry> mNotificationList;
Chris Wren27a52fa2017-02-01 14:21:43 -0500110 private DisplayMetrics mDisplayMetrics = new DisplayMetrics();
111
Adrian Roos02de4982017-02-11 09:35:54 +0100112 @Before
Julia Reynolds30203152017-05-26 13:36:31 -0400113 public void setup() throws Exception {
Jason Monk9c4faa82017-08-15 09:32:27 -0400114 mContext.setTheme(R.style.Theme_SystemUI_Light);
115 mDependency.injectMockDependency(AssistManager.class);
116 mDependency.injectMockDependency(DeviceProvisionedController.class);
117 mDependency.injectTestDependency(KeyguardMonitor.class, mock(KeyguardMonitorImpl.class));
118 CommandQueue commandQueue = mock(CommandQueue.class);
119 when(commandQueue.asBinder()).thenReturn(new Binder());
120 mContext.putComponent(CommandQueue.class, commandQueue);
Jason Monk51305372017-06-22 11:41:08 -0400121 mContext.addMockSystemService(TrustManager.class, mock(TrustManager.class));
122 mContext.addMockSystemService(FingerprintManager.class, mock(FingerprintManager.class));
Adrian Roosef7a4022017-01-19 14:48:35 -0800123 mStatusBarKeyguardViewManager = mock(StatusBarKeyguardViewManager.class);
Chris Wren27a52fa2017-02-01 14:21:43 -0500124 mUnlockMethodCache = mock(UnlockMethodCache.class);
125 mKeyguardIndicationController = mock(KeyguardIndicationController.class);
126 mStackScroller = mock(NotificationStackScrollLayout.class);
Jason Monk9c4faa82017-08-15 09:32:27 -0400127 when(mStackScroller.generateLayoutParams(any())).thenReturn(new LayoutParams(0, 0));
Chris Wrenef319902017-03-07 17:58:31 -0500128 mMetricsLogger = new FakeMetricsLogger();
Julia Reynolds30203152017-05-26 13:36:31 -0400129 mHeadsUpManager = mock(HeadsUpManager.class);
130 mNotificationData = mock(NotificationData.class);
131 mSystemServicesProxy = mock(SystemServicesProxy.class);
Jorim Jaggifd3b1a12017-06-06 17:04:19 -0700132 mNotificationPanelView = mock(NotificationPanelView.class);
Jason Monk51305372017-06-22 11:41:08 -0400133 when(mNotificationPanelView.getLayoutParams()).thenReturn(new LayoutParams(0, 0));
Chris Wren621933f2017-06-14 15:59:03 -0400134 mNotificationList = mock(ArrayList.class);
Lucas Dupinc2e75462017-12-06 13:59:25 -0800135 mScrimController = mock(ScrimController.class);
Julia Reynolds30203152017-05-26 13:36:31 -0400136 IPowerManager powerManagerService = mock(IPowerManager.class);
137 HandlerThread handlerThread = new HandlerThread("TestThread");
138 handlerThread.start();
139 mPowerManager = new PowerManager(mContext, powerManagerService,
140 new Handler(handlerThread.getLooper()));
141 when(powerManagerService.isInteractive()).thenReturn(true);
Chris Wren621933f2017-06-14 15:59:03 -0400142 mBarService = mock(IStatusBarService.class);
Julia Reynolds30203152017-05-26 13:36:31 -0400143
Jason Monk8c09ac72017-03-16 11:53:40 -0400144 mDependency.injectTestDependency(MetricsLogger.class, mMetricsLogger);
Chris Wren27a52fa2017-02-01 14:21:43 -0500145 mStatusBar = new TestableStatusBar(mStatusBarKeyguardViewManager, mUnlockMethodCache,
Julia Reynolds30203152017-05-26 13:36:31 -0400146 mKeyguardIndicationController, mStackScroller, mHeadsUpManager,
Chris Wren621933f2017-06-14 15:59:03 -0400147 mNotificationData, mPowerManager, mSystemServicesProxy, mNotificationPanelView,
Lucas Dupinc2e75462017-12-06 13:59:25 -0800148 mBarService, mScrimController);
Jason Monk51305372017-06-22 11:41:08 -0400149 mStatusBar.mContext = mContext;
Jason Monk9c4faa82017-08-15 09:32:27 -0400150 mStatusBar.mComponents = mContext.getComponents();
Adrian Roosef7a4022017-01-19 14:48:35 -0800151 doAnswer(invocation -> {
152 OnDismissAction onDismissAction = (OnDismissAction) invocation.getArguments()[0];
153 onDismissAction.onDismiss();
154 return null;
155 }).when(mStatusBarKeyguardViewManager).dismissWithAction(any(), any(), anyBoolean());
156
157 doAnswer(invocation -> {
158 Runnable runnable = (Runnable) invocation.getArguments()[0];
159 runnable.run();
160 return null;
161 }).when(mStatusBarKeyguardViewManager).addAfterKeyguardGoneRunnable(any());
Chris Wren27a52fa2017-02-01 14:21:43 -0500162
163 when(mStackScroller.getActivatedChild()).thenReturn(null);
Chris Wren621933f2017-06-14 15:59:03 -0400164 TestableLooper.get(this).setMessageHandler(new MessageHandler() {
165 @Override
166 public boolean onMessageHandled(Message m) {
167 if (m.getCallback() == mStatusBar.mVisibilityReporter) {
168 return false;
169 }
170 return true;
171 }
172 });
Adrian Roosef7a4022017-01-19 14:48:35 -0800173 }
174
Adrian Roos02de4982017-02-11 09:35:54 +0100175 @Test
Jason Monk5ecf80c2017-07-06 15:28:17 -0400176 public void testSetBouncerShowing_noCrash() {
177 mStatusBar.mCommandQueue = mock(CommandQueue.class);
178 mStatusBar.setBouncerShowing(true);
179 }
180
181 @Test
Adrian Roosef7a4022017-01-19 14:48:35 -0800182 public void executeRunnableDismissingKeyguard_nullRunnable_showingAndOccluded() {
183 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
184 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(true);
185
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500186 mStatusBar.executeRunnableDismissingKeyguard(null, null, false, false, false);
Adrian Roosef7a4022017-01-19 14:48:35 -0800187 }
188
Adrian Roos02de4982017-02-11 09:35:54 +0100189 @Test
Adrian Roosef7a4022017-01-19 14:48:35 -0800190 public void executeRunnableDismissingKeyguard_nullRunnable_showing() {
191 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
192 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
193
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500194 mStatusBar.executeRunnableDismissingKeyguard(null, null, false, false, false);
Adrian Roosef7a4022017-01-19 14:48:35 -0800195 }
196
Adrian Roos02de4982017-02-11 09:35:54 +0100197 @Test
Adrian Roosef7a4022017-01-19 14:48:35 -0800198 public void executeRunnableDismissingKeyguard_nullRunnable_notShowing() {
199 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(false);
200 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
201
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500202 mStatusBar.executeRunnableDismissingKeyguard(null, null, false, false, false);
Adrian Roosef7a4022017-01-19 14:48:35 -0800203 }
204
Adrian Roos02de4982017-02-11 09:35:54 +0100205 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500206 public void lockscreenStateMetrics_notShowing() {
207 // uninteresting state, except that fingerprint must be non-zero
208 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
209 when(mUnlockMethodCache.canSkipBouncer()).thenReturn(true);
210 // interesting state
211 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(false);
212 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false);
213 when(mUnlockMethodCache.isMethodSecure()).thenReturn(false);
Chris Wren27a52fa2017-02-01 14:21:43 -0500214 mStatusBar.onKeyguardViewManagerStatesUpdated();
215
Chris Wrenef319902017-03-07 17:58:31 -0500216 MetricsAsserts.assertHasLog("missing hidden insecure lockscreen log",
217 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500218 new LogMaker(MetricsEvent.LOCKSCREEN)
219 .setType(MetricsEvent.TYPE_CLOSE)
220 .setSubtype(0));
221 }
222
Adrian Roos02de4982017-02-11 09:35:54 +0100223 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500224 public void lockscreenStateMetrics_notShowing_secure() {
225 // uninteresting state, except that fingerprint must be non-zero
226 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
227 when(mUnlockMethodCache.canSkipBouncer()).thenReturn(true);
228 // interesting state
229 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(false);
230 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false);
231 when(mUnlockMethodCache.isMethodSecure()).thenReturn(true);
232
233 mStatusBar.onKeyguardViewManagerStatesUpdated();
234
Chris Wrenef319902017-03-07 17:58:31 -0500235 MetricsAsserts.assertHasLog("missing hidden secure lockscreen log",
236 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500237 new LogMaker(MetricsEvent.LOCKSCREEN)
238 .setType(MetricsEvent.TYPE_CLOSE)
239 .setSubtype(1));
240 }
241
Adrian Roos02de4982017-02-11 09:35:54 +0100242 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500243 public void lockscreenStateMetrics_isShowing() {
244 // uninteresting state, except that fingerprint must be non-zero
245 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
246 when(mUnlockMethodCache.canSkipBouncer()).thenReturn(true);
247 // interesting state
248 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
249 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false);
250 when(mUnlockMethodCache.isMethodSecure()).thenReturn(false);
251
252 mStatusBar.onKeyguardViewManagerStatesUpdated();
253
Chris Wrenef319902017-03-07 17:58:31 -0500254 MetricsAsserts.assertHasLog("missing insecure lockscreen showing",
255 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500256 new LogMaker(MetricsEvent.LOCKSCREEN)
257 .setType(MetricsEvent.TYPE_OPEN)
258 .setSubtype(0));
259 }
260
Adrian Roos02de4982017-02-11 09:35:54 +0100261 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500262 public void lockscreenStateMetrics_isShowing_secure() {
263 // uninteresting state, except that fingerprint must be non-zero
264 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
265 when(mUnlockMethodCache.canSkipBouncer()).thenReturn(true);
266 // interesting state
267 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
268 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false);
269 when(mUnlockMethodCache.isMethodSecure()).thenReturn(true);
270
271 mStatusBar.onKeyguardViewManagerStatesUpdated();
272
Chris Wrenef319902017-03-07 17:58:31 -0500273 MetricsAsserts.assertHasLog("missing secure lockscreen showing log",
274 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500275 new LogMaker(MetricsEvent.LOCKSCREEN)
276 .setType(MetricsEvent.TYPE_OPEN)
277 .setSubtype(1));
278 }
279
Adrian Roos02de4982017-02-11 09:35:54 +0100280 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500281 public void lockscreenStateMetrics_isShowingBouncer() {
282 // uninteresting state, except that fingerprint must be non-zero
283 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
284 when(mUnlockMethodCache.canSkipBouncer()).thenReturn(true);
285 // interesting state
286 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
287 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(true);
288 when(mUnlockMethodCache.isMethodSecure()).thenReturn(true);
289
290 mStatusBar.onKeyguardViewManagerStatesUpdated();
291
Chris Wrenef319902017-03-07 17:58:31 -0500292 MetricsAsserts.assertHasLog("missing bouncer log",
293 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500294 new LogMaker(MetricsEvent.BOUNCER)
295 .setType(MetricsEvent.TYPE_OPEN)
296 .setSubtype(1));
297 }
298
Adrian Roos02de4982017-02-11 09:35:54 +0100299 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500300 public void onActivatedMetrics() {
301 ActivatableNotificationView view = mock(ActivatableNotificationView.class);
302 mStatusBar.onActivated(view);
303
Chris Wrenef319902017-03-07 17:58:31 -0500304 MetricsAsserts.assertHasLog("missing lockscreen note tap log",
305 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500306 new LogMaker(MetricsEvent.ACTION_LS_NOTE)
307 .setType(MetricsEvent.TYPE_ACTION));
308 }
309
Julia Reynolds30203152017-05-26 13:36:31 -0400310 @Test
311 public void testShouldPeek_nonSuppressedGroupSummary() {
312 when(mPowerManager.isScreenOn()).thenReturn(true);
313 when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false);
314 when(mNotificationData.shouldSuppressScreenOn(any())).thenReturn(false);
315 when(mNotificationData.shouldFilterOut(any())).thenReturn(false);
316 when(mSystemServicesProxy.isDreaming()).thenReturn(false);
317 when(mNotificationData.getImportance(any())).thenReturn(IMPORTANCE_HIGH);
318
319 Notification n = new Notification.Builder(getContext(), "a")
320 .setGroup("a")
321 .setGroupSummary(true)
322 .setGroupAlertBehavior(Notification.GROUP_ALERT_SUMMARY)
323 .build();
324 StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, "a", 0, 0, n,
325 UserHandle.of(0), null, 0);
326 NotificationData.Entry entry = new NotificationData.Entry(sbn);
327
328 assertTrue(mStatusBar.shouldPeek(entry, sbn));
329 }
330
331 @Test
332 public void testShouldPeek_suppressedGroupSummary() {
333 when(mPowerManager.isScreenOn()).thenReturn(true);
334 when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false);
335 when(mNotificationData.shouldSuppressScreenOn(any())).thenReturn(false);
336 when(mNotificationData.shouldFilterOut(any())).thenReturn(false);
337 when(mSystemServicesProxy.isDreaming()).thenReturn(false);
338 when(mNotificationData.getImportance(any())).thenReturn(IMPORTANCE_HIGH);
339
340 Notification n = new Notification.Builder(getContext(), "a")
341 .setGroup("a")
342 .setGroupSummary(true)
343 .setGroupAlertBehavior(Notification.GROUP_ALERT_CHILDREN)
344 .build();
345 StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, "a", 0, 0, n,
346 UserHandle.of(0), null, 0);
347 NotificationData.Entry entry = new NotificationData.Entry(sbn);
348
349 assertFalse(mStatusBar.shouldPeek(entry, sbn));
350 }
351
Chris Wren621933f2017-06-14 15:59:03 -0400352 @Test
Beverly38159ce2017-07-13 16:39:24 -0400353 public void testShouldPeek_suppressedScreenOn_dozing() {
354 when(mPowerManager.isScreenOn()).thenReturn(true);
355 when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false);
356 when(mNotificationData.shouldFilterOut(any())).thenReturn(false);
357 when(mSystemServicesProxy.isDreaming()).thenReturn(false);
358 when(mNotificationData.getImportance(any())).thenReturn(IMPORTANCE_HIGH);
359
360 mStatusBar.mDozing = true;
361 when(mNotificationData.shouldSuppressScreenOn(any())).thenReturn(true);
362 when(mNotificationData.shouldSuppressScreenOff(any())).thenReturn(false);
363
364 Notification n = new Notification.Builder(getContext(), "a").build();
365 StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, "a", 0, 0, n,
366 UserHandle.of(0), null, 0);
367 NotificationData.Entry entry = new NotificationData.Entry(sbn);
368
369 assertTrue(mStatusBar.shouldPeek(entry, sbn));
370 }
371
372 @Test
373 public void testShouldPeek_suppressedScreenOn_noDoze() {
374 when(mPowerManager.isScreenOn()).thenReturn(true);
375 when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false);
376 when(mNotificationData.shouldFilterOut(any())).thenReturn(false);
377 when(mSystemServicesProxy.isDreaming()).thenReturn(false);
378 when(mNotificationData.getImportance(any())).thenReturn(IMPORTANCE_HIGH);
379
380 mStatusBar.mDozing = false;
381 when(mNotificationData.shouldSuppressScreenOn(any())).thenReturn(true);
382 when(mNotificationData.shouldSuppressScreenOff(any())).thenReturn(false);
383
384 Notification n = new Notification.Builder(getContext(), "a").build();
385 StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, "a", 0, 0, n,
386 UserHandle.of(0), null, 0);
387 NotificationData.Entry entry = new NotificationData.Entry(sbn);
388 assertFalse(mStatusBar.shouldPeek(entry, sbn));
389 }
390 @Test
391 public void testShouldPeek_suppressedScreenOff_dozing() {
392 when(mPowerManager.isScreenOn()).thenReturn(true);
393 when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false);
394 when(mNotificationData.shouldFilterOut(any())).thenReturn(false);
395 when(mSystemServicesProxy.isDreaming()).thenReturn(false);
396 when(mNotificationData.getImportance(any())).thenReturn(IMPORTANCE_HIGH);
397
398 mStatusBar.mDozing = true;
399 when(mNotificationData.shouldSuppressScreenOn(any())).thenReturn(false);
400 when(mNotificationData.shouldSuppressScreenOff(any())).thenReturn(true);
401
402 Notification n = new Notification.Builder(getContext(), "a").build();
403 StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, "a", 0, 0, n,
404 UserHandle.of(0), null, 0);
405 NotificationData.Entry entry = new NotificationData.Entry(sbn);
406 assertFalse(mStatusBar.shouldPeek(entry, sbn));
407 }
408
409 @Test
410 public void testShouldPeek_suppressedScreenOff_noDoze() {
411 when(mPowerManager.isScreenOn()).thenReturn(true);
412 when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false);
413 when(mNotificationData.shouldFilterOut(any())).thenReturn(false);
414 when(mSystemServicesProxy.isDreaming()).thenReturn(false);
415 when(mNotificationData.getImportance(any())).thenReturn(IMPORTANCE_HIGH);
416
417 mStatusBar.mDozing = false;
418 when(mNotificationData.shouldSuppressScreenOn(any())).thenReturn(false);
419 when(mNotificationData.shouldSuppressScreenOff(any())).thenReturn(true);
420
421 Notification n = new Notification.Builder(getContext(), "a").build();
422 StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, "a", 0, 0, n,
423 UserHandle.of(0), null, 0);
424 NotificationData.Entry entry = new NotificationData.Entry(sbn);
425 assertTrue(mStatusBar.shouldPeek(entry, sbn));
426 }
427
428
429 @Test
Chris Wren621933f2017-06-14 15:59:03 -0400430 public void testLogHidden() {
431 try {
432 mStatusBar.handleVisibleToUserChanged(false);
433 verify(mBarService, times(1)).onPanelHidden();
434 verify(mBarService, never()).onPanelRevealed(anyBoolean(), anyInt());
435 } catch (RemoteException e) {
436 fail();
437 }
438 }
439
440 @Test
441 public void testPanelOpenForPeek() {
442 when(mHeadsUpManager.hasPinnedHeadsUp()).thenReturn(true);
443 when(mNotificationData.getActiveNotifications()).thenReturn(mNotificationList);
444 when(mNotificationList.size()).thenReturn(5);
445 when(mNotificationPanelView.isFullyCollapsed()).thenReturn(true);
446 mStatusBar.setBarStateForTest(StatusBarState.SHADE);
447
448 try {
449 mStatusBar.handleVisibleToUserChanged(true);
450
451 verify(mBarService, never()).onPanelHidden();
452 verify(mBarService, times(1)).onPanelRevealed(false, 1);
453 } catch (RemoteException e) {
454 fail();
455 }
456 TestableLooper.get(this).processAllMessages();
457 }
458
459 @Test
460 public void testPanelOpenAndClear() {
461 when(mHeadsUpManager.hasPinnedHeadsUp()).thenReturn(false);
462 when(mNotificationData.getActiveNotifications()).thenReturn(mNotificationList);
463 when(mNotificationList.size()).thenReturn(5);
464 when(mNotificationPanelView.isFullyCollapsed()).thenReturn(false);
465 mStatusBar.setBarStateForTest(StatusBarState.SHADE);
466
467 try {
468 mStatusBar.handleVisibleToUserChanged(true);
469
470 verify(mBarService, never()).onPanelHidden();
471 verify(mBarService, times(1)).onPanelRevealed(true, 5);
472 } catch (RemoteException e) {
473 fail();
474 }
475 TestableLooper.get(this).processAllMessages();
476 }
477
478 @Test
479 public void testPanelOpenAndNoClear() {
480 when(mHeadsUpManager.hasPinnedHeadsUp()).thenReturn(false);
481 when(mNotificationData.getActiveNotifications()).thenReturn(mNotificationList);
482 when(mNotificationList.size()).thenReturn(5);
483 when(mNotificationPanelView.isFullyCollapsed()).thenReturn(false);
484 mStatusBar.setBarStateForTest(StatusBarState.KEYGUARD);
485
486 try {
487 mStatusBar.handleVisibleToUserChanged(true);
488
489 verify(mBarService, never()).onPanelHidden();
490 verify(mBarService, times(1)).onPanelRevealed(false, 5);
491 } catch (RemoteException e) {
492 fail();
493 }
494 TestableLooper.get(this).processAllMessages();
495 }
496
Jason Monk51305372017-06-22 11:41:08 -0400497 @Test
Charles He2eda2422017-09-24 17:55:21 +0100498 public void testDisableExpandStatusBar() {
499 mStatusBar.setBarStateForTest(StatusBarState.SHADE);
500 mStatusBar.setUserSetupForTest(true);
501 when(mStatusBar.isDeviceProvisioned()).thenReturn(true);
502
503 mStatusBar.disable(StatusBarManager.DISABLE_NONE,
504 StatusBarManager.DISABLE2_NOTIFICATION_SHADE, false);
505 verify(mNotificationPanelView).setQsExpansionEnabled(false);
506 mStatusBar.animateExpandNotificationsPanel();
507 verify(mNotificationPanelView, never()).expand(anyBoolean());
508 mStatusBar.animateExpandSettingsPanel(null);
509 verify(mNotificationPanelView, never()).expand(anyBoolean());
510
511 mStatusBar.disable(StatusBarManager.DISABLE_NONE, StatusBarManager.DISABLE2_NONE, false);
512 verify(mNotificationPanelView).setQsExpansionEnabled(true);
513 mStatusBar.animateExpandNotificationsPanel();
514 verify(mNotificationPanelView).expand(anyBoolean());
515 mStatusBar.animateExpandSettingsPanel(null);
516 verify(mNotificationPanelView).expand(anyBoolean());
517 }
518
519 @Test
Jason Monk51305372017-06-22 11:41:08 -0400520 public void testDump_DoesNotCrash() {
521 mStatusBar.dump(null, new PrintWriter(new ByteArrayOutputStream()), null);
522 }
523
Jason Monk9c4faa82017-08-15 09:32:27 -0400524 @Test
525 @RunWithLooper(setAsMainLooper = true)
526 public void testUpdateKeyguardState_DoesNotCrash() {
527 mStatusBar.mStatusBarWindow = mock(StatusBarWindowView.class);
528 mStatusBar.mState = StatusBarState.KEYGUARD;
529 mStatusBar.mDozeScrimController = mock(DozeScrimController.class);
530 mStatusBar.mNotificationIconAreaController = mock(NotificationIconAreaController.class);
Eliot Courtney09322282017-11-09 15:31:19 +0900531 mStatusBar.mLockscreenUserManager = mock(NotificationLockscreenUserManager.class);
532 when(mStatusBar.mLockscreenUserManager.getCurrentProfiles()).thenReturn(
533 new SparseArray<>());
Jason Monk9c4faa82017-08-15 09:32:27 -0400534 mStatusBar.updateKeyguardState(false, false);
535 }
536
Lucas Dupinc2e75462017-12-06 13:59:25 -0800537 @Test
538 public void testFingerprintNotification_UpdatesScrims() {
539 mStatusBar.mStatusBarWindowManager = mock(StatusBarWindowManager.class);
540 mStatusBar.mFingerprintUnlockController = mock(FingerprintUnlockController.class);
541 mStatusBar.mDozeScrimController = mock(DozeScrimController.class);
542 mStatusBar.notifyFpAuthModeChanged();
543 verify(mScrimController).transitionTo(any(), any());
544 }
545
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500546 static class TestableStatusBar extends StatusBar {
Chris Wren27a52fa2017-02-01 14:21:43 -0500547 public TestableStatusBar(StatusBarKeyguardViewManager man,
548 UnlockMethodCache unlock, KeyguardIndicationController key,
Julia Reynolds30203152017-05-26 13:36:31 -0400549 NotificationStackScrollLayout stack, HeadsUpManager hum, NotificationData nd,
Chris Wren621933f2017-06-14 15:59:03 -0400550 PowerManager pm, SystemServicesProxy ssp, NotificationPanelView panelView,
Lucas Dupinc2e75462017-12-06 13:59:25 -0800551 IStatusBarService barService, ScrimController scrimController) {
Adrian Roosef7a4022017-01-19 14:48:35 -0800552 mStatusBarKeyguardViewManager = man;
Chris Wren27a52fa2017-02-01 14:21:43 -0500553 mUnlockMethodCache = unlock;
554 mKeyguardIndicationController = key;
555 mStackScroller = stack;
Julia Reynolds30203152017-05-26 13:36:31 -0400556 mHeadsUpManager = hum;
557 mNotificationData = nd;
558 mUseHeadsUp = true;
559 mPowerManager = pm;
560 mSystemServicesProxy = ssp;
Jorim Jaggifd3b1a12017-06-06 17:04:19 -0700561 mNotificationPanel = panelView;
Chris Wren621933f2017-06-14 15:59:03 -0400562 mBarService = barService;
Adrian Roos6d5ebb72017-08-03 15:10:22 +0200563 mWakefulnessLifecycle = createAwakeWakefulnessLifecycle();
Lucas Dupinc2e75462017-12-06 13:59:25 -0800564 mScrimController = scrimController;
Adrian Roos6d5ebb72017-08-03 15:10:22 +0200565 }
566
567 private WakefulnessLifecycle createAwakeWakefulnessLifecycle() {
568 WakefulnessLifecycle wakefulnessLifecycle = new WakefulnessLifecycle();
569 wakefulnessLifecycle.dispatchStartedWakingUp();
570 wakefulnessLifecycle.dispatchFinishedWakingUp();
571 return wakefulnessLifecycle;
Adrian Roosef7a4022017-01-19 14:48:35 -0800572 }
573
Jason Monk9c4faa82017-08-15 09:32:27 -0400574 @Override
575 protected void updateTheme() {
576 // Do nothing for now, until we have more mocking and StatusBar is smaller.
577 }
578
Chris Wren621933f2017-06-14 15:59:03 -0400579 public void setBarStateForTest(int state) {
580 mState = state;
Adrian Roosef7a4022017-01-19 14:48:35 -0800581 }
Charles He2eda2422017-09-24 17:55:21 +0100582
583 public void setUserSetupForTest(boolean userSetup) {
584 mUserSetup = userSetup;
585 }
Adrian Roosef7a4022017-01-19 14:48:35 -0800586 }
Eliot Courtney09322282017-11-09 15:31:19 +0900587}