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
This commit is contained in:
Evan Rosky
2022-06-27 15:59:11 -07:00
parent 0d61ab9e5d
commit 513bde42a0
2 changed files with 9 additions and 3 deletions

View File

@@ -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();
}
});

View File

@@ -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) {