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..7fc8310ed303d 100644 --- a/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/TaskFragmentAnimationRunner.java +++ b/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/TaskFragmentAnimationRunner.java @@ -214,7 +214,8 @@ class TaskFragmentAnimationRunner extends IRemoteAnimationRunner.Stub { openingWholeScreenBounds.union(target.screenSpaceBounds); } 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/libs/WindowManager/Shell/src/com/android/wm/shell/activityembedding/ActivityEmbeddingAnimationRunner.java b/libs/WindowManager/Shell/src/com/android/wm/shell/activityembedding/ActivityEmbeddingAnimationRunner.java index 1df6ecda78c3e..1e3d79567d1ef 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/activityembedding/ActivityEmbeddingAnimationRunner.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/activityembedding/ActivityEmbeddingAnimationRunner.java @@ -224,7 +224,7 @@ class ActivityEmbeddingAnimationRunner { openingWholeScreenBounds.union(change.getEndAbsBounds()); } else { closingChanges.add(change); - closingWholeScreenBounds.union(change.getEndAbsBounds()); + closingWholeScreenBounds.union(change.getStartAbsBounds()); } } diff --git a/services/core/java/com/android/server/wm/TaskFragment.java b/services/core/java/com/android/server/wm/TaskFragment.java index 2ddb307ea430b..ae52732039040 100644 --- a/services/core/java/com/android/server/wm/TaskFragment.java +++ b/services/core/java/com/android/server/wm/TaskFragment.java @@ -2518,13 +2518,18 @@ class TaskFragment extends WindowContainer { return task != null && !task.isDragResizing() && super.canStartChangeTransition(); } - /** 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 d42a62971395d..520d06d53c0c7 100644 --- a/services/core/java/com/android/server/wm/WindowContainer.java +++ b/services/core/java/com/android/server/wm/WindowContainer.java @@ -1336,14 +1336,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) {