blob: 67453d5da6c75b4dc717b498e7c4c70da339d059 [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 Dupin0df9b7a2018-03-15 17:53:17 -070019import static com.google.common.truth.Truth.assertThat;
Lucas Dupin6865b712017-09-11 12:28:03 -070020
Lucas Dupin0df9b7a2018-03-15 17:53:17 -070021import static org.mockito.ArgumentMatchers.any;
22import static org.mockito.ArgumentMatchers.anyFloat;
23import static org.mockito.ArgumentMatchers.anyInt;
24import static org.mockito.ArgumentMatchers.eq;
Lucas Dupin6f0d71f2018-03-23 17:26:06 -070025import static org.mockito.Mockito.mock;
Lucas Dupin0df9b7a2018-03-15 17:53:17 -070026import static org.mockito.Mockito.never;
27import static org.mockito.Mockito.reset;
28import static org.mockito.Mockito.spy;
29import static org.mockito.Mockito.verify;
30import static org.mockito.Mockito.verifyNoMoreInteractions;
31import static org.mockito.Mockito.verifyZeroInteractions;
32import static org.mockito.Mockito.when;
33
34import android.graphics.Color;
Lucas Dupin6865b712017-09-11 12:28:03 -070035import android.support.test.filters.SmallTest;
Lucas Dupin6865b712017-09-11 12:28:03 -070036import android.test.UiThreadTest;
Lucas Dupin0df9b7a2018-03-15 17:53:17 -070037import android.testing.AndroidTestingRunner;
38import android.testing.TestableLooper;
Lucas Dupin6865b712017-09-11 12:28:03 -070039import android.view.ViewGroup;
Lucas Dupin0df9b7a2018-03-15 17:53:17 -070040import android.view.ViewTreeObserver;
Lucas Dupin6865b712017-09-11 12:28:03 -070041import android.widget.FrameLayout;
42
43import com.android.internal.widget.LockPatternUtils;
Lucas Dupin0df9b7a2018-03-15 17:53:17 -070044import com.android.keyguard.KeyguardHostView;
45import com.android.keyguard.KeyguardSecurityModel;
Lucas Dupin6865b712017-09-11 12:28:03 -070046import com.android.keyguard.ViewMediatorCallback;
Lucas Dupin0df9b7a2018-03-15 17:53:17 -070047import com.android.systemui.DejankUtils;
Lucas Dupin6865b712017-09-11 12:28:03 -070048import com.android.systemui.SysuiTestCase;
Lucas Dupin0df9b7a2018-03-15 17:53:17 -070049import com.android.systemui.classifier.FalsingManager;
Lucas Dupin6865b712017-09-11 12:28:03 -070050import com.android.systemui.keyguard.DismissCallbackRegistry;
51
Lucas Dupin0df9b7a2018-03-15 17:53:17 -070052import org.junit.Assert;
53import org.junit.Before;
Lucas Dupin6865b712017-09-11 12:28:03 -070054import org.junit.Test;
55import org.junit.runner.RunWith;
Lucas Dupin0df9b7a2018-03-15 17:53:17 -070056import org.mockito.Mock;
57import org.mockito.MockitoAnnotations;
Lucas Dupin6865b712017-09-11 12:28:03 -070058
59@SmallTest
Lucas Dupin0df9b7a2018-03-15 17:53:17 -070060@RunWith(AndroidTestingRunner.class)
61@TestableLooper.RunWithLooper(setAsMainLooper = true)
Lucas Dupin6865b712017-09-11 12:28:03 -070062public class KeyguardBouncerTest extends SysuiTestCase {
63
Lucas Dupin0df9b7a2018-03-15 17:53:17 -070064 @Mock
65 private FalsingManager mFalsingManager;
66 @Mock
67 private ViewMediatorCallback mViewMediatorCallback;
68 @Mock
69 private LockPatternUtils mLockPatternUtils;
70 @Mock
71 private DismissCallbackRegistry mDismissCallbackRegistry;
72 @Mock
73 private KeyguardHostView mKeyguardHostView;
74 @Mock
75 private ViewTreeObserver mViewTreeObserver;
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() {
81 MockitoAnnotations.initMocks(this);
82 DejankUtils.setImmediate(true);
83 final ViewGroup container = new FrameLayout(getContext());
84 when(mKeyguardHostView.getViewTreeObserver()).thenReturn(mViewTreeObserver);
85 when(mKeyguardHostView.getHeight()).thenReturn(500);
86 mBouncer = new KeyguardBouncer(getContext(), mViewMediatorCallback,
87 mLockPatternUtils, container, mDismissCallbackRegistry, mFalsingManager) {
88 @Override
89 protected void inflateView() {
90 super.inflateView();
91 mKeyguardView = mKeyguardHostView;
92 }
93 };
Lucas Dupin6865b712017-09-11 12:28:03 -070094 }
95
Lucas Dupin0df9b7a2018-03-15 17:53:17 -070096 @Test
97 public void testInflateView_doesntCrash() {
98 mBouncer.inflateView();
99 }
100
101 @Test
102 public void testShow_notifiesFalsingManager() {
103 mBouncer.show(true);
104 verify(mFalsingManager).onBouncerShown();
105
106 mBouncer.show(true, false);
107 verifyNoMoreInteractions(mFalsingManager);
108 }
109
110 /**
111 * Regression test: Invisible bouncer when occluded.
112 */
113 @Test
114 public void testShow_bouncerIsVisible() {
115 // Expand notification panel as if we were in the keyguard.
116 mBouncer.ensureView();
117 mBouncer.setExpansion(1);
118
119 reset(mKeyguardHostView);
120 when(mKeyguardHostView.getHeight()).thenReturn(500);
121
122 mBouncer.show(true);
123 verify(mKeyguardHostView).setAlpha(eq(1f));
124 verify(mKeyguardHostView).setTranslationY(eq(0f));
125 }
126
127 @Test
128 public void testShow_notifiesVisibility() {
129 mBouncer.show(true);
130 verify(mViewMediatorCallback).onBouncerVisiblityChanged(eq(true));
131
132 // Not called again when visible
133 reset(mViewMediatorCallback);
134 mBouncer.show(true);
135 verifyNoMoreInteractions(mViewMediatorCallback);
136 }
137
138 @Test
139 public void testShow_triesToDismissKeyguard() {
140 mBouncer.show(true);
141 verify(mKeyguardHostView).dismiss(anyInt());
142 }
143
144 @Test
145 public void testShow_resetsSecuritySelection() {
146 mBouncer.show(false);
Lucas Dupin05726cd2018-03-13 14:00:24 -0700147 verify(mKeyguardHostView, never()).showPrimarySecurityScreen();
Lucas Dupin0df9b7a2018-03-15 17:53:17 -0700148
149 mBouncer.hide(false);
150 mBouncer.show(true);
151 verify(mKeyguardHostView).showPrimarySecurityScreen();
152 }
153
154 @Test
155 public void testShow_animatesKeyguardView() {
156 mBouncer.show(true);
157 verify(mKeyguardHostView).startAppearAnimation();
158 }
159
160 @Test
161 public void testShow_showsErrorMessage() {
162 final String errorMessage = "an error message";
163 when(mViewMediatorCallback.consumeCustomMessage()).thenReturn(errorMessage);
164 mBouncer.show(true);
165 verify(mKeyguardHostView).showErrorMessage(eq(errorMessage));
166 }
167
168 @Test
169 public void testOnFullyShown_notifiesFalsingManager() {
170 mBouncer.onFullyShown();
171 verify(mFalsingManager).onBouncerShown();
172 }
173
174 @Test
175 public void testOnFullyHidden_notifiesFalsingManager() {
176 mBouncer.onFullyHidden();
177 verify(mFalsingManager).onBouncerHidden();
178 }
179
180 @Test
181 public void testHide_notifiesFalsingManager() {
182 mBouncer.hide(false);
183 verify(mFalsingManager).onBouncerHidden();
184 }
185
186 @Test
187 public void testHide_notifiesVisibility() {
188 mBouncer.hide(false);
189 verify(mViewMediatorCallback).onBouncerVisiblityChanged(eq(false));
190 }
191
192 @Test
193 public void testHide_notifiesDismissCallbackIfVisible() {
194 mBouncer.hide(false);
195 verifyZeroInteractions(mDismissCallbackRegistry);
196 mBouncer.show(false);
197 mBouncer.hide(false);
198 verify(mDismissCallbackRegistry).notifyDismissCancelled();
199 }
200
201 @Test
202 public void testShowPromptReason_propagates() {
203 mBouncer.ensureView();
204 mBouncer.showPromptReason(1);
205 verify(mKeyguardHostView).showPromptReason(eq(1));
206 }
207
208 @Test
209 public void testShowMessage_propagates() {
210 final String message = "a message";
211 mBouncer.ensureView();
212 mBouncer.showMessage(message, Color.GREEN);
213 verify(mKeyguardHostView).showMessage(eq(message), eq(Color.GREEN));
214 }
215
216 @Test
217 public void testShowOnDismissAction_showsBouncer() {
218 final KeyguardHostView.OnDismissAction dismissAction = () -> false;
219 final Runnable cancelAction = () -> {};
220 mBouncer.showWithDismissAction(dismissAction, cancelAction);
221 verify(mKeyguardHostView).setOnDismissAction(dismissAction, cancelAction);
222 Assert.assertTrue("Should be showing", mBouncer.isShowing());
223 }
224
225 @Test
226 public void testStartPreHideAnimation_notifiesView() {
227 final boolean[] ran = {false};
228 final Runnable r = () -> ran[0] = true;
229 mBouncer.startPreHideAnimation(r);
230 Assert.assertTrue("Callback should have been invoked", ran[0]);
231
232 ran[0] = false;
233 mBouncer.ensureView();
234 mBouncer.startPreHideAnimation(r);
235 verify(mKeyguardHostView).startDisappearAnimation(r);
236 Assert.assertFalse("Callback should have been deferred", ran[0]);
237 }
238
239 @Test
Lucas Dupin3d565fa2018-03-20 15:40:14 -0700240 public void testIsShowing_animated() {
Lucas Dupin0df9b7a2018-03-15 17:53:17 -0700241 Assert.assertFalse("Show wasn't invoked yet", mBouncer.isShowing());
Lucas Dupin3d565fa2018-03-20 15:40:14 -0700242 mBouncer.show(true /* reset */);
243 Assert.assertTrue("Should be showing", mBouncer.isShowing());
244 }
245
246 @Test
247 public void testIsShowing_forSwipeUp() {
248 mBouncer.setExpansion(1f);
249 mBouncer.show(true /* reset */, false /* animated */);
250 Assert.assertFalse("Should only be showing after collapsing notification panel",
251 mBouncer.isShowing());
252 mBouncer.setExpansion(0f);
Lucas Dupin0df9b7a2018-03-15 17:53:17 -0700253 Assert.assertTrue("Should be showing", mBouncer.isShowing());
254 }
255
256 @Test
257 public void testSetExpansion() {
258 mBouncer.ensureView();
259 mBouncer.setExpansion(0.5f);
260 verify(mKeyguardHostView).setAlpha(anyFloat());
261 verify(mKeyguardHostView).setTranslationY(anyFloat());
262 }
263
264 @Test
265 public void testNeedsFullscreenBouncer_asksKeyguardView() {
266 mBouncer.ensureView();
267 mBouncer.needsFullscreenBouncer();
268 verify(mKeyguardHostView).getSecurityMode();
269 verify(mKeyguardHostView, never()).getCurrentSecurityMode();
270 }
271
272 @Test
273 public void testIsFullscreenBouncer_asksKeyguardView() {
274 mBouncer.ensureView();
275 mBouncer.isFullscreenBouncer();
276 verify(mKeyguardHostView).getCurrentSecurityMode();
277 verify(mKeyguardHostView, never()).getSecurityMode();
278 }
279
280 @Test
Lucas Dupin28dc9d72018-03-21 15:59:15 -0700281 public void testIsHiding_preHideOrHide() {
282 Assert.assertFalse("Should not be hiding on initial state", mBouncer.isAnimatingAway());
283 mBouncer.startPreHideAnimation(null /* runnable */);
284 Assert.assertTrue("Should be hiding during pre-hide", mBouncer.isAnimatingAway());
285 mBouncer.hide(false /* destroyView */);
286 Assert.assertFalse("Should be hidden after hide()", mBouncer.isAnimatingAway());
287 }
288
289 @Test
290 public void testIsHiding_skipsTranslation() {
291 mBouncer.show(false /* reset */);
292 reset(mKeyguardHostView);
293 mBouncer.startPreHideAnimation(null /* runnable */);
294 mBouncer.setExpansion(0.5f);
295 verify(mKeyguardHostView, never()).setTranslationY(anyFloat());
296 verify(mKeyguardHostView, never()).setAlpha(anyFloat());
297 }
298
299 @Test
Lucas Dupin0df9b7a2018-03-15 17:53:17 -0700300 public void testIsSecure() {
301 Assert.assertTrue("Bouncer is secure before inflating views", mBouncer.isSecure());
302
303 mBouncer.ensureView();
304 for (KeyguardSecurityModel.SecurityMode mode : KeyguardSecurityModel.SecurityMode.values()){
305 reset(mKeyguardHostView);
306 when(mKeyguardHostView.getSecurityMode()).thenReturn(mode);
307 Assert.assertEquals("Security doesn't match for mode: " + mode,
308 mBouncer.isSecure(), mode != KeyguardSecurityModel.SecurityMode.None);
309 }
310 }
Lucas Dupin6f0d71f2018-03-23 17:26:06 -0700311
312 @Test
313 public void testWillDismissWithAction() {
314 mBouncer.ensureView();
315 Assert.assertFalse("Action not set yet", mBouncer.willDismissWithAction());
316 when(mKeyguardHostView.hasDismissActions()).thenReturn(true);
317 Assert.assertTrue("Action should exist", mBouncer.willDismissWithAction());
318 }
Lucas Dupin6865b712017-09-11 12:28:03 -0700319}