diff --git a/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/TaskFragmentAnimationRunner.java b/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/TaskFragmentAnimationRunner.java index dcc12ac075891..b917ac80256c5 100644 --- a/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/TaskFragmentAnimationRunner.java +++ b/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/TaskFragmentAnimationRunner.java @@ -215,6 +215,8 @@ class TaskFragmentAnimationRunner extends IRemoteAnimationRunner.Stub { } else { closingTargets.add(target); closingWholeScreenBounds.union(target.screenSpaceBounds); + // Union the start bounds since this may be the ClosingChanging animation. + closingWholeScreenBounds.union(target.startBounds); } } diff --git a/services/core/java/com/android/server/wm/TaskFragment.java b/services/core/java/com/android/server/wm/TaskFragment.java index fe02158f07c8c..d947168872478 100644 --- a/services/core/java/com/android/server/wm/TaskFragment.java +++ b/services/core/java/com/android/server/wm/TaskFragment.java @@ -2501,13 +2501,18 @@ class TaskFragment extends WindowContainer { } } - /** Records the starting bounds of the closing organized TaskFragment. */ - void setClosingChangingStartBoundsIfNeeded() { + /** + * Returns {@code true} if the starting bounds of the closing organized TaskFragment is + * recorded. Otherwise, return {@code false}. + */ + boolean setClosingChangingStartBoundsIfNeeded() { if (isOrganizedTaskFragment() && mDisplayContent != null && mDisplayContent.mChangingContainers.remove(this)) { mDisplayContent.mClosingChangingContainers.put( this, new Rect(mSurfaceFreezer.mFreezeBounds)); + return true; } + return false; } @Override diff --git a/services/core/java/com/android/server/wm/WindowContainer.java b/services/core/java/com/android/server/wm/WindowContainer.java index 7ff92afc9d294..02d3af6da326e 100644 --- a/services/core/java/com/android/server/wm/WindowContainer.java +++ b/services/core/java/com/android/server/wm/WindowContainer.java @@ -1299,14 +1299,18 @@ class WindowContainer extends ConfigurationContainer< // If we are losing visibility, then a snapshot isn't necessary and we are no-longer // part of a change transition. if (!visible) { + boolean skipUnfreeze = false; if (asTaskFragment() != null) { // If the organized TaskFragment is closing while resizing, we want to keep track of // its starting bounds to make sure the animation starts at the correct position. // This should be called before unfreeze() because we record the starting bounds // in SurfaceFreezer. - asTaskFragment().setClosingChangingStartBoundsIfNeeded(); + skipUnfreeze = asTaskFragment().setClosingChangingStartBoundsIfNeeded(); + } + + if (!skipUnfreeze) { + mSurfaceFreezer.unfreeze(getSyncTransaction()); } - mSurfaceFreezer.unfreeze(getSyncTransaction()); } WindowContainer parent = getParent(); if (parent != null) {