blob: f13fa4e51b78f561b58d46e57a1fd010a8109d2b [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;
Lucas Dupind5107302018-03-19 15:30:29 -070033import static org.mockito.Mockito.reset;
Chris Wren621933f2017-06-14 15:59:03 -040034import static org.mockito.Mockito.times;
Chris Wren621933f2017-06-14 15:59:03 -040035import static org.mockito.Mockito.verify;
Jason Monk9c4faa82017-08-15 09:32:27 -040036import static org.mockito.Mockito.when;
Adrian Roosef7a4022017-01-19 14:48:35 -080037
Julia Reynolds30203152017-05-26 13:36:31 -040038import android.app.Notification;
Charles He2eda2422017-09-24 17:55:21 +010039import android.app.StatusBarManager;
Jason Monk51305372017-06-22 11:41:08 -040040import android.app.trust.TrustManager;
Eliot Courtneya6d8cf22017-10-20 13:26:58 +090041import android.content.Context;
Jason Monk51305372017-06-22 11:41:08 -040042import android.hardware.fingerprint.FingerprintManager;
Chris Wren27a52fa2017-02-01 14:21:43 -050043import android.metrics.LogMaker;
Jason Monk9c4faa82017-08-15 09:32:27 -040044import android.os.Binder;
Julia Reynolds30203152017-05-26 13:36:31 -040045import android.os.Handler;
46import android.os.HandlerThread;
47import android.os.IPowerManager;
Julia Reynolds30203152017-05-26 13:36:31 -040048import android.os.PowerManager;
Chris Wren621933f2017-06-14 15:59:03 -040049import android.os.RemoteException;
Julia Reynolds30203152017-05-26 13:36:31 -040050import android.os.UserHandle;
51import android.service.notification.StatusBarNotification;
Adrian Roosef7a4022017-01-19 14:48:35 -080052import android.support.test.filters.SmallTest;
Chris Wren27a52fa2017-02-01 14:21:43 -050053import android.support.test.metricshelper.MetricsAsserts;
Chris Wren621933f2017-06-14 15:59:03 -040054import android.testing.AndroidTestingRunner;
55import android.testing.TestableLooper;
Chris Wren621933f2017-06-14 15:59:03 -040056import android.testing.TestableLooper.RunWithLooper;
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;
Julia Reynoldsfc640012018-02-21 12:25:27 -050073import com.android.systemui.statusbar.AppOpsListener;
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;
Eliot Courtneya6d8cf22017-10-20 13:26:58 +090078import com.android.systemui.statusbar.NotificationEntryManager;
79import com.android.systemui.statusbar.NotificationGutsManager;
Eliot Courtney2b4c3a02017-11-27 13:27:46 +090080import com.android.systemui.statusbar.NotificationListContainer;
Eliot Courtney3985ad52017-11-17 16:51:52 +090081import com.android.systemui.statusbar.NotificationListener;
Eliot Courtney09322282017-11-09 15:31:19 +090082import com.android.systemui.statusbar.NotificationLockscreenUserManager;
Eliot Courtney3985ad52017-11-17 16:51:52 +090083import com.android.systemui.statusbar.NotificationLogger;
Eliot Courtneya6d8cf22017-10-20 13:26:58 +090084import com.android.systemui.statusbar.NotificationMediaManager;
85import com.android.systemui.statusbar.NotificationPresenter;
86import com.android.systemui.statusbar.NotificationRemoteInputManager;
Eliot Courtney2b4c3a02017-11-27 13:27:46 +090087import com.android.systemui.statusbar.NotificationViewHierarchyManager;
Chris Wren621933f2017-06-14 15:59:03 -040088import com.android.systemui.statusbar.StatusBarState;
Selim Cinek7e222c3c2018-01-25 12:22:41 -080089import com.android.systemui.statusbar.notification.ActivityLaunchAnimator;
Eliot Courtneya6d8cf22017-10-20 13:26:58 +090090import com.android.systemui.statusbar.notification.VisualStabilityManager;
yoshiki iguchi4e30e762018-02-06 12:09:23 +090091import com.android.systemui.statusbar.phone.HeadsUpManagerPhone;
Jason Monk9c4faa82017-08-15 09:32:27 -040092import com.android.systemui.statusbar.policy.DeviceProvisionedController;
Jason Monk9c4faa82017-08-15 09:32:27 -040093import com.android.systemui.statusbar.policy.KeyguardMonitor;
94import com.android.systemui.statusbar.policy.KeyguardMonitorImpl;
Chris Wren27a52fa2017-02-01 14:21:43 -050095import com.android.systemui.statusbar.stack.NotificationStackScrollLayout;
Adrian Roosef7a4022017-01-19 14:48:35 -080096
97import org.junit.Before;
98import org.junit.Test;
99import org.junit.runner.RunWith;
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900100import org.mockito.Mock;
101import org.mockito.MockitoAnnotations;
Adrian Roosef7a4022017-01-19 14:48:35 -0800102
Jason Monk51305372017-06-22 11:41:08 -0400103import java.io.ByteArrayOutputStream;
104import java.io.PrintWriter;
Chris Wren621933f2017-06-14 15:59:03 -0400105import java.util.ArrayList;
106
Adrian Roos02de4982017-02-11 09:35:54 +0100107@SmallTest
Chris Wren621933f2017-06-14 15:59:03 -0400108@RunWith(AndroidTestingRunner.class)
109@RunWithLooper
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500110public class StatusBarTest extends SysuiTestCase {
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900111 @Mock private StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
112 @Mock private UnlockMethodCache mUnlockMethodCache;
113 @Mock private KeyguardIndicationController mKeyguardIndicationController;
114 @Mock private NotificationStackScrollLayout mStackScroller;
yoshiki iguchi4e30e762018-02-06 12:09:23 +0900115 @Mock private HeadsUpManagerPhone mHeadsUpManager;
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900116 @Mock private SystemServicesProxy mSystemServicesProxy;
117 @Mock private NotificationPanelView mNotificationPanelView;
118 @Mock private IStatusBarService mBarService;
119 @Mock private ScrimController mScrimController;
120 @Mock private ArrayList<Entry> mNotificationList;
121 @Mock private FingerprintUnlockController mFingerprintUnlockController;
122 @Mock private NotificationData mNotificationData;
Adrian Roosef7a4022017-01-19 14:48:35 -0800123
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900124 // Mock dependencies:
125 @Mock private NotificationViewHierarchyManager mViewHierarchyManager;
126 @Mock private VisualStabilityManager mVisualStabilityManager;
127 @Mock private NotificationListener mNotificationListener;
128
Eliot Courtney2b4c3a02017-11-27 13:27:46 +0900129 private TestableStatusBar mStatusBar;
130 private FakeMetricsLogger mMetricsLogger;
Eliot Courtney2b4c3a02017-11-27 13:27:46 +0900131 private PowerManager mPowerManager;
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900132 private TestableNotificationEntryManager mEntryManager;
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900133 private NotificationLogger mNotificationLogger;
Chris Wren27a52fa2017-02-01 14:21:43 -0500134
Adrian Roos02de4982017-02-11 09:35:54 +0100135 @Before
Julia Reynolds30203152017-05-26 13:36:31 -0400136 public void setup() throws Exception {
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900137 MockitoAnnotations.initMocks(this);
Jason Monk9c4faa82017-08-15 09:32:27 -0400138 mDependency.injectMockDependency(AssistManager.class);
139 mDependency.injectMockDependency(DeviceProvisionedController.class);
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900140 mDependency.injectMockDependency(NotificationGroupManager.class);
141 mDependency.injectMockDependency(NotificationGutsManager.class);
142 mDependency.injectMockDependency(NotificationRemoteInputManager.class);
143 mDependency.injectMockDependency(NotificationMediaManager.class);
144 mDependency.injectMockDependency(ForegroundServiceController.class);
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900145 mDependency.injectTestDependency(NotificationViewHierarchyManager.class,
146 mViewHierarchyManager);
147 mDependency.injectTestDependency(VisualStabilityManager.class, mVisualStabilityManager);
148 mDependency.injectTestDependency(NotificationListener.class, mNotificationListener);
Jason Monk9c4faa82017-08-15 09:32:27 -0400149 mDependency.injectTestDependency(KeyguardMonitor.class, mock(KeyguardMonitorImpl.class));
Julia Reynoldsfc640012018-02-21 12:25:27 -0500150 mDependency.injectTestDependency(AppOpsListener.class, mock(AppOpsListener.class));
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900151
Jason Monk51305372017-06-22 11:41:08 -0400152 mContext.addMockSystemService(TrustManager.class, mock(TrustManager.class));
153 mContext.addMockSystemService(FingerprintManager.class, mock(FingerprintManager.class));
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900154
Chris Wrenef319902017-03-07 17:58:31 -0500155 mMetricsLogger = new FakeMetricsLogger();
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900156 mDependency.injectTestDependency(MetricsLogger.class, mMetricsLogger);
Eliot Courtney6c313d32017-12-14 19:57:51 +0900157 mNotificationLogger = new NotificationLogger();
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900158 mDependency.injectTestDependency(NotificationLogger.class, mNotificationLogger);
159
Julia Reynolds30203152017-05-26 13:36:31 -0400160 IPowerManager powerManagerService = mock(IPowerManager.class);
161 HandlerThread handlerThread = new HandlerThread("TestThread");
162 handlerThread.start();
163 mPowerManager = new PowerManager(mContext, powerManagerService,
164 new Handler(handlerThread.getLooper()));
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900165
166 CommandQueue commandQueue = mock(CommandQueue.class);
167 when(commandQueue.asBinder()).thenReturn(new Binder());
168 mContext.putComponent(CommandQueue.class, commandQueue);
169
170 mContext.setTheme(R.style.Theme_SystemUI_Light);
171
172 when(mStackScroller.generateLayoutParams(any())).thenReturn(new LayoutParams(0, 0));
173 when(mNotificationPanelView.getLayoutParams()).thenReturn(new LayoutParams(0, 0));
Julia Reynolds30203152017-05-26 13:36:31 -0400174 when(powerManagerService.isInteractive()).thenReturn(true);
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900175 when(mStackScroller.getActivatedChild()).thenReturn(null);
Julia Reynolds30203152017-05-26 13:36:31 -0400176
Adrian Roosef7a4022017-01-19 14:48:35 -0800177 doAnswer(invocation -> {
178 OnDismissAction onDismissAction = (OnDismissAction) invocation.getArguments()[0];
179 onDismissAction.onDismiss();
180 return null;
181 }).when(mStatusBarKeyguardViewManager).dismissWithAction(any(), any(), anyBoolean());
182
183 doAnswer(invocation -> {
184 Runnable runnable = (Runnable) invocation.getArguments()[0];
185 runnable.run();
186 return null;
187 }).when(mStatusBarKeyguardViewManager).addAfterKeyguardGoneRunnable(any());
Chris Wren27a52fa2017-02-01 14:21:43 -0500188
Eliot Courtney6c313d32017-12-14 19:57:51 +0900189 mEntryManager = new TestableNotificationEntryManager(mSystemServicesProxy, mPowerManager,
190 mContext);
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900191 mStatusBar = new TestableStatusBar(mStatusBarKeyguardViewManager, mUnlockMethodCache,
192 mKeyguardIndicationController, mStackScroller, mHeadsUpManager,
193 mPowerManager, mNotificationPanelView, mBarService, mNotificationListener,
194 mNotificationLogger, mVisualStabilityManager, mViewHierarchyManager,
Selim Cinek7e222c3c2018-01-25 12:22:41 -0800195 mEntryManager, mScrimController, mFingerprintUnlockController,
196 mock(ActivityLaunchAnimator.class));
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900197 mStatusBar.mContext = mContext;
198 mStatusBar.mComponents = mContext.getComponents();
Eliot Courtney2b4c3a02017-11-27 13:27:46 +0900199 mEntryManager.setUpForTest(mStatusBar, mStackScroller, mStatusBar, mHeadsUpManager,
200 mNotificationData);
Eliot Courtney4a96b362017-12-14 19:38:52 +0900201 mNotificationLogger.setUpWithEntryManager(mEntryManager, mStackScroller);
Eliot Courtney3985ad52017-11-17 16:51:52 +0900202
Eliot Courtney3985ad52017-11-17 16:51:52 +0900203 TestableLooper.get(this).setMessageHandler(m -> {
204 if (m.getCallback() == mStatusBar.mNotificationLogger.getVisibilityReporter()) {
205 return false;
Chris Wren621933f2017-06-14 15:59:03 -0400206 }
Eliot Courtney3985ad52017-11-17 16:51:52 +0900207 return true;
Chris Wren621933f2017-06-14 15:59:03 -0400208 });
Adrian Roosef7a4022017-01-19 14:48:35 -0800209 }
210
Adrian Roos02de4982017-02-11 09:35:54 +0100211 @Test
Jason Monk5ecf80c2017-07-06 15:28:17 -0400212 public void testSetBouncerShowing_noCrash() {
213 mStatusBar.mCommandQueue = mock(CommandQueue.class);
214 mStatusBar.setBouncerShowing(true);
215 }
216
217 @Test
Adrian Roosef7a4022017-01-19 14:48:35 -0800218 public void executeRunnableDismissingKeyguard_nullRunnable_showingAndOccluded() {
219 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
220 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(true);
221
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500222 mStatusBar.executeRunnableDismissingKeyguard(null, null, false, false, false);
Adrian Roosef7a4022017-01-19 14:48:35 -0800223 }
224
Adrian Roos02de4982017-02-11 09:35:54 +0100225 @Test
Adrian Roosef7a4022017-01-19 14:48:35 -0800226 public void executeRunnableDismissingKeyguard_nullRunnable_showing() {
227 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
228 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
229
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500230 mStatusBar.executeRunnableDismissingKeyguard(null, null, false, false, false);
Adrian Roosef7a4022017-01-19 14:48:35 -0800231 }
232
Adrian Roos02de4982017-02-11 09:35:54 +0100233 @Test
Adrian Roosef7a4022017-01-19 14:48:35 -0800234 public void executeRunnableDismissingKeyguard_nullRunnable_notShowing() {
235 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(false);
236 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
237
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500238 mStatusBar.executeRunnableDismissingKeyguard(null, null, false, false, false);
Adrian Roosef7a4022017-01-19 14:48:35 -0800239 }
240
Adrian Roos02de4982017-02-11 09:35:54 +0100241 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500242 public void lockscreenStateMetrics_notShowing() {
243 // uninteresting state, except that fingerprint must be non-zero
244 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
245 when(mUnlockMethodCache.canSkipBouncer()).thenReturn(true);
246 // interesting state
247 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(false);
248 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false);
249 when(mUnlockMethodCache.isMethodSecure()).thenReturn(false);
Chris Wren27a52fa2017-02-01 14:21:43 -0500250 mStatusBar.onKeyguardViewManagerStatesUpdated();
251
Chris Wrenef319902017-03-07 17:58:31 -0500252 MetricsAsserts.assertHasLog("missing hidden insecure lockscreen log",
253 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500254 new LogMaker(MetricsEvent.LOCKSCREEN)
255 .setType(MetricsEvent.TYPE_CLOSE)
256 .setSubtype(0));
257 }
258
Adrian Roos02de4982017-02-11 09:35:54 +0100259 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500260 public void lockscreenStateMetrics_notShowing_secure() {
261 // uninteresting state, except that fingerprint must be non-zero
262 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
263 when(mUnlockMethodCache.canSkipBouncer()).thenReturn(true);
264 // interesting state
265 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(false);
266 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false);
267 when(mUnlockMethodCache.isMethodSecure()).thenReturn(true);
268
269 mStatusBar.onKeyguardViewManagerStatesUpdated();
270
Chris Wrenef319902017-03-07 17:58:31 -0500271 MetricsAsserts.assertHasLog("missing hidden secure lockscreen log",
272 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500273 new LogMaker(MetricsEvent.LOCKSCREEN)
274 .setType(MetricsEvent.TYPE_CLOSE)
275 .setSubtype(1));
276 }
277
Adrian Roos02de4982017-02-11 09:35:54 +0100278 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500279 public void lockscreenStateMetrics_isShowing() {
280 // uninteresting state, except that fingerprint must be non-zero
281 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
282 when(mUnlockMethodCache.canSkipBouncer()).thenReturn(true);
283 // interesting state
284 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
285 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false);
286 when(mUnlockMethodCache.isMethodSecure()).thenReturn(false);
287
288 mStatusBar.onKeyguardViewManagerStatesUpdated();
289
Chris Wrenef319902017-03-07 17:58:31 -0500290 MetricsAsserts.assertHasLog("missing insecure lockscreen showing",
291 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500292 new LogMaker(MetricsEvent.LOCKSCREEN)
293 .setType(MetricsEvent.TYPE_OPEN)
294 .setSubtype(0));
295 }
296
Adrian Roos02de4982017-02-11 09:35:54 +0100297 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500298 public void lockscreenStateMetrics_isShowing_secure() {
299 // uninteresting state, except that fingerprint must be non-zero
300 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
301 when(mUnlockMethodCache.canSkipBouncer()).thenReturn(true);
302 // interesting state
303 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
304 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false);
305 when(mUnlockMethodCache.isMethodSecure()).thenReturn(true);
306
307 mStatusBar.onKeyguardViewManagerStatesUpdated();
308
Chris Wrenef319902017-03-07 17:58:31 -0500309 MetricsAsserts.assertHasLog("missing secure lockscreen showing log",
310 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500311 new LogMaker(MetricsEvent.LOCKSCREEN)
312 .setType(MetricsEvent.TYPE_OPEN)
313 .setSubtype(1));
314 }
315
Adrian Roos02de4982017-02-11 09:35:54 +0100316 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500317 public void lockscreenStateMetrics_isShowingBouncer() {
318 // uninteresting state, except that fingerprint must be non-zero
319 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
320 when(mUnlockMethodCache.canSkipBouncer()).thenReturn(true);
321 // interesting state
322 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
323 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(true);
324 when(mUnlockMethodCache.isMethodSecure()).thenReturn(true);
325
326 mStatusBar.onKeyguardViewManagerStatesUpdated();
327
Chris Wrenef319902017-03-07 17:58:31 -0500328 MetricsAsserts.assertHasLog("missing bouncer log",
329 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500330 new LogMaker(MetricsEvent.BOUNCER)
331 .setType(MetricsEvent.TYPE_OPEN)
332 .setSubtype(1));
333 }
334
Adrian Roos02de4982017-02-11 09:35:54 +0100335 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500336 public void onActivatedMetrics() {
337 ActivatableNotificationView view = mock(ActivatableNotificationView.class);
338 mStatusBar.onActivated(view);
339
Chris Wrenef319902017-03-07 17:58:31 -0500340 MetricsAsserts.assertHasLog("missing lockscreen note tap log",
341 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500342 new LogMaker(MetricsEvent.ACTION_LS_NOTE)
343 .setType(MetricsEvent.TYPE_ACTION));
344 }
345
Julia Reynolds30203152017-05-26 13:36:31 -0400346 @Test
347 public void testShouldPeek_nonSuppressedGroupSummary() {
348 when(mPowerManager.isScreenOn()).thenReturn(true);
349 when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false);
Julia Reynolds24653c32018-03-02 13:16:37 -0500350 when(mNotificationData.shouldSuppressStatusBar(any())).thenReturn(false);
Julia Reynolds30203152017-05-26 13:36:31 -0400351 when(mNotificationData.shouldFilterOut(any())).thenReturn(false);
352 when(mSystemServicesProxy.isDreaming()).thenReturn(false);
353 when(mNotificationData.getImportance(any())).thenReturn(IMPORTANCE_HIGH);
354
355 Notification n = new Notification.Builder(getContext(), "a")
356 .setGroup("a")
357 .setGroupSummary(true)
358 .setGroupAlertBehavior(Notification.GROUP_ALERT_SUMMARY)
359 .build();
360 StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, "a", 0, 0, n,
361 UserHandle.of(0), null, 0);
362 NotificationData.Entry entry = new NotificationData.Entry(sbn);
363
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900364 assertTrue(mEntryManager.shouldPeek(entry, sbn));
Julia Reynolds30203152017-05-26 13:36:31 -0400365 }
366
367 @Test
368 public void testShouldPeek_suppressedGroupSummary() {
369 when(mPowerManager.isScreenOn()).thenReturn(true);
370 when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false);
Julia Reynolds24653c32018-03-02 13:16:37 -0500371 when(mNotificationData.shouldSuppressStatusBar(any())).thenReturn(false);
Julia Reynolds30203152017-05-26 13:36:31 -0400372 when(mNotificationData.shouldFilterOut(any())).thenReturn(false);
373 when(mSystemServicesProxy.isDreaming()).thenReturn(false);
374 when(mNotificationData.getImportance(any())).thenReturn(IMPORTANCE_HIGH);
375
376 Notification n = new Notification.Builder(getContext(), "a")
377 .setGroup("a")
378 .setGroupSummary(true)
379 .setGroupAlertBehavior(Notification.GROUP_ALERT_CHILDREN)
380 .build();
381 StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, "a", 0, 0, n,
382 UserHandle.of(0), null, 0);
383 NotificationData.Entry entry = new NotificationData.Entry(sbn);
384
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900385 assertFalse(mEntryManager.shouldPeek(entry, sbn));
Julia Reynolds30203152017-05-26 13:36:31 -0400386 }
387
Chris Wren621933f2017-06-14 15:59:03 -0400388 @Test
Julia Reynolds24653c32018-03-02 13:16:37 -0500389 public void testShouldPeek_suppressedPeek() {
Beverly38159ce2017-07-13 16:39:24 -0400390 when(mPowerManager.isScreenOn()).thenReturn(true);
391 when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false);
392 when(mNotificationData.shouldFilterOut(any())).thenReturn(false);
393 when(mSystemServicesProxy.isDreaming()).thenReturn(false);
394 when(mNotificationData.getImportance(any())).thenReturn(IMPORTANCE_HIGH);
395
Julia Reynolds24653c32018-03-02 13:16:37 -0500396 when(mNotificationData.shouldSuppressPeek(any())).thenReturn(true);
397
398 Notification n = new Notification.Builder(getContext(), "a").build();
399 StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, "a", 0, 0, n,
400 UserHandle.of(0), null, 0);
401 NotificationData.Entry entry = new NotificationData.Entry(sbn);
402
403 assertFalse(mEntryManager.shouldPeek(entry, sbn));
404 }
405
406 @Test
407 public void testShouldPeek_noSuppressedPeek() {
408 when(mPowerManager.isScreenOn()).thenReturn(true);
409 when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false);
410 when(mNotificationData.shouldFilterOut(any())).thenReturn(false);
411 when(mSystemServicesProxy.isDreaming()).thenReturn(false);
412 when(mNotificationData.getImportance(any())).thenReturn(IMPORTANCE_HIGH);
413
414 when(mNotificationData.shouldSuppressPeek(any())).thenReturn(false);
Beverly38159ce2017-07-13 16:39:24 -0400415
416 Notification n = new Notification.Builder(getContext(), "a").build();
417 StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, "a", 0, 0, n,
418 UserHandle.of(0), null, 0);
419 NotificationData.Entry entry = new NotificationData.Entry(sbn);
420
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900421 assertTrue(mEntryManager.shouldPeek(entry, sbn));
Beverly38159ce2017-07-13 16:39:24 -0400422 }
423
424 @Test
Chris Wren621933f2017-06-14 15:59:03 -0400425 public void testLogHidden() {
426 try {
427 mStatusBar.handleVisibleToUserChanged(false);
Selim Cinek1a891a92017-12-04 17:41:27 +0100428 waitForUiOffloadThread();
Chris Wren621933f2017-06-14 15:59:03 -0400429 verify(mBarService, times(1)).onPanelHidden();
430 verify(mBarService, never()).onPanelRevealed(anyBoolean(), anyInt());
431 } catch (RemoteException e) {
432 fail();
433 }
434 }
435
436 @Test
437 public void testPanelOpenForPeek() {
438 when(mHeadsUpManager.hasPinnedHeadsUp()).thenReturn(true);
439 when(mNotificationData.getActiveNotifications()).thenReturn(mNotificationList);
440 when(mNotificationList.size()).thenReturn(5);
441 when(mNotificationPanelView.isFullyCollapsed()).thenReturn(true);
442 mStatusBar.setBarStateForTest(StatusBarState.SHADE);
443
444 try {
445 mStatusBar.handleVisibleToUserChanged(true);
Selim Cinek1a891a92017-12-04 17:41:27 +0100446 waitForUiOffloadThread();
Chris Wren621933f2017-06-14 15:59:03 -0400447 verify(mBarService, never()).onPanelHidden();
448 verify(mBarService, times(1)).onPanelRevealed(false, 1);
449 } catch (RemoteException e) {
450 fail();
451 }
452 TestableLooper.get(this).processAllMessages();
453 }
454
455 @Test
456 public void testPanelOpenAndClear() {
457 when(mHeadsUpManager.hasPinnedHeadsUp()).thenReturn(false);
458 when(mNotificationData.getActiveNotifications()).thenReturn(mNotificationList);
459 when(mNotificationList.size()).thenReturn(5);
460 when(mNotificationPanelView.isFullyCollapsed()).thenReturn(false);
461 mStatusBar.setBarStateForTest(StatusBarState.SHADE);
462
463 try {
464 mStatusBar.handleVisibleToUserChanged(true);
Selim Cinek1a891a92017-12-04 17:41:27 +0100465 waitForUiOffloadThread();
Chris Wren621933f2017-06-14 15:59:03 -0400466 verify(mBarService, never()).onPanelHidden();
467 verify(mBarService, times(1)).onPanelRevealed(true, 5);
468 } catch (RemoteException e) {
469 fail();
470 }
471 TestableLooper.get(this).processAllMessages();
472 }
473
474 @Test
475 public void testPanelOpenAndNoClear() {
476 when(mHeadsUpManager.hasPinnedHeadsUp()).thenReturn(false);
477 when(mNotificationData.getActiveNotifications()).thenReturn(mNotificationList);
478 when(mNotificationList.size()).thenReturn(5);
479 when(mNotificationPanelView.isFullyCollapsed()).thenReturn(false);
480 mStatusBar.setBarStateForTest(StatusBarState.KEYGUARD);
481
482 try {
483 mStatusBar.handleVisibleToUserChanged(true);
Selim Cinek1a891a92017-12-04 17:41:27 +0100484 waitForUiOffloadThread();
Chris Wren621933f2017-06-14 15:59:03 -0400485 verify(mBarService, never()).onPanelHidden();
486 verify(mBarService, times(1)).onPanelRevealed(false, 5);
487 } catch (RemoteException e) {
488 fail();
489 }
490 TestableLooper.get(this).processAllMessages();
491 }
492
Jason Monk51305372017-06-22 11:41:08 -0400493 @Test
Charles He2eda2422017-09-24 17:55:21 +0100494 public void testDisableExpandStatusBar() {
495 mStatusBar.setBarStateForTest(StatusBarState.SHADE);
496 mStatusBar.setUserSetupForTest(true);
497 when(mStatusBar.isDeviceProvisioned()).thenReturn(true);
498
499 mStatusBar.disable(StatusBarManager.DISABLE_NONE,
500 StatusBarManager.DISABLE2_NOTIFICATION_SHADE, false);
501 verify(mNotificationPanelView).setQsExpansionEnabled(false);
502 mStatusBar.animateExpandNotificationsPanel();
503 verify(mNotificationPanelView, never()).expand(anyBoolean());
504 mStatusBar.animateExpandSettingsPanel(null);
505 verify(mNotificationPanelView, never()).expand(anyBoolean());
506
507 mStatusBar.disable(StatusBarManager.DISABLE_NONE, StatusBarManager.DISABLE2_NONE, false);
508 verify(mNotificationPanelView).setQsExpansionEnabled(true);
509 mStatusBar.animateExpandNotificationsPanel();
510 verify(mNotificationPanelView).expand(anyBoolean());
511 mStatusBar.animateExpandSettingsPanel(null);
512 verify(mNotificationPanelView).expand(anyBoolean());
513 }
514
515 @Test
Jason Monk51305372017-06-22 11:41:08 -0400516 public void testDump_DoesNotCrash() {
517 mStatusBar.dump(null, new PrintWriter(new ByteArrayOutputStream()), null);
518 }
519
Jason Monk9c4faa82017-08-15 09:32:27 -0400520 @Test
521 @RunWithLooper(setAsMainLooper = true)
522 public void testUpdateKeyguardState_DoesNotCrash() {
523 mStatusBar.mStatusBarWindow = mock(StatusBarWindowView.class);
524 mStatusBar.mState = StatusBarState.KEYGUARD;
525 mStatusBar.mDozeScrimController = mock(DozeScrimController.class);
526 mStatusBar.mNotificationIconAreaController = mock(NotificationIconAreaController.class);
Eliot Courtney09322282017-11-09 15:31:19 +0900527 mStatusBar.mLockscreenUserManager = mock(NotificationLockscreenUserManager.class);
528 when(mStatusBar.mLockscreenUserManager.getCurrentProfiles()).thenReturn(
529 new SparseArray<>());
Jason Monk9c4faa82017-08-15 09:32:27 -0400530 mStatusBar.updateKeyguardState(false, false);
531 }
532
Lucas Dupinc2e75462017-12-06 13:59:25 -0800533 @Test
534 public void testFingerprintNotification_UpdatesScrims() {
535 mStatusBar.mStatusBarWindowManager = mock(StatusBarWindowManager.class);
Lucas Dupinc2e75462017-12-06 13:59:25 -0800536 mStatusBar.mDozeScrimController = mock(DozeScrimController.class);
Julia Reynolds24653c32018-03-02 13:16:37 -0500537 mStatusBar.mNotificationIconAreaController = mock(NotificationIconAreaController.class);
Lucas Dupinc2e75462017-12-06 13:59:25 -0800538 mStatusBar.notifyFpAuthModeChanged();
539 verify(mScrimController).transitionTo(any(), any());
540 }
541
Lucas Dupin311eac82017-12-11 14:40:07 -0800542 @Test
543 public void testFingerprintUnlock_UpdatesScrims() {
544 // Simulate unlocking from AoD with fingerprint.
545 when(mFingerprintUnlockController.getMode())
546 .thenReturn(FingerprintUnlockController.MODE_WAKE_AND_UNLOCK);
547 mStatusBar.updateScrimController();
548 verify(mScrimController).transitionTo(eq(ScrimState.UNLOCKED), any());
549 }
550
Lucas Dupind5107302018-03-19 15:30:29 -0700551 @Test
552 public void testSetOccluded_propagatesToScrimController() {
553 mStatusBar.setOccluded(true);
554 verify(mScrimController).setKeyguardOccluded(eq(true));
555
556 reset(mScrimController);
557 mStatusBar.setOccluded(false);
558 verify(mScrimController).setKeyguardOccluded(eq(false));
559 }
560
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500561 static class TestableStatusBar extends StatusBar {
Chris Wren27a52fa2017-02-01 14:21:43 -0500562 public TestableStatusBar(StatusBarKeyguardViewManager man,
563 UnlockMethodCache unlock, KeyguardIndicationController key,
yoshiki iguchi4e30e762018-02-06 12:09:23 +0900564 NotificationStackScrollLayout stack, HeadsUpManagerPhone hum,
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900565 PowerManager pm, NotificationPanelView panelView,
Eliot Courtney3985ad52017-11-17 16:51:52 +0900566 IStatusBarService barService, NotificationListener notificationListener,
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900567 NotificationLogger notificationLogger,
Eliot Courtney2b4c3a02017-11-27 13:27:46 +0900568 VisualStabilityManager visualStabilityManager,
569 NotificationViewHierarchyManager viewHierarchyManager,
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900570 TestableNotificationEntryManager entryManager, ScrimController scrimController,
Selim Cinek7e222c3c2018-01-25 12:22:41 -0800571 FingerprintUnlockController fingerprintUnlockController,
572 ActivityLaunchAnimator launchAnimator) {
Adrian Roosef7a4022017-01-19 14:48:35 -0800573 mStatusBarKeyguardViewManager = man;
Chris Wren27a52fa2017-02-01 14:21:43 -0500574 mUnlockMethodCache = unlock;
575 mKeyguardIndicationController = key;
576 mStackScroller = stack;
Julia Reynolds30203152017-05-26 13:36:31 -0400577 mHeadsUpManager = hum;
Julia Reynolds30203152017-05-26 13:36:31 -0400578 mPowerManager = pm;
Jorim Jaggifd3b1a12017-06-06 17:04:19 -0700579 mNotificationPanel = panelView;
Chris Wren621933f2017-06-14 15:59:03 -0400580 mBarService = barService;
Eliot Courtney3985ad52017-11-17 16:51:52 +0900581 mNotificationListener = notificationListener;
582 mNotificationLogger = notificationLogger;
Adrian Roos6d5ebb72017-08-03 15:10:22 +0200583 mWakefulnessLifecycle = createAwakeWakefulnessLifecycle();
Eliot Courtney2b4c3a02017-11-27 13:27:46 +0900584 mVisualStabilityManager = visualStabilityManager;
585 mViewHierarchyManager = viewHierarchyManager;
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900586 mEntryManager = entryManager;
Lucas Dupinc2e75462017-12-06 13:59:25 -0800587 mScrimController = scrimController;
Lucas Dupin311eac82017-12-11 14:40:07 -0800588 mFingerprintUnlockController = fingerprintUnlockController;
Selim Cinek7e222c3c2018-01-25 12:22:41 -0800589 mActivityLaunchAnimator = launchAnimator;
Adrian Roos6d5ebb72017-08-03 15:10:22 +0200590 }
591
592 private WakefulnessLifecycle createAwakeWakefulnessLifecycle() {
593 WakefulnessLifecycle wakefulnessLifecycle = new WakefulnessLifecycle();
594 wakefulnessLifecycle.dispatchStartedWakingUp();
595 wakefulnessLifecycle.dispatchFinishedWakingUp();
596 return wakefulnessLifecycle;
Adrian Roosef7a4022017-01-19 14:48:35 -0800597 }
598
Jason Monk9c4faa82017-08-15 09:32:27 -0400599 @Override
600 protected void updateTheme() {
601 // Do nothing for now, until we have more mocking and StatusBar is smaller.
602 }
603
Chris Wren621933f2017-06-14 15:59:03 -0400604 public void setBarStateForTest(int state) {
605 mState = state;
Adrian Roosef7a4022017-01-19 14:48:35 -0800606 }
Charles He2eda2422017-09-24 17:55:21 +0100607
608 public void setUserSetupForTest(boolean userSetup) {
609 mUserSetup = userSetup;
610 }
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900611
612 }
613
614 private class TestableNotificationEntryManager extends NotificationEntryManager {
615
Eliot Courtney6c313d32017-12-14 19:57:51 +0900616 public TestableNotificationEntryManager(SystemServicesProxy systemServicesProxy,
617 PowerManager powerManager, Context context) {
618 super(context);
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900619 mSystemServicesProxy = systemServicesProxy;
620 mPowerManager = powerManager;
621 }
622
623 public void setUpForTest(NotificationPresenter presenter,
Eliot Courtney2b4c3a02017-11-27 13:27:46 +0900624 NotificationListContainer listContainer,
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900625 Callback callback,
yoshiki iguchi4e30e762018-02-06 12:09:23 +0900626 HeadsUpManagerPhone headsUpManager,
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900627 NotificationData notificationData) {
Eliot Courtney2b4c3a02017-11-27 13:27:46 +0900628 super.setUpWithPresenter(presenter, listContainer, callback, headsUpManager);
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900629 mNotificationData = notificationData;
630 mUseHeadsUp = true;
631 }
Adrian Roosef7a4022017-01-19 14:48:35 -0800632 }
Eliot Courtney09322282017-11-09 15:31:19 +0900633}