blob: d2d294bf8d373a5f86680dd8d1464413be375e44 [file] [log] [blame]
Lucas Dupin3d053532019-01-29 12:35:22 -08001/*
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
Lucas Dupin45142ba2019-04-10 13:13:20 -070019import static org.mockito.ArgumentMatchers.any;
Lucas Dupin3d053532019-01-29 12:35:22 -080020import static org.mockito.ArgumentMatchers.anyBoolean;
21import static org.mockito.ArgumentMatchers.anyFloat;
22import static org.mockito.ArgumentMatchers.eq;
23import static org.mockito.Mockito.never;
24import static org.mockito.Mockito.reset;
25import static org.mockito.Mockito.verify;
26import static org.mockito.Mockito.when;
27
28import android.hardware.biometrics.BiometricSourceType;
29import android.os.Handler;
30import android.os.PowerManager;
31import android.os.UserHandle;
32import android.test.suitebuilder.annotation.SmallTest;
33import android.testing.AndroidTestingRunner;
34import android.testing.TestableLooper.RunWithLooper;
35
36import com.android.keyguard.KeyguardUpdateMonitor;
37import com.android.systemui.SysuiTestCase;
38import com.android.systemui.keyguard.KeyguardViewMediator;
39import com.android.systemui.statusbar.NotificationMediaManager;
Lucas Dupinc94963f2019-03-07 14:54:05 -080040import com.android.systemui.tuner.TunerService;
Lucas Dupin3d053532019-01-29 12:35:22 -080041
42import org.junit.Before;
43import org.junit.Test;
44import org.junit.runner.RunWith;
45import org.mockito.Mock;
46import org.mockito.MockitoAnnotations;
47
48@SmallTest
49@RunWith(AndroidTestingRunner.class)
50@RunWithLooper
51public class BiometricsUnlockControllerTest extends SysuiTestCase {
52
53 @Mock
54 private NotificationMediaManager mMediaManager;
55 @Mock
56 private PowerManager mPowerManager;
57 @Mock
58 private KeyguardUpdateMonitor mUpdateMonitor;
59 @Mock
60 private StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
61 @Mock
62 private StatusBarWindowController mStatusBarWindowController;
63 @Mock
64 private DozeScrimController mDozeScrimController;
65 @Mock
66 private KeyguardViewMediator mKeyguardViewMediator;
67 @Mock
68 private ScrimController mScrimController;
69 @Mock
70 private StatusBar mStatusBar;
71 @Mock
72 private UnlockMethodCache mUnlockMethodCache;
Lucas Dupinc94963f2019-03-07 14:54:05 -080073 @Mock
74 private TunerService mTunerService;
Lucas Dupin45142ba2019-04-10 13:13:20 -070075 @Mock
76 private Handler mHandler;
Lucas Dupin3d053532019-01-29 12:35:22 -080077 private BiometricUnlockController mBiometricUnlockController;
78
79 @Before
80 public void setUp() {
81 MockitoAnnotations.initMocks(this);
82 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
83 when(mUpdateMonitor.isDeviceInteractive()).thenReturn(true);
84 mContext.addMockSystemService(PowerManager.class, mPowerManager);
85 mDependency.injectTestDependency(NotificationMediaManager.class, mMediaManager);
86 mDependency.injectTestDependency(StatusBarWindowController.class,
87 mStatusBarWindowController);
Lucas Dupinc94963f2019-03-07 14:54:05 -080088 mBiometricUnlockController = new TestableBiometricUnlockController(
89 false /* faceDismissesKeyguard */);
Lucas Dupin3d053532019-01-29 12:35:22 -080090 mBiometricUnlockController.setStatusBarKeyguardViewManager(mStatusBarKeyguardViewManager);
91 }
92
93 @Test
94 public void onBiometricAuthenticated_whenFingerprintAndBiometricsDisallowed_showBouncer() {
95 mBiometricUnlockController.onBiometricAuthenticated(UserHandle.USER_CURRENT,
96 BiometricSourceType.FINGERPRINT);
97 verify(mStatusBarKeyguardViewManager).showBouncer(eq(false));
98 verify(mStatusBarKeyguardViewManager).animateCollapsePanels(anyFloat());
99 }
100
101 @Test
102 public void onBiometricAuthenticated_whenFingerprintAndNotInteractive_wakeAndUnlock() {
103 reset(mUpdateMonitor);
104 reset(mStatusBarKeyguardViewManager);
105 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
106 when(mUpdateMonitor.isUnlockingWithBiometricAllowed()).thenReturn(true);
107 when(mDozeScrimController.isPulsing()).thenReturn(true);
108 mBiometricUnlockController.onBiometricAuthenticated(UserHandle.USER_CURRENT,
109 BiometricSourceType.FINGERPRINT);
110
111 verify(mKeyguardViewMediator).onWakeAndUnlocking();
112 }
113
114 @Test
115 public void onBiometricAuthenticated_whenFingerprint_dismissKeyguard() {
116 when(mUpdateMonitor.isUnlockingWithBiometricAllowed()).thenReturn(true);
117 mBiometricUnlockController.onBiometricAuthenticated(UserHandle.USER_CURRENT,
118 BiometricSourceType.FINGERPRINT);
119
120 verify(mStatusBarKeyguardViewManager, never()).showBouncer(anyBoolean());
121 verify(mStatusBarKeyguardViewManager).animateCollapsePanels(anyFloat());
122 }
123
124 @Test
125 public void onBiometricAuthenticated_whenFingerprintOnBouncer_dismissBouncer() {
126 when(mUpdateMonitor.isUnlockingWithBiometricAllowed()).thenReturn(true);
127 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(true);
128 mBiometricUnlockController.onBiometricAuthenticated(UserHandle.USER_CURRENT,
129 BiometricSourceType.FINGERPRINT);
130
131 verify(mStatusBarKeyguardViewManager).notifyKeyguardAuthenticated(eq(false));
132 }
133
134 @Test
135 public void onBiometricAuthenticated_whenFace_dontDismissKeyguard() {
136 when(mUpdateMonitor.isUnlockingWithBiometricAllowed()).thenReturn(true);
137 mBiometricUnlockController.onBiometricAuthenticated(UserHandle.USER_CURRENT,
138 BiometricSourceType.FACE);
139
140 verify(mStatusBarKeyguardViewManager, never()).animateCollapsePanels(anyFloat());
141 }
142
143 @Test
Lucas Dupinc94963f2019-03-07 14:54:05 -0800144 public void onBiometricAuthenticated_whenFace_dismissingKeyguard() {
145 mBiometricUnlockController = new TestableBiometricUnlockController(
146 true /* faceDismissesKeyguard */);
147 mBiometricUnlockController.setStatusBarKeyguardViewManager(mStatusBarKeyguardViewManager);
148
149 when(mUpdateMonitor.isUnlockingWithBiometricAllowed()).thenReturn(true);
150 mBiometricUnlockController.onBiometricAuthenticated(UserHandle.USER_CURRENT,
151 BiometricSourceType.FACE);
152
153 verify(mStatusBarKeyguardViewManager).animateCollapsePanels(anyFloat());
154 }
155
156 @Test
Lucas Dupin3d053532019-01-29 12:35:22 -0800157 public void onBiometricAuthenticated_whenFaceOnBouncer_dismissBouncer() {
158 when(mUpdateMonitor.isUnlockingWithBiometricAllowed()).thenReturn(true);
159 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(true);
160 mBiometricUnlockController.onBiometricAuthenticated(UserHandle.USER_CURRENT,
161 BiometricSourceType.FACE);
162
163 verify(mStatusBarKeyguardViewManager).notifyKeyguardAuthenticated(eq(false));
164 }
165
166 @Test
167 public void onBiometricAuthenticated_whenFaceAndPulsing_dontDismissKeyguard() {
168 reset(mUpdateMonitor);
169 reset(mStatusBarKeyguardViewManager);
170 when(mUpdateMonitor.isUnlockingWithBiometricAllowed()).thenReturn(true);
171 when(mDozeScrimController.isPulsing()).thenReturn(true);
172 mBiometricUnlockController.onBiometricAuthenticated(UserHandle.USER_CURRENT,
173 BiometricSourceType.FACE);
174
175 verify(mStatusBarKeyguardViewManager, never()).animateCollapsePanels(anyFloat());
176 }
Lucas Dupinc94963f2019-03-07 14:54:05 -0800177
Lucas Dupin45142ba2019-04-10 13:13:20 -0700178 @Test
179 public void onFinishedGoingToSleep_authenticatesWhenPending() {
180 when(mUpdateMonitor.isGoingToSleep()).thenReturn(true);
181 mBiometricUnlockController.onFinishedGoingToSleep(-1);
182 verify(mHandler, never()).post(any());
183
184 mBiometricUnlockController.onBiometricAuthenticated(1 /* userId */,
185 BiometricSourceType.FACE);
186 mBiometricUnlockController.onFinishedGoingToSleep(-1);
187 verify(mHandler).post(any());
188 }
189
Lucas Dupinc94963f2019-03-07 14:54:05 -0800190 private class TestableBiometricUnlockController extends BiometricUnlockController {
191
192 TestableBiometricUnlockController(boolean faceDismissesKeyguard) {
193 super(mContext, mDozeScrimController,
194 mKeyguardViewMediator, mScrimController, mStatusBar, mUnlockMethodCache,
Lucas Dupin45142ba2019-04-10 13:13:20 -0700195 mHandler, mUpdateMonitor, mTunerService, 0 /* wakeUpDelay */,
Lucas Dupinc94963f2019-03-07 14:54:05 -0800196 faceDismissesKeyguard);
197 mFaceDismissesKeyguard = faceDismissesKeyguard;
198 }
199 }
Lucas Dupin3d053532019-01-29 12:35:22 -0800200}