blob: 79ba1759f4c40d2feaf98dd156342450c173031c [file] [log] [blame]
Jorim Jaggi21c39a72017-10-20 15:47:51 +02001/*
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
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -070014 * limitations under the License.
Jorim Jaggi21c39a72017-10-20 15:47:51 +020015 */
16
17package com.android.server.wm;
18
Tadashi G. Takaokabf0d57b2018-11-19 16:09:58 +090019import static com.android.dx.mockito.inline.extended.ExtendedMockito.any;
lumarkf6f34942019-04-29 16:56:50 +080020import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
Tadashi G. Takaokabf0d57b2018-11-19 16:09:58 +090021import static com.android.dx.mockito.inline.extended.ExtendedMockito.never;
lumarkf6f34942019-04-29 16:56:50 +080022import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn;
Tadashi G. Takaokabf0d57b2018-11-19 16:09:58 +090023import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify;
24import static com.android.dx.mockito.inline.extended.ExtendedMockito.verifyZeroInteractions;
Issei Suzuki8b995df2020-01-08 12:23:04 +010025import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_APP_TRANSITION;
26import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_RECENTS;
Tadashi G. Takaokabf0d57b2018-11-19 16:09:58 +090027
Jorim Jaggi980c9de2017-11-17 01:41:37 +010028import static org.junit.Assert.assertEquals;
Jorim Jaggi21c39a72017-10-20 15:47:51 +020029import static org.junit.Assert.assertFalse;
30import static org.junit.Assert.assertNotNull;
31import static org.junit.Assert.assertNull;
32import static org.junit.Assert.assertTrue;
33import static org.mockito.ArgumentMatchers.eq;
Jorim Jaggi21c39a72017-10-20 15:47:51 +020034
35import android.platform.test.annotations.Presubmit;
Vadim Caen17b76b72020-05-05 17:52:35 +020036import android.util.proto.ProtoOutputStream;
Jorim Jaggi21c39a72017-10-20 15:47:51 +020037import android.view.SurfaceControl;
38import android.view.SurfaceControl.Builder;
39import android.view.SurfaceControl.Transaction;
40import android.view.SurfaceSession;
41
Brett Chabota26eda92018-07-23 13:08:30 -070042import androidx.test.filters.SmallTest;
Brett Chabota26eda92018-07-23 13:08:30 -070043
Jorim Jaggi21c39a72017-10-20 15:47:51 +020044import com.android.server.wm.SurfaceAnimator.Animatable;
Issei Suzuki8b995df2020-01-08 12:23:04 +010045import com.android.server.wm.SurfaceAnimator.AnimationType;
Jorim Jaggi21c39a72017-10-20 15:47:51 +020046import com.android.server.wm.SurfaceAnimator.OnAnimationFinishedCallback;
47
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -070048import org.junit.After;
Jorim Jaggi21c39a72017-10-20 15:47:51 +020049import org.junit.Before;
50import org.junit.Test;
Louis Chang2453d062019-11-19 22:30:48 +080051import org.junit.runner.RunWith;
Jorim Jaggi21c39a72017-10-20 15:47:51 +020052import org.mockito.ArgumentCaptor;
53import org.mockito.Mock;
54import org.mockito.MockitoAnnotations;
55
Vadim Caen17b76b72020-05-05 17:52:35 +020056import java.io.PrintWriter;
57
Jorim Jaggi21c39a72017-10-20 15:47:51 +020058/**
59 * Test class for {@link SurfaceAnimatorTest}.
60 *
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -070061 * Build/Install/Run:
Yunfan Chend552c162019-02-08 16:51:28 +090062 * atest WmTests:SurfaceAnimatorTest
Jorim Jaggi21c39a72017-10-20 15:47:51 +020063 */
64@SmallTest
65@Presubmit
Louis Chang2453d062019-11-19 22:30:48 +080066@RunWith(WindowTestRunner.class)
Jorim Jaggi21c39a72017-10-20 15:47:51 +020067public class SurfaceAnimatorTest extends WindowTestsBase {
68
Jorim Jaggia5e10572017-11-15 14:36:26 +010069 @Mock AnimationAdapter mSpec;
70 @Mock AnimationAdapter mSpec2;
Jorim Jaggi21c39a72017-10-20 15:47:51 +020071 @Mock Transaction mTransaction;
72
Jorim Jaggi21c39a72017-10-20 15:47:51 +020073 private SurfaceSession mSession = new SurfaceSession();
Jorim Jaggia5e10572017-11-15 14:36:26 +010074 private MyAnimatable mAnimatable;
Jorim Jaggi980c9de2017-11-17 01:41:37 +010075 private MyAnimatable mAnimatable2;
Jorim Jaggi6de61012018-03-19 14:53:23 +010076 private DeferFinishAnimatable mDeferFinishAnimatable;
Jorim Jaggi21c39a72017-10-20 15:47:51 +020077
Jorim Jaggia5e10572017-11-15 14:36:26 +010078 @Before
79 public void setUp() throws Exception {
Jorim Jaggia5e10572017-11-15 14:36:26 +010080 MockitoAnnotations.initMocks(this);
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -070081
82 mAnimatable = new MyAnimatable(mWm, mSession, mTransaction);
83 mAnimatable2 = new MyAnimatable(mWm, mSession, mTransaction);
84 mDeferFinishAnimatable = new DeferFinishAnimatable(mWm, mSession, mTransaction);
85 }
86
87 @After
88 public void tearDown() {
89 mAnimatable = null;
90 mAnimatable2 = null;
91 mDeferFinishAnimatable = null;
92 mSession.kill();
93 mSession = null;
Jorim Jaggia5e10572017-11-15 14:36:26 +010094 }
95
96 @Test
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -070097 public void testRunAnimation() {
Issei Suzuki8b995df2020-01-08 12:23:04 +010098 mAnimatable.mSurfaceAnimator.startAnimation(mTransaction, mSpec, true /* hidden */,
99 ANIMATION_TYPE_RECENTS);
Jorim Jaggia5e10572017-11-15 14:36:26 +0100100 final ArgumentCaptor<OnAnimationFinishedCallback> callbackCaptor = ArgumentCaptor.forClass(
101 OnAnimationFinishedCallback.class);
Jorim Jaggi980c9de2017-11-17 01:41:37 +0100102 assertAnimating(mAnimatable);
Robert Carr10584fa2019-01-14 15:55:19 -0800103 verify(mTransaction).reparent(eq(mAnimatable.mSurface), eq(mAnimatable.mLeash));
Issei Suzuki8b995df2020-01-08 12:23:04 +0100104 verify(mSpec).startAnimation(any(), any(), eq(ANIMATION_TYPE_RECENTS),
105 callbackCaptor.capture());
Jorim Jaggia5e10572017-11-15 14:36:26 +0100106
Issei Suzuki8b995df2020-01-08 12:23:04 +0100107 callbackCaptor.getValue().onAnimationFinished(ANIMATION_TYPE_RECENTS, mSpec);
Jorim Jaggi980c9de2017-11-17 01:41:37 +0100108 assertNotAnimating(mAnimatable);
Jorim Jaggia5e10572017-11-15 14:36:26 +0100109 assertTrue(mAnimatable.mFinishedCallbackCalled);
Issei Suzuki8b995df2020-01-08 12:23:04 +0100110 assertEquals(ANIMATION_TYPE_RECENTS, mAnimatable.mFinishedAnimationType);
Robert Carr71200f22019-02-05 09:44:53 -0800111 verify(mTransaction).remove(eq(mAnimatable.mLeash));
Jorim Jaggia5e10572017-11-15 14:36:26 +0100112 // TODO: Verify reparenting once we use mPendingTransaction to reparent it back
113 }
114
115 @Test
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700116 public void testOverrideAnimation() {
Issei Suzuki8b995df2020-01-08 12:23:04 +0100117 mAnimatable.mSurfaceAnimator.startAnimation(mTransaction, mSpec, true /* hidden */,
118 ANIMATION_TYPE_APP_TRANSITION);
Jorim Jaggia5e10572017-11-15 14:36:26 +0100119 final SurfaceControl firstLeash = mAnimatable.mLeash;
Issei Suzuki8b995df2020-01-08 12:23:04 +0100120 mAnimatable.mSurfaceAnimator.startAnimation(mTransaction, mSpec2, true /* hidden */,
121 ANIMATION_TYPE_APP_TRANSITION);
Jorim Jaggia5e10572017-11-15 14:36:26 +0100122
Robert Carr71200f22019-02-05 09:44:53 -0800123 verify(mTransaction).remove(eq(firstLeash));
Jorim Jaggia5e10572017-11-15 14:36:26 +0100124 assertFalse(mAnimatable.mFinishedCallbackCalled);
125
126 final ArgumentCaptor<OnAnimationFinishedCallback> callbackCaptor = ArgumentCaptor.forClass(
127 OnAnimationFinishedCallback.class);
Jorim Jaggi980c9de2017-11-17 01:41:37 +0100128 assertAnimating(mAnimatable);
Issei Suzuki8b995df2020-01-08 12:23:04 +0100129 verify(mSpec).startAnimation(any(), any(), eq(ANIMATION_TYPE_APP_TRANSITION),
130 callbackCaptor.capture());
Jorim Jaggia5e10572017-11-15 14:36:26 +0100131
132 // First animation was finished, but this shouldn't cancel the second animation
Issei Suzuki8b995df2020-01-08 12:23:04 +0100133 callbackCaptor.getValue().onAnimationFinished(ANIMATION_TYPE_APP_TRANSITION, mSpec);
Jorim Jaggia5e10572017-11-15 14:36:26 +0100134 assertTrue(mAnimatable.mSurfaceAnimator.isAnimating());
135
136 // Second animation was finished
Issei Suzuki8b995df2020-01-08 12:23:04 +0100137 verify(mSpec2).startAnimation(any(), any(), eq(ANIMATION_TYPE_APP_TRANSITION),
138 callbackCaptor.capture());
139 callbackCaptor.getValue().onAnimationFinished(ANIMATION_TYPE_APP_TRANSITION, mSpec2);
Jorim Jaggi980c9de2017-11-17 01:41:37 +0100140 assertNotAnimating(mAnimatable);
Jorim Jaggia5e10572017-11-15 14:36:26 +0100141 assertTrue(mAnimatable.mFinishedCallbackCalled);
Issei Suzuki8b995df2020-01-08 12:23:04 +0100142 assertEquals(ANIMATION_TYPE_APP_TRANSITION, mAnimatable.mFinishedAnimationType);
Jorim Jaggia5e10572017-11-15 14:36:26 +0100143 }
144
145 @Test
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700146 public void testCancelAnimation() {
Issei Suzuki8b995df2020-01-08 12:23:04 +0100147 mAnimatable.mSurfaceAnimator.startAnimation(mTransaction, mSpec, true /* hidden */,
148 ANIMATION_TYPE_APP_TRANSITION);
Jorim Jaggi980c9de2017-11-17 01:41:37 +0100149 assertAnimating(mAnimatable);
Jorim Jaggia5e10572017-11-15 14:36:26 +0100150 mAnimatable.mSurfaceAnimator.cancelAnimation();
Jorim Jaggi980c9de2017-11-17 01:41:37 +0100151 assertNotAnimating(mAnimatable);
Jorim Jaggia5e10572017-11-15 14:36:26 +0100152 verify(mSpec).onAnimationCancelled(any());
153 assertTrue(mAnimatable.mFinishedCallbackCalled);
Issei Suzuki8b995df2020-01-08 12:23:04 +0100154 assertEquals(ANIMATION_TYPE_APP_TRANSITION, mAnimatable.mFinishedAnimationType);
Robert Carr71200f22019-02-05 09:44:53 -0800155 verify(mTransaction).remove(eq(mAnimatable.mLeash));
Jorim Jaggia5e10572017-11-15 14:36:26 +0100156 }
157
158 @Test
Vadim Caen9745f972019-09-17 19:16:14 +0200159 public void testCancelWithNullFinishCallbackAnimation() {
160 SurfaceAnimator animator = new SurfaceAnimator(mAnimatable, null, mWm);
Issei Suzuki8b995df2020-01-08 12:23:04 +0100161 animator.startAnimation(mTransaction, mSpec, true /* hidden */,
162 ANIMATION_TYPE_APP_TRANSITION);
Vadim Caen9745f972019-09-17 19:16:14 +0200163 assertTrue(animator.isAnimating());
164 assertNotNull(animator.getAnimation());
165 animator.cancelAnimation();
166 assertFalse(animator.isAnimating());
167 assertNull(animator.getAnimation());
168 verify(mSpec).onAnimationCancelled(any());
169 verify(mTransaction).remove(eq(mAnimatable.mLeash));
170 }
171
172 @Test
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700173 public void testDelayingAnimationStart() {
Jorim Jaggia5e10572017-11-15 14:36:26 +0100174 mAnimatable.mSurfaceAnimator.startDelayingAnimationStart();
Issei Suzuki8b995df2020-01-08 12:23:04 +0100175 mAnimatable.mSurfaceAnimator.startAnimation(mTransaction, mSpec, true /* hidden */,
176 ANIMATION_TYPE_APP_TRANSITION);
Jorim Jaggia5e10572017-11-15 14:36:26 +0100177 verifyZeroInteractions(mSpec);
Jorim Jaggi980c9de2017-11-17 01:41:37 +0100178 assertAnimating(mAnimatable);
Jorim Jaggic4d29f22018-03-22 16:30:56 +0100179 assertTrue(mAnimatable.mSurfaceAnimator.isAnimationStartDelayed());
Jorim Jaggia5e10572017-11-15 14:36:26 +0100180 mAnimatable.mSurfaceAnimator.endDelayingAnimationStart();
Issei Suzuki8b995df2020-01-08 12:23:04 +0100181 verify(mSpec).startAnimation(any(), any(), eq(ANIMATION_TYPE_APP_TRANSITION), any());
Jorim Jaggia5e10572017-11-15 14:36:26 +0100182 }
183
184 @Test
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700185 public void testDelayingAnimationStartAndCancelled() {
Jorim Jaggia5e10572017-11-15 14:36:26 +0100186 mAnimatable.mSurfaceAnimator.startDelayingAnimationStart();
Issei Suzuki8b995df2020-01-08 12:23:04 +0100187 mAnimatable.mSurfaceAnimator.startAnimation(mTransaction, mSpec, true /* hidden */,
188 ANIMATION_TYPE_APP_TRANSITION);
Jorim Jaggia5e10572017-11-15 14:36:26 +0100189 mAnimatable.mSurfaceAnimator.cancelAnimation();
190 verifyZeroInteractions(mSpec);
Jorim Jaggi980c9de2017-11-17 01:41:37 +0100191 assertNotAnimating(mAnimatable);
Jorim Jaggia5e10572017-11-15 14:36:26 +0100192 assertTrue(mAnimatable.mFinishedCallbackCalled);
Issei Suzuki8b995df2020-01-08 12:23:04 +0100193 assertEquals(ANIMATION_TYPE_APP_TRANSITION, mAnimatable.mFinishedAnimationType);
Robert Carr71200f22019-02-05 09:44:53 -0800194 verify(mTransaction).remove(eq(mAnimatable.mLeash));
Jorim Jaggia5e10572017-11-15 14:36:26 +0100195 }
196
Jorim Jaggi980c9de2017-11-17 01:41:37 +0100197 @Test
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700198 public void testTransferAnimation() {
Issei Suzuki8b995df2020-01-08 12:23:04 +0100199 mAnimatable.mSurfaceAnimator.startAnimation(mTransaction, mSpec, true /* hidden */,
200 ANIMATION_TYPE_APP_TRANSITION);
Jorim Jaggi980c9de2017-11-17 01:41:37 +0100201
202 final ArgumentCaptor<OnAnimationFinishedCallback> callbackCaptor = ArgumentCaptor.forClass(
203 OnAnimationFinishedCallback.class);
Issei Suzuki8b995df2020-01-08 12:23:04 +0100204 verify(mSpec).startAnimation(any(), any(), eq(ANIMATION_TYPE_APP_TRANSITION),
205 callbackCaptor.capture());
Jorim Jaggi980c9de2017-11-17 01:41:37 +0100206 final SurfaceControl leash = mAnimatable.mLeash;
207
208 mAnimatable2.mSurfaceAnimator.transferAnimation(mAnimatable.mSurfaceAnimator);
209 assertNotAnimating(mAnimatable);
210 assertAnimating(mAnimatable2);
211 assertEquals(leash, mAnimatable2.mSurfaceAnimator.mLeash);
Robert Carr71200f22019-02-05 09:44:53 -0800212 verify(mTransaction, never()).remove(eq(leash));
Issei Suzuki8b995df2020-01-08 12:23:04 +0100213 callbackCaptor.getValue().onAnimationFinished(ANIMATION_TYPE_APP_TRANSITION, mSpec);
Jorim Jaggi980c9de2017-11-17 01:41:37 +0100214 assertNotAnimating(mAnimatable2);
215 assertTrue(mAnimatable2.mFinishedCallbackCalled);
Issei Suzuki8b995df2020-01-08 12:23:04 +0100216 assertEquals(ANIMATION_TYPE_APP_TRANSITION, mAnimatable.mFinishedAnimationType);
Robert Carr71200f22019-02-05 09:44:53 -0800217 verify(mTransaction).remove(eq(leash));
Jorim Jaggi980c9de2017-11-17 01:41:37 +0100218 }
219
Jorim Jaggi6de61012018-03-19 14:53:23 +0100220 @Test
lumarkf6f34942019-04-29 16:56:50 +0800221 public void testOnAnimationLeashLostWhenAnimatableParentSurfaceControlNull() {
Issei Suzuki8b995df2020-01-08 12:23:04 +0100222 mAnimatable.mSurfaceAnimator.startAnimation(mTransaction, mSpec, true /* hidden */,
223 ANIMATION_TYPE_APP_TRANSITION);
lumarkf6f34942019-04-29 16:56:50 +0800224 spyOn(mAnimatable);
225
226 // Verify onAnimationLeashLost will be called even animatable's parent surface control lost.
227 doReturn(null).when(mAnimatable).getParentSurfaceControl();
228 mAnimatable.mSurfaceAnimator.cancelAnimation();
229
230 final SurfaceControl leash = mAnimatable.mLeash;
231 verify(mTransaction).remove(eq(leash));
232 verify(mAnimatable).onAnimationLeashLost(mTransaction);
233 }
234
235 @Test
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700236 public void testDeferFinish() {
Jorim Jaggi6de61012018-03-19 14:53:23 +0100237
238 // Start animation
Riddle Hsu1d5856c2019-03-26 22:56:53 +0800239 final OnAnimationFinishedCallback onFinishedCallback = startDeferFinishAnimatable(mSpec);
Jorim Jaggi6de61012018-03-19 14:53:23 +0100240
241 // Finish the animation but then make sure we are deferring.
Issei Suzuki8b995df2020-01-08 12:23:04 +0100242 onFinishedCallback.onAnimationFinished(ANIMATION_TYPE_APP_TRANSITION, mSpec);
Jorim Jaggi6de61012018-03-19 14:53:23 +0100243 assertAnimating(mDeferFinishAnimatable);
244
245 // Now end defer finishing.
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700246 mDeferFinishAnimatable.mEndDeferFinishCallback.run();
Jorim Jaggi6de61012018-03-19 14:53:23 +0100247 assertNotAnimating(mAnimatable2);
248 assertTrue(mDeferFinishAnimatable.mFinishedCallbackCalled);
Issei Suzuki8b995df2020-01-08 12:23:04 +0100249 assertEquals(ANIMATION_TYPE_APP_TRANSITION, mDeferFinishAnimatable.mFinishedAnimationType);
Robert Carr71200f22019-02-05 09:44:53 -0800250 verify(mTransaction).remove(eq(mDeferFinishAnimatable.mLeash));
Jorim Jaggi6de61012018-03-19 14:53:23 +0100251 }
252
Riddle Hsu1d5856c2019-03-26 22:56:53 +0800253 @Test
254 public void testDeferFinishDoNotFinishNextAnimation() {
255 // Start the first animation.
256 final OnAnimationFinishedCallback onFinishedCallback = startDeferFinishAnimatable(mSpec);
Issei Suzuki8b995df2020-01-08 12:23:04 +0100257 onFinishedCallback.onAnimationFinished(ANIMATION_TYPE_APP_TRANSITION, mSpec);
Riddle Hsu1d5856c2019-03-26 22:56:53 +0800258 // The callback is the resetAndInvokeFinish in {@link SurfaceAnimator#getFinishedCallback}.
259 final Runnable firstDeferFinishCallback = mDeferFinishAnimatable.mEndDeferFinishCallback;
260
261 // Start the second animation.
262 mDeferFinishAnimatable.mSurfaceAnimator.cancelAnimation();
263 startDeferFinishAnimatable(mSpec2);
264 mDeferFinishAnimatable.mFinishedCallbackCalled = false;
265
266 // Simulate the first deferred callback is executed from
Garfield Tane8d84ab2019-10-11 09:49:40 -0700267 // {@link AnimatingActivityRegistry#endDeferringFinished}.
Riddle Hsu1d5856c2019-03-26 22:56:53 +0800268 firstDeferFinishCallback.run();
269 // The second animation should not be finished.
270 assertFalse(mDeferFinishAnimatable.mFinishedCallbackCalled);
271 }
272
Vadim Caen17b76b72020-05-05 17:52:35 +0200273 @Test
274 public void testDeferFinishFromAdapter() {
275
276 DeferredFinishAdapter deferredFinishAdapter = new DeferredFinishAdapter();
277 // Start animation
278 mAnimatable.mSurfaceAnimator.startAnimation(mTransaction, deferredFinishAdapter,
279 true /* hidden */,
280 ANIMATION_TYPE_APP_TRANSITION);
281 assertAnimating(mAnimatable);
282 deferredFinishAdapter.mFinishCallback.onAnimationFinished(ANIMATION_TYPE_APP_TRANSITION,
283 deferredFinishAdapter);
284
285 assertAnimating(mAnimatable);
286 assertFalse(mAnimatable.mFinishedCallbackCalled);
287 // Now end defer finishing.
288 deferredFinishAdapter.mEndDeferFinishCallback.run();
289 assertNotAnimating(mAnimatable);
290 assertTrue(mAnimatable.mFinishedCallbackCalled);
291 verify(mTransaction).remove(eq(deferredFinishAdapter.mAnimationLeash));
292 }
293
Riddle Hsu1d5856c2019-03-26 22:56:53 +0800294 private OnAnimationFinishedCallback startDeferFinishAnimatable(AnimationAdapter anim) {
295 mDeferFinishAnimatable.mSurfaceAnimator.startAnimation(mTransaction, anim,
Issei Suzuki8b995df2020-01-08 12:23:04 +0100296 true /* hidden */, ANIMATION_TYPE_APP_TRANSITION);
Riddle Hsu1d5856c2019-03-26 22:56:53 +0800297 final ArgumentCaptor<OnAnimationFinishedCallback> callbackCaptor = ArgumentCaptor.forClass(
298 OnAnimationFinishedCallback.class);
299 assertAnimating(mDeferFinishAnimatable);
Issei Suzuki8b995df2020-01-08 12:23:04 +0100300 verify(anim).startAnimation(any(), any(), eq(ANIMATION_TYPE_APP_TRANSITION),
301 callbackCaptor.capture());
Riddle Hsu1d5856c2019-03-26 22:56:53 +0800302 return callbackCaptor.getValue();
303 }
304
Jorim Jaggi980c9de2017-11-17 01:41:37 +0100305 private void assertAnimating(MyAnimatable animatable) {
306 assertTrue(animatable.mSurfaceAnimator.isAnimating());
307 assertNotNull(animatable.mSurfaceAnimator.getAnimation());
308 }
309
310 private void assertNotAnimating(MyAnimatable animatable) {
311 assertFalse(animatable.mSurfaceAnimator.isAnimating());
312 assertNull(animatable.mSurfaceAnimator.getAnimation());
313 }
314
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700315 private static class MyAnimatable implements Animatable {
Jorim Jaggia5e10572017-11-15 14:36:26 +0100316
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700317 private final SurfaceSession mSession;
318 private final Transaction mTransaction;
Jorim Jaggia5e10572017-11-15 14:36:26 +0100319 final SurfaceControl mParent;
320 final SurfaceControl mSurface;
Jorim Jaggia5e10572017-11-15 14:36:26 +0100321 final SurfaceAnimator mSurfaceAnimator;
322 SurfaceControl mLeash;
323 boolean mFinishedCallbackCalled;
Issei Suzuki8b995df2020-01-08 12:23:04 +0100324 @AnimationType int mFinishedAnimationType;
Jorim Jaggia5e10572017-11-15 14:36:26 +0100325
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700326 MyAnimatable(WindowManagerService wm, SurfaceSession session, Transaction transaction) {
327 mSession = session;
328 mTransaction = transaction;
329 mParent = wm.makeSurfaceBuilder(mSession)
Jorim Jaggia5e10572017-11-15 14:36:26 +0100330 .setName("test surface parent")
Jorim Jaggia5e10572017-11-15 14:36:26 +0100331 .build();
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700332 mSurface = wm.makeSurfaceBuilder(mSession)
Jorim Jaggia5e10572017-11-15 14:36:26 +0100333 .setName("test surface")
Jorim Jaggia5e10572017-11-15 14:36:26 +0100334 .build();
335 mFinishedCallbackCalled = false;
336 mLeash = null;
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700337 mSurfaceAnimator = new SurfaceAnimator(this, mFinishedCallback, wm);
Jorim Jaggia5e10572017-11-15 14:36:26 +0100338 }
339
Jorim Jaggi21c39a72017-10-20 15:47:51 +0200340 @Override
341 public Transaction getPendingTransaction() {
342 return mTransaction;
343 }
344
345 @Override
346 public void commitPendingTransaction() {
347 }
348
349 @Override
Jorim Jaggia5e10572017-11-15 14:36:26 +0100350 public void onAnimationLeashCreated(Transaction t, SurfaceControl leash) {
Jorim Jaggi21c39a72017-10-20 15:47:51 +0200351 }
352
353 @Override
lumarkf6f34942019-04-29 16:56:50 +0800354 public void onAnimationLeashLost(Transaction t) {
Jorim Jaggi21c39a72017-10-20 15:47:51 +0200355 }
356
357 @Override
Jorim Jaggia5e10572017-11-15 14:36:26 +0100358 public Builder makeAnimationLeash() {
Jorim Jaggi21c39a72017-10-20 15:47:51 +0200359 return new SurfaceControl.Builder(mSession) {
360
361 @Override
362 public SurfaceControl build() {
363 mLeash = super.build();
364 return mLeash;
365 }
366 }.setParent(mParent);
367 }
368
369 @Override
Jorim Jaggi596a1992017-12-29 14:48:02 +0100370 public SurfaceControl getAnimationLeashParent() {
371 return mParent;
372 }
373
374 @Override
Jorim Jaggia5e10572017-11-15 14:36:26 +0100375 public SurfaceControl getSurfaceControl() {
Jorim Jaggi21c39a72017-10-20 15:47:51 +0200376 return mSurface;
377 }
378
379 @Override
Jorim Jaggia5e10572017-11-15 14:36:26 +0100380 public SurfaceControl getParentSurfaceControl() {
Jorim Jaggi21c39a72017-10-20 15:47:51 +0200381 return mParent;
382 }
383
384 @Override
385 public int getSurfaceWidth() {
386 return 1;
387 }
388
389 @Override
390 public int getSurfaceHeight() {
391 return 1;
392 }
Jorim Jaggi21c39a72017-10-20 15:47:51 +0200393
Issei Suzuki8b995df2020-01-08 12:23:04 +0100394 private final SurfaceAnimator.OnAnimationFinishedCallback mFinishedCallback = (
395 type, anim) -> {
396 mFinishedCallbackCalled = true;
397 mFinishedAnimationType = type;
398 };
Jorim Jaggi21c39a72017-10-20 15:47:51 +0200399 }
Jorim Jaggi6de61012018-03-19 14:53:23 +0100400
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700401 private static class DeferFinishAnimatable extends MyAnimatable {
Jorim Jaggi6de61012018-03-19 14:53:23 +0100402
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700403 Runnable mEndDeferFinishCallback;
404
405 DeferFinishAnimatable(WindowManagerService wm, SurfaceSession session,
406 Transaction transaction) {
407 super(wm, session, transaction);
408 }
Jorim Jaggi6de61012018-03-19 14:53:23 +0100409
410 @Override
411 public boolean shouldDeferAnimationFinish(Runnable endDeferFinishCallback) {
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700412 mEndDeferFinishCallback = endDeferFinishCallback;
Jorim Jaggi6de61012018-03-19 14:53:23 +0100413 return true;
414 }
415 }
Vadim Caen17b76b72020-05-05 17:52:35 +0200416
417 private static class DeferredFinishAdapter implements AnimationAdapter {
418
419 private Runnable mEndDeferFinishCallback;
420 private OnAnimationFinishedCallback mFinishCallback;
421 private SurfaceControl mAnimationLeash;
422
423 @Override
424 public boolean getShowWallpaper() {
425 return true;
426 }
427
428 @Override
429 public void startAnimation(SurfaceControl animationLeash, Transaction t, int type,
430 OnAnimationFinishedCallback finishCallback) {
431 mFinishCallback = finishCallback;
432 mAnimationLeash = animationLeash;
433 }
434
435 @Override
436 public void onAnimationCancelled(SurfaceControl animationLeash) {
437 }
438
439 @Override
440 public long getDurationHint() {
441 return 100;
442 }
443
444 @Override
445 public long getStatusBarTransitionsStartTime() {
446 return 100;
447 }
448
449 @Override
450 public void dump(PrintWriter pw, String prefix) {
451 }
452
453 @Override
454 public void dumpDebug(ProtoOutputStream proto) {
455 }
456
457 @Override
458 public boolean shouldDeferAnimationFinish(Runnable endDeferFinishCallback) {
459 mEndDeferFinishCallback = endDeferFinishCallback;
460 return true;
461 }
462 }
Jorim Jaggi21c39a72017-10-20 15:47:51 +0200463}