From 513bde42a06e3b2c23deb1d99182575bfdb6b92b Mon Sep 17 00:00:00 2001 From: Evan Rosky Date: Mon, 27 Jun 2022 15:59:11 -0700 Subject: [PATCH] Fix issues with early-finish There were a couple of situations where both cancel and finish collided. In those cases make sure only one is called. Somewhat related, launcher actually continues to use leashes even after calling the finishCallback. Since we make leashes for launcher anyways, just use launcher's existing leash clean-up logic. Bug: 235616350 Test: run/monitor wm presubmits. Try launching and closing apps in rapid succession. Change-Id: I7553ba9f9bbad052632a4d8d5a7225ab6c3dbce5 --- .../wm/shell/transition/DefaultTransitionHandler.java | 6 ++++++ .../shared/system/RemoteAnimationAdapterCompat.java | 6 +++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultTransitionHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultTransitionHandler.java index 05e5b8e66a00d..dcd6277966dd2 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultTransitionHandler.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultTransitionHandler.java @@ -866,13 +866,19 @@ public class DefaultTransitionHandler implements Transitions.TransitionHandler { }); }; va.addListener(new AnimatorListenerAdapter() { + private boolean mFinished = false; + @Override public void onAnimationEnd(Animator animation) { + if (mFinished) return; + mFinished = true; finisher.run(); } @Override public void onAnimationCancel(Animator animation) { + if (mFinished) return; + mFinished = true; finisher.run(); } }); diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteAnimationAdapterCompat.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteAnimationAdapterCompat.java index 302ba8444f051..6561e41550492 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteAnimationAdapterCompat.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteAnimationAdapterCompat.java @@ -220,9 +220,9 @@ public class RemoteAnimationAdapterCompat { for (int i = info.getChanges().size() - 1; i >= 0; --i) { info.getChanges().get(i).getLeash().release(); } - for (int i = leashMap.size() - 1; i >= 0; --i) { - leashMap.valueAt(i).release(); - } + // Don't release here since launcher might still be using them. Instead + // let launcher release them (eg. via RemoteAnimationTargets) + leashMap.clear(); try { finishCallback.onTransitionFinished(null /* wct */, finishTransaction); } catch (RemoteException e) {