blob: db83655058c1da3ddb64879d6952a3b4583a1c97 [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;
Eliot Courtneya6d8cf22017-10-20 13:26:58 +090040import android.content.Context;
Jason Monk51305372017-06-22 11:41:08 -040041import android.hardware.fingerprint.FingerprintManager;
Chris Wren27a52fa2017-02-01 14:21:43 -050042import android.metrics.LogMaker;
Jason Monk9c4faa82017-08-15 09:32:27 -040043import android.os.Binder;
Julia Reynolds30203152017-05-26 13:36:31 -040044import android.os.Handler;
45import android.os.HandlerThread;
46import android.os.IPowerManager;
Julia Reynolds30203152017-05-26 13:36:31 -040047import android.os.PowerManager;
Chris Wren621933f2017-06-14 15:59:03 -040048import android.os.RemoteException;
Julia Reynolds30203152017-05-26 13:36:31 -040049import android.os.UserHandle;
50import android.service.notification.StatusBarNotification;
Adrian Roosef7a4022017-01-19 14:48:35 -080051import android.support.test.filters.SmallTest;
Chris Wren27a52fa2017-02-01 14:21:43 -050052import android.support.test.metricshelper.MetricsAsserts;
Chris Wren621933f2017-06-14 15:59:03 -040053import android.testing.AndroidTestingRunner;
54import android.testing.TestableLooper;
Chris Wren621933f2017-06-14 15:59:03 -040055import 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;
Eliot Courtneya6d8cf22017-10-20 13:26:58 +090065import com.android.systemui.ForegroundServiceController;
Jason Monk9c4faa82017-08-15 09:32:27 -040066import com.android.systemui.R;
Adrian Roosef7a4022017-01-19 14:48:35 -080067import com.android.systemui.SysuiTestCase;
Eliot Courtney3985ad52017-11-17 16:51:52 +090068import com.android.systemui.UiOffloadThread;
Jason Monk9c4faa82017-08-15 09:32:27 -040069import com.android.systemui.assist.AssistManager;
Adrian Roos6d5ebb72017-08-03 15:10:22 +020070import com.android.systemui.keyguard.WakefulnessLifecycle;
Julia Reynolds30203152017-05-26 13:36:31 -040071import com.android.systemui.recents.misc.SystemServicesProxy;
Chris Wren27a52fa2017-02-01 14:21:43 -050072import com.android.systemui.statusbar.ActivatableNotificationView;
Jason Monk5ecf80c2017-07-06 15:28:17 -040073import com.android.systemui.statusbar.CommandQueue;
Chris Wren27a52fa2017-02-01 14:21:43 -050074import com.android.systemui.statusbar.KeyguardIndicationController;
75import com.android.systemui.statusbar.NotificationData;
Chris Wren621933f2017-06-14 15:59:03 -040076import com.android.systemui.statusbar.NotificationData.Entry;
Eliot Courtneya6d8cf22017-10-20 13:26:58 +090077import com.android.systemui.statusbar.NotificationEntryManager;
78import com.android.systemui.statusbar.NotificationGutsManager;
Eliot Courtney3985ad52017-11-17 16:51:52 +090079import com.android.systemui.statusbar.NotificationListener;
Eliot Courtney09322282017-11-09 15:31:19 +090080import com.android.systemui.statusbar.NotificationLockscreenUserManager;
Eliot Courtney3985ad52017-11-17 16:51:52 +090081import com.android.systemui.statusbar.NotificationLogger;
Eliot Courtneya6d8cf22017-10-20 13:26:58 +090082import com.android.systemui.statusbar.NotificationMediaManager;
83import com.android.systemui.statusbar.NotificationPresenter;
84import com.android.systemui.statusbar.NotificationRemoteInputManager;
Chris Wren621933f2017-06-14 15:59:03 -040085import com.android.systemui.statusbar.StatusBarState;
Eliot Courtneya6d8cf22017-10-20 13:26:58 +090086import com.android.systemui.statusbar.notification.VisualStabilityManager;
Jason Monk9c4faa82017-08-15 09:32:27 -040087import com.android.systemui.statusbar.policy.DeviceProvisionedController;
Julia Reynolds30203152017-05-26 13:36:31 -040088import com.android.systemui.statusbar.policy.HeadsUpManager;
Jason Monk9c4faa82017-08-15 09:32:27 -040089import com.android.systemui.statusbar.policy.KeyguardMonitor;
90import com.android.systemui.statusbar.policy.KeyguardMonitorImpl;
Chris Wren27a52fa2017-02-01 14:21:43 -050091import com.android.systemui.statusbar.stack.NotificationStackScrollLayout;
Adrian Roosef7a4022017-01-19 14:48:35 -080092
93import org.junit.Before;
94import org.junit.Test;
95import org.junit.runner.RunWith;
96
Jason Monk51305372017-06-22 11:41:08 -040097import java.io.ByteArrayOutputStream;
98import java.io.PrintWriter;
Chris Wren621933f2017-06-14 15:59:03 -040099import java.util.ArrayList;
100
Adrian Roos02de4982017-02-11 09:35:54 +0100101@SmallTest
Chris Wren621933f2017-06-14 15:59:03 -0400102@RunWith(AndroidTestingRunner.class)
103@RunWithLooper
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500104public class StatusBarTest extends SysuiTestCase {
Adrian Roosef7a4022017-01-19 14:48:35 -0800105
106 StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
Chris Wren27a52fa2017-02-01 14:21:43 -0500107 UnlockMethodCache mUnlockMethodCache;
108 KeyguardIndicationController mKeyguardIndicationController;
109 NotificationStackScrollLayout mStackScroller;
Chris Wren621933f2017-06-14 15:59:03 -0400110 TestableStatusBar mStatusBar;
Chris Wrenef319902017-03-07 17:58:31 -0500111 FakeMetricsLogger mMetricsLogger;
Julia Reynolds30203152017-05-26 13:36:31 -0400112 HeadsUpManager mHeadsUpManager;
113 NotificationData mNotificationData;
114 PowerManager mPowerManager;
115 SystemServicesProxy mSystemServicesProxy;
Jorim Jaggifd3b1a12017-06-06 17:04:19 -0700116 NotificationPanelView mNotificationPanelView;
Lucas Dupinc2e75462017-12-06 13:59:25 -0800117 ScrimController mScrimController;
Chris Wren621933f2017-06-14 15:59:03 -0400118 IStatusBarService mBarService;
Eliot Courtney3985ad52017-11-17 16:51:52 +0900119 NotificationListener mNotificationListener;
120 NotificationLogger mNotificationLogger;
Chris Wren621933f2017-06-14 15:59:03 -0400121 ArrayList<Entry> mNotificationList;
Lucas Dupin311eac82017-12-11 14:40:07 -0800122 FingerprintUnlockController mFingerprintUnlockController;
Chris Wren27a52fa2017-02-01 14:21:43 -0500123 private DisplayMetrics mDisplayMetrics = new DisplayMetrics();
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900124 private TestableNotificationEntryManager mEntryManager;
Chris Wren27a52fa2017-02-01 14:21:43 -0500125
Adrian Roos02de4982017-02-11 09:35:54 +0100126 @Before
Julia Reynolds30203152017-05-26 13:36:31 -0400127 public void setup() throws Exception {
Jason Monk9c4faa82017-08-15 09:32:27 -0400128 mContext.setTheme(R.style.Theme_SystemUI_Light);
129 mDependency.injectMockDependency(AssistManager.class);
130 mDependency.injectMockDependency(DeviceProvisionedController.class);
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900131 mDependency.injectMockDependency(NotificationGroupManager.class);
132 mDependency.injectMockDependency(NotificationGutsManager.class);
133 mDependency.injectMockDependency(NotificationRemoteInputManager.class);
134 mDependency.injectMockDependency(NotificationMediaManager.class);
135 mDependency.injectMockDependency(ForegroundServiceController.class);
136 mDependency.injectMockDependency(NotificationListener.class);
Jason Monk9c4faa82017-08-15 09:32:27 -0400137 mDependency.injectTestDependency(KeyguardMonitor.class, mock(KeyguardMonitorImpl.class));
138 CommandQueue commandQueue = mock(CommandQueue.class);
139 when(commandQueue.asBinder()).thenReturn(new Binder());
140 mContext.putComponent(CommandQueue.class, commandQueue);
Jason Monk51305372017-06-22 11:41:08 -0400141 mContext.addMockSystemService(TrustManager.class, mock(TrustManager.class));
142 mContext.addMockSystemService(FingerprintManager.class, mock(FingerprintManager.class));
Adrian Roosef7a4022017-01-19 14:48:35 -0800143 mStatusBarKeyguardViewManager = mock(StatusBarKeyguardViewManager.class);
Chris Wren27a52fa2017-02-01 14:21:43 -0500144 mUnlockMethodCache = mock(UnlockMethodCache.class);
145 mKeyguardIndicationController = mock(KeyguardIndicationController.class);
146 mStackScroller = mock(NotificationStackScrollLayout.class);
Jason Monk9c4faa82017-08-15 09:32:27 -0400147 when(mStackScroller.generateLayoutParams(any())).thenReturn(new LayoutParams(0, 0));
Chris Wrenef319902017-03-07 17:58:31 -0500148 mMetricsLogger = new FakeMetricsLogger();
Julia Reynolds30203152017-05-26 13:36:31 -0400149 mHeadsUpManager = mock(HeadsUpManager.class);
150 mNotificationData = mock(NotificationData.class);
151 mSystemServicesProxy = mock(SystemServicesProxy.class);
Jorim Jaggifd3b1a12017-06-06 17:04:19 -0700152 mNotificationPanelView = mock(NotificationPanelView.class);
Jason Monk51305372017-06-22 11:41:08 -0400153 when(mNotificationPanelView.getLayoutParams()).thenReturn(new LayoutParams(0, 0));
Chris Wren621933f2017-06-14 15:59:03 -0400154 mNotificationList = mock(ArrayList.class);
Lucas Dupinc2e75462017-12-06 13:59:25 -0800155 mScrimController = mock(ScrimController.class);
Lucas Dupin311eac82017-12-11 14:40:07 -0800156 mFingerprintUnlockController = mock(FingerprintUnlockController.class);
Julia Reynolds30203152017-05-26 13:36:31 -0400157 IPowerManager powerManagerService = mock(IPowerManager.class);
158 HandlerThread handlerThread = new HandlerThread("TestThread");
159 handlerThread.start();
160 mPowerManager = new PowerManager(mContext, powerManagerService,
161 new Handler(handlerThread.getLooper()));
162 when(powerManagerService.isInteractive()).thenReturn(true);
Chris Wren621933f2017-06-14 15:59:03 -0400163 mBarService = mock(IStatusBarService.class);
Eliot Courtney3985ad52017-11-17 16:51:52 +0900164 mNotificationListener = mock(NotificationListener.class);
165 mNotificationLogger = new NotificationLogger(mNotificationListener, mDependency.get(
166 UiOffloadThread.class));
Julia Reynolds30203152017-05-26 13:36:31 -0400167
Jason Monk8c09ac72017-03-16 11:53:40 -0400168 mDependency.injectTestDependency(MetricsLogger.class, mMetricsLogger);
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900169
170 mNotificationListener = mDependency.get(NotificationListener.class);
171 mNotificationLogger = mDependency.get(NotificationLogger.class);
172 mEntryManager = new TestableNotificationEntryManager(mMetricsLogger,
173 mSystemServicesProxy, mPowerManager, mContext);
174
Chris Wren27a52fa2017-02-01 14:21:43 -0500175 mStatusBar = new TestableStatusBar(mStatusBarKeyguardViewManager, mUnlockMethodCache,
Julia Reynolds30203152017-05-26 13:36:31 -0400176 mKeyguardIndicationController, mStackScroller, mHeadsUpManager,
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900177 mPowerManager, mNotificationPanelView, mBarService, mNotificationListener,
178 mNotificationLogger, mEntryManager, mScrimController, mFingerprintUnlockController);
Jason Monk51305372017-06-22 11:41:08 -0400179 mStatusBar.mContext = mContext;
Jason Monk9c4faa82017-08-15 09:32:27 -0400180 mStatusBar.mComponents = mContext.getComponents();
Adrian Roosef7a4022017-01-19 14:48:35 -0800181 doAnswer(invocation -> {
182 OnDismissAction onDismissAction = (OnDismissAction) invocation.getArguments()[0];
183 onDismissAction.onDismiss();
184 return null;
185 }).when(mStatusBarKeyguardViewManager).dismissWithAction(any(), any(), anyBoolean());
186
187 doAnswer(invocation -> {
188 Runnable runnable = (Runnable) invocation.getArguments()[0];
189 runnable.run();
190 return null;
191 }).when(mStatusBarKeyguardViewManager).addAfterKeyguardGoneRunnable(any());
Chris Wren27a52fa2017-02-01 14:21:43 -0500192
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900193 mEntryManager.setUpForTest(mStatusBar, mStackScroller, mStatusBar,
194 mock(VisualStabilityManager.class), mHeadsUpManager, mNotificationData);
Eliot Courtney3985ad52017-11-17 16:51:52 +0900195 mNotificationLogger.setUpWithPresenter(mStatusBar, mStackScroller);
196
Chris Wren27a52fa2017-02-01 14:21:43 -0500197 when(mStackScroller.getActivatedChild()).thenReturn(null);
Eliot Courtney3985ad52017-11-17 16:51:52 +0900198 TestableLooper.get(this).setMessageHandler(m -> {
199 if (m.getCallback() == mStatusBar.mNotificationLogger.getVisibilityReporter()) {
200 return false;
Chris Wren621933f2017-06-14 15:59:03 -0400201 }
Eliot Courtney3985ad52017-11-17 16:51:52 +0900202 return true;
Chris Wren621933f2017-06-14 15:59:03 -0400203 });
Adrian Roosef7a4022017-01-19 14:48:35 -0800204 }
205
Adrian Roos02de4982017-02-11 09:35:54 +0100206 @Test
Jason Monk5ecf80c2017-07-06 15:28:17 -0400207 public void testSetBouncerShowing_noCrash() {
208 mStatusBar.mCommandQueue = mock(CommandQueue.class);
209 mStatusBar.setBouncerShowing(true);
210 }
211
212 @Test
Adrian Roosef7a4022017-01-19 14:48:35 -0800213 public void executeRunnableDismissingKeyguard_nullRunnable_showingAndOccluded() {
214 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
215 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(true);
216
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500217 mStatusBar.executeRunnableDismissingKeyguard(null, null, false, false, false);
Adrian Roosef7a4022017-01-19 14:48:35 -0800218 }
219
Adrian Roos02de4982017-02-11 09:35:54 +0100220 @Test
Adrian Roosef7a4022017-01-19 14:48:35 -0800221 public void executeRunnableDismissingKeyguard_nullRunnable_showing() {
222 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
223 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
224
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500225 mStatusBar.executeRunnableDismissingKeyguard(null, null, false, false, false);
Adrian Roosef7a4022017-01-19 14:48:35 -0800226 }
227
Adrian Roos02de4982017-02-11 09:35:54 +0100228 @Test
Adrian Roosef7a4022017-01-19 14:48:35 -0800229 public void executeRunnableDismissingKeyguard_nullRunnable_notShowing() {
230 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(false);
231 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
232
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500233 mStatusBar.executeRunnableDismissingKeyguard(null, null, false, false, false);
Adrian Roosef7a4022017-01-19 14:48:35 -0800234 }
235
Adrian Roos02de4982017-02-11 09:35:54 +0100236 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500237 public void lockscreenStateMetrics_notShowing() {
238 // uninteresting state, except that fingerprint must be non-zero
239 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
240 when(mUnlockMethodCache.canSkipBouncer()).thenReturn(true);
241 // interesting state
242 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(false);
243 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false);
244 when(mUnlockMethodCache.isMethodSecure()).thenReturn(false);
Chris Wren27a52fa2017-02-01 14:21:43 -0500245 mStatusBar.onKeyguardViewManagerStatesUpdated();
246
Chris Wrenef319902017-03-07 17:58:31 -0500247 MetricsAsserts.assertHasLog("missing hidden insecure lockscreen log",
248 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500249 new LogMaker(MetricsEvent.LOCKSCREEN)
250 .setType(MetricsEvent.TYPE_CLOSE)
251 .setSubtype(0));
252 }
253
Adrian Roos02de4982017-02-11 09:35:54 +0100254 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500255 public void lockscreenStateMetrics_notShowing_secure() {
256 // uninteresting state, except that fingerprint must be non-zero
257 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
258 when(mUnlockMethodCache.canSkipBouncer()).thenReturn(true);
259 // interesting state
260 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(false);
261 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false);
262 when(mUnlockMethodCache.isMethodSecure()).thenReturn(true);
263
264 mStatusBar.onKeyguardViewManagerStatesUpdated();
265
Chris Wrenef319902017-03-07 17:58:31 -0500266 MetricsAsserts.assertHasLog("missing hidden secure lockscreen log",
267 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500268 new LogMaker(MetricsEvent.LOCKSCREEN)
269 .setType(MetricsEvent.TYPE_CLOSE)
270 .setSubtype(1));
271 }
272
Adrian Roos02de4982017-02-11 09:35:54 +0100273 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500274 public void lockscreenStateMetrics_isShowing() {
275 // uninteresting state, except that fingerprint must be non-zero
276 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
277 when(mUnlockMethodCache.canSkipBouncer()).thenReturn(true);
278 // interesting state
279 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
280 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false);
281 when(mUnlockMethodCache.isMethodSecure()).thenReturn(false);
282
283 mStatusBar.onKeyguardViewManagerStatesUpdated();
284
Chris Wrenef319902017-03-07 17:58:31 -0500285 MetricsAsserts.assertHasLog("missing insecure lockscreen showing",
286 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500287 new LogMaker(MetricsEvent.LOCKSCREEN)
288 .setType(MetricsEvent.TYPE_OPEN)
289 .setSubtype(0));
290 }
291
Adrian Roos02de4982017-02-11 09:35:54 +0100292 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500293 public void lockscreenStateMetrics_isShowing_secure() {
294 // uninteresting state, except that fingerprint must be non-zero
295 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
296 when(mUnlockMethodCache.canSkipBouncer()).thenReturn(true);
297 // interesting state
298 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
299 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false);
300 when(mUnlockMethodCache.isMethodSecure()).thenReturn(true);
301
302 mStatusBar.onKeyguardViewManagerStatesUpdated();
303
Chris Wrenef319902017-03-07 17:58:31 -0500304 MetricsAsserts.assertHasLog("missing secure lockscreen showing log",
305 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500306 new LogMaker(MetricsEvent.LOCKSCREEN)
307 .setType(MetricsEvent.TYPE_OPEN)
308 .setSubtype(1));
309 }
310
Adrian Roos02de4982017-02-11 09:35:54 +0100311 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500312 public void lockscreenStateMetrics_isShowingBouncer() {
313 // uninteresting state, except that fingerprint must be non-zero
314 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
315 when(mUnlockMethodCache.canSkipBouncer()).thenReturn(true);
316 // interesting state
317 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
318 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(true);
319 when(mUnlockMethodCache.isMethodSecure()).thenReturn(true);
320
321 mStatusBar.onKeyguardViewManagerStatesUpdated();
322
Chris Wrenef319902017-03-07 17:58:31 -0500323 MetricsAsserts.assertHasLog("missing bouncer log",
324 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500325 new LogMaker(MetricsEvent.BOUNCER)
326 .setType(MetricsEvent.TYPE_OPEN)
327 .setSubtype(1));
328 }
329
Adrian Roos02de4982017-02-11 09:35:54 +0100330 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500331 public void onActivatedMetrics() {
332 ActivatableNotificationView view = mock(ActivatableNotificationView.class);
333 mStatusBar.onActivated(view);
334
Chris Wrenef319902017-03-07 17:58:31 -0500335 MetricsAsserts.assertHasLog("missing lockscreen note tap log",
336 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500337 new LogMaker(MetricsEvent.ACTION_LS_NOTE)
338 .setType(MetricsEvent.TYPE_ACTION));
339 }
340
Julia Reynolds30203152017-05-26 13:36:31 -0400341 @Test
342 public void testShouldPeek_nonSuppressedGroupSummary() {
343 when(mPowerManager.isScreenOn()).thenReturn(true);
344 when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false);
345 when(mNotificationData.shouldSuppressScreenOn(any())).thenReturn(false);
346 when(mNotificationData.shouldFilterOut(any())).thenReturn(false);
347 when(mSystemServicesProxy.isDreaming()).thenReturn(false);
348 when(mNotificationData.getImportance(any())).thenReturn(IMPORTANCE_HIGH);
349
350 Notification n = new Notification.Builder(getContext(), "a")
351 .setGroup("a")
352 .setGroupSummary(true)
353 .setGroupAlertBehavior(Notification.GROUP_ALERT_SUMMARY)
354 .build();
355 StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, "a", 0, 0, n,
356 UserHandle.of(0), null, 0);
357 NotificationData.Entry entry = new NotificationData.Entry(sbn);
358
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900359 assertTrue(mEntryManager.shouldPeek(entry, sbn));
Julia Reynolds30203152017-05-26 13:36:31 -0400360 }
361
362 @Test
363 public void testShouldPeek_suppressedGroupSummary() {
364 when(mPowerManager.isScreenOn()).thenReturn(true);
365 when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false);
366 when(mNotificationData.shouldSuppressScreenOn(any())).thenReturn(false);
367 when(mNotificationData.shouldFilterOut(any())).thenReturn(false);
368 when(mSystemServicesProxy.isDreaming()).thenReturn(false);
369 when(mNotificationData.getImportance(any())).thenReturn(IMPORTANCE_HIGH);
370
371 Notification n = new Notification.Builder(getContext(), "a")
372 .setGroup("a")
373 .setGroupSummary(true)
374 .setGroupAlertBehavior(Notification.GROUP_ALERT_CHILDREN)
375 .build();
376 StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, "a", 0, 0, n,
377 UserHandle.of(0), null, 0);
378 NotificationData.Entry entry = new NotificationData.Entry(sbn);
379
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900380 assertFalse(mEntryManager.shouldPeek(entry, sbn));
Julia Reynolds30203152017-05-26 13:36:31 -0400381 }
382
Chris Wren621933f2017-06-14 15:59:03 -0400383 @Test
Beverly38159ce2017-07-13 16:39:24 -0400384 public void testShouldPeek_suppressedScreenOn_dozing() {
385 when(mPowerManager.isScreenOn()).thenReturn(true);
386 when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false);
387 when(mNotificationData.shouldFilterOut(any())).thenReturn(false);
388 when(mSystemServicesProxy.isDreaming()).thenReturn(false);
389 when(mNotificationData.getImportance(any())).thenReturn(IMPORTANCE_HIGH);
390
391 mStatusBar.mDozing = true;
392 when(mNotificationData.shouldSuppressScreenOn(any())).thenReturn(true);
393 when(mNotificationData.shouldSuppressScreenOff(any())).thenReturn(false);
394
395 Notification n = new Notification.Builder(getContext(), "a").build();
396 StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, "a", 0, 0, n,
397 UserHandle.of(0), null, 0);
398 NotificationData.Entry entry = new NotificationData.Entry(sbn);
399
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900400 assertTrue(mEntryManager.shouldPeek(entry, sbn));
Beverly38159ce2017-07-13 16:39:24 -0400401 }
402
403 @Test
404 public void testShouldPeek_suppressedScreenOn_noDoze() {
405 when(mPowerManager.isScreenOn()).thenReturn(true);
406 when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false);
407 when(mNotificationData.shouldFilterOut(any())).thenReturn(false);
408 when(mSystemServicesProxy.isDreaming()).thenReturn(false);
409 when(mNotificationData.getImportance(any())).thenReturn(IMPORTANCE_HIGH);
410
411 mStatusBar.mDozing = false;
412 when(mNotificationData.shouldSuppressScreenOn(any())).thenReturn(true);
413 when(mNotificationData.shouldSuppressScreenOff(any())).thenReturn(false);
414
415 Notification n = new Notification.Builder(getContext(), "a").build();
416 StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, "a", 0, 0, n,
417 UserHandle.of(0), null, 0);
418 NotificationData.Entry entry = new NotificationData.Entry(sbn);
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900419 assertFalse(mEntryManager.shouldPeek(entry, sbn));
Beverly38159ce2017-07-13 16:39:24 -0400420 }
421 @Test
422 public void testShouldPeek_suppressedScreenOff_dozing() {
423 when(mPowerManager.isScreenOn()).thenReturn(true);
424 when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false);
425 when(mNotificationData.shouldFilterOut(any())).thenReturn(false);
426 when(mSystemServicesProxy.isDreaming()).thenReturn(false);
427 when(mNotificationData.getImportance(any())).thenReturn(IMPORTANCE_HIGH);
428
429 mStatusBar.mDozing = true;
430 when(mNotificationData.shouldSuppressScreenOn(any())).thenReturn(false);
431 when(mNotificationData.shouldSuppressScreenOff(any())).thenReturn(true);
432
433 Notification n = new Notification.Builder(getContext(), "a").build();
434 StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, "a", 0, 0, n,
435 UserHandle.of(0), null, 0);
436 NotificationData.Entry entry = new NotificationData.Entry(sbn);
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900437 assertFalse(mEntryManager.shouldPeek(entry, sbn));
Beverly38159ce2017-07-13 16:39:24 -0400438 }
439
440 @Test
441 public void testShouldPeek_suppressedScreenOff_noDoze() {
442 when(mPowerManager.isScreenOn()).thenReturn(true);
443 when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false);
444 when(mNotificationData.shouldFilterOut(any())).thenReturn(false);
445 when(mSystemServicesProxy.isDreaming()).thenReturn(false);
446 when(mNotificationData.getImportance(any())).thenReturn(IMPORTANCE_HIGH);
447
448 mStatusBar.mDozing = false;
449 when(mNotificationData.shouldSuppressScreenOn(any())).thenReturn(false);
450 when(mNotificationData.shouldSuppressScreenOff(any())).thenReturn(true);
451
452 Notification n = new Notification.Builder(getContext(), "a").build();
453 StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, "a", 0, 0, n,
454 UserHandle.of(0), null, 0);
455 NotificationData.Entry entry = new NotificationData.Entry(sbn);
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900456 assertTrue(mEntryManager.shouldPeek(entry, sbn));
Beverly38159ce2017-07-13 16:39:24 -0400457 }
458
459
460 @Test
Chris Wren621933f2017-06-14 15:59:03 -0400461 public void testLogHidden() {
462 try {
463 mStatusBar.handleVisibleToUserChanged(false);
Selim Cinek1a891a92017-12-04 17:41:27 +0100464 waitForUiOffloadThread();
Chris Wren621933f2017-06-14 15:59:03 -0400465 verify(mBarService, times(1)).onPanelHidden();
466 verify(mBarService, never()).onPanelRevealed(anyBoolean(), anyInt());
467 } catch (RemoteException e) {
468 fail();
469 }
470 }
471
472 @Test
473 public void testPanelOpenForPeek() {
474 when(mHeadsUpManager.hasPinnedHeadsUp()).thenReturn(true);
475 when(mNotificationData.getActiveNotifications()).thenReturn(mNotificationList);
476 when(mNotificationList.size()).thenReturn(5);
477 when(mNotificationPanelView.isFullyCollapsed()).thenReturn(true);
478 mStatusBar.setBarStateForTest(StatusBarState.SHADE);
479
480 try {
481 mStatusBar.handleVisibleToUserChanged(true);
Selim Cinek1a891a92017-12-04 17:41:27 +0100482 waitForUiOffloadThread();
Chris Wren621933f2017-06-14 15:59:03 -0400483 verify(mBarService, never()).onPanelHidden();
484 verify(mBarService, times(1)).onPanelRevealed(false, 1);
485 } catch (RemoteException e) {
486 fail();
487 }
488 TestableLooper.get(this).processAllMessages();
489 }
490
491 @Test
492 public void testPanelOpenAndClear() {
493 when(mHeadsUpManager.hasPinnedHeadsUp()).thenReturn(false);
494 when(mNotificationData.getActiveNotifications()).thenReturn(mNotificationList);
495 when(mNotificationList.size()).thenReturn(5);
496 when(mNotificationPanelView.isFullyCollapsed()).thenReturn(false);
497 mStatusBar.setBarStateForTest(StatusBarState.SHADE);
498
499 try {
500 mStatusBar.handleVisibleToUserChanged(true);
Selim Cinek1a891a92017-12-04 17:41:27 +0100501 waitForUiOffloadThread();
Chris Wren621933f2017-06-14 15:59:03 -0400502 verify(mBarService, never()).onPanelHidden();
503 verify(mBarService, times(1)).onPanelRevealed(true, 5);
504 } catch (RemoteException e) {
505 fail();
506 }
507 TestableLooper.get(this).processAllMessages();
508 }
509
510 @Test
511 public void testPanelOpenAndNoClear() {
512 when(mHeadsUpManager.hasPinnedHeadsUp()).thenReturn(false);
513 when(mNotificationData.getActiveNotifications()).thenReturn(mNotificationList);
514 when(mNotificationList.size()).thenReturn(5);
515 when(mNotificationPanelView.isFullyCollapsed()).thenReturn(false);
516 mStatusBar.setBarStateForTest(StatusBarState.KEYGUARD);
517
518 try {
519 mStatusBar.handleVisibleToUserChanged(true);
Selim Cinek1a891a92017-12-04 17:41:27 +0100520 waitForUiOffloadThread();
Chris Wren621933f2017-06-14 15:59:03 -0400521 verify(mBarService, never()).onPanelHidden();
522 verify(mBarService, times(1)).onPanelRevealed(false, 5);
523 } catch (RemoteException e) {
524 fail();
525 }
526 TestableLooper.get(this).processAllMessages();
527 }
528
Jason Monk51305372017-06-22 11:41:08 -0400529 @Test
Charles He2eda2422017-09-24 17:55:21 +0100530 public void testDisableExpandStatusBar() {
531 mStatusBar.setBarStateForTest(StatusBarState.SHADE);
532 mStatusBar.setUserSetupForTest(true);
533 when(mStatusBar.isDeviceProvisioned()).thenReturn(true);
534
535 mStatusBar.disable(StatusBarManager.DISABLE_NONE,
536 StatusBarManager.DISABLE2_NOTIFICATION_SHADE, false);
537 verify(mNotificationPanelView).setQsExpansionEnabled(false);
538 mStatusBar.animateExpandNotificationsPanel();
539 verify(mNotificationPanelView, never()).expand(anyBoolean());
540 mStatusBar.animateExpandSettingsPanel(null);
541 verify(mNotificationPanelView, never()).expand(anyBoolean());
542
543 mStatusBar.disable(StatusBarManager.DISABLE_NONE, StatusBarManager.DISABLE2_NONE, false);
544 verify(mNotificationPanelView).setQsExpansionEnabled(true);
545 mStatusBar.animateExpandNotificationsPanel();
546 verify(mNotificationPanelView).expand(anyBoolean());
547 mStatusBar.animateExpandSettingsPanel(null);
548 verify(mNotificationPanelView).expand(anyBoolean());
549 }
550
551 @Test
Jason Monk51305372017-06-22 11:41:08 -0400552 public void testDump_DoesNotCrash() {
553 mStatusBar.dump(null, new PrintWriter(new ByteArrayOutputStream()), null);
554 }
555
Jason Monk9c4faa82017-08-15 09:32:27 -0400556 @Test
557 @RunWithLooper(setAsMainLooper = true)
558 public void testUpdateKeyguardState_DoesNotCrash() {
559 mStatusBar.mStatusBarWindow = mock(StatusBarWindowView.class);
560 mStatusBar.mState = StatusBarState.KEYGUARD;
561 mStatusBar.mDozeScrimController = mock(DozeScrimController.class);
562 mStatusBar.mNotificationIconAreaController = mock(NotificationIconAreaController.class);
Eliot Courtney09322282017-11-09 15:31:19 +0900563 mStatusBar.mLockscreenUserManager = mock(NotificationLockscreenUserManager.class);
564 when(mStatusBar.mLockscreenUserManager.getCurrentProfiles()).thenReturn(
565 new SparseArray<>());
Jason Monk9c4faa82017-08-15 09:32:27 -0400566 mStatusBar.updateKeyguardState(false, false);
567 }
568
Lucas Dupinc2e75462017-12-06 13:59:25 -0800569 @Test
570 public void testFingerprintNotification_UpdatesScrims() {
571 mStatusBar.mStatusBarWindowManager = mock(StatusBarWindowManager.class);
Lucas Dupinc2e75462017-12-06 13:59:25 -0800572 mStatusBar.mDozeScrimController = mock(DozeScrimController.class);
573 mStatusBar.notifyFpAuthModeChanged();
574 verify(mScrimController).transitionTo(any(), any());
575 }
576
Lucas Dupin311eac82017-12-11 14:40:07 -0800577 @Test
578 public void testFingerprintUnlock_UpdatesScrims() {
579 // Simulate unlocking from AoD with fingerprint.
580 when(mFingerprintUnlockController.getMode())
581 .thenReturn(FingerprintUnlockController.MODE_WAKE_AND_UNLOCK);
582 mStatusBar.updateScrimController();
583 verify(mScrimController).transitionTo(eq(ScrimState.UNLOCKED), any());
584 }
585
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500586 static class TestableStatusBar extends StatusBar {
Chris Wren27a52fa2017-02-01 14:21:43 -0500587 public TestableStatusBar(StatusBarKeyguardViewManager man,
588 UnlockMethodCache unlock, KeyguardIndicationController key,
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900589 NotificationStackScrollLayout stack, HeadsUpManager hum,
590 PowerManager pm, NotificationPanelView panelView,
Eliot Courtney3985ad52017-11-17 16:51:52 +0900591 IStatusBarService barService, NotificationListener notificationListener,
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900592 NotificationLogger notificationLogger,
593 TestableNotificationEntryManager entryManager, ScrimController scrimController,
Lucas Dupin311eac82017-12-11 14:40:07 -0800594 FingerprintUnlockController fingerprintUnlockController) {
Adrian Roosef7a4022017-01-19 14:48:35 -0800595 mStatusBarKeyguardViewManager = man;
Chris Wren27a52fa2017-02-01 14:21:43 -0500596 mUnlockMethodCache = unlock;
597 mKeyguardIndicationController = key;
598 mStackScroller = stack;
Julia Reynolds30203152017-05-26 13:36:31 -0400599 mHeadsUpManager = hum;
Julia Reynolds30203152017-05-26 13:36:31 -0400600 mPowerManager = pm;
Jorim Jaggifd3b1a12017-06-06 17:04:19 -0700601 mNotificationPanel = panelView;
Chris Wren621933f2017-06-14 15:59:03 -0400602 mBarService = barService;
Eliot Courtney3985ad52017-11-17 16:51:52 +0900603 mNotificationListener = notificationListener;
604 mNotificationLogger = notificationLogger;
Adrian Roos6d5ebb72017-08-03 15:10:22 +0200605 mWakefulnessLifecycle = createAwakeWakefulnessLifecycle();
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900606 mEntryManager = entryManager;
Lucas Dupinc2e75462017-12-06 13:59:25 -0800607 mScrimController = scrimController;
Lucas Dupin311eac82017-12-11 14:40:07 -0800608 mFingerprintUnlockController = fingerprintUnlockController;
Adrian Roos6d5ebb72017-08-03 15:10:22 +0200609 }
610
611 private WakefulnessLifecycle createAwakeWakefulnessLifecycle() {
612 WakefulnessLifecycle wakefulnessLifecycle = new WakefulnessLifecycle();
613 wakefulnessLifecycle.dispatchStartedWakingUp();
614 wakefulnessLifecycle.dispatchFinishedWakingUp();
615 return wakefulnessLifecycle;
Adrian Roosef7a4022017-01-19 14:48:35 -0800616 }
617
Jason Monk9c4faa82017-08-15 09:32:27 -0400618 @Override
619 protected void updateTheme() {
620 // Do nothing for now, until we have more mocking and StatusBar is smaller.
621 }
622
Chris Wren621933f2017-06-14 15:59:03 -0400623 public void setBarStateForTest(int state) {
624 mState = state;
Adrian Roosef7a4022017-01-19 14:48:35 -0800625 }
Charles He2eda2422017-09-24 17:55:21 +0100626
627 public void setUserSetupForTest(boolean userSetup) {
628 mUserSetup = userSetup;
629 }
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900630
631 }
632
633 private class TestableNotificationEntryManager extends NotificationEntryManager {
634
635 public TestableNotificationEntryManager(MetricsLogger metricsLogger,
636 SystemServicesProxy systemServicesProxy, PowerManager powerManager,
637 Context context) {
638 super(mDependency.get(NotificationLockscreenUserManager.class),
639 mDependency.get(NotificationGroupManager.class),
640 mDependency.get(NotificationGutsManager.class),
641 mDependency.get(NotificationRemoteInputManager.class),
642 mDependency.get(NotificationMediaManager.class),
643 mDependency.get(ForegroundServiceController.class),
644 mDependency.get(NotificationListener.class),
645 metricsLogger,
646 mDependency.get(DeviceProvisionedController.class),
647 mDependency.get(UiOffloadThread.class),
648 context);
649 mSystemServicesProxy = systemServicesProxy;
650 mPowerManager = powerManager;
651 }
652
653 public void setUpForTest(NotificationPresenter presenter,
654 NotificationStackScrollLayout stackScroller,
655 Callback callback,
656 VisualStabilityManager visualStabilityManager,
657 HeadsUpManager headsUpManager,
658 NotificationData notificationData) {
659 super.setUpWithPresenter(presenter, stackScroller, callback, visualStabilityManager,
660 headsUpManager);
661 mNotificationData = notificationData;
662 mUseHeadsUp = true;
663 }
Adrian Roosef7a4022017-01-19 14:48:35 -0800664 }
Eliot Courtney09322282017-11-09 15:31:19 +0900665}