summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Wei Sheng Shih <wilsonshih@google.com> 2019-04-17 01:04:17 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2019-04-17 01:04:17 +0000
commit9ffed9ed2f8c00bb0ac91b69001f5baef041ceed (patch)
tree166da28b88db005089956116ff3ec193cd7bb131
parent111ad6a13e356782e2dcf83c417317d214b69b6e (diff)
parent4dd07128770768223b0025f4cdc7559cdc71707f (diff)
Merge "Fix pinned stack destination been overwrite by obsolete animator." into qt-dev
-rw-r--r--services/core/java/com/android/server/wm/BoundsAnimationController.java12
-rw-r--r--services/core/java/com/android/server/wm/TaskStack.java13
2 files changed, 23 insertions, 2 deletions
diff --git a/services/core/java/com/android/server/wm/BoundsAnimationController.java b/services/core/java/com/android/server/wm/BoundsAnimationController.java
index c1d872f23f0f..b5e706710823 100644
--- a/services/core/java/com/android/server/wm/BoundsAnimationController.java
+++ b/services/core/java/com/android/server/wm/BoundsAnimationController.java
@@ -435,6 +435,18 @@ public class BoundsAnimationController {
moveFromFullscreen, moveToFullscreen, animationType);
}
+ /**
+ * Cancel existing animation if the destination was modified.
+ */
+ void cancel(final BoundsAnimationTarget target) {
+ final BoundsAnimator existing = mRunningAnimations.get(target);
+ if (existing != null) {
+ // Cancel animation. Since its already started, send animation end to client.
+ if (DEBUG) Slog.d(TAG, "cancel: mTarget= " + target);
+ existing.cancelAndCallAnimationEnd();
+ }
+ }
+
@VisibleForTesting
BoundsAnimator animateBoundsImpl(final BoundsAnimationTarget target, Rect from, Rect to,
int animationDuration, @SchedulePipModeChangedState int schedulePipModeChangedState,
diff --git a/services/core/java/com/android/server/wm/TaskStack.java b/services/core/java/com/android/server/wm/TaskStack.java
index bdb4d0474865..7515b3fa1249 100644
--- a/services/core/java/com/android/server/wm/TaskStack.java
+++ b/services/core/java/com/android/server/wm/TaskStack.java
@@ -388,7 +388,9 @@ public class TaskStack extends WindowContainer<Task> implements
* @return true if bounds were updated to some non-empty value.
*/
boolean calculatePinnedBoundsForConfigChange(Rect inOutBounds) {
+ boolean animating = false;
if ((mBoundsAnimatingRequested || mBoundsAnimating) && !mBoundsAnimationTarget.isEmpty()) {
+ animating = true;
getFinalAnimationBounds(mTmpRect2);
} else {
mTmpRect2.set(inOutBounds);
@@ -398,6 +400,13 @@ public class TaskStack extends WindowContainer<Task> implements
if (updated) {
inOutBounds.set(mTmpRect3);
+ // The final boundary is updated while there is an existing boundary animation. Let's
+ // cancel this animation to prevent the obsolete animation overwritten updated bounds.
+ if (animating && !inOutBounds.equals(mBoundsAnimationTarget)) {
+ final DisplayContent displayContent = getDisplayContent();
+ displayContent.mBoundsAnimationController.getHandler().post(() ->
+ displayContent.mBoundsAnimationController.cancel(this));
+ }
// Once we've set the bounds based on the rotation of the old bounds in the new
// orientation, clear the animation target bounds since they are obsolete, and
// cancel any currently running animations
@@ -1585,7 +1594,6 @@ public class TaskStack extends WindowContainer<Task> implements
mBoundsAnimatingRequested = false;
mBoundsAnimating = true;
- mCancelCurrentBoundsAnimation = false;
mAnimationType = animationType;
// If we are changing UI mode, as in the PiP to fullscreen
@@ -1645,7 +1653,7 @@ public class TaskStack extends WindowContainer<Task> implements
mBoundsAnimationTarget, false /* forceUpdate */);
}
- if (finalStackSize != null) {
+ if (finalStackSize != null && !mCancelCurrentBoundsAnimation) {
setPinnedStackSize(finalStackSize, null);
} else {
// We have been canceled, so the final stack size is null, still run the
@@ -1758,6 +1766,7 @@ public class TaskStack extends WindowContainer<Task> implements
}
final @BoundsAnimationController.AnimationType int animationType = intendedAnimationType;
+ mCancelCurrentBoundsAnimation = false;
displayContent.mBoundsAnimationController.getHandler().post(() -> {
displayContent.mBoundsAnimationController.animateBounds(this, fromBounds,
finalToBounds, animationDuration, finalSchedulePipModeChangedState,