blob: fa235bd46d7e4a6a817a6a2fbda2bd7d63acdddf [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;
Lucas Dupin3cfd6882019-03-19 15:22:03 -070032import static org.mockito.Mockito.clearInvocations;
Adrian Roosef7a4022017-01-19 14:48:35 -080033import static org.mockito.Mockito.doAnswer;
34import static org.mockito.Mockito.mock;
Chris Wren621933f2017-06-14 15:59:03 -040035import static org.mockito.Mockito.never;
Lucas Dupind5107302018-03-19 15:30:29 -070036import static org.mockito.Mockito.reset;
Chris Wren621933f2017-06-14 15:59:03 -040037import static org.mockito.Mockito.times;
Chris Wren621933f2017-06-14 15:59:03 -040038import static org.mockito.Mockito.verify;
Jason Monk9c4faa82017-08-15 09:32:27 -040039import static org.mockito.Mockito.when;
Adrian Roosef7a4022017-01-19 14:48:35 -080040
Julia Reynolds30203152017-05-26 13:36:31 -040041import android.app.Notification;
Charles He2eda2422017-09-24 17:55:21 +010042import android.app.StatusBarManager;
Jason Monk51305372017-06-22 11:41:08 -040043import android.app.trust.TrustManager;
Eliot Courtneya6d8cf22017-10-20 13:26:58 +090044import android.content.Context;
Lucas Dupin2c3992b2019-03-11 16:34:08 -070045import android.hardware.display.AmbientDisplayConfiguration;
Jason Monk51305372017-06-22 11:41:08 -040046import android.hardware.fingerprint.FingerprintManager;
Chris Wren27a52fa2017-02-01 14:21:43 -050047import android.metrics.LogMaker;
Jason Monk9c4faa82017-08-15 09:32:27 -040048import android.os.Binder;
Julia Reynolds30203152017-05-26 13:36:31 -040049import android.os.Handler;
Julia Reynolds30203152017-05-26 13:36:31 -040050import android.os.IPowerManager;
Jason Monk6dceace2018-05-15 20:24:07 -040051import android.os.Looper;
Julia Reynolds30203152017-05-26 13:36:31 -040052import android.os.PowerManager;
Chris Wren621933f2017-06-14 15:59:03 -040053import android.os.RemoteException;
Julia Reynolds30203152017-05-26 13:36:31 -040054import android.os.UserHandle;
Winson Chung67f5c8b2018-09-24 12:09:19 -070055import android.service.dreams.IDreamManager;
Julia Reynolds30203152017-05-26 13:36:31 -040056import android.service.notification.StatusBarNotification;
Chris Wren27a52fa2017-02-01 14:21:43 -050057import android.support.test.metricshelper.MetricsAsserts;
Chris Wren621933f2017-06-14 15:59:03 -040058import android.testing.AndroidTestingRunner;
59import android.testing.TestableLooper;
Chris Wren621933f2017-06-14 15:59:03 -040060import android.testing.TestableLooper.RunWithLooper;
Eliot Courtney09322282017-11-09 15:31:19 +090061import android.util.SparseArray;
Jason Monk51305372017-06-22 11:41:08 -040062import android.view.ViewGroup.LayoutParams;
Adrian Roosef7a4022017-01-19 14:48:35 -080063
Brett Chabot84151d92019-02-27 15:37:59 -080064import androidx.test.filters.SmallTest;
65
Chris Wrenef319902017-03-07 17:58:31 -050066import com.android.internal.logging.MetricsLogger;
Chris Wren27a52fa2017-02-01 14:21:43 -050067import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
Chris Wrenef319902017-03-07 17:58:31 -050068import com.android.internal.logging.testing.FakeMetricsLogger;
Chris Wren621933f2017-06-14 15:59:03 -040069import com.android.internal.statusbar.IStatusBarService;
Lucas Dupin3d053532019-01-29 12:35:22 -080070import com.android.keyguard.KeyguardUpdateMonitor;
Jason Monk297c04e2018-08-23 17:16:59 -040071import com.android.systemui.Dependency;
Eliot Courtneya6d8cf22017-10-20 13:26:58 +090072import com.android.systemui.ForegroundServiceController;
Jason Monk297c04e2018-08-23 17:16:59 -040073import com.android.systemui.InitController;
Jason Monk9c4faa82017-08-15 09:32:27 -040074import com.android.systemui.R;
Selim Cinek9d20bed2018-12-26 16:02:34 -080075import com.android.systemui.SystemUIFactory;
Adrian Roosef7a4022017-01-19 14:48:35 -080076import com.android.systemui.SysuiTestCase;
Jason Monkd97204c2018-12-21 15:49:04 -050077import com.android.systemui.UiOffloadThread;
Fabian Kozynski1f32cf02018-10-23 12:23:31 -040078import com.android.systemui.appops.AppOpsController;
Jason Monk9c4faa82017-08-15 09:32:27 -040079import com.android.systemui.assist.AssistManager;
Mady Mellorcd9b1302018-11-06 18:08:04 -080080import com.android.systemui.bubbles.BubbleController;
Lucas Dupin988efb22018-12-04 16:53:58 -080081import com.android.systemui.doze.DozeHost;
82import com.android.systemui.doze.DozeLog;
Jason Monk297c04e2018-08-23 17:16:59 -040083import com.android.systemui.keyguard.KeyguardViewMediator;
Adrian Roos6d5ebb72017-08-03 15:10:22 +020084import com.android.systemui.keyguard.WakefulnessLifecycle;
Jason Monk297c04e2018-08-23 17:16:59 -040085import com.android.systemui.plugins.ActivityStarter.OnDismissAction;
Dave Mankoff468d4f62019-05-08 14:56:29 -040086import com.android.systemui.plugins.FalsingManager;
Beverly8fdb5332019-02-04 14:29:49 -050087import com.android.systemui.plugins.statusbar.StatusBarStateController;
Jason Monk5ecf80c2017-07-06 15:28:17 -040088import com.android.systemui.statusbar.CommandQueue;
Chris Wren27a52fa2017-02-01 14:21:43 -050089import com.android.systemui.statusbar.KeyguardIndicationController;
Charles Chen10ca70b2018-11-28 00:03:38 +080090import com.android.systemui.statusbar.NavigationBarController;
Eliot Courtney3985ad52017-11-17 16:51:52 +090091import com.android.systemui.statusbar.NotificationListener;
Eliot Courtney09322282017-11-09 15:31:19 +090092import com.android.systemui.statusbar.NotificationLockscreenUserManager;
Eliot Courtneya6d8cf22017-10-20 13:26:58 +090093import com.android.systemui.statusbar.NotificationMediaManager;
94import com.android.systemui.statusbar.NotificationPresenter;
95import com.android.systemui.statusbar.NotificationRemoteInputManager;
jovanak5f6dc612018-03-27 11:59:22 -070096import com.android.systemui.statusbar.NotificationShelf;
Eliot Courtney2b4c3a02017-11-27 13:27:46 +090097import com.android.systemui.statusbar.NotificationViewHierarchyManager;
Selim Cinek7c6fe5b2018-04-09 18:27:13 -070098import com.android.systemui.statusbar.RemoteInputController;
Jason Monk297c04e2018-08-23 17:16:59 -040099import com.android.systemui.statusbar.StatusBarState;
Beverly8fdb5332019-02-04 14:29:49 -0500100import com.android.systemui.statusbar.StatusBarStateControllerImpl;
Gus Prevasb43dc652018-12-20 13:11:45 -0500101import com.android.systemui.statusbar.notification.NotificationAlertingManager;
Gus Prevas26bc59b2018-12-19 11:26:39 -0500102import com.android.systemui.statusbar.notification.NotificationEntryListener;
Jason Monk297c04e2018-08-23 17:16:59 -0400103import com.android.systemui.statusbar.notification.NotificationEntryManager;
Gus Prevasec9e1f02018-12-18 15:28:12 -0500104import com.android.systemui.statusbar.notification.NotificationFilter;
105import com.android.systemui.statusbar.notification.NotificationInterruptionStateProvider;
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900106import com.android.systemui.statusbar.notification.VisualStabilityManager;
Ned Burnsf81c4c42019-01-07 14:10:43 -0500107import com.android.systemui.statusbar.notification.collection.NotificationData;
108import com.android.systemui.statusbar.notification.collection.NotificationEntry;
Jason Monk297c04e2018-08-23 17:16:59 -0400109import com.android.systemui.statusbar.notification.logging.NotificationLogger;
110import com.android.systemui.statusbar.notification.row.NotificationGutsManager;
111import com.android.systemui.statusbar.notification.stack.NotificationListContainer;
112import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout;
Jason Monk9c4faa82017-08-15 09:32:27 -0400113import com.android.systemui.statusbar.policy.DeviceProvisionedController;
Jason Monk9c4faa82017-08-15 09:32:27 -0400114import com.android.systemui.statusbar.policy.KeyguardMonitor;
jovanak5f6dc612018-03-27 11:59:22 -0700115import com.android.systemui.statusbar.policy.UserSwitcherController;
Adrian Roosef7a4022017-01-19 14:48:35 -0800116
117import org.junit.Before;
118import org.junit.Test;
119import org.junit.runner.RunWith;
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900120import org.mockito.Mock;
121import org.mockito.MockitoAnnotations;
Adrian Roosef7a4022017-01-19 14:48:35 -0800122
Jason Monk51305372017-06-22 11:41:08 -0400123import java.io.ByteArrayOutputStream;
124import java.io.PrintWriter;
Chris Wren621933f2017-06-14 15:59:03 -0400125import java.util.ArrayList;
Lucas Dupin3d053532019-01-29 12:35:22 -0800126import java.util.Arrays;
127import java.util.Collections;
128import java.util.HashSet;
Chris Wren621933f2017-06-14 15:59:03 -0400129
Adrian Roos02de4982017-02-11 09:35:54 +0100130@SmallTest
Chris Wren621933f2017-06-14 15:59:03 -0400131@RunWith(AndroidTestingRunner.class)
132@RunWithLooper
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500133public class StatusBarTest extends SysuiTestCase {
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900134 @Mock private StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
135 @Mock private UnlockMethodCache mUnlockMethodCache;
136 @Mock private KeyguardIndicationController mKeyguardIndicationController;
137 @Mock private NotificationStackScrollLayout mStackScroller;
yoshiki iguchi4e30e762018-02-06 12:09:23 +0900138 @Mock private HeadsUpManagerPhone mHeadsUpManager;
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900139 @Mock private NotificationPanelView mNotificationPanelView;
140 @Mock private IStatusBarService mBarService;
Winson Chung67f5c8b2018-09-24 12:09:19 -0700141 @Mock private IDreamManager mDreamManager;
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900142 @Mock private ScrimController mScrimController;
Lucas Dupin988efb22018-12-04 16:53:58 -0800143 @Mock private DozeScrimController mDozeScrimController;
Ned Burnsf81c4c42019-01-07 14:10:43 -0500144 @Mock private ArrayList<NotificationEntry> mNotificationList;
Gilad Brettercb51b8b2018-03-22 17:04:51 +0200145 @Mock private BiometricUnlockController mBiometricUnlockController;
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900146 @Mock private NotificationData mNotificationData;
Gus Prevasec9e1f02018-12-18 15:28:12 -0500147 @Mock
148 private NotificationInterruptionStateProvider.HeadsUpSuppressor mHeadsUpSuppressor;
Adrian Roosef7a4022017-01-19 14:48:35 -0800149
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900150 // Mock dependencies:
151 @Mock private NotificationViewHierarchyManager mViewHierarchyManager;
152 @Mock private VisualStabilityManager mVisualStabilityManager;
153 @Mock private NotificationListener mNotificationListener;
Lucas Dupin47a65c72018-02-15 14:16:18 -0800154 @Mock private KeyguardViewMediator mKeyguardViewMediator;
jovanak5f6dc612018-03-27 11:59:22 -0700155 @Mock private NotificationLockscreenUserManager mLockscreenUserManager;
Selim Cinek7c6fe5b2018-04-09 18:27:13 -0700156 @Mock private NotificationRemoteInputManager mRemoteInputManager;
157 @Mock private RemoteInputController mRemoteInputController;
Beverly8fdb5332019-02-04 14:29:49 -0500158 @Mock private StatusBarStateControllerImpl mStatusBarStateController;
Jason Monk297c04e2018-08-23 17:16:59 -0400159 @Mock private DeviceProvisionedController mDeviceProvisionedController;
Selim Cinek5454a0d2019-07-30 17:14:50 -0700160 @Mock private StatusBarNotificationPresenter mNotificationPresenter;
Gus Prevas26bc59b2018-12-19 11:26:39 -0500161 @Mock
Gus Prevas8621bd22018-12-20 15:04:25 -0500162 private NotificationEntryListener mEntryListener;
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;
Lucas Dupin2c3992b2019-03-11 16:34:08 -0700171 @Mock
172 private AmbientDisplayConfiguration mAmbientDisplayConfiguration;
Lucas Dupin2e838ac2019-04-17 16:50:58 -0700173 @Mock
174 private StatusBarWindowView mStatusBarWindowView;
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900175
Eliot Courtney2b4c3a02017-11-27 13:27:46 +0900176 private TestableStatusBar mStatusBar;
177 private FakeMetricsLogger mMetricsLogger;
Eliot Courtney2b4c3a02017-11-27 13:27:46 +0900178 private PowerManager mPowerManager;
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900179 private TestableNotificationEntryManager mEntryManager;
Gus Prevasec9e1f02018-12-18 15:28:12 -0500180 private TestableNotificationInterruptionStateProvider mNotificationInterruptionStateProvider;
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900181 private NotificationLogger mNotificationLogger;
Jason Monk297c04e2018-08-23 17:16:59 -0400182 private CommandQueue mCommandQueue;
Chris Wren27a52fa2017-02-01 14:21:43 -0500183
Adrian Roos02de4982017-02-11 09:35:54 +0100184 @Before
Julia Reynolds30203152017-05-26 13:36:31 -0400185 public void setup() throws Exception {
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900186 MockitoAnnotations.initMocks(this);
Jason Monk9c4faa82017-08-15 09:32:27 -0400187 mDependency.injectMockDependency(AssistManager.class);
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900188 mDependency.injectMockDependency(NotificationGutsManager.class);
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900189 mDependency.injectMockDependency(NotificationMediaManager.class);
190 mDependency.injectMockDependency(ForegroundServiceController.class);
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900191 mDependency.injectTestDependency(NotificationViewHierarchyManager.class,
192 mViewHierarchyManager);
193 mDependency.injectTestDependency(VisualStabilityManager.class, mVisualStabilityManager);
194 mDependency.injectTestDependency(NotificationListener.class, mNotificationListener);
Mark Renouf906a93f2019-03-15 16:04:58 -0400195 mDependency.injectTestDependency(KeyguardMonitor.class, mock(KeyguardMonitor.class));
196 mDependency.injectTestDependency(AppOpsController.class, mock(AppOpsController.class));
Jason Monk1fd3fc32018-08-14 17:20:09 -0400197 mDependency.injectTestDependency(StatusBarStateController.class, mStatusBarStateController);
Jason Monk297c04e2018-08-23 17:16:59 -0400198 mDependency.injectTestDependency(DeviceProvisionedController.class,
199 mDeviceProvisionedController);
Mady Mellorcd9b1302018-11-06 18:08:04 -0800200 mDependency.injectMockDependency(BubbleController.class);
Gus Prevasec9e1f02018-12-18 15:28:12 -0500201 mDependency.injectTestDependency(NotificationFilter.class, mNotificationFilter);
Gus Prevasb43dc652018-12-20 13:11:45 -0500202 mDependency.injectTestDependency(NotificationAlertingManager.class,
203 mNotificationAlertingManager);
Gus Prevasec9e1f02018-12-18 15:28:12 -0500204
205 IPowerManager powerManagerService = mock(IPowerManager.class);
206 mPowerManager = new PowerManager(mContext, powerManagerService,
207 Handler.createAsync(Looper.myLooper()));
208
209 mNotificationInterruptionStateProvider =
210 new TestableNotificationInterruptionStateProvider(mContext, mPowerManager,
Lucas Dupin2c3992b2019-03-11 16:34:08 -0700211 mDreamManager, mAmbientDisplayConfiguration);
Gus Prevasec9e1f02018-12-18 15:28:12 -0500212 mDependency.injectTestDependency(NotificationInterruptionStateProvider.class,
213 mNotificationInterruptionStateProvider);
Charles Chen10ca70b2018-11-28 00:03:38 +0800214 mDependency.injectMockDependency(NavigationBarController.class);
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900215
Jason Monk51305372017-06-22 11:41:08 -0400216 mContext.addMockSystemService(TrustManager.class, mock(TrustManager.class));
217 mContext.addMockSystemService(FingerprintManager.class, mock(FingerprintManager.class));
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900218
Chris Wrenef319902017-03-07 17:58:31 -0500219 mMetricsLogger = new FakeMetricsLogger();
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900220 mDependency.injectTestDependency(MetricsLogger.class, mMetricsLogger);
Gus Prevas92586462019-01-04 16:06:12 -0500221 mEntryManager = new TestableNotificationEntryManager(mContext);
Jason Monkd97204c2018-12-21 15:49:04 -0500222 mNotificationLogger = new NotificationLogger(mNotificationListener,
Tony Mak202f25d2019-01-07 14:40:39 +0000223 Dependency.get(UiOffloadThread.class), mEntryManager, mStatusBarStateController,
224 mExpansionStateLogger);
Selim Cinekc3fec682019-06-06 18:11:07 -0700225 mNotificationLogger.setVisibilityReporter(mock(Runnable.class));
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900226 mDependency.injectTestDependency(NotificationLogger.class, mNotificationLogger);
Lucas Dupin78c8fed2018-12-18 16:41:37 -0800227 DozeLog.traceDozing(mContext, false /* dozing */);
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900228
Jason Monk297c04e2018-08-23 17:16:59 -0400229 mCommandQueue = mock(CommandQueue.class);
230 when(mCommandQueue.asBinder()).thenReturn(new Binder());
231 mContext.putComponent(CommandQueue.class, mCommandQueue);
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900232
233 mContext.setTheme(R.style.Theme_SystemUI_Light);
234
235 when(mStackScroller.generateLayoutParams(any())).thenReturn(new LayoutParams(0, 0));
236 when(mNotificationPanelView.getLayoutParams()).thenReturn(new LayoutParams(0, 0));
Julia Reynolds30203152017-05-26 13:36:31 -0400237 when(powerManagerService.isInteractive()).thenReturn(true);
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900238 when(mStackScroller.getActivatedChild()).thenReturn(null);
Julia Reynolds30203152017-05-26 13:36:31 -0400239
Adrian Roosef7a4022017-01-19 14:48:35 -0800240 doAnswer(invocation -> {
241 OnDismissAction onDismissAction = (OnDismissAction) invocation.getArguments()[0];
242 onDismissAction.onDismiss();
243 return null;
244 }).when(mStatusBarKeyguardViewManager).dismissWithAction(any(), any(), anyBoolean());
245
246 doAnswer(invocation -> {
247 Runnable runnable = (Runnable) invocation.getArguments()[0];
248 runnable.run();
249 return null;
250 }).when(mStatusBarKeyguardViewManager).addAfterKeyguardGoneRunnable(any());
Chris Wren27a52fa2017-02-01 14:21:43 -0500251
Gus Prevasec9e1f02018-12-18 15:28:12 -0500252 mNotificationInterruptionStateProvider.setUpWithPresenter(mNotificationPresenter,
253 mHeadsUpManager, mHeadsUpSuppressor);
254
Selim Cinek7c6fe5b2018-04-09 18:27:13 -0700255 when(mRemoteInputManager.getController()).thenReturn(mRemoteInputController);
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900256 mStatusBar = new TestableStatusBar(mStatusBarKeyguardViewManager, mUnlockMethodCache,
Selim Cinekc3fec682019-06-06 18:11:07 -0700257 mKeyguardIndicationController, mStackScroller,
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900258 mPowerManager, mNotificationPanelView, mBarService, mNotificationListener,
259 mNotificationLogger, mVisualStabilityManager, mViewHierarchyManager,
Gilad Brettercb51b8b2018-03-22 17:04:51 +0200260 mEntryManager, mScrimController, mBiometricUnlockController,
Jason Monk297c04e2018-08-23 17:16:59 -0400261 mKeyguardViewMediator, mRemoteInputManager, mock(NotificationGroupManager.class),
Kevin01a53cb2018-11-09 18:19:54 -0800262 mock(NotificationGroupAlertTransferHelper.class), mock(FalsingManager.class),
263 mock(StatusBarWindowController.class), mock(NotificationIconAreaController.class),
Lucas Dupin988efb22018-12-04 16:53:58 -0800264 mDozeScrimController, mock(NotificationShelf.class),
Kevin01a53cb2018-11-09 18:19:54 -0800265 mLockscreenUserManager, mCommandQueue, mNotificationPresenter,
Charles Chen8c9a83f2018-12-18 17:44:10 +0800266 mock(BubbleController.class), mock(NavigationBarController.class),
Lucas Dupin2e838ac2019-04-17 16:50:58 -0700267 mock(AutoHideController.class), mKeyguardUpdateMonitor, mStatusBarWindowView);
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900268 mStatusBar.mContext = mContext;
269 mStatusBar.mComponents = mContext.getComponents();
Selim Cinek9d20bed2018-12-26 16:02:34 -0800270 SystemUIFactory.getInstance().getRootComponent()
271 .getStatusBarInjector()
272 .createStatusBar(mStatusBar);
Selim Cinekc3fec682019-06-06 18:11:07 -0700273 mStatusBar.setHeadsUpManager(mHeadsUpManager);
Jason Monk297c04e2018-08-23 17:16:59 -0400274 mStatusBar.putComponent(StatusBar.class, mStatusBar);
275 Dependency.get(InitController.class).executePostInitTasks();
276 mEntryManager.setUpForTest(mock(NotificationPresenter.class), mStackScroller,
Gus Prevas8621bd22018-12-20 15:04:25 -0500277 mHeadsUpManager, mNotificationData);
278 mEntryManager.addNotificationEntryListener(mEntryListener);
Jason Monk297c04e2018-08-23 17:16:59 -0400279 mNotificationLogger.setUpWithContainer(mStackScroller);
Adrian Roosef7a4022017-01-19 14:48:35 -0800280 }
281
Adrian Roos02de4982017-02-11 09:35:54 +0100282 @Test
Jason Monk5ecf80c2017-07-06 15:28:17 -0400283 public void testSetBouncerShowing_noCrash() {
284 mStatusBar.mCommandQueue = mock(CommandQueue.class);
285 mStatusBar.setBouncerShowing(true);
286 }
287
288 @Test
Adrian Roosef7a4022017-01-19 14:48:35 -0800289 public void executeRunnableDismissingKeyguard_nullRunnable_showingAndOccluded() {
290 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
291 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(true);
292
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500293 mStatusBar.executeRunnableDismissingKeyguard(null, null, false, false, false);
Adrian Roosef7a4022017-01-19 14:48:35 -0800294 }
295
Adrian Roos02de4982017-02-11 09:35:54 +0100296 @Test
Adrian Roosef7a4022017-01-19 14:48:35 -0800297 public void executeRunnableDismissingKeyguard_nullRunnable_showing() {
298 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
299 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
300
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500301 mStatusBar.executeRunnableDismissingKeyguard(null, null, false, false, false);
Adrian Roosef7a4022017-01-19 14:48:35 -0800302 }
303
Adrian Roos02de4982017-02-11 09:35:54 +0100304 @Test
Adrian Roosef7a4022017-01-19 14:48:35 -0800305 public void executeRunnableDismissingKeyguard_nullRunnable_notShowing() {
306 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(false);
307 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
308
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500309 mStatusBar.executeRunnableDismissingKeyguard(null, null, false, false, false);
Adrian Roosef7a4022017-01-19 14:48:35 -0800310 }
311
Adrian Roos02de4982017-02-11 09:35:54 +0100312 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500313 public void lockscreenStateMetrics_notShowing() {
314 // uninteresting state, except that fingerprint must be non-zero
315 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
316 when(mUnlockMethodCache.canSkipBouncer()).thenReturn(true);
317 // interesting state
318 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(false);
319 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false);
320 when(mUnlockMethodCache.isMethodSecure()).thenReturn(false);
Chris Wren27a52fa2017-02-01 14:21:43 -0500321 mStatusBar.onKeyguardViewManagerStatesUpdated();
322
Chris Wrenef319902017-03-07 17:58:31 -0500323 MetricsAsserts.assertHasLog("missing hidden insecure lockscreen log",
324 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500325 new LogMaker(MetricsEvent.LOCKSCREEN)
326 .setType(MetricsEvent.TYPE_CLOSE)
327 .setSubtype(0));
328 }
329
Adrian Roos02de4982017-02-11 09:35:54 +0100330 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500331 public void lockscreenStateMetrics_notShowing_secure() {
332 // uninteresting state, except that fingerprint must be non-zero
333 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
334 when(mUnlockMethodCache.canSkipBouncer()).thenReturn(true);
335 // interesting state
336 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(false);
337 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false);
338 when(mUnlockMethodCache.isMethodSecure()).thenReturn(true);
339
340 mStatusBar.onKeyguardViewManagerStatesUpdated();
341
Chris Wrenef319902017-03-07 17:58:31 -0500342 MetricsAsserts.assertHasLog("missing hidden secure lockscreen log",
343 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500344 new LogMaker(MetricsEvent.LOCKSCREEN)
345 .setType(MetricsEvent.TYPE_CLOSE)
346 .setSubtype(1));
347 }
348
Adrian Roos02de4982017-02-11 09:35:54 +0100349 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500350 public void lockscreenStateMetrics_isShowing() {
351 // uninteresting state, except that fingerprint must be non-zero
352 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
353 when(mUnlockMethodCache.canSkipBouncer()).thenReturn(true);
354 // interesting state
355 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
356 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false);
357 when(mUnlockMethodCache.isMethodSecure()).thenReturn(false);
358
359 mStatusBar.onKeyguardViewManagerStatesUpdated();
360
Chris Wrenef319902017-03-07 17:58:31 -0500361 MetricsAsserts.assertHasLog("missing insecure lockscreen showing",
362 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500363 new LogMaker(MetricsEvent.LOCKSCREEN)
364 .setType(MetricsEvent.TYPE_OPEN)
365 .setSubtype(0));
366 }
367
Adrian Roos02de4982017-02-11 09:35:54 +0100368 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500369 public void lockscreenStateMetrics_isShowing_secure() {
370 // uninteresting state, except that fingerprint must be non-zero
371 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
372 when(mUnlockMethodCache.canSkipBouncer()).thenReturn(true);
373 // interesting state
374 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
375 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false);
376 when(mUnlockMethodCache.isMethodSecure()).thenReturn(true);
377
378 mStatusBar.onKeyguardViewManagerStatesUpdated();
379
Chris Wrenef319902017-03-07 17:58:31 -0500380 MetricsAsserts.assertHasLog("missing secure lockscreen showing log",
381 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500382 new LogMaker(MetricsEvent.LOCKSCREEN)
383 .setType(MetricsEvent.TYPE_OPEN)
384 .setSubtype(1));
385 }
386
Adrian Roos02de4982017-02-11 09:35:54 +0100387 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500388 public void lockscreenStateMetrics_isShowingBouncer() {
389 // uninteresting state, except that fingerprint must be non-zero
390 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
391 when(mUnlockMethodCache.canSkipBouncer()).thenReturn(true);
392 // interesting state
393 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
394 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(true);
395 when(mUnlockMethodCache.isMethodSecure()).thenReturn(true);
396
397 mStatusBar.onKeyguardViewManagerStatesUpdated();
398
Chris Wrenef319902017-03-07 17:58:31 -0500399 MetricsAsserts.assertHasLog("missing bouncer log",
400 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500401 new LogMaker(MetricsEvent.BOUNCER)
402 .setType(MetricsEvent.TYPE_OPEN)
403 .setSubtype(1));
404 }
405
Adrian Roos02de4982017-02-11 09:35:54 +0100406 @Test
Winson Chung67f5c8b2018-09-24 12:09:19 -0700407 public void testShouldHeadsUp_nonSuppressedGroupSummary() throws Exception {
Julia Reynolds30203152017-05-26 13:36:31 -0400408 when(mPowerManager.isScreenOn()).thenReturn(true);
409 when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false);
Gus Prevasec9e1f02018-12-18 15:28:12 -0500410 when(mNotificationFilter.shouldFilterOut(any())).thenReturn(false);
Winson Chung67f5c8b2018-09-24 12:09:19 -0700411 when(mDreamManager.isDreaming()).thenReturn(false);
Gus Prevasec9e1f02018-12-18 15:28:12 -0500412 when(mHeadsUpSuppressor.canHeadsUp(any(), any())).thenReturn(true);
Julia Reynolds30203152017-05-26 13:36:31 -0400413
414 Notification n = new Notification.Builder(getContext(), "a")
415 .setGroup("a")
416 .setGroupSummary(true)
417 .setGroupAlertBehavior(Notification.GROUP_ALERT_SUMMARY)
418 .build();
419 StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, "a", 0, 0, n,
420 UserHandle.of(0), null, 0);
Ned Burnsf81c4c42019-01-07 14:10:43 -0500421 NotificationEntry entry = new NotificationEntry(sbn);
Gus Prevasec9e1f02018-12-18 15:28:12 -0500422 entry.importance = IMPORTANCE_HIGH;
Julia Reynolds30203152017-05-26 13:36:31 -0400423
Gus Prevasec9e1f02018-12-18 15:28:12 -0500424 assertTrue(mNotificationInterruptionStateProvider.shouldHeadsUp(entry));
Julia Reynolds30203152017-05-26 13:36:31 -0400425 }
426
427 @Test
Winson Chung67f5c8b2018-09-24 12:09:19 -0700428 public void testShouldHeadsUp_suppressedGroupSummary() throws Exception {
Julia Reynolds30203152017-05-26 13:36:31 -0400429 when(mPowerManager.isScreenOn()).thenReturn(true);
430 when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false);
Gus Prevasec9e1f02018-12-18 15:28:12 -0500431 when(mNotificationFilter.shouldFilterOut(any())).thenReturn(false);
Winson Chung67f5c8b2018-09-24 12:09:19 -0700432 when(mDreamManager.isDreaming()).thenReturn(false);
Gus Prevasec9e1f02018-12-18 15:28:12 -0500433 when(mHeadsUpSuppressor.canHeadsUp(any(), any())).thenReturn(true);
Julia Reynolds30203152017-05-26 13:36:31 -0400434
435 Notification n = new Notification.Builder(getContext(), "a")
436 .setGroup("a")
437 .setGroupSummary(true)
438 .setGroupAlertBehavior(Notification.GROUP_ALERT_CHILDREN)
439 .build();
440 StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, "a", 0, 0, n,
441 UserHandle.of(0), null, 0);
Ned Burnsf81c4c42019-01-07 14:10:43 -0500442 NotificationEntry entry = new NotificationEntry(sbn);
Gus Prevasec9e1f02018-12-18 15:28:12 -0500443 entry.importance = IMPORTANCE_HIGH;
Julia Reynolds30203152017-05-26 13:36:31 -0400444
Gus Prevasec9e1f02018-12-18 15:28:12 -0500445 assertFalse(mNotificationInterruptionStateProvider.shouldHeadsUp(entry));
Julia Reynolds30203152017-05-26 13:36:31 -0400446 }
447
Chris Wren621933f2017-06-14 15:59:03 -0400448 @Test
Winson Chung67f5c8b2018-09-24 12:09:19 -0700449 public void testShouldHeadsUp_suppressedHeadsUp() throws Exception {
Beverly38159ce2017-07-13 16:39:24 -0400450 when(mPowerManager.isScreenOn()).thenReturn(true);
451 when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false);
Gus Prevasec9e1f02018-12-18 15:28:12 -0500452 when(mNotificationFilter.shouldFilterOut(any())).thenReturn(false);
Winson Chung67f5c8b2018-09-24 12:09:19 -0700453 when(mDreamManager.isDreaming()).thenReturn(false);
Gus Prevasec9e1f02018-12-18 15:28:12 -0500454 when(mHeadsUpSuppressor.canHeadsUp(any(), any())).thenReturn(true);
Julia Reynolds24653c32018-03-02 13:16:37 -0500455
456 Notification n = new Notification.Builder(getContext(), "a").build();
457 StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, "a", 0, 0, n,
458 UserHandle.of(0), null, 0);
Ned Burnsf81c4c42019-01-07 14:10:43 -0500459 NotificationEntry entry = new NotificationEntry(sbn);
Gus Prevasec9e1f02018-12-18 15:28:12 -0500460 entry.suppressedVisualEffects = SUPPRESSED_EFFECT_PEEK;
461 entry.importance = IMPORTANCE_HIGH;
Julia Reynolds24653c32018-03-02 13:16:37 -0500462
Gus Prevasec9e1f02018-12-18 15:28:12 -0500463 assertFalse(mNotificationInterruptionStateProvider.shouldHeadsUp(entry));
Julia Reynolds24653c32018-03-02 13:16:37 -0500464 }
465
466 @Test
Winson Chung67f5c8b2018-09-24 12:09:19 -0700467 public void testShouldHeadsUp_noSuppressedHeadsUp() throws Exception {
Julia Reynolds24653c32018-03-02 13:16:37 -0500468 when(mPowerManager.isScreenOn()).thenReturn(true);
469 when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false);
Gus Prevasec9e1f02018-12-18 15:28:12 -0500470 when(mNotificationFilter.shouldFilterOut(any())).thenReturn(false);
Winson Chung67f5c8b2018-09-24 12:09:19 -0700471 when(mDreamManager.isDreaming()).thenReturn(false);
Gus Prevasec9e1f02018-12-18 15:28:12 -0500472 when(mHeadsUpSuppressor.canHeadsUp(any(), any())).thenReturn(true);
Beverly38159ce2017-07-13 16:39:24 -0400473
474 Notification n = new Notification.Builder(getContext(), "a").build();
475 StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, "a", 0, 0, n,
476 UserHandle.of(0), null, 0);
Ned Burnsf81c4c42019-01-07 14:10:43 -0500477 NotificationEntry entry = new NotificationEntry(sbn);
Gus Prevasec9e1f02018-12-18 15:28:12 -0500478 entry.importance = IMPORTANCE_HIGH;
Beverly38159ce2017-07-13 16:39:24 -0400479
Gus Prevasec9e1f02018-12-18 15:28:12 -0500480 assertTrue(mNotificationInterruptionStateProvider.shouldHeadsUp(entry));
Beverly38159ce2017-07-13 16:39:24 -0400481 }
482
483 @Test
Chris Wren621933f2017-06-14 15:59:03 -0400484 public void testLogHidden() {
485 try {
486 mStatusBar.handleVisibleToUserChanged(false);
Selim Cinek1a891a92017-12-04 17:41:27 +0100487 waitForUiOffloadThread();
Chris Wren621933f2017-06-14 15:59:03 -0400488 verify(mBarService, times(1)).onPanelHidden();
489 verify(mBarService, never()).onPanelRevealed(anyBoolean(), anyInt());
490 } catch (RemoteException e) {
491 fail();
492 }
493 }
494
495 @Test
Kevina97ea052018-09-11 13:53:18 -0700496 public void testPanelOpenForHeadsUp() {
Jason Monk297c04e2018-08-23 17:16:59 -0400497 when(mDeviceProvisionedController.isDeviceProvisioned()).thenReturn(true);
Chris Wren621933f2017-06-14 15:59:03 -0400498 when(mHeadsUpManager.hasPinnedHeadsUp()).thenReturn(true);
499 when(mNotificationData.getActiveNotifications()).thenReturn(mNotificationList);
500 when(mNotificationList.size()).thenReturn(5);
Jason Monk297c04e2018-08-23 17:16:59 -0400501 when(mNotificationPresenter.isPresenterFullyCollapsed()).thenReturn(true);
Chris Wren621933f2017-06-14 15:59:03 -0400502 mStatusBar.setBarStateForTest(StatusBarState.SHADE);
503
504 try {
505 mStatusBar.handleVisibleToUserChanged(true);
Selim Cinek1a891a92017-12-04 17:41:27 +0100506 waitForUiOffloadThread();
Chris Wren621933f2017-06-14 15:59:03 -0400507 verify(mBarService, never()).onPanelHidden();
508 verify(mBarService, times(1)).onPanelRevealed(false, 1);
509 } catch (RemoteException e) {
510 fail();
511 }
512 TestableLooper.get(this).processAllMessages();
513 }
514
515 @Test
516 public void testPanelOpenAndClear() {
517 when(mHeadsUpManager.hasPinnedHeadsUp()).thenReturn(false);
518 when(mNotificationData.getActiveNotifications()).thenReturn(mNotificationList);
519 when(mNotificationList.size()).thenReturn(5);
Jason Monk297c04e2018-08-23 17:16:59 -0400520 when(mNotificationPresenter.isPresenterFullyCollapsed()).thenReturn(false);
Chris Wren621933f2017-06-14 15:59:03 -0400521 mStatusBar.setBarStateForTest(StatusBarState.SHADE);
522
523 try {
524 mStatusBar.handleVisibleToUserChanged(true);
Selim Cinek1a891a92017-12-04 17:41:27 +0100525 waitForUiOffloadThread();
Chris Wren621933f2017-06-14 15:59:03 -0400526 verify(mBarService, never()).onPanelHidden();
527 verify(mBarService, times(1)).onPanelRevealed(true, 5);
528 } catch (RemoteException e) {
529 fail();
530 }
531 TestableLooper.get(this).processAllMessages();
532 }
533
534 @Test
535 public void testPanelOpenAndNoClear() {
536 when(mHeadsUpManager.hasPinnedHeadsUp()).thenReturn(false);
537 when(mNotificationData.getActiveNotifications()).thenReturn(mNotificationList);
538 when(mNotificationList.size()).thenReturn(5);
Jason Monk297c04e2018-08-23 17:16:59 -0400539 when(mNotificationPresenter.isPresenterFullyCollapsed()).thenReturn(false);
Chris Wren621933f2017-06-14 15:59:03 -0400540 mStatusBar.setBarStateForTest(StatusBarState.KEYGUARD);
541
542 try {
543 mStatusBar.handleVisibleToUserChanged(true);
Selim Cinek1a891a92017-12-04 17:41:27 +0100544 waitForUiOffloadThread();
Chris Wren621933f2017-06-14 15:59:03 -0400545 verify(mBarService, never()).onPanelHidden();
546 verify(mBarService, times(1)).onPanelRevealed(false, 5);
547 } catch (RemoteException e) {
548 fail();
549 }
550 TestableLooper.get(this).processAllMessages();
551 }
552
Jason Monk51305372017-06-22 11:41:08 -0400553 @Test
Charles He2eda2422017-09-24 17:55:21 +0100554 public void testDisableExpandStatusBar() {
555 mStatusBar.setBarStateForTest(StatusBarState.SHADE);
556 mStatusBar.setUserSetupForTest(true);
Jason Monk297c04e2018-08-23 17:16:59 -0400557 when(mDeviceProvisionedController.isDeviceProvisioned()).thenReturn(true);
Charles He2eda2422017-09-24 17:55:21 +0100558
Jason Monk297c04e2018-08-23 17:16:59 -0400559 when(mCommandQueue.panelsEnabled()).thenReturn(false);
Charles Chenf3d295c2018-11-30 18:15:21 +0800560 mStatusBar.disable(DEFAULT_DISPLAY, StatusBarManager.DISABLE_NONE,
Charles He2eda2422017-09-24 17:55:21 +0100561 StatusBarManager.DISABLE2_NOTIFICATION_SHADE, false);
562 verify(mNotificationPanelView).setQsExpansionEnabled(false);
563 mStatusBar.animateExpandNotificationsPanel();
564 verify(mNotificationPanelView, never()).expand(anyBoolean());
565 mStatusBar.animateExpandSettingsPanel(null);
566 verify(mNotificationPanelView, never()).expand(anyBoolean());
567
Jason Monk297c04e2018-08-23 17:16:59 -0400568 when(mCommandQueue.panelsEnabled()).thenReturn(true);
Charles Chenf3d295c2018-11-30 18:15:21 +0800569 mStatusBar.disable(DEFAULT_DISPLAY, StatusBarManager.DISABLE_NONE,
570 StatusBarManager.DISABLE2_NONE, false);
Charles He2eda2422017-09-24 17:55:21 +0100571 verify(mNotificationPanelView).setQsExpansionEnabled(true);
572 mStatusBar.animateExpandNotificationsPanel();
Eugene Susla2de69552018-03-20 13:22:17 -0700573 verify(mNotificationPanelView).expandWithoutQs();
Charles He2eda2422017-09-24 17:55:21 +0100574 mStatusBar.animateExpandSettingsPanel(null);
Eugene Susla2de69552018-03-20 13:22:17 -0700575 verify(mNotificationPanelView).expandWithQs();
Charles He2eda2422017-09-24 17:55:21 +0100576 }
577
578 @Test
Jason Monk51305372017-06-22 11:41:08 -0400579 public void testDump_DoesNotCrash() {
580 mStatusBar.dump(null, new PrintWriter(new ByteArrayOutputStream()), null);
581 }
582
Jason Monk9c4faa82017-08-15 09:32:27 -0400583 @Test
584 @RunWithLooper(setAsMainLooper = true)
585 public void testUpdateKeyguardState_DoesNotCrash() {
Jason Monk9c4faa82017-08-15 09:32:27 -0400586 mStatusBar.mState = StatusBarState.KEYGUARD;
Eliot Courtney09322282017-11-09 15:31:19 +0900587 when(mStatusBar.mLockscreenUserManager.getCurrentProfiles()).thenReturn(
588 new SparseArray<>());
Jason Monk1fd3fc32018-08-14 17:20:09 -0400589 mStatusBar.onStateChanged(StatusBarState.SHADE);
Jason Monk9c4faa82017-08-15 09:32:27 -0400590 }
591
Lucas Dupinc2e75462017-12-06 13:59:25 -0800592 @Test
593 public void testFingerprintNotification_UpdatesScrims() {
Gilad Brettercb51b8b2018-03-22 17:04:51 +0200594 mStatusBar.notifyBiometricAuthModeChanged();
Lucas Dupinc2e75462017-12-06 13:59:25 -0800595 verify(mScrimController).transitionTo(any(), any());
596 }
597
Lucas Dupin311eac82017-12-11 14:40:07 -0800598 @Test
599 public void testFingerprintUnlock_UpdatesScrims() {
600 // Simulate unlocking from AoD with fingerprint.
Gilad Brettercb51b8b2018-03-22 17:04:51 +0200601 when(mBiometricUnlockController.getMode())
602 .thenReturn(BiometricUnlockController.MODE_WAKE_AND_UNLOCK);
Lucas Dupin311eac82017-12-11 14:40:07 -0800603 mStatusBar.updateScrimController();
604 verify(mScrimController).transitionTo(eq(ScrimState.UNLOCKED), any());
605 }
606
Lucas Dupind5107302018-03-19 15:30:29 -0700607 @Test
608 public void testSetOccluded_propagatesToScrimController() {
609 mStatusBar.setOccluded(true);
610 verify(mScrimController).setKeyguardOccluded(eq(true));
611
612 reset(mScrimController);
613 mStatusBar.setOccluded(false);
614 verify(mScrimController).setKeyguardOccluded(eq(false));
615 }
616
Julia Reynoldsed1c9af2018-03-21 15:21:09 -0400617 @Test
Lucas Dupin988efb22018-12-04 16:53:58 -0800618 public void testPulseWhileDozing_updatesScrimController() {
619 mStatusBar.setBarStateForTest(StatusBarState.KEYGUARD);
620 mStatusBar.showKeyguardImpl();
Julia Reynoldsed1c9af2018-03-21 15:21:09 -0400621
Lucas Dupin988efb22018-12-04 16:53:58 -0800622 // Keep track of callback to be able to stop the pulse
623 DozeHost.PulseCallback[] pulseCallback = new DozeHost.PulseCallback[1];
624 doAnswer(invocation -> {
625 pulseCallback[0] = invocation.getArgument(0);
626 return null;
627 }).when(mDozeScrimController).pulse(any(), anyInt());
628
629 // Starting a pulse should change the scrim controller to the pulsing state
630 mStatusBar.mDozeServiceHost.pulseWhileDozing(mock(DozeHost.PulseCallback.class),
631 DozeLog.PULSE_REASON_NOTIFICATION);
632 verify(mScrimController).transitionTo(eq(ScrimState.PULSING), any());
633
634 // Ending a pulse should take it back to keyguard state
635 pulseCallback[0].onPulseFinished();
636 verify(mScrimController).transitionTo(eq(ScrimState.KEYGUARD));
637 }
638
639 @Test
Lucas Dupin3d053532019-01-29 12:35:22 -0800640 public void testPulseWhileDozing_notifyAuthInterrupt() {
641 HashSet<Integer> reasonsWantingAuth = new HashSet<>(
Lucas Dupina422c092019-06-13 10:08:19 -0700642 Collections.singletonList(DozeLog.PULSE_REASON_SENSOR_WAKE_LOCK_SCREEN));
Lucas Dupin3d053532019-01-29 12:35:22 -0800643 HashSet<Integer> reasonsSkippingAuth = new HashSet<>(
644 Arrays.asList(DozeLog.PULSE_REASON_INTENT,
Lucas Dupina422c092019-06-13 10:08:19 -0700645 DozeLog.PULSE_REASON_NOTIFICATION,
Lucas Dupin3d053532019-01-29 12:35:22 -0800646 DozeLog.PULSE_REASON_SENSOR_SIGMOTION,
647 DozeLog.REASON_SENSOR_PICKUP,
648 DozeLog.REASON_SENSOR_DOUBLE_TAP,
649 DozeLog.PULSE_REASON_SENSOR_LONG_PRESS,
650 DozeLog.PULSE_REASON_DOCKING,
651 DozeLog.REASON_SENSOR_WAKE_UP,
652 DozeLog.REASON_SENSOR_TAP));
653 HashSet<Integer> reasonsThatDontPulse = new HashSet<>(
654 Arrays.asList(DozeLog.REASON_SENSOR_PICKUP,
655 DozeLog.REASON_SENSOR_DOUBLE_TAP,
656 DozeLog.REASON_SENSOR_TAP));
657
Lucas Dupine0516d52019-02-05 17:54:06 -0500658 doAnswer(invocation -> {
659 DozeHost.PulseCallback callback = invocation.getArgument(0);
660 callback.onPulseStarted();
661 return null;
662 }).when(mDozeScrimController).pulse(any(), anyInt());
663
Lucas Dupina422c092019-06-13 10:08:19 -0700664 mStatusBar.mDozeServiceHost.mWakeLockScreenPerformsAuth = true;
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
Jerry Changf89d8572019-04-18 11:09:13 +0800680 public void testPulseWhileDozingWithDockingReason_suppressWakeUpGesture() {
681 // Keep track of callback to be able to stop the pulse
682 final DozeHost.PulseCallback[] pulseCallback = new DozeHost.PulseCallback[1];
683 doAnswer(invocation -> {
684 pulseCallback[0] = invocation.getArgument(0);
685 return null;
686 }).when(mDozeScrimController).pulse(any(), anyInt());
687
688 // Starting a pulse while docking should suppress wakeup gesture
689 mStatusBar.mDozeServiceHost.pulseWhileDozing(mock(DozeHost.PulseCallback.class),
690 DozeLog.PULSE_REASON_DOCKING);
691 verify(mStatusBarWindowView).suppressWakeUpGesture(eq(true));
692
693 // Ending a pulse should restore wakeup gesture
694 pulseCallback[0].onPulseFinished();
695 verify(mStatusBarWindowView).suppressWakeUpGesture(eq(false));
696 }
697
698 @Test
jovanak5f6dc612018-03-27 11:59:22 -0700699 public void testSetState_changesIsFullScreenUserSwitcherState() {
700 mStatusBar.setBarStateForTest(StatusBarState.KEYGUARD);
701 assertFalse(mStatusBar.isFullScreenUserSwitcherState());
702
703 mStatusBar.setBarStateForTest(StatusBarState.FULLSCREEN_USER_SWITCHER);
704 assertTrue(mStatusBar.isFullScreenUserSwitcherState());
705 }
706
707 @Test
708 public void testShowKeyguardImplementation_setsState() {
709 when(mLockscreenUserManager.getCurrentProfiles()).thenReturn(new SparseArray<>());
710
711 mStatusBar.setBarStateForTest(StatusBarState.SHADE);
712
713 // By default, showKeyguardImpl sets state to KEYGUARD.
714 mStatusBar.showKeyguardImpl();
Jason Monk1fd3fc32018-08-14 17:20:09 -0400715 verify(mStatusBarStateController).setState(eq(StatusBarState.KEYGUARD));
jovanak5f6dc612018-03-27 11:59:22 -0700716
717 // If useFullscreenUserSwitcher is true, state is set to FULLSCREEN_USER_SWITCHER.
718 mStatusBar.mUserSwitcherController = mock(UserSwitcherController.class);
719 when(mStatusBar.mUserSwitcherController.useFullscreenUserSwitcher()).thenReturn(true);
720 mStatusBar.showKeyguardImpl();
Jason Monk1fd3fc32018-08-14 17:20:09 -0400721 verify(mStatusBarStateController).setState(eq(StatusBarState.FULLSCREEN_USER_SWITCHER));
jovanak5f6dc612018-03-27 11:59:22 -0700722 }
723
Lucas Dupin29a07ec2018-11-13 16:56:49 -0800724 @Test
725 public void testStartStopDozing() {
726 mStatusBar.setBarStateForTest(StatusBarState.KEYGUARD);
727 when(mStatusBarStateController.isKeyguardRequested()).thenReturn(true);
728
729 mStatusBar.mDozeServiceHost.startDozing();
730 verify(mStatusBarStateController).setIsDozing(eq(true));
731
732 mStatusBar.mDozeServiceHost.stopDozing();
733 verify(mStatusBarStateController).setIsDozing(eq(false));
734 }
735
736 @Test
737 public void testOnStartedWakingUp_isNotDozing() {
738 mStatusBar.setBarStateForTest(StatusBarState.KEYGUARD);
739 when(mStatusBarStateController.isKeyguardRequested()).thenReturn(true);
Lucas Dupin29a07ec2018-11-13 16:56:49 -0800740 mStatusBar.mDozeServiceHost.startDozing();
741 verify(mStatusBarStateController).setIsDozing(eq(true));
Lucas Dupin3cfd6882019-03-19 15:22:03 -0700742 clearInvocations(mNotificationPanelView);
Lucas Dupin29a07ec2018-11-13 16:56:49 -0800743
744 mStatusBar.mWakefulnessObserver.onStartedWakingUp();
745 verify(mStatusBarStateController).setIsDozing(eq(false));
Lucas Dupin3cfd6882019-03-19 15:22:03 -0700746 verify(mNotificationPanelView).expand(eq(false));
747 }
748
749 @Test
750 public void testOnStartedWakingUp_doesNotDismissBouncer_whenPulsing() {
751 mStatusBar.setBarStateForTest(StatusBarState.KEYGUARD);
752 when(mStatusBarStateController.isKeyguardRequested()).thenReturn(true);
753 mStatusBar.mDozeServiceHost.startDozing();
754 clearInvocations(mNotificationPanelView);
755
756 mStatusBar.setBouncerShowing(true);
757 mStatusBar.mWakefulnessObserver.onStartedWakingUp();
758 verify(mNotificationPanelView, never()).expand(anyBoolean());
Lucas Dupin29a07ec2018-11-13 16:56:49 -0800759 }
760
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500761 static class TestableStatusBar extends StatusBar {
Chris Wren27a52fa2017-02-01 14:21:43 -0500762 public TestableStatusBar(StatusBarKeyguardViewManager man,
763 UnlockMethodCache unlock, KeyguardIndicationController key,
Selim Cinekc3fec682019-06-06 18:11:07 -0700764 NotificationStackScrollLayout stack,
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900765 PowerManager pm, NotificationPanelView panelView,
Eliot Courtney3985ad52017-11-17 16:51:52 +0900766 IStatusBarService barService, NotificationListener notificationListener,
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900767 NotificationLogger notificationLogger,
Eliot Courtney2b4c3a02017-11-27 13:27:46 +0900768 VisualStabilityManager visualStabilityManager,
769 NotificationViewHierarchyManager viewHierarchyManager,
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900770 TestableNotificationEntryManager entryManager, ScrimController scrimController,
Gilad Brettercb51b8b2018-03-22 17:04:51 +0200771 BiometricUnlockController biometricUnlockController,
Jason Monk297c04e2018-08-23 17:16:59 -0400772 KeyguardViewMediator keyguardViewMediator,
jovanak5f6dc612018-03-27 11:59:22 -0700773 NotificationRemoteInputManager notificationRemoteInputManager,
774 NotificationGroupManager notificationGroupManager,
Kevin01a53cb2018-11-09 18:19:54 -0800775 NotificationGroupAlertTransferHelper notificationGroupAlertTransferHelper,
jovanak5f6dc612018-03-27 11:59:22 -0700776 FalsingManager falsingManager,
Lucas Dupin1a8588d2018-08-21 12:18:47 -0700777 StatusBarWindowController statusBarWindowController,
jovanak5f6dc612018-03-27 11:59:22 -0700778 NotificationIconAreaController notificationIconAreaController,
779 DozeScrimController dozeScrimController,
780 NotificationShelf notificationShelf,
781 NotificationLockscreenUserManager notificationLockscreenUserManager,
Jason Monk297c04e2018-08-23 17:16:59 -0400782 CommandQueue commandQueue,
Selim Cinek5454a0d2019-07-30 17:14:50 -0700783 StatusBarNotificationPresenter notificationPresenter,
Charles Chen10ca70b2018-11-28 00:03:38 +0800784 BubbleController bubbleController,
Charles Chen8c9a83f2018-12-18 17:44:10 +0800785 NavigationBarController navBarController,
Lucas Dupin3d053532019-01-29 12:35:22 -0800786 AutoHideController autoHideController,
Lucas Dupin2e838ac2019-04-17 16:50:58 -0700787 KeyguardUpdateMonitor keyguardUpdateMonitor,
788 StatusBarWindowView statusBarWindow) {
Adrian Roosef7a4022017-01-19 14:48:35 -0800789 mStatusBarKeyguardViewManager = man;
Chris Wren27a52fa2017-02-01 14:21:43 -0500790 mUnlockMethodCache = unlock;
791 mKeyguardIndicationController = key;
792 mStackScroller = stack;
Julia Reynolds30203152017-05-26 13:36:31 -0400793 mPowerManager = pm;
Jorim Jaggifd3b1a12017-06-06 17:04:19 -0700794 mNotificationPanel = panelView;
Chris Wren621933f2017-06-14 15:59:03 -0400795 mBarService = barService;
Eliot Courtney3985ad52017-11-17 16:51:52 +0900796 mNotificationListener = notificationListener;
797 mNotificationLogger = notificationLogger;
Adrian Roos6d5ebb72017-08-03 15:10:22 +0200798 mWakefulnessLifecycle = createAwakeWakefulnessLifecycle();
Eliot Courtney2b4c3a02017-11-27 13:27:46 +0900799 mVisualStabilityManager = visualStabilityManager;
800 mViewHierarchyManager = viewHierarchyManager;
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900801 mEntryManager = entryManager;
Lucas Dupinc2e75462017-12-06 13:59:25 -0800802 mScrimController = scrimController;
Gilad Brettercb51b8b2018-03-22 17:04:51 +0200803 mBiometricUnlockController = biometricUnlockController;
Lucas Dupin47a65c72018-02-15 14:16:18 -0800804 mKeyguardViewMediator = keyguardViewMediator;
jovanak5f6dc612018-03-27 11:59:22 -0700805 mRemoteInputManager = notificationRemoteInputManager;
806 mGroupManager = notificationGroupManager;
Kevin01a53cb2018-11-09 18:19:54 -0800807 mGroupAlertTransferHelper = notificationGroupAlertTransferHelper;
jovanak5f6dc612018-03-27 11:59:22 -0700808 mFalsingManager = falsingManager;
Lucas Dupin1a8588d2018-08-21 12:18:47 -0700809 mStatusBarWindowController = statusBarWindowController;
jovanak5f6dc612018-03-27 11:59:22 -0700810 mNotificationIconAreaController = notificationIconAreaController;
811 mDozeScrimController = dozeScrimController;
812 mNotificationShelf = notificationShelf;
813 mLockscreenUserManager = notificationLockscreenUserManager;
814 mCommandQueue = commandQueue;
Jason Monk297c04e2018-08-23 17:16:59 -0400815 mPresenter = notificationPresenter;
Lucas Dupin29a07ec2018-11-13 16:56:49 -0800816 mGestureWakeLock = mock(PowerManager.WakeLock.class);
Mady Mellorcd9b1302018-11-06 18:08:04 -0800817 mBubbleController = bubbleController;
Charles Chen10ca70b2018-11-28 00:03:38 +0800818 mNavigationBarController = navBarController;
Charles Chen8c9a83f2018-12-18 17:44:10 +0800819 mAutoHideController = autoHideController;
Lucas Dupin3d053532019-01-29 12:35:22 -0800820 mKeyguardUpdateMonitor = keyguardUpdateMonitor;
Lucas Dupin2e838ac2019-04-17 16:50:58 -0700821 mStatusBarWindow = statusBarWindow;
Lucas Dupin8b8c2bd2019-06-07 17:17:31 -0700822 mDozeServiceHost.mWakeLockScreenPerformsAuth = false;
Adrian Roos6d5ebb72017-08-03 15:10:22 +0200823 }
824
825 private WakefulnessLifecycle createAwakeWakefulnessLifecycle() {
826 WakefulnessLifecycle wakefulnessLifecycle = new WakefulnessLifecycle();
827 wakefulnessLifecycle.dispatchStartedWakingUp();
828 wakefulnessLifecycle.dispatchFinishedWakingUp();
829 return wakefulnessLifecycle;
Adrian Roosef7a4022017-01-19 14:48:35 -0800830 }
831
Jason Monk9c4faa82017-08-15 09:32:27 -0400832 @Override
833 protected void updateTheme() {
834 // Do nothing for now, until we have more mocking and StatusBar is smaller.
835 }
836
Chris Wren621933f2017-06-14 15:59:03 -0400837 public void setBarStateForTest(int state) {
838 mState = state;
Adrian Roosef7a4022017-01-19 14:48:35 -0800839 }
Charles He2eda2422017-09-24 17:55:21 +0100840
Selim Cinekc3fec682019-06-06 18:11:07 -0700841 void setHeadsUpManager(HeadsUpManagerPhone headsUpManager) {
842 mHeadsUpManager = headsUpManager;
843 }
844
Charles He2eda2422017-09-24 17:55:21 +0100845 public void setUserSetupForTest(boolean userSetup) {
846 mUserSetup = userSetup;
847 }
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900848
849 }
850
Jason Monke59dc402018-08-16 12:05:01 -0400851 public static class TestableNotificationEntryManager extends NotificationEntryManager {
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900852
Gus Prevas92586462019-01-04 16:06:12 -0500853 public TestableNotificationEntryManager(Context context) {
Eliot Courtney6c313d32017-12-14 19:57:51 +0900854 super(context);
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900855 }
856
857 public void setUpForTest(NotificationPresenter presenter,
Eliot Courtney2b4c3a02017-11-27 13:27:46 +0900858 NotificationListContainer listContainer,
yoshiki iguchi4e30e762018-02-06 12:09:23 +0900859 HeadsUpManagerPhone headsUpManager,
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900860 NotificationData notificationData) {
Gus Prevas8621bd22018-12-20 15:04:25 -0500861 super.setUpWithPresenter(presenter, listContainer, headsUpManager);
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900862 mNotificationData = notificationData;
Gus Prevasec9e1f02018-12-18 15:28:12 -0500863 }
864 }
865
866 public static class TestableNotificationInterruptionStateProvider extends
867 NotificationInterruptionStateProvider {
868
869 public TestableNotificationInterruptionStateProvider(
870 Context context,
871 PowerManager powerManager,
Lucas Dupin2c3992b2019-03-11 16:34:08 -0700872 IDreamManager dreamManager,
873 AmbientDisplayConfiguration ambientDisplayConfiguration) {
874 super(context, powerManager, dreamManager, ambientDisplayConfiguration);
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900875 mUseHeadsUp = true;
876 }
Adrian Roosef7a4022017-01-19 14:48:35 -0800877 }
Eliot Courtney09322282017-11-09 15:31:19 +0900878}