blob: add2054d5638ad580c823d57f5d4debee2132b48 [file] [log] [blame]
Jorim Jaggi33a701a2017-12-01 14:58:18 +01001/*
2 * Copyright (C) 2018 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 Jaggi33a701a2017-12-01 14:58:18 +010015 */
16
17package com.android.server.wm;
18
19import static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
Adrian Roos842e7882018-03-26 17:34:06 +020020
Tadashi G. Takaokabf0d57b2018-11-19 16:09:58 +090021import static com.android.dx.mockito.inline.extended.ExtendedMockito.atLeast;
Winson Chungd5852192019-09-06 17:20:28 -070022import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
Tadashi G. Takaokabf0d57b2018-11-19 16:09:58 +090023import static com.android.dx.mockito.inline.extended.ExtendedMockito.never;
Winson Chungd5852192019-09-06 17:20:28 -070024import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn;
Tadashi G. Takaokabf0d57b2018-11-19 16:09:58 +090025import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify;
26import static com.android.dx.mockito.inline.extended.ExtendedMockito.verifyNoMoreInteractions;
27import static com.android.dx.mockito.inline.extended.ExtendedMockito.when;
Issei Suzuki8b995df2020-01-08 12:23:04 +010028import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_APP_TRANSITION;
29import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_WINDOW_ANIMATION;
Tadashi G. Takaokabf0d57b2018-11-19 16:09:58 +090030
Jorim Jaggi33a701a2017-12-01 14:58:18 +010031import static org.junit.Assert.assertEquals;
Evan Rosky2289ba12018-11-19 18:28:18 -080032import static org.junit.Assert.assertNotNull;
Jorim Jaggi33a701a2017-12-01 14:58:18 +010033import static org.mockito.ArgumentMatchers.eq;
Winson Chungd5852192019-09-06 17:20:28 -070034import static org.mockito.Mockito.mock;
Jorim Jaggi33a701a2017-12-01 14:58:18 +010035
36import android.graphics.Point;
37import android.graphics.Rect;
Adrian Roos842e7882018-03-26 17:34:06 +020038import android.os.Binder;
Winson Chungd5852192019-09-06 17:20:28 -070039import android.os.IBinder;
Adrian Roos842e7882018-03-26 17:34:06 +020040import android.os.IInterface;
41import android.platform.test.annotations.Presubmit;
Jorim Jaggi33a701a2017-12-01 14:58:18 +010042import android.view.IRemoteAnimationFinishedCallback;
43import android.view.IRemoteAnimationRunner;
44import android.view.RemoteAnimationAdapter;
45import android.view.RemoteAnimationTarget;
46import android.view.SurfaceControl;
47import android.view.SurfaceControl.Transaction;
48
Vishnu Nair1d3f2372019-05-22 22:12:26 -070049import androidx.test.filters.FlakyTest;
Brett Chabota26eda92018-07-23 13:08:30 -070050import androidx.test.filters.SmallTest;
Brett Chabota26eda92018-07-23 13:08:30 -070051
Jorim Jaggi33a701a2017-12-01 14:58:18 +010052import com.android.server.testutils.OffsettableClock;
53import com.android.server.testutils.TestHandler;
Evan Rosky2289ba12018-11-19 18:28:18 -080054import com.android.server.wm.RemoteAnimationController.RemoteAnimationRecord;
Jorim Jaggi33a701a2017-12-01 14:58:18 +010055import com.android.server.wm.SurfaceAnimator.OnAnimationFinishedCallback;
56
57import org.junit.Before;
58import org.junit.Test;
Louis Chang2453d062019-11-19 22:30:48 +080059import org.junit.runner.RunWith;
Jorim Jaggi33a701a2017-12-01 14:58:18 +010060import org.mockito.ArgumentCaptor;
61import org.mockito.Mock;
62import org.mockito.MockitoAnnotations;
63
64/**
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -070065 * Build/Install/Run:
Andrii Kulianf5d14112019-10-31 17:37:54 -070066 * atest WmTests:RemoteAnimationControllerTest
Jorim Jaggi33a701a2017-12-01 14:58:18 +010067 */
68@SmallTest
Adrian Roos842e7882018-03-26 17:34:06 +020069@Presubmit
Louis Chang2453d062019-11-19 22:30:48 +080070@RunWith(WindowTestRunner.class)
Jorim Jaggi33a701a2017-12-01 14:58:18 +010071public class RemoteAnimationControllerTest extends WindowTestsBase {
72
73 @Mock SurfaceControl mMockLeash;
Evan Rosky2289ba12018-11-19 18:28:18 -080074 @Mock SurfaceControl mMockThumbnailLeash;
Jorim Jaggi33a701a2017-12-01 14:58:18 +010075 @Mock Transaction mMockTransaction;
76 @Mock OnAnimationFinishedCallback mFinishedCallback;
Evan Rosky2289ba12018-11-19 18:28:18 -080077 @Mock OnAnimationFinishedCallback mThumbnailFinishedCallback;
Jorim Jaggi33a701a2017-12-01 14:58:18 +010078 @Mock IRemoteAnimationRunner mMockRunner;
79 private RemoteAnimationAdapter mAdapter;
80 private RemoteAnimationController mController;
81 private final OffsettableClock mClock = new OffsettableClock.Stopped();
82 private TestHandler mHandler;
83
84 @Before
85 public void setUp() throws Exception {
Jorim Jaggi33a701a2017-12-01 14:58:18 +010086 MockitoAnnotations.initMocks(this);
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -070087
Adrian Roos842e7882018-03-26 17:34:06 +020088 when(mMockRunner.asBinder()).thenReturn(new Binder());
Evan Rosky966759f2019-01-15 10:33:58 -080089 mAdapter = new RemoteAnimationAdapter(mMockRunner, 100, 50, true /* changeNeedsSnapshot */);
Jorim Jaggi589c5ba2019-07-30 16:50:13 +020090 mAdapter.setCallingPidUid(123, 456);
Louis Chang2453d062019-11-19 22:30:48 +080091 runWithScissors(mWm.mH, () -> mHandler = new TestHandler(null, mClock), 0);
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -070092 mController = new RemoteAnimationController(mWm, mAdapter, mHandler);
Jorim Jaggi33a701a2017-12-01 14:58:18 +010093 }
94
95 @Test
96 public void testRun() throws Exception {
97 final WindowState win = createWindow(null /* parent */, TYPE_BASE_APPLICATION, "testWin");
Garfield Tane8d84ab2019-10-11 09:49:40 -070098 mDisplayContent.mOpeningApps.add(win.mActivityRecord);
Jorim Jaggi33a701a2017-12-01 14:58:18 +010099 try {
Garfield Tane8d84ab2019-10-11 09:49:40 -0700100 final AnimationAdapter adapter = mController.createRemoteAnimationRecord(win.mActivityRecord,
lumark2ec19122020-01-23 00:09:04 +0800101 new Point(50, 100), null, new Rect(50, 100, 150, 150), null).mAdapter;
Issei Suzuki8b995df2020-01-08 12:23:04 +0100102 adapter.startAnimation(mMockLeash, mMockTransaction, ANIMATION_TYPE_APP_TRANSITION,
103 mFinishedCallback);
Jorim Jaggi33a701a2017-12-01 14:58:18 +0100104 mController.goodToGo();
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700105 mWm.mAnimator.executeAfterPrepareSurfacesRunnables();
Jorim Jaggi33a701a2017-12-01 14:58:18 +0100106 final ArgumentCaptor<RemoteAnimationTarget[]> appsCaptor =
107 ArgumentCaptor.forClass(RemoteAnimationTarget[].class);
Winson Chungd5852192019-09-06 17:20:28 -0700108 final ArgumentCaptor<RemoteAnimationTarget[]> wallpapersCaptor =
109 ArgumentCaptor.forClass(RemoteAnimationTarget[].class);
Jorim Jaggi33a701a2017-12-01 14:58:18 +0100110 final ArgumentCaptor<IRemoteAnimationFinishedCallback> finishedCaptor =
111 ArgumentCaptor.forClass(IRemoteAnimationFinishedCallback.class);
Winson Chungd5852192019-09-06 17:20:28 -0700112 verify(mMockRunner).onAnimationStart(appsCaptor.capture(), wallpapersCaptor.capture(),
113 finishedCaptor.capture());
Jorim Jaggi33a701a2017-12-01 14:58:18 +0100114 assertEquals(1, appsCaptor.getValue().length);
115 final RemoteAnimationTarget app = appsCaptor.getValue()[0];
116 assertEquals(new Point(50, 100), app.position);
117 assertEquals(new Rect(50, 100, 150, 150), app.sourceContainerBounds);
Garfield Tane8d84ab2019-10-11 09:49:40 -0700118 assertEquals(win.mActivityRecord.getPrefixOrderIndex(), app.prefixOrderIndex);
119 assertEquals(win.mActivityRecord.getTask().mTaskId, app.taskId);
Jorim Jaggi33a701a2017-12-01 14:58:18 +0100120 assertEquals(mMockLeash, app.leash);
121 assertEquals(win.mWinAnimator.mLastClipRect, app.clipRect);
122 assertEquals(false, app.isTranslucent);
Jorim Jaggi33a701a2017-12-01 14:58:18 +0100123 verify(mMockTransaction).setPosition(mMockLeash, app.position.x, app.position.y);
Evan Roskyb96326e2019-07-01 09:59:17 -0700124 verify(mMockTransaction).setWindowCrop(mMockLeash, 100, 50);
Jorim Jaggi33a701a2017-12-01 14:58:18 +0100125
126 finishedCaptor.getValue().onAnimationFinished();
Issei Suzuki8b995df2020-01-08 12:23:04 +0100127 verify(mFinishedCallback).onAnimationFinished(eq(ANIMATION_TYPE_APP_TRANSITION),
128 eq(adapter));
Jorim Jaggi33a701a2017-12-01 14:58:18 +0100129 } finally {
lumark588a3e82018-07-20 18:53:54 +0800130 mDisplayContent.mOpeningApps.clear();
Jorim Jaggi33a701a2017-12-01 14:58:18 +0100131 }
132 }
133
134 @Test
135 public void testCancel() throws Exception {
136 final WindowState win = createWindow(null /* parent */, TYPE_BASE_APPLICATION, "testWin");
Garfield Tane8d84ab2019-10-11 09:49:40 -0700137 final AnimationAdapter adapter = mController.createRemoteAnimationRecord(win.mActivityRecord,
lumark2ec19122020-01-23 00:09:04 +0800138 new Point(50, 100), null, new Rect(50, 100, 150, 150), null).mAdapter;
Issei Suzuki8b995df2020-01-08 12:23:04 +0100139 adapter.startAnimation(mMockLeash, mMockTransaction, ANIMATION_TYPE_APP_TRANSITION,
140 mFinishedCallback);
Jorim Jaggi33a701a2017-12-01 14:58:18 +0100141 mController.goodToGo();
142
143 adapter.onAnimationCancelled(mMockLeash);
144 verify(mMockRunner).onAnimationCancelled();
145 }
146
147 @Test
148 public void testTimeout() throws Exception {
149 final WindowState win = createWindow(null /* parent */, TYPE_BASE_APPLICATION, "testWin");
Garfield Tane8d84ab2019-10-11 09:49:40 -0700150 final AnimationAdapter adapter = mController.createRemoteAnimationRecord(win.mActivityRecord,
lumark2ec19122020-01-23 00:09:04 +0800151 new Point(50, 100), null, new Rect(50, 100, 150, 150), null).mAdapter;
Issei Suzuki8b995df2020-01-08 12:23:04 +0100152 adapter.startAnimation(mMockLeash, mMockTransaction, ANIMATION_TYPE_APP_TRANSITION,
153 mFinishedCallback);
Jorim Jaggi33a701a2017-12-01 14:58:18 +0100154 mController.goodToGo();
155
156 mClock.fastForward(2500);
157 mHandler.timeAdvance();
158
159 verify(mMockRunner).onAnimationCancelled();
Issei Suzuki8b995df2020-01-08 12:23:04 +0100160 verify(mFinishedCallback).onAnimationFinished(eq(ANIMATION_TYPE_APP_TRANSITION),
161 eq(adapter));
Jorim Jaggi33a701a2017-12-01 14:58:18 +0100162 }
Jorim Jaggi93f9fe32018-01-25 15:06:13 +0100163
164 @Test
Jorim Jaggia19d7812018-02-01 15:03:59 +0100165 public void testTimeout_scaled() throws Exception {
Tadashi G. Takaokabf0d57b2018-11-19 16:09:58 +0900166 try {
Tadashi G. Takaoka809cbc52018-12-19 14:11:30 +0900167 mWm.setAnimationScale(2, 5.0f);
Tadashi G. Takaokabf0d57b2018-11-19 16:09:58 +0900168 final WindowState win = createWindow(null /* parent */, TYPE_BASE_APPLICATION,
169 "testWin");
Evan Rosky2289ba12018-11-19 18:28:18 -0800170 final AnimationAdapter adapter = mController.createRemoteAnimationRecord(
lumark2ec19122020-01-23 00:09:04 +0800171 win.mActivityRecord, new Point(50, 100), null, new Rect(50, 100, 150, 150),
172 null).mAdapter;
Issei Suzuki8b995df2020-01-08 12:23:04 +0100173 adapter.startAnimation(mMockLeash, mMockTransaction, ANIMATION_TYPE_APP_TRANSITION,
174 mFinishedCallback);
Jorim Jaggia19d7812018-02-01 15:03:59 +0100175 mController.goodToGo();
176
177 mClock.fastForward(2500);
178 mHandler.timeAdvance();
179
180 verify(mMockRunner, never()).onAnimationCancelled();
181
182 mClock.fastForward(10000);
183 mHandler.timeAdvance();
184
185 verify(mMockRunner).onAnimationCancelled();
Issei Suzuki8b995df2020-01-08 12:23:04 +0100186 verify(mFinishedCallback).onAnimationFinished(eq(ANIMATION_TYPE_APP_TRANSITION),
187 eq(adapter));
Jorim Jaggia19d7812018-02-01 15:03:59 +0100188 } finally {
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700189 mWm.setAnimationScale(2, 1.0f);
Jorim Jaggia19d7812018-02-01 15:03:59 +0100190 }
Jorim Jaggia19d7812018-02-01 15:03:59 +0100191 }
192
193 @Test
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700194 public void testZeroAnimations() {
Jorim Jaggi93f9fe32018-01-25 15:06:13 +0100195 mController.goodToGo();
Adrian Roos842e7882018-03-26 17:34:06 +0200196 verifyNoMoreInteractionsExceptAsBinder(mMockRunner);
Jorim Jaggi93f9fe32018-01-25 15:06:13 +0100197 }
Jorim Jaggic4d29f22018-03-22 16:30:56 +0100198
199 @Test
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700200 public void testNotReallyStarted() {
Jorim Jaggic4d29f22018-03-22 16:30:56 +0100201 final WindowState win = createWindow(null /* parent */, TYPE_BASE_APPLICATION, "testWin");
Garfield Tane8d84ab2019-10-11 09:49:40 -0700202 mController.createRemoteAnimationRecord(win.mActivityRecord,
lumark2ec19122020-01-23 00:09:04 +0800203 new Point(50, 100), null, new Rect(50, 100, 150, 150), null);
Jorim Jaggic4d29f22018-03-22 16:30:56 +0100204 mController.goodToGo();
Adrian Roos842e7882018-03-26 17:34:06 +0200205 verifyNoMoreInteractionsExceptAsBinder(mMockRunner);
Jorim Jaggic4d29f22018-03-22 16:30:56 +0100206 }
207
208 @Test
209 public void testOneNotStarted() throws Exception {
210 final WindowState win1 = createWindow(null /* parent */, TYPE_BASE_APPLICATION, "testWin1");
211 final WindowState win2 = createWindow(null /* parent */, TYPE_BASE_APPLICATION, "testWin2");
Garfield Tane8d84ab2019-10-11 09:49:40 -0700212 mController.createRemoteAnimationRecord(win1.mActivityRecord,
lumark2ec19122020-01-23 00:09:04 +0800213 new Point(50, 100), null, new Rect(50, 100, 150, 150), null);
Garfield Tane8d84ab2019-10-11 09:49:40 -0700214 final AnimationAdapter adapter = mController.createRemoteAnimationRecord(win2.mActivityRecord,
lumark2ec19122020-01-23 00:09:04 +0800215 new Point(50, 100), null, new Rect(50, 100, 150, 150), null).mAdapter;
Issei Suzuki8b995df2020-01-08 12:23:04 +0100216 adapter.startAnimation(mMockLeash, mMockTransaction, ANIMATION_TYPE_APP_TRANSITION,
217 mFinishedCallback);
Jorim Jaggic4d29f22018-03-22 16:30:56 +0100218 mController.goodToGo();
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700219 mWm.mAnimator.executeAfterPrepareSurfacesRunnables();
Jorim Jaggic4d29f22018-03-22 16:30:56 +0100220 final ArgumentCaptor<RemoteAnimationTarget[]> appsCaptor =
221 ArgumentCaptor.forClass(RemoteAnimationTarget[].class);
Winson Chungd5852192019-09-06 17:20:28 -0700222 final ArgumentCaptor<RemoteAnimationTarget[]> wallpapersCaptor =
223 ArgumentCaptor.forClass(RemoteAnimationTarget[].class);
Jorim Jaggic4d29f22018-03-22 16:30:56 +0100224 final ArgumentCaptor<IRemoteAnimationFinishedCallback> finishedCaptor =
225 ArgumentCaptor.forClass(IRemoteAnimationFinishedCallback.class);
Winson Chungd5852192019-09-06 17:20:28 -0700226 verify(mMockRunner).onAnimationStart(appsCaptor.capture(), wallpapersCaptor.capture(),
227 finishedCaptor.capture());
Jorim Jaggic4d29f22018-03-22 16:30:56 +0100228 assertEquals(1, appsCaptor.getValue().length);
229 assertEquals(mMockLeash, appsCaptor.getValue()[0].leash);
230 }
Jorim Jaggib8a9cbe2018-03-27 18:02:18 +0200231
232 @Test
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700233 public void testRemovedBeforeStarted() {
Jorim Jaggib8a9cbe2018-03-27 18:02:18 +0200234 final WindowState win = createWindow(null /* parent */, TYPE_BASE_APPLICATION, "testWin");
Garfield Tane8d84ab2019-10-11 09:49:40 -0700235 final AnimationAdapter adapter = mController.createRemoteAnimationRecord(win.mActivityRecord,
lumark2ec19122020-01-23 00:09:04 +0800236 new Point(50, 100), null, new Rect(50, 100, 150, 150), null).mAdapter;
Issei Suzuki8b995df2020-01-08 12:23:04 +0100237 adapter.startAnimation(mMockLeash, mMockTransaction, ANIMATION_TYPE_APP_TRANSITION,
238 mFinishedCallback);
Garfield Tane8d84ab2019-10-11 09:49:40 -0700239 win.mActivityRecord.removeImmediately();
Jorim Jaggib8a9cbe2018-03-27 18:02:18 +0200240 mController.goodToGo();
Adrian Roos842e7882018-03-26 17:34:06 +0200241 verifyNoMoreInteractionsExceptAsBinder(mMockRunner);
Issei Suzuki8b995df2020-01-08 12:23:04 +0100242 verify(mFinishedCallback).onAnimationFinished(eq(ANIMATION_TYPE_APP_TRANSITION),
243 eq(adapter));
Jorim Jaggib8a9cbe2018-03-27 18:02:18 +0200244 }
Adrian Roos842e7882018-03-26 17:34:06 +0200245
Evan Rosky2289ba12018-11-19 18:28:18 -0800246 @Test
247 public void testChange() throws Exception {
248 final WindowState win = createWindow(null /* parent */, TYPE_BASE_APPLICATION, "testWin");
Evan Rosky55bddd82020-01-29 13:07:18 -0800249 mDisplayContent.mChangingContainers.add(win.mActivityRecord);
Evan Rosky2289ba12018-11-19 18:28:18 -0800250 try {
251 final RemoteAnimationRecord record = mController.createRemoteAnimationRecord(
lumark2ec19122020-01-23 00:09:04 +0800252 win.mActivityRecord, new Point(50, 100), null, new Rect(50, 100, 150, 150),
Evan Rosky2289ba12018-11-19 18:28:18 -0800253 new Rect(0, 0, 200, 200));
254 assertNotNull(record.mThumbnailAdapter);
255 ((AnimationAdapter) record.mAdapter)
Issei Suzuki8b995df2020-01-08 12:23:04 +0100256 .startAnimation(mMockLeash, mMockTransaction, ANIMATION_TYPE_WINDOW_ANIMATION,
257 mFinishedCallback);
Evan Rosky2289ba12018-11-19 18:28:18 -0800258 ((AnimationAdapter) record.mThumbnailAdapter).startAnimation(mMockThumbnailLeash,
Issei Suzuki8b995df2020-01-08 12:23:04 +0100259 mMockTransaction, ANIMATION_TYPE_WINDOW_ANIMATION, mThumbnailFinishedCallback);
Evan Rosky2289ba12018-11-19 18:28:18 -0800260 mController.goodToGo();
261 mWm.mAnimator.executeAfterPrepareSurfacesRunnables();
262 final ArgumentCaptor<RemoteAnimationTarget[]> appsCaptor =
263 ArgumentCaptor.forClass(RemoteAnimationTarget[].class);
Winson Chungd5852192019-09-06 17:20:28 -0700264 final ArgumentCaptor<RemoteAnimationTarget[]> wallpapersCaptor =
265 ArgumentCaptor.forClass(RemoteAnimationTarget[].class);
Evan Rosky2289ba12018-11-19 18:28:18 -0800266 final ArgumentCaptor<IRemoteAnimationFinishedCallback> finishedCaptor =
267 ArgumentCaptor.forClass(IRemoteAnimationFinishedCallback.class);
Winson Chungd5852192019-09-06 17:20:28 -0700268 verify(mMockRunner).onAnimationStart(appsCaptor.capture(), wallpapersCaptor.capture(),
269 finishedCaptor.capture());
Evan Rosky2289ba12018-11-19 18:28:18 -0800270 assertEquals(1, appsCaptor.getValue().length);
271 final RemoteAnimationTarget app = appsCaptor.getValue()[0];
272 assertEquals(RemoteAnimationTarget.MODE_CHANGING, app.mode);
273 assertEquals(new Point(50, 100), app.position);
274 assertEquals(new Rect(50, 100, 150, 150), app.sourceContainerBounds);
275 assertEquals(new Rect(0, 0, 200, 200), app.startBounds);
276 assertEquals(mMockLeash, app.leash);
277 assertEquals(mMockThumbnailLeash, app.startLeash);
278 assertEquals(win.mWinAnimator.mLastClipRect, app.clipRect);
279 assertEquals(false, app.isTranslucent);
Evan Roskyb96326e2019-07-01 09:59:17 -0700280 verify(mMockTransaction).setPosition(
281 mMockLeash, app.startBounds.left, app.startBounds.top);
282 verify(mMockTransaction).setWindowCrop(mMockLeash, 200, 200);
Evan Rosky2289ba12018-11-19 18:28:18 -0800283 verify(mMockTransaction).setPosition(mMockThumbnailLeash, 0, 0);
284
285 finishedCaptor.getValue().onAnimationFinished();
Issei Suzuki8b995df2020-01-08 12:23:04 +0100286 verify(mFinishedCallback).onAnimationFinished(eq(ANIMATION_TYPE_WINDOW_ANIMATION),
287 eq(record.mAdapter));
288 verify(mThumbnailFinishedCallback).onAnimationFinished(
289 eq(ANIMATION_TYPE_WINDOW_ANIMATION), eq(record.mThumbnailAdapter));
Evan Rosky2289ba12018-11-19 18:28:18 -0800290 } finally {
Evan Rosky55bddd82020-01-29 13:07:18 -0800291 mDisplayContent.mChangingContainers.clear();
Evan Rosky2289ba12018-11-19 18:28:18 -0800292 }
293 }
294
Winson Chungd5852192019-09-06 17:20:28 -0700295 @Test
296 public void testWallpaperIncluded_expectTarget() throws Exception {
297 final WindowToken wallpaperWindowToken = new WallpaperWindowToken(mWm, mock(IBinder.class),
298 true, mDisplayContent, true /* ownerCanManageAppTokens */);
299 spyOn(mDisplayContent.mWallpaperController);
300 doReturn(true).when(mDisplayContent.mWallpaperController).isWallpaperVisible();
301 final WindowState win = createWindow(null /* parent */, TYPE_BASE_APPLICATION, "testWin");
Garfield Tane8d84ab2019-10-11 09:49:40 -0700302 mDisplayContent.mOpeningApps.add(win.mActivityRecord);
Winson Chungd5852192019-09-06 17:20:28 -0700303 try {
Garfield Tane8d84ab2019-10-11 09:49:40 -0700304 final AnimationAdapter adapter = mController.createRemoteAnimationRecord(win.mActivityRecord,
lumark2ec19122020-01-23 00:09:04 +0800305 new Point(50, 100), null, new Rect(50, 100, 150, 150), null).mAdapter;
Issei Suzuki8b995df2020-01-08 12:23:04 +0100306 adapter.startAnimation(mMockLeash, mMockTransaction, ANIMATION_TYPE_APP_TRANSITION,
307 mFinishedCallback);
Winson Chungd5852192019-09-06 17:20:28 -0700308 mController.goodToGo();
309 mWm.mAnimator.executeAfterPrepareSurfacesRunnables();
310 final ArgumentCaptor<RemoteAnimationTarget[]> appsCaptor =
311 ArgumentCaptor.forClass(RemoteAnimationTarget[].class);
312 final ArgumentCaptor<RemoteAnimationTarget[]> wallpapersCaptor =
313 ArgumentCaptor.forClass(RemoteAnimationTarget[].class);
314 final ArgumentCaptor<IRemoteAnimationFinishedCallback> finishedCaptor =
315 ArgumentCaptor.forClass(IRemoteAnimationFinishedCallback.class);
316 verify(mMockRunner).onAnimationStart(appsCaptor.capture(), wallpapersCaptor.capture(),
317 finishedCaptor.capture());
318 assertEquals(1, wallpapersCaptor.getValue().length);
319 } finally {
320 mDisplayContent.mOpeningApps.clear();
321 }
322 }
323
324 @Test
325 public void testWallpaperAnimatorCanceled_expectAnimationKeepsRunning() throws Exception {
326 final WindowToken wallpaperWindowToken = new WallpaperWindowToken(mWm, mock(IBinder.class),
327 true, mDisplayContent, true /* ownerCanManageAppTokens */);
328 spyOn(mDisplayContent.mWallpaperController);
329 doReturn(true).when(mDisplayContent.mWallpaperController).isWallpaperVisible();
330 final WindowState win = createWindow(null /* parent */, TYPE_BASE_APPLICATION, "testWin");
Garfield Tane8d84ab2019-10-11 09:49:40 -0700331 mDisplayContent.mOpeningApps.add(win.mActivityRecord);
Winson Chungd5852192019-09-06 17:20:28 -0700332 try {
Garfield Tane8d84ab2019-10-11 09:49:40 -0700333 final AnimationAdapter adapter = mController.createRemoteAnimationRecord(win.mActivityRecord,
lumark2ec19122020-01-23 00:09:04 +0800334 new Point(50, 100), null, new Rect(50, 100, 150, 150), null).mAdapter;
Issei Suzuki8b995df2020-01-08 12:23:04 +0100335 adapter.startAnimation(mMockLeash, mMockTransaction, ANIMATION_TYPE_APP_TRANSITION,
336 mFinishedCallback);
Winson Chungd5852192019-09-06 17:20:28 -0700337 mController.goodToGo();
338 mWm.mAnimator.executeAfterPrepareSurfacesRunnables();
339 final ArgumentCaptor<RemoteAnimationTarget[]> appsCaptor =
340 ArgumentCaptor.forClass(RemoteAnimationTarget[].class);
341 final ArgumentCaptor<RemoteAnimationTarget[]> wallpapersCaptor =
342 ArgumentCaptor.forClass(RemoteAnimationTarget[].class);
343 final ArgumentCaptor<IRemoteAnimationFinishedCallback> finishedCaptor =
344 ArgumentCaptor.forClass(IRemoteAnimationFinishedCallback.class);
345 verify(mMockRunner).onAnimationStart(appsCaptor.capture(), wallpapersCaptor.capture(),
346 finishedCaptor.capture());
347 assertEquals(1, wallpapersCaptor.getValue().length);
348
349 // Cancel the wallpaper window animator and ensure the runner is not canceled
350 wallpaperWindowToken.cancelAnimation();
351 verify(mMockRunner, never()).onAnimationCancelled();
352 } finally {
353 mDisplayContent.mOpeningApps.clear();
354 }
355 }
356
Adrian Roos842e7882018-03-26 17:34:06 +0200357 private static void verifyNoMoreInteractionsExceptAsBinder(IInterface binder) {
358 verify(binder, atLeast(0)).asBinder();
359 verifyNoMoreInteractions(binder);
360 }
Jorim Jaggi33a701a2017-12-01 14:58:18 +0100361}