blob: b31a2dc1af04ea54452be64f398b45a9b4235603 [file] [log] [blame]
Adrian Roosef7a4022017-01-19 14:48:35 -08001/*
2 * Copyright (C) 2017 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.systemui.statusbar.phone;
18
Julia Reynolds30203152017-05-26 13:36:31 -040019import static android.app.NotificationManager.IMPORTANCE_HIGH;
20
Julia Reynoldsed1c9af2018-03-21 15:21:09 -040021import static junit.framework.Assert.assertEquals;
Julia Reynolds30203152017-05-26 13:36:31 -040022import static junit.framework.Assert.assertFalse;
Julia Reynoldsed1c9af2018-03-21 15:21:09 -040023import static junit.framework.Assert.assertNotNull;
Julia Reynolds30203152017-05-26 13:36:31 -040024import static junit.framework.Assert.assertTrue;
Chris Wren621933f2017-06-14 15:59:03 -040025import static junit.framework.TestCase.fail;
Julia Reynolds30203152017-05-26 13:36:31 -040026
Chris Wren621933f2017-06-14 15:59:03 -040027import static org.mockito.ArgumentMatchers.any;
28import static org.mockito.ArgumentMatchers.anyBoolean;
29import static org.mockito.ArgumentMatchers.anyInt;
30import static org.mockito.ArgumentMatchers.anyString;
Lucas Dupin311eac82017-12-11 14:40:07 -080031import static org.mockito.ArgumentMatchers.eq;
Adrian Roosef7a4022017-01-19 14:48:35 -080032import static org.mockito.Mockito.doAnswer;
33import static org.mockito.Mockito.mock;
Chris Wren621933f2017-06-14 15:59:03 -040034import static org.mockito.Mockito.never;
Lucas Dupind5107302018-03-19 15:30:29 -070035import static org.mockito.Mockito.reset;
Chris Wren621933f2017-06-14 15:59:03 -040036import static org.mockito.Mockito.times;
Chris Wren621933f2017-06-14 15:59:03 -040037import static org.mockito.Mockito.verify;
Jason Monk9c4faa82017-08-15 09:32:27 -040038import static org.mockito.Mockito.when;
Adrian Roosef7a4022017-01-19 14:48:35 -080039
Julia Reynolds30203152017-05-26 13:36:31 -040040import android.app.Notification;
Charles He2eda2422017-09-24 17:55:21 +010041import android.app.StatusBarManager;
Jason Monk51305372017-06-22 11:41:08 -040042import android.app.trust.TrustManager;
Eliot Courtneya6d8cf22017-10-20 13:26:58 +090043import android.content.Context;
jovanak5f6dc612018-03-27 11:59:22 -070044import android.content.pm.UserInfo;
Jason Monk51305372017-06-22 11:41:08 -040045import android.hardware.fingerprint.FingerprintManager;
Chris Wren27a52fa2017-02-01 14:21:43 -050046import android.metrics.LogMaker;
Jason Monk9c4faa82017-08-15 09:32:27 -040047import android.os.Binder;
Julia Reynolds30203152017-05-26 13:36:31 -040048import android.os.Handler;
49import android.os.HandlerThread;
50import android.os.IPowerManager;
Julia Reynolds30203152017-05-26 13:36:31 -040051import android.os.PowerManager;
Chris Wren621933f2017-06-14 15:59:03 -040052import android.os.RemoteException;
Julia Reynolds30203152017-05-26 13:36:31 -040053import android.os.UserHandle;
54import android.service.notification.StatusBarNotification;
Adrian Roosef7a4022017-01-19 14:48:35 -080055import android.support.test.filters.SmallTest;
Chris Wren27a52fa2017-02-01 14:21:43 -050056import android.support.test.metricshelper.MetricsAsserts;
Chris Wren621933f2017-06-14 15:59:03 -040057import android.testing.AndroidTestingRunner;
58import android.testing.TestableLooper;
Chris Wren621933f2017-06-14 15:59:03 -040059import android.testing.TestableLooper.RunWithLooper;
Eliot Courtney09322282017-11-09 15:31:19 +090060import android.util.SparseArray;
Julia Reynoldsed1c9af2018-03-21 15:21:09 -040061import android.view.Gravity;
62import android.view.View;
Jason Monk51305372017-06-22 11:41:08 -040063import android.view.ViewGroup.LayoutParams;
Adrian Roosef7a4022017-01-19 14:48:35 -080064
Chris Wrenef319902017-03-07 17:58:31 -050065import com.android.internal.logging.MetricsLogger;
Chris Wren27a52fa2017-02-01 14:21:43 -050066import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
Chris Wrenef319902017-03-07 17:58:31 -050067import com.android.internal.logging.testing.FakeMetricsLogger;
Chris Wren621933f2017-06-14 15:59:03 -040068import com.android.internal.statusbar.IStatusBarService;
Adrian Roosef7a4022017-01-19 14:48:35 -080069import com.android.keyguard.KeyguardHostView.OnDismissAction;
Eliot Courtneya6d8cf22017-10-20 13:26:58 +090070import com.android.systemui.ForegroundServiceController;
Jason Monk9c4faa82017-08-15 09:32:27 -040071import com.android.systemui.R;
Adrian Roosef7a4022017-01-19 14:48:35 -080072import com.android.systemui.SysuiTestCase;
Jason Monk9c4faa82017-08-15 09:32:27 -040073import com.android.systemui.assist.AssistManager;
Lucas Dupin47a65c72018-02-15 14:16:18 -080074import com.android.systemui.keyguard.KeyguardViewMediator;
jovanak5f6dc612018-03-27 11:59:22 -070075import com.android.systemui.classifier.FalsingManager;
Adrian Roos6d5ebb72017-08-03 15:10:22 +020076import com.android.systemui.keyguard.WakefulnessLifecycle;
Julia Reynolds30203152017-05-26 13:36:31 -040077import com.android.systemui.recents.misc.SystemServicesProxy;
Chris Wren27a52fa2017-02-01 14:21:43 -050078import com.android.systemui.statusbar.ActivatableNotificationView;
Julia Reynoldsfc640012018-02-21 12:25:27 -050079import com.android.systemui.statusbar.AppOpsListener;
Jason Monk5ecf80c2017-07-06 15:28:17 -040080import com.android.systemui.statusbar.CommandQueue;
Julia Reynoldsed1c9af2018-03-21 15:21:09 -040081import com.android.systemui.statusbar.ExpandableNotificationRow;
82import com.android.systemui.statusbar.FooterView;
83import com.android.systemui.statusbar.FooterViewButton;
Chris Wren27a52fa2017-02-01 14:21:43 -050084import com.android.systemui.statusbar.KeyguardIndicationController;
85import com.android.systemui.statusbar.NotificationData;
Chris Wren621933f2017-06-14 15:59:03 -040086import com.android.systemui.statusbar.NotificationData.Entry;
Eliot Courtneya6d8cf22017-10-20 13:26:58 +090087import com.android.systemui.statusbar.NotificationEntryManager;
88import com.android.systemui.statusbar.NotificationGutsManager;
Eliot Courtney2b4c3a02017-11-27 13:27:46 +090089import com.android.systemui.statusbar.NotificationListContainer;
Eliot Courtney3985ad52017-11-17 16:51:52 +090090import com.android.systemui.statusbar.NotificationListener;
Eliot Courtney09322282017-11-09 15:31:19 +090091import com.android.systemui.statusbar.NotificationLockscreenUserManager;
Eliot Courtney3985ad52017-11-17 16:51:52 +090092import com.android.systemui.statusbar.NotificationLogger;
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;
Chris Wren621933f2017-06-14 15:59:03 -040098import com.android.systemui.statusbar.StatusBarState;
Selim Cinek7e222c3c2018-01-25 12:22:41 -080099import com.android.systemui.statusbar.notification.ActivityLaunchAnimator;
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900100import com.android.systemui.statusbar.notification.VisualStabilityManager;
Jason Monk9c4faa82017-08-15 09:32:27 -0400101import com.android.systemui.statusbar.policy.DeviceProvisionedController;
Jason Monk9c4faa82017-08-15 09:32:27 -0400102import com.android.systemui.statusbar.policy.KeyguardMonitor;
103import com.android.systemui.statusbar.policy.KeyguardMonitorImpl;
jovanak5f6dc612018-03-27 11:59:22 -0700104import com.android.systemui.statusbar.policy.UserSwitcherController;
Chris Wren27a52fa2017-02-01 14:21:43 -0500105import com.android.systemui.statusbar.stack.NotificationStackScrollLayout;
Adrian Roosef7a4022017-01-19 14:48:35 -0800106
107import org.junit.Before;
108import org.junit.Test;
109import org.junit.runner.RunWith;
Julia Reynoldsed1c9af2018-03-21 15:21:09 -0400110import org.mockito.ArgumentCaptor;
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900111import org.mockito.Mock;
112import org.mockito.MockitoAnnotations;
Adrian Roosef7a4022017-01-19 14:48:35 -0800113
Jason Monk51305372017-06-22 11:41:08 -0400114import java.io.ByteArrayOutputStream;
115import java.io.PrintWriter;
Chris Wren621933f2017-06-14 15:59:03 -0400116import java.util.ArrayList;
Julia Reynoldsed1c9af2018-03-21 15:21:09 -0400117import java.util.function.Predicate;
Chris Wren621933f2017-06-14 15:59:03 -0400118
Adrian Roos02de4982017-02-11 09:35:54 +0100119@SmallTest
Chris Wren621933f2017-06-14 15:59:03 -0400120@RunWith(AndroidTestingRunner.class)
121@RunWithLooper
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500122public class StatusBarTest extends SysuiTestCase {
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900123 @Mock private StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
124 @Mock private UnlockMethodCache mUnlockMethodCache;
125 @Mock private KeyguardIndicationController mKeyguardIndicationController;
126 @Mock private NotificationStackScrollLayout mStackScroller;
yoshiki iguchi4e30e762018-02-06 12:09:23 +0900127 @Mock private HeadsUpManagerPhone mHeadsUpManager;
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900128 @Mock private SystemServicesProxy mSystemServicesProxy;
129 @Mock private NotificationPanelView mNotificationPanelView;
130 @Mock private IStatusBarService mBarService;
131 @Mock private ScrimController mScrimController;
132 @Mock private ArrayList<Entry> mNotificationList;
133 @Mock private FingerprintUnlockController mFingerprintUnlockController;
134 @Mock private NotificationData mNotificationData;
Adrian Roosef7a4022017-01-19 14:48:35 -0800135
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900136 // Mock dependencies:
137 @Mock private NotificationViewHierarchyManager mViewHierarchyManager;
138 @Mock private VisualStabilityManager mVisualStabilityManager;
139 @Mock private NotificationListener mNotificationListener;
Lucas Dupin47a65c72018-02-15 14:16:18 -0800140 @Mock private KeyguardViewMediator mKeyguardViewMediator;
jovanak5f6dc612018-03-27 11:59:22 -0700141 @Mock private NotificationLockscreenUserManager mLockscreenUserManager;
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900142
Eliot Courtney2b4c3a02017-11-27 13:27:46 +0900143 private TestableStatusBar mStatusBar;
144 private FakeMetricsLogger mMetricsLogger;
Eliot Courtney2b4c3a02017-11-27 13:27:46 +0900145 private PowerManager mPowerManager;
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900146 private TestableNotificationEntryManager mEntryManager;
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900147 private NotificationLogger mNotificationLogger;
Chris Wren27a52fa2017-02-01 14:21:43 -0500148
Adrian Roos02de4982017-02-11 09:35:54 +0100149 @Before
Julia Reynolds30203152017-05-26 13:36:31 -0400150 public void setup() throws Exception {
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900151 MockitoAnnotations.initMocks(this);
Jason Monk9c4faa82017-08-15 09:32:27 -0400152 mDependency.injectMockDependency(AssistManager.class);
153 mDependency.injectMockDependency(DeviceProvisionedController.class);
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900154 mDependency.injectMockDependency(NotificationGutsManager.class);
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900155 mDependency.injectMockDependency(NotificationMediaManager.class);
156 mDependency.injectMockDependency(ForegroundServiceController.class);
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900157 mDependency.injectTestDependency(NotificationViewHierarchyManager.class,
158 mViewHierarchyManager);
159 mDependency.injectTestDependency(VisualStabilityManager.class, mVisualStabilityManager);
160 mDependency.injectTestDependency(NotificationListener.class, mNotificationListener);
Jason Monk9c4faa82017-08-15 09:32:27 -0400161 mDependency.injectTestDependency(KeyguardMonitor.class, mock(KeyguardMonitorImpl.class));
Julia Reynoldsfc640012018-02-21 12:25:27 -0500162 mDependency.injectTestDependency(AppOpsListener.class, mock(AppOpsListener.class));
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900163
Jason Monk51305372017-06-22 11:41:08 -0400164 mContext.addMockSystemService(TrustManager.class, mock(TrustManager.class));
165 mContext.addMockSystemService(FingerprintManager.class, mock(FingerprintManager.class));
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900166
Chris Wrenef319902017-03-07 17:58:31 -0500167 mMetricsLogger = new FakeMetricsLogger();
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900168 mDependency.injectTestDependency(MetricsLogger.class, mMetricsLogger);
Eliot Courtney6c313d32017-12-14 19:57:51 +0900169 mNotificationLogger = new NotificationLogger();
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900170 mDependency.injectTestDependency(NotificationLogger.class, mNotificationLogger);
171
Julia Reynolds30203152017-05-26 13:36:31 -0400172 IPowerManager powerManagerService = mock(IPowerManager.class);
173 HandlerThread handlerThread = new HandlerThread("TestThread");
174 handlerThread.start();
175 mPowerManager = new PowerManager(mContext, powerManagerService,
176 new Handler(handlerThread.getLooper()));
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900177
178 CommandQueue commandQueue = mock(CommandQueue.class);
179 when(commandQueue.asBinder()).thenReturn(new Binder());
180 mContext.putComponent(CommandQueue.class, commandQueue);
181
182 mContext.setTheme(R.style.Theme_SystemUI_Light);
183
184 when(mStackScroller.generateLayoutParams(any())).thenReturn(new LayoutParams(0, 0));
185 when(mNotificationPanelView.getLayoutParams()).thenReturn(new LayoutParams(0, 0));
Julia Reynolds30203152017-05-26 13:36:31 -0400186 when(powerManagerService.isInteractive()).thenReturn(true);
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900187 when(mStackScroller.getActivatedChild()).thenReturn(null);
Julia Reynolds30203152017-05-26 13:36:31 -0400188
Adrian Roosef7a4022017-01-19 14:48:35 -0800189 doAnswer(invocation -> {
190 OnDismissAction onDismissAction = (OnDismissAction) invocation.getArguments()[0];
191 onDismissAction.onDismiss();
192 return null;
193 }).when(mStatusBarKeyguardViewManager).dismissWithAction(any(), any(), anyBoolean());
194
195 doAnswer(invocation -> {
196 Runnable runnable = (Runnable) invocation.getArguments()[0];
197 runnable.run();
198 return null;
199 }).when(mStatusBarKeyguardViewManager).addAfterKeyguardGoneRunnable(any());
Chris Wren27a52fa2017-02-01 14:21:43 -0500200
Eliot Courtney6c313d32017-12-14 19:57:51 +0900201 mEntryManager = new TestableNotificationEntryManager(mSystemServicesProxy, mPowerManager,
202 mContext);
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900203 mStatusBar = new TestableStatusBar(mStatusBarKeyguardViewManager, mUnlockMethodCache,
204 mKeyguardIndicationController, mStackScroller, mHeadsUpManager,
205 mPowerManager, mNotificationPanelView, mBarService, mNotificationListener,
206 mNotificationLogger, mVisualStabilityManager, mViewHierarchyManager,
Selim Cinek7e222c3c2018-01-25 12:22:41 -0800207 mEntryManager, mScrimController, mFingerprintUnlockController,
jovanak5f6dc612018-03-27 11:59:22 -0700208 mock(ActivityLaunchAnimator.class), mKeyguardViewMediator,
209 mock(NotificationRemoteInputManager.class), mock(NotificationGroupManager.class),
210 mock(FalsingManager.class), mock(StatusBarWindowManager.class),
211 mock(NotificationIconAreaController.class), mock(DozeScrimController.class),
212 mock(NotificationShelf.class), mLockscreenUserManager,
213 mock(CommandQueue.class));
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900214 mStatusBar.mContext = mContext;
215 mStatusBar.mComponents = mContext.getComponents();
Eliot Courtney2b4c3a02017-11-27 13:27:46 +0900216 mEntryManager.setUpForTest(mStatusBar, mStackScroller, mStatusBar, mHeadsUpManager,
217 mNotificationData);
Eliot Courtney4a96b362017-12-14 19:38:52 +0900218 mNotificationLogger.setUpWithEntryManager(mEntryManager, mStackScroller);
Eliot Courtney3985ad52017-11-17 16:51:52 +0900219
Eliot Courtney3985ad52017-11-17 16:51:52 +0900220 TestableLooper.get(this).setMessageHandler(m -> {
221 if (m.getCallback() == mStatusBar.mNotificationLogger.getVisibilityReporter()) {
222 return false;
Chris Wren621933f2017-06-14 15:59:03 -0400223 }
Eliot Courtney3985ad52017-11-17 16:51:52 +0900224 return true;
Chris Wren621933f2017-06-14 15:59:03 -0400225 });
Adrian Roosef7a4022017-01-19 14:48:35 -0800226 }
227
Adrian Roos02de4982017-02-11 09:35:54 +0100228 @Test
Jason Monk5ecf80c2017-07-06 15:28:17 -0400229 public void testSetBouncerShowing_noCrash() {
230 mStatusBar.mCommandQueue = mock(CommandQueue.class);
231 mStatusBar.setBouncerShowing(true);
232 }
233
234 @Test
Adrian Roosef7a4022017-01-19 14:48:35 -0800235 public void executeRunnableDismissingKeyguard_nullRunnable_showingAndOccluded() {
236 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
237 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(true);
238
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500239 mStatusBar.executeRunnableDismissingKeyguard(null, null, false, false, false);
Adrian Roosef7a4022017-01-19 14:48:35 -0800240 }
241
Adrian Roos02de4982017-02-11 09:35:54 +0100242 @Test
Adrian Roosef7a4022017-01-19 14:48:35 -0800243 public void executeRunnableDismissingKeyguard_nullRunnable_showing() {
244 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
245 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
246
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500247 mStatusBar.executeRunnableDismissingKeyguard(null, null, false, false, false);
Adrian Roosef7a4022017-01-19 14:48:35 -0800248 }
249
Adrian Roos02de4982017-02-11 09:35:54 +0100250 @Test
Adrian Roosef7a4022017-01-19 14:48:35 -0800251 public void executeRunnableDismissingKeyguard_nullRunnable_notShowing() {
252 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(false);
253 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
254
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500255 mStatusBar.executeRunnableDismissingKeyguard(null, null, false, false, false);
Adrian Roosef7a4022017-01-19 14:48:35 -0800256 }
257
Adrian Roos02de4982017-02-11 09:35:54 +0100258 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500259 public void lockscreenStateMetrics_notShowing() {
260 // uninteresting state, except that fingerprint must be non-zero
261 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
262 when(mUnlockMethodCache.canSkipBouncer()).thenReturn(true);
263 // interesting state
264 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(false);
265 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false);
266 when(mUnlockMethodCache.isMethodSecure()).thenReturn(false);
Chris Wren27a52fa2017-02-01 14:21:43 -0500267 mStatusBar.onKeyguardViewManagerStatesUpdated();
268
Chris Wrenef319902017-03-07 17:58:31 -0500269 MetricsAsserts.assertHasLog("missing hidden insecure lockscreen log",
270 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500271 new LogMaker(MetricsEvent.LOCKSCREEN)
272 .setType(MetricsEvent.TYPE_CLOSE)
273 .setSubtype(0));
274 }
275
Adrian Roos02de4982017-02-11 09:35:54 +0100276 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500277 public void lockscreenStateMetrics_notShowing_secure() {
278 // uninteresting state, except that fingerprint must be non-zero
279 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
280 when(mUnlockMethodCache.canSkipBouncer()).thenReturn(true);
281 // interesting state
282 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(false);
283 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false);
284 when(mUnlockMethodCache.isMethodSecure()).thenReturn(true);
285
286 mStatusBar.onKeyguardViewManagerStatesUpdated();
287
Chris Wrenef319902017-03-07 17:58:31 -0500288 MetricsAsserts.assertHasLog("missing hidden secure lockscreen log",
289 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500290 new LogMaker(MetricsEvent.LOCKSCREEN)
291 .setType(MetricsEvent.TYPE_CLOSE)
292 .setSubtype(1));
293 }
294
Adrian Roos02de4982017-02-11 09:35:54 +0100295 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500296 public void lockscreenStateMetrics_isShowing() {
297 // uninteresting state, except that fingerprint must be non-zero
298 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
299 when(mUnlockMethodCache.canSkipBouncer()).thenReturn(true);
300 // interesting state
301 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
302 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false);
303 when(mUnlockMethodCache.isMethodSecure()).thenReturn(false);
304
305 mStatusBar.onKeyguardViewManagerStatesUpdated();
306
Chris Wrenef319902017-03-07 17:58:31 -0500307 MetricsAsserts.assertHasLog("missing insecure lockscreen showing",
308 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500309 new LogMaker(MetricsEvent.LOCKSCREEN)
310 .setType(MetricsEvent.TYPE_OPEN)
311 .setSubtype(0));
312 }
313
Adrian Roos02de4982017-02-11 09:35:54 +0100314 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500315 public void lockscreenStateMetrics_isShowing_secure() {
316 // uninteresting state, except that fingerprint must be non-zero
317 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
318 when(mUnlockMethodCache.canSkipBouncer()).thenReturn(true);
319 // interesting state
320 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
321 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false);
322 when(mUnlockMethodCache.isMethodSecure()).thenReturn(true);
323
324 mStatusBar.onKeyguardViewManagerStatesUpdated();
325
Chris Wrenef319902017-03-07 17:58:31 -0500326 MetricsAsserts.assertHasLog("missing secure lockscreen showing log",
327 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500328 new LogMaker(MetricsEvent.LOCKSCREEN)
329 .setType(MetricsEvent.TYPE_OPEN)
330 .setSubtype(1));
331 }
332
Adrian Roos02de4982017-02-11 09:35:54 +0100333 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500334 public void lockscreenStateMetrics_isShowingBouncer() {
335 // uninteresting state, except that fingerprint must be non-zero
336 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
337 when(mUnlockMethodCache.canSkipBouncer()).thenReturn(true);
338 // interesting state
339 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
340 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(true);
341 when(mUnlockMethodCache.isMethodSecure()).thenReturn(true);
342
343 mStatusBar.onKeyguardViewManagerStatesUpdated();
344
Chris Wrenef319902017-03-07 17:58:31 -0500345 MetricsAsserts.assertHasLog("missing bouncer log",
346 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500347 new LogMaker(MetricsEvent.BOUNCER)
348 .setType(MetricsEvent.TYPE_OPEN)
349 .setSubtype(1));
350 }
351
Adrian Roos02de4982017-02-11 09:35:54 +0100352 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500353 public void onActivatedMetrics() {
354 ActivatableNotificationView view = mock(ActivatableNotificationView.class);
355 mStatusBar.onActivated(view);
356
Chris Wrenef319902017-03-07 17:58:31 -0500357 MetricsAsserts.assertHasLog("missing lockscreen note tap log",
358 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500359 new LogMaker(MetricsEvent.ACTION_LS_NOTE)
360 .setType(MetricsEvent.TYPE_ACTION));
361 }
362
Julia Reynolds30203152017-05-26 13:36:31 -0400363 @Test
364 public void testShouldPeek_nonSuppressedGroupSummary() {
365 when(mPowerManager.isScreenOn()).thenReturn(true);
366 when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false);
Julia Reynolds24653c32018-03-02 13:16:37 -0500367 when(mNotificationData.shouldSuppressStatusBar(any())).thenReturn(false);
Julia Reynolds30203152017-05-26 13:36:31 -0400368 when(mNotificationData.shouldFilterOut(any())).thenReturn(false);
369 when(mSystemServicesProxy.isDreaming()).thenReturn(false);
370 when(mNotificationData.getImportance(any())).thenReturn(IMPORTANCE_HIGH);
371
372 Notification n = new Notification.Builder(getContext(), "a")
373 .setGroup("a")
374 .setGroupSummary(true)
375 .setGroupAlertBehavior(Notification.GROUP_ALERT_SUMMARY)
376 .build();
377 StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, "a", 0, 0, n,
378 UserHandle.of(0), null, 0);
379 NotificationData.Entry entry = new NotificationData.Entry(sbn);
380
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900381 assertTrue(mEntryManager.shouldPeek(entry, sbn));
Julia Reynolds30203152017-05-26 13:36:31 -0400382 }
383
384 @Test
385 public void testShouldPeek_suppressedGroupSummary() {
386 when(mPowerManager.isScreenOn()).thenReturn(true);
387 when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false);
Julia Reynolds24653c32018-03-02 13:16:37 -0500388 when(mNotificationData.shouldSuppressStatusBar(any())).thenReturn(false);
Julia Reynolds30203152017-05-26 13:36:31 -0400389 when(mNotificationData.shouldFilterOut(any())).thenReturn(false);
390 when(mSystemServicesProxy.isDreaming()).thenReturn(false);
391 when(mNotificationData.getImportance(any())).thenReturn(IMPORTANCE_HIGH);
392
393 Notification n = new Notification.Builder(getContext(), "a")
394 .setGroup("a")
395 .setGroupSummary(true)
396 .setGroupAlertBehavior(Notification.GROUP_ALERT_CHILDREN)
397 .build();
398 StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, "a", 0, 0, n,
399 UserHandle.of(0), null, 0);
400 NotificationData.Entry entry = new NotificationData.Entry(sbn);
401
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900402 assertFalse(mEntryManager.shouldPeek(entry, sbn));
Julia Reynolds30203152017-05-26 13:36:31 -0400403 }
404
Chris Wren621933f2017-06-14 15:59:03 -0400405 @Test
Julia Reynolds24653c32018-03-02 13:16:37 -0500406 public void testShouldPeek_suppressedPeek() {
Beverly38159ce2017-07-13 16:39:24 -0400407 when(mPowerManager.isScreenOn()).thenReturn(true);
408 when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false);
409 when(mNotificationData.shouldFilterOut(any())).thenReturn(false);
410 when(mSystemServicesProxy.isDreaming()).thenReturn(false);
411 when(mNotificationData.getImportance(any())).thenReturn(IMPORTANCE_HIGH);
412
Julia Reynolds24653c32018-03-02 13:16:37 -0500413 when(mNotificationData.shouldSuppressPeek(any())).thenReturn(true);
414
415 Notification n = new Notification.Builder(getContext(), "a").build();
416 StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, "a", 0, 0, n,
417 UserHandle.of(0), null, 0);
418 NotificationData.Entry entry = new NotificationData.Entry(sbn);
419
420 assertFalse(mEntryManager.shouldPeek(entry, sbn));
421 }
422
423 @Test
424 public void testShouldPeek_noSuppressedPeek() {
425 when(mPowerManager.isScreenOn()).thenReturn(true);
426 when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false);
427 when(mNotificationData.shouldFilterOut(any())).thenReturn(false);
428 when(mSystemServicesProxy.isDreaming()).thenReturn(false);
429 when(mNotificationData.getImportance(any())).thenReturn(IMPORTANCE_HIGH);
430
431 when(mNotificationData.shouldSuppressPeek(any())).thenReturn(false);
Beverly38159ce2017-07-13 16:39:24 -0400432
433 Notification n = new Notification.Builder(getContext(), "a").build();
434 StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, "a", 0, 0, n,
435 UserHandle.of(0), null, 0);
436 NotificationData.Entry entry = new NotificationData.Entry(sbn);
437
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900438 assertTrue(mEntryManager.shouldPeek(entry, sbn));
Beverly38159ce2017-07-13 16:39:24 -0400439 }
440
441 @Test
Chris Wren621933f2017-06-14 15:59:03 -0400442 public void testLogHidden() {
443 try {
444 mStatusBar.handleVisibleToUserChanged(false);
Selim Cinek1a891a92017-12-04 17:41:27 +0100445 waitForUiOffloadThread();
Chris Wren621933f2017-06-14 15:59:03 -0400446 verify(mBarService, times(1)).onPanelHidden();
447 verify(mBarService, never()).onPanelRevealed(anyBoolean(), anyInt());
448 } catch (RemoteException e) {
449 fail();
450 }
451 }
452
453 @Test
454 public void testPanelOpenForPeek() {
455 when(mHeadsUpManager.hasPinnedHeadsUp()).thenReturn(true);
456 when(mNotificationData.getActiveNotifications()).thenReturn(mNotificationList);
457 when(mNotificationList.size()).thenReturn(5);
458 when(mNotificationPanelView.isFullyCollapsed()).thenReturn(true);
459 mStatusBar.setBarStateForTest(StatusBarState.SHADE);
460
461 try {
462 mStatusBar.handleVisibleToUserChanged(true);
Selim Cinek1a891a92017-12-04 17:41:27 +0100463 waitForUiOffloadThread();
Chris Wren621933f2017-06-14 15:59:03 -0400464 verify(mBarService, never()).onPanelHidden();
465 verify(mBarService, times(1)).onPanelRevealed(false, 1);
466 } catch (RemoteException e) {
467 fail();
468 }
469 TestableLooper.get(this).processAllMessages();
470 }
471
472 @Test
473 public void testPanelOpenAndClear() {
474 when(mHeadsUpManager.hasPinnedHeadsUp()).thenReturn(false);
475 when(mNotificationData.getActiveNotifications()).thenReturn(mNotificationList);
476 when(mNotificationList.size()).thenReturn(5);
477 when(mNotificationPanelView.isFullyCollapsed()).thenReturn(false);
478 mStatusBar.setBarStateForTest(StatusBarState.SHADE);
479
480 try {
481 mStatusBar.handleVisibleToUserChanged(true);
Selim Cinek1a891a92017-12-04 17:41:27 +0100482 waitForUiOffloadThread();
Chris Wren621933f2017-06-14 15:59:03 -0400483 verify(mBarService, never()).onPanelHidden();
484 verify(mBarService, times(1)).onPanelRevealed(true, 5);
485 } catch (RemoteException e) {
486 fail();
487 }
488 TestableLooper.get(this).processAllMessages();
489 }
490
491 @Test
492 public void testPanelOpenAndNoClear() {
493 when(mHeadsUpManager.hasPinnedHeadsUp()).thenReturn(false);
494 when(mNotificationData.getActiveNotifications()).thenReturn(mNotificationList);
495 when(mNotificationList.size()).thenReturn(5);
496 when(mNotificationPanelView.isFullyCollapsed()).thenReturn(false);
497 mStatusBar.setBarStateForTest(StatusBarState.KEYGUARD);
498
499 try {
500 mStatusBar.handleVisibleToUserChanged(true);
Selim Cinek1a891a92017-12-04 17:41:27 +0100501 waitForUiOffloadThread();
Chris Wren621933f2017-06-14 15:59:03 -0400502 verify(mBarService, never()).onPanelHidden();
503 verify(mBarService, times(1)).onPanelRevealed(false, 5);
504 } catch (RemoteException e) {
505 fail();
506 }
507 TestableLooper.get(this).processAllMessages();
508 }
509
Jason Monk51305372017-06-22 11:41:08 -0400510 @Test
Charles He2eda2422017-09-24 17:55:21 +0100511 public void testDisableExpandStatusBar() {
512 mStatusBar.setBarStateForTest(StatusBarState.SHADE);
513 mStatusBar.setUserSetupForTest(true);
514 when(mStatusBar.isDeviceProvisioned()).thenReturn(true);
515
516 mStatusBar.disable(StatusBarManager.DISABLE_NONE,
517 StatusBarManager.DISABLE2_NOTIFICATION_SHADE, false);
518 verify(mNotificationPanelView).setQsExpansionEnabled(false);
519 mStatusBar.animateExpandNotificationsPanel();
520 verify(mNotificationPanelView, never()).expand(anyBoolean());
521 mStatusBar.animateExpandSettingsPanel(null);
522 verify(mNotificationPanelView, never()).expand(anyBoolean());
523
524 mStatusBar.disable(StatusBarManager.DISABLE_NONE, StatusBarManager.DISABLE2_NONE, false);
525 verify(mNotificationPanelView).setQsExpansionEnabled(true);
526 mStatusBar.animateExpandNotificationsPanel();
527 verify(mNotificationPanelView).expand(anyBoolean());
528 mStatusBar.animateExpandSettingsPanel(null);
529 verify(mNotificationPanelView).expand(anyBoolean());
530 }
531
532 @Test
Jason Monk51305372017-06-22 11:41:08 -0400533 public void testDump_DoesNotCrash() {
534 mStatusBar.dump(null, new PrintWriter(new ByteArrayOutputStream()), null);
535 }
536
Jason Monk9c4faa82017-08-15 09:32:27 -0400537 @Test
538 @RunWithLooper(setAsMainLooper = true)
539 public void testUpdateKeyguardState_DoesNotCrash() {
Jason Monk9c4faa82017-08-15 09:32:27 -0400540 mStatusBar.mState = StatusBarState.KEYGUARD;
Eliot Courtney09322282017-11-09 15:31:19 +0900541 when(mStatusBar.mLockscreenUserManager.getCurrentProfiles()).thenReturn(
542 new SparseArray<>());
Jason Monk9c4faa82017-08-15 09:32:27 -0400543 mStatusBar.updateKeyguardState(false, false);
544 }
545
Lucas Dupinc2e75462017-12-06 13:59:25 -0800546 @Test
547 public void testFingerprintNotification_UpdatesScrims() {
Lucas Dupinc2e75462017-12-06 13:59:25 -0800548 mStatusBar.notifyFpAuthModeChanged();
549 verify(mScrimController).transitionTo(any(), any());
550 }
551
Lucas Dupin311eac82017-12-11 14:40:07 -0800552 @Test
553 public void testFingerprintUnlock_UpdatesScrims() {
554 // Simulate unlocking from AoD with fingerprint.
555 when(mFingerprintUnlockController.getMode())
556 .thenReturn(FingerprintUnlockController.MODE_WAKE_AND_UNLOCK);
557 mStatusBar.updateScrimController();
558 verify(mScrimController).transitionTo(eq(ScrimState.UNLOCKED), any());
559 }
560
Lucas Dupind5107302018-03-19 15:30:29 -0700561 @Test
562 public void testSetOccluded_propagatesToScrimController() {
563 mStatusBar.setOccluded(true);
564 verify(mScrimController).setKeyguardOccluded(eq(true));
565
566 reset(mScrimController);
567 mStatusBar.setOccluded(false);
568 verify(mScrimController).setKeyguardOccluded(eq(false));
569 }
570
Julia Reynoldsed1c9af2018-03-21 15:21:09 -0400571 @Test
572 public void testInflateFooterView() {
573 mStatusBar.reevaluateStyles();
574 ArgumentCaptor<FooterView> captor = ArgumentCaptor.forClass(FooterView.class);
575 verify(mStackScroller).setFooterView(captor.capture());
576
577 assertNotNull(captor.getValue().findViewById(R.id.manage_text).hasOnClickListeners());
578 assertNotNull(captor.getValue().findViewById(R.id.dismiss_text).hasOnClickListeners());
579 }
580
581 @Test
582 public void testUpdateFooter_noNotifications() {
583 mStatusBar.setBarStateForTest(StatusBarState.SHADE);
584 assertEquals(0, mEntryManager.getNotificationData().getActiveNotifications().size());
585
586 mStatusBar.updateFooter();
587 verify(mStackScroller).updateFooterView(false, false);
588 }
589
590 @Test
591 public void testUpdateFooter_oneClearableNotification() {
592 mStatusBar.setBarStateForTest(StatusBarState.SHADE);
593 ArrayList<Entry> entries = new ArrayList<>();
594 entries.add(mock(Entry.class));
595 when(mNotificationData.getActiveNotifications()).thenReturn(entries);
596
597 ExpandableNotificationRow row = mock(ExpandableNotificationRow.class);
598 when(row.canViewBeDismissed()).thenReturn(true);
599 when(mStackScroller.getChildCount()).thenReturn(1);
600 when(mStackScroller.getChildAt(anyInt())).thenReturn(row);
601
602 mStatusBar.updateFooter();
603 verify(mStackScroller).updateFooterView(true, true);
604 }
605
606 @Test
607 public void testUpdateFooter_oneNonClearableNotification() {
608 mStatusBar.setBarStateForTest(StatusBarState.SHADE);
609 ArrayList<Entry> entries = new ArrayList<>();
610 entries.add(mock(Entry.class));
611 when(mNotificationData.getActiveNotifications()).thenReturn(entries);
612
613 mStatusBar.updateFooter();
614 verify(mStackScroller).updateFooterView(true, false);
615 }
616
617 @Test
618 public void testUpdateFooter_atEnd() {
619 // add footer
620 mStatusBar.reevaluateStyles();
621
622 // add notification
623 ExpandableNotificationRow row = mock(ExpandableNotificationRow.class);
624 when(row.isClearable()).thenReturn(true);
625 mStackScroller.addContainerView(row);
626
627 mStatusBar.onUpdateRowStates();
628
629 // move footer to end
630 verify(mStackScroller).changeViewPosition(any(FooterView.class), eq(-1 /* end */));
631 }
632
jovanak5f6dc612018-03-27 11:59:22 -0700633 @Test
634 public void testSetState_changesIsFullScreenUserSwitcherState() {
635 mStatusBar.setBarStateForTest(StatusBarState.KEYGUARD);
636 assertFalse(mStatusBar.isFullScreenUserSwitcherState());
637
638 mStatusBar.setBarStateForTest(StatusBarState.FULLSCREEN_USER_SWITCHER);
639 assertTrue(mStatusBar.isFullScreenUserSwitcherState());
640 }
641
642 @Test
643 public void testShowKeyguardImplementation_setsState() {
644 when(mLockscreenUserManager.getCurrentProfiles()).thenReturn(new SparseArray<>());
645
646 mStatusBar.setBarStateForTest(StatusBarState.SHADE);
647
648 // By default, showKeyguardImpl sets state to KEYGUARD.
649 mStatusBar.showKeyguardImpl();
650 assertTrue(mStatusBar.mState == StatusBarState.KEYGUARD);
651
652 // If useFullscreenUserSwitcher is true, state is set to FULLSCREEN_USER_SWITCHER.
653 mStatusBar.mUserSwitcherController = mock(UserSwitcherController.class);
654 when(mStatusBar.mUserSwitcherController.useFullscreenUserSwitcher()).thenReturn(true);
655 mStatusBar.showKeyguardImpl();
656 assertTrue(mStatusBar.mState == StatusBarState.FULLSCREEN_USER_SWITCHER);
657 }
658
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500659 static class TestableStatusBar extends StatusBar {
Chris Wren27a52fa2017-02-01 14:21:43 -0500660 public TestableStatusBar(StatusBarKeyguardViewManager man,
661 UnlockMethodCache unlock, KeyguardIndicationController key,
yoshiki iguchi4e30e762018-02-06 12:09:23 +0900662 NotificationStackScrollLayout stack, HeadsUpManagerPhone hum,
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900663 PowerManager pm, NotificationPanelView panelView,
Eliot Courtney3985ad52017-11-17 16:51:52 +0900664 IStatusBarService barService, NotificationListener notificationListener,
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900665 NotificationLogger notificationLogger,
Eliot Courtney2b4c3a02017-11-27 13:27:46 +0900666 VisualStabilityManager visualStabilityManager,
667 NotificationViewHierarchyManager viewHierarchyManager,
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900668 TestableNotificationEntryManager entryManager, ScrimController scrimController,
Selim Cinek7e222c3c2018-01-25 12:22:41 -0800669 FingerprintUnlockController fingerprintUnlockController,
jovanak5f6dc612018-03-27 11:59:22 -0700670 ActivityLaunchAnimator launchAnimator, KeyguardViewMediator keyguardViewMediator,
671 NotificationRemoteInputManager notificationRemoteInputManager,
672 NotificationGroupManager notificationGroupManager,
673 FalsingManager falsingManager,
674 StatusBarWindowManager statusBarWindowManager,
675 NotificationIconAreaController notificationIconAreaController,
676 DozeScrimController dozeScrimController,
677 NotificationShelf notificationShelf,
678 NotificationLockscreenUserManager notificationLockscreenUserManager,
679 CommandQueue commandQueue) {
Adrian Roosef7a4022017-01-19 14:48:35 -0800680 mStatusBarKeyguardViewManager = man;
Chris Wren27a52fa2017-02-01 14:21:43 -0500681 mUnlockMethodCache = unlock;
682 mKeyguardIndicationController = key;
683 mStackScroller = stack;
Julia Reynolds30203152017-05-26 13:36:31 -0400684 mHeadsUpManager = hum;
Julia Reynolds30203152017-05-26 13:36:31 -0400685 mPowerManager = pm;
Jorim Jaggifd3b1a12017-06-06 17:04:19 -0700686 mNotificationPanel = panelView;
Chris Wren621933f2017-06-14 15:59:03 -0400687 mBarService = barService;
Eliot Courtney3985ad52017-11-17 16:51:52 +0900688 mNotificationListener = notificationListener;
689 mNotificationLogger = notificationLogger;
Adrian Roos6d5ebb72017-08-03 15:10:22 +0200690 mWakefulnessLifecycle = createAwakeWakefulnessLifecycle();
Eliot Courtney2b4c3a02017-11-27 13:27:46 +0900691 mVisualStabilityManager = visualStabilityManager;
692 mViewHierarchyManager = viewHierarchyManager;
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900693 mEntryManager = entryManager;
Lucas Dupinc2e75462017-12-06 13:59:25 -0800694 mScrimController = scrimController;
Lucas Dupin311eac82017-12-11 14:40:07 -0800695 mFingerprintUnlockController = fingerprintUnlockController;
Selim Cinek7e222c3c2018-01-25 12:22:41 -0800696 mActivityLaunchAnimator = launchAnimator;
Lucas Dupin47a65c72018-02-15 14:16:18 -0800697 mKeyguardViewMediator = keyguardViewMediator;
Julia Reynoldsed1c9af2018-03-21 15:21:09 -0400698 mClearAllEnabled = true;
jovanak5f6dc612018-03-27 11:59:22 -0700699 mRemoteInputManager = notificationRemoteInputManager;
700 mGroupManager = notificationGroupManager;
701 mFalsingManager = falsingManager;
702 mStatusBarWindowManager = statusBarWindowManager;
703 mNotificationIconAreaController = notificationIconAreaController;
704 mDozeScrimController = dozeScrimController;
705 mNotificationShelf = notificationShelf;
706 mLockscreenUserManager = notificationLockscreenUserManager;
707 mCommandQueue = commandQueue;
Adrian Roos6d5ebb72017-08-03 15:10:22 +0200708 }
709
710 private WakefulnessLifecycle createAwakeWakefulnessLifecycle() {
711 WakefulnessLifecycle wakefulnessLifecycle = new WakefulnessLifecycle();
712 wakefulnessLifecycle.dispatchStartedWakingUp();
713 wakefulnessLifecycle.dispatchFinishedWakingUp();
714 return wakefulnessLifecycle;
Adrian Roosef7a4022017-01-19 14:48:35 -0800715 }
716
Jason Monk9c4faa82017-08-15 09:32:27 -0400717 @Override
718 protected void updateTheme() {
719 // Do nothing for now, until we have more mocking and StatusBar is smaller.
720 }
721
Chris Wren621933f2017-06-14 15:59:03 -0400722 public void setBarStateForTest(int state) {
723 mState = state;
Adrian Roosef7a4022017-01-19 14:48:35 -0800724 }
Charles He2eda2422017-09-24 17:55:21 +0100725
726 public void setUserSetupForTest(boolean userSetup) {
727 mUserSetup = userSetup;
728 }
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900729
730 }
731
732 private class TestableNotificationEntryManager extends NotificationEntryManager {
733
Eliot Courtney6c313d32017-12-14 19:57:51 +0900734 public TestableNotificationEntryManager(SystemServicesProxy systemServicesProxy,
735 PowerManager powerManager, Context context) {
736 super(context);
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900737 mSystemServicesProxy = systemServicesProxy;
738 mPowerManager = powerManager;
739 }
740
741 public void setUpForTest(NotificationPresenter presenter,
Eliot Courtney2b4c3a02017-11-27 13:27:46 +0900742 NotificationListContainer listContainer,
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900743 Callback callback,
yoshiki iguchi4e30e762018-02-06 12:09:23 +0900744 HeadsUpManagerPhone headsUpManager,
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900745 NotificationData notificationData) {
Eliot Courtney2b4c3a02017-11-27 13:27:46 +0900746 super.setUpWithPresenter(presenter, listContainer, callback, headsUpManager);
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900747 mNotificationData = notificationData;
748 mUseHeadsUp = true;
749 }
Adrian Roosef7a4022017-01-19 14:48:35 -0800750 }
Eliot Courtney09322282017-11-09 15:31:19 +0900751}