blob: 46327a712a084e269d3c12a930cdbaaf29e8c962 [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;
Fabian Kozynskiff5e91f2019-09-24 15:38:08 -040044import android.content.BroadcastReceiver;
Eliot Courtneya6d8cf22017-10-20 13:26:58 +090045import android.content.Context;
Fabian Kozynskiff5e91f2019-09-24 15:38:08 -040046import android.content.IntentFilter;
Lucas Dupin2c3992b2019-03-11 16:34:08 -070047import android.hardware.display.AmbientDisplayConfiguration;
Jason Monk51305372017-06-22 11:41:08 -040048import android.hardware.fingerprint.FingerprintManager;
Chris Wren27a52fa2017-02-01 14:21:43 -050049import android.metrics.LogMaker;
Jason Monk9c4faa82017-08-15 09:32:27 -040050import android.os.Binder;
Julia Reynolds30203152017-05-26 13:36:31 -040051import android.os.Handler;
Julia Reynolds30203152017-05-26 13:36:31 -040052import android.os.IPowerManager;
Jason Monk6dceace2018-05-15 20:24:07 -040053import android.os.Looper;
Julia Reynolds30203152017-05-26 13:36:31 -040054import android.os.PowerManager;
Chris Wren621933f2017-06-14 15:59:03 -040055import android.os.RemoteException;
Fabian Kozynskiff5e91f2019-09-24 15:38:08 -040056import android.os.UserHandle;
Winson Chung67f5c8b2018-09-24 12:09:19 -070057import android.service.dreams.IDreamManager;
Chris Wren27a52fa2017-02-01 14:21:43 -050058import android.support.test.metricshelper.MetricsAsserts;
Chris Wren621933f2017-06-14 15:59:03 -040059import android.testing.AndroidTestingRunner;
60import android.testing.TestableLooper;
Chris Wren621933f2017-06-14 15:59:03 -040061import android.testing.TestableLooper.RunWithLooper;
Dave Mankoffbeef8f12019-10-03 19:06:55 +000062import android.util.DisplayMetrics;
Eliot Courtney09322282017-11-09 15:31:19 +090063import android.util.SparseArray;
Dave Mankoffbbc2f8f2019-10-21 12:21:29 -040064import android.view.ViewGroup;
Jason Monk51305372017-06-22 11:41:08 -040065import android.view.ViewGroup.LayoutParams;
Dave Mankoffbbc2f8f2019-10-21 12:21:29 -040066import android.widget.LinearLayout;
Adrian Roosef7a4022017-01-19 14:48:35 -080067
Brett Chabot84151d92019-02-27 15:37:59 -080068import androidx.test.filters.SmallTest;
69
Dave Mankoffbb9575f2019-10-02 12:23:49 -040070import com.android.internal.colorextraction.ColorExtractor;
Chris Wren27a52fa2017-02-01 14:21:43 -050071import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
Chris Wrenef319902017-03-07 17:58:31 -050072import com.android.internal.logging.testing.FakeMetricsLogger;
Chris Wren621933f2017-06-14 15:59:03 -040073import com.android.internal.statusbar.IStatusBarService;
Lucas Dupin3d053532019-01-29 12:35:22 -080074import com.android.keyguard.KeyguardUpdateMonitor;
Dave Mankoffbbc2f8f2019-10-21 12:21:29 -040075import com.android.keyguard.ViewMediatorCallback;
Jason Monk297c04e2018-08-23 17:16:59 -040076import com.android.systemui.Dependency;
Eliot Courtneya6d8cf22017-10-20 13:26:58 +090077import com.android.systemui.ForegroundServiceController;
Jason Monk297c04e2018-08-23 17:16:59 -040078import com.android.systemui.InitController;
Jason Monk9c4faa82017-08-15 09:32:27 -040079import com.android.systemui.R;
Adrian Roosef7a4022017-01-19 14:48:35 -080080import com.android.systemui.SysuiTestCase;
Jason Monkd97204c2018-12-21 15:49:04 -050081import com.android.systemui.UiOffloadThread;
Fabian Kozynski1f32cf02018-10-23 12:23:31 -040082import com.android.systemui.appops.AppOpsController;
Jason Monk9c4faa82017-08-15 09:32:27 -040083import com.android.systemui.assist.AssistManager;
Fabian Kozynskiff5e91f2019-09-24 15:38:08 -040084import com.android.systemui.broadcast.BroadcastDispatcher;
Mady Mellorcd9b1302018-11-06 18:08:04 -080085import com.android.systemui.bubbles.BubbleController;
Dave Mankoffbeef8f12019-10-03 19:06:55 +000086import com.android.systemui.classifier.FalsingManagerFake;
87import com.android.systemui.colorextraction.SysuiColorExtractor;
Dave Mankoffbeef8f12019-10-03 19:06:55 +000088import com.android.systemui.doze.DozeLog;
Jason Monk297c04e2018-08-23 17:16:59 -040089import com.android.systemui.keyguard.KeyguardViewMediator;
Dave Mankoffbeef8f12019-10-03 19:06:55 +000090import com.android.systemui.keyguard.ScreenLifecycle;
Adrian Roos6d5ebb72017-08-03 15:10:22 +020091import com.android.systemui.keyguard.WakefulnessLifecycle;
Jason Monk297c04e2018-08-23 17:16:59 -040092import com.android.systemui.plugins.ActivityStarter.OnDismissAction;
Beverly8fdb5332019-02-04 14:29:49 -050093import com.android.systemui.plugins.statusbar.StatusBarStateController;
Jason Monk5ecf80c2017-07-06 15:28:17 -040094import com.android.systemui.statusbar.CommandQueue;
Ned Burnsf098dbf2019-09-13 19:17:53 -040095import com.android.systemui.statusbar.FeatureFlags;
Chris Wren27a52fa2017-02-01 14:21:43 -050096import com.android.systemui.statusbar.KeyguardIndicationController;
Charles Chen10ca70b2018-11-28 00:03:38 +080097import com.android.systemui.statusbar.NavigationBarController;
Ned Burns60e94592019-09-06 14:47:25 -040098import com.android.systemui.statusbar.NotificationEntryBuilder;
Eliot Courtney3985ad52017-11-17 16:51:52 +090099import com.android.systemui.statusbar.NotificationListener;
Eliot Courtney09322282017-11-09 15:31:19 +0900100import com.android.systemui.statusbar.NotificationLockscreenUserManager;
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900101import com.android.systemui.statusbar.NotificationMediaManager;
102import com.android.systemui.statusbar.NotificationPresenter;
103import com.android.systemui.statusbar.NotificationRemoteInputManager;
Eliot Courtney2b4c3a02017-11-27 13:27:46 +0900104import com.android.systemui.statusbar.NotificationViewHierarchyManager;
Dave Mankoffbeef8f12019-10-03 19:06:55 +0000105import com.android.systemui.statusbar.PulseExpansionHandler;
Selim Cinek7c6fe5b2018-04-09 18:27:13 -0700106import com.android.systemui.statusbar.RemoteInputController;
Jason Monk297c04e2018-08-23 17:16:59 -0400107import com.android.systemui.statusbar.StatusBarState;
Beverly8fdb5332019-02-04 14:29:49 -0500108import com.android.systemui.statusbar.StatusBarStateControllerImpl;
Dave Mankoffbb9575f2019-10-02 12:23:49 -0400109import com.android.systemui.statusbar.VibratorHelper;
Dave Mankoffbeef8f12019-10-03 19:06:55 +0000110import com.android.systemui.statusbar.notification.BypassHeadsUpNotifier;
Dave Mankoffbb9575f2019-10-02 12:23:49 -0400111import com.android.systemui.statusbar.notification.DynamicPrivacyController;
Ned Burnsf098dbf2019-09-13 19:17:53 -0400112import com.android.systemui.statusbar.notification.NewNotifPipeline;
Gus Prevasb43dc652018-12-20 13:11:45 -0500113import com.android.systemui.statusbar.notification.NotificationAlertingManager;
Gus Prevas26bc59b2018-12-19 11:26:39 -0500114import com.android.systemui.statusbar.notification.NotificationEntryListener;
Jason Monk297c04e2018-08-23 17:16:59 -0400115import com.android.systemui.statusbar.notification.NotificationEntryManager;
Gus Prevasec9e1f02018-12-18 15:28:12 -0500116import com.android.systemui.statusbar.notification.NotificationFilter;
117import com.android.systemui.statusbar.notification.NotificationInterruptionStateProvider;
Dave Mankoffbeef8f12019-10-03 19:06:55 +0000118import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinator;
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900119import com.android.systemui.statusbar.notification.VisualStabilityManager;
Ned Burnsf81c4c42019-01-07 14:10:43 -0500120import com.android.systemui.statusbar.notification.collection.NotificationData;
121import com.android.systemui.statusbar.notification.collection.NotificationEntry;
Beverly85d4c192019-09-30 11:40:39 -0400122import com.android.systemui.statusbar.notification.logging.NotifLog;
Jason Monk297c04e2018-08-23 17:16:59 -0400123import com.android.systemui.statusbar.notification.logging.NotificationLogger;
124import com.android.systemui.statusbar.notification.row.NotificationGutsManager;
125import com.android.systemui.statusbar.notification.stack.NotificationListContainer;
126import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout;
Lucas Dupinbd7366d2019-09-25 13:39:21 -0700127import com.android.systemui.statusbar.policy.BatteryController;
Dave Mankoffbb9575f2019-10-02 12:23:49 -0400128import com.android.systemui.statusbar.policy.ConfigurationController;
Jason Monk9c4faa82017-08-15 09:32:27 -0400129import com.android.systemui.statusbar.policy.DeviceProvisionedController;
Lucas Dupinc8f16e82019-09-17 18:24:50 -0400130import com.android.systemui.statusbar.policy.KeyguardStateController;
Dave Mankoffbb9575f2019-10-02 12:23:49 -0400131import com.android.systemui.statusbar.policy.NetworkController;
Dave Mankoffbeef8f12019-10-03 19:06:55 +0000132import com.android.systemui.statusbar.policy.RemoteInputQuickSettingsDisabler;
jovanak5f6dc612018-03-27 11:59:22 -0700133import com.android.systemui.statusbar.policy.UserSwitcherController;
Dave Mankoffbb9575f2019-10-02 12:23:49 -0400134import com.android.systemui.statusbar.policy.ZenModeController;
135import com.android.systemui.util.InjectionInflationController;
Adrian Roosef7a4022017-01-19 14:48:35 -0800136
137import org.junit.Before;
138import org.junit.Test;
139import org.junit.runner.RunWith;
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900140import org.mockito.Mock;
141import org.mockito.MockitoAnnotations;
Adrian Roosef7a4022017-01-19 14:48:35 -0800142
Jason Monk51305372017-06-22 11:41:08 -0400143import java.io.ByteArrayOutputStream;
144import java.io.PrintWriter;
Chris Wren621933f2017-06-14 15:59:03 -0400145import java.util.ArrayList;
146
Dave Mankoffa8749962019-10-18 10:44:07 -0400147import dagger.Lazy;
148
Adrian Roos02de4982017-02-11 09:35:54 +0100149@SmallTest
Chris Wren621933f2017-06-14 15:59:03 -0400150@RunWith(AndroidTestingRunner.class)
Dave Mankofffd18b142019-09-30 16:59:55 -0400151@RunWithLooper(setAsMainLooper = true)
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500152public class StatusBarTest extends SysuiTestCase {
Dave Mankoffbb9575f2019-10-02 12:23:49 -0400153
154 private StatusBar mStatusBar;
155 private FakeMetricsLogger mMetricsLogger;
156 private PowerManager mPowerManager;
157 private TestableNotificationInterruptionStateProvider mNotificationInterruptionStateProvider;
158 private CommandQueue mCommandQueue;
159
Ned Burnsf098dbf2019-09-13 19:17:53 -0400160 @Mock private FeatureFlags mFeatureFlags;
Dave Mankoffbb9575f2019-10-02 12:23:49 -0400161 @Mock private LightBarController mLightBarController;
162 @Mock private StatusBarIconController mStatusBarIconController;
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900163 @Mock private StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
Lucas Dupinc8f16e82019-09-17 18:24:50 -0400164 @Mock private KeyguardStateController mKeyguardStateController;
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900165 @Mock private KeyguardIndicationController mKeyguardIndicationController;
166 @Mock private NotificationStackScrollLayout mStackScroller;
yoshiki iguchi4e30e762018-02-06 12:09:23 +0900167 @Mock private HeadsUpManagerPhone mHeadsUpManager;
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900168 @Mock private NotificationPanelView mNotificationPanelView;
169 @Mock private IStatusBarService mBarService;
Winson Chung67f5c8b2018-09-24 12:09:19 -0700170 @Mock private IDreamManager mDreamManager;
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900171 @Mock private ScrimController mScrimController;
Lucas Dupin988efb22018-12-04 16:53:58 -0800172 @Mock private DozeScrimController mDozeScrimController;
Ned Burnsf81c4c42019-01-07 14:10:43 -0500173 @Mock private ArrayList<NotificationEntry> mNotificationList;
Dave Mankoffbbc2f8f2019-10-21 12:21:29 -0400174 @Mock private Lazy<BiometricUnlockController> mBiometricUnlockControllerLazy;
Gilad Brettercb51b8b2018-03-22 17:04:51 +0200175 @Mock private BiometricUnlockController mBiometricUnlockController;
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900176 @Mock private NotificationData mNotificationData;
Dave Mankoffbeef8f12019-10-03 19:06:55 +0000177 @Mock private NotificationInterruptionStateProvider.HeadsUpSuppressor mHeadsUpSuppressor;
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900178 @Mock private VisualStabilityManager mVisualStabilityManager;
179 @Mock private NotificationListener mNotificationListener;
Lucas Dupin47a65c72018-02-15 14:16:18 -0800180 @Mock private KeyguardViewMediator mKeyguardViewMediator;
jovanak5f6dc612018-03-27 11:59:22 -0700181 @Mock private NotificationLockscreenUserManager mLockscreenUserManager;
Selim Cinek7c6fe5b2018-04-09 18:27:13 -0700182 @Mock private NotificationRemoteInputManager mRemoteInputManager;
183 @Mock private RemoteInputController mRemoteInputController;
Beverly8fdb5332019-02-04 14:29:49 -0500184 @Mock private StatusBarStateControllerImpl mStatusBarStateController;
Lucas Dupinbd7366d2019-09-25 13:39:21 -0700185 @Mock private BatteryController mBatteryController;
Jason Monk297c04e2018-08-23 17:16:59 -0400186 @Mock private DeviceProvisionedController mDeviceProvisionedController;
Selim Cinek5454a0d2019-07-30 17:14:50 -0700187 @Mock private StatusBarNotificationPresenter mNotificationPresenter;
Dave Mankoffbeef8f12019-10-03 19:06:55 +0000188 @Mock private NotificationEntryListener mEntryListener;
189 @Mock private NotificationFilter mNotificationFilter;
190 @Mock private NotificationAlertingManager mNotificationAlertingManager;
191 @Mock private NotificationLogger.ExpansionStateLogger mExpansionStateLogger;
192 @Mock private KeyguardUpdateMonitor mKeyguardUpdateMonitor;
193 @Mock private AmbientDisplayConfiguration mAmbientDisplayConfiguration;
194 @Mock private StatusBarWindowView mStatusBarWindowView;
195 @Mock private BroadcastDispatcher mBroadcastDispatcher;
196 @Mock private AssistManager mAssistManager;
197 @Mock private NotificationGutsManager mNotificationGutsManager;
198 @Mock private NotificationMediaManager mNotificationMediaManager;
199 @Mock private ForegroundServiceController mForegroundServiceController;
200 @Mock private AppOpsController mAppOpsController;
201 @Mock private NavigationBarController mNavigationBarController;
202 @Mock private BypassHeadsUpNotifier mBypassHeadsUpNotifier;
203 @Mock private SysuiColorExtractor mColorExtractor;
Dave Mankoffbb9575f2019-10-02 12:23:49 -0400204 @Mock private ColorExtractor.GradientColors mGradientColors;
Dave Mankoffbeef8f12019-10-03 19:06:55 +0000205 @Mock private DozeLog mDozeLog;
206 @Mock private PulseExpansionHandler mPulseExpansionHandler;
Dave Mankoffbeef8f12019-10-03 19:06:55 +0000207 @Mock private NotificationWakeUpCoordinator mNotificationWakeUpCoordinator;
208 @Mock private KeyguardBypassController mKeyguardBypassController;
Dave Mankoffbb9575f2019-10-02 12:23:49 -0400209 @Mock private InjectionInflationController mInjectionInflationController;
210 @Mock private DynamicPrivacyController mDynamicPrivacyController;
Ned Burnsf098dbf2019-09-13 19:17:53 -0400211 @Mock private NewNotifPipeline mNewNotifPipeline;
Dave Mankoffbb9575f2019-10-02 12:23:49 -0400212 @Mock private ZenModeController mZenModeController;
213 @Mock private AutoHideController mAutoHideController;
214 @Mock private NotificationViewHierarchyManager mNotificationViewHierarchyManager;
215 @Mock private UserSwitcherController mUserSwitcherController;
216 @Mock private NetworkController mNetworkController;
217 @Mock private VibratorHelper mVibratorHelper;
218 @Mock private BubbleController mBubbleController;
219 @Mock private NotificationGroupManager mGroupManager;
220 @Mock private NotificationGroupAlertTransferHelper mGroupAlertTransferHelper;
221 @Mock private StatusBarWindowController mStatusBarWindowController;
222 @Mock private NotificationIconAreaController mNotificationIconAreaController;
Dave Mankoff0cf8dfc2019-09-27 12:46:41 -0400223 @Mock private StatusBarWindowViewController.Builder mStatusBarWindowViewControllerBuilder;
224 @Mock private StatusBarWindowViewController mStatusBarWindowViewController;
Beverly85d4c192019-09-30 11:40:39 -0400225 @Mock private NotifLog mNotifLog;
Dave Mankoff2aff6c32019-10-14 17:40:37 -0400226 @Mock private DozeParameters mDozeParameters;
Dave Mankoffa8749962019-10-18 10:44:07 -0400227 @Mock private Lazy<LockscreenWallpaper> mLockscreenWallpaperLazy;
228 @Mock private LockscreenWallpaper mLockscreenWallpaper;
Dave Mankoff1193aa42019-10-28 17:51:26 -0400229 @Mock private DozeServiceHost mDozeServiceHost;
Dave Mankoffbbc2f8f2019-10-21 12:21:29 -0400230 @Mock private LinearLayout mLockIconContainer;
231 @Mock private ViewMediatorCallback mKeyguardVieMediatorCallback;
Lucas Dupin64171fe2019-10-30 14:28:29 -0700232 @Mock private KeyguardLiftController mKeyguardLiftController;
Chris Wren27a52fa2017-02-01 14:21:43 -0500233
Adrian Roos02de4982017-02-11 09:35:54 +0100234 @Before
Julia Reynolds30203152017-05-26 13:36:31 -0400235 public void setup() throws Exception {
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900236 MockitoAnnotations.initMocks(this);
Gus Prevasec9e1f02018-12-18 15:28:12 -0500237 mDependency.injectTestDependency(NotificationFilter.class, mNotificationFilter);
Dave Mankoffbbc2f8f2019-10-21 12:21:29 -0400238 mDependency.injectMockDependency(KeyguardDismissUtil.class);
Gus Prevasec9e1f02018-12-18 15:28:12 -0500239
240 IPowerManager powerManagerService = mock(IPowerManager.class);
241 mPowerManager = new PowerManager(mContext, powerManagerService,
242 Handler.createAsync(Looper.myLooper()));
243
244 mNotificationInterruptionStateProvider =
245 new TestableNotificationInterruptionStateProvider(mContext, mPowerManager,
Mady Mellorc55b4122019-06-07 18:14:02 -0700246 mDreamManager, mAmbientDisplayConfiguration, mNotificationFilter,
Lucas Dupinbd7366d2019-09-25 13:39:21 -0700247 mStatusBarStateController, mBatteryController);
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900248
Jason Monk51305372017-06-22 11:41:08 -0400249 mContext.addMockSystemService(TrustManager.class, mock(TrustManager.class));
250 mContext.addMockSystemService(FingerprintManager.class, mock(FingerprintManager.class));
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900251
Chris Wrenef319902017-03-07 17:58:31 -0500252 mMetricsLogger = new FakeMetricsLogger();
Dave Mankoffbeef8f12019-10-03 19:06:55 +0000253 TestableNotificationEntryManager entryManager = new TestableNotificationEntryManager(
Evan Laird367b6142019-08-30 14:40:34 -0400254 mNotificationData);
Dave Mankoffbeef8f12019-10-03 19:06:55 +0000255 NotificationLogger notificationLogger = new NotificationLogger(mNotificationListener,
256 Dependency.get(UiOffloadThread.class), entryManager, mStatusBarStateController,
Tony Mak202f25d2019-01-07 14:40:39 +0000257 mExpansionStateLogger);
Dave Mankoffbeef8f12019-10-03 19:06:55 +0000258 notificationLogger.setVisibilityReporter(mock(Runnable.class));
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900259
Jason Monk297c04e2018-08-23 17:16:59 -0400260 mCommandQueue = mock(CommandQueue.class);
261 when(mCommandQueue.asBinder()).thenReturn(new Binder());
262 mContext.putComponent(CommandQueue.class, mCommandQueue);
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900263
264 mContext.setTheme(R.style.Theme_SystemUI_Light);
265
266 when(mStackScroller.generateLayoutParams(any())).thenReturn(new LayoutParams(0, 0));
267 when(mNotificationPanelView.getLayoutParams()).thenReturn(new LayoutParams(0, 0));
Julia Reynolds30203152017-05-26 13:36:31 -0400268 when(powerManagerService.isInteractive()).thenReturn(true);
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900269 when(mStackScroller.getActivatedChild()).thenReturn(null);
Julia Reynolds30203152017-05-26 13:36:31 -0400270
Adrian Roosef7a4022017-01-19 14:48:35 -0800271 doAnswer(invocation -> {
272 OnDismissAction onDismissAction = (OnDismissAction) invocation.getArguments()[0];
273 onDismissAction.onDismiss();
274 return null;
275 }).when(mStatusBarKeyguardViewManager).dismissWithAction(any(), any(), anyBoolean());
276
277 doAnswer(invocation -> {
278 Runnable runnable = (Runnable) invocation.getArguments()[0];
279 runnable.run();
280 return null;
281 }).when(mStatusBarKeyguardViewManager).addAfterKeyguardGoneRunnable(any());
Chris Wren27a52fa2017-02-01 14:21:43 -0500282
Gus Prevasec9e1f02018-12-18 15:28:12 -0500283 mNotificationInterruptionStateProvider.setUpWithPresenter(mNotificationPresenter,
284 mHeadsUpManager, mHeadsUpSuppressor);
285
Selim Cinek7c6fe5b2018-04-09 18:27:13 -0700286 when(mRemoteInputManager.getController()).thenReturn(mRemoteInputController);
Dave Mankoffbb9575f2019-10-02 12:23:49 -0400287
288 WakefulnessLifecycle wakefulnessLifecycle = new WakefulnessLifecycle();
289 wakefulnessLifecycle.dispatchStartedWakingUp();
290 wakefulnessLifecycle.dispatchFinishedWakingUp();
291
292 when(mGradientColors.supportsDarkText()).thenReturn(true);
293 when(mColorExtractor.getNeutralColors()).thenReturn(mGradientColors);
294 ConfigurationController configurationController = new ConfigurationControllerImpl(mContext);
295
Dave Mankoff0cf8dfc2019-09-27 12:46:41 -0400296 when(mStatusBarWindowViewControllerBuilder.build())
297 .thenReturn(mStatusBarWindowViewController);
298
Dave Mankoffa8749962019-10-18 10:44:07 -0400299 when(mLockscreenWallpaperLazy.get()).thenReturn(mLockscreenWallpaper);
Dave Mankoffbbc2f8f2019-10-21 12:21:29 -0400300 when(mBiometricUnlockControllerLazy.get()).thenReturn(mBiometricUnlockController);
Dave Mankoffa8749962019-10-18 10:44:07 -0400301
Dave Mankoffbb9575f2019-10-02 12:23:49 -0400302 mStatusBar = new StatusBar(
Dave Mankoffa5d8a392019-10-10 12:21:09 -0400303 mContext,
Ned Burnsf098dbf2019-09-13 19:17:53 -0400304 mFeatureFlags,
Dave Mankoffbb9575f2019-10-02 12:23:49 -0400305 mLightBarController,
306 mAutoHideController,
Dave Mankoffbeef8f12019-10-03 19:06:55 +0000307 mKeyguardUpdateMonitor,
Dave Mankoffbb9575f2019-10-02 12:23:49 -0400308 mStatusBarIconController,
Dave Mankoffbeef8f12019-10-03 19:06:55 +0000309 mDozeLog,
Dave Mankoffbb9575f2019-10-02 12:23:49 -0400310 mInjectionInflationController,
Dave Mankoffbeef8f12019-10-03 19:06:55 +0000311 mPulseExpansionHandler,
Dave Mankoffbb9575f2019-10-02 12:23:49 -0400312 mNotificationWakeUpCoordinator,
313 mKeyguardBypassController,
314 mKeyguardStateController,
315 mHeadsUpManager,
316 mDynamicPrivacyController,
317 mBypassHeadsUpNotifier,
318 true,
Ned Burnsf098dbf2019-09-13 19:17:53 -0400319 () -> mNewNotifPipeline,
Dave Mankoffbb9575f2019-10-02 12:23:49 -0400320 new FalsingManagerFake(),
321 mBroadcastDispatcher,
Dave Mankoffbeef8f12019-10-03 19:06:55 +0000322 new RemoteInputQuickSettingsDisabler(
323 mContext,
Dave Mankoffbb9575f2019-10-02 12:23:49 -0400324 configurationController
Dave Mankoffbeef8f12019-10-03 19:06:55 +0000325 ),
Dave Mankoffbb9575f2019-10-02 12:23:49 -0400326 mNotificationGutsManager,
327 notificationLogger,
328 entryManager,
329 mNotificationInterruptionStateProvider,
330 mNotificationViewHierarchyManager,
331 mForegroundServiceController,
332 mAppOpsController,
333 mKeyguardViewMediator,
334 mZenModeController,
335 mNotificationAlertingManager,
336 new DisplayMetrics(),
337 mMetricsLogger,
338 Dependency.get(UiOffloadThread.class),
339 mNotificationMediaManager,
340 mLockscreenUserManager,
341 mRemoteInputManager,
342 mUserSwitcherController,
343 mNetworkController,
344 mBatteryController,
345 mColorExtractor,
346 new ScreenLifecycle(),
347 wakefulnessLifecycle,
348 mStatusBarStateController,
349 mVibratorHelper,
350 mBubbleController,
351 mGroupManager,
352 mGroupAlertTransferHelper,
353 mVisualStabilityManager,
354 mDeviceProvisionedController,
355 mNavigationBarController,
356 mAssistManager,
357 mNotificationListener,
358 configurationController,
Dave Mankoff0cf8dfc2019-09-27 12:46:41 -0400359 mStatusBarWindowController,
Beverly85d4c192019-09-30 11:40:39 -0400360 mStatusBarWindowViewControllerBuilder,
Dave Mankoff2aff6c32019-10-14 17:40:37 -0400361 mNotifLog,
Dave Mankoffa8749962019-10-18 10:44:07 -0400362 mDozeParameters,
363 mScrimController,
Lucas Dupin64171fe2019-10-30 14:28:29 -0700364 mKeyguardLiftController,
Dave Mankoffbbc2f8f2019-10-21 12:21:29 -0400365 mLockscreenWallpaperLazy,
Dave Mankoff1193aa42019-10-28 17:51:26 -0400366 mBiometricUnlockControllerLazy,
367 mDozeServiceHost,
368 mPowerManager,
369 mDozeScrimController);
Dave Mankoffbbc2f8f2019-10-21 12:21:29 -0400370
371 when(mStatusBarWindowView.findViewById(R.id.lock_icon_container)).thenReturn(
372 mLockIconContainer);
373
374 when(mKeyguardViewMediator.registerStatusBar(any(StatusBar.class), any(ViewGroup.class),
375 any(NotificationPanelView.class), any(BiometricUnlockController.class),
376 any(ViewGroup.class), any(ViewGroup.class), any(KeyguardBypassController.class)))
377 .thenReturn(mStatusBarKeyguardViewManager);
378
379 when(mKeyguardViewMediator.getViewMediatorCallback()).thenReturn(
380 mKeyguardVieMediatorCallback);
381
Dave Mankoffbb9575f2019-10-02 12:23:49 -0400382 // TODO: we should be able to call mStatusBar.start() and have all the below values
383 // initialized automatically.
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900384 mStatusBar.mComponents = mContext.getComponents();
Dave Mankoffbb9575f2019-10-02 12:23:49 -0400385 mStatusBar.mStatusBarWindow = mStatusBarWindowView;
Dave Mankoffbb9575f2019-10-02 12:23:49 -0400386 mStatusBar.mNotificationPanel = mNotificationPanelView;
387 mStatusBar.mCommandQueue = mCommandQueue;
388 mStatusBar.mDozeScrimController = mDozeScrimController;
389 mStatusBar.mNotificationIconAreaController = mNotificationIconAreaController;
390 mStatusBar.mPresenter = mNotificationPresenter;
391 mStatusBar.mKeyguardIndicationController = mKeyguardIndicationController;
Dave Mankoffbb9575f2019-10-02 12:23:49 -0400392 mStatusBar.mBarService = mBarService;
393 mStatusBar.mStackScroller = mStackScroller;
Dave Mankoff0cf8dfc2019-09-27 12:46:41 -0400394 mStatusBar.mStatusBarWindowViewController = mStatusBarWindowViewController;
Dave Mankoffbbc2f8f2019-10-21 12:21:29 -0400395 mStatusBar.startKeyguard();
Jason Monk297c04e2018-08-23 17:16:59 -0400396 mStatusBar.putComponent(StatusBar.class, mStatusBar);
397 Dependency.get(InitController.class).executePostInitTasks();
Dave Mankoffbeef8f12019-10-03 19:06:55 +0000398 entryManager.setUpForTest(mock(NotificationPresenter.class), mStackScroller,
Evan Laird367b6142019-08-30 14:40:34 -0400399 mHeadsUpManager);
Dave Mankoffbeef8f12019-10-03 19:06:55 +0000400 entryManager.addNotificationEntryListener(mEntryListener);
401 notificationLogger.setUpWithContainer(mStackScroller);
Adrian Roosef7a4022017-01-19 14:48:35 -0800402 }
403
Adrian Roos02de4982017-02-11 09:35:54 +0100404 @Test
Jason Monk5ecf80c2017-07-06 15:28:17 -0400405 public void testSetBouncerShowing_noCrash() {
406 mStatusBar.mCommandQueue = mock(CommandQueue.class);
407 mStatusBar.setBouncerShowing(true);
408 }
409
410 @Test
Adrian Roosef7a4022017-01-19 14:48:35 -0800411 public void executeRunnableDismissingKeyguard_nullRunnable_showingAndOccluded() {
412 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
413 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(true);
414
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500415 mStatusBar.executeRunnableDismissingKeyguard(null, null, false, false, false);
Adrian Roosef7a4022017-01-19 14:48:35 -0800416 }
417
Adrian Roos02de4982017-02-11 09:35:54 +0100418 @Test
Adrian Roosef7a4022017-01-19 14:48:35 -0800419 public void executeRunnableDismissingKeyguard_nullRunnable_showing() {
420 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
421 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
422
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500423 mStatusBar.executeRunnableDismissingKeyguard(null, null, false, false, false);
Adrian Roosef7a4022017-01-19 14:48:35 -0800424 }
425
Adrian Roos02de4982017-02-11 09:35:54 +0100426 @Test
Adrian Roosef7a4022017-01-19 14:48:35 -0800427 public void executeRunnableDismissingKeyguard_nullRunnable_notShowing() {
428 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(false);
429 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
430
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500431 mStatusBar.executeRunnableDismissingKeyguard(null, null, false, false, false);
Adrian Roosef7a4022017-01-19 14:48:35 -0800432 }
433
Adrian Roos02de4982017-02-11 09:35:54 +0100434 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500435 public void lockscreenStateMetrics_notShowing() {
436 // uninteresting state, except that fingerprint must be non-zero
437 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
Lucas Dupinc8f16e82019-09-17 18:24:50 -0400438 when(mKeyguardStateController.canDismissLockScreen()).thenReturn(true);
Chris Wren27a52fa2017-02-01 14:21:43 -0500439 // interesting state
440 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(false);
441 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false);
Lucas Dupinc8f16e82019-09-17 18:24:50 -0400442 when(mKeyguardStateController.isMethodSecure()).thenReturn(false);
Chris Wren27a52fa2017-02-01 14:21:43 -0500443 mStatusBar.onKeyguardViewManagerStatesUpdated();
444
Chris Wrenef319902017-03-07 17:58:31 -0500445 MetricsAsserts.assertHasLog("missing hidden insecure lockscreen log",
446 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500447 new LogMaker(MetricsEvent.LOCKSCREEN)
448 .setType(MetricsEvent.TYPE_CLOSE)
449 .setSubtype(0));
450 }
451
Adrian Roos02de4982017-02-11 09:35:54 +0100452 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500453 public void lockscreenStateMetrics_notShowing_secure() {
454 // uninteresting state, except that fingerprint must be non-zero
455 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
Lucas Dupinc8f16e82019-09-17 18:24:50 -0400456 when(mKeyguardStateController.canDismissLockScreen()).thenReturn(true);
Chris Wren27a52fa2017-02-01 14:21:43 -0500457 // interesting state
458 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(false);
459 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false);
Lucas Dupinc8f16e82019-09-17 18:24:50 -0400460 when(mKeyguardStateController.isMethodSecure()).thenReturn(true);
Chris Wren27a52fa2017-02-01 14:21:43 -0500461
462 mStatusBar.onKeyguardViewManagerStatesUpdated();
463
Chris Wrenef319902017-03-07 17:58:31 -0500464 MetricsAsserts.assertHasLog("missing hidden secure lockscreen log",
465 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500466 new LogMaker(MetricsEvent.LOCKSCREEN)
467 .setType(MetricsEvent.TYPE_CLOSE)
468 .setSubtype(1));
469 }
470
Adrian Roos02de4982017-02-11 09:35:54 +0100471 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500472 public void lockscreenStateMetrics_isShowing() {
473 // uninteresting state, except that fingerprint must be non-zero
474 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
Lucas Dupinc8f16e82019-09-17 18:24:50 -0400475 when(mKeyguardStateController.canDismissLockScreen()).thenReturn(true);
Chris Wren27a52fa2017-02-01 14:21:43 -0500476 // interesting state
477 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
478 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false);
Lucas Dupinc8f16e82019-09-17 18:24:50 -0400479 when(mKeyguardStateController.isMethodSecure()).thenReturn(false);
Chris Wren27a52fa2017-02-01 14:21:43 -0500480
481 mStatusBar.onKeyguardViewManagerStatesUpdated();
482
Chris Wrenef319902017-03-07 17:58:31 -0500483 MetricsAsserts.assertHasLog("missing insecure lockscreen showing",
484 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500485 new LogMaker(MetricsEvent.LOCKSCREEN)
486 .setType(MetricsEvent.TYPE_OPEN)
487 .setSubtype(0));
488 }
489
Adrian Roos02de4982017-02-11 09:35:54 +0100490 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500491 public void lockscreenStateMetrics_isShowing_secure() {
492 // uninteresting state, except that fingerprint must be non-zero
493 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
Lucas Dupinc8f16e82019-09-17 18:24:50 -0400494 when(mKeyguardStateController.canDismissLockScreen()).thenReturn(true);
Chris Wren27a52fa2017-02-01 14:21:43 -0500495 // interesting state
496 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
497 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false);
Lucas Dupinc8f16e82019-09-17 18:24:50 -0400498 when(mKeyguardStateController.isMethodSecure()).thenReturn(true);
Chris Wren27a52fa2017-02-01 14:21:43 -0500499
500 mStatusBar.onKeyguardViewManagerStatesUpdated();
501
Chris Wrenef319902017-03-07 17:58:31 -0500502 MetricsAsserts.assertHasLog("missing secure lockscreen showing log",
503 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500504 new LogMaker(MetricsEvent.LOCKSCREEN)
505 .setType(MetricsEvent.TYPE_OPEN)
506 .setSubtype(1));
507 }
508
Adrian Roos02de4982017-02-11 09:35:54 +0100509 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500510 public void lockscreenStateMetrics_isShowingBouncer() {
511 // uninteresting state, except that fingerprint must be non-zero
512 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
Lucas Dupinc8f16e82019-09-17 18:24:50 -0400513 when(mKeyguardStateController.canDismissLockScreen()).thenReturn(true);
Chris Wren27a52fa2017-02-01 14:21:43 -0500514 // interesting state
515 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
516 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(true);
Lucas Dupinc8f16e82019-09-17 18:24:50 -0400517 when(mKeyguardStateController.isMethodSecure()).thenReturn(true);
Chris Wren27a52fa2017-02-01 14:21:43 -0500518
519 mStatusBar.onKeyguardViewManagerStatesUpdated();
520
Chris Wrenef319902017-03-07 17:58:31 -0500521 MetricsAsserts.assertHasLog("missing bouncer log",
522 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500523 new LogMaker(MetricsEvent.BOUNCER)
524 .setType(MetricsEvent.TYPE_OPEN)
525 .setSubtype(1));
526 }
527
Adrian Roos02de4982017-02-11 09:35:54 +0100528 @Test
Winson Chung67f5c8b2018-09-24 12:09:19 -0700529 public void testShouldHeadsUp_nonSuppressedGroupSummary() throws Exception {
Julia Reynolds30203152017-05-26 13:36:31 -0400530 when(mPowerManager.isScreenOn()).thenReturn(true);
531 when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false);
Gus Prevasec9e1f02018-12-18 15:28:12 -0500532 when(mNotificationFilter.shouldFilterOut(any())).thenReturn(false);
Winson Chung67f5c8b2018-09-24 12:09:19 -0700533 when(mDreamManager.isDreaming()).thenReturn(false);
Gus Prevasec9e1f02018-12-18 15:28:12 -0500534 when(mHeadsUpSuppressor.canHeadsUp(any(), any())).thenReturn(true);
Julia Reynolds30203152017-05-26 13:36:31 -0400535
536 Notification n = new Notification.Builder(getContext(), "a")
537 .setGroup("a")
538 .setGroupSummary(true)
539 .setGroupAlertBehavior(Notification.GROUP_ALERT_SUMMARY)
540 .build();
Ned Burns60e94592019-09-06 14:47:25 -0400541
542 NotificationEntry entry = new NotificationEntryBuilder()
543 .setPkg("a")
544 .setOpPkg("a")
545 .setTag("a")
546 .setNotification(n)
547 .setImportance(IMPORTANCE_HIGH)
548 .build();
Julia Reynolds30203152017-05-26 13:36:31 -0400549
Gus Prevasec9e1f02018-12-18 15:28:12 -0500550 assertTrue(mNotificationInterruptionStateProvider.shouldHeadsUp(entry));
Julia Reynolds30203152017-05-26 13:36:31 -0400551 }
552
553 @Test
Winson Chung67f5c8b2018-09-24 12:09:19 -0700554 public void testShouldHeadsUp_suppressedGroupSummary() throws Exception {
Julia Reynolds30203152017-05-26 13:36:31 -0400555 when(mPowerManager.isScreenOn()).thenReturn(true);
556 when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false);
Gus Prevasec9e1f02018-12-18 15:28:12 -0500557 when(mNotificationFilter.shouldFilterOut(any())).thenReturn(false);
Winson Chung67f5c8b2018-09-24 12:09:19 -0700558 when(mDreamManager.isDreaming()).thenReturn(false);
Gus Prevasec9e1f02018-12-18 15:28:12 -0500559 when(mHeadsUpSuppressor.canHeadsUp(any(), any())).thenReturn(true);
Julia Reynolds30203152017-05-26 13:36:31 -0400560
561 Notification n = new Notification.Builder(getContext(), "a")
562 .setGroup("a")
563 .setGroupSummary(true)
564 .setGroupAlertBehavior(Notification.GROUP_ALERT_CHILDREN)
565 .build();
Ned Burns60e94592019-09-06 14:47:25 -0400566
567 NotificationEntry entry = new NotificationEntryBuilder()
568 .setPkg("a")
569 .setOpPkg("a")
570 .setTag("a")
571 .setNotification(n)
572 .setImportance(IMPORTANCE_HIGH)
573 .build();
Julia Reynolds30203152017-05-26 13:36:31 -0400574
Gus Prevasec9e1f02018-12-18 15:28:12 -0500575 assertFalse(mNotificationInterruptionStateProvider.shouldHeadsUp(entry));
Julia Reynolds30203152017-05-26 13:36:31 -0400576 }
577
Chris Wren621933f2017-06-14 15:59:03 -0400578 @Test
Winson Chung67f5c8b2018-09-24 12:09:19 -0700579 public void testShouldHeadsUp_suppressedHeadsUp() throws Exception {
Beverly38159ce2017-07-13 16:39:24 -0400580 when(mPowerManager.isScreenOn()).thenReturn(true);
581 when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false);
Gus Prevasec9e1f02018-12-18 15:28:12 -0500582 when(mNotificationFilter.shouldFilterOut(any())).thenReturn(false);
Winson Chung67f5c8b2018-09-24 12:09:19 -0700583 when(mDreamManager.isDreaming()).thenReturn(false);
Gus Prevasec9e1f02018-12-18 15:28:12 -0500584 when(mHeadsUpSuppressor.canHeadsUp(any(), any())).thenReturn(true);
Julia Reynolds24653c32018-03-02 13:16:37 -0500585
586 Notification n = new Notification.Builder(getContext(), "a").build();
Ned Burns60e94592019-09-06 14:47:25 -0400587
588 NotificationEntry entry = new NotificationEntryBuilder()
589 .setPkg("a")
590 .setOpPkg("a")
591 .setTag("a")
592 .setNotification(n)
593 .setImportance(IMPORTANCE_HIGH)
Ned Burns47c98f12019-09-06 17:12:07 -0400594 .setSuppressedVisualEffects(SUPPRESSED_EFFECT_PEEK)
Ned Burns60e94592019-09-06 14:47:25 -0400595 .build();
596
Gus Prevasec9e1f02018-12-18 15:28:12 -0500597 assertFalse(mNotificationInterruptionStateProvider.shouldHeadsUp(entry));
Julia Reynolds24653c32018-03-02 13:16:37 -0500598 }
599
600 @Test
Winson Chung67f5c8b2018-09-24 12:09:19 -0700601 public void testShouldHeadsUp_noSuppressedHeadsUp() throws Exception {
Julia Reynolds24653c32018-03-02 13:16:37 -0500602 when(mPowerManager.isScreenOn()).thenReturn(true);
603 when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false);
Gus Prevasec9e1f02018-12-18 15:28:12 -0500604 when(mNotificationFilter.shouldFilterOut(any())).thenReturn(false);
Winson Chung67f5c8b2018-09-24 12:09:19 -0700605 when(mDreamManager.isDreaming()).thenReturn(false);
Gus Prevasec9e1f02018-12-18 15:28:12 -0500606 when(mHeadsUpSuppressor.canHeadsUp(any(), any())).thenReturn(true);
Beverly38159ce2017-07-13 16:39:24 -0400607
608 Notification n = new Notification.Builder(getContext(), "a").build();
Ned Burns60e94592019-09-06 14:47:25 -0400609
610 NotificationEntry entry = new NotificationEntryBuilder()
611 .setPkg("a")
612 .setOpPkg("a")
613 .setTag("a")
614 .setNotification(n)
615 .setImportance(IMPORTANCE_HIGH)
616 .build();
Beverly38159ce2017-07-13 16:39:24 -0400617
Gus Prevasec9e1f02018-12-18 15:28:12 -0500618 assertTrue(mNotificationInterruptionStateProvider.shouldHeadsUp(entry));
Beverly38159ce2017-07-13 16:39:24 -0400619 }
620
621 @Test
Chris Wren621933f2017-06-14 15:59:03 -0400622 public void testLogHidden() {
623 try {
624 mStatusBar.handleVisibleToUserChanged(false);
Selim Cinek1a891a92017-12-04 17:41:27 +0100625 waitForUiOffloadThread();
Chris Wren621933f2017-06-14 15:59:03 -0400626 verify(mBarService, times(1)).onPanelHidden();
627 verify(mBarService, never()).onPanelRevealed(anyBoolean(), anyInt());
628 } catch (RemoteException e) {
629 fail();
630 }
631 }
632
633 @Test
Kevina97ea052018-09-11 13:53:18 -0700634 public void testPanelOpenForHeadsUp() {
Jason Monk297c04e2018-08-23 17:16:59 -0400635 when(mDeviceProvisionedController.isDeviceProvisioned()).thenReturn(true);
Chris Wren621933f2017-06-14 15:59:03 -0400636 when(mHeadsUpManager.hasPinnedHeadsUp()).thenReturn(true);
637 when(mNotificationData.getActiveNotifications()).thenReturn(mNotificationList);
638 when(mNotificationList.size()).thenReturn(5);
Jason Monk297c04e2018-08-23 17:16:59 -0400639 when(mNotificationPresenter.isPresenterFullyCollapsed()).thenReturn(true);
Chris Wren621933f2017-06-14 15:59:03 -0400640 mStatusBar.setBarStateForTest(StatusBarState.SHADE);
641
642 try {
643 mStatusBar.handleVisibleToUserChanged(true);
Selim Cinek1a891a92017-12-04 17:41:27 +0100644 waitForUiOffloadThread();
Chris Wren621933f2017-06-14 15:59:03 -0400645 verify(mBarService, never()).onPanelHidden();
646 verify(mBarService, times(1)).onPanelRevealed(false, 1);
647 } catch (RemoteException e) {
648 fail();
649 }
650 TestableLooper.get(this).processAllMessages();
651 }
652
653 @Test
654 public void testPanelOpenAndClear() {
655 when(mHeadsUpManager.hasPinnedHeadsUp()).thenReturn(false);
656 when(mNotificationData.getActiveNotifications()).thenReturn(mNotificationList);
657 when(mNotificationList.size()).thenReturn(5);
Jason Monk297c04e2018-08-23 17:16:59 -0400658 when(mNotificationPresenter.isPresenterFullyCollapsed()).thenReturn(false);
Chris Wren621933f2017-06-14 15:59:03 -0400659 mStatusBar.setBarStateForTest(StatusBarState.SHADE);
660
661 try {
662 mStatusBar.handleVisibleToUserChanged(true);
Selim Cinek1a891a92017-12-04 17:41:27 +0100663 waitForUiOffloadThread();
Chris Wren621933f2017-06-14 15:59:03 -0400664 verify(mBarService, never()).onPanelHidden();
665 verify(mBarService, times(1)).onPanelRevealed(true, 5);
666 } catch (RemoteException e) {
667 fail();
668 }
669 TestableLooper.get(this).processAllMessages();
670 }
671
672 @Test
673 public void testPanelOpenAndNoClear() {
674 when(mHeadsUpManager.hasPinnedHeadsUp()).thenReturn(false);
675 when(mNotificationData.getActiveNotifications()).thenReturn(mNotificationList);
676 when(mNotificationList.size()).thenReturn(5);
Jason Monk297c04e2018-08-23 17:16:59 -0400677 when(mNotificationPresenter.isPresenterFullyCollapsed()).thenReturn(false);
Chris Wren621933f2017-06-14 15:59:03 -0400678 mStatusBar.setBarStateForTest(StatusBarState.KEYGUARD);
679
680 try {
681 mStatusBar.handleVisibleToUserChanged(true);
Selim Cinek1a891a92017-12-04 17:41:27 +0100682 waitForUiOffloadThread();
Chris Wren621933f2017-06-14 15:59:03 -0400683 verify(mBarService, never()).onPanelHidden();
684 verify(mBarService, times(1)).onPanelRevealed(false, 5);
685 } catch (RemoteException e) {
686 fail();
687 }
688 TestableLooper.get(this).processAllMessages();
689 }
690
Jason Monk51305372017-06-22 11:41:08 -0400691 @Test
Charles He2eda2422017-09-24 17:55:21 +0100692 public void testDisableExpandStatusBar() {
693 mStatusBar.setBarStateForTest(StatusBarState.SHADE);
694 mStatusBar.setUserSetupForTest(true);
Jason Monk297c04e2018-08-23 17:16:59 -0400695 when(mDeviceProvisionedController.isDeviceProvisioned()).thenReturn(true);
Charles He2eda2422017-09-24 17:55:21 +0100696
Jason Monk297c04e2018-08-23 17:16:59 -0400697 when(mCommandQueue.panelsEnabled()).thenReturn(false);
Charles Chenf3d295c2018-11-30 18:15:21 +0800698 mStatusBar.disable(DEFAULT_DISPLAY, StatusBarManager.DISABLE_NONE,
Charles He2eda2422017-09-24 17:55:21 +0100699 StatusBarManager.DISABLE2_NOTIFICATION_SHADE, false);
700 verify(mNotificationPanelView).setQsExpansionEnabled(false);
701 mStatusBar.animateExpandNotificationsPanel();
702 verify(mNotificationPanelView, never()).expand(anyBoolean());
703 mStatusBar.animateExpandSettingsPanel(null);
704 verify(mNotificationPanelView, never()).expand(anyBoolean());
705
Jason Monk297c04e2018-08-23 17:16:59 -0400706 when(mCommandQueue.panelsEnabled()).thenReturn(true);
Charles Chenf3d295c2018-11-30 18:15:21 +0800707 mStatusBar.disable(DEFAULT_DISPLAY, StatusBarManager.DISABLE_NONE,
708 StatusBarManager.DISABLE2_NONE, false);
Charles He2eda2422017-09-24 17:55:21 +0100709 verify(mNotificationPanelView).setQsExpansionEnabled(true);
710 mStatusBar.animateExpandNotificationsPanel();
Eugene Susla2de69552018-03-20 13:22:17 -0700711 verify(mNotificationPanelView).expandWithoutQs();
Charles He2eda2422017-09-24 17:55:21 +0100712 mStatusBar.animateExpandSettingsPanel(null);
Eugene Susla2de69552018-03-20 13:22:17 -0700713 verify(mNotificationPanelView).expandWithQs();
Charles He2eda2422017-09-24 17:55:21 +0100714 }
715
716 @Test
Jason Monk51305372017-06-22 11:41:08 -0400717 public void testDump_DoesNotCrash() {
718 mStatusBar.dump(null, new PrintWriter(new ByteArrayOutputStream()), null);
719 }
720
Jason Monk9c4faa82017-08-15 09:32:27 -0400721 @Test
722 @RunWithLooper(setAsMainLooper = true)
723 public void testUpdateKeyguardState_DoesNotCrash() {
Dave Mankoffbb9575f2019-10-02 12:23:49 -0400724 mStatusBar.setBarStateForTest(StatusBarState.KEYGUARD);
725 when(mLockscreenUserManager.getCurrentProfiles()).thenReturn(
Eliot Courtney09322282017-11-09 15:31:19 +0900726 new SparseArray<>());
Jason Monk1fd3fc32018-08-14 17:20:09 -0400727 mStatusBar.onStateChanged(StatusBarState.SHADE);
Jason Monk9c4faa82017-08-15 09:32:27 -0400728 }
729
Lucas Dupinc2e75462017-12-06 13:59:25 -0800730 @Test
731 public void testFingerprintNotification_UpdatesScrims() {
Gilad Brettercb51b8b2018-03-22 17:04:51 +0200732 mStatusBar.notifyBiometricAuthModeChanged();
Lucas Dupinc2e75462017-12-06 13:59:25 -0800733 verify(mScrimController).transitionTo(any(), any());
734 }
735
Lucas Dupin311eac82017-12-11 14:40:07 -0800736 @Test
737 public void testFingerprintUnlock_UpdatesScrims() {
738 // Simulate unlocking from AoD with fingerprint.
Gilad Brettercb51b8b2018-03-22 17:04:51 +0200739 when(mBiometricUnlockController.getMode())
740 .thenReturn(BiometricUnlockController.MODE_WAKE_AND_UNLOCK);
Lucas Dupin311eac82017-12-11 14:40:07 -0800741 mStatusBar.updateScrimController();
742 verify(mScrimController).transitionTo(eq(ScrimState.UNLOCKED), any());
743 }
744
Lucas Dupind5107302018-03-19 15:30:29 -0700745 @Test
746 public void testSetOccluded_propagatesToScrimController() {
747 mStatusBar.setOccluded(true);
748 verify(mScrimController).setKeyguardOccluded(eq(true));
749
750 reset(mScrimController);
751 mStatusBar.setOccluded(false);
752 verify(mScrimController).setKeyguardOccluded(eq(false));
753 }
754
Julia Reynoldsed1c9af2018-03-21 15:21:09 -0400755 @Test
Lucas Dupin988efb22018-12-04 16:53:58 -0800756 public void testPulseWhileDozing_updatesScrimController() {
757 mStatusBar.setBarStateForTest(StatusBarState.KEYGUARD);
758 mStatusBar.showKeyguardImpl();
Julia Reynoldsed1c9af2018-03-21 15:21:09 -0400759
Lucas Dupin988efb22018-12-04 16:53:58 -0800760 // Starting a pulse should change the scrim controller to the pulsing state
Dave Mankoff1193aa42019-10-28 17:51:26 -0400761 when(mDozeServiceHost.isPulsing()).thenReturn(true);
762 mStatusBar.updateScrimController();
Lucas Dupin988efb22018-12-04 16:53:58 -0800763 verify(mScrimController).transitionTo(eq(ScrimState.PULSING), any());
764
765 // Ending a pulse should take it back to keyguard state
Dave Mankoff1193aa42019-10-28 17:51:26 -0400766 when(mDozeServiceHost.isPulsing()).thenReturn(false);
767 mStatusBar.updateScrimController();
Lucas Dupin988efb22018-12-04 16:53:58 -0800768 verify(mScrimController).transitionTo(eq(ScrimState.KEYGUARD));
769 }
770
771 @Test
jovanak5f6dc612018-03-27 11:59:22 -0700772 public void testSetState_changesIsFullScreenUserSwitcherState() {
773 mStatusBar.setBarStateForTest(StatusBarState.KEYGUARD);
774 assertFalse(mStatusBar.isFullScreenUserSwitcherState());
775
776 mStatusBar.setBarStateForTest(StatusBarState.FULLSCREEN_USER_SWITCHER);
777 assertTrue(mStatusBar.isFullScreenUserSwitcherState());
778 }
779
780 @Test
781 public void testShowKeyguardImplementation_setsState() {
782 when(mLockscreenUserManager.getCurrentProfiles()).thenReturn(new SparseArray<>());
783
784 mStatusBar.setBarStateForTest(StatusBarState.SHADE);
785
786 // By default, showKeyguardImpl sets state to KEYGUARD.
787 mStatusBar.showKeyguardImpl();
Jason Monk1fd3fc32018-08-14 17:20:09 -0400788 verify(mStatusBarStateController).setState(eq(StatusBarState.KEYGUARD));
jovanak5f6dc612018-03-27 11:59:22 -0700789
790 // If useFullscreenUserSwitcher is true, state is set to FULLSCREEN_USER_SWITCHER.
Dave Mankoffbb9575f2019-10-02 12:23:49 -0400791 when(mUserSwitcherController.useFullscreenUserSwitcher()).thenReturn(true);
jovanak5f6dc612018-03-27 11:59:22 -0700792 mStatusBar.showKeyguardImpl();
Jason Monk1fd3fc32018-08-14 17:20:09 -0400793 verify(mStatusBarStateController).setState(eq(StatusBarState.FULLSCREEN_USER_SWITCHER));
jovanak5f6dc612018-03-27 11:59:22 -0700794 }
795
Lucas Dupin29a07ec2018-11-13 16:56:49 -0800796 @Test
Lucas Dupin29a07ec2018-11-13 16:56:49 -0800797 public void testOnStartedWakingUp_isNotDozing() {
798 mStatusBar.setBarStateForTest(StatusBarState.KEYGUARD);
799 when(mStatusBarStateController.isKeyguardRequested()).thenReturn(true);
Dave Mankoff1193aa42019-10-28 17:51:26 -0400800 when(mDozeServiceHost.getDozingRequested()).thenReturn(true);
801 mStatusBar.updateIsKeyguard();
802 // TODO: mNotificationPanelView.expand(false) gets called twice. Should be once.
803 verify(mNotificationPanelView, times(2)).expand(eq(false));
Lucas Dupin3cfd6882019-03-19 15:22:03 -0700804 clearInvocations(mNotificationPanelView);
Lucas Dupin29a07ec2018-11-13 16:56:49 -0800805
806 mStatusBar.mWakefulnessObserver.onStartedWakingUp();
Dave Mankoff1193aa42019-10-28 17:51:26 -0400807 verify(mDozeServiceHost).stopDozing();
Lucas Dupin3cfd6882019-03-19 15:22:03 -0700808 verify(mNotificationPanelView).expand(eq(false));
809 }
810
811 @Test
812 public void testOnStartedWakingUp_doesNotDismissBouncer_whenPulsing() {
813 mStatusBar.setBarStateForTest(StatusBarState.KEYGUARD);
814 when(mStatusBarStateController.isKeyguardRequested()).thenReturn(true);
Dave Mankoff1193aa42019-10-28 17:51:26 -0400815 when(mDozeServiceHost.getDozingRequested()).thenReturn(true);
816 mStatusBar.updateIsKeyguard();
Lucas Dupin3cfd6882019-03-19 15:22:03 -0700817 clearInvocations(mNotificationPanelView);
818
819 mStatusBar.setBouncerShowing(true);
820 mStatusBar.mWakefulnessObserver.onStartedWakingUp();
821 verify(mNotificationPanelView, never()).expand(anyBoolean());
Lucas Dupin29a07ec2018-11-13 16:56:49 -0800822 }
823
Fabian Kozynskiff5e91f2019-09-24 15:38:08 -0400824 @Test
825 public void testRegisterBroadcastsonDispatcher() {
826 mStatusBar.registerBroadcastReceiver();
827 verify(mBroadcastDispatcher).registerReceiver(
828 any(BroadcastReceiver.class),
829 any(IntentFilter.class),
830 eq(null),
831 any(UserHandle.class));
832 }
833
Jason Monke59dc402018-08-16 12:05:01 -0400834 public static class TestableNotificationEntryManager extends NotificationEntryManager {
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900835
Evan Laird367b6142019-08-30 14:40:34 -0400836 public TestableNotificationEntryManager(NotificationData notificationData) {
Beverly85d4c192019-09-30 11:40:39 -0400837 super(notificationData, mock(NotifLog.class));
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900838 }
839
840 public void setUpForTest(NotificationPresenter presenter,
Eliot Courtney2b4c3a02017-11-27 13:27:46 +0900841 NotificationListContainer listContainer,
Evan Laird367b6142019-08-30 14:40:34 -0400842 HeadsUpManagerPhone headsUpManager) {
Gus Prevas8621bd22018-12-20 15:04:25 -0500843 super.setUpWithPresenter(presenter, listContainer, headsUpManager);
Gus Prevasec9e1f02018-12-18 15:28:12 -0500844 }
845 }
846
847 public static class TestableNotificationInterruptionStateProvider extends
848 NotificationInterruptionStateProvider {
849
Dave Mankoffbb9575f2019-10-02 12:23:49 -0400850 TestableNotificationInterruptionStateProvider(
Gus Prevasec9e1f02018-12-18 15:28:12 -0500851 Context context,
852 PowerManager powerManager,
Lucas Dupin2c3992b2019-03-11 16:34:08 -0700853 IDreamManager dreamManager,
Mady Mellorc55b4122019-06-07 18:14:02 -0700854 AmbientDisplayConfiguration ambientDisplayConfiguration,
855 NotificationFilter filter,
Lucas Dupinbd7366d2019-09-25 13:39:21 -0700856 StatusBarStateController controller,
857 BatteryController batteryController) {
Mady Mellorc55b4122019-06-07 18:14:02 -0700858 super(context, powerManager, dreamManager, ambientDisplayConfiguration, filter,
Lucas Dupinbd7366d2019-09-25 13:39:21 -0700859 batteryController, controller);
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900860 mUseHeadsUp = true;
861 }
Adrian Roosef7a4022017-01-19 14:48:35 -0800862 }
Eliot Courtney09322282017-11-09 15:31:19 +0900863}