blob: 0732866179794e0a915ee859e5641108d808680b [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;
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;
Chris Wren621933f2017-06-14 15:59:03 -040054import android.testing.TestableLooper.RunWithLooper;
Chris Wren27a52fa2017-02-01 14:21:43 -050055import android.util.DisplayMetrics;
Eliot Courtney09322282017-11-09 15:31:19 +090056import android.util.SparseArray;
Jason Monk51305372017-06-22 11:41:08 -040057import android.view.ViewGroup.LayoutParams;
Adrian Roosef7a4022017-01-19 14:48:35 -080058
Chris Wrenef319902017-03-07 17:58:31 -050059import com.android.internal.logging.MetricsLogger;
Chris Wren27a52fa2017-02-01 14:21:43 -050060import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
Chris Wrenef319902017-03-07 17:58:31 -050061import com.android.internal.logging.testing.FakeMetricsLogger;
Chris Wren621933f2017-06-14 15:59:03 -040062import com.android.internal.statusbar.IStatusBarService;
Adrian Roosef7a4022017-01-19 14:48:35 -080063import com.android.keyguard.KeyguardHostView.OnDismissAction;
Jason Monk9c4faa82017-08-15 09:32:27 -040064import com.android.systemui.R;
Adrian Roosef7a4022017-01-19 14:48:35 -080065import com.android.systemui.SysuiTestCase;
Eliot Courtney3985ad52017-11-17 16:51:52 +090066import com.android.systemui.UiOffloadThread;
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 Courtney3985ad52017-11-17 16:51:52 +090075import com.android.systemui.statusbar.NotificationListener;
Eliot Courtney09322282017-11-09 15:31:19 +090076import com.android.systemui.statusbar.NotificationLockscreenUserManager;
Eliot Courtney3985ad52017-11-17 16:51:52 +090077import com.android.systemui.statusbar.NotificationLogger;
Chris Wren621933f2017-06-14 15:59:03 -040078import com.android.systemui.statusbar.StatusBarState;
Jason Monk9c4faa82017-08-15 09:32:27 -040079import com.android.systemui.statusbar.policy.DeviceProvisionedController;
Julia Reynolds30203152017-05-26 13:36:31 -040080import com.android.systemui.statusbar.policy.HeadsUpManager;
Jason Monk9c4faa82017-08-15 09:32:27 -040081import com.android.systemui.statusbar.policy.KeyguardMonitor;
82import com.android.systemui.statusbar.policy.KeyguardMonitorImpl;
Chris Wren27a52fa2017-02-01 14:21:43 -050083import com.android.systemui.statusbar.stack.NotificationStackScrollLayout;
Adrian Roosef7a4022017-01-19 14:48:35 -080084
85import org.junit.Before;
86import org.junit.Test;
87import org.junit.runner.RunWith;
88
Jason Monk51305372017-06-22 11:41:08 -040089import java.io.ByteArrayOutputStream;
90import java.io.PrintWriter;
Chris Wren621933f2017-06-14 15:59:03 -040091import java.util.ArrayList;
92
Adrian Roos02de4982017-02-11 09:35:54 +010093@SmallTest
Chris Wren621933f2017-06-14 15:59:03 -040094@RunWith(AndroidTestingRunner.class)
95@RunWithLooper
Jason Monk2a6ea9c2017-01-26 11:14:51 -050096public class StatusBarTest extends SysuiTestCase {
Adrian Roosef7a4022017-01-19 14:48:35 -080097
98 StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
Chris Wren27a52fa2017-02-01 14:21:43 -050099 UnlockMethodCache mUnlockMethodCache;
100 KeyguardIndicationController mKeyguardIndicationController;
101 NotificationStackScrollLayout mStackScroller;
Chris Wren621933f2017-06-14 15:59:03 -0400102 TestableStatusBar mStatusBar;
Chris Wrenef319902017-03-07 17:58:31 -0500103 FakeMetricsLogger mMetricsLogger;
Julia Reynolds30203152017-05-26 13:36:31 -0400104 HeadsUpManager mHeadsUpManager;
105 NotificationData mNotificationData;
106 PowerManager mPowerManager;
107 SystemServicesProxy mSystemServicesProxy;
Jorim Jaggifd3b1a12017-06-06 17:04:19 -0700108 NotificationPanelView mNotificationPanelView;
Lucas Dupinc2e75462017-12-06 13:59:25 -0800109 ScrimController mScrimController;
Chris Wren621933f2017-06-14 15:59:03 -0400110 IStatusBarService mBarService;
Eliot Courtney3985ad52017-11-17 16:51:52 +0900111 NotificationListener mNotificationListener;
112 NotificationLogger mNotificationLogger;
Chris Wren621933f2017-06-14 15:59:03 -0400113 ArrayList<Entry> mNotificationList;
Lucas Dupin311eac82017-12-11 14:40:07 -0800114 FingerprintUnlockController mFingerprintUnlockController;
Chris Wren27a52fa2017-02-01 14:21:43 -0500115 private DisplayMetrics mDisplayMetrics = new DisplayMetrics();
116
Adrian Roos02de4982017-02-11 09:35:54 +0100117 @Before
Julia Reynolds30203152017-05-26 13:36:31 -0400118 public void setup() throws Exception {
Jason Monk9c4faa82017-08-15 09:32:27 -0400119 mContext.setTheme(R.style.Theme_SystemUI_Light);
120 mDependency.injectMockDependency(AssistManager.class);
121 mDependency.injectMockDependency(DeviceProvisionedController.class);
122 mDependency.injectTestDependency(KeyguardMonitor.class, mock(KeyguardMonitorImpl.class));
123 CommandQueue commandQueue = mock(CommandQueue.class);
124 when(commandQueue.asBinder()).thenReturn(new Binder());
125 mContext.putComponent(CommandQueue.class, commandQueue);
Jason Monk51305372017-06-22 11:41:08 -0400126 mContext.addMockSystemService(TrustManager.class, mock(TrustManager.class));
127 mContext.addMockSystemService(FingerprintManager.class, mock(FingerprintManager.class));
Adrian Roosef7a4022017-01-19 14:48:35 -0800128 mStatusBarKeyguardViewManager = mock(StatusBarKeyguardViewManager.class);
Chris Wren27a52fa2017-02-01 14:21:43 -0500129 mUnlockMethodCache = mock(UnlockMethodCache.class);
130 mKeyguardIndicationController = mock(KeyguardIndicationController.class);
131 mStackScroller = mock(NotificationStackScrollLayout.class);
Jason Monk9c4faa82017-08-15 09:32:27 -0400132 when(mStackScroller.generateLayoutParams(any())).thenReturn(new LayoutParams(0, 0));
Chris Wrenef319902017-03-07 17:58:31 -0500133 mMetricsLogger = new FakeMetricsLogger();
Julia Reynolds30203152017-05-26 13:36:31 -0400134 mHeadsUpManager = mock(HeadsUpManager.class);
135 mNotificationData = mock(NotificationData.class);
136 mSystemServicesProxy = mock(SystemServicesProxy.class);
Jorim Jaggifd3b1a12017-06-06 17:04:19 -0700137 mNotificationPanelView = mock(NotificationPanelView.class);
Jason Monk51305372017-06-22 11:41:08 -0400138 when(mNotificationPanelView.getLayoutParams()).thenReturn(new LayoutParams(0, 0));
Chris Wren621933f2017-06-14 15:59:03 -0400139 mNotificationList = mock(ArrayList.class);
Lucas Dupinc2e75462017-12-06 13:59:25 -0800140 mScrimController = mock(ScrimController.class);
Lucas Dupin311eac82017-12-11 14:40:07 -0800141 mFingerprintUnlockController = mock(FingerprintUnlockController.class);
Julia Reynolds30203152017-05-26 13:36:31 -0400142 IPowerManager powerManagerService = mock(IPowerManager.class);
143 HandlerThread handlerThread = new HandlerThread("TestThread");
144 handlerThread.start();
145 mPowerManager = new PowerManager(mContext, powerManagerService,
146 new Handler(handlerThread.getLooper()));
147 when(powerManagerService.isInteractive()).thenReturn(true);
Chris Wren621933f2017-06-14 15:59:03 -0400148 mBarService = mock(IStatusBarService.class);
Eliot Courtney3985ad52017-11-17 16:51:52 +0900149 mNotificationListener = mock(NotificationListener.class);
150 mNotificationLogger = new NotificationLogger(mNotificationListener, mDependency.get(
151 UiOffloadThread.class));
Julia Reynolds30203152017-05-26 13:36:31 -0400152
Jason Monk8c09ac72017-03-16 11:53:40 -0400153 mDependency.injectTestDependency(MetricsLogger.class, mMetricsLogger);
Chris Wren27a52fa2017-02-01 14:21:43 -0500154 mStatusBar = new TestableStatusBar(mStatusBarKeyguardViewManager, mUnlockMethodCache,
Julia Reynolds30203152017-05-26 13:36:31 -0400155 mKeyguardIndicationController, mStackScroller, mHeadsUpManager,
Chris Wren621933f2017-06-14 15:59:03 -0400156 mNotificationData, mPowerManager, mSystemServicesProxy, mNotificationPanelView,
Eliot Courtney3985ad52017-11-17 16:51:52 +0900157 mBarService, mNotificationListener, mNotificationLogger, mScrimController,
158 mFingerprintUnlockController);
Jason Monk51305372017-06-22 11:41:08 -0400159 mStatusBar.mContext = mContext;
Jason Monk9c4faa82017-08-15 09:32:27 -0400160 mStatusBar.mComponents = mContext.getComponents();
Adrian Roosef7a4022017-01-19 14:48:35 -0800161 doAnswer(invocation -> {
162 OnDismissAction onDismissAction = (OnDismissAction) invocation.getArguments()[0];
163 onDismissAction.onDismiss();
164 return null;
165 }).when(mStatusBarKeyguardViewManager).dismissWithAction(any(), any(), anyBoolean());
166
167 doAnswer(invocation -> {
168 Runnable runnable = (Runnable) invocation.getArguments()[0];
169 runnable.run();
170 return null;
171 }).when(mStatusBarKeyguardViewManager).addAfterKeyguardGoneRunnable(any());
Chris Wren27a52fa2017-02-01 14:21:43 -0500172
Eliot Courtney3985ad52017-11-17 16:51:52 +0900173 mNotificationLogger.setUpWithPresenter(mStatusBar, mStackScroller);
174
Chris Wren27a52fa2017-02-01 14:21:43 -0500175 when(mStackScroller.getActivatedChild()).thenReturn(null);
Eliot Courtney3985ad52017-11-17 16:51:52 +0900176 TestableLooper.get(this).setMessageHandler(m -> {
177 if (m.getCallback() == mStatusBar.mNotificationLogger.getVisibilityReporter()) {
178 return false;
Chris Wren621933f2017-06-14 15:59:03 -0400179 }
Eliot Courtney3985ad52017-11-17 16:51:52 +0900180 return true;
Chris Wren621933f2017-06-14 15:59:03 -0400181 });
Adrian Roosef7a4022017-01-19 14:48:35 -0800182 }
183
Adrian Roos02de4982017-02-11 09:35:54 +0100184 @Test
Jason Monk5ecf80c2017-07-06 15:28:17 -0400185 public void testSetBouncerShowing_noCrash() {
186 mStatusBar.mCommandQueue = mock(CommandQueue.class);
187 mStatusBar.setBouncerShowing(true);
188 }
189
190 @Test
Adrian Roosef7a4022017-01-19 14:48:35 -0800191 public void executeRunnableDismissingKeyguard_nullRunnable_showingAndOccluded() {
192 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
193 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(true);
194
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500195 mStatusBar.executeRunnableDismissingKeyguard(null, null, false, false, false);
Adrian Roosef7a4022017-01-19 14:48:35 -0800196 }
197
Adrian Roos02de4982017-02-11 09:35:54 +0100198 @Test
Adrian Roosef7a4022017-01-19 14:48:35 -0800199 public void executeRunnableDismissingKeyguard_nullRunnable_showing() {
200 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
201 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
202
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500203 mStatusBar.executeRunnableDismissingKeyguard(null, null, false, false, false);
Adrian Roosef7a4022017-01-19 14:48:35 -0800204 }
205
Adrian Roos02de4982017-02-11 09:35:54 +0100206 @Test
Adrian Roosef7a4022017-01-19 14:48:35 -0800207 public void executeRunnableDismissingKeyguard_nullRunnable_notShowing() {
208 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(false);
209 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
210
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500211 mStatusBar.executeRunnableDismissingKeyguard(null, null, false, false, false);
Adrian Roosef7a4022017-01-19 14:48:35 -0800212 }
213
Adrian Roos02de4982017-02-11 09:35:54 +0100214 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500215 public void lockscreenStateMetrics_notShowing() {
216 // uninteresting state, except that fingerprint must be non-zero
217 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
218 when(mUnlockMethodCache.canSkipBouncer()).thenReturn(true);
219 // interesting state
220 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(false);
221 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false);
222 when(mUnlockMethodCache.isMethodSecure()).thenReturn(false);
Chris Wren27a52fa2017-02-01 14:21:43 -0500223 mStatusBar.onKeyguardViewManagerStatesUpdated();
224
Chris Wrenef319902017-03-07 17:58:31 -0500225 MetricsAsserts.assertHasLog("missing hidden insecure lockscreen log",
226 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500227 new LogMaker(MetricsEvent.LOCKSCREEN)
228 .setType(MetricsEvent.TYPE_CLOSE)
229 .setSubtype(0));
230 }
231
Adrian Roos02de4982017-02-11 09:35:54 +0100232 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500233 public void lockscreenStateMetrics_notShowing_secure() {
234 // uninteresting state, except that fingerprint must be non-zero
235 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
236 when(mUnlockMethodCache.canSkipBouncer()).thenReturn(true);
237 // interesting state
238 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(false);
239 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false);
240 when(mUnlockMethodCache.isMethodSecure()).thenReturn(true);
241
242 mStatusBar.onKeyguardViewManagerStatesUpdated();
243
Chris Wrenef319902017-03-07 17:58:31 -0500244 MetricsAsserts.assertHasLog("missing hidden secure lockscreen log",
245 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500246 new LogMaker(MetricsEvent.LOCKSCREEN)
247 .setType(MetricsEvent.TYPE_CLOSE)
248 .setSubtype(1));
249 }
250
Adrian Roos02de4982017-02-11 09:35:54 +0100251 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500252 public void lockscreenStateMetrics_isShowing() {
253 // uninteresting state, except that fingerprint must be non-zero
254 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
255 when(mUnlockMethodCache.canSkipBouncer()).thenReturn(true);
256 // interesting state
257 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
258 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false);
259 when(mUnlockMethodCache.isMethodSecure()).thenReturn(false);
260
261 mStatusBar.onKeyguardViewManagerStatesUpdated();
262
Chris Wrenef319902017-03-07 17:58:31 -0500263 MetricsAsserts.assertHasLog("missing insecure lockscreen showing",
264 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500265 new LogMaker(MetricsEvent.LOCKSCREEN)
266 .setType(MetricsEvent.TYPE_OPEN)
267 .setSubtype(0));
268 }
269
Adrian Roos02de4982017-02-11 09:35:54 +0100270 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500271 public void lockscreenStateMetrics_isShowing_secure() {
272 // uninteresting state, except that fingerprint must be non-zero
273 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
274 when(mUnlockMethodCache.canSkipBouncer()).thenReturn(true);
275 // interesting state
276 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
277 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false);
278 when(mUnlockMethodCache.isMethodSecure()).thenReturn(true);
279
280 mStatusBar.onKeyguardViewManagerStatesUpdated();
281
Chris Wrenef319902017-03-07 17:58:31 -0500282 MetricsAsserts.assertHasLog("missing secure lockscreen showing log",
283 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500284 new LogMaker(MetricsEvent.LOCKSCREEN)
285 .setType(MetricsEvent.TYPE_OPEN)
286 .setSubtype(1));
287 }
288
Adrian Roos02de4982017-02-11 09:35:54 +0100289 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500290 public void lockscreenStateMetrics_isShowingBouncer() {
291 // uninteresting state, except that fingerprint must be non-zero
292 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
293 when(mUnlockMethodCache.canSkipBouncer()).thenReturn(true);
294 // interesting state
295 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
296 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(true);
297 when(mUnlockMethodCache.isMethodSecure()).thenReturn(true);
298
299 mStatusBar.onKeyguardViewManagerStatesUpdated();
300
Chris Wrenef319902017-03-07 17:58:31 -0500301 MetricsAsserts.assertHasLog("missing bouncer log",
302 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500303 new LogMaker(MetricsEvent.BOUNCER)
304 .setType(MetricsEvent.TYPE_OPEN)
305 .setSubtype(1));
306 }
307
Adrian Roos02de4982017-02-11 09:35:54 +0100308 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500309 public void onActivatedMetrics() {
310 ActivatableNotificationView view = mock(ActivatableNotificationView.class);
311 mStatusBar.onActivated(view);
312
Chris Wrenef319902017-03-07 17:58:31 -0500313 MetricsAsserts.assertHasLog("missing lockscreen note tap log",
314 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500315 new LogMaker(MetricsEvent.ACTION_LS_NOTE)
316 .setType(MetricsEvent.TYPE_ACTION));
317 }
318
Julia Reynolds30203152017-05-26 13:36:31 -0400319 @Test
320 public void testShouldPeek_nonSuppressedGroupSummary() {
321 when(mPowerManager.isScreenOn()).thenReturn(true);
322 when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false);
323 when(mNotificationData.shouldSuppressScreenOn(any())).thenReturn(false);
324 when(mNotificationData.shouldFilterOut(any())).thenReturn(false);
325 when(mSystemServicesProxy.isDreaming()).thenReturn(false);
326 when(mNotificationData.getImportance(any())).thenReturn(IMPORTANCE_HIGH);
327
328 Notification n = new Notification.Builder(getContext(), "a")
329 .setGroup("a")
330 .setGroupSummary(true)
331 .setGroupAlertBehavior(Notification.GROUP_ALERT_SUMMARY)
332 .build();
333 StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, "a", 0, 0, n,
334 UserHandle.of(0), null, 0);
335 NotificationData.Entry entry = new NotificationData.Entry(sbn);
336
337 assertTrue(mStatusBar.shouldPeek(entry, sbn));
338 }
339
340 @Test
341 public void testShouldPeek_suppressedGroupSummary() {
342 when(mPowerManager.isScreenOn()).thenReturn(true);
343 when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false);
344 when(mNotificationData.shouldSuppressScreenOn(any())).thenReturn(false);
345 when(mNotificationData.shouldFilterOut(any())).thenReturn(false);
346 when(mSystemServicesProxy.isDreaming()).thenReturn(false);
347 when(mNotificationData.getImportance(any())).thenReturn(IMPORTANCE_HIGH);
348
349 Notification n = new Notification.Builder(getContext(), "a")
350 .setGroup("a")
351 .setGroupSummary(true)
352 .setGroupAlertBehavior(Notification.GROUP_ALERT_CHILDREN)
353 .build();
354 StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, "a", 0, 0, n,
355 UserHandle.of(0), null, 0);
356 NotificationData.Entry entry = new NotificationData.Entry(sbn);
357
358 assertFalse(mStatusBar.shouldPeek(entry, sbn));
359 }
360
Chris Wren621933f2017-06-14 15:59:03 -0400361 @Test
Beverly38159ce2017-07-13 16:39:24 -0400362 public void testShouldPeek_suppressedScreenOn_dozing() {
363 when(mPowerManager.isScreenOn()).thenReturn(true);
364 when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false);
365 when(mNotificationData.shouldFilterOut(any())).thenReturn(false);
366 when(mSystemServicesProxy.isDreaming()).thenReturn(false);
367 when(mNotificationData.getImportance(any())).thenReturn(IMPORTANCE_HIGH);
368
369 mStatusBar.mDozing = true;
370 when(mNotificationData.shouldSuppressScreenOn(any())).thenReturn(true);
371 when(mNotificationData.shouldSuppressScreenOff(any())).thenReturn(false);
372
373 Notification n = new Notification.Builder(getContext(), "a").build();
374 StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, "a", 0, 0, n,
375 UserHandle.of(0), null, 0);
376 NotificationData.Entry entry = new NotificationData.Entry(sbn);
377
378 assertTrue(mStatusBar.shouldPeek(entry, sbn));
379 }
380
381 @Test
382 public void testShouldPeek_suppressedScreenOn_noDoze() {
383 when(mPowerManager.isScreenOn()).thenReturn(true);
384 when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false);
385 when(mNotificationData.shouldFilterOut(any())).thenReturn(false);
386 when(mSystemServicesProxy.isDreaming()).thenReturn(false);
387 when(mNotificationData.getImportance(any())).thenReturn(IMPORTANCE_HIGH);
388
389 mStatusBar.mDozing = false;
390 when(mNotificationData.shouldSuppressScreenOn(any())).thenReturn(true);
391 when(mNotificationData.shouldSuppressScreenOff(any())).thenReturn(false);
392
393 Notification n = new Notification.Builder(getContext(), "a").build();
394 StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, "a", 0, 0, n,
395 UserHandle.of(0), null, 0);
396 NotificationData.Entry entry = new NotificationData.Entry(sbn);
397 assertFalse(mStatusBar.shouldPeek(entry, sbn));
398 }
399 @Test
400 public void testShouldPeek_suppressedScreenOff_dozing() {
401 when(mPowerManager.isScreenOn()).thenReturn(true);
402 when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false);
403 when(mNotificationData.shouldFilterOut(any())).thenReturn(false);
404 when(mSystemServicesProxy.isDreaming()).thenReturn(false);
405 when(mNotificationData.getImportance(any())).thenReturn(IMPORTANCE_HIGH);
406
407 mStatusBar.mDozing = true;
408 when(mNotificationData.shouldSuppressScreenOn(any())).thenReturn(false);
409 when(mNotificationData.shouldSuppressScreenOff(any())).thenReturn(true);
410
411 Notification n = new Notification.Builder(getContext(), "a").build();
412 StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, "a", 0, 0, n,
413 UserHandle.of(0), null, 0);
414 NotificationData.Entry entry = new NotificationData.Entry(sbn);
415 assertFalse(mStatusBar.shouldPeek(entry, sbn));
416 }
417
418 @Test
419 public void testShouldPeek_suppressedScreenOff_noDoze() {
420 when(mPowerManager.isScreenOn()).thenReturn(true);
421 when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false);
422 when(mNotificationData.shouldFilterOut(any())).thenReturn(false);
423 when(mSystemServicesProxy.isDreaming()).thenReturn(false);
424 when(mNotificationData.getImportance(any())).thenReturn(IMPORTANCE_HIGH);
425
426 mStatusBar.mDozing = false;
427 when(mNotificationData.shouldSuppressScreenOn(any())).thenReturn(false);
428 when(mNotificationData.shouldSuppressScreenOff(any())).thenReturn(true);
429
430 Notification n = new Notification.Builder(getContext(), "a").build();
431 StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, "a", 0, 0, n,
432 UserHandle.of(0), null, 0);
433 NotificationData.Entry entry = new NotificationData.Entry(sbn);
434 assertTrue(mStatusBar.shouldPeek(entry, sbn));
435 }
436
437
438 @Test
Chris Wren621933f2017-06-14 15:59:03 -0400439 public void testLogHidden() {
440 try {
441 mStatusBar.handleVisibleToUserChanged(false);
Selim Cinek1a891a92017-12-04 17:41:27 +0100442 waitForUiOffloadThread();
Chris Wren621933f2017-06-14 15:59:03 -0400443 verify(mBarService, times(1)).onPanelHidden();
444 verify(mBarService, never()).onPanelRevealed(anyBoolean(), anyInt());
445 } catch (RemoteException e) {
446 fail();
447 }
448 }
449
450 @Test
451 public void testPanelOpenForPeek() {
452 when(mHeadsUpManager.hasPinnedHeadsUp()).thenReturn(true);
453 when(mNotificationData.getActiveNotifications()).thenReturn(mNotificationList);
454 when(mNotificationList.size()).thenReturn(5);
455 when(mNotificationPanelView.isFullyCollapsed()).thenReturn(true);
456 mStatusBar.setBarStateForTest(StatusBarState.SHADE);
457
458 try {
459 mStatusBar.handleVisibleToUserChanged(true);
Selim Cinek1a891a92017-12-04 17:41:27 +0100460 waitForUiOffloadThread();
Chris Wren621933f2017-06-14 15:59:03 -0400461 verify(mBarService, never()).onPanelHidden();
462 verify(mBarService, times(1)).onPanelRevealed(false, 1);
463 } catch (RemoteException e) {
464 fail();
465 }
466 TestableLooper.get(this).processAllMessages();
467 }
468
469 @Test
470 public void testPanelOpenAndClear() {
471 when(mHeadsUpManager.hasPinnedHeadsUp()).thenReturn(false);
472 when(mNotificationData.getActiveNotifications()).thenReturn(mNotificationList);
473 when(mNotificationList.size()).thenReturn(5);
474 when(mNotificationPanelView.isFullyCollapsed()).thenReturn(false);
475 mStatusBar.setBarStateForTest(StatusBarState.SHADE);
476
477 try {
478 mStatusBar.handleVisibleToUserChanged(true);
Selim Cinek1a891a92017-12-04 17:41:27 +0100479 waitForUiOffloadThread();
Chris Wren621933f2017-06-14 15:59:03 -0400480 verify(mBarService, never()).onPanelHidden();
481 verify(mBarService, times(1)).onPanelRevealed(true, 5);
482 } catch (RemoteException e) {
483 fail();
484 }
485 TestableLooper.get(this).processAllMessages();
486 }
487
488 @Test
489 public void testPanelOpenAndNoClear() {
490 when(mHeadsUpManager.hasPinnedHeadsUp()).thenReturn(false);
491 when(mNotificationData.getActiveNotifications()).thenReturn(mNotificationList);
492 when(mNotificationList.size()).thenReturn(5);
493 when(mNotificationPanelView.isFullyCollapsed()).thenReturn(false);
494 mStatusBar.setBarStateForTest(StatusBarState.KEYGUARD);
495
496 try {
497 mStatusBar.handleVisibleToUserChanged(true);
Selim Cinek1a891a92017-12-04 17:41:27 +0100498 waitForUiOffloadThread();
Chris Wren621933f2017-06-14 15:59:03 -0400499 verify(mBarService, never()).onPanelHidden();
500 verify(mBarService, times(1)).onPanelRevealed(false, 5);
501 } catch (RemoteException e) {
502 fail();
503 }
504 TestableLooper.get(this).processAllMessages();
505 }
506
Jason Monk51305372017-06-22 11:41:08 -0400507 @Test
Charles He2eda2422017-09-24 17:55:21 +0100508 public void testDisableExpandStatusBar() {
509 mStatusBar.setBarStateForTest(StatusBarState.SHADE);
510 mStatusBar.setUserSetupForTest(true);
511 when(mStatusBar.isDeviceProvisioned()).thenReturn(true);
512
513 mStatusBar.disable(StatusBarManager.DISABLE_NONE,
514 StatusBarManager.DISABLE2_NOTIFICATION_SHADE, false);
515 verify(mNotificationPanelView).setQsExpansionEnabled(false);
516 mStatusBar.animateExpandNotificationsPanel();
517 verify(mNotificationPanelView, never()).expand(anyBoolean());
518 mStatusBar.animateExpandSettingsPanel(null);
519 verify(mNotificationPanelView, never()).expand(anyBoolean());
520
521 mStatusBar.disable(StatusBarManager.DISABLE_NONE, StatusBarManager.DISABLE2_NONE, false);
522 verify(mNotificationPanelView).setQsExpansionEnabled(true);
523 mStatusBar.animateExpandNotificationsPanel();
524 verify(mNotificationPanelView).expand(anyBoolean());
525 mStatusBar.animateExpandSettingsPanel(null);
526 verify(mNotificationPanelView).expand(anyBoolean());
527 }
528
529 @Test
Jason Monk51305372017-06-22 11:41:08 -0400530 public void testDump_DoesNotCrash() {
531 mStatusBar.dump(null, new PrintWriter(new ByteArrayOutputStream()), null);
532 }
533
Jason Monk9c4faa82017-08-15 09:32:27 -0400534 @Test
535 @RunWithLooper(setAsMainLooper = true)
536 public void testUpdateKeyguardState_DoesNotCrash() {
537 mStatusBar.mStatusBarWindow = mock(StatusBarWindowView.class);
538 mStatusBar.mState = StatusBarState.KEYGUARD;
539 mStatusBar.mDozeScrimController = mock(DozeScrimController.class);
540 mStatusBar.mNotificationIconAreaController = mock(NotificationIconAreaController.class);
Eliot Courtney09322282017-11-09 15:31:19 +0900541 mStatusBar.mLockscreenUserManager = mock(NotificationLockscreenUserManager.class);
542 when(mStatusBar.mLockscreenUserManager.getCurrentProfiles()).thenReturn(
543 new SparseArray<>());
Jason Monk9c4faa82017-08-15 09:32:27 -0400544 mStatusBar.updateKeyguardState(false, false);
545 }
546
Lucas Dupinc2e75462017-12-06 13:59:25 -0800547 @Test
548 public void testFingerprintNotification_UpdatesScrims() {
549 mStatusBar.mStatusBarWindowManager = mock(StatusBarWindowManager.class);
Lucas Dupinc2e75462017-12-06 13:59:25 -0800550 mStatusBar.mDozeScrimController = mock(DozeScrimController.class);
551 mStatusBar.notifyFpAuthModeChanged();
552 verify(mScrimController).transitionTo(any(), any());
553 }
554
Lucas Dupin311eac82017-12-11 14:40:07 -0800555 @Test
556 public void testFingerprintUnlock_UpdatesScrims() {
557 // Simulate unlocking from AoD with fingerprint.
558 when(mFingerprintUnlockController.getMode())
559 .thenReturn(FingerprintUnlockController.MODE_WAKE_AND_UNLOCK);
560 mStatusBar.updateScrimController();
561 verify(mScrimController).transitionTo(eq(ScrimState.UNLOCKED), any());
562 }
563
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500564 static class TestableStatusBar extends StatusBar {
Chris Wren27a52fa2017-02-01 14:21:43 -0500565 public TestableStatusBar(StatusBarKeyguardViewManager man,
566 UnlockMethodCache unlock, KeyguardIndicationController key,
Julia Reynolds30203152017-05-26 13:36:31 -0400567 NotificationStackScrollLayout stack, HeadsUpManager hum, NotificationData nd,
Chris Wren621933f2017-06-14 15:59:03 -0400568 PowerManager pm, SystemServicesProxy ssp, NotificationPanelView panelView,
Eliot Courtney3985ad52017-11-17 16:51:52 +0900569 IStatusBarService barService, NotificationListener notificationListener,
570 NotificationLogger notificationLogger, ScrimController scrimController,
Lucas Dupin311eac82017-12-11 14:40:07 -0800571 FingerprintUnlockController fingerprintUnlockController) {
Adrian Roosef7a4022017-01-19 14:48:35 -0800572 mStatusBarKeyguardViewManager = man;
Chris Wren27a52fa2017-02-01 14:21:43 -0500573 mUnlockMethodCache = unlock;
574 mKeyguardIndicationController = key;
575 mStackScroller = stack;
Julia Reynolds30203152017-05-26 13:36:31 -0400576 mHeadsUpManager = hum;
577 mNotificationData = nd;
578 mUseHeadsUp = true;
579 mPowerManager = pm;
580 mSystemServicesProxy = ssp;
Jorim Jaggifd3b1a12017-06-06 17:04:19 -0700581 mNotificationPanel = panelView;
Chris Wren621933f2017-06-14 15:59:03 -0400582 mBarService = barService;
Eliot Courtney3985ad52017-11-17 16:51:52 +0900583 mNotificationListener = notificationListener;
584 mNotificationLogger = notificationLogger;
Adrian Roos6d5ebb72017-08-03 15:10:22 +0200585 mWakefulnessLifecycle = createAwakeWakefulnessLifecycle();
Lucas Dupinc2e75462017-12-06 13:59:25 -0800586 mScrimController = scrimController;
Lucas Dupin311eac82017-12-11 14:40:07 -0800587 mFingerprintUnlockController = fingerprintUnlockController;
Adrian Roos6d5ebb72017-08-03 15:10:22 +0200588 }
589
590 private WakefulnessLifecycle createAwakeWakefulnessLifecycle() {
591 WakefulnessLifecycle wakefulnessLifecycle = new WakefulnessLifecycle();
592 wakefulnessLifecycle.dispatchStartedWakingUp();
593 wakefulnessLifecycle.dispatchFinishedWakingUp();
594 return wakefulnessLifecycle;
Adrian Roosef7a4022017-01-19 14:48:35 -0800595 }
596
Jason Monk9c4faa82017-08-15 09:32:27 -0400597 @Override
598 protected void updateTheme() {
599 // Do nothing for now, until we have more mocking and StatusBar is smaller.
600 }
601
Chris Wren621933f2017-06-14 15:59:03 -0400602 public void setBarStateForTest(int state) {
603 mState = state;
Adrian Roosef7a4022017-01-19 14:48:35 -0800604 }
Charles He2eda2422017-09-24 17:55:21 +0100605
606 public void setUserSetupForTest(boolean userSetup) {
607 mUserSetup = userSetup;
608 }
Adrian Roosef7a4022017-01-19 14:48:35 -0800609 }
Eliot Courtney09322282017-11-09 15:31:19 +0900610}