blob: c10de6150e303de866b96181de6b8e47e6ec345d [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 Courtney2b4c3a02017-11-27 13:27:46 +090079import com.android.systemui.statusbar.NotificationListContainer;
Eliot Courtney3985ad52017-11-17 16:51:52 +090080import com.android.systemui.statusbar.NotificationListener;
Eliot Courtney09322282017-11-09 15:31:19 +090081import com.android.systemui.statusbar.NotificationLockscreenUserManager;
Eliot Courtney3985ad52017-11-17 16:51:52 +090082import com.android.systemui.statusbar.NotificationLogger;
Eliot Courtneya6d8cf22017-10-20 13:26:58 +090083import com.android.systemui.statusbar.NotificationMediaManager;
84import com.android.systemui.statusbar.NotificationPresenter;
85import com.android.systemui.statusbar.NotificationRemoteInputManager;
Eliot Courtney2b4c3a02017-11-27 13:27:46 +090086import com.android.systemui.statusbar.NotificationViewHierarchyManager;
Chris Wren621933f2017-06-14 15:59:03 -040087import com.android.systemui.statusbar.StatusBarState;
Eliot Courtneya6d8cf22017-10-20 13:26:58 +090088import com.android.systemui.statusbar.notification.VisualStabilityManager;
Jason Monk9c4faa82017-08-15 09:32:27 -040089import com.android.systemui.statusbar.policy.DeviceProvisionedController;
Julia Reynolds30203152017-05-26 13:36:31 -040090import com.android.systemui.statusbar.policy.HeadsUpManager;
Jason Monk9c4faa82017-08-15 09:32:27 -040091import com.android.systemui.statusbar.policy.KeyguardMonitor;
92import com.android.systemui.statusbar.policy.KeyguardMonitorImpl;
Chris Wren27a52fa2017-02-01 14:21:43 -050093import com.android.systemui.statusbar.stack.NotificationStackScrollLayout;
Adrian Roosef7a4022017-01-19 14:48:35 -080094
95import org.junit.Before;
96import org.junit.Test;
97import org.junit.runner.RunWith;
98
Jason Monk51305372017-06-22 11:41:08 -040099import java.io.ByteArrayOutputStream;
100import java.io.PrintWriter;
Chris Wren621933f2017-06-14 15:59:03 -0400101import java.util.ArrayList;
102
Adrian Roos02de4982017-02-11 09:35:54 +0100103@SmallTest
Chris Wren621933f2017-06-14 15:59:03 -0400104@RunWith(AndroidTestingRunner.class)
105@RunWithLooper
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500106public class StatusBarTest extends SysuiTestCase {
Adrian Roosef7a4022017-01-19 14:48:35 -0800107
Eliot Courtney2b4c3a02017-11-27 13:27:46 +0900108 private StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
109 private UnlockMethodCache mUnlockMethodCache;
110 private KeyguardIndicationController mKeyguardIndicationController;
111 private NotificationStackScrollLayout mStackScroller;
112 private TestableStatusBar mStatusBar;
113 private FakeMetricsLogger mMetricsLogger;
114 private HeadsUpManager mHeadsUpManager;
115 private NotificationData mNotificationData;
116 private PowerManager mPowerManager;
117 private SystemServicesProxy mSystemServicesProxy;
118 private NotificationPanelView mNotificationPanelView;
119 private ScrimController mScrimController;
120 private IStatusBarService mBarService;
121 private NotificationListener mNotificationListener;
122 private NotificationLogger mNotificationLogger;
123 private ArrayList<Entry> mNotificationList;
124 private FingerprintUnlockController mFingerprintUnlockController;
Chris Wren27a52fa2017-02-01 14:21:43 -0500125 private DisplayMetrics mDisplayMetrics = new DisplayMetrics();
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900126 private TestableNotificationEntryManager mEntryManager;
Eliot Courtney2b4c3a02017-11-27 13:27:46 +0900127 private NotificationViewHierarchyManager mViewHierarchyManager;
128 private VisualStabilityManager mVisualStabilityManager;
Chris Wren27a52fa2017-02-01 14:21:43 -0500129
Adrian Roos02de4982017-02-11 09:35:54 +0100130 @Before
Julia Reynolds30203152017-05-26 13:36:31 -0400131 public void setup() throws Exception {
Jason Monk9c4faa82017-08-15 09:32:27 -0400132 mContext.setTheme(R.style.Theme_SystemUI_Light);
133 mDependency.injectMockDependency(AssistManager.class);
134 mDependency.injectMockDependency(DeviceProvisionedController.class);
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900135 mDependency.injectMockDependency(NotificationGroupManager.class);
136 mDependency.injectMockDependency(NotificationGutsManager.class);
137 mDependency.injectMockDependency(NotificationRemoteInputManager.class);
138 mDependency.injectMockDependency(NotificationMediaManager.class);
139 mDependency.injectMockDependency(ForegroundServiceController.class);
Eliot Courtney2b4c3a02017-11-27 13:27:46 +0900140 mNotificationListener = mDependency.injectMockDependency(NotificationListener.class);
141 mViewHierarchyManager = mDependency.injectMockDependency(
142 NotificationViewHierarchyManager.class);
143 mVisualStabilityManager = mDependency.injectMockDependency(VisualStabilityManager.class);
Jason Monk9c4faa82017-08-15 09:32:27 -0400144 mDependency.injectTestDependency(KeyguardMonitor.class, mock(KeyguardMonitorImpl.class));
145 CommandQueue commandQueue = mock(CommandQueue.class);
146 when(commandQueue.asBinder()).thenReturn(new Binder());
147 mContext.putComponent(CommandQueue.class, commandQueue);
Jason Monk51305372017-06-22 11:41:08 -0400148 mContext.addMockSystemService(TrustManager.class, mock(TrustManager.class));
149 mContext.addMockSystemService(FingerprintManager.class, mock(FingerprintManager.class));
Adrian Roosef7a4022017-01-19 14:48:35 -0800150 mStatusBarKeyguardViewManager = mock(StatusBarKeyguardViewManager.class);
Chris Wren27a52fa2017-02-01 14:21:43 -0500151 mUnlockMethodCache = mock(UnlockMethodCache.class);
152 mKeyguardIndicationController = mock(KeyguardIndicationController.class);
153 mStackScroller = mock(NotificationStackScrollLayout.class);
Jason Monk9c4faa82017-08-15 09:32:27 -0400154 when(mStackScroller.generateLayoutParams(any())).thenReturn(new LayoutParams(0, 0));
Chris Wrenef319902017-03-07 17:58:31 -0500155 mMetricsLogger = new FakeMetricsLogger();
Julia Reynolds30203152017-05-26 13:36:31 -0400156 mHeadsUpManager = mock(HeadsUpManager.class);
157 mNotificationData = mock(NotificationData.class);
158 mSystemServicesProxy = mock(SystemServicesProxy.class);
Jorim Jaggifd3b1a12017-06-06 17:04:19 -0700159 mNotificationPanelView = mock(NotificationPanelView.class);
Jason Monk51305372017-06-22 11:41:08 -0400160 when(mNotificationPanelView.getLayoutParams()).thenReturn(new LayoutParams(0, 0));
Chris Wren621933f2017-06-14 15:59:03 -0400161 mNotificationList = mock(ArrayList.class);
Lucas Dupinc2e75462017-12-06 13:59:25 -0800162 mScrimController = mock(ScrimController.class);
Lucas Dupin311eac82017-12-11 14:40:07 -0800163 mFingerprintUnlockController = mock(FingerprintUnlockController.class);
Julia Reynolds30203152017-05-26 13:36:31 -0400164 IPowerManager powerManagerService = mock(IPowerManager.class);
165 HandlerThread handlerThread = new HandlerThread("TestThread");
166 handlerThread.start();
167 mPowerManager = new PowerManager(mContext, powerManagerService,
168 new Handler(handlerThread.getLooper()));
169 when(powerManagerService.isInteractive()).thenReturn(true);
Chris Wren621933f2017-06-14 15:59:03 -0400170 mBarService = mock(IStatusBarService.class);
Eliot Courtney3985ad52017-11-17 16:51:52 +0900171 mNotificationLogger = new NotificationLogger(mNotificationListener, mDependency.get(
172 UiOffloadThread.class));
Julia Reynolds30203152017-05-26 13:36:31 -0400173
Jason Monk8c09ac72017-03-16 11:53:40 -0400174 mDependency.injectTestDependency(MetricsLogger.class, mMetricsLogger);
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900175
176 mNotificationListener = mDependency.get(NotificationListener.class);
177 mNotificationLogger = mDependency.get(NotificationLogger.class);
178 mEntryManager = new TestableNotificationEntryManager(mMetricsLogger,
179 mSystemServicesProxy, mPowerManager, mContext);
180
Chris Wren27a52fa2017-02-01 14:21:43 -0500181 mStatusBar = new TestableStatusBar(mStatusBarKeyguardViewManager, mUnlockMethodCache,
Julia Reynolds30203152017-05-26 13:36:31 -0400182 mKeyguardIndicationController, mStackScroller, mHeadsUpManager,
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900183 mPowerManager, mNotificationPanelView, mBarService, mNotificationListener,
Eliot Courtney2b4c3a02017-11-27 13:27:46 +0900184 mNotificationLogger, mVisualStabilityManager, mViewHierarchyManager,
185 mEntryManager, mScrimController, mFingerprintUnlockController);
Jason Monk51305372017-06-22 11:41:08 -0400186 mStatusBar.mContext = mContext;
Jason Monk9c4faa82017-08-15 09:32:27 -0400187 mStatusBar.mComponents = mContext.getComponents();
Adrian Roosef7a4022017-01-19 14:48:35 -0800188 doAnswer(invocation -> {
189 OnDismissAction onDismissAction = (OnDismissAction) invocation.getArguments()[0];
190 onDismissAction.onDismiss();
191 return null;
192 }).when(mStatusBarKeyguardViewManager).dismissWithAction(any(), any(), anyBoolean());
193
194 doAnswer(invocation -> {
195 Runnable runnable = (Runnable) invocation.getArguments()[0];
196 runnable.run();
197 return null;
198 }).when(mStatusBarKeyguardViewManager).addAfterKeyguardGoneRunnable(any());
Chris Wren27a52fa2017-02-01 14:21:43 -0500199
Eliot Courtney2b4c3a02017-11-27 13:27:46 +0900200 mEntryManager.setUpForTest(mStatusBar, mStackScroller, mStatusBar, mHeadsUpManager,
201 mNotificationData);
Eliot Courtney3985ad52017-11-17 16:51:52 +0900202 mNotificationLogger.setUpWithPresenter(mStatusBar, mStackScroller);
203
Chris Wren27a52fa2017-02-01 14:21:43 -0500204 when(mStackScroller.getActivatedChild()).thenReturn(null);
Eliot Courtney3985ad52017-11-17 16:51:52 +0900205 TestableLooper.get(this).setMessageHandler(m -> {
206 if (m.getCallback() == mStatusBar.mNotificationLogger.getVisibilityReporter()) {
207 return false;
Chris Wren621933f2017-06-14 15:59:03 -0400208 }
Eliot Courtney3985ad52017-11-17 16:51:52 +0900209 return true;
Chris Wren621933f2017-06-14 15:59:03 -0400210 });
Adrian Roosef7a4022017-01-19 14:48:35 -0800211 }
212
Adrian Roos02de4982017-02-11 09:35:54 +0100213 @Test
Jason Monk5ecf80c2017-07-06 15:28:17 -0400214 public void testSetBouncerShowing_noCrash() {
215 mStatusBar.mCommandQueue = mock(CommandQueue.class);
216 mStatusBar.setBouncerShowing(true);
217 }
218
219 @Test
Adrian Roosef7a4022017-01-19 14:48:35 -0800220 public void executeRunnableDismissingKeyguard_nullRunnable_showingAndOccluded() {
221 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
222 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(true);
223
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500224 mStatusBar.executeRunnableDismissingKeyguard(null, null, false, false, false);
Adrian Roosef7a4022017-01-19 14:48:35 -0800225 }
226
Adrian Roos02de4982017-02-11 09:35:54 +0100227 @Test
Adrian Roosef7a4022017-01-19 14:48:35 -0800228 public void executeRunnableDismissingKeyguard_nullRunnable_showing() {
229 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
230 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
231
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500232 mStatusBar.executeRunnableDismissingKeyguard(null, null, false, false, false);
Adrian Roosef7a4022017-01-19 14:48:35 -0800233 }
234
Adrian Roos02de4982017-02-11 09:35:54 +0100235 @Test
Adrian Roosef7a4022017-01-19 14:48:35 -0800236 public void executeRunnableDismissingKeyguard_nullRunnable_notShowing() {
237 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(false);
238 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
239
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500240 mStatusBar.executeRunnableDismissingKeyguard(null, null, false, false, false);
Adrian Roosef7a4022017-01-19 14:48:35 -0800241 }
242
Adrian Roos02de4982017-02-11 09:35:54 +0100243 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500244 public void lockscreenStateMetrics_notShowing() {
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(false);
250 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false);
251 when(mUnlockMethodCache.isMethodSecure()).thenReturn(false);
Chris Wren27a52fa2017-02-01 14:21:43 -0500252 mStatusBar.onKeyguardViewManagerStatesUpdated();
253
Chris Wrenef319902017-03-07 17:58:31 -0500254 MetricsAsserts.assertHasLog("missing hidden insecure lockscreen log",
255 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500256 new LogMaker(MetricsEvent.LOCKSCREEN)
257 .setType(MetricsEvent.TYPE_CLOSE)
258 .setSubtype(0));
259 }
260
Adrian Roos02de4982017-02-11 09:35:54 +0100261 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500262 public void lockscreenStateMetrics_notShowing_secure() {
263 // uninteresting state, except that fingerprint must be non-zero
264 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
265 when(mUnlockMethodCache.canSkipBouncer()).thenReturn(true);
266 // interesting state
267 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(false);
268 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false);
269 when(mUnlockMethodCache.isMethodSecure()).thenReturn(true);
270
271 mStatusBar.onKeyguardViewManagerStatesUpdated();
272
Chris Wrenef319902017-03-07 17:58:31 -0500273 MetricsAsserts.assertHasLog("missing hidden secure lockscreen log",
274 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500275 new LogMaker(MetricsEvent.LOCKSCREEN)
276 .setType(MetricsEvent.TYPE_CLOSE)
277 .setSubtype(1));
278 }
279
Adrian Roos02de4982017-02-11 09:35:54 +0100280 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500281 public void lockscreenStateMetrics_isShowing() {
282 // uninteresting state, except that fingerprint must be non-zero
283 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
284 when(mUnlockMethodCache.canSkipBouncer()).thenReturn(true);
285 // interesting state
286 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
287 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false);
288 when(mUnlockMethodCache.isMethodSecure()).thenReturn(false);
289
290 mStatusBar.onKeyguardViewManagerStatesUpdated();
291
Chris Wrenef319902017-03-07 17:58:31 -0500292 MetricsAsserts.assertHasLog("missing insecure lockscreen showing",
293 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500294 new LogMaker(MetricsEvent.LOCKSCREEN)
295 .setType(MetricsEvent.TYPE_OPEN)
296 .setSubtype(0));
297 }
298
Adrian Roos02de4982017-02-11 09:35:54 +0100299 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500300 public void lockscreenStateMetrics_isShowing_secure() {
301 // uninteresting state, except that fingerprint must be non-zero
302 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
303 when(mUnlockMethodCache.canSkipBouncer()).thenReturn(true);
304 // interesting state
305 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
306 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false);
307 when(mUnlockMethodCache.isMethodSecure()).thenReturn(true);
308
309 mStatusBar.onKeyguardViewManagerStatesUpdated();
310
Chris Wrenef319902017-03-07 17:58:31 -0500311 MetricsAsserts.assertHasLog("missing secure lockscreen showing log",
312 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500313 new LogMaker(MetricsEvent.LOCKSCREEN)
314 .setType(MetricsEvent.TYPE_OPEN)
315 .setSubtype(1));
316 }
317
Adrian Roos02de4982017-02-11 09:35:54 +0100318 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500319 public void lockscreenStateMetrics_isShowingBouncer() {
320 // uninteresting state, except that fingerprint must be non-zero
321 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
322 when(mUnlockMethodCache.canSkipBouncer()).thenReturn(true);
323 // interesting state
324 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
325 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(true);
326 when(mUnlockMethodCache.isMethodSecure()).thenReturn(true);
327
328 mStatusBar.onKeyguardViewManagerStatesUpdated();
329
Chris Wrenef319902017-03-07 17:58:31 -0500330 MetricsAsserts.assertHasLog("missing bouncer log",
331 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500332 new LogMaker(MetricsEvent.BOUNCER)
333 .setType(MetricsEvent.TYPE_OPEN)
334 .setSubtype(1));
335 }
336
Adrian Roos02de4982017-02-11 09:35:54 +0100337 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500338 public void onActivatedMetrics() {
339 ActivatableNotificationView view = mock(ActivatableNotificationView.class);
340 mStatusBar.onActivated(view);
341
Chris Wrenef319902017-03-07 17:58:31 -0500342 MetricsAsserts.assertHasLog("missing lockscreen note tap log",
343 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500344 new LogMaker(MetricsEvent.ACTION_LS_NOTE)
345 .setType(MetricsEvent.TYPE_ACTION));
346 }
347
Julia Reynolds30203152017-05-26 13:36:31 -0400348 @Test
349 public void testShouldPeek_nonSuppressedGroupSummary() {
350 when(mPowerManager.isScreenOn()).thenReturn(true);
351 when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false);
352 when(mNotificationData.shouldSuppressScreenOn(any())).thenReturn(false);
353 when(mNotificationData.shouldFilterOut(any())).thenReturn(false);
354 when(mSystemServicesProxy.isDreaming()).thenReturn(false);
355 when(mNotificationData.getImportance(any())).thenReturn(IMPORTANCE_HIGH);
356
357 Notification n = new Notification.Builder(getContext(), "a")
358 .setGroup("a")
359 .setGroupSummary(true)
360 .setGroupAlertBehavior(Notification.GROUP_ALERT_SUMMARY)
361 .build();
362 StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, "a", 0, 0, n,
363 UserHandle.of(0), null, 0);
364 NotificationData.Entry entry = new NotificationData.Entry(sbn);
365
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900366 assertTrue(mEntryManager.shouldPeek(entry, sbn));
Julia Reynolds30203152017-05-26 13:36:31 -0400367 }
368
369 @Test
370 public void testShouldPeek_suppressedGroupSummary() {
371 when(mPowerManager.isScreenOn()).thenReturn(true);
372 when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false);
373 when(mNotificationData.shouldSuppressScreenOn(any())).thenReturn(false);
374 when(mNotificationData.shouldFilterOut(any())).thenReturn(false);
375 when(mSystemServicesProxy.isDreaming()).thenReturn(false);
376 when(mNotificationData.getImportance(any())).thenReturn(IMPORTANCE_HIGH);
377
378 Notification n = new Notification.Builder(getContext(), "a")
379 .setGroup("a")
380 .setGroupSummary(true)
381 .setGroupAlertBehavior(Notification.GROUP_ALERT_CHILDREN)
382 .build();
383 StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, "a", 0, 0, n,
384 UserHandle.of(0), null, 0);
385 NotificationData.Entry entry = new NotificationData.Entry(sbn);
386
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900387 assertFalse(mEntryManager.shouldPeek(entry, sbn));
Julia Reynolds30203152017-05-26 13:36:31 -0400388 }
389
Chris Wren621933f2017-06-14 15:59:03 -0400390 @Test
Beverly38159ce2017-07-13 16:39:24 -0400391 public void testShouldPeek_suppressedScreenOn_dozing() {
392 when(mPowerManager.isScreenOn()).thenReturn(true);
393 when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false);
394 when(mNotificationData.shouldFilterOut(any())).thenReturn(false);
395 when(mSystemServicesProxy.isDreaming()).thenReturn(false);
396 when(mNotificationData.getImportance(any())).thenReturn(IMPORTANCE_HIGH);
397
398 mStatusBar.mDozing = true;
399 when(mNotificationData.shouldSuppressScreenOn(any())).thenReturn(true);
400 when(mNotificationData.shouldSuppressScreenOff(any())).thenReturn(false);
401
402 Notification n = new Notification.Builder(getContext(), "a").build();
403 StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, "a", 0, 0, n,
404 UserHandle.of(0), null, 0);
405 NotificationData.Entry entry = new NotificationData.Entry(sbn);
406
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900407 assertTrue(mEntryManager.shouldPeek(entry, sbn));
Beverly38159ce2017-07-13 16:39:24 -0400408 }
409
410 @Test
411 public void testShouldPeek_suppressedScreenOn_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(true);
420 when(mNotificationData.shouldSuppressScreenOff(any())).thenReturn(false);
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);
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900426 assertFalse(mEntryManager.shouldPeek(entry, sbn));
Beverly38159ce2017-07-13 16:39:24 -0400427 }
428 @Test
429 public void testShouldPeek_suppressedScreenOff_dozing() {
430 when(mPowerManager.isScreenOn()).thenReturn(true);
431 when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false);
432 when(mNotificationData.shouldFilterOut(any())).thenReturn(false);
433 when(mSystemServicesProxy.isDreaming()).thenReturn(false);
434 when(mNotificationData.getImportance(any())).thenReturn(IMPORTANCE_HIGH);
435
436 mStatusBar.mDozing = true;
437 when(mNotificationData.shouldSuppressScreenOn(any())).thenReturn(false);
438 when(mNotificationData.shouldSuppressScreenOff(any())).thenReturn(true);
439
440 Notification n = new Notification.Builder(getContext(), "a").build();
441 StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, "a", 0, 0, n,
442 UserHandle.of(0), null, 0);
443 NotificationData.Entry entry = new NotificationData.Entry(sbn);
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900444 assertFalse(mEntryManager.shouldPeek(entry, sbn));
Beverly38159ce2017-07-13 16:39:24 -0400445 }
446
447 @Test
448 public void testShouldPeek_suppressedScreenOff_noDoze() {
449 when(mPowerManager.isScreenOn()).thenReturn(true);
450 when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false);
451 when(mNotificationData.shouldFilterOut(any())).thenReturn(false);
452 when(mSystemServicesProxy.isDreaming()).thenReturn(false);
453 when(mNotificationData.getImportance(any())).thenReturn(IMPORTANCE_HIGH);
454
455 mStatusBar.mDozing = false;
456 when(mNotificationData.shouldSuppressScreenOn(any())).thenReturn(false);
457 when(mNotificationData.shouldSuppressScreenOff(any())).thenReturn(true);
458
459 Notification n = new Notification.Builder(getContext(), "a").build();
460 StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, "a", 0, 0, n,
461 UserHandle.of(0), null, 0);
462 NotificationData.Entry entry = new NotificationData.Entry(sbn);
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900463 assertTrue(mEntryManager.shouldPeek(entry, sbn));
Beverly38159ce2017-07-13 16:39:24 -0400464 }
465
466
467 @Test
Chris Wren621933f2017-06-14 15:59:03 -0400468 public void testLogHidden() {
469 try {
470 mStatusBar.handleVisibleToUserChanged(false);
Selim Cinek1a891a92017-12-04 17:41:27 +0100471 waitForUiOffloadThread();
Chris Wren621933f2017-06-14 15:59:03 -0400472 verify(mBarService, times(1)).onPanelHidden();
473 verify(mBarService, never()).onPanelRevealed(anyBoolean(), anyInt());
474 } catch (RemoteException e) {
475 fail();
476 }
477 }
478
479 @Test
480 public void testPanelOpenForPeek() {
481 when(mHeadsUpManager.hasPinnedHeadsUp()).thenReturn(true);
482 when(mNotificationData.getActiveNotifications()).thenReturn(mNotificationList);
483 when(mNotificationList.size()).thenReturn(5);
484 when(mNotificationPanelView.isFullyCollapsed()).thenReturn(true);
485 mStatusBar.setBarStateForTest(StatusBarState.SHADE);
486
487 try {
488 mStatusBar.handleVisibleToUserChanged(true);
Selim Cinek1a891a92017-12-04 17:41:27 +0100489 waitForUiOffloadThread();
Chris Wren621933f2017-06-14 15:59:03 -0400490 verify(mBarService, never()).onPanelHidden();
491 verify(mBarService, times(1)).onPanelRevealed(false, 1);
492 } catch (RemoteException e) {
493 fail();
494 }
495 TestableLooper.get(this).processAllMessages();
496 }
497
498 @Test
499 public void testPanelOpenAndClear() {
500 when(mHeadsUpManager.hasPinnedHeadsUp()).thenReturn(false);
501 when(mNotificationData.getActiveNotifications()).thenReturn(mNotificationList);
502 when(mNotificationList.size()).thenReturn(5);
503 when(mNotificationPanelView.isFullyCollapsed()).thenReturn(false);
504 mStatusBar.setBarStateForTest(StatusBarState.SHADE);
505
506 try {
507 mStatusBar.handleVisibleToUserChanged(true);
Selim Cinek1a891a92017-12-04 17:41:27 +0100508 waitForUiOffloadThread();
Chris Wren621933f2017-06-14 15:59:03 -0400509 verify(mBarService, never()).onPanelHidden();
510 verify(mBarService, times(1)).onPanelRevealed(true, 5);
511 } catch (RemoteException e) {
512 fail();
513 }
514 TestableLooper.get(this).processAllMessages();
515 }
516
517 @Test
518 public void testPanelOpenAndNoClear() {
519 when(mHeadsUpManager.hasPinnedHeadsUp()).thenReturn(false);
520 when(mNotificationData.getActiveNotifications()).thenReturn(mNotificationList);
521 when(mNotificationList.size()).thenReturn(5);
522 when(mNotificationPanelView.isFullyCollapsed()).thenReturn(false);
523 mStatusBar.setBarStateForTest(StatusBarState.KEYGUARD);
524
525 try {
526 mStatusBar.handleVisibleToUserChanged(true);
Selim Cinek1a891a92017-12-04 17:41:27 +0100527 waitForUiOffloadThread();
Chris Wren621933f2017-06-14 15:59:03 -0400528 verify(mBarService, never()).onPanelHidden();
529 verify(mBarService, times(1)).onPanelRevealed(false, 5);
530 } catch (RemoteException e) {
531 fail();
532 }
533 TestableLooper.get(this).processAllMessages();
534 }
535
Jason Monk51305372017-06-22 11:41:08 -0400536 @Test
Charles He2eda2422017-09-24 17:55:21 +0100537 public void testDisableExpandStatusBar() {
538 mStatusBar.setBarStateForTest(StatusBarState.SHADE);
539 mStatusBar.setUserSetupForTest(true);
540 when(mStatusBar.isDeviceProvisioned()).thenReturn(true);
541
542 mStatusBar.disable(StatusBarManager.DISABLE_NONE,
543 StatusBarManager.DISABLE2_NOTIFICATION_SHADE, false);
544 verify(mNotificationPanelView).setQsExpansionEnabled(false);
545 mStatusBar.animateExpandNotificationsPanel();
546 verify(mNotificationPanelView, never()).expand(anyBoolean());
547 mStatusBar.animateExpandSettingsPanel(null);
548 verify(mNotificationPanelView, never()).expand(anyBoolean());
549
550 mStatusBar.disable(StatusBarManager.DISABLE_NONE, StatusBarManager.DISABLE2_NONE, false);
551 verify(mNotificationPanelView).setQsExpansionEnabled(true);
552 mStatusBar.animateExpandNotificationsPanel();
553 verify(mNotificationPanelView).expand(anyBoolean());
554 mStatusBar.animateExpandSettingsPanel(null);
555 verify(mNotificationPanelView).expand(anyBoolean());
556 }
557
558 @Test
Jason Monk51305372017-06-22 11:41:08 -0400559 public void testDump_DoesNotCrash() {
560 mStatusBar.dump(null, new PrintWriter(new ByteArrayOutputStream()), null);
561 }
562
Jason Monk9c4faa82017-08-15 09:32:27 -0400563 @Test
564 @RunWithLooper(setAsMainLooper = true)
565 public void testUpdateKeyguardState_DoesNotCrash() {
566 mStatusBar.mStatusBarWindow = mock(StatusBarWindowView.class);
567 mStatusBar.mState = StatusBarState.KEYGUARD;
568 mStatusBar.mDozeScrimController = mock(DozeScrimController.class);
569 mStatusBar.mNotificationIconAreaController = mock(NotificationIconAreaController.class);
Eliot Courtney09322282017-11-09 15:31:19 +0900570 mStatusBar.mLockscreenUserManager = mock(NotificationLockscreenUserManager.class);
571 when(mStatusBar.mLockscreenUserManager.getCurrentProfiles()).thenReturn(
572 new SparseArray<>());
Jason Monk9c4faa82017-08-15 09:32:27 -0400573 mStatusBar.updateKeyguardState(false, false);
574 }
575
Lucas Dupinc2e75462017-12-06 13:59:25 -0800576 @Test
577 public void testFingerprintNotification_UpdatesScrims() {
578 mStatusBar.mStatusBarWindowManager = mock(StatusBarWindowManager.class);
Lucas Dupinc2e75462017-12-06 13:59:25 -0800579 mStatusBar.mDozeScrimController = mock(DozeScrimController.class);
580 mStatusBar.notifyFpAuthModeChanged();
581 verify(mScrimController).transitionTo(any(), any());
582 }
583
Lucas Dupin311eac82017-12-11 14:40:07 -0800584 @Test
585 public void testFingerprintUnlock_UpdatesScrims() {
586 // Simulate unlocking from AoD with fingerprint.
587 when(mFingerprintUnlockController.getMode())
588 .thenReturn(FingerprintUnlockController.MODE_WAKE_AND_UNLOCK);
589 mStatusBar.updateScrimController();
590 verify(mScrimController).transitionTo(eq(ScrimState.UNLOCKED), any());
591 }
592
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500593 static class TestableStatusBar extends StatusBar {
Chris Wren27a52fa2017-02-01 14:21:43 -0500594 public TestableStatusBar(StatusBarKeyguardViewManager man,
595 UnlockMethodCache unlock, KeyguardIndicationController key,
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900596 NotificationStackScrollLayout stack, HeadsUpManager hum,
597 PowerManager pm, NotificationPanelView panelView,
Eliot Courtney3985ad52017-11-17 16:51:52 +0900598 IStatusBarService barService, NotificationListener notificationListener,
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900599 NotificationLogger notificationLogger,
Eliot Courtney2b4c3a02017-11-27 13:27:46 +0900600 VisualStabilityManager visualStabilityManager,
601 NotificationViewHierarchyManager viewHierarchyManager,
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900602 TestableNotificationEntryManager entryManager, ScrimController scrimController,
Lucas Dupin311eac82017-12-11 14:40:07 -0800603 FingerprintUnlockController fingerprintUnlockController) {
Adrian Roosef7a4022017-01-19 14:48:35 -0800604 mStatusBarKeyguardViewManager = man;
Chris Wren27a52fa2017-02-01 14:21:43 -0500605 mUnlockMethodCache = unlock;
606 mKeyguardIndicationController = key;
607 mStackScroller = stack;
Julia Reynolds30203152017-05-26 13:36:31 -0400608 mHeadsUpManager = hum;
Julia Reynolds30203152017-05-26 13:36:31 -0400609 mPowerManager = pm;
Jorim Jaggifd3b1a12017-06-06 17:04:19 -0700610 mNotificationPanel = panelView;
Chris Wren621933f2017-06-14 15:59:03 -0400611 mBarService = barService;
Eliot Courtney3985ad52017-11-17 16:51:52 +0900612 mNotificationListener = notificationListener;
613 mNotificationLogger = notificationLogger;
Adrian Roos6d5ebb72017-08-03 15:10:22 +0200614 mWakefulnessLifecycle = createAwakeWakefulnessLifecycle();
Eliot Courtney2b4c3a02017-11-27 13:27:46 +0900615 mVisualStabilityManager = visualStabilityManager;
616 mViewHierarchyManager = viewHierarchyManager;
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900617 mEntryManager = entryManager;
Lucas Dupinc2e75462017-12-06 13:59:25 -0800618 mScrimController = scrimController;
Lucas Dupin311eac82017-12-11 14:40:07 -0800619 mFingerprintUnlockController = fingerprintUnlockController;
Adrian Roos6d5ebb72017-08-03 15:10:22 +0200620 }
621
622 private WakefulnessLifecycle createAwakeWakefulnessLifecycle() {
623 WakefulnessLifecycle wakefulnessLifecycle = new WakefulnessLifecycle();
624 wakefulnessLifecycle.dispatchStartedWakingUp();
625 wakefulnessLifecycle.dispatchFinishedWakingUp();
626 return wakefulnessLifecycle;
Adrian Roosef7a4022017-01-19 14:48:35 -0800627 }
628
Jason Monk9c4faa82017-08-15 09:32:27 -0400629 @Override
630 protected void updateTheme() {
631 // Do nothing for now, until we have more mocking and StatusBar is smaller.
632 }
633
Chris Wren621933f2017-06-14 15:59:03 -0400634 public void setBarStateForTest(int state) {
635 mState = state;
Adrian Roosef7a4022017-01-19 14:48:35 -0800636 }
Charles He2eda2422017-09-24 17:55:21 +0100637
638 public void setUserSetupForTest(boolean userSetup) {
639 mUserSetup = userSetup;
640 }
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900641
642 }
643
644 private class TestableNotificationEntryManager extends NotificationEntryManager {
645
646 public TestableNotificationEntryManager(MetricsLogger metricsLogger,
647 SystemServicesProxy systemServicesProxy, PowerManager powerManager,
648 Context context) {
649 super(mDependency.get(NotificationLockscreenUserManager.class),
650 mDependency.get(NotificationGroupManager.class),
651 mDependency.get(NotificationGutsManager.class),
652 mDependency.get(NotificationRemoteInputManager.class),
653 mDependency.get(NotificationMediaManager.class),
654 mDependency.get(ForegroundServiceController.class),
655 mDependency.get(NotificationListener.class),
656 metricsLogger,
657 mDependency.get(DeviceProvisionedController.class),
Eliot Courtney2b4c3a02017-11-27 13:27:46 +0900658 mDependency.get(VisualStabilityManager.class),
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900659 mDependency.get(UiOffloadThread.class),
660 context);
661 mSystemServicesProxy = systemServicesProxy;
662 mPowerManager = powerManager;
663 }
664
665 public void setUpForTest(NotificationPresenter presenter,
Eliot Courtney2b4c3a02017-11-27 13:27:46 +0900666 NotificationListContainer listContainer,
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900667 Callback callback,
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900668 HeadsUpManager headsUpManager,
669 NotificationData notificationData) {
Eliot Courtney2b4c3a02017-11-27 13:27:46 +0900670 super.setUpWithPresenter(presenter, listContainer, callback, headsUpManager);
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900671 mNotificationData = notificationData;
672 mUseHeadsUp = true;
673 }
Adrian Roosef7a4022017-01-19 14:48:35 -0800674 }
Eliot Courtney09322282017-11-09 15:31:19 +0900675}