Loading services/core/java/com/android/server/wm/AnimatingAppWindowTokenRegistry.java +10 −0 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ package com.android.server.wm; import android.util.ArrayMap; import android.util.ArraySet; import java.io.PrintWriter; import java.util.ArrayList; /** Loading Loading @@ -88,4 +89,13 @@ class AnimatingAppWindowTokenRegistry { } mTmpRunnableList.clear(); } void dump(PrintWriter pw, String header, String prefix) { if (!mAnimatingTokens.isEmpty() || !mFinishedTokens.isEmpty()) { pw.print(prefix); pw.println(header); prefix = prefix + " "; pw.print(prefix); pw.print("mAnimatingTokens="); pw.println(mAnimatingTokens); pw.print(prefix); pw.print("mFinishedTokens="); pw.println(mFinishedTokens); } } } services/core/java/com/android/server/wm/RemoteAnimationController.java +7 −0 Original line number Diff line number Diff line Loading @@ -134,11 +134,18 @@ class RemoteAnimationController { private RemoteAnimationTarget[] createAnimations() { final ArrayList<RemoteAnimationTarget> targets = new ArrayList<>(); for (int i = mPendingAnimations.size() - 1; i >= 0; i--) { final RemoteAnimationAdapterWrapper wrapper = mPendingAnimations.get(i); final RemoteAnimationTarget target = mPendingAnimations.get(i).createRemoteAppAnimation(); if (target != null) { targets.add(target); } else { // We can't really start an animation but we still need to make sure to finish the // pending animation that was started by SurfaceAnimator if (wrapper.mCapturedFinishCallback != null) { wrapper.mCapturedFinishCallback.onAnimationFinished(wrapper); } mPendingAnimations.remove(i); } } Loading services/core/java/com/android/server/wm/TaskStack.java +1 −0 Original line number Diff line number Diff line Loading @@ -1387,6 +1387,7 @@ public class TaskStack extends WindowContainer<Task> implements token.dump(pw, " ", dumpAll); } } mAnimatingAppWindowTokenRegistry.dump(pw, "AnimatingApps:", prefix); } @Override Loading services/tests/servicestests/src/com/android/server/wm/RemoteAnimationControllerTest.java +12 −0 Original line number Diff line number Diff line Loading @@ -197,4 +197,16 @@ public class RemoteAnimationControllerTest extends WindowTestsBase { assertEquals(1, appsCaptor.getValue().length); assertEquals(mMockLeash, appsCaptor.getValue()[0].leash); } @Test public void testRemovedBeforeStarted() throws Exception { final WindowState win = createWindow(null /* parent */, TYPE_BASE_APPLICATION, "testWin"); final AnimationAdapter adapter = mController.createAnimationAdapter(win.mAppToken, new Point(50, 100), new Rect(50, 100, 150, 150)); adapter.startAnimation(mMockLeash, mMockTransaction, mFinishedCallback); win.mAppToken.removeImmediately(); mController.goodToGo(); verifyZeroInteractions(mMockRunner); verify(mFinishedCallback).onAnimationFinished(eq(adapter)); } } Loading
services/core/java/com/android/server/wm/AnimatingAppWindowTokenRegistry.java +10 −0 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ package com.android.server.wm; import android.util.ArrayMap; import android.util.ArraySet; import java.io.PrintWriter; import java.util.ArrayList; /** Loading Loading @@ -88,4 +89,13 @@ class AnimatingAppWindowTokenRegistry { } mTmpRunnableList.clear(); } void dump(PrintWriter pw, String header, String prefix) { if (!mAnimatingTokens.isEmpty() || !mFinishedTokens.isEmpty()) { pw.print(prefix); pw.println(header); prefix = prefix + " "; pw.print(prefix); pw.print("mAnimatingTokens="); pw.println(mAnimatingTokens); pw.print(prefix); pw.print("mFinishedTokens="); pw.println(mFinishedTokens); } } }
services/core/java/com/android/server/wm/RemoteAnimationController.java +7 −0 Original line number Diff line number Diff line Loading @@ -134,11 +134,18 @@ class RemoteAnimationController { private RemoteAnimationTarget[] createAnimations() { final ArrayList<RemoteAnimationTarget> targets = new ArrayList<>(); for (int i = mPendingAnimations.size() - 1; i >= 0; i--) { final RemoteAnimationAdapterWrapper wrapper = mPendingAnimations.get(i); final RemoteAnimationTarget target = mPendingAnimations.get(i).createRemoteAppAnimation(); if (target != null) { targets.add(target); } else { // We can't really start an animation but we still need to make sure to finish the // pending animation that was started by SurfaceAnimator if (wrapper.mCapturedFinishCallback != null) { wrapper.mCapturedFinishCallback.onAnimationFinished(wrapper); } mPendingAnimations.remove(i); } } Loading
services/core/java/com/android/server/wm/TaskStack.java +1 −0 Original line number Diff line number Diff line Loading @@ -1387,6 +1387,7 @@ public class TaskStack extends WindowContainer<Task> implements token.dump(pw, " ", dumpAll); } } mAnimatingAppWindowTokenRegistry.dump(pw, "AnimatingApps:", prefix); } @Override Loading
services/tests/servicestests/src/com/android/server/wm/RemoteAnimationControllerTest.java +12 −0 Original line number Diff line number Diff line Loading @@ -197,4 +197,16 @@ public class RemoteAnimationControllerTest extends WindowTestsBase { assertEquals(1, appsCaptor.getValue().length); assertEquals(mMockLeash, appsCaptor.getValue()[0].leash); } @Test public void testRemovedBeforeStarted() throws Exception { final WindowState win = createWindow(null /* parent */, TYPE_BASE_APPLICATION, "testWin"); final AnimationAdapter adapter = mController.createAnimationAdapter(win.mAppToken, new Point(50, 100), new Rect(50, 100, 150, 150)); adapter.startAnimation(mMockLeash, mMockTransaction, mFinishedCallback); win.mAppToken.removeImmediately(); mController.goodToGo(); verifyZeroInteractions(mMockRunner); verify(mFinishedCallback).onAnimationFinished(eq(adapter)); } }