blob: db6647c10acad7f91ee01a88d7589802eaa7f864 [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;
Jorim Jaggifd3b1a12017-06-06 17:04:19 -070075 NotificationPanelView mNotificationPanelView;
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);
Jorim Jaggifd3b1a12017-06-06 17:04:19 -070088 mNotificationPanelView = mock(NotificationPanelView.class);
Julia Reynolds30203152017-05-26 13:36:31 -040089 IPowerManager powerManagerService = mock(IPowerManager.class);
90 HandlerThread handlerThread = new HandlerThread("TestThread");
91 handlerThread.start();
92 mPowerManager = new PowerManager(mContext, powerManagerService,
93 new Handler(handlerThread.getLooper()));
94 when(powerManagerService.isInteractive()).thenReturn(true);
95
Jason Monk8c09ac72017-03-16 11:53:40 -040096 mDependency.injectTestDependency(MetricsLogger.class, mMetricsLogger);
Chris Wren27a52fa2017-02-01 14:21:43 -050097 mStatusBar = new TestableStatusBar(mStatusBarKeyguardViewManager, mUnlockMethodCache,
Julia Reynolds30203152017-05-26 13:36:31 -040098 mKeyguardIndicationController, mStackScroller, mHeadsUpManager,
Jorim Jaggifd3b1a12017-06-06 17:04:19 -070099 mNotificationData, mPowerManager, mSystemServicesProxy, mNotificationPanelView);
Adrian Roosef7a4022017-01-19 14:48:35 -0800100
101 doAnswer(invocation -> {
102 OnDismissAction onDismissAction = (OnDismissAction) invocation.getArguments()[0];
103 onDismissAction.onDismiss();
104 return null;
105 }).when(mStatusBarKeyguardViewManager).dismissWithAction(any(), any(), anyBoolean());
106
107 doAnswer(invocation -> {
108 Runnable runnable = (Runnable) invocation.getArguments()[0];
109 runnable.run();
110 return null;
111 }).when(mStatusBarKeyguardViewManager).addAfterKeyguardGoneRunnable(any());
Chris Wren27a52fa2017-02-01 14:21:43 -0500112
113 when(mStackScroller.getActivatedChild()).thenReturn(null);
Adrian Roosef7a4022017-01-19 14:48:35 -0800114 }
115
Adrian Roos02de4982017-02-11 09:35:54 +0100116 @Test
Adrian Roosef7a4022017-01-19 14:48:35 -0800117 public void executeRunnableDismissingKeyguard_nullRunnable_showingAndOccluded() {
118 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
119 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(true);
120
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500121 mStatusBar.executeRunnableDismissingKeyguard(null, null, false, false, false);
Adrian Roosef7a4022017-01-19 14:48:35 -0800122 }
123
Adrian Roos02de4982017-02-11 09:35:54 +0100124 @Test
Adrian Roosef7a4022017-01-19 14:48:35 -0800125 public void executeRunnableDismissingKeyguard_nullRunnable_showing() {
126 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
127 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
128
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500129 mStatusBar.executeRunnableDismissingKeyguard(null, null, false, false, false);
Adrian Roosef7a4022017-01-19 14:48:35 -0800130 }
131
Adrian Roos02de4982017-02-11 09:35:54 +0100132 @Test
Adrian Roosef7a4022017-01-19 14:48:35 -0800133 public void executeRunnableDismissingKeyguard_nullRunnable_notShowing() {
134 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(false);
135 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
136
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500137 mStatusBar.executeRunnableDismissingKeyguard(null, null, false, false, false);
Adrian Roosef7a4022017-01-19 14:48:35 -0800138 }
139
Adrian Roos02de4982017-02-11 09:35:54 +0100140 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500141 public void lockscreenStateMetrics_notShowing() {
142 // uninteresting state, except that fingerprint must be non-zero
143 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
144 when(mUnlockMethodCache.canSkipBouncer()).thenReturn(true);
145 // interesting state
146 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(false);
147 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false);
148 when(mUnlockMethodCache.isMethodSecure()).thenReturn(false);
Chris Wren27a52fa2017-02-01 14:21:43 -0500149 mStatusBar.onKeyguardViewManagerStatesUpdated();
150
Chris Wrenef319902017-03-07 17:58:31 -0500151 MetricsAsserts.assertHasLog("missing hidden insecure lockscreen log",
152 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500153 new LogMaker(MetricsEvent.LOCKSCREEN)
154 .setType(MetricsEvent.TYPE_CLOSE)
155 .setSubtype(0));
156 }
157
Adrian Roos02de4982017-02-11 09:35:54 +0100158 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500159 public void lockscreenStateMetrics_notShowing_secure() {
160 // uninteresting state, except that fingerprint must be non-zero
161 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
162 when(mUnlockMethodCache.canSkipBouncer()).thenReturn(true);
163 // interesting state
164 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(false);
165 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false);
166 when(mUnlockMethodCache.isMethodSecure()).thenReturn(true);
167
168 mStatusBar.onKeyguardViewManagerStatesUpdated();
169
Chris Wrenef319902017-03-07 17:58:31 -0500170 MetricsAsserts.assertHasLog("missing hidden secure lockscreen log",
171 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500172 new LogMaker(MetricsEvent.LOCKSCREEN)
173 .setType(MetricsEvent.TYPE_CLOSE)
174 .setSubtype(1));
175 }
176
Adrian Roos02de4982017-02-11 09:35:54 +0100177 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500178 public void lockscreenStateMetrics_isShowing() {
179 // uninteresting state, except that fingerprint must be non-zero
180 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
181 when(mUnlockMethodCache.canSkipBouncer()).thenReturn(true);
182 // interesting state
183 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
184 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false);
185 when(mUnlockMethodCache.isMethodSecure()).thenReturn(false);
186
187 mStatusBar.onKeyguardViewManagerStatesUpdated();
188
Chris Wrenef319902017-03-07 17:58:31 -0500189 MetricsAsserts.assertHasLog("missing insecure lockscreen showing",
190 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500191 new LogMaker(MetricsEvent.LOCKSCREEN)
192 .setType(MetricsEvent.TYPE_OPEN)
193 .setSubtype(0));
194 }
195
Adrian Roos02de4982017-02-11 09:35:54 +0100196 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500197 public void lockscreenStateMetrics_isShowing_secure() {
198 // uninteresting state, except that fingerprint must be non-zero
199 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
200 when(mUnlockMethodCache.canSkipBouncer()).thenReturn(true);
201 // interesting state
202 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
203 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false);
204 when(mUnlockMethodCache.isMethodSecure()).thenReturn(true);
205
206 mStatusBar.onKeyguardViewManagerStatesUpdated();
207
Chris Wrenef319902017-03-07 17:58:31 -0500208 MetricsAsserts.assertHasLog("missing secure lockscreen showing log",
209 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500210 new LogMaker(MetricsEvent.LOCKSCREEN)
211 .setType(MetricsEvent.TYPE_OPEN)
212 .setSubtype(1));
213 }
214
Adrian Roos02de4982017-02-11 09:35:54 +0100215 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500216 public void lockscreenStateMetrics_isShowingBouncer() {
217 // uninteresting state, except that fingerprint must be non-zero
218 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
219 when(mUnlockMethodCache.canSkipBouncer()).thenReturn(true);
220 // interesting state
221 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
222 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(true);
223 when(mUnlockMethodCache.isMethodSecure()).thenReturn(true);
224
225 mStatusBar.onKeyguardViewManagerStatesUpdated();
226
Chris Wrenef319902017-03-07 17:58:31 -0500227 MetricsAsserts.assertHasLog("missing bouncer log",
228 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500229 new LogMaker(MetricsEvent.BOUNCER)
230 .setType(MetricsEvent.TYPE_OPEN)
231 .setSubtype(1));
232 }
233
Adrian Roos02de4982017-02-11 09:35:54 +0100234 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500235 public void onActivatedMetrics() {
236 ActivatableNotificationView view = mock(ActivatableNotificationView.class);
237 mStatusBar.onActivated(view);
238
Chris Wrenef319902017-03-07 17:58:31 -0500239 MetricsAsserts.assertHasLog("missing lockscreen note tap log",
240 mMetricsLogger.getLogs(),
Chris Wren27a52fa2017-02-01 14:21:43 -0500241 new LogMaker(MetricsEvent.ACTION_LS_NOTE)
242 .setType(MetricsEvent.TYPE_ACTION));
243 }
244
Julia Reynolds30203152017-05-26 13:36:31 -0400245 @Test
246 public void testShouldPeek_nonSuppressedGroupSummary() {
247 when(mPowerManager.isScreenOn()).thenReturn(true);
248 when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false);
249 when(mNotificationData.shouldSuppressScreenOn(any())).thenReturn(false);
250 when(mNotificationData.shouldFilterOut(any())).thenReturn(false);
251 when(mSystemServicesProxy.isDreaming()).thenReturn(false);
252 when(mNotificationData.getImportance(any())).thenReturn(IMPORTANCE_HIGH);
253
254 Notification n = new Notification.Builder(getContext(), "a")
255 .setGroup("a")
256 .setGroupSummary(true)
257 .setGroupAlertBehavior(Notification.GROUP_ALERT_SUMMARY)
258 .build();
259 StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, "a", 0, 0, n,
260 UserHandle.of(0), null, 0);
261 NotificationData.Entry entry = new NotificationData.Entry(sbn);
262
263 assertTrue(mStatusBar.shouldPeek(entry, sbn));
264 }
265
266 @Test
267 public void testShouldPeek_suppressedGroupSummary() {
268 when(mPowerManager.isScreenOn()).thenReturn(true);
269 when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false);
270 when(mNotificationData.shouldSuppressScreenOn(any())).thenReturn(false);
271 when(mNotificationData.shouldFilterOut(any())).thenReturn(false);
272 when(mSystemServicesProxy.isDreaming()).thenReturn(false);
273 when(mNotificationData.getImportance(any())).thenReturn(IMPORTANCE_HIGH);
274
275 Notification n = new Notification.Builder(getContext(), "a")
276 .setGroup("a")
277 .setGroupSummary(true)
278 .setGroupAlertBehavior(Notification.GROUP_ALERT_CHILDREN)
279 .build();
280 StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, "a", 0, 0, n,
281 UserHandle.of(0), null, 0);
282 NotificationData.Entry entry = new NotificationData.Entry(sbn);
283
284 assertFalse(mStatusBar.shouldPeek(entry, sbn));
285 }
286
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500287 static class TestableStatusBar extends StatusBar {
Chris Wren27a52fa2017-02-01 14:21:43 -0500288 public TestableStatusBar(StatusBarKeyguardViewManager man,
289 UnlockMethodCache unlock, KeyguardIndicationController key,
Julia Reynolds30203152017-05-26 13:36:31 -0400290 NotificationStackScrollLayout stack, HeadsUpManager hum, NotificationData nd,
Jorim Jaggifd3b1a12017-06-06 17:04:19 -0700291 PowerManager pm, SystemServicesProxy ssp, NotificationPanelView panelView) {
Adrian Roosef7a4022017-01-19 14:48:35 -0800292 mStatusBarKeyguardViewManager = man;
Chris Wren27a52fa2017-02-01 14:21:43 -0500293 mUnlockMethodCache = unlock;
294 mKeyguardIndicationController = key;
295 mStackScroller = stack;
Julia Reynolds30203152017-05-26 13:36:31 -0400296 mHeadsUpManager = hum;
297 mNotificationData = nd;
298 mUseHeadsUp = true;
299 mPowerManager = pm;
300 mSystemServicesProxy = ssp;
Jorim Jaggifd3b1a12017-06-06 17:04:19 -0700301 mNotificationPanel = panelView;
Adrian Roosef7a4022017-01-19 14:48:35 -0800302 }
303
304 @Override
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500305 protected H createHandler() {
Adrian Roosef7a4022017-01-19 14:48:35 -0800306 return null;
307 }
308 }
Adrian Roos02de4982017-02-11 09:35:54 +0100309}