blob: a95361f9e04643bf36e7007c8306e22c81e45ce5 [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;
Gus Prevasec9e1f02018-12-18 15:28:12 -050020import static android.app.NotificationManager.Policy.SUPPRESSED_EFFECT_PEEK;
Charles Chenf3d295c2018-11-30 18:15:21 +080021import static android.view.Display.DEFAULT_DISPLAY;
Julia Reynolds30203152017-05-26 13:36:31 -040022
23import static junit.framework.Assert.assertFalse;
24import static junit.framework.Assert.assertTrue;
Chris Wren621933f2017-06-14 15:59:03 -040025import static junit.framework.TestCase.fail;
Julia Reynolds30203152017-05-26 13:36:31 -040026
Chris Wren621933f2017-06-14 15:59:03 -040027import static org.mockito.ArgumentMatchers.any;
28import static org.mockito.ArgumentMatchers.anyBoolean;
29import static org.mockito.ArgumentMatchers.anyInt;
30import static org.mockito.ArgumentMatchers.anyString;
Lucas Dupin311eac82017-12-11 14:40:07 -080031import static org.mockito.ArgumentMatchers.eq;
Adrian Roosef7a4022017-01-19 14:48:35 -080032import static org.mockito.Mockito.doAnswer;
33import static org.mockito.Mockito.mock;
Chris Wren621933f2017-06-14 15:59:03 -040034import static org.mockito.Mockito.never;
Lucas Dupind5107302018-03-19 15:30:29 -070035import static org.mockito.Mockito.reset;
Chris Wren621933f2017-06-14 15:59:03 -040036import static org.mockito.Mockito.times;
Chris Wren621933f2017-06-14 15:59:03 -040037import static org.mockito.Mockito.verify;
Jason Monk9c4faa82017-08-15 09:32:27 -040038import static org.mockito.Mockito.when;
Adrian Roosef7a4022017-01-19 14:48:35 -080039
Julia Reynolds30203152017-05-26 13:36:31 -040040import android.app.Notification;
Charles He2eda2422017-09-24 17:55:21 +010041import android.app.StatusBarManager;
Jason Monk51305372017-06-22 11:41:08 -040042import android.app.trust.TrustManager;
Eliot Courtneya6d8cf22017-10-20 13:26:58 +090043import android.content.Context;
Jason Monk51305372017-06-22 11:41:08 -040044import android.hardware.fingerprint.FingerprintManager;
Chris Wren27a52fa2017-02-01 14:21:43 -050045import android.metrics.LogMaker;
Jason Monk9c4faa82017-08-15 09:32:27 -040046import android.os.Binder;
Julia Reynolds30203152017-05-26 13:36:31 -040047import android.os.Handler;
Julia Reynolds30203152017-05-26 13:36:31 -040048import android.os.IPowerManager;
Jason Monk6dceace2018-05-15 20:24:07 -040049import android.os.Looper;
Julia Reynolds30203152017-05-26 13:36:31 -040050import android.os.PowerManager;
Chris Wren621933f2017-06-14 15:59:03 -040051import android.os.RemoteException;
Julia Reynolds30203152017-05-26 13:36:31 -040052import android.os.UserHandle;
Winson Chung67f5c8b2018-09-24 12:09:19 -070053import android.service.dreams.IDreamManager;
Julia Reynolds30203152017-05-26 13:36:31 -040054import android.service.notification.StatusBarNotification;
Adrian Roosef7a4022017-01-19 14:48:35 -080055import android.support.test.filters.SmallTest;
Chris Wren27a52fa2017-02-01 14:21:43 -050056import android.support.test.metricshelper.MetricsAsserts;
Chris Wren621933f2017-06-14 15:59:03 -040057import android.testing.AndroidTestingRunner;
58import android.testing.TestableLooper;
Chris Wren621933f2017-06-14 15:59:03 -040059import android.testing.TestableLooper.RunWithLooper;
Eliot Courtney09322282017-11-09 15:31:19 +090060import android.util.SparseArray;
Jason Monk51305372017-06-22 11:41:08 -040061import android.view.ViewGroup.LayoutParams;
Adrian Roosef7a4022017-01-19 14:48:35 -080062
Chris Wrenef319902017-03-07 17:58:31 -050063import com.android.internal.logging.MetricsLogger;
Chris Wren27a52fa2017-02-01 14:21:43 -050064import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
Chris Wrenef319902017-03-07 17:58:31 -050065import com.android.internal.logging.testing.FakeMetricsLogger;
Chris Wren621933f2017-06-14 15:59:03 -040066import com.android.internal.statusbar.IStatusBarService;
Lucas Dupin3d053532019-01-29 12:35:22 -080067import com.android.keyguard.KeyguardUpdateMonitor;
Jason Monk297c04e2018-08-23 17:16:59 -040068import com.android.systemui.Dependency;
Eliot Courtneya6d8cf22017-10-20 13:26:58 +090069import com.android.systemui.ForegroundServiceController;
Jason Monk297c04e2018-08-23 17:16:59 -040070import com.android.systemui.InitController;
Jason Monk9c4faa82017-08-15 09:32:27 -040071import com.android.systemui.R;
Selim Cinek9d20bed2018-12-26 16:02:34 -080072import com.android.systemui.SystemUIFactory;
Adrian Roosef7a4022017-01-19 14:48:35 -080073import com.android.systemui.SysuiTestCase;
Jason Monkd97204c2018-12-21 15:49:04 -050074import com.android.systemui.UiOffloadThread;
Fabian Kozynski1f32cf02018-10-23 12:23:31 -040075import com.android.systemui.appops.AppOpsController;
76import com.android.systemui.appops.AppOpsControllerImpl;
Jason Monk9c4faa82017-08-15 09:32:27 -040077import com.android.systemui.assist.AssistManager;
Mady Mellorcd9b1302018-11-06 18:08:04 -080078import com.android.systemui.bubbles.BubbleController;
jovanak5f6dc612018-03-27 11:59:22 -070079import com.android.systemui.classifier.FalsingManager;
Lucas Dupin988efb22018-12-04 16:53:58 -080080import com.android.systemui.doze.DozeHost;
81import com.android.systemui.doze.DozeLog;
Jason Monk297c04e2018-08-23 17:16:59 -040082import com.android.systemui.keyguard.KeyguardViewMediator;
Adrian Roos6d5ebb72017-08-03 15:10:22 +020083import com.android.systemui.keyguard.WakefulnessLifecycle;
Jason Monk297c04e2018-08-23 17:16:59 -040084import com.android.systemui.plugins.ActivityStarter.OnDismissAction;
Beverly8fdb5332019-02-04 14:29:49 -050085import com.android.systemui.plugins.statusbar.StatusBarStateController;
Jason Monk5ecf80c2017-07-06 15:28:17 -040086import com.android.systemui.statusbar.CommandQueue;
Chris Wren27a52fa2017-02-01 14:21:43 -050087import com.android.systemui.statusbar.KeyguardIndicationController;
Charles Chen10ca70b2018-11-28 00:03:38 +080088import com.android.systemui.statusbar.NavigationBarController;
Eliot Courtney3985ad52017-11-17 16:51:52 +090089import com.android.systemui.statusbar.NotificationListener;
Eliot Courtney09322282017-11-09 15:31:19 +090090import com.android.systemui.statusbar.NotificationLockscreenUserManager;
Eliot Courtneya6d8cf22017-10-20 13:26:58 +090091import com.android.systemui.statusbar.NotificationMediaManager;
92import com.android.systemui.statusbar.NotificationPresenter;
93import com.android.systemui.statusbar.NotificationRemoteInputManager;
jovanak5f6dc612018-03-27 11:59:22 -070094import com.android.systemui.statusbar.NotificationShelf;
Eliot Courtney2b4c3a02017-11-27 13:27:46 +090095import com.android.systemui.statusbar.NotificationViewHierarchyManager;
Selim Cinek7c6fe5b2018-04-09 18:27:13 -070096import com.android.systemui.statusbar.RemoteInputController;
Jason Monk297c04e2018-08-23 17:16:59 -040097import com.android.systemui.statusbar.StatusBarState;
Beverly8fdb5332019-02-04 14:29:49 -050098import com.android.systemui.statusbar.StatusBarStateControllerImpl;
Gus Prevasb43dc652018-12-20 13:11:45 -050099import com.android.systemui.statusbar.notification.NotificationAlertingManager;
Gus Prevas26bc59b2018-12-19 11:26:39 -0500100import com.android.systemui.statusbar.notification.NotificationEntryListener;
Jason Monk297c04e2018-08-23 17:16:59 -0400101import com.android.systemui.statusbar.notification.NotificationEntryManager;
Gus Prevasec9e1f02018-12-18 15:28:12 -0500102import com.android.systemui.statusbar.notification.NotificationFilter;
103import com.android.systemui.statusbar.notification.NotificationInterruptionStateProvider;
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900104import com.android.systemui.statusbar.notification.VisualStabilityManager;
Ned Burnsf81c4c42019-01-07 14:10:43 -0500105import com.android.systemui.statusbar.notification.collection.NotificationData;
106import com.android.systemui.statusbar.notification.collection.NotificationEntry;
Jason Monk297c04e2018-08-23 17:16:59 -0400107import com.android.systemui.statusbar.notification.logging.NotificationLogger;
108import com.android.systemui.statusbar.notification.row.NotificationGutsManager;
109import com.android.systemui.statusbar.notification.stack.NotificationListContainer;
110import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout;
Jason Monk9c4faa82017-08-15 09:32:27 -0400111import com.android.systemui.statusbar.policy.DeviceProvisionedController;
Jason Monk9c4faa82017-08-15 09:32:27 -0400112import com.android.systemui.statusbar.policy.KeyguardMonitor;
113import com.android.systemui.statusbar.policy.KeyguardMonitorImpl;
jovanak5f6dc612018-03-27 11:59:22 -0700114import com.android.systemui.statusbar.policy.UserSwitcherController;
Adrian Roosef7a4022017-01-19 14:48:35 -0800115
116import org.junit.Before;
117import org.junit.Test;
118import org.junit.runner.RunWith;
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900119import org.mockito.Mock;
120import org.mockito.MockitoAnnotations;
Adrian Roosef7a4022017-01-19 14:48:35 -0800121
Jason Monk51305372017-06-22 11:41:08 -0400122import java.io.ByteArrayOutputStream;
123import java.io.PrintWriter;
Chris Wren621933f2017-06-14 15:59:03 -0400124import java.util.ArrayList;
Lucas Dupin3d053532019-01-29 12:35:22 -0800125import java.util.Arrays;
126import java.util.Collections;
127import java.util.HashSet;
Chris Wren621933f2017-06-14 15:59:03 -0400128
Adrian Roos02de4982017-02-11 09:35:54 +0100129@SmallTest
Chris Wren621933f2017-06-14 15:59:03 -0400130@RunWith(AndroidTestingRunner.class)
131@RunWithLooper
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500132public class StatusBarTest extends SysuiTestCase {
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900133 @Mock private StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
134 @Mock private UnlockMethodCache mUnlockMethodCache;
135 @Mock private KeyguardIndicationController mKeyguardIndicationController;
136 @Mock private NotificationStackScrollLayout mStackScroller;
yoshiki iguchi4e30e762018-02-06 12:09:23 +0900137 @Mock private HeadsUpManagerPhone mHeadsUpManager;
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900138 @Mock private NotificationPanelView mNotificationPanelView;
139 @Mock private IStatusBarService mBarService;
Winson Chung67f5c8b2018-09-24 12:09:19 -0700140 @Mock private IDreamManager mDreamManager;
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900141 @Mock private ScrimController mScrimController;
Lucas Dupin988efb22018-12-04 16:53:58 -0800142 @Mock private DozeScrimController mDozeScrimController;
Ned Burnsf81c4c42019-01-07 14:10:43 -0500143 @Mock private ArrayList<NotificationEntry> mNotificationList;
Gilad Brettercb51b8b2018-03-22 17:04:51 +0200144 @Mock private BiometricUnlockController mBiometricUnlockController;
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900145 @Mock private NotificationData mNotificationData;
Gus Prevasec9e1f02018-12-18 15:28:12 -0500146 @Mock
147 private NotificationInterruptionStateProvider.HeadsUpSuppressor mHeadsUpSuppressor;
Adrian Roosef7a4022017-01-19 14:48:35 -0800148
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900149 // Mock dependencies:
150 @Mock private NotificationViewHierarchyManager mViewHierarchyManager;
151 @Mock private VisualStabilityManager mVisualStabilityManager;
152 @Mock private NotificationListener mNotificationListener;
Lucas Dupin47a65c72018-02-15 14:16:18 -0800153 @Mock private KeyguardViewMediator mKeyguardViewMediator;
jovanak5f6dc612018-03-27 11:59:22 -0700154 @Mock private NotificationLockscreenUserManager mLockscreenUserManager;
Selim Cinek7c6fe5b2018-04-09 18:27:13 -0700155 @Mock private NotificationRemoteInputManager mRemoteInputManager;
156 @Mock private RemoteInputController mRemoteInputController;
Beverly8fdb5332019-02-04 14:29:49 -0500157 @Mock private StatusBarStateControllerImpl mStatusBarStateController;
Jason Monk297c04e2018-08-23 17:16:59 -0400158 @Mock private DeviceProvisionedController mDeviceProvisionedController;
159 @Mock private NotificationPresenter mNotificationPresenter;
Gus Prevas26bc59b2018-12-19 11:26:39 -0500160 @Mock
Gus Prevas8621bd22018-12-20 15:04:25 -0500161 private NotificationEntryListener mEntryListener;
Mady Mellorcd9b1302018-11-06 18:08:04 -0800162 @Mock private BubbleController mBubbleController;
Gus Prevasec9e1f02018-12-18 15:28:12 -0500163 @Mock
164 private NotificationFilter mNotificationFilter;
Gus Prevasb43dc652018-12-20 13:11:45 -0500165 @Mock
166 private NotificationAlertingManager mNotificationAlertingManager;
Tony Mak202f25d2019-01-07 14:40:39 +0000167 @Mock
168 private NotificationLogger.ExpansionStateLogger mExpansionStateLogger;
Lucas Dupin3d053532019-01-29 12:35:22 -0800169 @Mock
170 private KeyguardUpdateMonitor mKeyguardUpdateMonitor;
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900171
Eliot Courtney2b4c3a02017-11-27 13:27:46 +0900172 private TestableStatusBar mStatusBar;
173 private FakeMetricsLogger mMetricsLogger;
Eliot Courtney2b4c3a02017-11-27 13:27:46 +0900174 private PowerManager mPowerManager;
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900175 private TestableNotificationEntryManager mEntryManager;
Gus Prevasec9e1f02018-12-18 15:28:12 -0500176 private TestableNotificationInterruptionStateProvider mNotificationInterruptionStateProvider;
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900177 private NotificationLogger mNotificationLogger;
Jason Monk297c04e2018-08-23 17:16:59 -0400178 private CommandQueue mCommandQueue;
Chris Wren27a52fa2017-02-01 14:21:43 -0500179
Adrian Roos02de4982017-02-11 09:35:54 +0100180 @Before
Julia Reynolds30203152017-05-26 13:36:31 -0400181 public void setup() throws Exception {
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900182 MockitoAnnotations.initMocks(this);
Jason Monk9c4faa82017-08-15 09:32:27 -0400183 mDependency.injectMockDependency(AssistManager.class);
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900184 mDependency.injectMockDependency(NotificationGutsManager.class);
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900185 mDependency.injectMockDependency(NotificationMediaManager.class);
186 mDependency.injectMockDependency(ForegroundServiceController.class);
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900187 mDependency.injectTestDependency(NotificationViewHierarchyManager.class,
188 mViewHierarchyManager);
189 mDependency.injectTestDependency(VisualStabilityManager.class, mVisualStabilityManager);
190 mDependency.injectTestDependency(NotificationListener.class, mNotificationListener);
Jason Monk9c4faa82017-08-15 09:32:27 -0400191 mDependency.injectTestDependency(KeyguardMonitor.class, mock(KeyguardMonitorImpl.class));
Fabian Kozynski1f32cf02018-10-23 12:23:31 -0400192 mDependency.injectTestDependency(AppOpsController.class, mock(AppOpsControllerImpl.class));
Jason Monk1fd3fc32018-08-14 17:20:09 -0400193 mDependency.injectTestDependency(StatusBarStateController.class, mStatusBarStateController);
Jason Monk297c04e2018-08-23 17:16:59 -0400194 mDependency.injectTestDependency(DeviceProvisionedController.class,
195 mDeviceProvisionedController);
Mady Mellorcd9b1302018-11-06 18:08:04 -0800196 mDependency.injectMockDependency(BubbleController.class);
Gus Prevasec9e1f02018-12-18 15:28:12 -0500197 mDependency.injectTestDependency(NotificationFilter.class, mNotificationFilter);
Gus Prevasb43dc652018-12-20 13:11:45 -0500198 mDependency.injectTestDependency(NotificationAlertingManager.class,
199 mNotificationAlertingManager);
Gus Prevasec9e1f02018-12-18 15:28:12 -0500200
201 IPowerManager powerManagerService = mock(IPowerManager.class);
202 mPowerManager = new PowerManager(mContext, powerManagerService,
203 Handler.createAsync(Looper.myLooper()));
204
205 mNotificationInterruptionStateProvider =
206 new TestableNotificationInterruptionStateProvider(mContext, mPowerManager,
207 mDreamManager);
208 mDependency.injectTestDependency(NotificationInterruptionStateProvider.class,
209 mNotificationInterruptionStateProvider);
Charles Chen10ca70b2018-11-28 00:03:38 +0800210 mDependency.injectMockDependency(NavigationBarController.class);
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900211
Jason Monk51305372017-06-22 11:41:08 -0400212 mContext.addMockSystemService(TrustManager.class, mock(TrustManager.class));
213 mContext.addMockSystemService(FingerprintManager.class, mock(FingerprintManager.class));
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900214
Chris Wrenef319902017-03-07 17:58:31 -0500215 mMetricsLogger = new FakeMetricsLogger();
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900216 mDependency.injectTestDependency(MetricsLogger.class, mMetricsLogger);
Gus Prevas92586462019-01-04 16:06:12 -0500217 mEntryManager = new TestableNotificationEntryManager(mContext);
Jason Monkd97204c2018-12-21 15:49:04 -0500218 mNotificationLogger = new NotificationLogger(mNotificationListener,
Tony Mak202f25d2019-01-07 14:40:39 +0000219 Dependency.get(UiOffloadThread.class), mEntryManager, mStatusBarStateController,
220 mExpansionStateLogger);
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900221 mDependency.injectTestDependency(NotificationLogger.class, mNotificationLogger);
Lucas Dupin78c8fed2018-12-18 16:41:37 -0800222 DozeLog.traceDozing(mContext, false /* dozing */);
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900223
Jason Monk297c04e2018-08-23 17:16:59 -0400224 mCommandQueue = mock(CommandQueue.class);
225 when(mCommandQueue.asBinder()).thenReturn(new Binder());
226 mContext.putComponent(CommandQueue.class, mCommandQueue);
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900227
228 mContext.setTheme(R.style.Theme_SystemUI_Light);
229
230 when(mStackScroller.generateLayoutParams(any())).thenReturn(new LayoutParams(0, 0));
231 when(mNotificationPanelView.getLayoutParams()).thenReturn(new LayoutParams(0, 0));
Julia Reynolds30203152017-05-26 13:36:31 -0400232 when(powerManagerService.isInteractive()).thenReturn(true);
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900233 when(mStackScroller.getActivatedChild()).thenReturn(null);
Julia Reynolds30203152017-05-26 13:36:31 -0400234
Adrian Roosef7a4022017-01-19 14:48:35 -0800235 doAnswer(invocation -> {
236 OnDismissAction onDismissAction = (OnDismissAction) invocation.getArguments()[0];
237 onDismissAction.onDismiss();
238 return null;
239 }).when(mStatusBarKeyguardViewManager).dismissWithAction(any(), any(), anyBoolean());
240
241 doAnswer(invocation -> {
242 Runnable runnable = (Runnable) invocation.getArguments()[0];
243 runnable.run();
244 return null;
245 }).when(mStatusBarKeyguardViewManager).addAfterKeyguardGoneRunnable(any());
Chris Wren27a52fa2017-02-01 14:21:43 -0500246
Gus Prevasec9e1f02018-12-18 15:28:12 -0500247 mNotificationInterruptionStateProvider.setUpWithPresenter(mNotificationPresenter,
248 mHeadsUpManager, mHeadsUpSuppressor);
249
Selim Cinek7c6fe5b2018-04-09 18:27:13 -0700250 when(mRemoteInputManager.getController()).thenReturn(mRemoteInputController);
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900251 mStatusBar = new TestableStatusBar(mStatusBarKeyguardViewManager, mUnlockMethodCache,
252 mKeyguardIndicationController, mStackScroller, mHeadsUpManager,
253 mPowerManager, mNotificationPanelView, mBarService, mNotificationListener,
254 mNotificationLogger, mVisualStabilityManager, mViewHierarchyManager,
Gilad Brettercb51b8b2018-03-22 17:04:51 +0200255 mEntryManager, mScrimController, mBiometricUnlockController,
Jason Monk297c04e2018-08-23 17:16:59 -0400256 mKeyguardViewMediator, mRemoteInputManager, mock(NotificationGroupManager.class),
Kevin01a53cb2018-11-09 18:19:54 -0800257 mock(NotificationGroupAlertTransferHelper.class), mock(FalsingManager.class),
258 mock(StatusBarWindowController.class), mock(NotificationIconAreaController.class),
Lucas Dupin988efb22018-12-04 16:53:58 -0800259 mDozeScrimController, mock(NotificationShelf.class),
Kevin01a53cb2018-11-09 18:19:54 -0800260 mLockscreenUserManager, mCommandQueue, mNotificationPresenter,
Charles Chen8c9a83f2018-12-18 17:44:10 +0800261 mock(BubbleController.class), mock(NavigationBarController.class),
Lucas Dupin3d053532019-01-29 12:35:22 -0800262 mock(AutoHideController.class), mKeyguardUpdateMonitor);
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900263 mStatusBar.mContext = mContext;
264 mStatusBar.mComponents = mContext.getComponents();
Selim Cinek9d20bed2018-12-26 16:02:34 -0800265 SystemUIFactory.getInstance().getRootComponent()
266 .getStatusBarInjector()
267 .createStatusBar(mStatusBar);
Jason Monk297c04e2018-08-23 17:16:59 -0400268 mStatusBar.putComponent(StatusBar.class, mStatusBar);
269 Dependency.get(InitController.class).executePostInitTasks();
270 mEntryManager.setUpForTest(mock(NotificationPresenter.class), mStackScroller,
Gus Prevas8621bd22018-12-20 15:04:25 -0500271 mHeadsUpManager, mNotificationData);
272 mEntryManager.addNotificationEntryListener(mEntryListener);
Jason Monk297c04e2018-08-23 17:16:59 -0400273 mNotificationLogger.setUpWithContainer(mStackScroller);
Eliot Courtney3985ad52017-11-17 16:51:52 +0900274
Eliot Courtney3985ad52017-11-17 16:51:52 +0900275 TestableLooper.get(this).setMessageHandler(m -> {
276 if (m.getCallback() == mStatusBar.mNotificationLogger.getVisibilityReporter()) {
277 return false;
Chris Wren621933f2017-06-14 15:59:03 -0400278 }
Eliot Courtney3985ad52017-11-17 16:51:52 +0900279 return true;
Chris Wren621933f2017-06-14 15:59:03 -0400280 });
Adrian Roosef7a4022017-01-19 14:48:35 -0800281 }
282
Adrian Roos02de4982017-02-11 09:35:54 +0100283 @Test
Jason Monk5ecf80c2017-07-06 15:28:17 -0400284 public void testSetBouncerShowing_noCrash() {
285 mStatusBar.mCommandQueue = mock(CommandQueue.class);
286 mStatusBar.setBouncerShowing(true);
287 }
288
289 @Test
Adrian Roosef7a4022017-01-19 14:48:35 -0800290 public void executeRunnableDismissingKeyguard_nullRunnable_showingAndOccluded() {
291 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
292 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(true);
293
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500294 mStatusBar.executeRunnableDismissingKeyguard(null, null, false, false, false);
Adrian Roosef7a4022017-01-19 14:48:35 -0800295 }
296
Adrian Roos02de4982017-02-11 09:35:54 +0100297 @Test
Adrian Roosef7a4022017-01-19 14:48:35 -0800298 public void executeRunnableDismissingKeyguard_nullRunnable_showing() {
299 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
300 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
301
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500302 mStatusBar.executeRunnableDismissingKeyguard(null, null, false, false, false);
Adrian Roosef7a4022017-01-19 14:48:35 -0800303 }
304
Adrian Roos02de4982017-02-11 09:35:54 +0100305 @Test
Adrian Roosef7a4022017-01-19 14:48:35 -0800306 public void executeRunnableDismissingKeyguard_nullRunnable_notShowing() {
307 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(false);
308 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
309
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500310 mStatusBar.executeRunnableDismissingKeyguard(null, null, false, false, false);
Adrian Roosef7a4022017-01-19 14:48:35 -0800311 }
312
Adrian Roos02de4982017-02-11 09:35:54 +0100313 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500314 public void lockscreenStateMetrics_notShowing() {
315 // uninteresting state, except that fingerprint must be non-zero
316 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
317 when(mUnlockMethodCache.canSkipBouncer()).thenReturn(true);
318 // interesting state
319 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(false);
320 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false);
321 when(mUnlockMethodCache.isMethodSecure()).thenReturn(false);
Chris Wren27a52fa2017-02-01 14:21:43 -0500322 mStatusBar.onKeyguardViewManagerStatesUpdated();
323
Chris Wrenef319902017-03-07 17:58:31 -0500324 MetricsAsserts.assertHasLog("missing hidden insecure lockscreen log",
325 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500326 new LogMaker(MetricsEvent.LOCKSCREEN)
327 .setType(MetricsEvent.TYPE_CLOSE)
328 .setSubtype(0));
329 }
330
Adrian Roos02de4982017-02-11 09:35:54 +0100331 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500332 public void lockscreenStateMetrics_notShowing_secure() {
333 // uninteresting state, except that fingerprint must be non-zero
334 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
335 when(mUnlockMethodCache.canSkipBouncer()).thenReturn(true);
336 // interesting state
337 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(false);
338 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false);
339 when(mUnlockMethodCache.isMethodSecure()).thenReturn(true);
340
341 mStatusBar.onKeyguardViewManagerStatesUpdated();
342
Chris Wrenef319902017-03-07 17:58:31 -0500343 MetricsAsserts.assertHasLog("missing hidden secure lockscreen log",
344 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500345 new LogMaker(MetricsEvent.LOCKSCREEN)
346 .setType(MetricsEvent.TYPE_CLOSE)
347 .setSubtype(1));
348 }
349
Adrian Roos02de4982017-02-11 09:35:54 +0100350 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500351 public void lockscreenStateMetrics_isShowing() {
352 // uninteresting state, except that fingerprint must be non-zero
353 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
354 when(mUnlockMethodCache.canSkipBouncer()).thenReturn(true);
355 // interesting state
356 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
357 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false);
358 when(mUnlockMethodCache.isMethodSecure()).thenReturn(false);
359
360 mStatusBar.onKeyguardViewManagerStatesUpdated();
361
Chris Wrenef319902017-03-07 17:58:31 -0500362 MetricsAsserts.assertHasLog("missing insecure lockscreen showing",
363 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500364 new LogMaker(MetricsEvent.LOCKSCREEN)
365 .setType(MetricsEvent.TYPE_OPEN)
366 .setSubtype(0));
367 }
368
Adrian Roos02de4982017-02-11 09:35:54 +0100369 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500370 public void lockscreenStateMetrics_isShowing_secure() {
371 // uninteresting state, except that fingerprint must be non-zero
372 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
373 when(mUnlockMethodCache.canSkipBouncer()).thenReturn(true);
374 // interesting state
375 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
376 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false);
377 when(mUnlockMethodCache.isMethodSecure()).thenReturn(true);
378
379 mStatusBar.onKeyguardViewManagerStatesUpdated();
380
Chris Wrenef319902017-03-07 17:58:31 -0500381 MetricsAsserts.assertHasLog("missing secure lockscreen showing log",
382 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500383 new LogMaker(MetricsEvent.LOCKSCREEN)
384 .setType(MetricsEvent.TYPE_OPEN)
385 .setSubtype(1));
386 }
387
Adrian Roos02de4982017-02-11 09:35:54 +0100388 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500389 public void lockscreenStateMetrics_isShowingBouncer() {
390 // uninteresting state, except that fingerprint must be non-zero
391 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
392 when(mUnlockMethodCache.canSkipBouncer()).thenReturn(true);
393 // interesting state
394 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
395 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(true);
396 when(mUnlockMethodCache.isMethodSecure()).thenReturn(true);
397
398 mStatusBar.onKeyguardViewManagerStatesUpdated();
399
Chris Wrenef319902017-03-07 17:58:31 -0500400 MetricsAsserts.assertHasLog("missing bouncer log",
401 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500402 new LogMaker(MetricsEvent.BOUNCER)
403 .setType(MetricsEvent.TYPE_OPEN)
404 .setSubtype(1));
405 }
406
Adrian Roos02de4982017-02-11 09:35:54 +0100407 @Test
Winson Chung67f5c8b2018-09-24 12:09:19 -0700408 public void testShouldHeadsUp_nonSuppressedGroupSummary() throws Exception {
Julia Reynolds30203152017-05-26 13:36:31 -0400409 when(mPowerManager.isScreenOn()).thenReturn(true);
410 when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false);
Gus Prevasec9e1f02018-12-18 15:28:12 -0500411 when(mNotificationFilter.shouldFilterOut(any())).thenReturn(false);
Winson Chung67f5c8b2018-09-24 12:09:19 -0700412 when(mDreamManager.isDreaming()).thenReturn(false);
Gus Prevasec9e1f02018-12-18 15:28:12 -0500413 when(mHeadsUpSuppressor.canHeadsUp(any(), any())).thenReturn(true);
Julia Reynolds30203152017-05-26 13:36:31 -0400414
415 Notification n = new Notification.Builder(getContext(), "a")
416 .setGroup("a")
417 .setGroupSummary(true)
418 .setGroupAlertBehavior(Notification.GROUP_ALERT_SUMMARY)
419 .build();
420 StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, "a", 0, 0, n,
421 UserHandle.of(0), null, 0);
Ned Burnsf81c4c42019-01-07 14:10:43 -0500422 NotificationEntry entry = new NotificationEntry(sbn);
Gus Prevasec9e1f02018-12-18 15:28:12 -0500423 entry.importance = IMPORTANCE_HIGH;
Julia Reynolds30203152017-05-26 13:36:31 -0400424
Gus Prevasec9e1f02018-12-18 15:28:12 -0500425 assertTrue(mNotificationInterruptionStateProvider.shouldHeadsUp(entry));
Julia Reynolds30203152017-05-26 13:36:31 -0400426 }
427
428 @Test
Winson Chung67f5c8b2018-09-24 12:09:19 -0700429 public void testShouldHeadsUp_suppressedGroupSummary() throws Exception {
Julia Reynolds30203152017-05-26 13:36:31 -0400430 when(mPowerManager.isScreenOn()).thenReturn(true);
431 when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false);
Gus Prevasec9e1f02018-12-18 15:28:12 -0500432 when(mNotificationFilter.shouldFilterOut(any())).thenReturn(false);
Winson Chung67f5c8b2018-09-24 12:09:19 -0700433 when(mDreamManager.isDreaming()).thenReturn(false);
Gus Prevasec9e1f02018-12-18 15:28:12 -0500434 when(mHeadsUpSuppressor.canHeadsUp(any(), any())).thenReturn(true);
Julia Reynolds30203152017-05-26 13:36:31 -0400435
436 Notification n = new Notification.Builder(getContext(), "a")
437 .setGroup("a")
438 .setGroupSummary(true)
439 .setGroupAlertBehavior(Notification.GROUP_ALERT_CHILDREN)
440 .build();
441 StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, "a", 0, 0, n,
442 UserHandle.of(0), null, 0);
Ned Burnsf81c4c42019-01-07 14:10:43 -0500443 NotificationEntry entry = new NotificationEntry(sbn);
Gus Prevasec9e1f02018-12-18 15:28:12 -0500444 entry.importance = IMPORTANCE_HIGH;
Julia Reynolds30203152017-05-26 13:36:31 -0400445
Gus Prevasec9e1f02018-12-18 15:28:12 -0500446 assertFalse(mNotificationInterruptionStateProvider.shouldHeadsUp(entry));
Julia Reynolds30203152017-05-26 13:36:31 -0400447 }
448
Chris Wren621933f2017-06-14 15:59:03 -0400449 @Test
Winson Chung67f5c8b2018-09-24 12:09:19 -0700450 public void testShouldHeadsUp_suppressedHeadsUp() throws Exception {
Beverly38159ce2017-07-13 16:39:24 -0400451 when(mPowerManager.isScreenOn()).thenReturn(true);
452 when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false);
Gus Prevasec9e1f02018-12-18 15:28:12 -0500453 when(mNotificationFilter.shouldFilterOut(any())).thenReturn(false);
Winson Chung67f5c8b2018-09-24 12:09:19 -0700454 when(mDreamManager.isDreaming()).thenReturn(false);
Gus Prevasec9e1f02018-12-18 15:28:12 -0500455 when(mHeadsUpSuppressor.canHeadsUp(any(), any())).thenReturn(true);
Julia Reynolds24653c32018-03-02 13:16:37 -0500456
457 Notification n = new Notification.Builder(getContext(), "a").build();
458 StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, "a", 0, 0, n,
459 UserHandle.of(0), null, 0);
Ned Burnsf81c4c42019-01-07 14:10:43 -0500460 NotificationEntry entry = new NotificationEntry(sbn);
Gus Prevasec9e1f02018-12-18 15:28:12 -0500461 entry.suppressedVisualEffects = SUPPRESSED_EFFECT_PEEK;
462 entry.importance = IMPORTANCE_HIGH;
Julia Reynolds24653c32018-03-02 13:16:37 -0500463
Gus Prevasec9e1f02018-12-18 15:28:12 -0500464 assertFalse(mNotificationInterruptionStateProvider.shouldHeadsUp(entry));
Julia Reynolds24653c32018-03-02 13:16:37 -0500465 }
466
467 @Test
Winson Chung67f5c8b2018-09-24 12:09:19 -0700468 public void testShouldHeadsUp_noSuppressedHeadsUp() throws Exception {
Julia Reynolds24653c32018-03-02 13:16:37 -0500469 when(mPowerManager.isScreenOn()).thenReturn(true);
470 when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false);
Gus Prevasec9e1f02018-12-18 15:28:12 -0500471 when(mNotificationFilter.shouldFilterOut(any())).thenReturn(false);
Winson Chung67f5c8b2018-09-24 12:09:19 -0700472 when(mDreamManager.isDreaming()).thenReturn(false);
Gus Prevasec9e1f02018-12-18 15:28:12 -0500473 when(mHeadsUpSuppressor.canHeadsUp(any(), any())).thenReturn(true);
Beverly38159ce2017-07-13 16:39:24 -0400474
475 Notification n = new Notification.Builder(getContext(), "a").build();
476 StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, "a", 0, 0, n,
477 UserHandle.of(0), null, 0);
Ned Burnsf81c4c42019-01-07 14:10:43 -0500478 NotificationEntry entry = new NotificationEntry(sbn);
Gus Prevasec9e1f02018-12-18 15:28:12 -0500479 entry.importance = IMPORTANCE_HIGH;
Beverly38159ce2017-07-13 16:39:24 -0400480
Gus Prevasec9e1f02018-12-18 15:28:12 -0500481 assertTrue(mNotificationInterruptionStateProvider.shouldHeadsUp(entry));
Beverly38159ce2017-07-13 16:39:24 -0400482 }
483
484 @Test
Chris Wren621933f2017-06-14 15:59:03 -0400485 public void testLogHidden() {
486 try {
487 mStatusBar.handleVisibleToUserChanged(false);
Selim Cinek1a891a92017-12-04 17:41:27 +0100488 waitForUiOffloadThread();
Chris Wren621933f2017-06-14 15:59:03 -0400489 verify(mBarService, times(1)).onPanelHidden();
490 verify(mBarService, never()).onPanelRevealed(anyBoolean(), anyInt());
491 } catch (RemoteException e) {
492 fail();
493 }
494 }
495
496 @Test
Kevina97ea052018-09-11 13:53:18 -0700497 public void testPanelOpenForHeadsUp() {
Jason Monk297c04e2018-08-23 17:16:59 -0400498 when(mDeviceProvisionedController.isDeviceProvisioned()).thenReturn(true);
Chris Wren621933f2017-06-14 15:59:03 -0400499 when(mHeadsUpManager.hasPinnedHeadsUp()).thenReturn(true);
500 when(mNotificationData.getActiveNotifications()).thenReturn(mNotificationList);
501 when(mNotificationList.size()).thenReturn(5);
Jason Monk297c04e2018-08-23 17:16:59 -0400502 when(mNotificationPresenter.isPresenterFullyCollapsed()).thenReturn(true);
Chris Wren621933f2017-06-14 15:59:03 -0400503 mStatusBar.setBarStateForTest(StatusBarState.SHADE);
504
505 try {
506 mStatusBar.handleVisibleToUserChanged(true);
Selim Cinek1a891a92017-12-04 17:41:27 +0100507 waitForUiOffloadThread();
Chris Wren621933f2017-06-14 15:59:03 -0400508 verify(mBarService, never()).onPanelHidden();
509 verify(mBarService, times(1)).onPanelRevealed(false, 1);
510 } catch (RemoteException e) {
511 fail();
512 }
513 TestableLooper.get(this).processAllMessages();
514 }
515
516 @Test
517 public void testPanelOpenAndClear() {
518 when(mHeadsUpManager.hasPinnedHeadsUp()).thenReturn(false);
519 when(mNotificationData.getActiveNotifications()).thenReturn(mNotificationList);
520 when(mNotificationList.size()).thenReturn(5);
Jason Monk297c04e2018-08-23 17:16:59 -0400521 when(mNotificationPresenter.isPresenterFullyCollapsed()).thenReturn(false);
Chris Wren621933f2017-06-14 15:59:03 -0400522 mStatusBar.setBarStateForTest(StatusBarState.SHADE);
523
524 try {
525 mStatusBar.handleVisibleToUserChanged(true);
Selim Cinek1a891a92017-12-04 17:41:27 +0100526 waitForUiOffloadThread();
Chris Wren621933f2017-06-14 15:59:03 -0400527 verify(mBarService, never()).onPanelHidden();
528 verify(mBarService, times(1)).onPanelRevealed(true, 5);
529 } catch (RemoteException e) {
530 fail();
531 }
532 TestableLooper.get(this).processAllMessages();
533 }
534
535 @Test
536 public void testPanelOpenAndNoClear() {
537 when(mHeadsUpManager.hasPinnedHeadsUp()).thenReturn(false);
538 when(mNotificationData.getActiveNotifications()).thenReturn(mNotificationList);
539 when(mNotificationList.size()).thenReturn(5);
Jason Monk297c04e2018-08-23 17:16:59 -0400540 when(mNotificationPresenter.isPresenterFullyCollapsed()).thenReturn(false);
Chris Wren621933f2017-06-14 15:59:03 -0400541 mStatusBar.setBarStateForTest(StatusBarState.KEYGUARD);
542
543 try {
544 mStatusBar.handleVisibleToUserChanged(true);
Selim Cinek1a891a92017-12-04 17:41:27 +0100545 waitForUiOffloadThread();
Chris Wren621933f2017-06-14 15:59:03 -0400546 verify(mBarService, never()).onPanelHidden();
547 verify(mBarService, times(1)).onPanelRevealed(false, 5);
548 } catch (RemoteException e) {
549 fail();
550 }
551 TestableLooper.get(this).processAllMessages();
552 }
553
Jason Monk51305372017-06-22 11:41:08 -0400554 @Test
Charles He2eda2422017-09-24 17:55:21 +0100555 public void testDisableExpandStatusBar() {
556 mStatusBar.setBarStateForTest(StatusBarState.SHADE);
557 mStatusBar.setUserSetupForTest(true);
Jason Monk297c04e2018-08-23 17:16:59 -0400558 when(mDeviceProvisionedController.isDeviceProvisioned()).thenReturn(true);
Charles He2eda2422017-09-24 17:55:21 +0100559
Jason Monk297c04e2018-08-23 17:16:59 -0400560 when(mCommandQueue.panelsEnabled()).thenReturn(false);
Charles Chenf3d295c2018-11-30 18:15:21 +0800561 mStatusBar.disable(DEFAULT_DISPLAY, StatusBarManager.DISABLE_NONE,
Charles He2eda2422017-09-24 17:55:21 +0100562 StatusBarManager.DISABLE2_NOTIFICATION_SHADE, false);
563 verify(mNotificationPanelView).setQsExpansionEnabled(false);
564 mStatusBar.animateExpandNotificationsPanel();
565 verify(mNotificationPanelView, never()).expand(anyBoolean());
566 mStatusBar.animateExpandSettingsPanel(null);
567 verify(mNotificationPanelView, never()).expand(anyBoolean());
568
Jason Monk297c04e2018-08-23 17:16:59 -0400569 when(mCommandQueue.panelsEnabled()).thenReturn(true);
Charles Chenf3d295c2018-11-30 18:15:21 +0800570 mStatusBar.disable(DEFAULT_DISPLAY, StatusBarManager.DISABLE_NONE,
571 StatusBarManager.DISABLE2_NONE, false);
Charles He2eda2422017-09-24 17:55:21 +0100572 verify(mNotificationPanelView).setQsExpansionEnabled(true);
573 mStatusBar.animateExpandNotificationsPanel();
Eugene Susla2de69552018-03-20 13:22:17 -0700574 verify(mNotificationPanelView).expandWithoutQs();
Charles He2eda2422017-09-24 17:55:21 +0100575 mStatusBar.animateExpandSettingsPanel(null);
Eugene Susla2de69552018-03-20 13:22:17 -0700576 verify(mNotificationPanelView).expandWithQs();
Charles He2eda2422017-09-24 17:55:21 +0100577 }
578
579 @Test
Jason Monk51305372017-06-22 11:41:08 -0400580 public void testDump_DoesNotCrash() {
581 mStatusBar.dump(null, new PrintWriter(new ByteArrayOutputStream()), null);
582 }
583
Jason Monk9c4faa82017-08-15 09:32:27 -0400584 @Test
585 @RunWithLooper(setAsMainLooper = true)
586 public void testUpdateKeyguardState_DoesNotCrash() {
Jason Monk9c4faa82017-08-15 09:32:27 -0400587 mStatusBar.mState = StatusBarState.KEYGUARD;
Eliot Courtney09322282017-11-09 15:31:19 +0900588 when(mStatusBar.mLockscreenUserManager.getCurrentProfiles()).thenReturn(
589 new SparseArray<>());
Jason Monk1fd3fc32018-08-14 17:20:09 -0400590 mStatusBar.onStateChanged(StatusBarState.SHADE);
Jason Monk9c4faa82017-08-15 09:32:27 -0400591 }
592
Lucas Dupinc2e75462017-12-06 13:59:25 -0800593 @Test
594 public void testFingerprintNotification_UpdatesScrims() {
Gilad Brettercb51b8b2018-03-22 17:04:51 +0200595 mStatusBar.notifyBiometricAuthModeChanged();
Lucas Dupinc2e75462017-12-06 13:59:25 -0800596 verify(mScrimController).transitionTo(any(), any());
597 }
598
Lucas Dupin311eac82017-12-11 14:40:07 -0800599 @Test
600 public void testFingerprintUnlock_UpdatesScrims() {
601 // Simulate unlocking from AoD with fingerprint.
Gilad Brettercb51b8b2018-03-22 17:04:51 +0200602 when(mBiometricUnlockController.getMode())
603 .thenReturn(BiometricUnlockController.MODE_WAKE_AND_UNLOCK);
Lucas Dupin311eac82017-12-11 14:40:07 -0800604 mStatusBar.updateScrimController();
605 verify(mScrimController).transitionTo(eq(ScrimState.UNLOCKED), any());
606 }
607
Lucas Dupind5107302018-03-19 15:30:29 -0700608 @Test
609 public void testSetOccluded_propagatesToScrimController() {
610 mStatusBar.setOccluded(true);
611 verify(mScrimController).setKeyguardOccluded(eq(true));
612
613 reset(mScrimController);
614 mStatusBar.setOccluded(false);
615 verify(mScrimController).setKeyguardOccluded(eq(false));
616 }
617
Julia Reynoldsed1c9af2018-03-21 15:21:09 -0400618 @Test
Lucas Dupin988efb22018-12-04 16:53:58 -0800619 public void testPulseWhileDozing_updatesScrimController() {
620 mStatusBar.setBarStateForTest(StatusBarState.KEYGUARD);
621 mStatusBar.showKeyguardImpl();
Julia Reynoldsed1c9af2018-03-21 15:21:09 -0400622
Lucas Dupin988efb22018-12-04 16:53:58 -0800623 // Keep track of callback to be able to stop the pulse
624 DozeHost.PulseCallback[] pulseCallback = new DozeHost.PulseCallback[1];
625 doAnswer(invocation -> {
626 pulseCallback[0] = invocation.getArgument(0);
627 return null;
628 }).when(mDozeScrimController).pulse(any(), anyInt());
629
630 // Starting a pulse should change the scrim controller to the pulsing state
631 mStatusBar.mDozeServiceHost.pulseWhileDozing(mock(DozeHost.PulseCallback.class),
632 DozeLog.PULSE_REASON_NOTIFICATION);
633 verify(mScrimController).transitionTo(eq(ScrimState.PULSING), any());
634
635 // Ending a pulse should take it back to keyguard state
636 pulseCallback[0].onPulseFinished();
637 verify(mScrimController).transitionTo(eq(ScrimState.KEYGUARD));
638 }
639
640 @Test
Lucas Dupin3d053532019-01-29 12:35:22 -0800641 public void testPulseWhileDozing_notifyAuthInterrupt() {
642 HashSet<Integer> reasonsWantingAuth = new HashSet<>(
643 Collections.singletonList(DozeLog.PULSE_REASON_SENSOR_WAKE_LOCK_SCREEN));
644 HashSet<Integer> reasonsSkippingAuth = new HashSet<>(
645 Arrays.asList(DozeLog.PULSE_REASON_INTENT,
646 DozeLog.PULSE_REASON_NOTIFICATION,
647 DozeLog.PULSE_REASON_SENSOR_SIGMOTION,
648 DozeLog.REASON_SENSOR_PICKUP,
649 DozeLog.REASON_SENSOR_DOUBLE_TAP,
650 DozeLog.PULSE_REASON_SENSOR_LONG_PRESS,
651 DozeLog.PULSE_REASON_DOCKING,
652 DozeLog.REASON_SENSOR_WAKE_UP,
653 DozeLog.REASON_SENSOR_TAP));
654 HashSet<Integer> reasonsThatDontPulse = new HashSet<>(
655 Arrays.asList(DozeLog.REASON_SENSOR_PICKUP,
656 DozeLog.REASON_SENSOR_DOUBLE_TAP,
657 DozeLog.REASON_SENSOR_TAP));
658
Lucas Dupine0516d52019-02-05 17:54:06 -0500659 doAnswer(invocation -> {
660 DozeHost.PulseCallback callback = invocation.getArgument(0);
661 callback.onPulseStarted();
662 return null;
663 }).when(mDozeScrimController).pulse(any(), anyInt());
664
Lucas Dupin3d053532019-01-29 12:35:22 -0800665 for (int i = 0; i < DozeLog.REASONS; i++) {
666 reset(mKeyguardUpdateMonitor);
667 mStatusBar.mDozeServiceHost.pulseWhileDozing(mock(DozeHost.PulseCallback.class), i);
668 if (reasonsWantingAuth.contains(i)) {
Lucas Dupine0516d52019-02-05 17:54:06 -0500669 verify(mKeyguardUpdateMonitor).onAuthInterruptDetected(eq(true));
Lucas Dupin3d053532019-01-29 12:35:22 -0800670 } else if (reasonsSkippingAuth.contains(i) || reasonsThatDontPulse.contains(i)) {
Lucas Dupine0516d52019-02-05 17:54:06 -0500671 verify(mKeyguardUpdateMonitor, never()).onAuthInterruptDetected(eq(true));
Lucas Dupin3d053532019-01-29 12:35:22 -0800672 } else {
673 throw new AssertionError("Reason " + i + " isn't specified as wanting or skipping"
674 + " passive auth. Please consider how this pulse reason should behave.");
675 }
676 }
677 }
678
679 @Test
jovanak5f6dc612018-03-27 11:59:22 -0700680 public void testSetState_changesIsFullScreenUserSwitcherState() {
681 mStatusBar.setBarStateForTest(StatusBarState.KEYGUARD);
682 assertFalse(mStatusBar.isFullScreenUserSwitcherState());
683
684 mStatusBar.setBarStateForTest(StatusBarState.FULLSCREEN_USER_SWITCHER);
685 assertTrue(mStatusBar.isFullScreenUserSwitcherState());
686 }
687
688 @Test
689 public void testShowKeyguardImplementation_setsState() {
690 when(mLockscreenUserManager.getCurrentProfiles()).thenReturn(new SparseArray<>());
691
692 mStatusBar.setBarStateForTest(StatusBarState.SHADE);
693
694 // By default, showKeyguardImpl sets state to KEYGUARD.
695 mStatusBar.showKeyguardImpl();
Jason Monk1fd3fc32018-08-14 17:20:09 -0400696 verify(mStatusBarStateController).setState(eq(StatusBarState.KEYGUARD));
jovanak5f6dc612018-03-27 11:59:22 -0700697
698 // If useFullscreenUserSwitcher is true, state is set to FULLSCREEN_USER_SWITCHER.
699 mStatusBar.mUserSwitcherController = mock(UserSwitcherController.class);
700 when(mStatusBar.mUserSwitcherController.useFullscreenUserSwitcher()).thenReturn(true);
701 mStatusBar.showKeyguardImpl();
Jason Monk1fd3fc32018-08-14 17:20:09 -0400702 verify(mStatusBarStateController).setState(eq(StatusBarState.FULLSCREEN_USER_SWITCHER));
jovanak5f6dc612018-03-27 11:59:22 -0700703 }
704
Lucas Dupin29a07ec2018-11-13 16:56:49 -0800705 @Test
706 public void testStartStopDozing() {
707 mStatusBar.setBarStateForTest(StatusBarState.KEYGUARD);
708 when(mStatusBarStateController.isKeyguardRequested()).thenReturn(true);
709
710 mStatusBar.mDozeServiceHost.startDozing();
711 verify(mStatusBarStateController).setIsDozing(eq(true));
712
713 mStatusBar.mDozeServiceHost.stopDozing();
714 verify(mStatusBarStateController).setIsDozing(eq(false));
715 }
716
717 @Test
718 public void testOnStartedWakingUp_isNotDozing() {
719 mStatusBar.setBarStateForTest(StatusBarState.KEYGUARD);
720 when(mStatusBarStateController.isKeyguardRequested()).thenReturn(true);
721
722 mStatusBar.mDozeServiceHost.startDozing();
723 verify(mStatusBarStateController).setIsDozing(eq(true));
724
725 mStatusBar.mWakefulnessObserver.onStartedWakingUp();
726 verify(mStatusBarStateController).setIsDozing(eq(false));
727 }
728
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500729 static class TestableStatusBar extends StatusBar {
Chris Wren27a52fa2017-02-01 14:21:43 -0500730 public TestableStatusBar(StatusBarKeyguardViewManager man,
731 UnlockMethodCache unlock, KeyguardIndicationController key,
yoshiki iguchi4e30e762018-02-06 12:09:23 +0900732 NotificationStackScrollLayout stack, HeadsUpManagerPhone hum,
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900733 PowerManager pm, NotificationPanelView panelView,
Eliot Courtney3985ad52017-11-17 16:51:52 +0900734 IStatusBarService barService, NotificationListener notificationListener,
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900735 NotificationLogger notificationLogger,
Eliot Courtney2b4c3a02017-11-27 13:27:46 +0900736 VisualStabilityManager visualStabilityManager,
737 NotificationViewHierarchyManager viewHierarchyManager,
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900738 TestableNotificationEntryManager entryManager, ScrimController scrimController,
Gilad Brettercb51b8b2018-03-22 17:04:51 +0200739 BiometricUnlockController biometricUnlockController,
Jason Monk297c04e2018-08-23 17:16:59 -0400740 KeyguardViewMediator keyguardViewMediator,
jovanak5f6dc612018-03-27 11:59:22 -0700741 NotificationRemoteInputManager notificationRemoteInputManager,
742 NotificationGroupManager notificationGroupManager,
Kevin01a53cb2018-11-09 18:19:54 -0800743 NotificationGroupAlertTransferHelper notificationGroupAlertTransferHelper,
jovanak5f6dc612018-03-27 11:59:22 -0700744 FalsingManager falsingManager,
Lucas Dupin1a8588d2018-08-21 12:18:47 -0700745 StatusBarWindowController statusBarWindowController,
jovanak5f6dc612018-03-27 11:59:22 -0700746 NotificationIconAreaController notificationIconAreaController,
747 DozeScrimController dozeScrimController,
748 NotificationShelf notificationShelf,
749 NotificationLockscreenUserManager notificationLockscreenUserManager,
Jason Monk297c04e2018-08-23 17:16:59 -0400750 CommandQueue commandQueue,
Mady Mellorcd9b1302018-11-06 18:08:04 -0800751 NotificationPresenter notificationPresenter,
Charles Chen10ca70b2018-11-28 00:03:38 +0800752 BubbleController bubbleController,
Charles Chen8c9a83f2018-12-18 17:44:10 +0800753 NavigationBarController navBarController,
Lucas Dupin3d053532019-01-29 12:35:22 -0800754 AutoHideController autoHideController,
755 KeyguardUpdateMonitor keyguardUpdateMonitor) {
Adrian Roosef7a4022017-01-19 14:48:35 -0800756 mStatusBarKeyguardViewManager = man;
Chris Wren27a52fa2017-02-01 14:21:43 -0500757 mUnlockMethodCache = unlock;
758 mKeyguardIndicationController = key;
759 mStackScroller = stack;
Julia Reynolds30203152017-05-26 13:36:31 -0400760 mHeadsUpManager = hum;
Julia Reynolds30203152017-05-26 13:36:31 -0400761 mPowerManager = pm;
Jorim Jaggifd3b1a12017-06-06 17:04:19 -0700762 mNotificationPanel = panelView;
Chris Wren621933f2017-06-14 15:59:03 -0400763 mBarService = barService;
Eliot Courtney3985ad52017-11-17 16:51:52 +0900764 mNotificationListener = notificationListener;
765 mNotificationLogger = notificationLogger;
Adrian Roos6d5ebb72017-08-03 15:10:22 +0200766 mWakefulnessLifecycle = createAwakeWakefulnessLifecycle();
Eliot Courtney2b4c3a02017-11-27 13:27:46 +0900767 mVisualStabilityManager = visualStabilityManager;
768 mViewHierarchyManager = viewHierarchyManager;
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900769 mEntryManager = entryManager;
Lucas Dupinc2e75462017-12-06 13:59:25 -0800770 mScrimController = scrimController;
Gilad Brettercb51b8b2018-03-22 17:04:51 +0200771 mBiometricUnlockController = biometricUnlockController;
Lucas Dupin47a65c72018-02-15 14:16:18 -0800772 mKeyguardViewMediator = keyguardViewMediator;
jovanak5f6dc612018-03-27 11:59:22 -0700773 mRemoteInputManager = notificationRemoteInputManager;
774 mGroupManager = notificationGroupManager;
Kevin01a53cb2018-11-09 18:19:54 -0800775 mGroupAlertTransferHelper = notificationGroupAlertTransferHelper;
jovanak5f6dc612018-03-27 11:59:22 -0700776 mFalsingManager = falsingManager;
Lucas Dupin1a8588d2018-08-21 12:18:47 -0700777 mStatusBarWindowController = statusBarWindowController;
jovanak5f6dc612018-03-27 11:59:22 -0700778 mNotificationIconAreaController = notificationIconAreaController;
779 mDozeScrimController = dozeScrimController;
780 mNotificationShelf = notificationShelf;
781 mLockscreenUserManager = notificationLockscreenUserManager;
782 mCommandQueue = commandQueue;
Jason Monk297c04e2018-08-23 17:16:59 -0400783 mPresenter = notificationPresenter;
Lucas Dupin29a07ec2018-11-13 16:56:49 -0800784 mGestureWakeLock = mock(PowerManager.WakeLock.class);
Mady Mellorcd9b1302018-11-06 18:08:04 -0800785 mBubbleController = bubbleController;
Charles Chen10ca70b2018-11-28 00:03:38 +0800786 mNavigationBarController = navBarController;
Charles Chen8c9a83f2018-12-18 17:44:10 +0800787 mAutoHideController = autoHideController;
Lucas Dupin3d053532019-01-29 12:35:22 -0800788 mKeyguardUpdateMonitor = keyguardUpdateMonitor;
Adrian Roos6d5ebb72017-08-03 15:10:22 +0200789 }
790
791 private WakefulnessLifecycle createAwakeWakefulnessLifecycle() {
792 WakefulnessLifecycle wakefulnessLifecycle = new WakefulnessLifecycle();
793 wakefulnessLifecycle.dispatchStartedWakingUp();
794 wakefulnessLifecycle.dispatchFinishedWakingUp();
795 return wakefulnessLifecycle;
Adrian Roosef7a4022017-01-19 14:48:35 -0800796 }
797
Jason Monk9c4faa82017-08-15 09:32:27 -0400798 @Override
799 protected void updateTheme() {
800 // Do nothing for now, until we have more mocking and StatusBar is smaller.
801 }
802
Chris Wren621933f2017-06-14 15:59:03 -0400803 public void setBarStateForTest(int state) {
804 mState = state;
Adrian Roosef7a4022017-01-19 14:48:35 -0800805 }
Charles He2eda2422017-09-24 17:55:21 +0100806
807 public void setUserSetupForTest(boolean userSetup) {
808 mUserSetup = userSetup;
809 }
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900810
811 }
812
Jason Monke59dc402018-08-16 12:05:01 -0400813 public static class TestableNotificationEntryManager extends NotificationEntryManager {
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900814
Gus Prevas92586462019-01-04 16:06:12 -0500815 public TestableNotificationEntryManager(Context context) {
Eliot Courtney6c313d32017-12-14 19:57:51 +0900816 super(context);
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900817 }
818
819 public void setUpForTest(NotificationPresenter presenter,
Eliot Courtney2b4c3a02017-11-27 13:27:46 +0900820 NotificationListContainer listContainer,
yoshiki iguchi4e30e762018-02-06 12:09:23 +0900821 HeadsUpManagerPhone headsUpManager,
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900822 NotificationData notificationData) {
Gus Prevas8621bd22018-12-20 15:04:25 -0500823 super.setUpWithPresenter(presenter, listContainer, headsUpManager);
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900824 mNotificationData = notificationData;
Gus Prevasec9e1f02018-12-18 15:28:12 -0500825 }
826 }
827
828 public static class TestableNotificationInterruptionStateProvider extends
829 NotificationInterruptionStateProvider {
830
831 public TestableNotificationInterruptionStateProvider(
832 Context context,
833 PowerManager powerManager,
834 IDreamManager dreamManager) {
835 super(context, powerManager, dreamManager);
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900836 mUseHeadsUp = true;
837 }
Adrian Roosef7a4022017-01-19 14:48:35 -0800838 }
Eliot Courtney09322282017-11-09 15:31:19 +0900839}