blob: 55ec3079bdbb56a2cb18cc76b52feda04f99529d [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;
23
Adrian Roosef7a4022017-01-19 14:48:35 -080024import static org.mockito.Matchers.any;
25import static org.mockito.Matchers.anyBoolean;
Julia Reynolds30203152017-05-26 13:36:31 -040026import static org.mockito.Matchers.anyString;
Adrian Roosef7a4022017-01-19 14:48:35 -080027import static org.mockito.Mockito.doAnswer;
28import static org.mockito.Mockito.mock;
29import static org.mockito.Mockito.when;
30
Julia Reynolds30203152017-05-26 13:36:31 -040031import android.app.Notification;
Chris Wren27a52fa2017-02-01 14:21:43 -050032import android.metrics.LogMaker;
Julia Reynolds30203152017-05-26 13:36:31 -040033import android.os.Handler;
34import android.os.HandlerThread;
35import android.os.IPowerManager;
36import android.os.Looper;
37import android.os.PowerManager;
38import android.os.UserHandle;
39import android.service.notification.StatusBarNotification;
Adrian Roosef7a4022017-01-19 14:48:35 -080040import android.support.test.filters.SmallTest;
Chris Wren27a52fa2017-02-01 14:21:43 -050041import android.support.test.metricshelper.MetricsAsserts;
Adrian Roosef7a4022017-01-19 14:48:35 -080042import android.support.test.runner.AndroidJUnit4;
Chris Wren27a52fa2017-02-01 14:21:43 -050043import android.util.DisplayMetrics;
Adrian Roosef7a4022017-01-19 14:48:35 -080044
Chris Wrenef319902017-03-07 17:58:31 -050045import com.android.internal.logging.MetricsLogger;
Chris Wren27a52fa2017-02-01 14:21:43 -050046import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
Chris Wrenef319902017-03-07 17:58:31 -050047import com.android.internal.logging.testing.FakeMetricsLogger;
Adrian Roosef7a4022017-01-19 14:48:35 -080048import com.android.keyguard.KeyguardHostView.OnDismissAction;
49import com.android.systemui.SysuiTestCase;
Julia Reynolds30203152017-05-26 13:36:31 -040050import com.android.systemui.recents.misc.SystemServicesProxy;
Chris Wren27a52fa2017-02-01 14:21:43 -050051import com.android.systemui.statusbar.ActivatableNotificationView;
52import com.android.systemui.statusbar.KeyguardIndicationController;
53import com.android.systemui.statusbar.NotificationData;
Julia Reynolds30203152017-05-26 13:36:31 -040054import com.android.systemui.statusbar.policy.HeadsUpManager;
Chris Wren27a52fa2017-02-01 14:21:43 -050055import com.android.systemui.statusbar.stack.NotificationStackScrollLayout;
Adrian Roosef7a4022017-01-19 14:48:35 -080056
57import org.junit.Before;
58import org.junit.Test;
59import org.junit.runner.RunWith;
60
Adrian Roos02de4982017-02-11 09:35:54 +010061@SmallTest
62@RunWith(AndroidJUnit4.class)
Jason Monk2a6ea9c2017-01-26 11:14:51 -050063public class StatusBarTest extends SysuiTestCase {
Adrian Roosef7a4022017-01-19 14:48:35 -080064
65 StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
Chris Wren27a52fa2017-02-01 14:21:43 -050066 UnlockMethodCache mUnlockMethodCache;
67 KeyguardIndicationController mKeyguardIndicationController;
68 NotificationStackScrollLayout mStackScroller;
Jason Monk2a6ea9c2017-01-26 11:14:51 -050069 StatusBar mStatusBar;
Chris Wrenef319902017-03-07 17:58:31 -050070 FakeMetricsLogger mMetricsLogger;
Julia Reynolds30203152017-05-26 13:36:31 -040071 HeadsUpManager mHeadsUpManager;
72 NotificationData mNotificationData;
73 PowerManager mPowerManager;
74 SystemServicesProxy mSystemServicesProxy;
Adrian Roosef7a4022017-01-19 14:48:35 -080075
Chris Wren27a52fa2017-02-01 14:21:43 -050076 private DisplayMetrics mDisplayMetrics = new DisplayMetrics();
77
Adrian Roos02de4982017-02-11 09:35:54 +010078 @Before
Julia Reynolds30203152017-05-26 13:36:31 -040079 public void setup() throws Exception {
Adrian Roosef7a4022017-01-19 14:48:35 -080080 mStatusBarKeyguardViewManager = mock(StatusBarKeyguardViewManager.class);
Chris Wren27a52fa2017-02-01 14:21:43 -050081 mUnlockMethodCache = mock(UnlockMethodCache.class);
82 mKeyguardIndicationController = mock(KeyguardIndicationController.class);
83 mStackScroller = mock(NotificationStackScrollLayout.class);
Chris Wrenef319902017-03-07 17:58:31 -050084 mMetricsLogger = new FakeMetricsLogger();
Julia Reynolds30203152017-05-26 13:36:31 -040085 mHeadsUpManager = mock(HeadsUpManager.class);
86 mNotificationData = mock(NotificationData.class);
87 mSystemServicesProxy = mock(SystemServicesProxy.class);
88 IPowerManager powerManagerService = mock(IPowerManager.class);
89 HandlerThread handlerThread = new HandlerThread("TestThread");
90 handlerThread.start();
91 mPowerManager = new PowerManager(mContext, powerManagerService,
92 new Handler(handlerThread.getLooper()));
93 when(powerManagerService.isInteractive()).thenReturn(true);
94
Jason Monk8c09ac72017-03-16 11:53:40 -040095 mDependency.injectTestDependency(MetricsLogger.class, mMetricsLogger);
Chris Wren27a52fa2017-02-01 14:21:43 -050096 mStatusBar = new TestableStatusBar(mStatusBarKeyguardViewManager, mUnlockMethodCache,
Julia Reynolds30203152017-05-26 13:36:31 -040097 mKeyguardIndicationController, mStackScroller, mHeadsUpManager,
98 mNotificationData, mPowerManager, mSystemServicesProxy);
Adrian Roosef7a4022017-01-19 14:48:35 -080099
100 doAnswer(invocation -> {
101 OnDismissAction onDismissAction = (OnDismissAction) invocation.getArguments()[0];
102 onDismissAction.onDismiss();
103 return null;
104 }).when(mStatusBarKeyguardViewManager).dismissWithAction(any(), any(), anyBoolean());
105
106 doAnswer(invocation -> {
107 Runnable runnable = (Runnable) invocation.getArguments()[0];
108 runnable.run();
109 return null;
110 }).when(mStatusBarKeyguardViewManager).addAfterKeyguardGoneRunnable(any());
Chris Wren27a52fa2017-02-01 14:21:43 -0500111
112 when(mStackScroller.getActivatedChild()).thenReturn(null);
Adrian Roosef7a4022017-01-19 14:48:35 -0800113 }
114
Adrian Roos02de4982017-02-11 09:35:54 +0100115 @Test
Adrian Roosef7a4022017-01-19 14:48:35 -0800116 public void executeRunnableDismissingKeyguard_nullRunnable_showingAndOccluded() {
117 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
118 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(true);
119
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500120 mStatusBar.executeRunnableDismissingKeyguard(null, null, false, false, false);
Adrian Roosef7a4022017-01-19 14:48:35 -0800121 }
122
Adrian Roos02de4982017-02-11 09:35:54 +0100123 @Test
Adrian Roosef7a4022017-01-19 14:48:35 -0800124 public void executeRunnableDismissingKeyguard_nullRunnable_showing() {
125 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
126 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
127
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500128 mStatusBar.executeRunnableDismissingKeyguard(null, null, false, false, false);
Adrian Roosef7a4022017-01-19 14:48:35 -0800129 }
130
Adrian Roos02de4982017-02-11 09:35:54 +0100131 @Test
Adrian Roosef7a4022017-01-19 14:48:35 -0800132 public void executeRunnableDismissingKeyguard_nullRunnable_notShowing() {
133 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(false);
134 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
135
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500136 mStatusBar.executeRunnableDismissingKeyguard(null, null, false, false, false);
Adrian Roosef7a4022017-01-19 14:48:35 -0800137 }
138
Adrian Roos02de4982017-02-11 09:35:54 +0100139 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500140 public void lockscreenStateMetrics_notShowing() {
141 // uninteresting state, except that fingerprint must be non-zero
142 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
143 when(mUnlockMethodCache.canSkipBouncer()).thenReturn(true);
144 // interesting state
145 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(false);
146 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false);
147 when(mUnlockMethodCache.isMethodSecure()).thenReturn(false);
Chris Wren27a52fa2017-02-01 14:21:43 -0500148 mStatusBar.onKeyguardViewManagerStatesUpdated();
149
Chris Wrenef319902017-03-07 17:58:31 -0500150 MetricsAsserts.assertHasLog("missing hidden insecure lockscreen log",
151 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500152 new LogMaker(MetricsEvent.LOCKSCREEN)
153 .setType(MetricsEvent.TYPE_CLOSE)
154 .setSubtype(0));
155 }
156
Adrian Roos02de4982017-02-11 09:35:54 +0100157 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500158 public void lockscreenStateMetrics_notShowing_secure() {
159 // uninteresting state, except that fingerprint must be non-zero
160 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
161 when(mUnlockMethodCache.canSkipBouncer()).thenReturn(true);
162 // interesting state
163 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(false);
164 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false);
165 when(mUnlockMethodCache.isMethodSecure()).thenReturn(true);
166
167 mStatusBar.onKeyguardViewManagerStatesUpdated();
168
Chris Wrenef319902017-03-07 17:58:31 -0500169 MetricsAsserts.assertHasLog("missing hidden secure lockscreen log",
170 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500171 new LogMaker(MetricsEvent.LOCKSCREEN)
172 .setType(MetricsEvent.TYPE_CLOSE)
173 .setSubtype(1));
174 }
175
Adrian Roos02de4982017-02-11 09:35:54 +0100176 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500177 public void lockscreenStateMetrics_isShowing() {
178 // uninteresting state, except that fingerprint must be non-zero
179 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
180 when(mUnlockMethodCache.canSkipBouncer()).thenReturn(true);
181 // interesting state
182 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
183 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false);
184 when(mUnlockMethodCache.isMethodSecure()).thenReturn(false);
185
186 mStatusBar.onKeyguardViewManagerStatesUpdated();
187
Chris Wrenef319902017-03-07 17:58:31 -0500188 MetricsAsserts.assertHasLog("missing insecure lockscreen showing",
189 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500190 new LogMaker(MetricsEvent.LOCKSCREEN)
191 .setType(MetricsEvent.TYPE_OPEN)
192 .setSubtype(0));
193 }
194
Adrian Roos02de4982017-02-11 09:35:54 +0100195 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500196 public void lockscreenStateMetrics_isShowing_secure() {
197 // uninteresting state, except that fingerprint must be non-zero
198 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
199 when(mUnlockMethodCache.canSkipBouncer()).thenReturn(true);
200 // interesting state
201 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
202 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false);
203 when(mUnlockMethodCache.isMethodSecure()).thenReturn(true);
204
205 mStatusBar.onKeyguardViewManagerStatesUpdated();
206
Chris Wrenef319902017-03-07 17:58:31 -0500207 MetricsAsserts.assertHasLog("missing secure lockscreen showing log",
208 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500209 new LogMaker(MetricsEvent.LOCKSCREEN)
210 .setType(MetricsEvent.TYPE_OPEN)
211 .setSubtype(1));
212 }
213
Adrian Roos02de4982017-02-11 09:35:54 +0100214 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500215 public void lockscreenStateMetrics_isShowingBouncer() {
216 // uninteresting state, except that fingerprint must be non-zero
217 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
218 when(mUnlockMethodCache.canSkipBouncer()).thenReturn(true);
219 // interesting state
220 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
221 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(true);
222 when(mUnlockMethodCache.isMethodSecure()).thenReturn(true);
223
224 mStatusBar.onKeyguardViewManagerStatesUpdated();
225
Chris Wrenef319902017-03-07 17:58:31 -0500226 MetricsAsserts.assertHasLog("missing bouncer log",
227 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500228 new LogMaker(MetricsEvent.BOUNCER)
229 .setType(MetricsEvent.TYPE_OPEN)
230 .setSubtype(1));
231 }
232
Adrian Roos02de4982017-02-11 09:35:54 +0100233 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500234 public void onActivatedMetrics() {
235 ActivatableNotificationView view = mock(ActivatableNotificationView.class);
236 mStatusBar.onActivated(view);
237
Chris Wrenef319902017-03-07 17:58:31 -0500238 MetricsAsserts.assertHasLog("missing lockscreen note tap log",
239 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500240 new LogMaker(MetricsEvent.ACTION_LS_NOTE)
241 .setType(MetricsEvent.TYPE_ACTION));
242 }
243
Julia Reynolds30203152017-05-26 13:36:31 -0400244 @Test
245 public void testShouldPeek_nonSuppressedGroupSummary() {
246 when(mPowerManager.isScreenOn()).thenReturn(true);
247 when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false);
248 when(mNotificationData.shouldSuppressScreenOn(any())).thenReturn(false);
249 when(mNotificationData.shouldFilterOut(any())).thenReturn(false);
250 when(mSystemServicesProxy.isDreaming()).thenReturn(false);
251 when(mNotificationData.getImportance(any())).thenReturn(IMPORTANCE_HIGH);
252
253 Notification n = new Notification.Builder(getContext(), "a")
254 .setGroup("a")
255 .setGroupSummary(true)
256 .setGroupAlertBehavior(Notification.GROUP_ALERT_SUMMARY)
257 .build();
258 StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, "a", 0, 0, n,
259 UserHandle.of(0), null, 0);
260 NotificationData.Entry entry = new NotificationData.Entry(sbn);
261
262 assertTrue(mStatusBar.shouldPeek(entry, sbn));
263 }
264
265 @Test
266 public void testShouldPeek_suppressedGroupSummary() {
267 when(mPowerManager.isScreenOn()).thenReturn(true);
268 when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false);
269 when(mNotificationData.shouldSuppressScreenOn(any())).thenReturn(false);
270 when(mNotificationData.shouldFilterOut(any())).thenReturn(false);
271 when(mSystemServicesProxy.isDreaming()).thenReturn(false);
272 when(mNotificationData.getImportance(any())).thenReturn(IMPORTANCE_HIGH);
273
274 Notification n = new Notification.Builder(getContext(), "a")
275 .setGroup("a")
276 .setGroupSummary(true)
277 .setGroupAlertBehavior(Notification.GROUP_ALERT_CHILDREN)
278 .build();
279 StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, "a", 0, 0, n,
280 UserHandle.of(0), null, 0);
281 NotificationData.Entry entry = new NotificationData.Entry(sbn);
282
283 assertFalse(mStatusBar.shouldPeek(entry, sbn));
284 }
285
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500286 static class TestableStatusBar extends StatusBar {
Chris Wren27a52fa2017-02-01 14:21:43 -0500287 public TestableStatusBar(StatusBarKeyguardViewManager man,
288 UnlockMethodCache unlock, KeyguardIndicationController key,
Julia Reynolds30203152017-05-26 13:36:31 -0400289 NotificationStackScrollLayout stack, HeadsUpManager hum, NotificationData nd,
290 PowerManager pm, SystemServicesProxy ssp) {
Adrian Roosef7a4022017-01-19 14:48:35 -0800291 mStatusBarKeyguardViewManager = man;
Chris Wren27a52fa2017-02-01 14:21:43 -0500292 mUnlockMethodCache = unlock;
293 mKeyguardIndicationController = key;
294 mStackScroller = stack;
Julia Reynolds30203152017-05-26 13:36:31 -0400295 mHeadsUpManager = hum;
296 mNotificationData = nd;
297 mUseHeadsUp = true;
298 mPowerManager = pm;
299 mSystemServicesProxy = ssp;
Adrian Roosef7a4022017-01-19 14:48:35 -0800300 }
301
302 @Override
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500303 protected H createHandler() {
Adrian Roosef7a4022017-01-19 14:48:35 -0800304 return null;
305 }
306 }
Adrian Roos02de4982017-02-11 09:35:54 +0100307}