blob: d4ad4b6d4f16639c5c278dcb7ebc4141d775269f [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;
24import static org.mockito.ArgumentMatchers.anyInt;
25import static org.mockito.ArgumentMatchers.anyLong;
Lucas Dupinee4c9b72019-02-18 17:04:58 -080026import static org.mockito.ArgumentMatchers.anyString;
Lucas Dupin9e3fa102017-11-08 17:16:55 -080027import static org.mockito.Mockito.mock;
28import static org.mockito.Mockito.never;
Lucas Dupin82aa1632017-12-13 00:13:57 -080029import static org.mockito.Mockito.reset;
Lucas Dupin067136c2018-03-27 18:03:25 -070030import static org.mockito.Mockito.spy;
Lucas Dupin9e3fa102017-11-08 17:16:55 -080031import static org.mockito.Mockito.verify;
Lucas Dupineea53b32017-12-18 13:47:14 -080032import static org.mockito.Mockito.verifyZeroInteractions;
Lucas Dupin9e3fa102017-11-08 17:16:55 -080033import static org.mockito.Mockito.when;
34
35import android.animation.Animator;
Lucas Dupin80a3fcc2018-02-07 10:49:55 -080036import android.animation.ValueAnimator;
Lucas Dupin82aa1632017-12-13 00:13:57 -080037import android.app.AlarmManager;
Lucas Dupin9e3fa102017-11-08 17:16:55 -080038import android.graphics.Color;
39import android.os.Handler;
Lucas Dupin9e3fa102017-11-08 17:16:55 -080040import android.testing.AndroidTestingRunner;
41import android.testing.TestableLooper;
42import android.view.View;
43
Brett Chabot84151d92019-02-27 15:37:59 -080044import androidx.test.filters.SmallTest;
45
shawnlin317db372018-04-09 19:49:48 +080046import com.android.internal.colorextraction.ColorExtractor.GradientColors;
Yohei Yukawa795f0102018-04-13 14:55:30 -070047import com.android.internal.util.function.TriConsumer;
Lucas Dupin9e3fa102017-11-08 17:16:55 -080048import com.android.systemui.SysuiTestCase;
49import com.android.systemui.statusbar.ScrimView;
Selim Cinek72cd9a72019-08-09 17:19:57 -070050import com.android.systemui.statusbar.policy.KeyguardMonitor;
Lucas Dupin9e3fa102017-11-08 17:16:55 -080051import com.android.systemui.util.wakelock.WakeLock;
52import com.android.systemui.utils.os.FakeHandler;
53
Lucas Dupin4dbe5182019-03-07 18:20:11 -080054import org.junit.After;
Lucas Dupin9e3fa102017-11-08 17:16:55 -080055import org.junit.Assert;
56import org.junit.Before;
57import org.junit.Test;
58import org.junit.runner.RunWith;
59
Lucas Dupin1c327432019-01-03 13:37:53 -080060import java.util.Collections;
Lucas Dupin78949b82018-04-03 18:54:39 -070061import java.util.HashSet;
Lucas Dupin9e3fa102017-11-08 17:16:55 -080062import java.util.function.Consumer;
63
64@RunWith(AndroidTestingRunner.class)
65@TestableLooper.RunWithLooper
66@SmallTest
67public class ScrimControllerTest extends SysuiTestCase {
68
69 private SynchronousScrimController mScrimController;
70 private ScrimView mScrimBehind;
71 private ScrimView mScrimInFront;
Lyn Hanbde48202019-05-29 19:18:29 -070072 private ScrimView mScrimForBubble;
Yohei Yukawa795f0102018-04-13 14:55:30 -070073 private ScrimState mScrimState;
shawnlin317db372018-04-09 19:49:48 +080074 private float mScrimBehindAlpha;
75 private GradientColors mScrimInFrontColor;
Lucas Dupin82aa1632017-12-13 00:13:57 -080076 private int mScrimVisibility;
Lucas Dupin9e3fa102017-11-08 17:16:55 -080077 private DozeParameters mDozeParamenters;
78 private WakeLock mWakeLock;
79 private boolean mAlwaysOnEnabled;
Lucas Dupin82aa1632017-12-13 00:13:57 -080080 private AlarmManager mAlarmManager;
Lucas Dupin54fbfb32019-03-05 18:08:13 -080081 private TestableLooper mLooper;
Lucas Dupin9e3fa102017-11-08 17:16:55 -080082
Yohei Yukawa795f0102018-04-13 14:55:30 -070083
Lucas Dupin9e3fa102017-11-08 17:16:55 -080084 @Before
85 public void setup() {
Lucas Dupin067136c2018-03-27 18:03:25 -070086 mScrimBehind = spy(new ScrimView(getContext()));
Lucas Dupin9e3fa102017-11-08 17:16:55 -080087 mScrimInFront = new ScrimView(getContext());
Lyn Hanbde48202019-05-29 19:18:29 -070088 mScrimForBubble = new ScrimView(getContext());
Lucas Dupin9e3fa102017-11-08 17:16:55 -080089 mWakeLock = mock(WakeLock.class);
Lucas Dupin82aa1632017-12-13 00:13:57 -080090 mAlarmManager = mock(AlarmManager.class);
Lucas Dupin9e3fa102017-11-08 17:16:55 -080091 mAlwaysOnEnabled = true;
Lucas Dupin9e3fa102017-11-08 17:16:55 -080092 mDozeParamenters = mock(DozeParameters.class);
Lucas Dupin54fbfb32019-03-05 18:08:13 -080093 mLooper = TestableLooper.get(this);
Lucas Dupin9e3fa102017-11-08 17:16:55 -080094 when(mDozeParamenters.getAlwaysOn()).thenAnswer(invocation -> mAlwaysOnEnabled);
Lucas Dupin43d0d732017-11-16 11:23:49 -080095 when(mDozeParamenters.getDisplayNeedsBlanking()).thenReturn(true);
shawnlin317db372018-04-09 19:49:48 +080096 mScrimController = new SynchronousScrimController(mScrimBehind, mScrimInFront,
Lyn Hanbde48202019-05-29 19:18:29 -070097 mScrimForBubble,
Yohei Yukawa795f0102018-04-13 14:55:30 -070098 (scrimState, scrimBehindAlpha, scrimInFrontColor) -> {
99 mScrimState = scrimState;
100 mScrimBehindAlpha = scrimBehindAlpha;
101 mScrimInFrontColor = scrimInFrontColor;
102 },
Selim Cinek72cd9a72019-08-09 17:19:57 -0700103 visible -> mScrimVisibility = visible, mDozeParamenters, mAlarmManager,
104 mock(KeyguardMonitor.class));
Lucas Dupinf8463ee2018-06-11 16:18:15 -0700105 mScrimController.setHasBackdrop(false);
TYM Tsaia71c8922019-01-07 15:57:53 +0800106 mScrimController.setWallpaperSupportsAmbientMode(false);
Lucas Dupin4dbe5182019-03-07 18:20:11 -0800107 mScrimController.transitionTo(ScrimState.KEYGUARD);
108 mScrimController.finishAnimationsImmediately();
Lucas Dupin9e3fa102017-11-08 17:16:55 -0800109 }
110
Lucas Dupin4dbe5182019-03-07 18:20:11 -0800111 @After
112 public void tearDown() {
113 mScrimController.finishAnimationsImmediately();
Lucas Dupin9e3fa102017-11-08 17:16:55 -0800114 }
115
116 @Test
117 public void transitionToKeyguard() {
118 mScrimController.transitionTo(ScrimState.KEYGUARD);
119 mScrimController.finishAnimationsImmediately();
Lyn Hanbde48202019-05-29 19:18:29 -0700120
121 assertScrimAlpha(TRANSPARENT /* front */,
122 SEMI_TRANSPARENT /* back */,
123 TRANSPARENT /* bubble */);
124
125 assertScrimTint(true /* front */,
126 true /* behind */,
127 false /* bubble */);
Lucas Dupin9e3fa102017-11-08 17:16:55 -0800128 }
129
130 @Test
Lucas Dupin7517b5d2017-08-22 12:51:25 -0700131 public void transitionToAod_withRegularWallpaper() {
132 mScrimController.transitionTo(ScrimState.AOD);
133 mScrimController.finishAnimationsImmediately();
Lyn Hanbde48202019-05-29 19:18:29 -0700134
135 assertScrimAlpha(TRANSPARENT /* front */,
136 OPAQUE /* back */,
137 TRANSPARENT /* bubble */);
138
139 assertScrimTint(true /* front */,
140 true /* behind */,
141 false /* bubble */);
Lucas Dupin7517b5d2017-08-22 12:51:25 -0700142 }
143
144 @Test
145 public void transitionToAod_withAodWallpaper() {
146 mScrimController.setWallpaperSupportsAmbientMode(true);
147 mScrimController.transitionTo(ScrimState.AOD);
148 mScrimController.finishAnimationsImmediately();
Lyn Hanbde48202019-05-29 19:18:29 -0700149
150 assertScrimAlpha(TRANSPARENT /* front */,
151 TRANSPARENT /* back */,
152 TRANSPARENT /* bubble */);
Lucas Dupin82aa1632017-12-13 00:13:57 -0800153
Lucas Dupin00be88f2019-01-03 17:50:52 -0800154 // Pulsing notification should conserve AOD wallpaper.
Lucas Dupin82aa1632017-12-13 00:13:57 -0800155 mScrimController.transitionTo(ScrimState.PULSING);
156 mScrimController.finishAnimationsImmediately();
Lyn Hanbde48202019-05-29 19:18:29 -0700157
158 assertScrimAlpha(TRANSPARENT /* front */,
159 TRANSPARENT /* back */,
160 TRANSPARENT /* bubble */);
Lucas Dupin7517b5d2017-08-22 12:51:25 -0700161 }
162
163 @Test
164 public void transitionToAod_withAodWallpaperAndLockScreenWallpaper() {
Lucas Dupinf8463ee2018-06-11 16:18:15 -0700165 mScrimController.setHasBackdrop(true);
Lucas Dupin7517b5d2017-08-22 12:51:25 -0700166 mScrimController.setWallpaperSupportsAmbientMode(true);
Lucas Dupin9e3fa102017-11-08 17:16:55 -0800167 mScrimController.transitionTo(ScrimState.AOD);
168 mScrimController.finishAnimationsImmediately();
Lyn Hanbde48202019-05-29 19:18:29 -0700169
170 assertScrimAlpha(TRANSPARENT /* front */,
171 OPAQUE /* back */,
172 TRANSPARENT /* bubble */);
173
174 assertScrimTint(true /* front */,
175 true /* behind */,
176 false /* bubble */);
Lucas Dupin9e3fa102017-11-08 17:16:55 -0800177 }
178
179 @Test
Lucas Dupin9bee5822018-07-09 14:32:53 -0700180 public void setHasBackdrop_withAodWallpaperAndAlbumArt() {
181 mScrimController.setWallpaperSupportsAmbientMode(true);
182 mScrimController.transitionTo(ScrimState.AOD);
183 mScrimController.finishAnimationsImmediately();
184 mScrimController.setHasBackdrop(true);
185 mScrimController.finishAnimationsImmediately();
Lyn Hanbde48202019-05-29 19:18:29 -0700186
187 assertScrimAlpha(TRANSPARENT /* front */,
188 OPAQUE /* back */,
189 TRANSPARENT /* bubble */);
190
191 assertScrimTint(true /* front */,
192 true /* behind */,
193 false /* bubble */);
Lucas Dupin9bee5822018-07-09 14:32:53 -0700194 }
195
196 @Test
Michael Wrightcae88752018-04-16 23:13:54 +0100197 public void transitionToAod_withFrontAlphaUpdates() {
198 // Assert that setting the AOD front scrim alpha doesn't take effect in a non-AOD state.
199 mScrimController.transitionTo(ScrimState.KEYGUARD);
200 mScrimController.setAodFrontScrimAlpha(0.5f);
201 mScrimController.finishAnimationsImmediately();
Lyn Hanbde48202019-05-29 19:18:29 -0700202
203 assertScrimAlpha(TRANSPARENT /* front */,
204 SEMI_TRANSPARENT /* back */,
205 TRANSPARENT /* bubble */);
Michael Wrightcae88752018-04-16 23:13:54 +0100206
207 // ... but that it does take effect once we enter the AOD state.
208 mScrimController.transitionTo(ScrimState.AOD);
209 mScrimController.finishAnimationsImmediately();
Lyn Hanbde48202019-05-29 19:18:29 -0700210 assertScrimAlpha(SEMI_TRANSPARENT /* front */,
211 OPAQUE /* back */,
212 TRANSPARENT /* bubble */);
Michael Wrightcae88752018-04-16 23:13:54 +0100213
214 // ... and that if we set it while we're in AOD, it does take immediate effect.
215 mScrimController.setAodFrontScrimAlpha(1f);
Lyn Hanbde48202019-05-29 19:18:29 -0700216 assertScrimAlpha(OPAQUE /* front */,
217 OPAQUE /* back */,
218 TRANSPARENT /* bubble */);
Michael Wrightcae88752018-04-16 23:13:54 +0100219
220 // ... and make sure we recall the previous front scrim alpha even if we transition away
221 // for a bit.
222 mScrimController.transitionTo(ScrimState.UNLOCKED);
223 mScrimController.transitionTo(ScrimState.AOD);
224 mScrimController.finishAnimationsImmediately();
Lyn Hanbde48202019-05-29 19:18:29 -0700225 assertScrimAlpha(OPAQUE /* front */,
226 OPAQUE /* back */,
227 TRANSPARENT /* bubble */);
Michael Wrightcae88752018-04-16 23:13:54 +0100228
Lucas Dupin69bda602018-05-18 17:24:52 -0700229 // ... and alpha updates should be completely ignored if always_on is off.
230 // Passing it forward would mess up the wake-up transition.
231 mAlwaysOnEnabled = false;
232 mScrimController.transitionTo(ScrimState.UNLOCKED);
233 mScrimController.transitionTo(ScrimState.AOD);
234 mScrimController.finishAnimationsImmediately();
235 mScrimController.setAodFrontScrimAlpha(0.3f);
236 Assert.assertEquals(ScrimState.AOD.getFrontAlpha(), mScrimInFront.getViewAlpha(), 0.001f);
237 Assert.assertNotEquals(0.3f, mScrimInFront.getViewAlpha(), 0.001f);
238
Michael Wrightcae88752018-04-16 23:13:54 +0100239 // Reset value since enums are static.
240 mScrimController.setAodFrontScrimAlpha(0f);
241 }
242
243 @Test
Chris.CC Leed424e202019-09-16 12:17:19 +0800244 public void transitionToPulsing_withFrontAlphaUpdates() {
Lucas Dupin82aa1632017-12-13 00:13:57 -0800245 // Pre-condition
246 // Need to go to AoD first because PULSING doesn't change
247 // the back scrim opacity - otherwise it would hide AoD wallpapers.
248 mScrimController.setWallpaperSupportsAmbientMode(false);
249 mScrimController.transitionTo(ScrimState.AOD);
250 mScrimController.finishAnimationsImmediately();
Lyn Hanbde48202019-05-29 19:18:29 -0700251 assertScrimAlpha(TRANSPARENT /* front */,
252 OPAQUE /* back */,
253 TRANSPARENT /* bubble */);
Lucas Dupin82aa1632017-12-13 00:13:57 -0800254
Lucas Dupin9e3fa102017-11-08 17:16:55 -0800255 mScrimController.transitionTo(ScrimState.PULSING);
256 mScrimController.finishAnimationsImmediately();
Lucas Dupina7eacf92019-07-24 12:40:34 -0700257 // Front scrim should be transparent, but tinted
Lucas Dupinde64ee02018-12-21 14:45:12 -0800258 // Back scrim should be semi-transparent so the user can see the wallpaper
Lucas Dupin9e3fa102017-11-08 17:16:55 -0800259 // Pulse callback should have been invoked
Lyn Hanbde48202019-05-29 19:18:29 -0700260 assertScrimAlpha(TRANSPARENT /* front */,
261 OPAQUE /* back */,
262 TRANSPARENT /* bubble */);
263
Mady Mellor4035ef52019-07-25 11:10:02 -0700264 assertScrimTint(true /* front */,
Lyn Hanbde48202019-05-29 19:18:29 -0700265 true /* behind */,
266 false /* bubble */);
Lucas Dupin5f00fa52019-03-27 22:46:53 -0700267
Chris.CC Leed424e202019-09-16 12:17:19 +0800268 // ... and when ambient goes dark, front scrim should be semi-transparent
269 mScrimController.setAodFrontScrimAlpha(0.5f);
270 mScrimController.finishAnimationsImmediately();
271 // Front scrim should be semi-transparent
272 assertScrimAlpha(SEMI_TRANSPARENT /* front */,
273 OPAQUE /* back */,
274 TRANSPARENT /* bubble */);
275
Lucas Dupin5f00fa52019-03-27 22:46:53 -0700276 mScrimController.setWakeLockScreenSensorActive(true);
277 mScrimController.finishAnimationsImmediately();
Chris.CC Leed424e202019-09-16 12:17:19 +0800278 assertScrimAlpha(SEMI_TRANSPARENT /* front */,
Lyn Hanbde48202019-05-29 19:18:29 -0700279 SEMI_TRANSPARENT /* back */,
280 TRANSPARENT /* bubble */);
Chris.CC Leed424e202019-09-16 12:17:19 +0800281
282 // Reset value since enums are static.
283 mScrimController.setAodFrontScrimAlpha(0f);
Lucas Dupin9e3fa102017-11-08 17:16:55 -0800284 }
285
286 @Test
Lucas Dupinbc9aac12018-03-04 20:18:15 -0800287 public void transitionToKeyguardBouncer() {
Lucas Dupin9e3fa102017-11-08 17:16:55 -0800288 mScrimController.transitionTo(ScrimState.BOUNCER);
289 mScrimController.finishAnimationsImmediately();
290 // Front scrim should be transparent
291 // Back scrim should be visible without tint
Lyn Hanbde48202019-05-29 19:18:29 -0700292 assertScrimAlpha(TRANSPARENT /* front */,
293 SEMI_TRANSPARENT /* back */,
294 TRANSPARENT /* bubble */);
295
296 assertScrimTint(false /* front */,
297 false /* behind */,
298 false /* bubble */);
Lucas Dupinbc9aac12018-03-04 20:18:15 -0800299 }
300
301 @Test
302 public void transitionToBouncer() {
Lucas Dupin05726cd2018-03-13 14:00:24 -0700303 mScrimController.transitionTo(ScrimState.BOUNCER_SCRIMMED);
Lucas Dupinbc9aac12018-03-04 20:18:15 -0800304 mScrimController.finishAnimationsImmediately();
305 // Front scrim should be transparent
306 // Back scrim should be visible without tint
Lyn Hanbde48202019-05-29 19:18:29 -0700307 assertScrimAlpha(SEMI_TRANSPARENT /* front */,
308 TRANSPARENT /* back */,
309 TRANSPARENT /* bubble */);
310 assertScrimTint(false /* front */,
311 false /* behind */,
312 false /* bubble */);
Lucas Dupin9e3fa102017-11-08 17:16:55 -0800313 }
314
315 @Test
316 public void transitionToUnlocked() {
Lucas Dupin80a3fcc2018-02-07 10:49:55 -0800317 mScrimController.setPanelExpansion(0f);
Lucas Dupin9e3fa102017-11-08 17:16:55 -0800318 mScrimController.transitionTo(ScrimState.UNLOCKED);
319 mScrimController.finishAnimationsImmediately();
Lyn Hanbde48202019-05-29 19:18:29 -0700320 assertScrimAlpha(TRANSPARENT /* front */,
321 TRANSPARENT /* back */,
322 TRANSPARENT /* bubble */);
323
324 assertScrimTint(false /* front */,
325 false /* behind */,
326 false /* bubble */);
Lucas Dupin9e3fa102017-11-08 17:16:55 -0800327
328 // Back scrim should be visible after start dragging
329 mScrimController.setPanelExpansion(0.5f);
Lyn Hanbde48202019-05-29 19:18:29 -0700330 assertScrimAlpha(TRANSPARENT /* front */,
331 SEMI_TRANSPARENT /* back */,
332 TRANSPARENT /* bubble */);
Lucas Dupin9e3fa102017-11-08 17:16:55 -0800333 }
334
335 @Test
Mady Mellor0c333772018-11-06 18:05:54 -0800336 public void transitionToBubbleExpanded() {
337 mScrimController.transitionTo(ScrimState.BUBBLE_EXPANDED);
338 mScrimController.finishAnimationsImmediately();
339
Lyn Hanbde48202019-05-29 19:18:29 -0700340 assertScrimTint(false /* front */,
341 false /* behind */,
342 false /* bubble */);
343
Mady Mellor0c333772018-11-06 18:05:54 -0800344 // Front scrim should be transparent
Lyn Hanbde48202019-05-29 19:18:29 -0700345 Assert.assertEquals(ScrimController.TRANSPARENT,
Mady Mellor0c333772018-11-06 18:05:54 -0800346 mScrimInFront.getViewAlpha(), 0.0f);
347 // Back scrim should be visible
348 Assert.assertEquals(ScrimController.GRADIENT_SCRIM_ALPHA_BUSY,
349 mScrimBehind.getViewAlpha(), 0.0f);
Lyn Hanbde48202019-05-29 19:18:29 -0700350 // Bubble scrim should be visible
351 Assert.assertEquals(ScrimController.GRADIENT_SCRIM_ALPHA_BUSY,
352 mScrimBehind.getViewAlpha(), 0.0f);
Mady Mellor0c333772018-11-06 18:05:54 -0800353 }
354
355 @Test
Yohei Yukawa795f0102018-04-13 14:55:30 -0700356 public void scrimStateCallback() {
357 mScrimController.transitionTo(ScrimState.UNLOCKED);
358 mScrimController.finishAnimationsImmediately();
359 Assert.assertEquals(mScrimState, ScrimState.UNLOCKED);
360
361 mScrimController.transitionTo(ScrimState.BOUNCER);
362 mScrimController.finishAnimationsImmediately();
363 Assert.assertEquals(mScrimState, ScrimState.BOUNCER);
364
365 mScrimController.transitionTo(ScrimState.BOUNCER_SCRIMMED);
366 mScrimController.finishAnimationsImmediately();
367 Assert.assertEquals(mScrimState, ScrimState.BOUNCER_SCRIMMED);
368 }
369
370 @Test
shawnlin317db372018-04-09 19:49:48 +0800371 public void panelExpansion() {
372 mScrimController.setPanelExpansion(0f);
373 mScrimController.setPanelExpansion(0.5f);
374 mScrimController.transitionTo(ScrimState.UNLOCKED);
375 mScrimController.finishAnimationsImmediately();
376
377 reset(mScrimBehind);
378 mScrimController.setPanelExpansion(0f);
379 mScrimController.setPanelExpansion(1.0f);
Lucas Dupin4dbe5182019-03-07 18:20:11 -0800380 mScrimController.finishAnimationsImmediately();
shawnlin317db372018-04-09 19:49:48 +0800381
382 Assert.assertEquals("Scrim alpha should change after setPanelExpansion",
383 mScrimBehindAlpha, mScrimBehind.getViewAlpha(), 0.01f);
384
385 mScrimController.setPanelExpansion(0f);
Lucas Dupin4dbe5182019-03-07 18:20:11 -0800386 mScrimController.finishAnimationsImmediately();
shawnlin317db372018-04-09 19:49:48 +0800387
388 Assert.assertEquals("Scrim alpha should change after setPanelExpansion",
389 mScrimBehindAlpha, mScrimBehind.getViewAlpha(), 0.01f);
390 }
391
392 @Test
Lucas Dupin67f02632018-03-12 11:08:31 -0700393 public void panelExpansionAffectsAlpha() {
394 mScrimController.setPanelExpansion(0f);
395 mScrimController.setPanelExpansion(0.5f);
396 mScrimController.transitionTo(ScrimState.UNLOCKED);
397 mScrimController.finishAnimationsImmediately();
398
399 final float scrimAlpha = mScrimBehind.getViewAlpha();
Lucas Dupin067136c2018-03-27 18:03:25 -0700400 reset(mScrimBehind);
Lucas Dupin67f02632018-03-12 11:08:31 -0700401 mScrimController.setExpansionAffectsAlpha(false);
402 mScrimController.setPanelExpansion(0.8f);
Lucas Dupin067136c2018-03-27 18:03:25 -0700403 verifyZeroInteractions(mScrimBehind);
Lucas Dupin67f02632018-03-12 11:08:31 -0700404 Assert.assertEquals("Scrim opacity shouldn't change when setExpansionAffectsAlpha "
405 + "is false", scrimAlpha, mScrimBehind.getViewAlpha(), 0.01f);
406
407 mScrimController.setExpansionAffectsAlpha(true);
408 mScrimController.setPanelExpansion(0.1f);
Lucas Dupin4dbe5182019-03-07 18:20:11 -0800409 mScrimController.finishAnimationsImmediately();
Lucas Dupin67f02632018-03-12 11:08:31 -0700410 Assert.assertNotEquals("Scrim opacity should change when setExpansionAffectsAlpha "
411 + "is true", scrimAlpha, mScrimBehind.getViewAlpha(), 0.01f);
412 }
413
414 @Test
Lucas Dupin9e3fa102017-11-08 17:16:55 -0800415 public void transitionToUnlockedFromAod() {
416 // Simulate unlock with fingerprint
417 mScrimController.transitionTo(ScrimState.AOD);
Lucas Dupin80a3fcc2018-02-07 10:49:55 -0800418 mScrimController.setPanelExpansion(0f);
Lucas Dupin9e3fa102017-11-08 17:16:55 -0800419 mScrimController.finishAnimationsImmediately();
420 mScrimController.transitionTo(ScrimState.UNLOCKED);
Lyn Hanbde48202019-05-29 19:18:29 -0700421
422 // Immediately tinted black after the transition starts
423 assertScrimTint(true /* front */,
424 true /* behind */,
425 true /* bubble */);
426
Lucas Dupin9e3fa102017-11-08 17:16:55 -0800427 mScrimController.finishAnimationsImmediately();
Lyn Hanbde48202019-05-29 19:18:29 -0700428
429 // All scrims should be transparent at the end of fade transition.
430 assertScrimAlpha(TRANSPARENT /* front */,
431 TRANSPARENT /* behind */,
432 TRANSPARENT /* bubble */);
433
Selim Cinek22fa9752019-09-26 16:53:31 -0700434 // Make sure at the very end of the animation, we're reset to transparent
Lyn Hanbde48202019-05-29 19:18:29 -0700435 assertScrimTint(false /* front */,
436 false /* behind */,
437 false /* bubble */);
Lucas Dupin9e3fa102017-11-08 17:16:55 -0800438 }
439
440 @Test
Lucas Dupinea0116e2018-04-05 10:09:29 -0700441 public void scrimBlanksBeforeLeavingAod() {
Lucas Dupin9e3fa102017-11-08 17:16:55 -0800442 // Simulate unlock with fingerprint
443 mScrimController.transitionTo(ScrimState.AOD);
444 mScrimController.finishAnimationsImmediately();
445 mScrimController.transitionTo(ScrimState.UNLOCKED,
446 new ScrimController.Callback() {
447 @Override
448 public void onDisplayBlanked() {
449 // Front scrim should be black in the middle of the transition
450 Assert.assertTrue("Scrim should be visible during transition. Alpha: "
451 + mScrimInFront.getViewAlpha(), mScrimInFront.getViewAlpha() > 0);
Lyn Hanbde48202019-05-29 19:18:29 -0700452 assertScrimTint(true /* front */,
453 true /* behind */,
454 true /* bubble */);
Lucas Dupin82aa1632017-12-13 00:13:57 -0800455 Assert.assertSame("Scrim should be visible during transition.",
Lyn Hanbde48202019-05-29 19:18:29 -0700456 mScrimVisibility, OPAQUE);
Lucas Dupin9e3fa102017-11-08 17:16:55 -0800457 }
458 });
459 mScrimController.finishAnimationsImmediately();
460 }
461
462 @Test
Lucas Dupineb840ea2018-06-01 00:28:58 -0700463 public void scrimBlanksWhenUnlockingFromPulse() {
464 boolean[] blanked = {false};
465 // Simulate unlock with fingerprint
466 mScrimController.transitionTo(ScrimState.PULSING);
467 mScrimController.finishAnimationsImmediately();
468 mScrimController.transitionTo(ScrimState.UNLOCKED,
469 new ScrimController.Callback() {
470 @Override
471 public void onDisplayBlanked() {
472 blanked[0] = true;
473 }
474 });
475 mScrimController.finishAnimationsImmediately();
476 Assert.assertTrue("Scrim should blank when unlocking from pulse.", blanked[0]);
477 }
478
479 @Test
Lucas Dupin9e3fa102017-11-08 17:16:55 -0800480 public void testScrimCallback() {
481 int[] callOrder = {0, 0, 0};
482 int[] currentCall = {0};
483 mScrimController.transitionTo(ScrimState.AOD, new ScrimController.Callback() {
484 @Override
485 public void onStart() {
486 callOrder[0] = ++currentCall[0];
487 }
488
489 @Override
490 public void onDisplayBlanked() {
491 callOrder[1] = ++currentCall[0];
492 }
493
494 @Override
495 public void onFinished() {
496 callOrder[2] = ++currentCall[0];
497 }
498 });
499 mScrimController.finishAnimationsImmediately();
500 Assert.assertEquals("onStart called in wrong order", 1, callOrder[0]);
501 Assert.assertEquals("onDisplayBlanked called in wrong order", 2, callOrder[1]);
502 Assert.assertEquals("onFinished called in wrong order", 3, callOrder[2]);
503 }
504
505 @Test
506 public void testScrimCallbacksWithoutAmbientDisplay() {
507 mAlwaysOnEnabled = false;
508 testScrimCallback();
509 }
510
511 @Test
512 public void testScrimCallbackCancelled() {
513 boolean[] cancelledCalled = {false};
514 mScrimController.transitionTo(ScrimState.AOD, new ScrimController.Callback() {
515 @Override
516 public void onCancelled() {
517 cancelledCalled[0] = true;
518 }
519 });
520 mScrimController.transitionTo(ScrimState.PULSING);
521 Assert.assertTrue("onCancelled should have been called", cancelledCalled[0]);
522 }
523
524 @Test
Lucas Dupineea53b32017-12-18 13:47:14 -0800525 public void testHoldsWakeLock_whenAOD() {
Lucas Dupin9e3fa102017-11-08 17:16:55 -0800526 mScrimController.transitionTo(ScrimState.AOD);
Lucas Dupinee4c9b72019-02-18 17:04:58 -0800527 verify(mWakeLock).acquire(anyString());
528 verify(mWakeLock, never()).release(anyString());
Lucas Dupin9e3fa102017-11-08 17:16:55 -0800529 mScrimController.finishAnimationsImmediately();
Lucas Dupinee4c9b72019-02-18 17:04:58 -0800530 verify(mWakeLock).release(anyString());
Lucas Dupin9e3fa102017-11-08 17:16:55 -0800531 }
532
Lucas Dupin19aba8e2017-12-11 12:42:26 -0800533 @Test
Lucas Dupineea53b32017-12-18 13:47:14 -0800534 public void testDoesNotHoldWakeLock_whenUnlocking() {
535 mScrimController.transitionTo(ScrimState.UNLOCKED);
536 mScrimController.finishAnimationsImmediately();
537 verifyZeroInteractions(mWakeLock);
538 }
539
540 @Test
Lucas Dupin19aba8e2017-12-11 12:42:26 -0800541 public void testCallbackInvokedOnSameStateTransition() {
542 mScrimController.transitionTo(ScrimState.UNLOCKED);
543 mScrimController.finishAnimationsImmediately();
544 ScrimController.Callback callback = mock(ScrimController.Callback.class);
545 mScrimController.transitionTo(ScrimState.UNLOCKED, callback);
Lucas Dupin82aa1632017-12-13 00:13:57 -0800546 verify(callback).onFinished();
547 }
548
549 @Test
550 public void testHoldsAodWallpaperAnimationLock() {
551 // Pre-conditions
552 mScrimController.transitionTo(ScrimState.AOD);
553 mScrimController.finishAnimationsImmediately();
554 reset(mWakeLock);
555
556 mScrimController.onHideWallpaperTimeout();
Lucas Dupinee4c9b72019-02-18 17:04:58 -0800557 verify(mWakeLock).acquire(anyString());
558 verify(mWakeLock, never()).release(anyString());
Lucas Dupin82aa1632017-12-13 00:13:57 -0800559 mScrimController.finishAnimationsImmediately();
Lucas Dupinee4c9b72019-02-18 17:04:58 -0800560 verify(mWakeLock).release(anyString());
Lucas Dupin82aa1632017-12-13 00:13:57 -0800561 }
562
563 @Test
TYM Tsaia71c8922019-01-07 15:57:53 +0800564 public void testHoldsPulsingWallpaperAnimationLock() {
565 // Pre-conditions
Lucas Dupin00be88f2019-01-03 17:50:52 -0800566 mScrimController.transitionTo(ScrimState.PULSING);
TYM Tsaia71c8922019-01-07 15:57:53 +0800567 mScrimController.finishAnimationsImmediately();
568 reset(mWakeLock);
569
570 mScrimController.onHideWallpaperTimeout();
Lucas Dupinee4c9b72019-02-18 17:04:58 -0800571 verify(mWakeLock).acquire(anyString());
572 verify(mWakeLock, never()).release(anyString());
TYM Tsaia71c8922019-01-07 15:57:53 +0800573 mScrimController.finishAnimationsImmediately();
Lucas Dupinee4c9b72019-02-18 17:04:58 -0800574 verify(mWakeLock).release(anyString());
TYM Tsaia71c8922019-01-07 15:57:53 +0800575 }
576
577 @Test
Lucas Dupin16cfe452018-02-08 13:14:50 -0800578 public void testWillHideAodWallpaper() {
Lucas Dupin82aa1632017-12-13 00:13:57 -0800579 mScrimController.setWallpaperSupportsAmbientMode(true);
580 mScrimController.transitionTo(ScrimState.AOD);
581 verify(mAlarmManager).setExact(anyInt(), anyLong(), any(), any(), any());
582 mScrimController.transitionTo(ScrimState.KEYGUARD);
583 verify(mAlarmManager).cancel(any(AlarmManager.OnAlarmListener.class));
Lucas Dupin19aba8e2017-12-11 12:42:26 -0800584 }
585
Lucas Dupin80a3fcc2018-02-07 10:49:55 -0800586 @Test
Jerry Changbde4c0c2019-06-13 16:58:41 +0800587 public void transitionToPulsing_withTimeoutWallpaperCallback_willHideWallpaper() {
588 mScrimController.setWallpaperSupportsAmbientMode(true);
589
590 mScrimController.transitionTo(ScrimState.PULSING, new ScrimController.Callback() {
591 @Override
592 public boolean shouldTimeoutWallpaper() {
593 return true;
594 }
595 });
596
597 verify(mAlarmManager).setExact(anyInt(), anyLong(), any(), any(), any());
598 }
599
600 @Test
601 public void transitionToPulsing_withDefaultCallback_wontHideWallpaper() {
602 mScrimController.setWallpaperSupportsAmbientMode(true);
603
604 mScrimController.transitionTo(ScrimState.PULSING, new ScrimController.Callback() {});
605
606 verify(mAlarmManager, never()).setExact(anyInt(), anyLong(), any(), any(), any());
607 }
608
609 @Test
610 public void transitionToPulsing_withoutCallback_wontHideWallpaper() {
611 mScrimController.setWallpaperSupportsAmbientMode(true);
612
613 mScrimController.transitionTo(ScrimState.PULSING);
614
615 verify(mAlarmManager, never()).setExact(anyInt(), anyLong(), any(), any(), any());
616 }
617
618 @Test
Lucas Dupin80a3fcc2018-02-07 10:49:55 -0800619 public void testConservesExpansionOpacityAfterTransition() {
620 mScrimController.transitionTo(ScrimState.UNLOCKED);
621 mScrimController.setPanelExpansion(0.5f);
622 mScrimController.finishAnimationsImmediately();
623
624 final float expandedAlpha = mScrimBehind.getViewAlpha();
625
626 mScrimController.transitionTo(ScrimState.BRIGHTNESS_MIRROR);
627 mScrimController.finishAnimationsImmediately();
628 mScrimController.transitionTo(ScrimState.UNLOCKED);
629 mScrimController.finishAnimationsImmediately();
630
631 Assert.assertEquals("Scrim expansion opacity wasn't conserved when transitioning back",
632 expandedAlpha, mScrimBehind.getViewAlpha(), 0.01f);
633 }
634
635 @Test
636 public void cancelsOldAnimationBeforeBlanking() {
637 mScrimController.transitionTo(ScrimState.AOD);
638 mScrimController.finishAnimationsImmediately();
639 // Consume whatever value we had before
640 mScrimController.wasAnimationJustCancelled();
641
642 mScrimController.transitionTo(ScrimState.KEYGUARD);
643 mScrimController.finishAnimationsImmediately();
644 Assert.assertTrue(mScrimController.wasAnimationJustCancelled());
645 }
646
Lucas Dupin3daf3b02018-02-27 17:23:41 -0800647 @Test
Lucas Dupin38962d72018-03-14 12:41:39 -0700648 public void testScrimFocus() {
649 mScrimController.transitionTo(ScrimState.AOD);
650 Assert.assertFalse("Should not be focusable on AOD", mScrimBehind.isFocusable());
651 Assert.assertFalse("Should not be focusable on AOD", mScrimInFront.isFocusable());
652
653 mScrimController.transitionTo(ScrimState.KEYGUARD);
654 Assert.assertTrue("Should be focusable on keyguard", mScrimBehind.isFocusable());
655 Assert.assertTrue("Should be focusable on keyguard", mScrimInFront.isFocusable());
656 }
657
Lucas Dupind5107302018-03-19 15:30:29 -0700658 @Test
659 public void testHidesShowWhenLockedActivity() {
660 mScrimController.setWallpaperSupportsAmbientMode(true);
661 mScrimController.setKeyguardOccluded(true);
662 mScrimController.transitionTo(ScrimState.AOD);
663 mScrimController.finishAnimationsImmediately();
Lyn Hanbde48202019-05-29 19:18:29 -0700664 assertScrimAlpha(TRANSPARENT /* front */,
665 OPAQUE /* behind */,
666 TRANSPARENT /* bubble */);
Lucas Dupind5107302018-03-19 15:30:29 -0700667
668 mScrimController.transitionTo(ScrimState.PULSING);
669 mScrimController.finishAnimationsImmediately();
Lyn Hanbde48202019-05-29 19:18:29 -0700670 assertScrimAlpha(TRANSPARENT /* front */,
671 OPAQUE /* behind */,
672 TRANSPARENT /* bubble */);
Lucas Dupind5107302018-03-19 15:30:29 -0700673 }
674
Lucas Dupin78949b82018-04-03 18:54:39 -0700675 @Test
Lucas Dupin63d72172018-06-06 11:42:55 -0700676 public void testHidesShowWhenLockedActivity_whenAlreadyInAod() {
677 mScrimController.setWallpaperSupportsAmbientMode(true);
678 mScrimController.transitionTo(ScrimState.AOD);
679 mScrimController.finishAnimationsImmediately();
Lyn Hanbde48202019-05-29 19:18:29 -0700680 assertScrimAlpha(TRANSPARENT /* front */,
681 TRANSPARENT /* behind */,
682 TRANSPARENT /* bubble */);
Lucas Dupin63d72172018-06-06 11:42:55 -0700683
684 mScrimController.setKeyguardOccluded(true);
685 mScrimController.finishAnimationsImmediately();
Lyn Hanbde48202019-05-29 19:18:29 -0700686 assertScrimAlpha(TRANSPARENT /* front */,
687 OPAQUE /* behind */,
688 TRANSPARENT /* bubble */);
Lucas Dupin63d72172018-06-06 11:42:55 -0700689 }
690
691 @Test
Lucas Dupin78949b82018-04-03 18:54:39 -0700692 public void testEatsTouchEvent() {
693 HashSet<ScrimState> eatsTouches =
Lucas Dupin1c327432019-01-03 13:37:53 -0800694 new HashSet<>(Collections.singletonList(ScrimState.AOD));
Lucas Dupin78949b82018-04-03 18:54:39 -0700695 for (ScrimState state : ScrimState.values()) {
696 if (state == ScrimState.UNINITIALIZED) {
697 continue;
698 }
699 mScrimController.transitionTo(state);
700 mScrimController.finishAnimationsImmediately();
701 Assert.assertEquals("Should be clickable unless AOD or PULSING, was: " + state,
702 mScrimBehind.getViewAlpha() != 0 && !eatsTouches.contains(state),
703 mScrimBehind.isClickable());
704 }
705 }
706
Lucas Dupinea0116e2018-04-05 10:09:29 -0700707 @Test
708 public void testAnimatesTransitionToAod() {
709 when(mDozeParamenters.shouldControlScreenOff()).thenReturn(false);
710 ScrimState.AOD.prepare(ScrimState.KEYGUARD);
711 Assert.assertFalse("No animation when ColorFade kicks in",
712 ScrimState.AOD.getAnimateChange());
713
714 reset(mDozeParamenters);
715 when(mDozeParamenters.shouldControlScreenOff()).thenReturn(true);
716 ScrimState.AOD.prepare(ScrimState.KEYGUARD);
717 Assert.assertTrue("Animate scrims when ColorFade won't be triggered",
718 ScrimState.AOD.getAnimateChange());
719 }
720
Lucas Dupin373356b2018-04-07 10:50:25 -0700721 @Test
722 public void testViewsDontHaveFocusHighlight() {
723 Assert.assertFalse("Scrim shouldn't have focus highlight",
724 mScrimInFront.getDefaultFocusHighlightEnabled());
725 Assert.assertFalse("Scrim shouldn't have focus highlight",
726 mScrimBehind.getDefaultFocusHighlightEnabled());
Lyn Hanbde48202019-05-29 19:18:29 -0700727 Assert.assertFalse("Scrim shouldn't have focus highlight",
728 mScrimForBubble.getDefaultFocusHighlightEnabled());
Lucas Dupin373356b2018-04-07 10:50:25 -0700729 }
730
Lyn Hanbde48202019-05-29 19:18:29 -0700731 private void assertScrimTint(boolean front, boolean behind, boolean bubble) {
Lucas Dupin9e3fa102017-11-08 17:16:55 -0800732 Assert.assertEquals("Tint test failed at state " + mScrimController.getState()
Lyn Hanbde48202019-05-29 19:18:29 -0700733 + " with scrim: " + getScrimName(mScrimInFront) + " and tint: "
734 + Integer.toHexString(mScrimInFront.getTint()),
735 front, mScrimInFront.getTint() != Color.TRANSPARENT);
736
737 Assert.assertEquals("Tint test failed at state " + mScrimController.getState()
738 + " with scrim: " + getScrimName(mScrimBehind) + " and tint: "
739 + Integer.toHexString(mScrimBehind.getTint()),
740 behind, mScrimBehind.getTint() != Color.TRANSPARENT);
741
742 Assert.assertEquals("Tint test failed at state " + mScrimController.getState()
743 + " with scrim: " + getScrimName(mScrimForBubble) + " and tint: "
744 + Integer.toHexString(mScrimForBubble.getTint()),
745 bubble, mScrimForBubble.getTint() != Color.TRANSPARENT);
Lucas Dupin9e3fa102017-11-08 17:16:55 -0800746 }
747
Lyn Hanbde48202019-05-29 19:18:29 -0700748 private String getScrimName(ScrimView scrim) {
749 if (scrim == mScrimInFront) {
750 return "front";
751 } else if (scrim == mScrimBehind) {
752 return "back";
753 } else if (scrim == mScrimForBubble) {
754 return "bubble";
Lucas Dupin82aa1632017-12-13 00:13:57 -0800755 }
Lyn Hanbde48202019-05-29 19:18:29 -0700756 return "unknown_scrim";
757 }
758
759 private void assertScrimAlpha(int front, int behind, int bubble) {
760 // Check single scrim visibility.
761 Assert.assertEquals("Unexpected front scrim alpha: "
762 + mScrimInFront.getViewAlpha(),
763 front != TRANSPARENT /* expected */,
764 mScrimInFront.getViewAlpha() > TRANSPARENT /* actual */);
765
766 Assert.assertEquals("Unexpected back scrim alpha: "
767 + mScrimBehind.getViewAlpha(),
768 behind != TRANSPARENT /* expected */,
769 mScrimBehind.getViewAlpha() > TRANSPARENT /* actual */);
770
771 Assert.assertEquals(
772 "Unexpected bubble scrim alpha: "
773 + mScrimForBubble.getViewAlpha(), /* message */
774 bubble != TRANSPARENT /* expected */,
775 mScrimForBubble.getViewAlpha() > TRANSPARENT /* actual */);
776
777 // Check combined scrim visibility.
778 final int visibility;
779 if (front == OPAQUE || behind == OPAQUE || bubble == OPAQUE) {
780 visibility = OPAQUE;
781 } else if (front > TRANSPARENT || behind > TRANSPARENT || bubble > TRANSPARENT) {
782 visibility = SEMI_TRANSPARENT;
783 } else {
784 visibility = TRANSPARENT;
785 }
786 Assert.assertEquals("Invalid visibility.",
787 visibility /* expected */,
788 mScrimVisibility);
Lucas Dupin9e3fa102017-11-08 17:16:55 -0800789 }
790
791 /**
792 * Special version of ScrimController where animations have 0 duration for test purposes.
793 */
794 private class SynchronousScrimController extends ScrimController {
795
Lucas Dupin80a3fcc2018-02-07 10:49:55 -0800796 private boolean mAnimationCancelled;
Lucas Dupin16cfe452018-02-08 13:14:50 -0800797 boolean mOnPreDrawCalled;
Lucas Dupin9e3fa102017-11-08 17:16:55 -0800798
shawnlin317db372018-04-09 19:49:48 +0800799 SynchronousScrimController(ScrimView scrimBehind, ScrimView scrimInFront,
Lyn Hanbde48202019-05-29 19:18:29 -0700800 ScrimView scrimForBubble,
Yohei Yukawa795f0102018-04-13 14:55:30 -0700801 TriConsumer<ScrimState, Float, GradientColors> scrimStateListener,
Lucas Dupin82aa1632017-12-13 00:13:57 -0800802 Consumer<Integer> scrimVisibleListener, DozeParameters dozeParameters,
Selim Cinek72cd9a72019-08-09 17:19:57 -0700803 AlarmManager alarmManager, KeyguardMonitor keyguardMonitor) {
Lyn Hanbde48202019-05-29 19:18:29 -0700804 super(scrimBehind, scrimInFront, scrimForBubble, scrimStateListener,
Mady Mellor06792002019-08-13 14:33:24 -0700805 scrimVisibleListener, dozeParameters, alarmManager, keyguardMonitor);
Lucas Dupin9e3fa102017-11-08 17:16:55 -0800806 }
807
Lucas Dupin16cfe452018-02-08 13:14:50 -0800808 @Override
809 public boolean onPreDraw() {
810 mOnPreDrawCalled = true;
811 return super.onPreDraw();
812 }
813
Lucas Dupin3503c5f2018-03-02 19:04:00 -0800814 void finishAnimationsImmediately() {
Lucas Dupin9e3fa102017-11-08 17:16:55 -0800815 boolean[] animationFinished = {false};
Lyn Hanbde48202019-05-29 19:18:29 -0700816 setOnAnimationFinished(() -> animationFinished[0] = true);
Lucas Dupin9e3fa102017-11-08 17:16:55 -0800817 // Execute code that will trigger animations.
818 onPreDraw();
Lucas Dupin9e3fa102017-11-08 17:16:55 -0800819 // Force finish all animations.
Lucas Dupin54fbfb32019-03-05 18:08:13 -0800820 mLooper.processAllMessages();
Lucas Dupin9e3fa102017-11-08 17:16:55 -0800821 endAnimation(mScrimBehind, TAG_KEY_ANIM);
822 endAnimation(mScrimInFront, TAG_KEY_ANIM);
Lyn Hanbde48202019-05-29 19:18:29 -0700823 endAnimation(mScrimForBubble, TAG_KEY_ANIM);
Lucas Dupin9e3fa102017-11-08 17:16:55 -0800824
825 if (!animationFinished[0]) {
826 throw new IllegalStateException("Animation never finished");
827 }
828 }
829
Lucas Dupin3503c5f2018-03-02 19:04:00 -0800830 boolean wasAnimationJustCancelled() {
Lucas Dupin80a3fcc2018-02-07 10:49:55 -0800831 final boolean wasCancelled = mAnimationCancelled;
832 mAnimationCancelled = false;
833 return wasCancelled;
834 }
835
Lucas Dupin3daf3b02018-02-27 17:23:41 -0800836 private void endAnimation(View scrimView, int tag) {
Lucas Dupin9e3fa102017-11-08 17:16:55 -0800837 Animator animator = (Animator) scrimView.getTag(tag);
838 if (animator != null) {
839 animator.end();
840 }
841 }
842
843 @Override
Lucas Dupin80a3fcc2018-02-07 10:49:55 -0800844 protected void cancelAnimator(ValueAnimator previousAnimator) {
845 super.cancelAnimator(previousAnimator);
846 mAnimationCancelled = true;
847 }
848
849 @Override
Lucas Dupin9e3fa102017-11-08 17:16:55 -0800850 protected Handler getHandler() {
Lucas Dupin54fbfb32019-03-05 18:08:13 -0800851 return new FakeHandler(mLooper.getLooper());
Lucas Dupin9e3fa102017-11-08 17:16:55 -0800852 }
853
854 @Override
855 protected WakeLock createWakeLock() {
856 return mWakeLock;
857 }
Lucas Dupin8c7cb022018-02-05 10:49:03 -0800858
859 /**
860 * Do not wait for a frame since we're in a test environment.
Lyn Hanbde48202019-05-29 19:18:29 -0700861 *
Lucas Dupin8c7cb022018-02-05 10:49:03 -0800862 * @param callback What to execute.
863 */
864 @Override
Lucas Dupin0791d972018-03-26 13:32:16 -0700865 protected void doOnTheNextFrame(Runnable callback) {
866 callback.run();
Lucas Dupin8c7cb022018-02-05 10:49:03 -0800867 }
Lucas Dupin9e3fa102017-11-08 17:16:55 -0800868 }
Lucas Dupin9e3fa102017-11-08 17:16:55 -0800869}