blob: bdf9b1f6da9e15302bf1d634ec1c93c1a124abd0 [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
21import static junit.framework.Assert.assertFalse;
22import static junit.framework.Assert.assertTrue;
Chris Wren621933f2017-06-14 15:59:03 -040023import static junit.framework.TestCase.fail;
Julia Reynolds30203152017-05-26 13:36:31 -040024
Chris Wren621933f2017-06-14 15:59:03 -040025import static org.mockito.ArgumentMatchers.any;
26import static org.mockito.ArgumentMatchers.anyBoolean;
27import static org.mockito.ArgumentMatchers.anyInt;
28import static org.mockito.ArgumentMatchers.anyString;
Lucas Dupin311eac82017-12-11 14:40:07 -080029import static org.mockito.ArgumentMatchers.eq;
Adrian Roosef7a4022017-01-19 14:48:35 -080030import static org.mockito.Mockito.doAnswer;
31import static org.mockito.Mockito.mock;
Chris Wren621933f2017-06-14 15:59:03 -040032import static org.mockito.Mockito.never;
33import static org.mockito.Mockito.times;
Chris Wren621933f2017-06-14 15:59:03 -040034import static org.mockito.Mockito.verify;
Jason Monk9c4faa82017-08-15 09:32:27 -040035import static org.mockito.Mockito.when;
Adrian Roosef7a4022017-01-19 14:48:35 -080036
Julia Reynolds30203152017-05-26 13:36:31 -040037import android.app.Notification;
Charles He2eda2422017-09-24 17:55:21 +010038import android.app.StatusBarManager;
Jason Monk51305372017-06-22 11:41:08 -040039import android.app.trust.TrustManager;
Eliot Courtneya6d8cf22017-10-20 13:26:58 +090040import android.content.Context;
Jason Monk51305372017-06-22 11:41:08 -040041import android.hardware.fingerprint.FingerprintManager;
Chris Wren27a52fa2017-02-01 14:21:43 -050042import android.metrics.LogMaker;
Jason Monk9c4faa82017-08-15 09:32:27 -040043import android.os.Binder;
Julia Reynolds30203152017-05-26 13:36:31 -040044import android.os.Handler;
45import android.os.HandlerThread;
46import android.os.IPowerManager;
Julia Reynolds30203152017-05-26 13:36:31 -040047import android.os.PowerManager;
Chris Wren621933f2017-06-14 15:59:03 -040048import android.os.RemoteException;
Julia Reynolds30203152017-05-26 13:36:31 -040049import android.os.UserHandle;
50import android.service.notification.StatusBarNotification;
Adrian Roosef7a4022017-01-19 14:48:35 -080051import android.support.test.filters.SmallTest;
Chris Wren27a52fa2017-02-01 14:21:43 -050052import android.support.test.metricshelper.MetricsAsserts;
Chris Wren621933f2017-06-14 15:59:03 -040053import android.testing.AndroidTestingRunner;
54import android.testing.TestableLooper;
Chris Wren621933f2017-06-14 15:59:03 -040055import android.testing.TestableLooper.RunWithLooper;
Eliot Courtney09322282017-11-09 15:31:19 +090056import android.util.SparseArray;
Jason Monk51305372017-06-22 11:41:08 -040057import android.view.ViewGroup.LayoutParams;
Adrian Roosef7a4022017-01-19 14:48:35 -080058
Chris Wrenef319902017-03-07 17:58:31 -050059import com.android.internal.logging.MetricsLogger;
Chris Wren27a52fa2017-02-01 14:21:43 -050060import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
Chris Wrenef319902017-03-07 17:58:31 -050061import com.android.internal.logging.testing.FakeMetricsLogger;
Chris Wren621933f2017-06-14 15:59:03 -040062import com.android.internal.statusbar.IStatusBarService;
Adrian Roosef7a4022017-01-19 14:48:35 -080063import com.android.keyguard.KeyguardHostView.OnDismissAction;
Eliot Courtneya6d8cf22017-10-20 13:26:58 +090064import com.android.systemui.ForegroundServiceController;
Jason Monk9c4faa82017-08-15 09:32:27 -040065import com.android.systemui.R;
Adrian Roosef7a4022017-01-19 14:48:35 -080066import com.android.systemui.SysuiTestCase;
Eliot Courtney3985ad52017-11-17 16:51:52 +090067import com.android.systemui.UiOffloadThread;
Jason Monk9c4faa82017-08-15 09:32:27 -040068import com.android.systemui.assist.AssistManager;
Adrian Roos6d5ebb72017-08-03 15:10:22 +020069import com.android.systemui.keyguard.WakefulnessLifecycle;
Julia Reynolds30203152017-05-26 13:36:31 -040070import com.android.systemui.recents.misc.SystemServicesProxy;
Chris Wren27a52fa2017-02-01 14:21:43 -050071import com.android.systemui.statusbar.ActivatableNotificationView;
Jason Monk5ecf80c2017-07-06 15:28:17 -040072import com.android.systemui.statusbar.CommandQueue;
Chris Wren27a52fa2017-02-01 14:21:43 -050073import com.android.systemui.statusbar.KeyguardIndicationController;
74import com.android.systemui.statusbar.NotificationData;
Chris Wren621933f2017-06-14 15:59:03 -040075import com.android.systemui.statusbar.NotificationData.Entry;
Eliot Courtneya6d8cf22017-10-20 13:26:58 +090076import com.android.systemui.statusbar.NotificationEntryManager;
77import com.android.systemui.statusbar.NotificationGutsManager;
Eliot Courtney2b4c3a02017-11-27 13:27:46 +090078import com.android.systemui.statusbar.NotificationListContainer;
Eliot Courtney3985ad52017-11-17 16:51:52 +090079import com.android.systemui.statusbar.NotificationListener;
Eliot Courtney09322282017-11-09 15:31:19 +090080import com.android.systemui.statusbar.NotificationLockscreenUserManager;
Eliot Courtney3985ad52017-11-17 16:51:52 +090081import com.android.systemui.statusbar.NotificationLogger;
Eliot Courtneya6d8cf22017-10-20 13:26:58 +090082import com.android.systemui.statusbar.NotificationMediaManager;
83import com.android.systemui.statusbar.NotificationPresenter;
84import com.android.systemui.statusbar.NotificationRemoteInputManager;
Eliot Courtney2b4c3a02017-11-27 13:27:46 +090085import com.android.systemui.statusbar.NotificationViewHierarchyManager;
Chris Wren621933f2017-06-14 15:59:03 -040086import com.android.systemui.statusbar.StatusBarState;
Selim Cinek7e222c3c2018-01-25 12:22:41 -080087import com.android.systemui.statusbar.notification.ActivityLaunchAnimator;
Eliot Courtneya6d8cf22017-10-20 13:26:58 +090088import com.android.systemui.statusbar.notification.VisualStabilityManager;
Jason Monk9c4faa82017-08-15 09:32:27 -040089import com.android.systemui.statusbar.policy.DeviceProvisionedController;
Julia Reynolds30203152017-05-26 13:36:31 -040090import com.android.systemui.statusbar.policy.HeadsUpManager;
Jason Monk9c4faa82017-08-15 09:32:27 -040091import com.android.systemui.statusbar.policy.KeyguardMonitor;
92import com.android.systemui.statusbar.policy.KeyguardMonitorImpl;
Chris Wren27a52fa2017-02-01 14:21:43 -050093import com.android.systemui.statusbar.stack.NotificationStackScrollLayout;
Adrian Roosef7a4022017-01-19 14:48:35 -080094
95import org.junit.Before;
96import org.junit.Test;
97import org.junit.runner.RunWith;
Eliot Courtney8f56b0e2017-12-14 18:54:28 +090098import org.mockito.Mock;
99import org.mockito.MockitoAnnotations;
Adrian Roosef7a4022017-01-19 14:48:35 -0800100
Jason Monk51305372017-06-22 11:41:08 -0400101import java.io.ByteArrayOutputStream;
102import java.io.PrintWriter;
Chris Wren621933f2017-06-14 15:59:03 -0400103import java.util.ArrayList;
104
Adrian Roos02de4982017-02-11 09:35:54 +0100105@SmallTest
Chris Wren621933f2017-06-14 15:59:03 -0400106@RunWith(AndroidTestingRunner.class)
107@RunWithLooper
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500108public class StatusBarTest extends SysuiTestCase {
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900109 @Mock private StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
110 @Mock private UnlockMethodCache mUnlockMethodCache;
111 @Mock private KeyguardIndicationController mKeyguardIndicationController;
112 @Mock private NotificationStackScrollLayout mStackScroller;
113 @Mock private HeadsUpManager mHeadsUpManager;
114 @Mock private SystemServicesProxy mSystemServicesProxy;
115 @Mock private NotificationPanelView mNotificationPanelView;
116 @Mock private IStatusBarService mBarService;
117 @Mock private ScrimController mScrimController;
118 @Mock private ArrayList<Entry> mNotificationList;
119 @Mock private FingerprintUnlockController mFingerprintUnlockController;
120 @Mock private NotificationData mNotificationData;
Adrian Roosef7a4022017-01-19 14:48:35 -0800121
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900122 // Mock dependencies:
123 @Mock private NotificationViewHierarchyManager mViewHierarchyManager;
124 @Mock private VisualStabilityManager mVisualStabilityManager;
125 @Mock private NotificationListener mNotificationListener;
126
Eliot Courtney2b4c3a02017-11-27 13:27:46 +0900127 private TestableStatusBar mStatusBar;
128 private FakeMetricsLogger mMetricsLogger;
Eliot Courtney2b4c3a02017-11-27 13:27:46 +0900129 private PowerManager mPowerManager;
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900130 private TestableNotificationEntryManager mEntryManager;
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900131 private NotificationLogger mNotificationLogger;
Chris Wren27a52fa2017-02-01 14:21:43 -0500132
Adrian Roos02de4982017-02-11 09:35:54 +0100133 @Before
Julia Reynolds30203152017-05-26 13:36:31 -0400134 public void setup() throws Exception {
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900135 MockitoAnnotations.initMocks(this);
Jason Monk9c4faa82017-08-15 09:32:27 -0400136 mDependency.injectMockDependency(AssistManager.class);
137 mDependency.injectMockDependency(DeviceProvisionedController.class);
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900138 mDependency.injectMockDependency(NotificationGroupManager.class);
139 mDependency.injectMockDependency(NotificationGutsManager.class);
140 mDependency.injectMockDependency(NotificationRemoteInputManager.class);
141 mDependency.injectMockDependency(NotificationMediaManager.class);
142 mDependency.injectMockDependency(ForegroundServiceController.class);
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900143 mDependency.injectTestDependency(NotificationViewHierarchyManager.class,
144 mViewHierarchyManager);
145 mDependency.injectTestDependency(VisualStabilityManager.class, mVisualStabilityManager);
146 mDependency.injectTestDependency(NotificationListener.class, mNotificationListener);
Jason Monk9c4faa82017-08-15 09:32:27 -0400147 mDependency.injectTestDependency(KeyguardMonitor.class, mock(KeyguardMonitorImpl.class));
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900148
Jason Monk51305372017-06-22 11:41:08 -0400149 mContext.addMockSystemService(TrustManager.class, mock(TrustManager.class));
150 mContext.addMockSystemService(FingerprintManager.class, mock(FingerprintManager.class));
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900151
Chris Wrenef319902017-03-07 17:58:31 -0500152 mMetricsLogger = new FakeMetricsLogger();
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900153 mDependency.injectTestDependency(MetricsLogger.class, mMetricsLogger);
Eliot Courtney6c313d32017-12-14 19:57:51 +0900154 mNotificationLogger = new NotificationLogger();
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900155 mDependency.injectTestDependency(NotificationLogger.class, mNotificationLogger);
156
Julia Reynolds30203152017-05-26 13:36:31 -0400157 IPowerManager powerManagerService = mock(IPowerManager.class);
158 HandlerThread handlerThread = new HandlerThread("TestThread");
159 handlerThread.start();
160 mPowerManager = new PowerManager(mContext, powerManagerService,
161 new Handler(handlerThread.getLooper()));
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900162
163 CommandQueue commandQueue = mock(CommandQueue.class);
164 when(commandQueue.asBinder()).thenReturn(new Binder());
165 mContext.putComponent(CommandQueue.class, commandQueue);
166
167 mContext.setTheme(R.style.Theme_SystemUI_Light);
168
169 when(mStackScroller.generateLayoutParams(any())).thenReturn(new LayoutParams(0, 0));
170 when(mNotificationPanelView.getLayoutParams()).thenReturn(new LayoutParams(0, 0));
Julia Reynolds30203152017-05-26 13:36:31 -0400171 when(powerManagerService.isInteractive()).thenReturn(true);
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900172 when(mStackScroller.getActivatedChild()).thenReturn(null);
Julia Reynolds30203152017-05-26 13:36:31 -0400173
Adrian Roosef7a4022017-01-19 14:48:35 -0800174 doAnswer(invocation -> {
175 OnDismissAction onDismissAction = (OnDismissAction) invocation.getArguments()[0];
176 onDismissAction.onDismiss();
177 return null;
178 }).when(mStatusBarKeyguardViewManager).dismissWithAction(any(), any(), anyBoolean());
179
180 doAnswer(invocation -> {
181 Runnable runnable = (Runnable) invocation.getArguments()[0];
182 runnable.run();
183 return null;
184 }).when(mStatusBarKeyguardViewManager).addAfterKeyguardGoneRunnable(any());
Chris Wren27a52fa2017-02-01 14:21:43 -0500185
Eliot Courtney6c313d32017-12-14 19:57:51 +0900186 mEntryManager = new TestableNotificationEntryManager(mSystemServicesProxy, mPowerManager,
187 mContext);
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900188 mStatusBar = new TestableStatusBar(mStatusBarKeyguardViewManager, mUnlockMethodCache,
189 mKeyguardIndicationController, mStackScroller, mHeadsUpManager,
190 mPowerManager, mNotificationPanelView, mBarService, mNotificationListener,
191 mNotificationLogger, mVisualStabilityManager, mViewHierarchyManager,
Selim Cinek7e222c3c2018-01-25 12:22:41 -0800192 mEntryManager, mScrimController, mFingerprintUnlockController,
193 mock(ActivityLaunchAnimator.class));
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900194 mStatusBar.mContext = mContext;
195 mStatusBar.mComponents = mContext.getComponents();
Eliot Courtney2b4c3a02017-11-27 13:27:46 +0900196 mEntryManager.setUpForTest(mStatusBar, mStackScroller, mStatusBar, mHeadsUpManager,
197 mNotificationData);
Eliot Courtney4a96b362017-12-14 19:38:52 +0900198 mNotificationLogger.setUpWithEntryManager(mEntryManager, mStackScroller);
Eliot Courtney3985ad52017-11-17 16:51:52 +0900199
Eliot Courtney3985ad52017-11-17 16:51:52 +0900200 TestableLooper.get(this).setMessageHandler(m -> {
201 if (m.getCallback() == mStatusBar.mNotificationLogger.getVisibilityReporter()) {
202 return false;
Chris Wren621933f2017-06-14 15:59:03 -0400203 }
Eliot Courtney3985ad52017-11-17 16:51:52 +0900204 return true;
Chris Wren621933f2017-06-14 15:59:03 -0400205 });
Adrian Roosef7a4022017-01-19 14:48:35 -0800206 }
207
Adrian Roos02de4982017-02-11 09:35:54 +0100208 @Test
Jason Monk5ecf80c2017-07-06 15:28:17 -0400209 public void testSetBouncerShowing_noCrash() {
210 mStatusBar.mCommandQueue = mock(CommandQueue.class);
211 mStatusBar.setBouncerShowing(true);
212 }
213
214 @Test
Adrian Roosef7a4022017-01-19 14:48:35 -0800215 public void executeRunnableDismissingKeyguard_nullRunnable_showingAndOccluded() {
216 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
217 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(true);
218
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500219 mStatusBar.executeRunnableDismissingKeyguard(null, null, false, false, false);
Adrian Roosef7a4022017-01-19 14:48:35 -0800220 }
221
Adrian Roos02de4982017-02-11 09:35:54 +0100222 @Test
Adrian Roosef7a4022017-01-19 14:48:35 -0800223 public void executeRunnableDismissingKeyguard_nullRunnable_showing() {
224 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
225 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
226
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500227 mStatusBar.executeRunnableDismissingKeyguard(null, null, false, false, false);
Adrian Roosef7a4022017-01-19 14:48:35 -0800228 }
229
Adrian Roos02de4982017-02-11 09:35:54 +0100230 @Test
Adrian Roosef7a4022017-01-19 14:48:35 -0800231 public void executeRunnableDismissingKeyguard_nullRunnable_notShowing() {
232 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(false);
233 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
234
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500235 mStatusBar.executeRunnableDismissingKeyguard(null, null, false, false, false);
Adrian Roosef7a4022017-01-19 14:48:35 -0800236 }
237
Adrian Roos02de4982017-02-11 09:35:54 +0100238 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500239 public void lockscreenStateMetrics_notShowing() {
240 // uninteresting state, except that fingerprint must be non-zero
241 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
242 when(mUnlockMethodCache.canSkipBouncer()).thenReturn(true);
243 // interesting state
244 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(false);
245 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false);
246 when(mUnlockMethodCache.isMethodSecure()).thenReturn(false);
Chris Wren27a52fa2017-02-01 14:21:43 -0500247 mStatusBar.onKeyguardViewManagerStatesUpdated();
248
Chris Wrenef319902017-03-07 17:58:31 -0500249 MetricsAsserts.assertHasLog("missing hidden insecure lockscreen log",
250 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500251 new LogMaker(MetricsEvent.LOCKSCREEN)
252 .setType(MetricsEvent.TYPE_CLOSE)
253 .setSubtype(0));
254 }
255
Adrian Roos02de4982017-02-11 09:35:54 +0100256 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500257 public void lockscreenStateMetrics_notShowing_secure() {
258 // uninteresting state, except that fingerprint must be non-zero
259 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
260 when(mUnlockMethodCache.canSkipBouncer()).thenReturn(true);
261 // interesting state
262 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(false);
263 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false);
264 when(mUnlockMethodCache.isMethodSecure()).thenReturn(true);
265
266 mStatusBar.onKeyguardViewManagerStatesUpdated();
267
Chris Wrenef319902017-03-07 17:58:31 -0500268 MetricsAsserts.assertHasLog("missing hidden secure lockscreen log",
269 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500270 new LogMaker(MetricsEvent.LOCKSCREEN)
271 .setType(MetricsEvent.TYPE_CLOSE)
272 .setSubtype(1));
273 }
274
Adrian Roos02de4982017-02-11 09:35:54 +0100275 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500276 public void lockscreenStateMetrics_isShowing() {
277 // uninteresting state, except that fingerprint must be non-zero
278 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
279 when(mUnlockMethodCache.canSkipBouncer()).thenReturn(true);
280 // interesting state
281 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
282 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false);
283 when(mUnlockMethodCache.isMethodSecure()).thenReturn(false);
284
285 mStatusBar.onKeyguardViewManagerStatesUpdated();
286
Chris Wrenef319902017-03-07 17:58:31 -0500287 MetricsAsserts.assertHasLog("missing insecure lockscreen showing",
288 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500289 new LogMaker(MetricsEvent.LOCKSCREEN)
290 .setType(MetricsEvent.TYPE_OPEN)
291 .setSubtype(0));
292 }
293
Adrian Roos02de4982017-02-11 09:35:54 +0100294 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500295 public void lockscreenStateMetrics_isShowing_secure() {
296 // uninteresting state, except that fingerprint must be non-zero
297 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
298 when(mUnlockMethodCache.canSkipBouncer()).thenReturn(true);
299 // interesting state
300 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
301 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false);
302 when(mUnlockMethodCache.isMethodSecure()).thenReturn(true);
303
304 mStatusBar.onKeyguardViewManagerStatesUpdated();
305
Chris Wrenef319902017-03-07 17:58:31 -0500306 MetricsAsserts.assertHasLog("missing secure lockscreen showing log",
307 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500308 new LogMaker(MetricsEvent.LOCKSCREEN)
309 .setType(MetricsEvent.TYPE_OPEN)
310 .setSubtype(1));
311 }
312
Adrian Roos02de4982017-02-11 09:35:54 +0100313 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500314 public void lockscreenStateMetrics_isShowingBouncer() {
315 // uninteresting state, except that fingerprint must be non-zero
316 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
317 when(mUnlockMethodCache.canSkipBouncer()).thenReturn(true);
318 // interesting state
319 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
320 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(true);
321 when(mUnlockMethodCache.isMethodSecure()).thenReturn(true);
322
323 mStatusBar.onKeyguardViewManagerStatesUpdated();
324
Chris Wrenef319902017-03-07 17:58:31 -0500325 MetricsAsserts.assertHasLog("missing bouncer log",
326 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500327 new LogMaker(MetricsEvent.BOUNCER)
328 .setType(MetricsEvent.TYPE_OPEN)
329 .setSubtype(1));
330 }
331
Adrian Roos02de4982017-02-11 09:35:54 +0100332 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500333 public void onActivatedMetrics() {
334 ActivatableNotificationView view = mock(ActivatableNotificationView.class);
335 mStatusBar.onActivated(view);
336
Chris Wrenef319902017-03-07 17:58:31 -0500337 MetricsAsserts.assertHasLog("missing lockscreen note tap log",
338 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500339 new LogMaker(MetricsEvent.ACTION_LS_NOTE)
340 .setType(MetricsEvent.TYPE_ACTION));
341 }
342
Julia Reynolds30203152017-05-26 13:36:31 -0400343 @Test
344 public void testShouldPeek_nonSuppressedGroupSummary() {
345 when(mPowerManager.isScreenOn()).thenReturn(true);
346 when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false);
347 when(mNotificationData.shouldSuppressScreenOn(any())).thenReturn(false);
348 when(mNotificationData.shouldFilterOut(any())).thenReturn(false);
349 when(mSystemServicesProxy.isDreaming()).thenReturn(false);
350 when(mNotificationData.getImportance(any())).thenReturn(IMPORTANCE_HIGH);
351
352 Notification n = new Notification.Builder(getContext(), "a")
353 .setGroup("a")
354 .setGroupSummary(true)
355 .setGroupAlertBehavior(Notification.GROUP_ALERT_SUMMARY)
356 .build();
357 StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, "a", 0, 0, n,
358 UserHandle.of(0), null, 0);
359 NotificationData.Entry entry = new NotificationData.Entry(sbn);
360
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900361 assertTrue(mEntryManager.shouldPeek(entry, sbn));
Julia Reynolds30203152017-05-26 13:36:31 -0400362 }
363
364 @Test
365 public void testShouldPeek_suppressedGroupSummary() {
366 when(mPowerManager.isScreenOn()).thenReturn(true);
367 when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false);
368 when(mNotificationData.shouldSuppressScreenOn(any())).thenReturn(false);
369 when(mNotificationData.shouldFilterOut(any())).thenReturn(false);
370 when(mSystemServicesProxy.isDreaming()).thenReturn(false);
371 when(mNotificationData.getImportance(any())).thenReturn(IMPORTANCE_HIGH);
372
373 Notification n = new Notification.Builder(getContext(), "a")
374 .setGroup("a")
375 .setGroupSummary(true)
376 .setGroupAlertBehavior(Notification.GROUP_ALERT_CHILDREN)
377 .build();
378 StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, "a", 0, 0, n,
379 UserHandle.of(0), null, 0);
380 NotificationData.Entry entry = new NotificationData.Entry(sbn);
381
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900382 assertFalse(mEntryManager.shouldPeek(entry, sbn));
Julia Reynolds30203152017-05-26 13:36:31 -0400383 }
384
Chris Wren621933f2017-06-14 15:59:03 -0400385 @Test
Beverly38159ce2017-07-13 16:39:24 -0400386 public void testShouldPeek_suppressedScreenOn_dozing() {
387 when(mPowerManager.isScreenOn()).thenReturn(true);
388 when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false);
389 when(mNotificationData.shouldFilterOut(any())).thenReturn(false);
390 when(mSystemServicesProxy.isDreaming()).thenReturn(false);
391 when(mNotificationData.getImportance(any())).thenReturn(IMPORTANCE_HIGH);
392
393 mStatusBar.mDozing = true;
394 when(mNotificationData.shouldSuppressScreenOn(any())).thenReturn(true);
395 when(mNotificationData.shouldSuppressScreenOff(any())).thenReturn(false);
396
397 Notification n = new Notification.Builder(getContext(), "a").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 assertTrue(mEntryManager.shouldPeek(entry, sbn));
Beverly38159ce2017-07-13 16:39:24 -0400403 }
404
405 @Test
406 public void testShouldPeek_suppressedScreenOn_noDoze() {
407 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
413 mStatusBar.mDozing = false;
414 when(mNotificationData.shouldSuppressScreenOn(any())).thenReturn(true);
415 when(mNotificationData.shouldSuppressScreenOff(any())).thenReturn(false);
416
417 Notification n = new Notification.Builder(getContext(), "a").build();
418 StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, "a", 0, 0, n,
419 UserHandle.of(0), null, 0);
420 NotificationData.Entry entry = new NotificationData.Entry(sbn);
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900421 assertFalse(mEntryManager.shouldPeek(entry, sbn));
Beverly38159ce2017-07-13 16:39:24 -0400422 }
423 @Test
424 public void testShouldPeek_suppressedScreenOff_dozing() {
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 mStatusBar.mDozing = true;
432 when(mNotificationData.shouldSuppressScreenOn(any())).thenReturn(false);
433 when(mNotificationData.shouldSuppressScreenOff(any())).thenReturn(true);
434
435 Notification n = new Notification.Builder(getContext(), "a").build();
436 StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, "a", 0, 0, n,
437 UserHandle.of(0), null, 0);
438 NotificationData.Entry entry = new NotificationData.Entry(sbn);
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900439 assertFalse(mEntryManager.shouldPeek(entry, sbn));
Beverly38159ce2017-07-13 16:39:24 -0400440 }
441
442 @Test
443 public void testShouldPeek_suppressedScreenOff_noDoze() {
444 when(mPowerManager.isScreenOn()).thenReturn(true);
445 when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false);
446 when(mNotificationData.shouldFilterOut(any())).thenReturn(false);
447 when(mSystemServicesProxy.isDreaming()).thenReturn(false);
448 when(mNotificationData.getImportance(any())).thenReturn(IMPORTANCE_HIGH);
449
450 mStatusBar.mDozing = false;
451 when(mNotificationData.shouldSuppressScreenOn(any())).thenReturn(false);
452 when(mNotificationData.shouldSuppressScreenOff(any())).thenReturn(true);
453
454 Notification n = new Notification.Builder(getContext(), "a").build();
455 StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, "a", 0, 0, n,
456 UserHandle.of(0), null, 0);
457 NotificationData.Entry entry = new NotificationData.Entry(sbn);
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900458 assertTrue(mEntryManager.shouldPeek(entry, sbn));
Beverly38159ce2017-07-13 16:39:24 -0400459 }
460
461
462 @Test
Chris Wren621933f2017-06-14 15:59:03 -0400463 public void testLogHidden() {
464 try {
465 mStatusBar.handleVisibleToUserChanged(false);
Selim Cinek1a891a92017-12-04 17:41:27 +0100466 waitForUiOffloadThread();
Chris Wren621933f2017-06-14 15:59:03 -0400467 verify(mBarService, times(1)).onPanelHidden();
468 verify(mBarService, never()).onPanelRevealed(anyBoolean(), anyInt());
469 } catch (RemoteException e) {
470 fail();
471 }
472 }
473
474 @Test
475 public void testPanelOpenForPeek() {
476 when(mHeadsUpManager.hasPinnedHeadsUp()).thenReturn(true);
477 when(mNotificationData.getActiveNotifications()).thenReturn(mNotificationList);
478 when(mNotificationList.size()).thenReturn(5);
479 when(mNotificationPanelView.isFullyCollapsed()).thenReturn(true);
480 mStatusBar.setBarStateForTest(StatusBarState.SHADE);
481
482 try {
483 mStatusBar.handleVisibleToUserChanged(true);
Selim Cinek1a891a92017-12-04 17:41:27 +0100484 waitForUiOffloadThread();
Chris Wren621933f2017-06-14 15:59:03 -0400485 verify(mBarService, never()).onPanelHidden();
486 verify(mBarService, times(1)).onPanelRevealed(false, 1);
487 } catch (RemoteException e) {
488 fail();
489 }
490 TestableLooper.get(this).processAllMessages();
491 }
492
493 @Test
494 public void testPanelOpenAndClear() {
495 when(mHeadsUpManager.hasPinnedHeadsUp()).thenReturn(false);
496 when(mNotificationData.getActiveNotifications()).thenReturn(mNotificationList);
497 when(mNotificationList.size()).thenReturn(5);
498 when(mNotificationPanelView.isFullyCollapsed()).thenReturn(false);
499 mStatusBar.setBarStateForTest(StatusBarState.SHADE);
500
501 try {
502 mStatusBar.handleVisibleToUserChanged(true);
Selim Cinek1a891a92017-12-04 17:41:27 +0100503 waitForUiOffloadThread();
Chris Wren621933f2017-06-14 15:59:03 -0400504 verify(mBarService, never()).onPanelHidden();
505 verify(mBarService, times(1)).onPanelRevealed(true, 5);
506 } catch (RemoteException e) {
507 fail();
508 }
509 TestableLooper.get(this).processAllMessages();
510 }
511
512 @Test
513 public void testPanelOpenAndNoClear() {
514 when(mHeadsUpManager.hasPinnedHeadsUp()).thenReturn(false);
515 when(mNotificationData.getActiveNotifications()).thenReturn(mNotificationList);
516 when(mNotificationList.size()).thenReturn(5);
517 when(mNotificationPanelView.isFullyCollapsed()).thenReturn(false);
518 mStatusBar.setBarStateForTest(StatusBarState.KEYGUARD);
519
520 try {
521 mStatusBar.handleVisibleToUserChanged(true);
Selim Cinek1a891a92017-12-04 17:41:27 +0100522 waitForUiOffloadThread();
Chris Wren621933f2017-06-14 15:59:03 -0400523 verify(mBarService, never()).onPanelHidden();
524 verify(mBarService, times(1)).onPanelRevealed(false, 5);
525 } catch (RemoteException e) {
526 fail();
527 }
528 TestableLooper.get(this).processAllMessages();
529 }
530
Jason Monk51305372017-06-22 11:41:08 -0400531 @Test
Charles He2eda2422017-09-24 17:55:21 +0100532 public void testDisableExpandStatusBar() {
533 mStatusBar.setBarStateForTest(StatusBarState.SHADE);
534 mStatusBar.setUserSetupForTest(true);
535 when(mStatusBar.isDeviceProvisioned()).thenReturn(true);
536
537 mStatusBar.disable(StatusBarManager.DISABLE_NONE,
538 StatusBarManager.DISABLE2_NOTIFICATION_SHADE, false);
539 verify(mNotificationPanelView).setQsExpansionEnabled(false);
540 mStatusBar.animateExpandNotificationsPanel();
541 verify(mNotificationPanelView, never()).expand(anyBoolean());
542 mStatusBar.animateExpandSettingsPanel(null);
543 verify(mNotificationPanelView, never()).expand(anyBoolean());
544
545 mStatusBar.disable(StatusBarManager.DISABLE_NONE, StatusBarManager.DISABLE2_NONE, false);
546 verify(mNotificationPanelView).setQsExpansionEnabled(true);
547 mStatusBar.animateExpandNotificationsPanel();
548 verify(mNotificationPanelView).expand(anyBoolean());
549 mStatusBar.animateExpandSettingsPanel(null);
550 verify(mNotificationPanelView).expand(anyBoolean());
551 }
552
553 @Test
Jason Monk51305372017-06-22 11:41:08 -0400554 public void testDump_DoesNotCrash() {
555 mStatusBar.dump(null, new PrintWriter(new ByteArrayOutputStream()), null);
556 }
557
Jason Monk9c4faa82017-08-15 09:32:27 -0400558 @Test
559 @RunWithLooper(setAsMainLooper = true)
560 public void testUpdateKeyguardState_DoesNotCrash() {
561 mStatusBar.mStatusBarWindow = mock(StatusBarWindowView.class);
562 mStatusBar.mState = StatusBarState.KEYGUARD;
563 mStatusBar.mDozeScrimController = mock(DozeScrimController.class);
564 mStatusBar.mNotificationIconAreaController = mock(NotificationIconAreaController.class);
Eliot Courtney09322282017-11-09 15:31:19 +0900565 mStatusBar.mLockscreenUserManager = mock(NotificationLockscreenUserManager.class);
566 when(mStatusBar.mLockscreenUserManager.getCurrentProfiles()).thenReturn(
567 new SparseArray<>());
Jason Monk9c4faa82017-08-15 09:32:27 -0400568 mStatusBar.updateKeyguardState(false, false);
569 }
570
Lucas Dupinc2e75462017-12-06 13:59:25 -0800571 @Test
572 public void testFingerprintNotification_UpdatesScrims() {
573 mStatusBar.mStatusBarWindowManager = mock(StatusBarWindowManager.class);
Lucas Dupinc2e75462017-12-06 13:59:25 -0800574 mStatusBar.mDozeScrimController = mock(DozeScrimController.class);
575 mStatusBar.notifyFpAuthModeChanged();
576 verify(mScrimController).transitionTo(any(), any());
577 }
578
Lucas Dupin311eac82017-12-11 14:40:07 -0800579 @Test
580 public void testFingerprintUnlock_UpdatesScrims() {
581 // Simulate unlocking from AoD with fingerprint.
582 when(mFingerprintUnlockController.getMode())
583 .thenReturn(FingerprintUnlockController.MODE_WAKE_AND_UNLOCK);
584 mStatusBar.updateScrimController();
585 verify(mScrimController).transitionTo(eq(ScrimState.UNLOCKED), any());
586 }
587
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500588 static class TestableStatusBar extends StatusBar {
Chris Wren27a52fa2017-02-01 14:21:43 -0500589 public TestableStatusBar(StatusBarKeyguardViewManager man,
590 UnlockMethodCache unlock, KeyguardIndicationController key,
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900591 NotificationStackScrollLayout stack, HeadsUpManager hum,
592 PowerManager pm, NotificationPanelView panelView,
Eliot Courtney3985ad52017-11-17 16:51:52 +0900593 IStatusBarService barService, NotificationListener notificationListener,
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900594 NotificationLogger notificationLogger,
Eliot Courtney2b4c3a02017-11-27 13:27:46 +0900595 VisualStabilityManager visualStabilityManager,
596 NotificationViewHierarchyManager viewHierarchyManager,
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900597 TestableNotificationEntryManager entryManager, ScrimController scrimController,
Selim Cinek7e222c3c2018-01-25 12:22:41 -0800598 FingerprintUnlockController fingerprintUnlockController,
599 ActivityLaunchAnimator launchAnimator) {
Adrian Roosef7a4022017-01-19 14:48:35 -0800600 mStatusBarKeyguardViewManager = man;
Chris Wren27a52fa2017-02-01 14:21:43 -0500601 mUnlockMethodCache = unlock;
602 mKeyguardIndicationController = key;
603 mStackScroller = stack;
Julia Reynolds30203152017-05-26 13:36:31 -0400604 mHeadsUpManager = hum;
Julia Reynolds30203152017-05-26 13:36:31 -0400605 mPowerManager = pm;
Jorim Jaggifd3b1a12017-06-06 17:04:19 -0700606 mNotificationPanel = panelView;
Chris Wren621933f2017-06-14 15:59:03 -0400607 mBarService = barService;
Eliot Courtney3985ad52017-11-17 16:51:52 +0900608 mNotificationListener = notificationListener;
609 mNotificationLogger = notificationLogger;
Adrian Roos6d5ebb72017-08-03 15:10:22 +0200610 mWakefulnessLifecycle = createAwakeWakefulnessLifecycle();
Eliot Courtney2b4c3a02017-11-27 13:27:46 +0900611 mVisualStabilityManager = visualStabilityManager;
612 mViewHierarchyManager = viewHierarchyManager;
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900613 mEntryManager = entryManager;
Lucas Dupinc2e75462017-12-06 13:59:25 -0800614 mScrimController = scrimController;
Lucas Dupin311eac82017-12-11 14:40:07 -0800615 mFingerprintUnlockController = fingerprintUnlockController;
Selim Cinek7e222c3c2018-01-25 12:22:41 -0800616 mActivityLaunchAnimator = launchAnimator;
Adrian Roos6d5ebb72017-08-03 15:10:22 +0200617 }
618
619 private WakefulnessLifecycle createAwakeWakefulnessLifecycle() {
620 WakefulnessLifecycle wakefulnessLifecycle = new WakefulnessLifecycle();
621 wakefulnessLifecycle.dispatchStartedWakingUp();
622 wakefulnessLifecycle.dispatchFinishedWakingUp();
623 return wakefulnessLifecycle;
Adrian Roosef7a4022017-01-19 14:48:35 -0800624 }
625
Jason Monk9c4faa82017-08-15 09:32:27 -0400626 @Override
627 protected void updateTheme() {
628 // Do nothing for now, until we have more mocking and StatusBar is smaller.
629 }
630
Chris Wren621933f2017-06-14 15:59:03 -0400631 public void setBarStateForTest(int state) {
632 mState = state;
Adrian Roosef7a4022017-01-19 14:48:35 -0800633 }
Charles He2eda2422017-09-24 17:55:21 +0100634
635 public void setUserSetupForTest(boolean userSetup) {
636 mUserSetup = userSetup;
637 }
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900638
639 }
640
641 private class TestableNotificationEntryManager extends NotificationEntryManager {
642
Eliot Courtney6c313d32017-12-14 19:57:51 +0900643 public TestableNotificationEntryManager(SystemServicesProxy systemServicesProxy,
644 PowerManager powerManager, Context context) {
645 super(context);
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900646 mSystemServicesProxy = systemServicesProxy;
647 mPowerManager = powerManager;
648 }
649
650 public void setUpForTest(NotificationPresenter presenter,
Eliot Courtney2b4c3a02017-11-27 13:27:46 +0900651 NotificationListContainer listContainer,
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900652 Callback callback,
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900653 HeadsUpManager headsUpManager,
654 NotificationData notificationData) {
Eliot Courtney2b4c3a02017-11-27 13:27:46 +0900655 super.setUpWithPresenter(presenter, listContainer, callback, headsUpManager);
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900656 mNotificationData = notificationData;
657 mUseHeadsUp = true;
658 }
Adrian Roosef7a4022017-01-19 14:48:35 -0800659 }
Eliot Courtney09322282017-11-09 15:31:19 +0900660}