blob: ff545f0bd653329957e27994010663ea9a997569 [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;
Julia Reynoldsfc640012018-02-21 12:25:27 -050072import com.android.systemui.statusbar.AppOpsListener;
Jason Monk5ecf80c2017-07-06 15:28:17 -040073import com.android.systemui.statusbar.CommandQueue;
Chris Wren27a52fa2017-02-01 14:21:43 -050074import com.android.systemui.statusbar.KeyguardIndicationController;
75import com.android.systemui.statusbar.NotificationData;
Chris Wren621933f2017-06-14 15:59:03 -040076import com.android.systemui.statusbar.NotificationData.Entry;
Eliot Courtneya6d8cf22017-10-20 13:26:58 +090077import com.android.systemui.statusbar.NotificationEntryManager;
78import com.android.systemui.statusbar.NotificationGutsManager;
Eliot Courtney2b4c3a02017-11-27 13:27:46 +090079import com.android.systemui.statusbar.NotificationListContainer;
Eliot Courtney3985ad52017-11-17 16:51:52 +090080import com.android.systemui.statusbar.NotificationListener;
Eliot Courtney09322282017-11-09 15:31:19 +090081import com.android.systemui.statusbar.NotificationLockscreenUserManager;
Eliot Courtney3985ad52017-11-17 16:51:52 +090082import com.android.systemui.statusbar.NotificationLogger;
Eliot Courtneya6d8cf22017-10-20 13:26:58 +090083import com.android.systemui.statusbar.NotificationMediaManager;
84import com.android.systemui.statusbar.NotificationPresenter;
85import com.android.systemui.statusbar.NotificationRemoteInputManager;
Eliot Courtney2b4c3a02017-11-27 13:27:46 +090086import com.android.systemui.statusbar.NotificationViewHierarchyManager;
Chris Wren621933f2017-06-14 15:59:03 -040087import com.android.systemui.statusbar.StatusBarState;
Selim Cinek7e222c3c2018-01-25 12:22:41 -080088import com.android.systemui.statusbar.notification.ActivityLaunchAnimator;
Eliot Courtneya6d8cf22017-10-20 13:26:58 +090089import com.android.systemui.statusbar.notification.VisualStabilityManager;
yoshiki iguchi4e30e762018-02-06 12:09:23 +090090import com.android.systemui.statusbar.phone.HeadsUpManagerPhone;
Jason Monk9c4faa82017-08-15 09:32:27 -040091import com.android.systemui.statusbar.policy.DeviceProvisionedController;
Jason Monk9c4faa82017-08-15 09:32:27 -040092import com.android.systemui.statusbar.policy.KeyguardMonitor;
93import com.android.systemui.statusbar.policy.KeyguardMonitorImpl;
Chris Wren27a52fa2017-02-01 14:21:43 -050094import com.android.systemui.statusbar.stack.NotificationStackScrollLayout;
Adrian Roosef7a4022017-01-19 14:48:35 -080095
96import org.junit.Before;
97import org.junit.Test;
98import org.junit.runner.RunWith;
Eliot Courtney8f56b0e2017-12-14 18:54:28 +090099import org.mockito.Mock;
100import org.mockito.MockitoAnnotations;
Adrian Roosef7a4022017-01-19 14:48:35 -0800101
Jason Monk51305372017-06-22 11:41:08 -0400102import java.io.ByteArrayOutputStream;
103import java.io.PrintWriter;
Chris Wren621933f2017-06-14 15:59:03 -0400104import java.util.ArrayList;
105
Adrian Roos02de4982017-02-11 09:35:54 +0100106@SmallTest
Chris Wren621933f2017-06-14 15:59:03 -0400107@RunWith(AndroidTestingRunner.class)
108@RunWithLooper
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500109public class StatusBarTest extends SysuiTestCase {
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900110 @Mock private StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
111 @Mock private UnlockMethodCache mUnlockMethodCache;
112 @Mock private KeyguardIndicationController mKeyguardIndicationController;
113 @Mock private NotificationStackScrollLayout mStackScroller;
yoshiki iguchi4e30e762018-02-06 12:09:23 +0900114 @Mock private HeadsUpManagerPhone mHeadsUpManager;
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900115 @Mock private SystemServicesProxy mSystemServicesProxy;
116 @Mock private NotificationPanelView mNotificationPanelView;
117 @Mock private IStatusBarService mBarService;
118 @Mock private ScrimController mScrimController;
119 @Mock private ArrayList<Entry> mNotificationList;
120 @Mock private FingerprintUnlockController mFingerprintUnlockController;
121 @Mock private NotificationData mNotificationData;
Adrian Roosef7a4022017-01-19 14:48:35 -0800122
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900123 // Mock dependencies:
124 @Mock private NotificationViewHierarchyManager mViewHierarchyManager;
125 @Mock private VisualStabilityManager mVisualStabilityManager;
126 @Mock private NotificationListener mNotificationListener;
127
Eliot Courtney2b4c3a02017-11-27 13:27:46 +0900128 private TestableStatusBar mStatusBar;
129 private FakeMetricsLogger mMetricsLogger;
Eliot Courtney2b4c3a02017-11-27 13:27:46 +0900130 private PowerManager mPowerManager;
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900131 private TestableNotificationEntryManager mEntryManager;
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900132 private NotificationLogger mNotificationLogger;
Chris Wren27a52fa2017-02-01 14:21:43 -0500133
Adrian Roos02de4982017-02-11 09:35:54 +0100134 @Before
Julia Reynolds30203152017-05-26 13:36:31 -0400135 public void setup() throws Exception {
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900136 MockitoAnnotations.initMocks(this);
Jason Monk9c4faa82017-08-15 09:32:27 -0400137 mDependency.injectMockDependency(AssistManager.class);
138 mDependency.injectMockDependency(DeviceProvisionedController.class);
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900139 mDependency.injectMockDependency(NotificationGroupManager.class);
140 mDependency.injectMockDependency(NotificationGutsManager.class);
141 mDependency.injectMockDependency(NotificationRemoteInputManager.class);
142 mDependency.injectMockDependency(NotificationMediaManager.class);
143 mDependency.injectMockDependency(ForegroundServiceController.class);
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900144 mDependency.injectTestDependency(NotificationViewHierarchyManager.class,
145 mViewHierarchyManager);
146 mDependency.injectTestDependency(VisualStabilityManager.class, mVisualStabilityManager);
147 mDependency.injectTestDependency(NotificationListener.class, mNotificationListener);
Jason Monk9c4faa82017-08-15 09:32:27 -0400148 mDependency.injectTestDependency(KeyguardMonitor.class, mock(KeyguardMonitorImpl.class));
Julia Reynoldsfc640012018-02-21 12:25:27 -0500149 mDependency.injectTestDependency(AppOpsListener.class, mock(AppOpsListener.class));
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900150
Jason Monk51305372017-06-22 11:41:08 -0400151 mContext.addMockSystemService(TrustManager.class, mock(TrustManager.class));
152 mContext.addMockSystemService(FingerprintManager.class, mock(FingerprintManager.class));
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900153
Chris Wrenef319902017-03-07 17:58:31 -0500154 mMetricsLogger = new FakeMetricsLogger();
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900155 mDependency.injectTestDependency(MetricsLogger.class, mMetricsLogger);
Eliot Courtney6c313d32017-12-14 19:57:51 +0900156 mNotificationLogger = new NotificationLogger();
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900157 mDependency.injectTestDependency(NotificationLogger.class, mNotificationLogger);
158
Julia Reynolds30203152017-05-26 13:36:31 -0400159 IPowerManager powerManagerService = mock(IPowerManager.class);
160 HandlerThread handlerThread = new HandlerThread("TestThread");
161 handlerThread.start();
162 mPowerManager = new PowerManager(mContext, powerManagerService,
163 new Handler(handlerThread.getLooper()));
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900164
165 CommandQueue commandQueue = mock(CommandQueue.class);
166 when(commandQueue.asBinder()).thenReturn(new Binder());
167 mContext.putComponent(CommandQueue.class, commandQueue);
168
169 mContext.setTheme(R.style.Theme_SystemUI_Light);
170
171 when(mStackScroller.generateLayoutParams(any())).thenReturn(new LayoutParams(0, 0));
172 when(mNotificationPanelView.getLayoutParams()).thenReturn(new LayoutParams(0, 0));
Julia Reynolds30203152017-05-26 13:36:31 -0400173 when(powerManagerService.isInteractive()).thenReturn(true);
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900174 when(mStackScroller.getActivatedChild()).thenReturn(null);
Julia Reynolds30203152017-05-26 13:36:31 -0400175
Adrian Roosef7a4022017-01-19 14:48:35 -0800176 doAnswer(invocation -> {
177 OnDismissAction onDismissAction = (OnDismissAction) invocation.getArguments()[0];
178 onDismissAction.onDismiss();
179 return null;
180 }).when(mStatusBarKeyguardViewManager).dismissWithAction(any(), any(), anyBoolean());
181
182 doAnswer(invocation -> {
183 Runnable runnable = (Runnable) invocation.getArguments()[0];
184 runnable.run();
185 return null;
186 }).when(mStatusBarKeyguardViewManager).addAfterKeyguardGoneRunnable(any());
Chris Wren27a52fa2017-02-01 14:21:43 -0500187
Eliot Courtney6c313d32017-12-14 19:57:51 +0900188 mEntryManager = new TestableNotificationEntryManager(mSystemServicesProxy, mPowerManager,
189 mContext);
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900190 mStatusBar = new TestableStatusBar(mStatusBarKeyguardViewManager, mUnlockMethodCache,
191 mKeyguardIndicationController, mStackScroller, mHeadsUpManager,
192 mPowerManager, mNotificationPanelView, mBarService, mNotificationListener,
193 mNotificationLogger, mVisualStabilityManager, mViewHierarchyManager,
Selim Cinek7e222c3c2018-01-25 12:22:41 -0800194 mEntryManager, mScrimController, mFingerprintUnlockController,
195 mock(ActivityLaunchAnimator.class));
Eliot Courtney8f56b0e2017-12-14 18:54:28 +0900196 mStatusBar.mContext = mContext;
197 mStatusBar.mComponents = mContext.getComponents();
Eliot Courtney2b4c3a02017-11-27 13:27:46 +0900198 mEntryManager.setUpForTest(mStatusBar, mStackScroller, mStatusBar, mHeadsUpManager,
199 mNotificationData);
Eliot Courtney4a96b362017-12-14 19:38:52 +0900200 mNotificationLogger.setUpWithEntryManager(mEntryManager, mStackScroller);
Eliot Courtney3985ad52017-11-17 16:51:52 +0900201
Eliot Courtney3985ad52017-11-17 16:51:52 +0900202 TestableLooper.get(this).setMessageHandler(m -> {
203 if (m.getCallback() == mStatusBar.mNotificationLogger.getVisibilityReporter()) {
204 return false;
Chris Wren621933f2017-06-14 15:59:03 -0400205 }
Eliot Courtney3985ad52017-11-17 16:51:52 +0900206 return true;
Chris Wren621933f2017-06-14 15:59:03 -0400207 });
Adrian Roosef7a4022017-01-19 14:48:35 -0800208 }
209
Adrian Roos02de4982017-02-11 09:35:54 +0100210 @Test
Jason Monk5ecf80c2017-07-06 15:28:17 -0400211 public void testSetBouncerShowing_noCrash() {
212 mStatusBar.mCommandQueue = mock(CommandQueue.class);
213 mStatusBar.setBouncerShowing(true);
214 }
215
216 @Test
Adrian Roosef7a4022017-01-19 14:48:35 -0800217 public void executeRunnableDismissingKeyguard_nullRunnable_showingAndOccluded() {
218 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
219 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(true);
220
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500221 mStatusBar.executeRunnableDismissingKeyguard(null, null, false, false, false);
Adrian Roosef7a4022017-01-19 14:48:35 -0800222 }
223
Adrian Roos02de4982017-02-11 09:35:54 +0100224 @Test
Adrian Roosef7a4022017-01-19 14:48:35 -0800225 public void executeRunnableDismissingKeyguard_nullRunnable_showing() {
226 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
227 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
228
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500229 mStatusBar.executeRunnableDismissingKeyguard(null, null, false, false, false);
Adrian Roosef7a4022017-01-19 14:48:35 -0800230 }
231
Adrian Roos02de4982017-02-11 09:35:54 +0100232 @Test
Adrian Roosef7a4022017-01-19 14:48:35 -0800233 public void executeRunnableDismissingKeyguard_nullRunnable_notShowing() {
234 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(false);
235 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
236
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500237 mStatusBar.executeRunnableDismissingKeyguard(null, null, false, false, false);
Adrian Roosef7a4022017-01-19 14:48:35 -0800238 }
239
Adrian Roos02de4982017-02-11 09:35:54 +0100240 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500241 public void lockscreenStateMetrics_notShowing() {
242 // uninteresting state, except that fingerprint must be non-zero
243 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
244 when(mUnlockMethodCache.canSkipBouncer()).thenReturn(true);
245 // interesting state
246 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(false);
247 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false);
248 when(mUnlockMethodCache.isMethodSecure()).thenReturn(false);
Chris Wren27a52fa2017-02-01 14:21:43 -0500249 mStatusBar.onKeyguardViewManagerStatesUpdated();
250
Chris Wrenef319902017-03-07 17:58:31 -0500251 MetricsAsserts.assertHasLog("missing hidden insecure lockscreen log",
252 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500253 new LogMaker(MetricsEvent.LOCKSCREEN)
254 .setType(MetricsEvent.TYPE_CLOSE)
255 .setSubtype(0));
256 }
257
Adrian Roos02de4982017-02-11 09:35:54 +0100258 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500259 public void lockscreenStateMetrics_notShowing_secure() {
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(true);
267
268 mStatusBar.onKeyguardViewManagerStatesUpdated();
269
Chris Wrenef319902017-03-07 17:58:31 -0500270 MetricsAsserts.assertHasLog("missing hidden secure lockscreen log",
271 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500272 new LogMaker(MetricsEvent.LOCKSCREEN)
273 .setType(MetricsEvent.TYPE_CLOSE)
274 .setSubtype(1));
275 }
276
Adrian Roos02de4982017-02-11 09:35:54 +0100277 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500278 public void lockscreenStateMetrics_isShowing() {
279 // uninteresting state, except that fingerprint must be non-zero
280 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
281 when(mUnlockMethodCache.canSkipBouncer()).thenReturn(true);
282 // interesting state
283 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
284 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false);
285 when(mUnlockMethodCache.isMethodSecure()).thenReturn(false);
286
287 mStatusBar.onKeyguardViewManagerStatesUpdated();
288
Chris Wrenef319902017-03-07 17:58:31 -0500289 MetricsAsserts.assertHasLog("missing insecure lockscreen showing",
290 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500291 new LogMaker(MetricsEvent.LOCKSCREEN)
292 .setType(MetricsEvent.TYPE_OPEN)
293 .setSubtype(0));
294 }
295
Adrian Roos02de4982017-02-11 09:35:54 +0100296 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500297 public void lockscreenStateMetrics_isShowing_secure() {
298 // uninteresting state, except that fingerprint must be non-zero
299 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
300 when(mUnlockMethodCache.canSkipBouncer()).thenReturn(true);
301 // interesting state
302 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
303 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false);
304 when(mUnlockMethodCache.isMethodSecure()).thenReturn(true);
305
306 mStatusBar.onKeyguardViewManagerStatesUpdated();
307
Chris Wrenef319902017-03-07 17:58:31 -0500308 MetricsAsserts.assertHasLog("missing secure lockscreen showing log",
309 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500310 new LogMaker(MetricsEvent.LOCKSCREEN)
311 .setType(MetricsEvent.TYPE_OPEN)
312 .setSubtype(1));
313 }
314
Adrian Roos02de4982017-02-11 09:35:54 +0100315 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500316 public void lockscreenStateMetrics_isShowingBouncer() {
317 // uninteresting state, except that fingerprint must be non-zero
318 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
319 when(mUnlockMethodCache.canSkipBouncer()).thenReturn(true);
320 // interesting state
321 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
322 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(true);
323 when(mUnlockMethodCache.isMethodSecure()).thenReturn(true);
324
325 mStatusBar.onKeyguardViewManagerStatesUpdated();
326
Chris Wrenef319902017-03-07 17:58:31 -0500327 MetricsAsserts.assertHasLog("missing bouncer log",
328 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500329 new LogMaker(MetricsEvent.BOUNCER)
330 .setType(MetricsEvent.TYPE_OPEN)
331 .setSubtype(1));
332 }
333
Adrian Roos02de4982017-02-11 09:35:54 +0100334 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500335 public void onActivatedMetrics() {
336 ActivatableNotificationView view = mock(ActivatableNotificationView.class);
337 mStatusBar.onActivated(view);
338
Chris Wrenef319902017-03-07 17:58:31 -0500339 MetricsAsserts.assertHasLog("missing lockscreen note tap log",
340 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500341 new LogMaker(MetricsEvent.ACTION_LS_NOTE)
342 .setType(MetricsEvent.TYPE_ACTION));
343 }
344
Julia Reynolds30203152017-05-26 13:36:31 -0400345 @Test
346 public void testShouldPeek_nonSuppressedGroupSummary() {
347 when(mPowerManager.isScreenOn()).thenReturn(true);
348 when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false);
349 when(mNotificationData.shouldSuppressScreenOn(any())).thenReturn(false);
350 when(mNotificationData.shouldFilterOut(any())).thenReturn(false);
351 when(mSystemServicesProxy.isDreaming()).thenReturn(false);
352 when(mNotificationData.getImportance(any())).thenReturn(IMPORTANCE_HIGH);
353
354 Notification n = new Notification.Builder(getContext(), "a")
355 .setGroup("a")
356 .setGroupSummary(true)
357 .setGroupAlertBehavior(Notification.GROUP_ALERT_SUMMARY)
358 .build();
359 StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, "a", 0, 0, n,
360 UserHandle.of(0), null, 0);
361 NotificationData.Entry entry = new NotificationData.Entry(sbn);
362
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900363 assertTrue(mEntryManager.shouldPeek(entry, sbn));
Julia Reynolds30203152017-05-26 13:36:31 -0400364 }
365
366 @Test
367 public void testShouldPeek_suppressedGroupSummary() {
368 when(mPowerManager.isScreenOn()).thenReturn(true);
369 when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false);
370 when(mNotificationData.shouldSuppressScreenOn(any())).thenReturn(false);
371 when(mNotificationData.shouldFilterOut(any())).thenReturn(false);
372 when(mSystemServicesProxy.isDreaming()).thenReturn(false);
373 when(mNotificationData.getImportance(any())).thenReturn(IMPORTANCE_HIGH);
374
375 Notification n = new Notification.Builder(getContext(), "a")
376 .setGroup("a")
377 .setGroupSummary(true)
378 .setGroupAlertBehavior(Notification.GROUP_ALERT_CHILDREN)
379 .build();
380 StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, "a", 0, 0, n,
381 UserHandle.of(0), null, 0);
382 NotificationData.Entry entry = new NotificationData.Entry(sbn);
383
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900384 assertFalse(mEntryManager.shouldPeek(entry, sbn));
Julia Reynolds30203152017-05-26 13:36:31 -0400385 }
386
Chris Wren621933f2017-06-14 15:59:03 -0400387 @Test
Beverly38159ce2017-07-13 16:39:24 -0400388 public void testShouldPeek_suppressedScreenOn_dozing() {
389 when(mPowerManager.isScreenOn()).thenReturn(true);
390 when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false);
391 when(mNotificationData.shouldFilterOut(any())).thenReturn(false);
392 when(mSystemServicesProxy.isDreaming()).thenReturn(false);
393 when(mNotificationData.getImportance(any())).thenReturn(IMPORTANCE_HIGH);
394
395 mStatusBar.mDozing = true;
396 when(mNotificationData.shouldSuppressScreenOn(any())).thenReturn(true);
397 when(mNotificationData.shouldSuppressScreenOff(any())).thenReturn(false);
398
399 Notification n = new Notification.Builder(getContext(), "a").build();
400 StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, "a", 0, 0, n,
401 UserHandle.of(0), null, 0);
402 NotificationData.Entry entry = new NotificationData.Entry(sbn);
403
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900404 assertTrue(mEntryManager.shouldPeek(entry, sbn));
Beverly38159ce2017-07-13 16:39:24 -0400405 }
406
407 @Test
408 public void testShouldPeek_suppressedScreenOn_noDoze() {
409 when(mPowerManager.isScreenOn()).thenReturn(true);
410 when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false);
411 when(mNotificationData.shouldFilterOut(any())).thenReturn(false);
412 when(mSystemServicesProxy.isDreaming()).thenReturn(false);
413 when(mNotificationData.getImportance(any())).thenReturn(IMPORTANCE_HIGH);
414
415 mStatusBar.mDozing = false;
416 when(mNotificationData.shouldSuppressScreenOn(any())).thenReturn(true);
417 when(mNotificationData.shouldSuppressScreenOff(any())).thenReturn(false);
418
419 Notification n = new Notification.Builder(getContext(), "a").build();
420 StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, "a", 0, 0, n,
421 UserHandle.of(0), null, 0);
422 NotificationData.Entry entry = new NotificationData.Entry(sbn);
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900423 assertFalse(mEntryManager.shouldPeek(entry, sbn));
Beverly38159ce2017-07-13 16:39:24 -0400424 }
425 @Test
426 public void testShouldPeek_suppressedScreenOff_dozing() {
427 when(mPowerManager.isScreenOn()).thenReturn(true);
428 when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false);
429 when(mNotificationData.shouldFilterOut(any())).thenReturn(false);
430 when(mSystemServicesProxy.isDreaming()).thenReturn(false);
431 when(mNotificationData.getImportance(any())).thenReturn(IMPORTANCE_HIGH);
432
433 mStatusBar.mDozing = true;
434 when(mNotificationData.shouldSuppressScreenOn(any())).thenReturn(false);
435 when(mNotificationData.shouldSuppressScreenOff(any())).thenReturn(true);
436
437 Notification n = new Notification.Builder(getContext(), "a").build();
438 StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, "a", 0, 0, n,
439 UserHandle.of(0), null, 0);
440 NotificationData.Entry entry = new NotificationData.Entry(sbn);
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900441 assertFalse(mEntryManager.shouldPeek(entry, sbn));
Beverly38159ce2017-07-13 16:39:24 -0400442 }
443
444 @Test
445 public void testShouldPeek_suppressedScreenOff_noDoze() {
446 when(mPowerManager.isScreenOn()).thenReturn(true);
447 when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false);
448 when(mNotificationData.shouldFilterOut(any())).thenReturn(false);
449 when(mSystemServicesProxy.isDreaming()).thenReturn(false);
450 when(mNotificationData.getImportance(any())).thenReturn(IMPORTANCE_HIGH);
451
452 mStatusBar.mDozing = false;
453 when(mNotificationData.shouldSuppressScreenOn(any())).thenReturn(false);
454 when(mNotificationData.shouldSuppressScreenOff(any())).thenReturn(true);
455
456 Notification n = new Notification.Builder(getContext(), "a").build();
457 StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, "a", 0, 0, n,
458 UserHandle.of(0), null, 0);
459 NotificationData.Entry entry = new NotificationData.Entry(sbn);
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900460 assertTrue(mEntryManager.shouldPeek(entry, sbn));
Beverly38159ce2017-07-13 16:39:24 -0400461 }
462
463
464 @Test
Chris Wren621933f2017-06-14 15:59:03 -0400465 public void testLogHidden() {
466 try {
467 mStatusBar.handleVisibleToUserChanged(false);
Selim Cinek1a891a92017-12-04 17:41:27 +0100468 waitForUiOffloadThread();
Chris Wren621933f2017-06-14 15:59:03 -0400469 verify(mBarService, times(1)).onPanelHidden();
470 verify(mBarService, never()).onPanelRevealed(anyBoolean(), anyInt());
471 } catch (RemoteException e) {
472 fail();
473 }
474 }
475
476 @Test
477 public void testPanelOpenForPeek() {
478 when(mHeadsUpManager.hasPinnedHeadsUp()).thenReturn(true);
479 when(mNotificationData.getActiveNotifications()).thenReturn(mNotificationList);
480 when(mNotificationList.size()).thenReturn(5);
481 when(mNotificationPanelView.isFullyCollapsed()).thenReturn(true);
482 mStatusBar.setBarStateForTest(StatusBarState.SHADE);
483
484 try {
485 mStatusBar.handleVisibleToUserChanged(true);
Selim Cinek1a891a92017-12-04 17:41:27 +0100486 waitForUiOffloadThread();
Chris Wren621933f2017-06-14 15:59:03 -0400487 verify(mBarService, never()).onPanelHidden();
488 verify(mBarService, times(1)).onPanelRevealed(false, 1);
489 } catch (RemoteException e) {
490 fail();
491 }
492 TestableLooper.get(this).processAllMessages();
493 }
494
495 @Test
496 public void testPanelOpenAndClear() {
497 when(mHeadsUpManager.hasPinnedHeadsUp()).thenReturn(false);
498 when(mNotificationData.getActiveNotifications()).thenReturn(mNotificationList);
499 when(mNotificationList.size()).thenReturn(5);
500 when(mNotificationPanelView.isFullyCollapsed()).thenReturn(false);
501 mStatusBar.setBarStateForTest(StatusBarState.SHADE);
502
503 try {
504 mStatusBar.handleVisibleToUserChanged(true);
Selim Cinek1a891a92017-12-04 17:41:27 +0100505 waitForUiOffloadThread();
Chris Wren621933f2017-06-14 15:59:03 -0400506 verify(mBarService, never()).onPanelHidden();
507 verify(mBarService, times(1)).onPanelRevealed(true, 5);
508 } catch (RemoteException e) {
509 fail();
510 }
511 TestableLooper.get(this).processAllMessages();
512 }
513
514 @Test
515 public void testPanelOpenAndNoClear() {
516 when(mHeadsUpManager.hasPinnedHeadsUp()).thenReturn(false);
517 when(mNotificationData.getActiveNotifications()).thenReturn(mNotificationList);
518 when(mNotificationList.size()).thenReturn(5);
519 when(mNotificationPanelView.isFullyCollapsed()).thenReturn(false);
520 mStatusBar.setBarStateForTest(StatusBarState.KEYGUARD);
521
522 try {
523 mStatusBar.handleVisibleToUserChanged(true);
Selim Cinek1a891a92017-12-04 17:41:27 +0100524 waitForUiOffloadThread();
Chris Wren621933f2017-06-14 15:59:03 -0400525 verify(mBarService, never()).onPanelHidden();
526 verify(mBarService, times(1)).onPanelRevealed(false, 5);
527 } catch (RemoteException e) {
528 fail();
529 }
530 TestableLooper.get(this).processAllMessages();
531 }
532
Jason Monk51305372017-06-22 11:41:08 -0400533 @Test
Charles He2eda2422017-09-24 17:55:21 +0100534 public void testDisableExpandStatusBar() {
535 mStatusBar.setBarStateForTest(StatusBarState.SHADE);
536 mStatusBar.setUserSetupForTest(true);
537 when(mStatusBar.isDeviceProvisioned()).thenReturn(true);
538
539 mStatusBar.disable(StatusBarManager.DISABLE_NONE,
540 StatusBarManager.DISABLE2_NOTIFICATION_SHADE, false);
541 verify(mNotificationPanelView).setQsExpansionEnabled(false);
542 mStatusBar.animateExpandNotificationsPanel();
543 verify(mNotificationPanelView, never()).expand(anyBoolean());
544 mStatusBar.animateExpandSettingsPanel(null);
545 verify(mNotificationPanelView, never()).expand(anyBoolean());
546
547 mStatusBar.disable(StatusBarManager.DISABLE_NONE, StatusBarManager.DISABLE2_NONE, false);
548 verify(mNotificationPanelView).setQsExpansionEnabled(true);
549 mStatusBar.animateExpandNotificationsPanel();
550 verify(mNotificationPanelView).expand(anyBoolean());
551 mStatusBar.animateExpandSettingsPanel(null);
552 verify(mNotificationPanelView).expand(anyBoolean());
553 }
554
555 @Test
Jason Monk51305372017-06-22 11:41:08 -0400556 public void testDump_DoesNotCrash() {
557 mStatusBar.dump(null, new PrintWriter(new ByteArrayOutputStream()), null);
558 }
559
Jason Monk9c4faa82017-08-15 09:32:27 -0400560 @Test
561 @RunWithLooper(setAsMainLooper = true)
562 public void testUpdateKeyguardState_DoesNotCrash() {
563 mStatusBar.mStatusBarWindow = mock(StatusBarWindowView.class);
564 mStatusBar.mState = StatusBarState.KEYGUARD;
565 mStatusBar.mDozeScrimController = mock(DozeScrimController.class);
566 mStatusBar.mNotificationIconAreaController = mock(NotificationIconAreaController.class);
Eliot Courtney09322282017-11-09 15:31:19 +0900567 mStatusBar.mLockscreenUserManager = mock(NotificationLockscreenUserManager.class);
568 when(mStatusBar.mLockscreenUserManager.getCurrentProfiles()).thenReturn(
569 new SparseArray<>());
Jason Monk9c4faa82017-08-15 09:32:27 -0400570 mStatusBar.updateKeyguardState(false, false);
571 }
572
Lucas Dupinc2e75462017-12-06 13:59:25 -0800573 @Test
574 public void testFingerprintNotification_UpdatesScrims() {
575 mStatusBar.mStatusBarWindowManager = mock(StatusBarWindowManager.class);
Lucas Dupinc2e75462017-12-06 13:59:25 -0800576 mStatusBar.mDozeScrimController = mock(DozeScrimController.class);
577 mStatusBar.notifyFpAuthModeChanged();
578 verify(mScrimController).transitionTo(any(), any());
579 }
580
Lucas Dupin311eac82017-12-11 14:40:07 -0800581 @Test
582 public void testFingerprintUnlock_UpdatesScrims() {
583 // Simulate unlocking from AoD with fingerprint.
584 when(mFingerprintUnlockController.getMode())
585 .thenReturn(FingerprintUnlockController.MODE_WAKE_AND_UNLOCK);
586 mStatusBar.updateScrimController();
587 verify(mScrimController).transitionTo(eq(ScrimState.UNLOCKED), any());
588 }
589
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500590 static class TestableStatusBar extends StatusBar {
Chris Wren27a52fa2017-02-01 14:21:43 -0500591 public TestableStatusBar(StatusBarKeyguardViewManager man,
592 UnlockMethodCache unlock, KeyguardIndicationController key,
yoshiki iguchi4e30e762018-02-06 12:09:23 +0900593 NotificationStackScrollLayout stack, HeadsUpManagerPhone hum,
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900594 PowerManager pm, NotificationPanelView panelView,
Eliot Courtney3985ad52017-11-17 16:51:52 +0900595 IStatusBarService barService, NotificationListener notificationListener,
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900596 NotificationLogger notificationLogger,
Eliot Courtney2b4c3a02017-11-27 13:27:46 +0900597 VisualStabilityManager visualStabilityManager,
598 NotificationViewHierarchyManager viewHierarchyManager,
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900599 TestableNotificationEntryManager entryManager, ScrimController scrimController,
Selim Cinek7e222c3c2018-01-25 12:22:41 -0800600 FingerprintUnlockController fingerprintUnlockController,
601 ActivityLaunchAnimator launchAnimator) {
Adrian Roosef7a4022017-01-19 14:48:35 -0800602 mStatusBarKeyguardViewManager = man;
Chris Wren27a52fa2017-02-01 14:21:43 -0500603 mUnlockMethodCache = unlock;
604 mKeyguardIndicationController = key;
605 mStackScroller = stack;
Julia Reynolds30203152017-05-26 13:36:31 -0400606 mHeadsUpManager = hum;
Julia Reynolds30203152017-05-26 13:36:31 -0400607 mPowerManager = pm;
Jorim Jaggifd3b1a12017-06-06 17:04:19 -0700608 mNotificationPanel = panelView;
Chris Wren621933f2017-06-14 15:59:03 -0400609 mBarService = barService;
Eliot Courtney3985ad52017-11-17 16:51:52 +0900610 mNotificationListener = notificationListener;
611 mNotificationLogger = notificationLogger;
Adrian Roos6d5ebb72017-08-03 15:10:22 +0200612 mWakefulnessLifecycle = createAwakeWakefulnessLifecycle();
Eliot Courtney2b4c3a02017-11-27 13:27:46 +0900613 mVisualStabilityManager = visualStabilityManager;
614 mViewHierarchyManager = viewHierarchyManager;
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900615 mEntryManager = entryManager;
Lucas Dupinc2e75462017-12-06 13:59:25 -0800616 mScrimController = scrimController;
Lucas Dupin311eac82017-12-11 14:40:07 -0800617 mFingerprintUnlockController = fingerprintUnlockController;
Selim Cinek7e222c3c2018-01-25 12:22:41 -0800618 mActivityLaunchAnimator = launchAnimator;
Adrian Roos6d5ebb72017-08-03 15:10:22 +0200619 }
620
621 private WakefulnessLifecycle createAwakeWakefulnessLifecycle() {
622 WakefulnessLifecycle wakefulnessLifecycle = new WakefulnessLifecycle();
623 wakefulnessLifecycle.dispatchStartedWakingUp();
624 wakefulnessLifecycle.dispatchFinishedWakingUp();
625 return wakefulnessLifecycle;
Adrian Roosef7a4022017-01-19 14:48:35 -0800626 }
627
Jason Monk9c4faa82017-08-15 09:32:27 -0400628 @Override
629 protected void updateTheme() {
630 // Do nothing for now, until we have more mocking and StatusBar is smaller.
631 }
632
Chris Wren621933f2017-06-14 15:59:03 -0400633 public void setBarStateForTest(int state) {
634 mState = state;
Adrian Roosef7a4022017-01-19 14:48:35 -0800635 }
Charles He2eda2422017-09-24 17:55:21 +0100636
637 public void setUserSetupForTest(boolean userSetup) {
638 mUserSetup = userSetup;
639 }
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900640
641 }
642
643 private class TestableNotificationEntryManager extends NotificationEntryManager {
644
Eliot Courtney6c313d32017-12-14 19:57:51 +0900645 public TestableNotificationEntryManager(SystemServicesProxy systemServicesProxy,
646 PowerManager powerManager, Context context) {
647 super(context);
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900648 mSystemServicesProxy = systemServicesProxy;
649 mPowerManager = powerManager;
650 }
651
652 public void setUpForTest(NotificationPresenter presenter,
Eliot Courtney2b4c3a02017-11-27 13:27:46 +0900653 NotificationListContainer listContainer,
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900654 Callback callback,
yoshiki iguchi4e30e762018-02-06 12:09:23 +0900655 HeadsUpManagerPhone headsUpManager,
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900656 NotificationData notificationData) {
Eliot Courtney2b4c3a02017-11-27 13:27:46 +0900657 super.setUpWithPresenter(presenter, listContainer, callback, headsUpManager);
Eliot Courtneya6d8cf22017-10-20 13:26:58 +0900658 mNotificationData = notificationData;
659 mUseHeadsUp = true;
660 }
Adrian Roosef7a4022017-01-19 14:48:35 -0800661 }
Eliot Courtney09322282017-11-09 15:31:19 +0900662}