blob: 85c247e11f94688f0eea07ae1d9c9243f718396f [file] [log] [blame]
Lucas Dupin9e3fa102017-11-08 17:16:55 -08001/*
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
Lyn Hanbde48202019-05-29 19:18:29 -070019import static com.android.systemui.statusbar.phone.ScrimController.OPAQUE;
20import static com.android.systemui.statusbar.phone.ScrimController.SEMI_TRANSPARENT;
21import static com.android.systemui.statusbar.phone.ScrimController.TRANSPARENT;
Lucas Dupin82aa1632017-12-13 00:13:57 -080022
23import static org.mockito.ArgumentMatchers.any;
Dave Mankoffa8749962019-10-18 10:44:07 -040024import static org.mockito.ArgumentMatchers.anyFloat;
Lucas Dupin82aa1632017-12-13 00:13:57 -080025import static org.mockito.ArgumentMatchers.anyInt;
26import static org.mockito.ArgumentMatchers.anyLong;
Lucas Dupinee4c9b72019-02-18 17:04:58 -080027import static org.mockito.ArgumentMatchers.anyString;
Dave Mankoffa8749962019-10-18 10:44:07 -040028import static org.mockito.Mockito.doAnswer;
Lucas Dupin9e3fa102017-11-08 17:16:55 -080029import static org.mockito.Mockito.mock;
30import static org.mockito.Mockito.never;
Lucas Dupin82aa1632017-12-13 00:13:57 -080031import static org.mockito.Mockito.reset;
Lucas Dupin067136c2018-03-27 18:03:25 -070032import static org.mockito.Mockito.spy;
Lucas Dupin9e3fa102017-11-08 17:16:55 -080033import static org.mockito.Mockito.verify;
Lucas Dupineea53b32017-12-18 13:47:14 -080034import static org.mockito.Mockito.verifyZeroInteractions;
Lucas Dupin9e3fa102017-11-08 17:16:55 -080035import static org.mockito.Mockito.when;
36
37import android.animation.Animator;
Lucas Dupin82aa1632017-12-13 00:13:57 -080038import android.app.AlarmManager;
Dave Mankoffa8749962019-10-18 10:44:07 -040039import android.content.res.Resources;
Lucas Dupin9e3fa102017-11-08 17:16:55 -080040import android.graphics.Color;
41import android.os.Handler;
Lucas Dupin9e3fa102017-11-08 17:16:55 -080042import android.testing.AndroidTestingRunner;
43import android.testing.TestableLooper;
44import android.view.View;
45
Brett Chabot84151d92019-02-27 15:37:59 -080046import androidx.test.filters.SmallTest;
47
shawnlin317db372018-04-09 19:49:48 +080048import com.android.internal.colorextraction.ColorExtractor.GradientColors;
Dave Mankoffe2294692019-08-14 11:53:13 -040049import com.android.keyguard.KeyguardUpdateMonitor;
Lucas Dupinfc6ba372019-10-01 15:21:16 -070050import com.android.systemui.DejankUtils;
Lucas Dupin9e3fa102017-11-08 17:16:55 -080051import com.android.systemui.SysuiTestCase;
Dave Mankoffa8749962019-10-18 10:44:07 -040052import com.android.systemui.colorextraction.SysuiColorExtractor;
Lucas Dupin9e3fa102017-11-08 17:16:55 -080053import com.android.systemui.statusbar.ScrimView;
Lucas Dupinc8f16e82019-09-17 18:24:50 -040054import com.android.systemui.statusbar.policy.KeyguardStateController;
Dave Mankoffa8749962019-10-18 10:44:07 -040055import com.android.systemui.util.wakelock.DelayedWakeLock;
Lucas Dupin9e3fa102017-11-08 17:16:55 -080056import com.android.systemui.utils.os.FakeHandler;
57
Lucas Dupin4dbe5182019-03-07 18:20:11 -080058import org.junit.After;
Lucas Dupin9e3fa102017-11-08 17:16:55 -080059import org.junit.Assert;
60import org.junit.Before;
61import org.junit.Test;
62import org.junit.runner.RunWith;
Dave Mankoffa8749962019-10-18 10:44:07 -040063import org.mockito.Mock;
64import org.mockito.MockitoAnnotations;
65import org.mockito.stubbing.Answer;
Lucas Dupin9e3fa102017-11-08 17:16:55 -080066
Lucas Dupin36ec73c2019-10-18 13:39:04 -070067import java.util.Arrays;
Lucas Dupin1c327432019-01-03 13:37:53 -080068import java.util.Collections;
Lucas Dupin78949b82018-04-03 18:54:39 -070069import java.util.HashSet;
Lucas Dupin9e3fa102017-11-08 17:16:55 -080070
71@RunWith(AndroidTestingRunner.class)
72@TestableLooper.RunWithLooper
73@SmallTest
74public class ScrimControllerTest extends SysuiTestCase {
75
Dave Mankoffa8749962019-10-18 10:44:07 -040076 private ScrimController mScrimController;
Lucas Dupin9e3fa102017-11-08 17:16:55 -080077 private ScrimView mScrimBehind;
78 private ScrimView mScrimInFront;
Lyn Hanbde48202019-05-29 19:18:29 -070079 private ScrimView mScrimForBubble;
Yohei Yukawa795f0102018-04-13 14:55:30 -070080 private ScrimState mScrimState;
shawnlin317db372018-04-09 19:49:48 +080081 private float mScrimBehindAlpha;
82 private GradientColors mScrimInFrontColor;
Lucas Dupin82aa1632017-12-13 00:13:57 -080083 private int mScrimVisibility;
Lucas Dupin9e3fa102017-11-08 17:16:55 -080084 private boolean mAlwaysOnEnabled;
Lucas Dupin54fbfb32019-03-05 18:08:13 -080085 private TestableLooper mLooper;
Dave Mankoffa8749962019-10-18 10:44:07 -040086 @Mock
87 private AlarmManager mAlarmManager;
88 @Mock
89 private DozeParameters mDozeParamenters;
90 @Mock
91 LightBarController mLightBarController;
92 @Mock
93 Resources mResources;
94 @Mock
95 DelayedWakeLock.Builder mDelayedWakeLockBuilder;
96 @Mock
97 private DelayedWakeLock mWakeLock;
98 @Mock
99 KeyguardStateController mKeyguardStateController;
100 @Mock
101 KeyguardUpdateMonitor mKeyguardUpdateMonitor;
102 @Mock
103 private SysuiColorExtractor mSysuiColorExtractor;
Lucas Dupin9e3fa102017-11-08 17:16:55 -0800104
Yohei Yukawa795f0102018-04-13 14:55:30 -0700105
Dave Mankoffa8749962019-10-18 10:44:07 -0400106 private static class AnimatorListener implements Animator.AnimatorListener {
107 private int mNumStarts;
108 private int mNumEnds;
109 private int mNumCancels;
110
111 @Override
112 public void onAnimationStart(Animator animation) {
113 mNumStarts++;
114 }
115
116 @Override
117 public void onAnimationEnd(Animator animation) {
118 mNumEnds++;
119 }
120
121 @Override
122 public void onAnimationCancel(Animator animation) {
123 mNumCancels++;
124 }
125
126 @Override
127 public void onAnimationRepeat(Animator animation) {
128
129 }
130
131 public int getNumStarts() {
132 return mNumStarts;
133 }
134
135 public int getNumEnds() {
136 return mNumEnds;
137 }
138
139 public int getNumCancels() {
140 return mNumCancels;
141 }
142
143 public void reset() {
144 mNumStarts = 0;
145 mNumEnds = 0;
146 mNumCancels = 0;
147 }
148 };
149
150 private AnimatorListener mAnimatorListener = new AnimatorListener();
151
152
153 private void finishAnimationsImmediately() {
154 // Execute code that will trigger animations.
155 mScrimController.onPreDraw();
156 // Force finish all animations.
157 mLooper.processAllMessages();
158 endAnimation(mScrimBehind);
159 endAnimation(mScrimInFront);
160 endAnimation(mScrimForBubble);
161
162 Assert.assertEquals("Animators did not finish",
163 mAnimatorListener.getNumStarts(), mAnimatorListener.getNumEnds());
164 }
165
166 private void endAnimation(View scrimView) {
167 Animator animator = getAnimator(scrimView);
168 if (animator != null) {
169 animator.end();
170 }
171 }
172
173 private Animator getAnimator(View scrimView) {
174 return (Animator) scrimView.getTag(ScrimController.TAG_KEY_ANIM);
175 }
176
Lucas Dupin9e3fa102017-11-08 17:16:55 -0800177 @Before
178 public void setup() {
Dave Mankoffa8749962019-10-18 10:44:07 -0400179 MockitoAnnotations.initMocks(this);
180
Lucas Dupin067136c2018-03-27 18:03:25 -0700181 mScrimBehind = spy(new ScrimView(getContext()));
Lucas Dupin9e3fa102017-11-08 17:16:55 -0800182 mScrimInFront = new ScrimView(getContext());
Lyn Hanbde48202019-05-29 19:18:29 -0700183 mScrimForBubble = new ScrimView(getContext());
Lucas Dupin9e3fa102017-11-08 17:16:55 -0800184 mAlwaysOnEnabled = true;
Lucas Dupin54fbfb32019-03-05 18:08:13 -0800185 mLooper = TestableLooper.get(this);
Dave Mankoffa8749962019-10-18 10:44:07 -0400186 DejankUtils.setImmediate(true);
187
188 // ScrimController uses mScrimBehind to delay some callbacks that we should run immediately.
189 doAnswer(invocation -> {
190 ((Runnable) invocation.getArgument(0)).run();
191 return null;
192 }).when(mScrimBehind).postOnAnimationDelayed(any(Runnable.class), anyLong());
193
Lucas Dupin9e3fa102017-11-08 17:16:55 -0800194 when(mDozeParamenters.getAlwaysOn()).thenAnswer(invocation -> mAlwaysOnEnabled);
Lucas Dupin43d0d732017-11-16 11:23:49 -0800195 when(mDozeParamenters.getDisplayNeedsBlanking()).thenReturn(true);
Dave Mankoffa8749962019-10-18 10:44:07 -0400196
197 doAnswer((Answer<Void>) invocation -> {
198 mScrimState = invocation.getArgument(0);
199 mScrimBehindAlpha = invocation.getArgument(1);
200 mScrimInFrontColor = invocation.getArgument(2);
201 return null;
202 }).when(mLightBarController).setScrimState(
203 any(ScrimState.class), anyFloat(), any(GradientColors.class));
204
205 when(mDelayedWakeLockBuilder.setHandler(any(Handler.class)))
206 .thenReturn(mDelayedWakeLockBuilder);
207 when(mDelayedWakeLockBuilder.setTag(any(String.class)))
208 .thenReturn(mDelayedWakeLockBuilder);
209 when(mDelayedWakeLockBuilder.build()).thenReturn(mWakeLock);
210
211 when(mSysuiColorExtractor.getNeutralColors()).thenReturn(new GradientColors());
212
213 mScrimController = new ScrimController(mLightBarController,
214 mDozeParamenters, mAlarmManager, mKeyguardStateController,
215 mResources, mDelayedWakeLockBuilder,
216 new FakeHandler(mLooper.getLooper()), mKeyguardUpdateMonitor, mSysuiColorExtractor);
217 mScrimController.setScrimVisibleListener(visible -> mScrimVisibility = visible);
218 mScrimController.attachViews(mScrimBehind, mScrimInFront, mScrimForBubble);
219 mScrimController.setAnimatorListener(mAnimatorListener);
220
Lucas Dupinf8463ee2018-06-11 16:18:15 -0700221 mScrimController.setHasBackdrop(false);
TYM Tsaia71c8922019-01-07 15:57:53 +0800222 mScrimController.setWallpaperSupportsAmbientMode(false);
Lucas Dupin4dbe5182019-03-07 18:20:11 -0800223 mScrimController.transitionTo(ScrimState.KEYGUARD);
Dave Mankoffa8749962019-10-18 10:44:07 -0400224 finishAnimationsImmediately();
Lucas Dupin9e3fa102017-11-08 17:16:55 -0800225 }
226
Lucas Dupin4dbe5182019-03-07 18:20:11 -0800227 @After
228 public void tearDown() {
Dave Mankoffa8749962019-10-18 10:44:07 -0400229 finishAnimationsImmediately();
Lucas Dupinfc6ba372019-10-01 15:21:16 -0700230 DejankUtils.setImmediate(false);
Lucas Dupin9e3fa102017-11-08 17:16:55 -0800231 }
232
233 @Test
234 public void transitionToKeyguard() {
235 mScrimController.transitionTo(ScrimState.KEYGUARD);
Dave Mankoffa8749962019-10-18 10:44:07 -0400236 finishAnimationsImmediately();
Lyn Hanbde48202019-05-29 19:18:29 -0700237
238 assertScrimAlpha(TRANSPARENT /* front */,
239 SEMI_TRANSPARENT /* back */,
240 TRANSPARENT /* bubble */);
241
242 assertScrimTint(true /* front */,
243 true /* behind */,
244 false /* bubble */);
Lucas Dupin9e3fa102017-11-08 17:16:55 -0800245 }
246
247 @Test
Lucas Dupinedbe45b2019-10-14 15:43:03 -0700248 public void transitionToOff() {
249 mScrimController.transitionTo(ScrimState.OFF);
Dave Mankoffa8749962019-10-18 10:44:07 -0400250 finishAnimationsImmediately();
Lucas Dupinedbe45b2019-10-14 15:43:03 -0700251
252 assertScrimAlpha(OPAQUE /* front */,
Lucas Dupin36ec73c2019-10-18 13:39:04 -0700253 OPAQUE /* back */,
Lucas Dupinedbe45b2019-10-14 15:43:03 -0700254 TRANSPARENT /* bubble */);
255
256 assertScrimTint(true /* front */,
257 true /* behind */,
258 false /* bubble */);
259 }
260
261 @Test
Lucas Dupin7517b5d2017-08-22 12:51:25 -0700262 public void transitionToAod_withRegularWallpaper() {
263 mScrimController.transitionTo(ScrimState.AOD);
Dave Mankoffa8749962019-10-18 10:44:07 -0400264 finishAnimationsImmediately();
Lyn Hanbde48202019-05-29 19:18:29 -0700265
266 assertScrimAlpha(TRANSPARENT /* front */,
267 OPAQUE /* back */,
268 TRANSPARENT /* bubble */);
269
270 assertScrimTint(true /* front */,
271 true /* behind */,
272 false /* bubble */);
Lucas Dupin7517b5d2017-08-22 12:51:25 -0700273 }
274
275 @Test
276 public void transitionToAod_withAodWallpaper() {
277 mScrimController.setWallpaperSupportsAmbientMode(true);
278 mScrimController.transitionTo(ScrimState.AOD);
Dave Mankoffa8749962019-10-18 10:44:07 -0400279 finishAnimationsImmediately();
Lyn Hanbde48202019-05-29 19:18:29 -0700280
281 assertScrimAlpha(TRANSPARENT /* front */,
282 TRANSPARENT /* back */,
283 TRANSPARENT /* bubble */);
Lucas Dupin82aa1632017-12-13 00:13:57 -0800284
Lucas Dupin00be88f2019-01-03 17:50:52 -0800285 // Pulsing notification should conserve AOD wallpaper.
Lucas Dupin82aa1632017-12-13 00:13:57 -0800286 mScrimController.transitionTo(ScrimState.PULSING);
Dave Mankoffa8749962019-10-18 10:44:07 -0400287 finishAnimationsImmediately();
Lyn Hanbde48202019-05-29 19:18:29 -0700288
289 assertScrimAlpha(TRANSPARENT /* front */,
290 TRANSPARENT /* back */,
291 TRANSPARENT /* bubble */);
Lucas Dupin7517b5d2017-08-22 12:51:25 -0700292 }
293
294 @Test
295 public void transitionToAod_withAodWallpaperAndLockScreenWallpaper() {
Lucas Dupinf8463ee2018-06-11 16:18:15 -0700296 mScrimController.setHasBackdrop(true);
Lucas Dupin7517b5d2017-08-22 12:51:25 -0700297 mScrimController.setWallpaperSupportsAmbientMode(true);
Lucas Dupin9e3fa102017-11-08 17:16:55 -0800298 mScrimController.transitionTo(ScrimState.AOD);
Dave Mankoffa8749962019-10-18 10:44:07 -0400299 finishAnimationsImmediately();
Lyn Hanbde48202019-05-29 19:18:29 -0700300
301 assertScrimAlpha(TRANSPARENT /* front */,
302 OPAQUE /* back */,
303 TRANSPARENT /* bubble */);
304
305 assertScrimTint(true /* front */,
306 true /* behind */,
307 false /* bubble */);
Lucas Dupin9e3fa102017-11-08 17:16:55 -0800308 }
309
310 @Test
Lucas Dupin9bee5822018-07-09 14:32:53 -0700311 public void setHasBackdrop_withAodWallpaperAndAlbumArt() {
312 mScrimController.setWallpaperSupportsAmbientMode(true);
313 mScrimController.transitionTo(ScrimState.AOD);
Dave Mankoffa8749962019-10-18 10:44:07 -0400314 finishAnimationsImmediately();
Lucas Dupin9bee5822018-07-09 14:32:53 -0700315 mScrimController.setHasBackdrop(true);
Dave Mankoffa8749962019-10-18 10:44:07 -0400316 finishAnimationsImmediately();
Lyn Hanbde48202019-05-29 19:18:29 -0700317
318 assertScrimAlpha(TRANSPARENT /* front */,
319 OPAQUE /* back */,
320 TRANSPARENT /* bubble */);
321
322 assertScrimTint(true /* front */,
323 true /* behind */,
324 false /* bubble */);
Lucas Dupin9bee5822018-07-09 14:32:53 -0700325 }
326
327 @Test
Michael Wrightcae88752018-04-16 23:13:54 +0100328 public void transitionToAod_withFrontAlphaUpdates() {
329 // Assert that setting the AOD front scrim alpha doesn't take effect in a non-AOD state.
330 mScrimController.transitionTo(ScrimState.KEYGUARD);
331 mScrimController.setAodFrontScrimAlpha(0.5f);
Dave Mankoffa8749962019-10-18 10:44:07 -0400332 finishAnimationsImmediately();
Lyn Hanbde48202019-05-29 19:18:29 -0700333
334 assertScrimAlpha(TRANSPARENT /* front */,
335 SEMI_TRANSPARENT /* back */,
336 TRANSPARENT /* bubble */);
Michael Wrightcae88752018-04-16 23:13:54 +0100337
338 // ... but that it does take effect once we enter the AOD state.
339 mScrimController.transitionTo(ScrimState.AOD);
Dave Mankoffa8749962019-10-18 10:44:07 -0400340 finishAnimationsImmediately();
Lyn Hanbde48202019-05-29 19:18:29 -0700341 assertScrimAlpha(SEMI_TRANSPARENT /* front */,
342 OPAQUE /* back */,
343 TRANSPARENT /* bubble */);
Michael Wrightcae88752018-04-16 23:13:54 +0100344
345 // ... and that if we set it while we're in AOD, it does take immediate effect.
346 mScrimController.setAodFrontScrimAlpha(1f);
Lyn Hanbde48202019-05-29 19:18:29 -0700347 assertScrimAlpha(OPAQUE /* front */,
348 OPAQUE /* back */,
349 TRANSPARENT /* bubble */);
Michael Wrightcae88752018-04-16 23:13:54 +0100350
351 // ... and make sure we recall the previous front scrim alpha even if we transition away
352 // for a bit.
353 mScrimController.transitionTo(ScrimState.UNLOCKED);
354 mScrimController.transitionTo(ScrimState.AOD);
Dave Mankoffa8749962019-10-18 10:44:07 -0400355 finishAnimationsImmediately();
Lyn Hanbde48202019-05-29 19:18:29 -0700356 assertScrimAlpha(OPAQUE /* front */,
357 OPAQUE /* back */,
358 TRANSPARENT /* bubble */);
Michael Wrightcae88752018-04-16 23:13:54 +0100359
Lucas Dupin69bda602018-05-18 17:24:52 -0700360 // ... and alpha updates should be completely ignored if always_on is off.
361 // Passing it forward would mess up the wake-up transition.
362 mAlwaysOnEnabled = false;
363 mScrimController.transitionTo(ScrimState.UNLOCKED);
364 mScrimController.transitionTo(ScrimState.AOD);
Dave Mankoffa8749962019-10-18 10:44:07 -0400365 finishAnimationsImmediately();
Lucas Dupin69bda602018-05-18 17:24:52 -0700366 mScrimController.setAodFrontScrimAlpha(0.3f);
367 Assert.assertEquals(ScrimState.AOD.getFrontAlpha(), mScrimInFront.getViewAlpha(), 0.001f);
368 Assert.assertNotEquals(0.3f, mScrimInFront.getViewAlpha(), 0.001f);
369
Michael Wrightcae88752018-04-16 23:13:54 +0100370 // Reset value since enums are static.
371 mScrimController.setAodFrontScrimAlpha(0f);
372 }
373
374 @Test
Chris.CC Leed424e202019-09-16 12:17:19 +0800375 public void transitionToPulsing_withFrontAlphaUpdates() {
Lucas Dupin82aa1632017-12-13 00:13:57 -0800376 // Pre-condition
377 // Need to go to AoD first because PULSING doesn't change
378 // the back scrim opacity - otherwise it would hide AoD wallpapers.
379 mScrimController.setWallpaperSupportsAmbientMode(false);
380 mScrimController.transitionTo(ScrimState.AOD);
Dave Mankoffa8749962019-10-18 10:44:07 -0400381 finishAnimationsImmediately();
Lyn Hanbde48202019-05-29 19:18:29 -0700382 assertScrimAlpha(TRANSPARENT /* front */,
383 OPAQUE /* back */,
384 TRANSPARENT /* bubble */);
Lucas Dupin82aa1632017-12-13 00:13:57 -0800385
Lucas Dupin9e3fa102017-11-08 17:16:55 -0800386 mScrimController.transitionTo(ScrimState.PULSING);
Dave Mankoffa8749962019-10-18 10:44:07 -0400387 finishAnimationsImmediately();
Lucas Dupina7eacf92019-07-24 12:40:34 -0700388 // Front scrim should be transparent, but tinted
Lucas Dupinde64ee02018-12-21 14:45:12 -0800389 // Back scrim should be semi-transparent so the user can see the wallpaper
Lucas Dupin9e3fa102017-11-08 17:16:55 -0800390 // Pulse callback should have been invoked
Lyn Hanbde48202019-05-29 19:18:29 -0700391 assertScrimAlpha(TRANSPARENT /* front */,
392 OPAQUE /* back */,
393 TRANSPARENT /* bubble */);
394
Mady Mellor4035ef52019-07-25 11:10:02 -0700395 assertScrimTint(true /* front */,
Lyn Hanbde48202019-05-29 19:18:29 -0700396 true /* behind */,
397 false /* bubble */);
Lucas Dupin5f00fa52019-03-27 22:46:53 -0700398
Chris.CC Leed424e202019-09-16 12:17:19 +0800399 // ... and when ambient goes dark, front scrim should be semi-transparent
400 mScrimController.setAodFrontScrimAlpha(0.5f);
Dave Mankoffa8749962019-10-18 10:44:07 -0400401 finishAnimationsImmediately();
Chris.CC Leed424e202019-09-16 12:17:19 +0800402 // Front scrim should be semi-transparent
403 assertScrimAlpha(SEMI_TRANSPARENT /* front */,
404 OPAQUE /* back */,
405 TRANSPARENT /* bubble */);
406
Lucas Dupin5f00fa52019-03-27 22:46:53 -0700407 mScrimController.setWakeLockScreenSensorActive(true);
Dave Mankoffa8749962019-10-18 10:44:07 -0400408 finishAnimationsImmediately();
Chris.CC Leed424e202019-09-16 12:17:19 +0800409 assertScrimAlpha(SEMI_TRANSPARENT /* front */,
Lyn Hanbde48202019-05-29 19:18:29 -0700410 SEMI_TRANSPARENT /* back */,
411 TRANSPARENT /* bubble */);
Chris.CC Leed424e202019-09-16 12:17:19 +0800412
413 // Reset value since enums are static.
414 mScrimController.setAodFrontScrimAlpha(0f);
Lucas Dupin9e3fa102017-11-08 17:16:55 -0800415 }
416
417 @Test
Lucas Dupinbc9aac12018-03-04 20:18:15 -0800418 public void transitionToKeyguardBouncer() {
Lucas Dupin9e3fa102017-11-08 17:16:55 -0800419 mScrimController.transitionTo(ScrimState.BOUNCER);
Dave Mankoffa8749962019-10-18 10:44:07 -0400420 finishAnimationsImmediately();
Lucas Dupin9e3fa102017-11-08 17:16:55 -0800421 // Front scrim should be transparent
422 // Back scrim should be visible without tint
Lyn Hanbde48202019-05-29 19:18:29 -0700423 assertScrimAlpha(TRANSPARENT /* front */,
424 SEMI_TRANSPARENT /* back */,
425 TRANSPARENT /* bubble */);
426
427 assertScrimTint(false /* front */,
428 false /* behind */,
429 false /* bubble */);
Lucas Dupinbc9aac12018-03-04 20:18:15 -0800430 }
431
432 @Test
433 public void transitionToBouncer() {
Lucas Dupin05726cd2018-03-13 14:00:24 -0700434 mScrimController.transitionTo(ScrimState.BOUNCER_SCRIMMED);
Dave Mankoffa8749962019-10-18 10:44:07 -0400435 finishAnimationsImmediately();
Lucas Dupinbc9aac12018-03-04 20:18:15 -0800436 // Front scrim should be transparent
437 // Back scrim should be visible without tint
Lyn Hanbde48202019-05-29 19:18:29 -0700438 assertScrimAlpha(SEMI_TRANSPARENT /* front */,
439 TRANSPARENT /* back */,
440 TRANSPARENT /* bubble */);
441 assertScrimTint(false /* front */,
442 false /* behind */,
443 false /* bubble */);
Lucas Dupin9e3fa102017-11-08 17:16:55 -0800444 }
445
446 @Test
447 public void transitionToUnlocked() {
Lucas Dupin80a3fcc2018-02-07 10:49:55 -0800448 mScrimController.setPanelExpansion(0f);
Lucas Dupin9e3fa102017-11-08 17:16:55 -0800449 mScrimController.transitionTo(ScrimState.UNLOCKED);
Dave Mankoffa8749962019-10-18 10:44:07 -0400450 finishAnimationsImmediately();
Lyn Hanbde48202019-05-29 19:18:29 -0700451 assertScrimAlpha(TRANSPARENT /* front */,
452 TRANSPARENT /* back */,
453 TRANSPARENT /* bubble */);
454
455 assertScrimTint(false /* front */,
456 false /* behind */,
457 false /* bubble */);
Lucas Dupin9e3fa102017-11-08 17:16:55 -0800458
459 // Back scrim should be visible after start dragging
460 mScrimController.setPanelExpansion(0.5f);
Lyn Hanbde48202019-05-29 19:18:29 -0700461 assertScrimAlpha(TRANSPARENT /* front */,
462 SEMI_TRANSPARENT /* back */,
463 TRANSPARENT /* bubble */);
Lucas Dupin9e3fa102017-11-08 17:16:55 -0800464 }
465
466 @Test
Mady Mellor0c333772018-11-06 18:05:54 -0800467 public void transitionToBubbleExpanded() {
468 mScrimController.transitionTo(ScrimState.BUBBLE_EXPANDED);
Dave Mankoffa8749962019-10-18 10:44:07 -0400469 finishAnimationsImmediately();
Mady Mellor0c333772018-11-06 18:05:54 -0800470
Lyn Hanbde48202019-05-29 19:18:29 -0700471 assertScrimTint(false /* front */,
472 false /* behind */,
473 false /* bubble */);
474
Mady Mellor0c333772018-11-06 18:05:54 -0800475 // Front scrim should be transparent
Lyn Hanbde48202019-05-29 19:18:29 -0700476 Assert.assertEquals(ScrimController.TRANSPARENT,
Mady Mellor0c333772018-11-06 18:05:54 -0800477 mScrimInFront.getViewAlpha(), 0.0f);
478 // Back scrim should be visible
479 Assert.assertEquals(ScrimController.GRADIENT_SCRIM_ALPHA_BUSY,
480 mScrimBehind.getViewAlpha(), 0.0f);
Lyn Hanbde48202019-05-29 19:18:29 -0700481 // Bubble scrim should be visible
482 Assert.assertEquals(ScrimController.GRADIENT_SCRIM_ALPHA_BUSY,
483 mScrimBehind.getViewAlpha(), 0.0f);
Mady Mellor0c333772018-11-06 18:05:54 -0800484 }
485
486 @Test
Yohei Yukawa795f0102018-04-13 14:55:30 -0700487 public void scrimStateCallback() {
488 mScrimController.transitionTo(ScrimState.UNLOCKED);
Dave Mankoffa8749962019-10-18 10:44:07 -0400489 finishAnimationsImmediately();
Yohei Yukawa795f0102018-04-13 14:55:30 -0700490 Assert.assertEquals(mScrimState, ScrimState.UNLOCKED);
491
492 mScrimController.transitionTo(ScrimState.BOUNCER);
Dave Mankoffa8749962019-10-18 10:44:07 -0400493 finishAnimationsImmediately();
Yohei Yukawa795f0102018-04-13 14:55:30 -0700494 Assert.assertEquals(mScrimState, ScrimState.BOUNCER);
495
496 mScrimController.transitionTo(ScrimState.BOUNCER_SCRIMMED);
Dave Mankoffa8749962019-10-18 10:44:07 -0400497 finishAnimationsImmediately();
Yohei Yukawa795f0102018-04-13 14:55:30 -0700498 Assert.assertEquals(mScrimState, ScrimState.BOUNCER_SCRIMMED);
499 }
500
501 @Test
shawnlin317db372018-04-09 19:49:48 +0800502 public void panelExpansion() {
503 mScrimController.setPanelExpansion(0f);
504 mScrimController.setPanelExpansion(0.5f);
505 mScrimController.transitionTo(ScrimState.UNLOCKED);
Dave Mankoffa8749962019-10-18 10:44:07 -0400506 finishAnimationsImmediately();
shawnlin317db372018-04-09 19:49:48 +0800507
508 reset(mScrimBehind);
509 mScrimController.setPanelExpansion(0f);
510 mScrimController.setPanelExpansion(1.0f);
Dave Mankoffa8749962019-10-18 10:44:07 -0400511 finishAnimationsImmediately();
shawnlin317db372018-04-09 19:49:48 +0800512
513 Assert.assertEquals("Scrim alpha should change after setPanelExpansion",
514 mScrimBehindAlpha, mScrimBehind.getViewAlpha(), 0.01f);
515
516 mScrimController.setPanelExpansion(0f);
Dave Mankoffa8749962019-10-18 10:44:07 -0400517 finishAnimationsImmediately();
shawnlin317db372018-04-09 19:49:48 +0800518
519 Assert.assertEquals("Scrim alpha should change after setPanelExpansion",
520 mScrimBehindAlpha, mScrimBehind.getViewAlpha(), 0.01f);
521 }
522
523 @Test
Lucas Dupin67f02632018-03-12 11:08:31 -0700524 public void panelExpansionAffectsAlpha() {
525 mScrimController.setPanelExpansion(0f);
526 mScrimController.setPanelExpansion(0.5f);
527 mScrimController.transitionTo(ScrimState.UNLOCKED);
Dave Mankoffa8749962019-10-18 10:44:07 -0400528 finishAnimationsImmediately();
Lucas Dupin67f02632018-03-12 11:08:31 -0700529
530 final float scrimAlpha = mScrimBehind.getViewAlpha();
Lucas Dupin067136c2018-03-27 18:03:25 -0700531 reset(mScrimBehind);
Lucas Dupin67f02632018-03-12 11:08:31 -0700532 mScrimController.setExpansionAffectsAlpha(false);
533 mScrimController.setPanelExpansion(0.8f);
Lucas Dupin067136c2018-03-27 18:03:25 -0700534 verifyZeroInteractions(mScrimBehind);
Lucas Dupin67f02632018-03-12 11:08:31 -0700535 Assert.assertEquals("Scrim opacity shouldn't change when setExpansionAffectsAlpha "
536 + "is false", scrimAlpha, mScrimBehind.getViewAlpha(), 0.01f);
537
538 mScrimController.setExpansionAffectsAlpha(true);
539 mScrimController.setPanelExpansion(0.1f);
Dave Mankoffa8749962019-10-18 10:44:07 -0400540 finishAnimationsImmediately();
Lucas Dupin67f02632018-03-12 11:08:31 -0700541 Assert.assertNotEquals("Scrim opacity should change when setExpansionAffectsAlpha "
542 + "is true", scrimAlpha, mScrimBehind.getViewAlpha(), 0.01f);
543 }
544
545 @Test
Lucas Dupin9e3fa102017-11-08 17:16:55 -0800546 public void transitionToUnlockedFromAod() {
547 // Simulate unlock with fingerprint
548 mScrimController.transitionTo(ScrimState.AOD);
Lucas Dupin80a3fcc2018-02-07 10:49:55 -0800549 mScrimController.setPanelExpansion(0f);
Dave Mankoffa8749962019-10-18 10:44:07 -0400550 finishAnimationsImmediately();
Lucas Dupin9e3fa102017-11-08 17:16:55 -0800551 mScrimController.transitionTo(ScrimState.UNLOCKED);
Lyn Hanbde48202019-05-29 19:18:29 -0700552
553 // Immediately tinted black after the transition starts
554 assertScrimTint(true /* front */,
555 true /* behind */,
556 true /* bubble */);
557
Dave Mankoffa8749962019-10-18 10:44:07 -0400558 finishAnimationsImmediately();
Lyn Hanbde48202019-05-29 19:18:29 -0700559
560 // All scrims should be transparent at the end of fade transition.
561 assertScrimAlpha(TRANSPARENT /* front */,
562 TRANSPARENT /* behind */,
563 TRANSPARENT /* bubble */);
564
Selim Cinek22fa9752019-09-26 16:53:31 -0700565 // Make sure at the very end of the animation, we're reset to transparent
Lyn Hanbde48202019-05-29 19:18:29 -0700566 assertScrimTint(false /* front */,
567 false /* behind */,
568 false /* bubble */);
Lucas Dupin9e3fa102017-11-08 17:16:55 -0800569 }
570
571 @Test
Lucas Dupinea0116e2018-04-05 10:09:29 -0700572 public void scrimBlanksBeforeLeavingAod() {
Lucas Dupin9e3fa102017-11-08 17:16:55 -0800573 // Simulate unlock with fingerprint
574 mScrimController.transitionTo(ScrimState.AOD);
Dave Mankoffa8749962019-10-18 10:44:07 -0400575 finishAnimationsImmediately();
Lucas Dupin9e3fa102017-11-08 17:16:55 -0800576 mScrimController.transitionTo(ScrimState.UNLOCKED,
577 new ScrimController.Callback() {
578 @Override
579 public void onDisplayBlanked() {
580 // Front scrim should be black in the middle of the transition
581 Assert.assertTrue("Scrim should be visible during transition. Alpha: "
582 + mScrimInFront.getViewAlpha(), mScrimInFront.getViewAlpha() > 0);
Lyn Hanbde48202019-05-29 19:18:29 -0700583 assertScrimTint(true /* front */,
584 true /* behind */,
585 true /* bubble */);
Lucas Dupin82aa1632017-12-13 00:13:57 -0800586 Assert.assertSame("Scrim should be visible during transition.",
Lyn Hanbde48202019-05-29 19:18:29 -0700587 mScrimVisibility, OPAQUE);
Lucas Dupin9e3fa102017-11-08 17:16:55 -0800588 }
589 });
Dave Mankoffa8749962019-10-18 10:44:07 -0400590 finishAnimationsImmediately();
Lucas Dupin9e3fa102017-11-08 17:16:55 -0800591 }
592
593 @Test
Lucas Dupineb840ea2018-06-01 00:28:58 -0700594 public void scrimBlanksWhenUnlockingFromPulse() {
595 boolean[] blanked = {false};
596 // Simulate unlock with fingerprint
597 mScrimController.transitionTo(ScrimState.PULSING);
Dave Mankoffa8749962019-10-18 10:44:07 -0400598 finishAnimationsImmediately();
Lucas Dupineb840ea2018-06-01 00:28:58 -0700599 mScrimController.transitionTo(ScrimState.UNLOCKED,
600 new ScrimController.Callback() {
601 @Override
602 public void onDisplayBlanked() {
603 blanked[0] = true;
604 }
605 });
Dave Mankoffa8749962019-10-18 10:44:07 -0400606 finishAnimationsImmediately();
Lucas Dupineb840ea2018-06-01 00:28:58 -0700607 Assert.assertTrue("Scrim should blank when unlocking from pulse.", blanked[0]);
608 }
609
610 @Test
Lucas Dupin9e3fa102017-11-08 17:16:55 -0800611 public void testScrimCallback() {
612 int[] callOrder = {0, 0, 0};
613 int[] currentCall = {0};
614 mScrimController.transitionTo(ScrimState.AOD, new ScrimController.Callback() {
615 @Override
616 public void onStart() {
617 callOrder[0] = ++currentCall[0];
618 }
619
620 @Override
621 public void onDisplayBlanked() {
622 callOrder[1] = ++currentCall[0];
623 }
624
625 @Override
626 public void onFinished() {
627 callOrder[2] = ++currentCall[0];
628 }
629 });
Dave Mankoffa8749962019-10-18 10:44:07 -0400630 finishAnimationsImmediately();
Lucas Dupin9e3fa102017-11-08 17:16:55 -0800631 Assert.assertEquals("onStart called in wrong order", 1, callOrder[0]);
632 Assert.assertEquals("onDisplayBlanked called in wrong order", 2, callOrder[1]);
633 Assert.assertEquals("onFinished called in wrong order", 3, callOrder[2]);
634 }
635
636 @Test
637 public void testScrimCallbacksWithoutAmbientDisplay() {
638 mAlwaysOnEnabled = false;
639 testScrimCallback();
640 }
641
642 @Test
643 public void testScrimCallbackCancelled() {
644 boolean[] cancelledCalled = {false};
645 mScrimController.transitionTo(ScrimState.AOD, new ScrimController.Callback() {
646 @Override
647 public void onCancelled() {
648 cancelledCalled[0] = true;
649 }
650 });
651 mScrimController.transitionTo(ScrimState.PULSING);
652 Assert.assertTrue("onCancelled should have been called", cancelledCalled[0]);
653 }
654
655 @Test
Lucas Dupineea53b32017-12-18 13:47:14 -0800656 public void testHoldsWakeLock_whenAOD() {
Lucas Dupin9e3fa102017-11-08 17:16:55 -0800657 mScrimController.transitionTo(ScrimState.AOD);
Lucas Dupinee4c9b72019-02-18 17:04:58 -0800658 verify(mWakeLock).acquire(anyString());
659 verify(mWakeLock, never()).release(anyString());
Dave Mankoffa8749962019-10-18 10:44:07 -0400660 finishAnimationsImmediately();
Lucas Dupinee4c9b72019-02-18 17:04:58 -0800661 verify(mWakeLock).release(anyString());
Lucas Dupin9e3fa102017-11-08 17:16:55 -0800662 }
663
Lucas Dupin19aba8e2017-12-11 12:42:26 -0800664 @Test
Lucas Dupineea53b32017-12-18 13:47:14 -0800665 public void testDoesNotHoldWakeLock_whenUnlocking() {
666 mScrimController.transitionTo(ScrimState.UNLOCKED);
Dave Mankoffa8749962019-10-18 10:44:07 -0400667 finishAnimationsImmediately();
Lucas Dupineea53b32017-12-18 13:47:14 -0800668 verifyZeroInteractions(mWakeLock);
669 }
670
671 @Test
Lucas Dupin19aba8e2017-12-11 12:42:26 -0800672 public void testCallbackInvokedOnSameStateTransition() {
673 mScrimController.transitionTo(ScrimState.UNLOCKED);
Dave Mankoffa8749962019-10-18 10:44:07 -0400674 finishAnimationsImmediately();
Lucas Dupin19aba8e2017-12-11 12:42:26 -0800675 ScrimController.Callback callback = mock(ScrimController.Callback.class);
676 mScrimController.transitionTo(ScrimState.UNLOCKED, callback);
Lucas Dupin82aa1632017-12-13 00:13:57 -0800677 verify(callback).onFinished();
678 }
679
680 @Test
681 public void testHoldsAodWallpaperAnimationLock() {
682 // Pre-conditions
683 mScrimController.transitionTo(ScrimState.AOD);
Dave Mankoffa8749962019-10-18 10:44:07 -0400684 finishAnimationsImmediately();
Lucas Dupin82aa1632017-12-13 00:13:57 -0800685 reset(mWakeLock);
686
687 mScrimController.onHideWallpaperTimeout();
Lucas Dupinee4c9b72019-02-18 17:04:58 -0800688 verify(mWakeLock).acquire(anyString());
689 verify(mWakeLock, never()).release(anyString());
Dave Mankoffa8749962019-10-18 10:44:07 -0400690 finishAnimationsImmediately();
Lucas Dupinee4c9b72019-02-18 17:04:58 -0800691 verify(mWakeLock).release(anyString());
Lucas Dupin82aa1632017-12-13 00:13:57 -0800692 }
693
694 @Test
TYM Tsaia71c8922019-01-07 15:57:53 +0800695 public void testHoldsPulsingWallpaperAnimationLock() {
696 // Pre-conditions
Lucas Dupin00be88f2019-01-03 17:50:52 -0800697 mScrimController.transitionTo(ScrimState.PULSING);
Dave Mankoffa8749962019-10-18 10:44:07 -0400698 finishAnimationsImmediately();
TYM Tsaia71c8922019-01-07 15:57:53 +0800699 reset(mWakeLock);
700
701 mScrimController.onHideWallpaperTimeout();
Lucas Dupinee4c9b72019-02-18 17:04:58 -0800702 verify(mWakeLock).acquire(anyString());
703 verify(mWakeLock, never()).release(anyString());
Dave Mankoffa8749962019-10-18 10:44:07 -0400704 finishAnimationsImmediately();
Lucas Dupinee4c9b72019-02-18 17:04:58 -0800705 verify(mWakeLock).release(anyString());
TYM Tsaia71c8922019-01-07 15:57:53 +0800706 }
707
708 @Test
Lucas Dupin16cfe452018-02-08 13:14:50 -0800709 public void testWillHideAodWallpaper() {
Lucas Dupin82aa1632017-12-13 00:13:57 -0800710 mScrimController.setWallpaperSupportsAmbientMode(true);
711 mScrimController.transitionTo(ScrimState.AOD);
712 verify(mAlarmManager).setExact(anyInt(), anyLong(), any(), any(), any());
713 mScrimController.transitionTo(ScrimState.KEYGUARD);
714 verify(mAlarmManager).cancel(any(AlarmManager.OnAlarmListener.class));
Lucas Dupin19aba8e2017-12-11 12:42:26 -0800715 }
716
Lucas Dupin80a3fcc2018-02-07 10:49:55 -0800717 @Test
Jerry Changbde4c0c2019-06-13 16:58:41 +0800718 public void transitionToPulsing_withTimeoutWallpaperCallback_willHideWallpaper() {
719 mScrimController.setWallpaperSupportsAmbientMode(true);
720
721 mScrimController.transitionTo(ScrimState.PULSING, new ScrimController.Callback() {
722 @Override
723 public boolean shouldTimeoutWallpaper() {
724 return true;
725 }
726 });
727
728 verify(mAlarmManager).setExact(anyInt(), anyLong(), any(), any(), any());
729 }
730
731 @Test
732 public void transitionToPulsing_withDefaultCallback_wontHideWallpaper() {
733 mScrimController.setWallpaperSupportsAmbientMode(true);
734
735 mScrimController.transitionTo(ScrimState.PULSING, new ScrimController.Callback() {});
736
737 verify(mAlarmManager, never()).setExact(anyInt(), anyLong(), any(), any(), any());
738 }
739
740 @Test
741 public void transitionToPulsing_withoutCallback_wontHideWallpaper() {
742 mScrimController.setWallpaperSupportsAmbientMode(true);
743
744 mScrimController.transitionTo(ScrimState.PULSING);
745
746 verify(mAlarmManager, never()).setExact(anyInt(), anyLong(), any(), any(), any());
747 }
748
749 @Test
Lucas Dupin80a3fcc2018-02-07 10:49:55 -0800750 public void testConservesExpansionOpacityAfterTransition() {
751 mScrimController.transitionTo(ScrimState.UNLOCKED);
752 mScrimController.setPanelExpansion(0.5f);
Dave Mankoffa8749962019-10-18 10:44:07 -0400753 finishAnimationsImmediately();
Lucas Dupin80a3fcc2018-02-07 10:49:55 -0800754
755 final float expandedAlpha = mScrimBehind.getViewAlpha();
756
757 mScrimController.transitionTo(ScrimState.BRIGHTNESS_MIRROR);
Dave Mankoffa8749962019-10-18 10:44:07 -0400758 finishAnimationsImmediately();
Lucas Dupin80a3fcc2018-02-07 10:49:55 -0800759 mScrimController.transitionTo(ScrimState.UNLOCKED);
Dave Mankoffa8749962019-10-18 10:44:07 -0400760 finishAnimationsImmediately();
Lucas Dupin80a3fcc2018-02-07 10:49:55 -0800761
762 Assert.assertEquals("Scrim expansion opacity wasn't conserved when transitioning back",
763 expandedAlpha, mScrimBehind.getViewAlpha(), 0.01f);
764 }
765
766 @Test
Dave Mankoffa8749962019-10-18 10:44:07 -0400767 public void testCancelsOldAnimationBeforeBlanking() {
Lucas Dupin80a3fcc2018-02-07 10:49:55 -0800768 mScrimController.transitionTo(ScrimState.AOD);
Dave Mankoffa8749962019-10-18 10:44:07 -0400769 finishAnimationsImmediately();
Lucas Dupin80a3fcc2018-02-07 10:49:55 -0800770 // Consume whatever value we had before
Dave Mankoffa8749962019-10-18 10:44:07 -0400771 mAnimatorListener.reset();
Lucas Dupin80a3fcc2018-02-07 10:49:55 -0800772
773 mScrimController.transitionTo(ScrimState.KEYGUARD);
Dave Mankoffa8749962019-10-18 10:44:07 -0400774 finishAnimationsImmediately();
775 Assert.assertTrue("Animators not canceled", mAnimatorListener.getNumCancels() != 0);
Lucas Dupin80a3fcc2018-02-07 10:49:55 -0800776 }
777
Lucas Dupin3daf3b02018-02-27 17:23:41 -0800778 @Test
Lucas Dupin38962d72018-03-14 12:41:39 -0700779 public void testScrimFocus() {
780 mScrimController.transitionTo(ScrimState.AOD);
781 Assert.assertFalse("Should not be focusable on AOD", mScrimBehind.isFocusable());
782 Assert.assertFalse("Should not be focusable on AOD", mScrimInFront.isFocusable());
783
784 mScrimController.transitionTo(ScrimState.KEYGUARD);
785 Assert.assertTrue("Should be focusable on keyguard", mScrimBehind.isFocusable());
786 Assert.assertTrue("Should be focusable on keyguard", mScrimInFront.isFocusable());
787 }
788
Lucas Dupind5107302018-03-19 15:30:29 -0700789 @Test
790 public void testHidesShowWhenLockedActivity() {
791 mScrimController.setWallpaperSupportsAmbientMode(true);
792 mScrimController.setKeyguardOccluded(true);
793 mScrimController.transitionTo(ScrimState.AOD);
Dave Mankoffa8749962019-10-18 10:44:07 -0400794 finishAnimationsImmediately();
Lyn Hanbde48202019-05-29 19:18:29 -0700795 assertScrimAlpha(TRANSPARENT /* front */,
796 OPAQUE /* behind */,
797 TRANSPARENT /* bubble */);
Lucas Dupind5107302018-03-19 15:30:29 -0700798
799 mScrimController.transitionTo(ScrimState.PULSING);
Dave Mankoffa8749962019-10-18 10:44:07 -0400800 finishAnimationsImmediately();
Lyn Hanbde48202019-05-29 19:18:29 -0700801 assertScrimAlpha(TRANSPARENT /* front */,
802 OPAQUE /* behind */,
803 TRANSPARENT /* bubble */);
Lucas Dupind5107302018-03-19 15:30:29 -0700804 }
805
Lucas Dupin78949b82018-04-03 18:54:39 -0700806 @Test
Lucas Dupin63d72172018-06-06 11:42:55 -0700807 public void testHidesShowWhenLockedActivity_whenAlreadyInAod() {
808 mScrimController.setWallpaperSupportsAmbientMode(true);
809 mScrimController.transitionTo(ScrimState.AOD);
Dave Mankoffa8749962019-10-18 10:44:07 -0400810 finishAnimationsImmediately();
Lyn Hanbde48202019-05-29 19:18:29 -0700811 assertScrimAlpha(TRANSPARENT /* front */,
812 TRANSPARENT /* behind */,
813 TRANSPARENT /* bubble */);
Lucas Dupin63d72172018-06-06 11:42:55 -0700814
815 mScrimController.setKeyguardOccluded(true);
Dave Mankoffa8749962019-10-18 10:44:07 -0400816 finishAnimationsImmediately();
Lyn Hanbde48202019-05-29 19:18:29 -0700817 assertScrimAlpha(TRANSPARENT /* front */,
818 OPAQUE /* behind */,
819 TRANSPARENT /* bubble */);
Lucas Dupin63d72172018-06-06 11:42:55 -0700820 }
821
822 @Test
Lucas Dupin78949b82018-04-03 18:54:39 -0700823 public void testEatsTouchEvent() {
824 HashSet<ScrimState> eatsTouches =
Lucas Dupin1c327432019-01-03 13:37:53 -0800825 new HashSet<>(Collections.singletonList(ScrimState.AOD));
Lucas Dupin78949b82018-04-03 18:54:39 -0700826 for (ScrimState state : ScrimState.values()) {
827 if (state == ScrimState.UNINITIALIZED) {
828 continue;
829 }
830 mScrimController.transitionTo(state);
Dave Mankoffa8749962019-10-18 10:44:07 -0400831 finishAnimationsImmediately();
Lucas Dupin78949b82018-04-03 18:54:39 -0700832 Assert.assertEquals("Should be clickable unless AOD or PULSING, was: " + state,
833 mScrimBehind.getViewAlpha() != 0 && !eatsTouches.contains(state),
834 mScrimBehind.isClickable());
835 }
836 }
837
Lucas Dupinea0116e2018-04-05 10:09:29 -0700838 @Test
839 public void testAnimatesTransitionToAod() {
840 when(mDozeParamenters.shouldControlScreenOff()).thenReturn(false);
841 ScrimState.AOD.prepare(ScrimState.KEYGUARD);
842 Assert.assertFalse("No animation when ColorFade kicks in",
843 ScrimState.AOD.getAnimateChange());
844
845 reset(mDozeParamenters);
846 when(mDozeParamenters.shouldControlScreenOff()).thenReturn(true);
847 ScrimState.AOD.prepare(ScrimState.KEYGUARD);
848 Assert.assertTrue("Animate scrims when ColorFade won't be triggered",
849 ScrimState.AOD.getAnimateChange());
850 }
851
Lucas Dupin373356b2018-04-07 10:50:25 -0700852 @Test
853 public void testViewsDontHaveFocusHighlight() {
854 Assert.assertFalse("Scrim shouldn't have focus highlight",
855 mScrimInFront.getDefaultFocusHighlightEnabled());
856 Assert.assertFalse("Scrim shouldn't have focus highlight",
857 mScrimBehind.getDefaultFocusHighlightEnabled());
Lyn Hanbde48202019-05-29 19:18:29 -0700858 Assert.assertFalse("Scrim shouldn't have focus highlight",
859 mScrimForBubble.getDefaultFocusHighlightEnabled());
Lucas Dupin373356b2018-04-07 10:50:25 -0700860 }
861
Lucas Dupin36ec73c2019-10-18 13:39:04 -0700862 @Test
863 public void testIsLowPowerMode() {
864 HashSet<ScrimState> lowPowerModeStates = new HashSet<>(Arrays.asList(
865 ScrimState.OFF, ScrimState.AOD, ScrimState.PULSING));
866 HashSet<ScrimState> regularStates = new HashSet<>(Arrays.asList(
867 ScrimState.UNINITIALIZED, ScrimState.KEYGUARD, ScrimState.BOUNCER,
868 ScrimState.BOUNCER_SCRIMMED, ScrimState.BRIGHTNESS_MIRROR, ScrimState.UNLOCKED,
869 ScrimState.BUBBLE_EXPANDED));
870
871 for (ScrimState state : ScrimState.values()) {
872 if (!lowPowerModeStates.contains(state) && !regularStates.contains(state)) {
873 Assert.fail("Scrim state not whitelisted nor blacklisted as low power mode");
874 }
875 }
876 }
877
Lyn Hanbde48202019-05-29 19:18:29 -0700878 private void assertScrimTint(boolean front, boolean behind, boolean bubble) {
Lucas Dupin9e3fa102017-11-08 17:16:55 -0800879 Assert.assertEquals("Tint test failed at state " + mScrimController.getState()
Lyn Hanbde48202019-05-29 19:18:29 -0700880 + " with scrim: " + getScrimName(mScrimInFront) + " and tint: "
881 + Integer.toHexString(mScrimInFront.getTint()),
882 front, mScrimInFront.getTint() != Color.TRANSPARENT);
883
884 Assert.assertEquals("Tint test failed at state " + mScrimController.getState()
885 + " with scrim: " + getScrimName(mScrimBehind) + " and tint: "
886 + Integer.toHexString(mScrimBehind.getTint()),
887 behind, mScrimBehind.getTint() != Color.TRANSPARENT);
888
889 Assert.assertEquals("Tint test failed at state " + mScrimController.getState()
890 + " with scrim: " + getScrimName(mScrimForBubble) + " and tint: "
891 + Integer.toHexString(mScrimForBubble.getTint()),
892 bubble, mScrimForBubble.getTint() != Color.TRANSPARENT);
Lucas Dupin9e3fa102017-11-08 17:16:55 -0800893 }
894
Lyn Hanbde48202019-05-29 19:18:29 -0700895 private String getScrimName(ScrimView scrim) {
896 if (scrim == mScrimInFront) {
897 return "front";
898 } else if (scrim == mScrimBehind) {
899 return "back";
900 } else if (scrim == mScrimForBubble) {
901 return "bubble";
Lucas Dupin82aa1632017-12-13 00:13:57 -0800902 }
Lyn Hanbde48202019-05-29 19:18:29 -0700903 return "unknown_scrim";
904 }
905
906 private void assertScrimAlpha(int front, int behind, int bubble) {
907 // Check single scrim visibility.
908 Assert.assertEquals("Unexpected front scrim alpha: "
909 + mScrimInFront.getViewAlpha(),
910 front != TRANSPARENT /* expected */,
911 mScrimInFront.getViewAlpha() > TRANSPARENT /* actual */);
912
913 Assert.assertEquals("Unexpected back scrim alpha: "
914 + mScrimBehind.getViewAlpha(),
915 behind != TRANSPARENT /* expected */,
916 mScrimBehind.getViewAlpha() > TRANSPARENT /* actual */);
917
918 Assert.assertEquals(
919 "Unexpected bubble scrim alpha: "
920 + mScrimForBubble.getViewAlpha(), /* message */
921 bubble != TRANSPARENT /* expected */,
922 mScrimForBubble.getViewAlpha() > TRANSPARENT /* actual */);
923
924 // Check combined scrim visibility.
925 final int visibility;
926 if (front == OPAQUE || behind == OPAQUE || bubble == OPAQUE) {
927 visibility = OPAQUE;
928 } else if (front > TRANSPARENT || behind > TRANSPARENT || bubble > TRANSPARENT) {
929 visibility = SEMI_TRANSPARENT;
930 } else {
931 visibility = TRANSPARENT;
932 }
933 Assert.assertEquals("Invalid visibility.",
934 visibility /* expected */,
935 mScrimVisibility);
Lucas Dupin9e3fa102017-11-08 17:16:55 -0800936 }
Lucas Dupin9e3fa102017-11-08 17:16:55 -0800937}