blob: 178ff22eede238da3675072e223bd3224f09c742 [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,
Mady Mellorc55b4122019-06-07 18:14:02 -0700211 mDreamManager, mAmbientDisplayConfiguration, mNotificationFilter,
212 mStatusBarStateController);
Gus Prevasec9e1f02018-12-18 15:28:12 -0500213 mDependency.injectTestDependency(NotificationInterruptionStateProvider.class,
214 mNotificationInterruptionStateProvider);
Charles Chen10ca70b2018-11-28 00:03:38 +0800215 mDependency.injectMockDependency(NavigationBarController.class);
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900216
Jason Monk51305372017-06-22 11:41:08 -0400217 mContext.addMockSystemService(TrustManager.class, mock(TrustManager.class));
218 mContext.addMockSystemService(FingerprintManager.class, mock(FingerprintManager.class));
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900219
Chris Wrenef319902017-03-07 17:58:31 -0500220 mMetricsLogger = new FakeMetricsLogger();
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900221 mDependency.injectTestDependency(MetricsLogger.class, mMetricsLogger);
Gus Prevas92586462019-01-04 16:06:12 -0500222 mEntryManager = new TestableNotificationEntryManager(mContext);
Jason Monkd97204c2018-12-21 15:49:04 -0500223 mNotificationLogger = new NotificationLogger(mNotificationListener,
Tony Mak202f25d2019-01-07 14:40:39 +0000224 Dependency.get(UiOffloadThread.class), mEntryManager, mStatusBarStateController,
225 mExpansionStateLogger);
Selim Cinekc3fec682019-06-06 18:11:07 -0700226 mNotificationLogger.setVisibilityReporter(mock(Runnable.class));
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900227 mDependency.injectTestDependency(NotificationLogger.class, mNotificationLogger);
Lucas Dupin78c8fed2018-12-18 16:41:37 -0800228 DozeLog.traceDozing(mContext, false /* dozing */);
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900229
Jason Monk297c04e2018-08-23 17:16:59 -0400230 mCommandQueue = mock(CommandQueue.class);
231 when(mCommandQueue.asBinder()).thenReturn(new Binder());
232 mContext.putComponent(CommandQueue.class, mCommandQueue);
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900233
234 mContext.setTheme(R.style.Theme_SystemUI_Light);
235
236 when(mStackScroller.generateLayoutParams(any())).thenReturn(new LayoutParams(0, 0));
237 when(mNotificationPanelView.getLayoutParams()).thenReturn(new LayoutParams(0, 0));
Julia Reynolds30203152017-05-26 13:36:31 -0400238 when(powerManagerService.isInteractive()).thenReturn(true);
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900239 when(mStackScroller.getActivatedChild()).thenReturn(null);
Julia Reynolds30203152017-05-26 13:36:31 -0400240
Adrian Roosef7a4022017-01-19 14:48:35 -0800241 doAnswer(invocation -> {
242 OnDismissAction onDismissAction = (OnDismissAction) invocation.getArguments()[0];
243 onDismissAction.onDismiss();
244 return null;
245 }).when(mStatusBarKeyguardViewManager).dismissWithAction(any(), any(), anyBoolean());
246
247 doAnswer(invocation -> {
248 Runnable runnable = (Runnable) invocation.getArguments()[0];
249 runnable.run();
250 return null;
251 }).when(mStatusBarKeyguardViewManager).addAfterKeyguardGoneRunnable(any());
Chris Wren27a52fa2017-02-01 14:21:43 -0500252
Gus Prevasec9e1f02018-12-18 15:28:12 -0500253 mNotificationInterruptionStateProvider.setUpWithPresenter(mNotificationPresenter,
254 mHeadsUpManager, mHeadsUpSuppressor);
255
Selim Cinek7c6fe5b2018-04-09 18:27:13 -0700256 when(mRemoteInputManager.getController()).thenReturn(mRemoteInputController);
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900257 mStatusBar = new TestableStatusBar(mStatusBarKeyguardViewManager, mUnlockMethodCache,
Selim Cinekc3fec682019-06-06 18:11:07 -0700258 mKeyguardIndicationController, mStackScroller,
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900259 mPowerManager, mNotificationPanelView, mBarService, mNotificationListener,
260 mNotificationLogger, mVisualStabilityManager, mViewHierarchyManager,
Gilad Brettercb51b8b2018-03-22 17:04:51 +0200261 mEntryManager, mScrimController, mBiometricUnlockController,
Jason Monk297c04e2018-08-23 17:16:59 -0400262 mKeyguardViewMediator, mRemoteInputManager, mock(NotificationGroupManager.class),
Kevin01a53cb2018-11-09 18:19:54 -0800263 mock(NotificationGroupAlertTransferHelper.class), mock(FalsingManager.class),
264 mock(StatusBarWindowController.class), mock(NotificationIconAreaController.class),
Lucas Dupin988efb22018-12-04 16:53:58 -0800265 mDozeScrimController, mock(NotificationShelf.class),
Kevin01a53cb2018-11-09 18:19:54 -0800266 mLockscreenUserManager, mCommandQueue, mNotificationPresenter,
Charles Chen8c9a83f2018-12-18 17:44:10 +0800267 mock(BubbleController.class), mock(NavigationBarController.class),
Lucas Dupin2e838ac2019-04-17 16:50:58 -0700268 mock(AutoHideController.class), mKeyguardUpdateMonitor, mStatusBarWindowView);
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900269 mStatusBar.mContext = mContext;
270 mStatusBar.mComponents = mContext.getComponents();
Selim Cinek9d20bed2018-12-26 16:02:34 -0800271 SystemUIFactory.getInstance().getRootComponent()
272 .getStatusBarInjector()
273 .createStatusBar(mStatusBar);
Selim Cinekc3fec682019-06-06 18:11:07 -0700274 mStatusBar.setHeadsUpManager(mHeadsUpManager);
Jason Monk297c04e2018-08-23 17:16:59 -0400275 mStatusBar.putComponent(StatusBar.class, mStatusBar);
276 Dependency.get(InitController.class).executePostInitTasks();
277 mEntryManager.setUpForTest(mock(NotificationPresenter.class), mStackScroller,
Gus Prevas8621bd22018-12-20 15:04:25 -0500278 mHeadsUpManager, mNotificationData);
279 mEntryManager.addNotificationEntryListener(mEntryListener);
Jason Monk297c04e2018-08-23 17:16:59 -0400280 mNotificationLogger.setUpWithContainer(mStackScroller);
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<>(
Lucas Dupina422c092019-06-13 10:08:19 -0700643 Collections.singletonList(DozeLog.PULSE_REASON_SENSOR_WAKE_LOCK_SCREEN));
Lucas Dupin3d053532019-01-29 12:35:22 -0800644 HashSet<Integer> reasonsSkippingAuth = new HashSet<>(
645 Arrays.asList(DozeLog.PULSE_REASON_INTENT,
Lucas Dupina422c092019-06-13 10:08:19 -0700646 DozeLog.PULSE_REASON_NOTIFICATION,
Lucas Dupin3d053532019-01-29 12:35:22 -0800647 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 Dupina422c092019-06-13 10:08:19 -0700665 mStatusBar.mDozeServiceHost.mWakeLockScreenPerformsAuth = true;
Lucas Dupin3d053532019-01-29 12:35:22 -0800666 for (int i = 0; i < DozeLog.REASONS; i++) {
667 reset(mKeyguardUpdateMonitor);
668 mStatusBar.mDozeServiceHost.pulseWhileDozing(mock(DozeHost.PulseCallback.class), i);
669 if (reasonsWantingAuth.contains(i)) {
Lucas Dupine0516d52019-02-05 17:54:06 -0500670 verify(mKeyguardUpdateMonitor).onAuthInterruptDetected(eq(true));
Lucas Dupin3d053532019-01-29 12:35:22 -0800671 } else if (reasonsSkippingAuth.contains(i) || reasonsThatDontPulse.contains(i)) {
Lucas Dupine0516d52019-02-05 17:54:06 -0500672 verify(mKeyguardUpdateMonitor, never()).onAuthInterruptDetected(eq(true));
Lucas Dupin3d053532019-01-29 12:35:22 -0800673 } else {
674 throw new AssertionError("Reason " + i + " isn't specified as wanting or skipping"
675 + " passive auth. Please consider how this pulse reason should behave.");
676 }
677 }
678 }
679
680 @Test
Jerry Changf89d8572019-04-18 11:09:13 +0800681 public void testPulseWhileDozingWithDockingReason_suppressWakeUpGesture() {
682 // Keep track of callback to be able to stop the pulse
683 final DozeHost.PulseCallback[] pulseCallback = new DozeHost.PulseCallback[1];
684 doAnswer(invocation -> {
685 pulseCallback[0] = invocation.getArgument(0);
686 return null;
687 }).when(mDozeScrimController).pulse(any(), anyInt());
688
689 // Starting a pulse while docking should suppress wakeup gesture
690 mStatusBar.mDozeServiceHost.pulseWhileDozing(mock(DozeHost.PulseCallback.class),
691 DozeLog.PULSE_REASON_DOCKING);
692 verify(mStatusBarWindowView).suppressWakeUpGesture(eq(true));
693
694 // Ending a pulse should restore wakeup gesture
695 pulseCallback[0].onPulseFinished();
696 verify(mStatusBarWindowView).suppressWakeUpGesture(eq(false));
697 }
698
699 @Test
jovanak5f6dc612018-03-27 11:59:22 -0700700 public void testSetState_changesIsFullScreenUserSwitcherState() {
701 mStatusBar.setBarStateForTest(StatusBarState.KEYGUARD);
702 assertFalse(mStatusBar.isFullScreenUserSwitcherState());
703
704 mStatusBar.setBarStateForTest(StatusBarState.FULLSCREEN_USER_SWITCHER);
705 assertTrue(mStatusBar.isFullScreenUserSwitcherState());
706 }
707
708 @Test
709 public void testShowKeyguardImplementation_setsState() {
710 when(mLockscreenUserManager.getCurrentProfiles()).thenReturn(new SparseArray<>());
711
712 mStatusBar.setBarStateForTest(StatusBarState.SHADE);
713
714 // By default, showKeyguardImpl sets state to KEYGUARD.
715 mStatusBar.showKeyguardImpl();
Jason Monk1fd3fc32018-08-14 17:20:09 -0400716 verify(mStatusBarStateController).setState(eq(StatusBarState.KEYGUARD));
jovanak5f6dc612018-03-27 11:59:22 -0700717
718 // If useFullscreenUserSwitcher is true, state is set to FULLSCREEN_USER_SWITCHER.
719 mStatusBar.mUserSwitcherController = mock(UserSwitcherController.class);
720 when(mStatusBar.mUserSwitcherController.useFullscreenUserSwitcher()).thenReturn(true);
721 mStatusBar.showKeyguardImpl();
Jason Monk1fd3fc32018-08-14 17:20:09 -0400722 verify(mStatusBarStateController).setState(eq(StatusBarState.FULLSCREEN_USER_SWITCHER));
jovanak5f6dc612018-03-27 11:59:22 -0700723 }
724
Lucas Dupin29a07ec2018-11-13 16:56:49 -0800725 @Test
726 public void testStartStopDozing() {
727 mStatusBar.setBarStateForTest(StatusBarState.KEYGUARD);
728 when(mStatusBarStateController.isKeyguardRequested()).thenReturn(true);
729
730 mStatusBar.mDozeServiceHost.startDozing();
731 verify(mStatusBarStateController).setIsDozing(eq(true));
732
733 mStatusBar.mDozeServiceHost.stopDozing();
734 verify(mStatusBarStateController).setIsDozing(eq(false));
735 }
736
737 @Test
738 public void testOnStartedWakingUp_isNotDozing() {
739 mStatusBar.setBarStateForTest(StatusBarState.KEYGUARD);
740 when(mStatusBarStateController.isKeyguardRequested()).thenReturn(true);
Lucas Dupin29a07ec2018-11-13 16:56:49 -0800741 mStatusBar.mDozeServiceHost.startDozing();
742 verify(mStatusBarStateController).setIsDozing(eq(true));
Lucas Dupin3cfd6882019-03-19 15:22:03 -0700743 clearInvocations(mNotificationPanelView);
Lucas Dupin29a07ec2018-11-13 16:56:49 -0800744
745 mStatusBar.mWakefulnessObserver.onStartedWakingUp();
746 verify(mStatusBarStateController).setIsDozing(eq(false));
Lucas Dupin3cfd6882019-03-19 15:22:03 -0700747 verify(mNotificationPanelView).expand(eq(false));
748 }
749
750 @Test
751 public void testOnStartedWakingUp_doesNotDismissBouncer_whenPulsing() {
752 mStatusBar.setBarStateForTest(StatusBarState.KEYGUARD);
753 when(mStatusBarStateController.isKeyguardRequested()).thenReturn(true);
754 mStatusBar.mDozeServiceHost.startDozing();
755 clearInvocations(mNotificationPanelView);
756
757 mStatusBar.setBouncerShowing(true);
758 mStatusBar.mWakefulnessObserver.onStartedWakingUp();
759 verify(mNotificationPanelView, never()).expand(anyBoolean());
Lucas Dupin29a07ec2018-11-13 16:56:49 -0800760 }
761
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500762 static class TestableStatusBar extends StatusBar {
Chris Wren27a52fa2017-02-01 14:21:43 -0500763 public TestableStatusBar(StatusBarKeyguardViewManager man,
764 UnlockMethodCache unlock, KeyguardIndicationController key,
Selim Cinekc3fec682019-06-06 18:11:07 -0700765 NotificationStackScrollLayout stack,
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900766 PowerManager pm, NotificationPanelView panelView,
Eliot Courtney3985ad52017-11-17 16:51:52 +0900767 IStatusBarService barService, NotificationListener notificationListener,
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900768 NotificationLogger notificationLogger,
Eliot Courtney2b4c3a02017-11-27 13:27:46 +0900769 VisualStabilityManager visualStabilityManager,
770 NotificationViewHierarchyManager viewHierarchyManager,
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900771 TestableNotificationEntryManager entryManager, ScrimController scrimController,
Gilad Brettercb51b8b2018-03-22 17:04:51 +0200772 BiometricUnlockController biometricUnlockController,
Jason Monk297c04e2018-08-23 17:16:59 -0400773 KeyguardViewMediator keyguardViewMediator,
jovanak5f6dc612018-03-27 11:59:22 -0700774 NotificationRemoteInputManager notificationRemoteInputManager,
775 NotificationGroupManager notificationGroupManager,
Kevin01a53cb2018-11-09 18:19:54 -0800776 NotificationGroupAlertTransferHelper notificationGroupAlertTransferHelper,
jovanak5f6dc612018-03-27 11:59:22 -0700777 FalsingManager falsingManager,
Lucas Dupin1a8588d2018-08-21 12:18:47 -0700778 StatusBarWindowController statusBarWindowController,
jovanak5f6dc612018-03-27 11:59:22 -0700779 NotificationIconAreaController notificationIconAreaController,
780 DozeScrimController dozeScrimController,
781 NotificationShelf notificationShelf,
782 NotificationLockscreenUserManager notificationLockscreenUserManager,
Jason Monk297c04e2018-08-23 17:16:59 -0400783 CommandQueue commandQueue,
Selim Cinek5454a0d2019-07-30 17:14:50 -0700784 StatusBarNotificationPresenter notificationPresenter,
Charles Chen10ca70b2018-11-28 00:03:38 +0800785 BubbleController bubbleController,
Charles Chen8c9a83f2018-12-18 17:44:10 +0800786 NavigationBarController navBarController,
Lucas Dupin3d053532019-01-29 12:35:22 -0800787 AutoHideController autoHideController,
Lucas Dupin2e838ac2019-04-17 16:50:58 -0700788 KeyguardUpdateMonitor keyguardUpdateMonitor,
789 StatusBarWindowView statusBarWindow) {
Adrian Roosef7a4022017-01-19 14:48:35 -0800790 mStatusBarKeyguardViewManager = man;
Chris Wren27a52fa2017-02-01 14:21:43 -0500791 mUnlockMethodCache = unlock;
792 mKeyguardIndicationController = key;
793 mStackScroller = stack;
Julia Reynolds30203152017-05-26 13:36:31 -0400794 mPowerManager = pm;
Jorim Jaggifd3b1a12017-06-06 17:04:19 -0700795 mNotificationPanel = panelView;
Chris Wren621933f2017-06-14 15:59:03 -0400796 mBarService = barService;
Eliot Courtney3985ad52017-11-17 16:51:52 +0900797 mNotificationListener = notificationListener;
798 mNotificationLogger = notificationLogger;
Adrian Roos6d5ebb72017-08-03 15:10:22 +0200799 mWakefulnessLifecycle = createAwakeWakefulnessLifecycle();
Eliot Courtney2b4c3a02017-11-27 13:27:46 +0900800 mVisualStabilityManager = visualStabilityManager;
801 mViewHierarchyManager = viewHierarchyManager;
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900802 mEntryManager = entryManager;
Lucas Dupinc2e75462017-12-06 13:59:25 -0800803 mScrimController = scrimController;
Gilad Brettercb51b8b2018-03-22 17:04:51 +0200804 mBiometricUnlockController = biometricUnlockController;
Lucas Dupin47a65c72018-02-15 14:16:18 -0800805 mKeyguardViewMediator = keyguardViewMediator;
jovanak5f6dc612018-03-27 11:59:22 -0700806 mRemoteInputManager = notificationRemoteInputManager;
807 mGroupManager = notificationGroupManager;
Kevin01a53cb2018-11-09 18:19:54 -0800808 mGroupAlertTransferHelper = notificationGroupAlertTransferHelper;
jovanak5f6dc612018-03-27 11:59:22 -0700809 mFalsingManager = falsingManager;
Lucas Dupin1a8588d2018-08-21 12:18:47 -0700810 mStatusBarWindowController = statusBarWindowController;
jovanak5f6dc612018-03-27 11:59:22 -0700811 mNotificationIconAreaController = notificationIconAreaController;
812 mDozeScrimController = dozeScrimController;
813 mNotificationShelf = notificationShelf;
814 mLockscreenUserManager = notificationLockscreenUserManager;
815 mCommandQueue = commandQueue;
Jason Monk297c04e2018-08-23 17:16:59 -0400816 mPresenter = notificationPresenter;
Lucas Dupin29a07ec2018-11-13 16:56:49 -0800817 mGestureWakeLock = mock(PowerManager.WakeLock.class);
Mady Mellorcd9b1302018-11-06 18:08:04 -0800818 mBubbleController = bubbleController;
Charles Chen10ca70b2018-11-28 00:03:38 +0800819 mNavigationBarController = navBarController;
Charles Chen8c9a83f2018-12-18 17:44:10 +0800820 mAutoHideController = autoHideController;
Lucas Dupin3d053532019-01-29 12:35:22 -0800821 mKeyguardUpdateMonitor = keyguardUpdateMonitor;
Lucas Dupin2e838ac2019-04-17 16:50:58 -0700822 mStatusBarWindow = statusBarWindow;
Lucas Dupin8b8c2bd2019-06-07 17:17:31 -0700823 mDozeServiceHost.mWakeLockScreenPerformsAuth = false;
Adrian Roos6d5ebb72017-08-03 15:10:22 +0200824 }
825
826 private WakefulnessLifecycle createAwakeWakefulnessLifecycle() {
827 WakefulnessLifecycle wakefulnessLifecycle = new WakefulnessLifecycle();
828 wakefulnessLifecycle.dispatchStartedWakingUp();
829 wakefulnessLifecycle.dispatchFinishedWakingUp();
830 return wakefulnessLifecycle;
Adrian Roosef7a4022017-01-19 14:48:35 -0800831 }
832
Jason Monk9c4faa82017-08-15 09:32:27 -0400833 @Override
834 protected void updateTheme() {
835 // Do nothing for now, until we have more mocking and StatusBar is smaller.
836 }
837
Chris Wren621933f2017-06-14 15:59:03 -0400838 public void setBarStateForTest(int state) {
839 mState = state;
Adrian Roosef7a4022017-01-19 14:48:35 -0800840 }
Charles He2eda2422017-09-24 17:55:21 +0100841
Selim Cinekc3fec682019-06-06 18:11:07 -0700842 void setHeadsUpManager(HeadsUpManagerPhone headsUpManager) {
843 mHeadsUpManager = headsUpManager;
844 }
845
Charles He2eda2422017-09-24 17:55:21 +0100846 public void setUserSetupForTest(boolean userSetup) {
847 mUserSetup = userSetup;
848 }
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900849
850 }
851
Jason Monke59dc402018-08-16 12:05:01 -0400852 public static class TestableNotificationEntryManager extends NotificationEntryManager {
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900853
Gus Prevas92586462019-01-04 16:06:12 -0500854 public TestableNotificationEntryManager(Context context) {
Eliot Courtney6c313d32017-12-14 19:57:51 +0900855 super(context);
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900856 }
857
858 public void setUpForTest(NotificationPresenter presenter,
Eliot Courtney2b4c3a02017-11-27 13:27:46 +0900859 NotificationListContainer listContainer,
yoshiki iguchi4e30e762018-02-06 12:09:23 +0900860 HeadsUpManagerPhone headsUpManager,
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900861 NotificationData notificationData) {
Gus Prevas8621bd22018-12-20 15:04:25 -0500862 super.setUpWithPresenter(presenter, listContainer, headsUpManager);
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900863 mNotificationData = notificationData;
Gus Prevasec9e1f02018-12-18 15:28:12 -0500864 }
865 }
866
867 public static class TestableNotificationInterruptionStateProvider extends
868 NotificationInterruptionStateProvider {
869
870 public TestableNotificationInterruptionStateProvider(
871 Context context,
872 PowerManager powerManager,
Lucas Dupin2c3992b2019-03-11 16:34:08 -0700873 IDreamManager dreamManager,
Mady Mellorc55b4122019-06-07 18:14:02 -0700874 AmbientDisplayConfiguration ambientDisplayConfiguration,
875 NotificationFilter filter,
876 StatusBarStateController controller) {
877 super(context, powerManager, dreamManager, ambientDisplayConfiguration, filter,
878 controller);
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900879 mUseHeadsUp = true;
880 }
Adrian Roosef7a4022017-01-19 14:48:35 -0800881 }
Eliot Courtney09322282017-11-09 15:31:19 +0900882}