blob: f7a95c50fee8eaf26a8f654eae3f26a2b3b4153b [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 Dupin6865b712017-09-11 12:28:03 -070033import android.support.test.filters.SmallTest;
Lucas Dupin0df9b7a2018-03-15 17:53:17 -070034import android.testing.AndroidTestingRunner;
35import android.testing.TestableLooper;
Lucas Dupin6865b712017-09-11 12:28:03 -070036import android.view.ViewGroup;
Lucas Dupin0df9b7a2018-03-15 17:53:17 -070037import android.view.ViewTreeObserver;
Lucas Dupin6865b712017-09-11 12:28:03 -070038import android.widget.FrameLayout;
39
40import com.android.internal.widget.LockPatternUtils;
Lucas Dupin0df9b7a2018-03-15 17:53:17 -070041import com.android.keyguard.KeyguardHostView;
42import com.android.keyguard.KeyguardSecurityModel;
Lucas Dupin6865b712017-09-11 12:28:03 -070043import com.android.keyguard.ViewMediatorCallback;
Lucas Dupin0df9b7a2018-03-15 17:53:17 -070044import com.android.systemui.DejankUtils;
Lucas Dupin6865b712017-09-11 12:28:03 -070045import com.android.systemui.SysuiTestCase;
Lucas Dupin0df9b7a2018-03-15 17:53:17 -070046import com.android.systemui.classifier.FalsingManager;
Lucas Dupin6865b712017-09-11 12:28:03 -070047import com.android.systemui.keyguard.DismissCallbackRegistry;
Jason Monk297c04e2018-08-23 17:16:59 -040048import com.android.systemui.plugins.ActivityStarter.OnDismissAction;
Lucas Dupin6865b712017-09-11 12:28:03 -070049
Lucas Dupin0df9b7a2018-03-15 17:53:17 -070050import org.junit.Assert;
51import org.junit.Before;
Lucas Dupin6865b712017-09-11 12:28:03 -070052import org.junit.Test;
53import org.junit.runner.RunWith;
Lucas Dupin0df9b7a2018-03-15 17:53:17 -070054import org.mockito.Mock;
55import org.mockito.MockitoAnnotations;
Lucas Dupin6865b712017-09-11 12:28:03 -070056
57@SmallTest
Lucas Dupin0df9b7a2018-03-15 17:53:17 -070058@RunWith(AndroidTestingRunner.class)
Jason Monka716bac2018-12-05 15:48:21 -050059@TestableLooper.RunWithLooper
Lucas Dupin6865b712017-09-11 12:28:03 -070060public class KeyguardBouncerTest extends SysuiTestCase {
61
Lucas Dupin0df9b7a2018-03-15 17:53:17 -070062 @Mock
63 private FalsingManager mFalsingManager;
64 @Mock
65 private ViewMediatorCallback mViewMediatorCallback;
66 @Mock
67 private LockPatternUtils mLockPatternUtils;
68 @Mock
69 private DismissCallbackRegistry mDismissCallbackRegistry;
70 @Mock
71 private KeyguardHostView mKeyguardHostView;
72 @Mock
73 private ViewTreeObserver mViewTreeObserver;
Lucas Dupin15a6b6c2018-04-16 14:50:20 +080074 @Mock
75 private KeyguardBouncer.BouncerExpansionCallback mExpansionCallback;
Lucas Dupin6865b712017-09-11 12:28:03 -070076
Lucas Dupin0df9b7a2018-03-15 17:53:17 -070077 private KeyguardBouncer mBouncer;
78
79 @Before
80 public void setup() {
Jason Monka716bac2018-12-05 15:48:21 -050081 com.android.systemui.util.Assert.sMainLooper = TestableLooper.get(this).getLooper();
Lucas Dupin0df9b7a2018-03-15 17:53:17 -070082 MockitoAnnotations.initMocks(this);
83 DejankUtils.setImmediate(true);
84 final ViewGroup container = new FrameLayout(getContext());
85 when(mKeyguardHostView.getViewTreeObserver()).thenReturn(mViewTreeObserver);
86 when(mKeyguardHostView.getHeight()).thenReturn(500);
87 mBouncer = new KeyguardBouncer(getContext(), mViewMediatorCallback,
Lucas Dupin15a6b6c2018-04-16 14:50:20 +080088 mLockPatternUtils, container, mDismissCallbackRegistry, mFalsingManager,
89 mExpansionCallback) {
Lucas Dupin0df9b7a2018-03-15 17:53:17 -070090 @Override
91 protected void inflateView() {
92 super.inflateView();
93 mKeyguardView = mKeyguardHostView;
94 }
95 };
Lucas Dupin6865b712017-09-11 12:28:03 -070096 }
97
Lucas Dupin0df9b7a2018-03-15 17:53:17 -070098 @Test
99 public void testInflateView_doesntCrash() {
100 mBouncer.inflateView();
101 }
102
103 @Test
104 public void testShow_notifiesFalsingManager() {
105 mBouncer.show(true);
106 verify(mFalsingManager).onBouncerShown();
107
108 mBouncer.show(true, false);
109 verifyNoMoreInteractions(mFalsingManager);
110 }
111
112 /**
113 * Regression test: Invisible bouncer when occluded.
114 */
115 @Test
116 public void testShow_bouncerIsVisible() {
117 // Expand notification panel as if we were in the keyguard.
118 mBouncer.ensureView();
119 mBouncer.setExpansion(1);
120
121 reset(mKeyguardHostView);
122 when(mKeyguardHostView.getHeight()).thenReturn(500);
123
124 mBouncer.show(true);
125 verify(mKeyguardHostView).setAlpha(eq(1f));
126 verify(mKeyguardHostView).setTranslationY(eq(0f));
127 }
128
129 @Test
130 public void testShow_notifiesVisibility() {
131 mBouncer.show(true);
132 verify(mViewMediatorCallback).onBouncerVisiblityChanged(eq(true));
133
134 // Not called again when visible
135 reset(mViewMediatorCallback);
136 mBouncer.show(true);
137 verifyNoMoreInteractions(mViewMediatorCallback);
138 }
139
140 @Test
141 public void testShow_triesToDismissKeyguard() {
142 mBouncer.show(true);
143 verify(mKeyguardHostView).dismiss(anyInt());
144 }
145
146 @Test
147 public void testShow_resetsSecuritySelection() {
148 mBouncer.show(false);
Lucas Dupin05726cd2018-03-13 14:00:24 -0700149 verify(mKeyguardHostView, never()).showPrimarySecurityScreen();
Lucas Dupin0df9b7a2018-03-15 17:53:17 -0700150
151 mBouncer.hide(false);
152 mBouncer.show(true);
153 verify(mKeyguardHostView).showPrimarySecurityScreen();
154 }
155
156 @Test
157 public void testShow_animatesKeyguardView() {
158 mBouncer.show(true);
159 verify(mKeyguardHostView).startAppearAnimation();
160 }
161
162 @Test
163 public void testShow_showsErrorMessage() {
164 final String errorMessage = "an error message";
165 when(mViewMediatorCallback.consumeCustomMessage()).thenReturn(errorMessage);
166 mBouncer.show(true);
167 verify(mKeyguardHostView).showErrorMessage(eq(errorMessage));
168 }
169
170 @Test
Lucas Dupin15a6b6c2018-04-16 14:50:20 +0800171 public void testSetExpansion_notifiesFalsingManager() {
Lucas Dupind2ce46d2018-04-04 17:00:29 -0700172 mBouncer.ensureView();
Lucas Dupin15a6b6c2018-04-16 14:50:20 +0800173 mBouncer.setExpansion(0.5f);
Lucas Dupin0df9b7a2018-03-15 17:53:17 -0700174
Lucas Dupin84993542018-10-11 19:23:45 -0700175 mBouncer.setExpansion(KeyguardBouncer.EXPANSION_HIDDEN);
Lucas Dupin0df9b7a2018-03-15 17:53:17 -0700176 verify(mFalsingManager).onBouncerHidden();
Lucas Dupin15a6b6c2018-04-16 14:50:20 +0800177 verify(mExpansionCallback).onFullyHidden();
178
Lucas Dupin84993542018-10-11 19:23:45 -0700179 mBouncer.setExpansion(KeyguardBouncer.EXPANSION_VISIBLE);
Lucas Dupin15a6b6c2018-04-16 14:50:20 +0800180 verify(mFalsingManager).onBouncerShown();
181 verify(mExpansionCallback).onFullyShown();
Lucas Dupin84993542018-10-11 19:23:45 -0700182
183 verify(mExpansionCallback, never()).onStartingToHide();
184 mBouncer.setExpansion(0.9f);
185 verify(mExpansionCallback).onStartingToHide();
Lucas Dupin15a6b6c2018-04-16 14:50:20 +0800186 }
187
188 @Test
189 public void testSetExpansion_notifiesKeyguardView() {
190 mBouncer.ensureView();
191 mBouncer.setExpansion(0.1f);
192
193 mBouncer.setExpansion(0);
194 verify(mKeyguardHostView).onResume();
Lucas Dupin0df9b7a2018-03-15 17:53:17 -0700195 }
196
197 @Test
198 public void testHide_notifiesFalsingManager() {
199 mBouncer.hide(false);
200 verify(mFalsingManager).onBouncerHidden();
201 }
202
203 @Test
204 public void testHide_notifiesVisibility() {
205 mBouncer.hide(false);
206 verify(mViewMediatorCallback).onBouncerVisiblityChanged(eq(false));
207 }
208
209 @Test
210 public void testHide_notifiesDismissCallbackIfVisible() {
211 mBouncer.hide(false);
212 verifyZeroInteractions(mDismissCallbackRegistry);
213 mBouncer.show(false);
214 mBouncer.hide(false);
215 verify(mDismissCallbackRegistry).notifyDismissCancelled();
216 }
217
218 @Test
Lucas Dupin15a6b6c2018-04-16 14:50:20 +0800219 public void testHide_notShowingAnymore() {
220 mBouncer.ensureView();
221 mBouncer.show(false /* resetSecuritySelection */);
222 mBouncer.hide(false /* destroyViews */);
223 Assert.assertFalse("Not showing", mBouncer.isShowing());
224 }
225
226 @Test
Lucas Dupin0df9b7a2018-03-15 17:53:17 -0700227 public void testShowPromptReason_propagates() {
228 mBouncer.ensureView();
229 mBouncer.showPromptReason(1);
230 verify(mKeyguardHostView).showPromptReason(eq(1));
231 }
232
233 @Test
234 public void testShowMessage_propagates() {
235 final String message = "a message";
236 mBouncer.ensureView();
Jason Chang1e4a4bd2018-05-22 17:30:19 +0800237 mBouncer.showMessage(message, ColorStateList.valueOf(Color.GREEN));
238 verify(mKeyguardHostView).showMessage(eq(message), eq(ColorStateList.valueOf(Color.GREEN)));
Lucas Dupin0df9b7a2018-03-15 17:53:17 -0700239 }
240
241 @Test
242 public void testShowOnDismissAction_showsBouncer() {
Jason Monk297c04e2018-08-23 17:16:59 -0400243 final OnDismissAction dismissAction = () -> false;
Lucas Dupin0df9b7a2018-03-15 17:53:17 -0700244 final Runnable cancelAction = () -> {};
245 mBouncer.showWithDismissAction(dismissAction, cancelAction);
246 verify(mKeyguardHostView).setOnDismissAction(dismissAction, cancelAction);
247 Assert.assertTrue("Should be showing", mBouncer.isShowing());
248 }
249
250 @Test
251 public void testStartPreHideAnimation_notifiesView() {
252 final boolean[] ran = {false};
253 final Runnable r = () -> ran[0] = true;
254 mBouncer.startPreHideAnimation(r);
255 Assert.assertTrue("Callback should have been invoked", ran[0]);
256
257 ran[0] = false;
258 mBouncer.ensureView();
259 mBouncer.startPreHideAnimation(r);
260 verify(mKeyguardHostView).startDisappearAnimation(r);
261 Assert.assertFalse("Callback should have been deferred", ran[0]);
262 }
263
264 @Test
Lucas Dupin3d565fa2018-03-20 15:40:14 -0700265 public void testIsShowing_animated() {
Lucas Dupin0df9b7a2018-03-15 17:53:17 -0700266 Assert.assertFalse("Show wasn't invoked yet", mBouncer.isShowing());
Lucas Dupin3d565fa2018-03-20 15:40:14 -0700267 mBouncer.show(true /* reset */);
268 Assert.assertTrue("Should be showing", mBouncer.isShowing());
269 }
270
271 @Test
272 public void testIsShowing_forSwipeUp() {
273 mBouncer.setExpansion(1f);
274 mBouncer.show(true /* reset */, false /* animated */);
275 Assert.assertFalse("Should only be showing after collapsing notification panel",
276 mBouncer.isShowing());
277 mBouncer.setExpansion(0f);
Lucas Dupin0df9b7a2018-03-15 17:53:17 -0700278 Assert.assertTrue("Should be showing", mBouncer.isShowing());
279 }
280
281 @Test
282 public void testSetExpansion() {
283 mBouncer.ensureView();
284 mBouncer.setExpansion(0.5f);
285 verify(mKeyguardHostView).setAlpha(anyFloat());
286 verify(mKeyguardHostView).setTranslationY(anyFloat());
287 }
288
289 @Test
290 public void testNeedsFullscreenBouncer_asksKeyguardView() {
291 mBouncer.ensureView();
292 mBouncer.needsFullscreenBouncer();
293 verify(mKeyguardHostView).getSecurityMode();
294 verify(mKeyguardHostView, never()).getCurrentSecurityMode();
295 }
296
297 @Test
298 public void testIsFullscreenBouncer_asksKeyguardView() {
299 mBouncer.ensureView();
300 mBouncer.isFullscreenBouncer();
301 verify(mKeyguardHostView).getCurrentSecurityMode();
302 verify(mKeyguardHostView, never()).getSecurityMode();
303 }
304
305 @Test
Lucas Dupin28dc9d72018-03-21 15:59:15 -0700306 public void testIsHiding_preHideOrHide() {
307 Assert.assertFalse("Should not be hiding on initial state", mBouncer.isAnimatingAway());
308 mBouncer.startPreHideAnimation(null /* runnable */);
309 Assert.assertTrue("Should be hiding during pre-hide", mBouncer.isAnimatingAway());
310 mBouncer.hide(false /* destroyView */);
311 Assert.assertFalse("Should be hidden after hide()", mBouncer.isAnimatingAway());
312 }
313
314 @Test
315 public void testIsHiding_skipsTranslation() {
316 mBouncer.show(false /* reset */);
317 reset(mKeyguardHostView);
318 mBouncer.startPreHideAnimation(null /* runnable */);
319 mBouncer.setExpansion(0.5f);
320 verify(mKeyguardHostView, never()).setTranslationY(anyFloat());
321 verify(mKeyguardHostView, never()).setAlpha(anyFloat());
322 }
323
324 @Test
Lucas Dupin0df9b7a2018-03-15 17:53:17 -0700325 public void testIsSecure() {
326 Assert.assertTrue("Bouncer is secure before inflating views", mBouncer.isSecure());
327
328 mBouncer.ensureView();
329 for (KeyguardSecurityModel.SecurityMode mode : KeyguardSecurityModel.SecurityMode.values()){
330 reset(mKeyguardHostView);
331 when(mKeyguardHostView.getSecurityMode()).thenReturn(mode);
332 Assert.assertEquals("Security doesn't match for mode: " + mode,
333 mBouncer.isSecure(), mode != KeyguardSecurityModel.SecurityMode.None);
334 }
335 }
Lucas Dupin6f0d71f2018-03-23 17:26:06 -0700336
337 @Test
Lucas Dupinf9ca35e2018-05-16 20:41:35 -0700338 public void testIsShowingScrimmed() {
339 mBouncer.show(false /* resetSecuritySelection */, true /* animate */);
340 assertThat(mBouncer.isShowingScrimmed()).isTrue();
341 mBouncer.show(false /* resetSecuritySelection */, false /* animate */);
342 assertThat(mBouncer.isShowingScrimmed()).isFalse();
343 }
344
345 @Test
Lucas Dupin6f0d71f2018-03-23 17:26:06 -0700346 public void testWillDismissWithAction() {
347 mBouncer.ensureView();
348 Assert.assertFalse("Action not set yet", mBouncer.willDismissWithAction());
349 when(mKeyguardHostView.hasDismissActions()).thenReturn(true);
350 Assert.assertTrue("Action should exist", mBouncer.willDismissWithAction());
351 }
Lucas Dupin6865b712017-09-11 12:28:03 -0700352}