blob: 553d65824c540cc1048f14f71036749fa6cbfb56 [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
14 * limitations under the License
15 */
16
17package com.android.server.wm;
18
19import static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
20import static org.junit.Assert.assertEquals;
21import static org.mockito.ArgumentMatchers.eq;
Jorim Jaggia19d7812018-02-01 15:03:59 +010022import static org.mockito.Mockito.never;
Jorim Jaggi33a701a2017-12-01 14:58:18 +010023import static org.mockito.Mockito.verify;
Jorim Jaggi93f9fe32018-01-25 15:06:13 +010024import static org.mockito.Mockito.verifyZeroInteractions;
Jorim Jaggi33a701a2017-12-01 14:58:18 +010025
26import android.graphics.Point;
27import android.graphics.Rect;
Jorim Jaggi33a701a2017-12-01 14:58:18 +010028import android.support.test.filters.FlakyTest;
29import android.support.test.filters.SmallTest;
30import android.support.test.runner.AndroidJUnit4;
31import android.view.IRemoteAnimationFinishedCallback;
32import android.view.IRemoteAnimationRunner;
33import android.view.RemoteAnimationAdapter;
34import android.view.RemoteAnimationTarget;
35import android.view.SurfaceControl;
36import android.view.SurfaceControl.Transaction;
37
38import com.android.server.testutils.OffsettableClock;
39import com.android.server.testutils.TestHandler;
40import com.android.server.wm.SurfaceAnimator.OnAnimationFinishedCallback;
41
42import org.junit.Before;
43import org.junit.Test;
44import org.junit.runner.RunWith;
45import org.mockito.ArgumentCaptor;
46import org.mockito.Mock;
47import org.mockito.MockitoAnnotations;
48
49/**
50 * atest FrameworksServicesTests:com.android.server.wm.RemoteAnimationControllerTest
51 */
52@SmallTest
53@FlakyTest(detail = "Promote to presubmit if non-flakyness is established")
54@RunWith(AndroidJUnit4.class)
55public class RemoteAnimationControllerTest extends WindowTestsBase {
56
57 @Mock SurfaceControl mMockLeash;
58 @Mock Transaction mMockTransaction;
59 @Mock OnAnimationFinishedCallback mFinishedCallback;
60 @Mock IRemoteAnimationRunner mMockRunner;
61 private RemoteAnimationAdapter mAdapter;
62 private RemoteAnimationController mController;
63 private final OffsettableClock mClock = new OffsettableClock.Stopped();
64 private TestHandler mHandler;
65
66 @Before
67 public void setUp() throws Exception {
68 super.setUp();
69 MockitoAnnotations.initMocks(this);
70 mAdapter = new RemoteAnimationAdapter(mMockRunner, 100, 50);
Jorim Jaggic4d29f22018-03-22 16:30:56 +010071 mAdapter.setCallingPid(123);
Jorim Jaggi33a701a2017-12-01 14:58:18 +010072 sWm.mH.runWithScissors(() -> {
73 mHandler = new TestHandler(null, mClock);
74 }, 0);
75 mController = new RemoteAnimationController(sWm, mAdapter, mHandler);
76 }
77
78 @Test
79 public void testRun() throws Exception {
80 final WindowState win = createWindow(null /* parent */, TYPE_BASE_APPLICATION, "testWin");
81 sWm.mOpeningApps.add(win.mAppToken);
82 try {
83 final AnimationAdapter adapter = mController.createAnimationAdapter(win.mAppToken,
84 new Point(50, 100), new Rect(50, 100, 150, 150));
85 adapter.startAnimation(mMockLeash, mMockTransaction, mFinishedCallback);
86 mController.goodToGo();
Jorim Jaggic4d29f22018-03-22 16:30:56 +010087 sWm.mAnimator.executeAfterPrepareSurfacesRunnables();
Jorim Jaggi33a701a2017-12-01 14:58:18 +010088 final ArgumentCaptor<RemoteAnimationTarget[]> appsCaptor =
89 ArgumentCaptor.forClass(RemoteAnimationTarget[].class);
90 final ArgumentCaptor<IRemoteAnimationFinishedCallback> finishedCaptor =
91 ArgumentCaptor.forClass(IRemoteAnimationFinishedCallback.class);
92 verify(mMockRunner).onAnimationStart(appsCaptor.capture(), finishedCaptor.capture());
93 assertEquals(1, appsCaptor.getValue().length);
94 final RemoteAnimationTarget app = appsCaptor.getValue()[0];
95 assertEquals(new Point(50, 100), app.position);
96 assertEquals(new Rect(50, 100, 150, 150), app.sourceContainerBounds);
97 assertEquals(win.mAppToken.getPrefixOrderIndex(), app.prefixOrderIndex);
98 assertEquals(win.mAppToken.getTask().mTaskId, app.taskId);
99 assertEquals(mMockLeash, app.leash);
100 assertEquals(win.mWinAnimator.mLastClipRect, app.clipRect);
101 assertEquals(false, app.isTranslucent);
102 verify(mMockTransaction).setLayer(mMockLeash, app.prefixOrderIndex);
103 verify(mMockTransaction).setPosition(mMockLeash, app.position.x, app.position.y);
104 verify(mMockTransaction).setWindowCrop(mMockLeash, new Rect(0, 0, 100, 50));
105
106 finishedCaptor.getValue().onAnimationFinished();
107 verify(mFinishedCallback).onAnimationFinished(eq(adapter));
108 } finally {
109 sWm.mOpeningApps.clear();
110 }
111 }
112
113 @Test
114 public void testCancel() throws Exception {
115 final WindowState win = createWindow(null /* parent */, TYPE_BASE_APPLICATION, "testWin");
116 final AnimationAdapter adapter = mController.createAnimationAdapter(win.mAppToken,
117 new Point(50, 100), new Rect(50, 100, 150, 150));
118 adapter.startAnimation(mMockLeash, mMockTransaction, mFinishedCallback);
119 mController.goodToGo();
120
121 adapter.onAnimationCancelled(mMockLeash);
122 verify(mMockRunner).onAnimationCancelled();
123 }
124
125 @Test
126 public void testTimeout() throws Exception {
127 final WindowState win = createWindow(null /* parent */, TYPE_BASE_APPLICATION, "testWin");
128 final AnimationAdapter adapter = mController.createAnimationAdapter(win.mAppToken,
129 new Point(50, 100), new Rect(50, 100, 150, 150));
130 adapter.startAnimation(mMockLeash, mMockTransaction, mFinishedCallback);
131 mController.goodToGo();
132
133 mClock.fastForward(2500);
134 mHandler.timeAdvance();
135
136 verify(mMockRunner).onAnimationCancelled();
137 verify(mFinishedCallback).onAnimationFinished(eq(adapter));
138 }
Jorim Jaggi93f9fe32018-01-25 15:06:13 +0100139
140 @Test
Jorim Jaggia19d7812018-02-01 15:03:59 +0100141 public void testTimeout_scaled() throws Exception {
142 sWm.setAnimationScale(2, 5.0f);
143 try{
144 final WindowState win = createWindow(null /* parent */, TYPE_BASE_APPLICATION, "testWin");
145 final AnimationAdapter adapter = mController.createAnimationAdapter(win.mAppToken,
146 new Point(50, 100), new Rect(50, 100, 150, 150));
147 adapter.startAnimation(mMockLeash, mMockTransaction, mFinishedCallback);
148 mController.goodToGo();
149
150 mClock.fastForward(2500);
151 mHandler.timeAdvance();
152
153 verify(mMockRunner, never()).onAnimationCancelled();
154
155 mClock.fastForward(10000);
156 mHandler.timeAdvance();
157
158 verify(mMockRunner).onAnimationCancelled();
159 verify(mFinishedCallback).onAnimationFinished(eq(adapter));
160 } finally {
161 sWm.setAnimationScale(2, 1.0f);
162 }
163
164 }
165
166 @Test
Jorim Jaggi93f9fe32018-01-25 15:06:13 +0100167 public void testZeroAnimations() throws Exception {
168 mController.goodToGo();
169 verifyZeroInteractions(mMockRunner);
170 }
Jorim Jaggic4d29f22018-03-22 16:30:56 +0100171
172 @Test
173 public void testNotReallyStarted() throws Exception {
174 final WindowState win = createWindow(null /* parent */, TYPE_BASE_APPLICATION, "testWin");
175 mController.createAnimationAdapter(win.mAppToken,
176 new Point(50, 100), new Rect(50, 100, 150, 150));
177 mController.goodToGo();
178 verifyZeroInteractions(mMockRunner);
179 }
180
181 @Test
182 public void testOneNotStarted() throws Exception {
183 final WindowState win1 = createWindow(null /* parent */, TYPE_BASE_APPLICATION, "testWin1");
184 final WindowState win2 = createWindow(null /* parent */, TYPE_BASE_APPLICATION, "testWin2");
185 mController.createAnimationAdapter(win1.mAppToken,
186 new Point(50, 100), new Rect(50, 100, 150, 150));
187 final AnimationAdapter adapter = mController.createAnimationAdapter(win2.mAppToken,
188 new Point(50, 100), new Rect(50, 100, 150, 150));
189 adapter.startAnimation(mMockLeash, mMockTransaction, mFinishedCallback);
190 mController.goodToGo();
191 sWm.mAnimator.executeAfterPrepareSurfacesRunnables();
192 final ArgumentCaptor<RemoteAnimationTarget[]> appsCaptor =
193 ArgumentCaptor.forClass(RemoteAnimationTarget[].class);
194 final ArgumentCaptor<IRemoteAnimationFinishedCallback> finishedCaptor =
195 ArgumentCaptor.forClass(IRemoteAnimationFinishedCallback.class);
196 verify(mMockRunner).onAnimationStart(appsCaptor.capture(), finishedCaptor.capture());
197 assertEquals(1, appsCaptor.getValue().length);
198 assertEquals(mMockLeash, appsCaptor.getValue()[0].leash);
199 }
Jorim Jaggib8a9cbe2018-03-27 18:02:18 +0200200
201 @Test
202 public void testRemovedBeforeStarted() throws Exception {
203 final WindowState win = createWindow(null /* parent */, TYPE_BASE_APPLICATION, "testWin");
204 final AnimationAdapter adapter = mController.createAnimationAdapter(win.mAppToken,
205 new Point(50, 100), new Rect(50, 100, 150, 150));
206 adapter.startAnimation(mMockLeash, mMockTransaction, mFinishedCallback);
207 win.mAppToken.removeImmediately();
208 mController.goodToGo();
209 verifyZeroInteractions(mMockRunner);
210 verify(mFinishedCallback).onAnimationFinished(eq(adapter));
211 }
Jorim Jaggi33a701a2017-12-01 14:58:18 +0100212}