blob: e84dd68e30ea31c4ce5742a01d8190e20fc9a713 [file] [log] [blame]
Lucas Dupin6865b712017-09-11 12:28:03 -07001/*
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
Lucas Dupinf9ca35e2018-05-16 20:41:35 -070019import static com.google.common.truth.Truth.assertThat;
20
Lucas Dupin0df9b7a2018-03-15 17:53:17 -070021import static org.mockito.ArgumentMatchers.anyFloat;
22import static org.mockito.ArgumentMatchers.anyInt;
23import static org.mockito.ArgumentMatchers.eq;
Lucas Dupin0df9b7a2018-03-15 17:53:17 -070024import static org.mockito.Mockito.never;
25import static org.mockito.Mockito.reset;
Lucas Dupin0df9b7a2018-03-15 17:53:17 -070026import static org.mockito.Mockito.verify;
27import static org.mockito.Mockito.verifyNoMoreInteractions;
28import static org.mockito.Mockito.verifyZeroInteractions;
29import static org.mockito.Mockito.when;
30
Jason Monka716bac2018-12-05 15:48:21 -050031import android.content.res.ColorStateList;
Lucas Dupin0df9b7a2018-03-15 17:53:17 -070032import android.graphics.Color;
Lucas Dupin0df9b7a2018-03-15 17:53:17 -070033import android.testing.AndroidTestingRunner;
34import android.testing.TestableLooper;
Lucas Dupin6865b712017-09-11 12:28:03 -070035import android.view.ViewGroup;
Lucas Dupin0df9b7a2018-03-15 17:53:17 -070036import android.view.ViewTreeObserver;
Lucas Dupin6865b712017-09-11 12:28:03 -070037import android.widget.FrameLayout;
38
Brett Chabot84151d92019-02-27 15:37:59 -080039import androidx.test.filters.SmallTest;
40
Lucas Dupin6865b712017-09-11 12:28:03 -070041import com.android.internal.widget.LockPatternUtils;
Lucas Dupin0df9b7a2018-03-15 17:53:17 -070042import com.android.keyguard.KeyguardHostView;
43import com.android.keyguard.KeyguardSecurityModel;
Lucas Dupin6865b712017-09-11 12:28:03 -070044import com.android.keyguard.ViewMediatorCallback;
Lucas Dupin0df9b7a2018-03-15 17:53:17 -070045import com.android.systemui.DejankUtils;
Lucas Dupin6865b712017-09-11 12:28:03 -070046import com.android.systemui.SysuiTestCase;
Lucas Dupin0df9b7a2018-03-15 17:53:17 -070047import com.android.systemui.classifier.FalsingManager;
Lucas Dupin6865b712017-09-11 12:28:03 -070048import com.android.systemui.keyguard.DismissCallbackRegistry;
Jason Monk297c04e2018-08-23 17:16:59 -040049import com.android.systemui.plugins.ActivityStarter.OnDismissAction;
Lucas Dupin6865b712017-09-11 12:28:03 -070050
Lucas Dupin0df9b7a2018-03-15 17:53:17 -070051import org.junit.Assert;
52import org.junit.Before;
Lucas Dupin6865b712017-09-11 12:28:03 -070053import org.junit.Test;
54import org.junit.runner.RunWith;
Lucas Dupin0df9b7a2018-03-15 17:53:17 -070055import org.mockito.Mock;
56import org.mockito.MockitoAnnotations;
Lucas Dupin6865b712017-09-11 12:28:03 -070057
58@SmallTest
Lucas Dupin0df9b7a2018-03-15 17:53:17 -070059@RunWith(AndroidTestingRunner.class)
Jason Monka716bac2018-12-05 15:48:21 -050060@TestableLooper.RunWithLooper
Lucas Dupin6865b712017-09-11 12:28:03 -070061public class KeyguardBouncerTest extends SysuiTestCase {
62
Lucas Dupin0df9b7a2018-03-15 17:53:17 -070063 @Mock
64 private FalsingManager mFalsingManager;
65 @Mock
66 private ViewMediatorCallback mViewMediatorCallback;
67 @Mock
68 private LockPatternUtils mLockPatternUtils;
69 @Mock
70 private DismissCallbackRegistry mDismissCallbackRegistry;
71 @Mock
72 private KeyguardHostView mKeyguardHostView;
73 @Mock
74 private ViewTreeObserver mViewTreeObserver;
Lucas Dupin15a6b6c2018-04-16 14:50:20 +080075 @Mock
76 private KeyguardBouncer.BouncerExpansionCallback mExpansionCallback;
Lucas Dupin6865b712017-09-11 12:28:03 -070077
Lucas Dupin0df9b7a2018-03-15 17:53:17 -070078 private KeyguardBouncer mBouncer;
79
80 @Before
81 public void setup() {
Jason Monka716bac2018-12-05 15:48:21 -050082 com.android.systemui.util.Assert.sMainLooper = TestableLooper.get(this).getLooper();
Lucas Dupin0df9b7a2018-03-15 17:53:17 -070083 MockitoAnnotations.initMocks(this);
84 DejankUtils.setImmediate(true);
85 final ViewGroup container = new FrameLayout(getContext());
86 when(mKeyguardHostView.getViewTreeObserver()).thenReturn(mViewTreeObserver);
87 when(mKeyguardHostView.getHeight()).thenReturn(500);
88 mBouncer = new KeyguardBouncer(getContext(), mViewMediatorCallback,
Lucas Dupin15a6b6c2018-04-16 14:50:20 +080089 mLockPatternUtils, container, mDismissCallbackRegistry, mFalsingManager,
90 mExpansionCallback) {
Lucas Dupin0df9b7a2018-03-15 17:53:17 -070091 @Override
92 protected void inflateView() {
93 super.inflateView();
94 mKeyguardView = mKeyguardHostView;
95 }
96 };
Lucas Dupin6865b712017-09-11 12:28:03 -070097 }
98
Lucas Dupin0df9b7a2018-03-15 17:53:17 -070099 @Test
100 public void testInflateView_doesntCrash() {
101 mBouncer.inflateView();
102 }
103
104 @Test
105 public void testShow_notifiesFalsingManager() {
106 mBouncer.show(true);
107 verify(mFalsingManager).onBouncerShown();
108
109 mBouncer.show(true, false);
110 verifyNoMoreInteractions(mFalsingManager);
111 }
112
113 /**
114 * Regression test: Invisible bouncer when occluded.
115 */
116 @Test
117 public void testShow_bouncerIsVisible() {
118 // Expand notification panel as if we were in the keyguard.
119 mBouncer.ensureView();
120 mBouncer.setExpansion(1);
121
122 reset(mKeyguardHostView);
123 when(mKeyguardHostView.getHeight()).thenReturn(500);
124
125 mBouncer.show(true);
126 verify(mKeyguardHostView).setAlpha(eq(1f));
127 verify(mKeyguardHostView).setTranslationY(eq(0f));
128 }
129
130 @Test
131 public void testShow_notifiesVisibility() {
132 mBouncer.show(true);
133 verify(mViewMediatorCallback).onBouncerVisiblityChanged(eq(true));
134
135 // Not called again when visible
136 reset(mViewMediatorCallback);
137 mBouncer.show(true);
138 verifyNoMoreInteractions(mViewMediatorCallback);
139 }
140
141 @Test
142 public void testShow_triesToDismissKeyguard() {
143 mBouncer.show(true);
144 verify(mKeyguardHostView).dismiss(anyInt());
145 }
146
147 @Test
148 public void testShow_resetsSecuritySelection() {
149 mBouncer.show(false);
Lucas Dupin05726cd2018-03-13 14:00:24 -0700150 verify(mKeyguardHostView, never()).showPrimarySecurityScreen();
Lucas Dupin0df9b7a2018-03-15 17:53:17 -0700151
152 mBouncer.hide(false);
153 mBouncer.show(true);
154 verify(mKeyguardHostView).showPrimarySecurityScreen();
155 }
156
157 @Test
158 public void testShow_animatesKeyguardView() {
159 mBouncer.show(true);
160 verify(mKeyguardHostView).startAppearAnimation();
161 }
162
163 @Test
164 public void testShow_showsErrorMessage() {
165 final String errorMessage = "an error message";
166 when(mViewMediatorCallback.consumeCustomMessage()).thenReturn(errorMessage);
167 mBouncer.show(true);
168 verify(mKeyguardHostView).showErrorMessage(eq(errorMessage));
169 }
170
171 @Test
Lucas Dupin15a6b6c2018-04-16 14:50:20 +0800172 public void testSetExpansion_notifiesFalsingManager() {
Lucas Dupind2ce46d2018-04-04 17:00:29 -0700173 mBouncer.ensureView();
Lucas Dupin15a6b6c2018-04-16 14:50:20 +0800174 mBouncer.setExpansion(0.5f);
Lucas Dupin0df9b7a2018-03-15 17:53:17 -0700175
Lucas Dupin84993542018-10-11 19:23:45 -0700176 mBouncer.setExpansion(KeyguardBouncer.EXPANSION_HIDDEN);
Lucas Dupin0df9b7a2018-03-15 17:53:17 -0700177 verify(mFalsingManager).onBouncerHidden();
Lucas Dupin15a6b6c2018-04-16 14:50:20 +0800178 verify(mExpansionCallback).onFullyHidden();
179
Lucas Dupin84993542018-10-11 19:23:45 -0700180 mBouncer.setExpansion(KeyguardBouncer.EXPANSION_VISIBLE);
Lucas Dupin15a6b6c2018-04-16 14:50:20 +0800181 verify(mFalsingManager).onBouncerShown();
182 verify(mExpansionCallback).onFullyShown();
Lucas Dupin84993542018-10-11 19:23:45 -0700183
184 verify(mExpansionCallback, never()).onStartingToHide();
185 mBouncer.setExpansion(0.9f);
186 verify(mExpansionCallback).onStartingToHide();
Lucas Dupin15a6b6c2018-04-16 14:50:20 +0800187 }
188
189 @Test
190 public void testSetExpansion_notifiesKeyguardView() {
191 mBouncer.ensureView();
192 mBouncer.setExpansion(0.1f);
193
194 mBouncer.setExpansion(0);
195 verify(mKeyguardHostView).onResume();
Lucas Dupin0df9b7a2018-03-15 17:53:17 -0700196 }
197
198 @Test
199 public void testHide_notifiesFalsingManager() {
200 mBouncer.hide(false);
201 verify(mFalsingManager).onBouncerHidden();
202 }
203
204 @Test
205 public void testHide_notifiesVisibility() {
206 mBouncer.hide(false);
207 verify(mViewMediatorCallback).onBouncerVisiblityChanged(eq(false));
208 }
209
210 @Test
211 public void testHide_notifiesDismissCallbackIfVisible() {
212 mBouncer.hide(false);
213 verifyZeroInteractions(mDismissCallbackRegistry);
214 mBouncer.show(false);
215 mBouncer.hide(false);
216 verify(mDismissCallbackRegistry).notifyDismissCancelled();
217 }
218
219 @Test
Lucas Dupin15a6b6c2018-04-16 14:50:20 +0800220 public void testHide_notShowingAnymore() {
221 mBouncer.ensureView();
222 mBouncer.show(false /* resetSecuritySelection */);
223 mBouncer.hide(false /* destroyViews */);
224 Assert.assertFalse("Not showing", mBouncer.isShowing());
225 }
226
227 @Test
Lucas Dupin0df9b7a2018-03-15 17:53:17 -0700228 public void testShowPromptReason_propagates() {
229 mBouncer.ensureView();
230 mBouncer.showPromptReason(1);
231 verify(mKeyguardHostView).showPromptReason(eq(1));
232 }
233
234 @Test
235 public void testShowMessage_propagates() {
236 final String message = "a message";
237 mBouncer.ensureView();
Jason Chang1e4a4bd2018-05-22 17:30:19 +0800238 mBouncer.showMessage(message, ColorStateList.valueOf(Color.GREEN));
239 verify(mKeyguardHostView).showMessage(eq(message), eq(ColorStateList.valueOf(Color.GREEN)));
Lucas Dupin0df9b7a2018-03-15 17:53:17 -0700240 }
241
242 @Test
243 public void testShowOnDismissAction_showsBouncer() {
Jason Monk297c04e2018-08-23 17:16:59 -0400244 final OnDismissAction dismissAction = () -> false;
Lucas Dupin0df9b7a2018-03-15 17:53:17 -0700245 final Runnable cancelAction = () -> {};
246 mBouncer.showWithDismissAction(dismissAction, cancelAction);
247 verify(mKeyguardHostView).setOnDismissAction(dismissAction, cancelAction);
248 Assert.assertTrue("Should be showing", mBouncer.isShowing());
249 }
250
251 @Test
252 public void testStartPreHideAnimation_notifiesView() {
253 final boolean[] ran = {false};
254 final Runnable r = () -> ran[0] = true;
255 mBouncer.startPreHideAnimation(r);
256 Assert.assertTrue("Callback should have been invoked", ran[0]);
257
258 ran[0] = false;
259 mBouncer.ensureView();
260 mBouncer.startPreHideAnimation(r);
261 verify(mKeyguardHostView).startDisappearAnimation(r);
262 Assert.assertFalse("Callback should have been deferred", ran[0]);
263 }
264
265 @Test
Lucas Dupin3d565fa2018-03-20 15:40:14 -0700266 public void testIsShowing_animated() {
Lucas Dupin0df9b7a2018-03-15 17:53:17 -0700267 Assert.assertFalse("Show wasn't invoked yet", mBouncer.isShowing());
Lucas Dupin3d565fa2018-03-20 15:40:14 -0700268 mBouncer.show(true /* reset */);
269 Assert.assertTrue("Should be showing", mBouncer.isShowing());
270 }
271
272 @Test
273 public void testIsShowing_forSwipeUp() {
274 mBouncer.setExpansion(1f);
275 mBouncer.show(true /* reset */, false /* animated */);
276 Assert.assertFalse("Should only be showing after collapsing notification panel",
277 mBouncer.isShowing());
278 mBouncer.setExpansion(0f);
Lucas Dupin0df9b7a2018-03-15 17:53:17 -0700279 Assert.assertTrue("Should be showing", mBouncer.isShowing());
280 }
281
282 @Test
283 public void testSetExpansion() {
284 mBouncer.ensureView();
285 mBouncer.setExpansion(0.5f);
286 verify(mKeyguardHostView).setAlpha(anyFloat());
287 verify(mKeyguardHostView).setTranslationY(anyFloat());
288 }
289
290 @Test
291 public void testNeedsFullscreenBouncer_asksKeyguardView() {
292 mBouncer.ensureView();
293 mBouncer.needsFullscreenBouncer();
294 verify(mKeyguardHostView).getSecurityMode();
295 verify(mKeyguardHostView, never()).getCurrentSecurityMode();
296 }
297
298 @Test
299 public void testIsFullscreenBouncer_asksKeyguardView() {
300 mBouncer.ensureView();
301 mBouncer.isFullscreenBouncer();
302 verify(mKeyguardHostView).getCurrentSecurityMode();
303 verify(mKeyguardHostView, never()).getSecurityMode();
304 }
305
306 @Test
Lucas Dupin28dc9d72018-03-21 15:59:15 -0700307 public void testIsHiding_preHideOrHide() {
308 Assert.assertFalse("Should not be hiding on initial state", mBouncer.isAnimatingAway());
309 mBouncer.startPreHideAnimation(null /* runnable */);
310 Assert.assertTrue("Should be hiding during pre-hide", mBouncer.isAnimatingAway());
311 mBouncer.hide(false /* destroyView */);
312 Assert.assertFalse("Should be hidden after hide()", mBouncer.isAnimatingAway());
313 }
314
315 @Test
316 public void testIsHiding_skipsTranslation() {
317 mBouncer.show(false /* reset */);
318 reset(mKeyguardHostView);
319 mBouncer.startPreHideAnimation(null /* runnable */);
320 mBouncer.setExpansion(0.5f);
321 verify(mKeyguardHostView, never()).setTranslationY(anyFloat());
322 verify(mKeyguardHostView, never()).setAlpha(anyFloat());
323 }
324
325 @Test
Lucas Dupin0df9b7a2018-03-15 17:53:17 -0700326 public void testIsSecure() {
327 Assert.assertTrue("Bouncer is secure before inflating views", mBouncer.isSecure());
328
329 mBouncer.ensureView();
330 for (KeyguardSecurityModel.SecurityMode mode : KeyguardSecurityModel.SecurityMode.values()){
331 reset(mKeyguardHostView);
332 when(mKeyguardHostView.getSecurityMode()).thenReturn(mode);
333 Assert.assertEquals("Security doesn't match for mode: " + mode,
334 mBouncer.isSecure(), mode != KeyguardSecurityModel.SecurityMode.None);
335 }
336 }
Lucas Dupin6f0d71f2018-03-23 17:26:06 -0700337
338 @Test
Lucas Dupinf9ca35e2018-05-16 20:41:35 -0700339 public void testIsShowingScrimmed() {
340 mBouncer.show(false /* resetSecuritySelection */, true /* animate */);
341 assertThat(mBouncer.isShowingScrimmed()).isTrue();
342 mBouncer.show(false /* resetSecuritySelection */, false /* animate */);
343 assertThat(mBouncer.isShowingScrimmed()).isFalse();
344 }
345
346 @Test
Lucas Dupin6f0d71f2018-03-23 17:26:06 -0700347 public void testWillDismissWithAction() {
348 mBouncer.ensureView();
349 Assert.assertFalse("Action not set yet", mBouncer.willDismissWithAction());
350 when(mKeyguardHostView.hasDismissActions()).thenReturn(true);
351 Assert.assertTrue("Action should exist", mBouncer.willDismissWithAction());
352 }
Lucas Dupin6865b712017-09-11 12:28:03 -0700353}