blob: a6e29181e4353a7e67b0b01ef5d0381b8ca67ac7 [file] [log] [blame]
Dave Mankoff1193aa42019-10-28 17:51:26 -04001/*
2 * Copyright (C) 2019 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
19import static org.junit.Assert.assertFalse;
20import static org.mockito.ArgumentMatchers.any;
21import static org.mockito.ArgumentMatchers.anyInt;
22import static org.mockito.ArgumentMatchers.eq;
23import static org.mockito.Mockito.doAnswer;
24import static org.mockito.Mockito.mock;
25import static org.mockito.Mockito.never;
26import static org.mockito.Mockito.reset;
27import static org.mockito.Mockito.verify;
28import static org.mockito.Mockito.when;
29
30import android.os.PowerManager;
31import android.testing.AndroidTestingRunner;
32import android.view.View;
33
34import androidx.test.filters.SmallTest;
35
36import com.android.keyguard.KeyguardUpdateMonitor;
37import com.android.systemui.SysuiTestCase;
38import com.android.systemui.assist.AssistManager;
Dave Mankoff1193aa42019-10-28 17:51:26 -040039import com.android.systemui.doze.DozeHost;
40import com.android.systemui.doze.DozeLog;
41import com.android.systemui.keyguard.KeyguardViewMediator;
42import com.android.systemui.keyguard.WakefulnessLifecycle;
43import com.android.systemui.statusbar.PulseExpansionHandler;
44import com.android.systemui.statusbar.StatusBarState;
45import com.android.systemui.statusbar.StatusBarStateControllerImpl;
46import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinator;
47import com.android.systemui.statusbar.notification.VisualStabilityManager;
48import com.android.systemui.statusbar.policy.BatteryController;
49import com.android.systemui.statusbar.policy.DeviceProvisionedController;
50
51import org.junit.Before;
52import org.junit.Test;
53import org.junit.runner.RunWith;
54import org.mockito.ArgumentCaptor;
55import org.mockito.Mock;
56import org.mockito.MockitoAnnotations;
57
58import java.util.Arrays;
59import java.util.Collections;
60import java.util.HashSet;
61
Dave Mankoff1193aa42019-10-28 17:51:26 -040062@SmallTest
63@RunWith(AndroidTestingRunner.class)
64public class DozeServiceHostTest extends SysuiTestCase {
65
66 private DozeServiceHost mDozeServiceHost;
67
68 @Mock private HeadsUpManagerPhone mHeadsUpManager;
69 @Mock private ScrimController mScrimController;
70 @Mock private DozeScrimController mDozeScrimController;
Dave Mankoff1193aa42019-10-28 17:51:26 -040071 @Mock private VisualStabilityManager mVisualStabilityManager;
72 @Mock private KeyguardViewMediator mKeyguardViewMediator;
73 @Mock private StatusBarStateControllerImpl mStatusBarStateController;
74 @Mock private BatteryController mBatteryController;
75 @Mock private DeviceProvisionedController mDeviceProvisionedController;
76 @Mock private KeyguardUpdateMonitor mKeyguardUpdateMonitor;
77 @Mock private AssistManager mAssistManager;
78 @Mock private DozeLog mDozeLog;
79 @Mock private PulseExpansionHandler mPulseExpansionHandler;
80 @Mock private NotificationWakeUpCoordinator mNotificationWakeUpCoordinator;
wilsonshihe8321942019-10-18 18:39:46 +080081 @Mock private NotificationShadeWindowController mNotificationShadeWindowController;
Dave Mankoff1193aa42019-10-28 17:51:26 -040082 @Mock private PowerManager mPowerManager;
83 @Mock private WakefulnessLifecycle mWakefullnessLifecycle;
84 @Mock private StatusBar mStatusBar;
85 @Mock private NotificationIconAreaController mNotificationIconAreaController;
wilsonshihe8321942019-10-18 18:39:46 +080086 @Mock private NotificationShadeWindowViewController mNotificationShadeWindowViewController;
Dave Mankoff1193aa42019-10-28 17:51:26 -040087 @Mock private StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
Dave Mankoffaf8163f2020-01-08 14:24:35 -050088 @Mock private NotificationPanelViewController mNotificationPanel;
Dave Mankoff1193aa42019-10-28 17:51:26 -040089 @Mock private View mAmbientIndicationContainer;
90 @Mock private BiometricUnlockController mBiometricUnlockController;
Heemin Seog82b96cd2019-11-12 16:40:00 -080091 @Mock private LockscreenLockIconController mLockscreenLockIconController;
Dave Mankoff1193aa42019-10-28 17:51:26 -040092
93 @Before
94 public void setup() {
95 MockitoAnnotations.initMocks(this);
Dave Mankoff1193aa42019-10-28 17:51:26 -040096 mDozeServiceHost = new DozeServiceHost(mDozeLog, mPowerManager, mWakefullnessLifecycle,
97 mStatusBarStateController, mDeviceProvisionedController, mHeadsUpManager,
Dave Mankoff4dd47fa2019-11-07 10:44:48 -050098 mBatteryController, mScrimController, () -> mBiometricUnlockController,
99 mKeyguardViewMediator, () -> mAssistManager, mDozeScrimController,
100 mKeyguardUpdateMonitor, mVisualStabilityManager, mPulseExpansionHandler,
wilsonshihe8321942019-10-18 18:39:46 +0800101 mNotificationShadeWindowController, mNotificationWakeUpCoordinator,
Dave Mankoffc1bbce12019-11-25 11:27:36 -0500102 mLockscreenLockIconController);
Dave Mankoff1193aa42019-10-28 17:51:26 -0400103
Dave Mankoffc1bbce12019-11-25 11:27:36 -0500104 mDozeServiceHost.initialize(mStatusBar, mNotificationIconAreaController,
wilsonshihe8321942019-10-18 18:39:46 +0800105 mStatusBarKeyguardViewManager, mNotificationShadeWindowViewController,
106 mNotificationPanel, mAmbientIndicationContainer);
Dave Mankoff1193aa42019-10-28 17:51:26 -0400107 }
108
109 @Test
110 public void testStartStopDozing() {
111 when(mStatusBarStateController.getState()).thenReturn(StatusBarState.KEYGUARD);
112 when(mStatusBarStateController.isKeyguardRequested()).thenReturn(true);
113
114 assertFalse(mDozeServiceHost.getDozingRequested());
115
116 mDozeServiceHost.startDozing();
117 verify(mStatusBarStateController).setIsDozing(eq(true));
118 verify(mStatusBar).updateIsKeyguard();
119
120 mDozeServiceHost.stopDozing();
121 verify(mStatusBarStateController).setIsDozing(eq(false));
122 }
123
124
125 @Test
126 public void testPulseWhileDozing_updatesScrimController() {
127 mStatusBar.setBarStateForTest(StatusBarState.KEYGUARD);
128 mStatusBar.showKeyguardImpl();
129
130 // Keep track of callback to be able to stop the pulse
131// DozeHost.PulseCallback[] pulseCallback = new DozeHost.PulseCallback[1];
132// doAnswer(invocation -> {
133// pulseCallback[0] = invocation.getArgument(0);
134// return null;
135// }).when(mDozeScrimController).pulse(any(), anyInt());
136
137 // Starting a pulse should change the scrim controller to the pulsing state
138 mDozeServiceHost.pulseWhileDozing(new DozeHost.PulseCallback() {
139 @Override
140 public void onPulseStarted() {
141 }
142
143 @Override
144 public void onPulseFinished() {
145 }
Ned Burns30d67702020-01-28 12:58:45 -0500146 }, DozeLog.PULSE_REASON_NOTIFICATION);
Dave Mankoff1193aa42019-10-28 17:51:26 -0400147
148 ArgumentCaptor<DozeHost.PulseCallback> pulseCallbackArgumentCaptor =
149 ArgumentCaptor.forClass(DozeHost.PulseCallback.class);
150
151 verify(mDozeScrimController).pulse(
Ned Burns30d67702020-01-28 12:58:45 -0500152 pulseCallbackArgumentCaptor.capture(), eq(DozeLog.PULSE_REASON_NOTIFICATION));
Dave Mankoff1193aa42019-10-28 17:51:26 -0400153 verify(mStatusBar).updateScrimController();
154 reset(mStatusBar);
155
156 pulseCallbackArgumentCaptor.getValue().onPulseFinished();
157 assertFalse(mDozeScrimController.isPulsing());
158 verify(mStatusBar).updateScrimController();
159 }
160
Dave Mankoff1193aa42019-10-28 17:51:26 -0400161 @Test
162 public void testPulseWhileDozing_notifyAuthInterrupt() {
163 HashSet<Integer> reasonsWantingAuth = new HashSet<>(
Ned Burns30d67702020-01-28 12:58:45 -0500164 Collections.singletonList(DozeLog.PULSE_REASON_SENSOR_WAKE_LOCK_SCREEN));
Dave Mankoff1193aa42019-10-28 17:51:26 -0400165 HashSet<Integer> reasonsSkippingAuth = new HashSet<>(
Ned Burns30d67702020-01-28 12:58:45 -0500166 Arrays.asList(DozeLog.PULSE_REASON_INTENT,
167 DozeLog.PULSE_REASON_NOTIFICATION,
168 DozeLog.PULSE_REASON_SENSOR_SIGMOTION,
169 DozeLog.REASON_SENSOR_PICKUP,
170 DozeLog.REASON_SENSOR_DOUBLE_TAP,
171 DozeLog.PULSE_REASON_SENSOR_LONG_PRESS,
172 DozeLog.PULSE_REASON_DOCKING,
173 DozeLog.REASON_SENSOR_WAKE_UP,
174 DozeLog.REASON_SENSOR_TAP));
Dave Mankoff1193aa42019-10-28 17:51:26 -0400175 HashSet<Integer> reasonsThatDontPulse = new HashSet<>(
Ned Burns30d67702020-01-28 12:58:45 -0500176 Arrays.asList(DozeLog.REASON_SENSOR_PICKUP,
177 DozeLog.REASON_SENSOR_DOUBLE_TAP,
178 DozeLog.REASON_SENSOR_TAP));
Dave Mankoff1193aa42019-10-28 17:51:26 -0400179
180 doAnswer(invocation -> {
181 DozeHost.PulseCallback callback = invocation.getArgument(0);
182 callback.onPulseStarted();
183 return null;
184 }).when(mDozeScrimController).pulse(any(), anyInt());
185
186 mDozeServiceHost.mWakeLockScreenPerformsAuth = true;
Ned Burns30d67702020-01-28 12:58:45 -0500187 for (int i = 0; i < DozeLog.TOTAL_REASONS; i++) {
Dave Mankoff1193aa42019-10-28 17:51:26 -0400188 reset(mKeyguardUpdateMonitor);
189 mDozeServiceHost.pulseWhileDozing(mock(DozeHost.PulseCallback.class), i);
190 if (reasonsWantingAuth.contains(i)) {
191 verify(mKeyguardUpdateMonitor).onAuthInterruptDetected(eq(true));
192 } else if (reasonsSkippingAuth.contains(i) || reasonsThatDontPulse.contains(i)) {
193 verify(mKeyguardUpdateMonitor, never()).onAuthInterruptDetected(eq(true));
194 } else {
195 throw new AssertionError("Reason " + i + " isn't specified as wanting or skipping"
196 + " passive auth. Please consider how this pulse reason should behave.");
197 }
198 }
199 }
200}