blob: ac367d20b5c83919e2e93af029455960acd96356 [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;
Jason Monk51305372017-06-22 11:41:08 -040037import android.app.trust.TrustManager;
Jason Monk9c4faa82017-08-15 09:32:27 -040038import android.content.Context;
Jason Monk51305372017-06-22 11:41:08 -040039import 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;
Jason Monk9c4faa82017-08-15 09:32:27 -040053import android.testing.LayoutInflaterBuilder;
Chris Wren621933f2017-06-14 15:59:03 -040054import android.testing.TestableLooper;
55import android.testing.TestableLooper.MessageHandler;
56import android.testing.TestableLooper.RunWithLooper;
Chris Wren27a52fa2017-02-01 14:21:43 -050057import android.util.DisplayMetrics;
Jason Monk9c4faa82017-08-15 09:32:27 -040058import android.view.View;
Jason Monk51305372017-06-22 11:41:08 -040059import android.view.ViewGroup.LayoutParams;
Jason Monk9c4faa82017-08-15 09:32:27 -040060import android.widget.FrameLayout;
Adrian Roosef7a4022017-01-19 14:48:35 -080061
Chris Wrenef319902017-03-07 17:58:31 -050062import com.android.internal.logging.MetricsLogger;
Chris Wren27a52fa2017-02-01 14:21:43 -050063import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
Chris Wrenef319902017-03-07 17:58:31 -050064import com.android.internal.logging.testing.FakeMetricsLogger;
Chris Wren621933f2017-06-14 15:59:03 -040065import com.android.internal.statusbar.IStatusBarService;
Adrian Roosef7a4022017-01-19 14:48:35 -080066import com.android.keyguard.KeyguardHostView.OnDismissAction;
Jason Monk9c4faa82017-08-15 09:32:27 -040067import com.android.keyguard.KeyguardStatusView;
68import com.android.systemui.R;
Adrian Roosef7a4022017-01-19 14:48:35 -080069import com.android.systemui.SysuiTestCase;
Jason Monk9c4faa82017-08-15 09:32:27 -040070import com.android.systemui.assist.AssistManager;
Adrian Roos6d5ebb72017-08-03 15:10:22 +020071import com.android.systemui.keyguard.WakefulnessLifecycle;
Julia Reynolds30203152017-05-26 13:36:31 -040072import com.android.systemui.recents.misc.SystemServicesProxy;
Chris Wren27a52fa2017-02-01 14:21:43 -050073import com.android.systemui.statusbar.ActivatableNotificationView;
Jason Monk5ecf80c2017-07-06 15:28:17 -040074import com.android.systemui.statusbar.CommandQueue;
Chris Wren27a52fa2017-02-01 14:21:43 -050075import com.android.systemui.statusbar.KeyguardIndicationController;
76import com.android.systemui.statusbar.NotificationData;
Chris Wren621933f2017-06-14 15:59:03 -040077import com.android.systemui.statusbar.NotificationData.Entry;
78import com.android.systemui.statusbar.StatusBarState;
Jason Monk9c4faa82017-08-15 09:32:27 -040079import com.android.systemui.statusbar.policy.DateView;
80import com.android.systemui.statusbar.policy.DeviceProvisionedController;
Julia Reynolds30203152017-05-26 13:36:31 -040081import com.android.systemui.statusbar.policy.HeadsUpManager;
Jason Monk9c4faa82017-08-15 09:32:27 -040082import com.android.systemui.statusbar.policy.KeyguardMonitor;
83import com.android.systemui.statusbar.policy.KeyguardMonitorImpl;
Chris Wren27a52fa2017-02-01 14:21:43 -050084import com.android.systemui.statusbar.stack.NotificationStackScrollLayout;
Adrian Roosef7a4022017-01-19 14:48:35 -080085
86import org.junit.Before;
87import org.junit.Test;
88import org.junit.runner.RunWith;
89
Jason Monk51305372017-06-22 11:41:08 -040090import java.io.ByteArrayOutputStream;
91import java.io.PrintWriter;
Chris Wren621933f2017-06-14 15:59:03 -040092import java.util.ArrayList;
93
Adrian Roos02de4982017-02-11 09:35:54 +010094@SmallTest
Chris Wren621933f2017-06-14 15:59:03 -040095@RunWith(AndroidTestingRunner.class)
96@RunWithLooper
Jason Monk2a6ea9c2017-01-26 11:14:51 -050097public class StatusBarTest extends SysuiTestCase {
Adrian Roosef7a4022017-01-19 14:48:35 -080098
99 StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
Chris Wren27a52fa2017-02-01 14:21:43 -0500100 UnlockMethodCache mUnlockMethodCache;
101 KeyguardIndicationController mKeyguardIndicationController;
102 NotificationStackScrollLayout mStackScroller;
Chris Wren621933f2017-06-14 15:59:03 -0400103 TestableStatusBar mStatusBar;
Chris Wrenef319902017-03-07 17:58:31 -0500104 FakeMetricsLogger mMetricsLogger;
Julia Reynolds30203152017-05-26 13:36:31 -0400105 HeadsUpManager mHeadsUpManager;
106 NotificationData mNotificationData;
107 PowerManager mPowerManager;
108 SystemServicesProxy mSystemServicesProxy;
Jorim Jaggifd3b1a12017-06-06 17:04:19 -0700109 NotificationPanelView mNotificationPanelView;
Chris Wren621933f2017-06-14 15:59:03 -0400110 IStatusBarService mBarService;
111 ArrayList<Entry> mNotificationList;
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);
Julia Reynolds30203152017-05-26 13:36:31 -0400137 IPowerManager powerManagerService = mock(IPowerManager.class);
138 HandlerThread handlerThread = new HandlerThread("TestThread");
139 handlerThread.start();
140 mPowerManager = new PowerManager(mContext, powerManagerService,
141 new Handler(handlerThread.getLooper()));
142 when(powerManagerService.isInteractive()).thenReturn(true);
Chris Wren621933f2017-06-14 15:59:03 -0400143 mBarService = mock(IStatusBarService.class);
Julia Reynolds30203152017-05-26 13:36:31 -0400144
Jason Monk8c09ac72017-03-16 11:53:40 -0400145 mDependency.injectTestDependency(MetricsLogger.class, mMetricsLogger);
Chris Wren27a52fa2017-02-01 14:21:43 -0500146 mStatusBar = new TestableStatusBar(mStatusBarKeyguardViewManager, mUnlockMethodCache,
Julia Reynolds30203152017-05-26 13:36:31 -0400147 mKeyguardIndicationController, mStackScroller, mHeadsUpManager,
Chris Wren621933f2017-06-14 15:59:03 -0400148 mNotificationData, mPowerManager, mSystemServicesProxy, mNotificationPanelView,
149 mBarService);
Jason Monk51305372017-06-22 11:41:08 -0400150 mStatusBar.mContext = mContext;
Jason Monk9c4faa82017-08-15 09:32:27 -0400151 mStatusBar.mComponents = mContext.getComponents();
Adrian Roosef7a4022017-01-19 14:48:35 -0800152 doAnswer(invocation -> {
153 OnDismissAction onDismissAction = (OnDismissAction) invocation.getArguments()[0];
154 onDismissAction.onDismiss();
155 return null;
156 }).when(mStatusBarKeyguardViewManager).dismissWithAction(any(), any(), anyBoolean());
157
158 doAnswer(invocation -> {
159 Runnable runnable = (Runnable) invocation.getArguments()[0];
160 runnable.run();
161 return null;
162 }).when(mStatusBarKeyguardViewManager).addAfterKeyguardGoneRunnable(any());
Chris Wren27a52fa2017-02-01 14:21:43 -0500163
164 when(mStackScroller.getActivatedChild()).thenReturn(null);
Chris Wren621933f2017-06-14 15:59:03 -0400165 TestableLooper.get(this).setMessageHandler(new MessageHandler() {
166 @Override
167 public boolean onMessageHandled(Message m) {
168 if (m.getCallback() == mStatusBar.mVisibilityReporter) {
169 return false;
170 }
171 return true;
172 }
173 });
Adrian Roosef7a4022017-01-19 14:48:35 -0800174 }
175
Adrian Roos02de4982017-02-11 09:35:54 +0100176 @Test
Jason Monk5ecf80c2017-07-06 15:28:17 -0400177 public void testSetBouncerShowing_noCrash() {
178 mStatusBar.mCommandQueue = mock(CommandQueue.class);
179 mStatusBar.setBouncerShowing(true);
180 }
181
182 @Test
Adrian Roosef7a4022017-01-19 14:48:35 -0800183 public void executeRunnableDismissingKeyguard_nullRunnable_showingAndOccluded() {
184 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
185 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(true);
186
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500187 mStatusBar.executeRunnableDismissingKeyguard(null, null, false, false, false);
Adrian Roosef7a4022017-01-19 14:48:35 -0800188 }
189
Adrian Roos02de4982017-02-11 09:35:54 +0100190 @Test
Adrian Roosef7a4022017-01-19 14:48:35 -0800191 public void executeRunnableDismissingKeyguard_nullRunnable_showing() {
192 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
193 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
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_notShowing() {
200 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(false);
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
Chris Wren27a52fa2017-02-01 14:21:43 -0500207 public void lockscreenStateMetrics_notShowing() {
208 // uninteresting state, except that fingerprint must be non-zero
209 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
210 when(mUnlockMethodCache.canSkipBouncer()).thenReturn(true);
211 // interesting state
212 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(false);
213 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false);
214 when(mUnlockMethodCache.isMethodSecure()).thenReturn(false);
Chris Wren27a52fa2017-02-01 14:21:43 -0500215 mStatusBar.onKeyguardViewManagerStatesUpdated();
216
Chris Wrenef319902017-03-07 17:58:31 -0500217 MetricsAsserts.assertHasLog("missing hidden insecure lockscreen log",
218 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500219 new LogMaker(MetricsEvent.LOCKSCREEN)
220 .setType(MetricsEvent.TYPE_CLOSE)
221 .setSubtype(0));
222 }
223
Adrian Roos02de4982017-02-11 09:35:54 +0100224 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500225 public void lockscreenStateMetrics_notShowing_secure() {
226 // uninteresting state, except that fingerprint must be non-zero
227 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
228 when(mUnlockMethodCache.canSkipBouncer()).thenReturn(true);
229 // interesting state
230 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(false);
231 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false);
232 when(mUnlockMethodCache.isMethodSecure()).thenReturn(true);
233
234 mStatusBar.onKeyguardViewManagerStatesUpdated();
235
Chris Wrenef319902017-03-07 17:58:31 -0500236 MetricsAsserts.assertHasLog("missing hidden secure lockscreen log",
237 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500238 new LogMaker(MetricsEvent.LOCKSCREEN)
239 .setType(MetricsEvent.TYPE_CLOSE)
240 .setSubtype(1));
241 }
242
Adrian Roos02de4982017-02-11 09:35:54 +0100243 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500244 public void lockscreenStateMetrics_isShowing() {
245 // uninteresting state, except that fingerprint must be non-zero
246 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
247 when(mUnlockMethodCache.canSkipBouncer()).thenReturn(true);
248 // interesting state
249 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
250 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false);
251 when(mUnlockMethodCache.isMethodSecure()).thenReturn(false);
252
253 mStatusBar.onKeyguardViewManagerStatesUpdated();
254
Chris Wrenef319902017-03-07 17:58:31 -0500255 MetricsAsserts.assertHasLog("missing insecure lockscreen showing",
256 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500257 new LogMaker(MetricsEvent.LOCKSCREEN)
258 .setType(MetricsEvent.TYPE_OPEN)
259 .setSubtype(0));
260 }
261
Adrian Roos02de4982017-02-11 09:35:54 +0100262 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500263 public void lockscreenStateMetrics_isShowing_secure() {
264 // uninteresting state, except that fingerprint must be non-zero
265 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
266 when(mUnlockMethodCache.canSkipBouncer()).thenReturn(true);
267 // interesting state
268 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
269 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false);
270 when(mUnlockMethodCache.isMethodSecure()).thenReturn(true);
271
272 mStatusBar.onKeyguardViewManagerStatesUpdated();
273
Chris Wrenef319902017-03-07 17:58:31 -0500274 MetricsAsserts.assertHasLog("missing secure lockscreen showing log",
275 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500276 new LogMaker(MetricsEvent.LOCKSCREEN)
277 .setType(MetricsEvent.TYPE_OPEN)
278 .setSubtype(1));
279 }
280
Adrian Roos02de4982017-02-11 09:35:54 +0100281 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500282 public void lockscreenStateMetrics_isShowingBouncer() {
283 // uninteresting state, except that fingerprint must be non-zero
284 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
285 when(mUnlockMethodCache.canSkipBouncer()).thenReturn(true);
286 // interesting state
287 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
288 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(true);
289 when(mUnlockMethodCache.isMethodSecure()).thenReturn(true);
290
291 mStatusBar.onKeyguardViewManagerStatesUpdated();
292
Chris Wrenef319902017-03-07 17:58:31 -0500293 MetricsAsserts.assertHasLog("missing bouncer log",
294 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500295 new LogMaker(MetricsEvent.BOUNCER)
296 .setType(MetricsEvent.TYPE_OPEN)
297 .setSubtype(1));
298 }
299
Adrian Roos02de4982017-02-11 09:35:54 +0100300 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500301 public void onActivatedMetrics() {
302 ActivatableNotificationView view = mock(ActivatableNotificationView.class);
303 mStatusBar.onActivated(view);
304
Chris Wrenef319902017-03-07 17:58:31 -0500305 MetricsAsserts.assertHasLog("missing lockscreen note tap log",
306 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500307 new LogMaker(MetricsEvent.ACTION_LS_NOTE)
308 .setType(MetricsEvent.TYPE_ACTION));
309 }
310
Julia Reynolds30203152017-05-26 13:36:31 -0400311 @Test
312 public void testShouldPeek_nonSuppressedGroupSummary() {
313 when(mPowerManager.isScreenOn()).thenReturn(true);
314 when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false);
315 when(mNotificationData.shouldSuppressScreenOn(any())).thenReturn(false);
316 when(mNotificationData.shouldFilterOut(any())).thenReturn(false);
317 when(mSystemServicesProxy.isDreaming()).thenReturn(false);
318 when(mNotificationData.getImportance(any())).thenReturn(IMPORTANCE_HIGH);
319
320 Notification n = new Notification.Builder(getContext(), "a")
321 .setGroup("a")
322 .setGroupSummary(true)
323 .setGroupAlertBehavior(Notification.GROUP_ALERT_SUMMARY)
324 .build();
325 StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, "a", 0, 0, n,
326 UserHandle.of(0), null, 0);
327 NotificationData.Entry entry = new NotificationData.Entry(sbn);
328
329 assertTrue(mStatusBar.shouldPeek(entry, sbn));
330 }
331
332 @Test
333 public void testShouldPeek_suppressedGroupSummary() {
334 when(mPowerManager.isScreenOn()).thenReturn(true);
335 when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false);
336 when(mNotificationData.shouldSuppressScreenOn(any())).thenReturn(false);
337 when(mNotificationData.shouldFilterOut(any())).thenReturn(false);
338 when(mSystemServicesProxy.isDreaming()).thenReturn(false);
339 when(mNotificationData.getImportance(any())).thenReturn(IMPORTANCE_HIGH);
340
341 Notification n = new Notification.Builder(getContext(), "a")
342 .setGroup("a")
343 .setGroupSummary(true)
344 .setGroupAlertBehavior(Notification.GROUP_ALERT_CHILDREN)
345 .build();
346 StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, "a", 0, 0, n,
347 UserHandle.of(0), null, 0);
348 NotificationData.Entry entry = new NotificationData.Entry(sbn);
349
350 assertFalse(mStatusBar.shouldPeek(entry, sbn));
351 }
352
Chris Wren621933f2017-06-14 15:59:03 -0400353 @Test
Beverly38159ce2017-07-13 16:39:24 -0400354 public void testShouldPeek_suppressedScreenOn_dozing() {
355 when(mPowerManager.isScreenOn()).thenReturn(true);
356 when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false);
357 when(mNotificationData.shouldFilterOut(any())).thenReturn(false);
358 when(mSystemServicesProxy.isDreaming()).thenReturn(false);
359 when(mNotificationData.getImportance(any())).thenReturn(IMPORTANCE_HIGH);
360
361 mStatusBar.mDozing = true;
362 when(mNotificationData.shouldSuppressScreenOn(any())).thenReturn(true);
363 when(mNotificationData.shouldSuppressScreenOff(any())).thenReturn(false);
364
365 Notification n = new Notification.Builder(getContext(), "a").build();
366 StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, "a", 0, 0, n,
367 UserHandle.of(0), null, 0);
368 NotificationData.Entry entry = new NotificationData.Entry(sbn);
369
370 assertTrue(mStatusBar.shouldPeek(entry, sbn));
371 }
372
373 @Test
374 public void testShouldPeek_suppressedScreenOn_noDoze() {
375 when(mPowerManager.isScreenOn()).thenReturn(true);
376 when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false);
377 when(mNotificationData.shouldFilterOut(any())).thenReturn(false);
378 when(mSystemServicesProxy.isDreaming()).thenReturn(false);
379 when(mNotificationData.getImportance(any())).thenReturn(IMPORTANCE_HIGH);
380
381 mStatusBar.mDozing = false;
382 when(mNotificationData.shouldSuppressScreenOn(any())).thenReturn(true);
383 when(mNotificationData.shouldSuppressScreenOff(any())).thenReturn(false);
384
385 Notification n = new Notification.Builder(getContext(), "a").build();
386 StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, "a", 0, 0, n,
387 UserHandle.of(0), null, 0);
388 NotificationData.Entry entry = new NotificationData.Entry(sbn);
389 assertFalse(mStatusBar.shouldPeek(entry, sbn));
390 }
391 @Test
392 public void testShouldPeek_suppressedScreenOff_dozing() {
393 when(mPowerManager.isScreenOn()).thenReturn(true);
394 when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false);
395 when(mNotificationData.shouldFilterOut(any())).thenReturn(false);
396 when(mSystemServicesProxy.isDreaming()).thenReturn(false);
397 when(mNotificationData.getImportance(any())).thenReturn(IMPORTANCE_HIGH);
398
399 mStatusBar.mDozing = true;
400 when(mNotificationData.shouldSuppressScreenOn(any())).thenReturn(false);
401 when(mNotificationData.shouldSuppressScreenOff(any())).thenReturn(true);
402
403 Notification n = new Notification.Builder(getContext(), "a").build();
404 StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, "a", 0, 0, n,
405 UserHandle.of(0), null, 0);
406 NotificationData.Entry entry = new NotificationData.Entry(sbn);
407 assertFalse(mStatusBar.shouldPeek(entry, sbn));
408 }
409
410 @Test
411 public void testShouldPeek_suppressedScreenOff_noDoze() {
412 when(mPowerManager.isScreenOn()).thenReturn(true);
413 when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false);
414 when(mNotificationData.shouldFilterOut(any())).thenReturn(false);
415 when(mSystemServicesProxy.isDreaming()).thenReturn(false);
416 when(mNotificationData.getImportance(any())).thenReturn(IMPORTANCE_HIGH);
417
418 mStatusBar.mDozing = false;
419 when(mNotificationData.shouldSuppressScreenOn(any())).thenReturn(false);
420 when(mNotificationData.shouldSuppressScreenOff(any())).thenReturn(true);
421
422 Notification n = new Notification.Builder(getContext(), "a").build();
423 StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, "a", 0, 0, n,
424 UserHandle.of(0), null, 0);
425 NotificationData.Entry entry = new NotificationData.Entry(sbn);
426 assertTrue(mStatusBar.shouldPeek(entry, sbn));
427 }
428
429
430 @Test
Chris Wren621933f2017-06-14 15:59:03 -0400431 public void testLogHidden() {
432 try {
433 mStatusBar.handleVisibleToUserChanged(false);
434 verify(mBarService, times(1)).onPanelHidden();
435 verify(mBarService, never()).onPanelRevealed(anyBoolean(), anyInt());
436 } catch (RemoteException e) {
437 fail();
438 }
439 }
440
441 @Test
442 public void testPanelOpenForPeek() {
443 when(mHeadsUpManager.hasPinnedHeadsUp()).thenReturn(true);
444 when(mNotificationData.getActiveNotifications()).thenReturn(mNotificationList);
445 when(mNotificationList.size()).thenReturn(5);
446 when(mNotificationPanelView.isFullyCollapsed()).thenReturn(true);
447 mStatusBar.setBarStateForTest(StatusBarState.SHADE);
448
449 try {
450 mStatusBar.handleVisibleToUserChanged(true);
451
452 verify(mBarService, never()).onPanelHidden();
453 verify(mBarService, times(1)).onPanelRevealed(false, 1);
454 } catch (RemoteException e) {
455 fail();
456 }
457 TestableLooper.get(this).processAllMessages();
458 }
459
460 @Test
461 public void testPanelOpenAndClear() {
462 when(mHeadsUpManager.hasPinnedHeadsUp()).thenReturn(false);
463 when(mNotificationData.getActiveNotifications()).thenReturn(mNotificationList);
464 when(mNotificationList.size()).thenReturn(5);
465 when(mNotificationPanelView.isFullyCollapsed()).thenReturn(false);
466 mStatusBar.setBarStateForTest(StatusBarState.SHADE);
467
468 try {
469 mStatusBar.handleVisibleToUserChanged(true);
470
471 verify(mBarService, never()).onPanelHidden();
472 verify(mBarService, times(1)).onPanelRevealed(true, 5);
473 } catch (RemoteException e) {
474 fail();
475 }
476 TestableLooper.get(this).processAllMessages();
477 }
478
479 @Test
480 public void testPanelOpenAndNoClear() {
481 when(mHeadsUpManager.hasPinnedHeadsUp()).thenReturn(false);
482 when(mNotificationData.getActiveNotifications()).thenReturn(mNotificationList);
483 when(mNotificationList.size()).thenReturn(5);
484 when(mNotificationPanelView.isFullyCollapsed()).thenReturn(false);
485 mStatusBar.setBarStateForTest(StatusBarState.KEYGUARD);
486
487 try {
488 mStatusBar.handleVisibleToUserChanged(true);
489
490 verify(mBarService, never()).onPanelHidden();
491 verify(mBarService, times(1)).onPanelRevealed(false, 5);
492 } catch (RemoteException e) {
493 fail();
494 }
495 TestableLooper.get(this).processAllMessages();
496 }
497
Jason Monk51305372017-06-22 11:41:08 -0400498 @Test
499 public void testDump_DoesNotCrash() {
500 mStatusBar.dump(null, new PrintWriter(new ByteArrayOutputStream()), null);
501 }
502
Jason Monk9c4faa82017-08-15 09:32:27 -0400503 @Test
504 @RunWithLooper(setAsMainLooper = true)
505 public void testUpdateKeyguardState_DoesNotCrash() {
506 mStatusBar.mStatusBarWindow = mock(StatusBarWindowView.class);
507 mStatusBar.mState = StatusBarState.KEYGUARD;
508 mStatusBar.mDozeScrimController = mock(DozeScrimController.class);
509 mStatusBar.mNotificationIconAreaController = mock(NotificationIconAreaController.class);
510 mStatusBar.updateKeyguardState(false, false);
511 }
512
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500513 static class TestableStatusBar extends StatusBar {
Chris Wren27a52fa2017-02-01 14:21:43 -0500514 public TestableStatusBar(StatusBarKeyguardViewManager man,
515 UnlockMethodCache unlock, KeyguardIndicationController key,
Julia Reynolds30203152017-05-26 13:36:31 -0400516 NotificationStackScrollLayout stack, HeadsUpManager hum, NotificationData nd,
Chris Wren621933f2017-06-14 15:59:03 -0400517 PowerManager pm, SystemServicesProxy ssp, NotificationPanelView panelView,
518 IStatusBarService barService) {
Adrian Roosef7a4022017-01-19 14:48:35 -0800519 mStatusBarKeyguardViewManager = man;
Chris Wren27a52fa2017-02-01 14:21:43 -0500520 mUnlockMethodCache = unlock;
521 mKeyguardIndicationController = key;
522 mStackScroller = stack;
Julia Reynolds30203152017-05-26 13:36:31 -0400523 mHeadsUpManager = hum;
524 mNotificationData = nd;
525 mUseHeadsUp = true;
526 mPowerManager = pm;
527 mSystemServicesProxy = ssp;
Jorim Jaggifd3b1a12017-06-06 17:04:19 -0700528 mNotificationPanel = panelView;
Chris Wren621933f2017-06-14 15:59:03 -0400529 mBarService = barService;
Adrian Roos6d5ebb72017-08-03 15:10:22 +0200530 mWakefulnessLifecycle = createAwakeWakefulnessLifecycle();
Jason Monk9c4faa82017-08-15 09:32:27 -0400531 mScrimController = mock(ScrimController.class);
Adrian Roos6d5ebb72017-08-03 15:10:22 +0200532 }
533
534 private WakefulnessLifecycle createAwakeWakefulnessLifecycle() {
535 WakefulnessLifecycle wakefulnessLifecycle = new WakefulnessLifecycle();
536 wakefulnessLifecycle.dispatchStartedWakingUp();
537 wakefulnessLifecycle.dispatchFinishedWakingUp();
538 return wakefulnessLifecycle;
Adrian Roosef7a4022017-01-19 14:48:35 -0800539 }
540
Jason Monk9c4faa82017-08-15 09:32:27 -0400541 @Override
542 protected void updateTheme() {
543 // Do nothing for now, until we have more mocking and StatusBar is smaller.
544 }
545
Chris Wren621933f2017-06-14 15:59:03 -0400546 public void setBarStateForTest(int state) {
547 mState = state;
Adrian Roosef7a4022017-01-19 14:48:35 -0800548 }
549 }
Adrian Roos02de4982017-02-11 09:35:54 +0100550}