From 89cc30e994b924124f7e8f725a35c337bf97e58e Mon Sep 17 00:00:00 2001 From: chaviw Date: Tue, 19 May 2020 10:36:27 -0700 Subject: [PATCH] Added getSyncTransaction Create a getSyncTransaction that will return the blastSyncTransaction if in a sync or the regular pendingTransaction if not. This is to separate situations where we want to directly call getPendingTransactions so the transaction is not synced with the client request. One example is WM or remote animations starting. We don't want the animation setup to be synced. If it syncs with the client request, the initial animation setup will be delayed, but the animation will still start running since it thinks everything has been set up properly. In those cases, continue to use getPendingTransaction instead of getSyncTransaction Test: Animations run during applySyncTransaction Bug: 153579514 Change-Id: Ied21f3d2addb19e7bb814379567de076d429007f --- .../com/android/server/wm/ActivityRecord.java | 4 +-- .../com/android/server/wm/ActivityStack.java | 2 +- .../java/com/android/server/wm/Dimmer.java | 2 +- .../com/android/server/wm/DisplayArea.java | 2 +- .../core/java/com/android/server/wm/Task.java | 24 +++----------- .../android/server/wm/TaskDisplayArea.java | 2 +- .../android/server/wm/WindowContainer.java | 31 +++++++++++++------ .../com/android/server/wm/WindowState.java | 4 +-- 8 files changed, 34 insertions(+), 37 deletions(-) diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index 982785e6339e4..5ef9d9e627ffc 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -5985,9 +5985,9 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A if (mSurfaceControl != null) { if (show && !mLastSurfaceShowing) { - getPendingTransaction().show(mSurfaceControl); + getSyncTransaction().show(mSurfaceControl); } else if (!show && mLastSurfaceShowing) { - getPendingTransaction().hide(mSurfaceControl); + getSyncTransaction().hide(mSurfaceControl); } } if (mThumbnail != null) { diff --git a/services/core/java/com/android/server/wm/ActivityStack.java b/services/core/java/com/android/server/wm/ActivityStack.java index 361df1444e87b..d0f6465a6bc12 100644 --- a/services/core/java/com/android/server/wm/ActivityStack.java +++ b/services/core/java/com/android/server/wm/ActivityStack.java @@ -3213,7 +3213,7 @@ class ActivityStack extends Task { } private void updateSurfaceBounds() { - updateSurfaceSize(getPendingTransaction()); + updateSurfaceSize(getSyncTransaction()); updateSurfacePosition(); scheduleAnimation(); } diff --git a/services/core/java/com/android/server/wm/Dimmer.java b/services/core/java/com/android/server/wm/Dimmer.java index 5efc9241a494b..fdcc3f4d15109 100644 --- a/services/core/java/com/android/server/wm/Dimmer.java +++ b/services/core/java/com/android/server/wm/Dimmer.java @@ -53,7 +53,7 @@ class Dimmer { @Override public SurfaceControl.Transaction getPendingTransaction() { - return mHost.getPendingTransaction(); + return mHost.getSyncTransaction(); } @Override diff --git a/services/core/java/com/android/server/wm/DisplayArea.java b/services/core/java/com/android/server/wm/DisplayArea.java index 8260cb31acda0..b2fab9ae98c5d 100644 --- a/services/core/java/com/android/server/wm/DisplayArea.java +++ b/services/core/java/com/android/server/wm/DisplayArea.java @@ -290,7 +290,7 @@ public class DisplayArea extends WindowContainer { mDimmer.resetDimStates(); } - if (mDimmer.updateDims(getPendingTransaction(), mTmpDimBoundsRect)) { + if (mDimmer.updateDims(getSyncTransaction(), mTmpDimBoundsRect)) { scheduleAnimation(); } } diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index bf7ec910f1975..7efa87c43754a 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -1923,7 +1923,7 @@ class Task extends WindowContainer { super.onConfigurationChanged(newParentConfig); // Only need to update surface size here since the super method will handle updating // surface position. - updateSurfaceSize(getPendingTransaction()); + updateSurfaceSize(getSyncTransaction()); if (wasInPictureInPicture != inPinnedWindowingMode()) { mStackSupervisor.scheduleUpdatePictureInPictureModeIfNeeded(this, getStack()); @@ -3475,20 +3475,6 @@ class Task extends WindowContainer { return mDimmer; } - void dim(float alpha) { - mDimmer.dimAbove(getPendingTransaction(), alpha); - scheduleAnimation(); - } - - void stopDimming() { - mDimmer.stopDim(getPendingTransaction()); - scheduleAnimation(); - } - - boolean isTaskForUser(int userId) { - return mUserId == userId; - } - @Override void prepareSurfaces() { mDimmer.resetDimStates(); @@ -3504,9 +3490,9 @@ class Task extends WindowContainer { mTmpDimBoundsRect.offsetTo(0, 0); } - updateShadowsRadius(isFocused(), getPendingTransaction()); + updateShadowsRadius(isFocused(), getSyncTransaction()); - if (mDimmer.updateDims(getPendingTransaction(), mTmpDimBoundsRect)) { + if (mDimmer.updateDims(getSyncTransaction(), mTmpDimBoundsRect)) { scheduleAnimation(); } } @@ -4317,7 +4303,7 @@ class Task extends WindowContainer { // skip this for tasks created by the organizer because they can synchronously update // the leash before new children are added to the task. if (!mCreatedByOrganizer && mTaskOrganizer != null && !prevHasBeenVisible) { - getPendingTransaction().hide(getSurfaceControl()); + getSyncTransaction().hide(getSurfaceControl()); commitPendingTransaction(); } @@ -4500,7 +4486,7 @@ class Task extends WindowContainer { * @param hasFocus */ void onWindowFocusChanged(boolean hasFocus) { - updateShadowsRadius(hasFocus, getPendingTransaction()); + updateShadowsRadius(hasFocus, getSyncTransaction()); } void onPictureInPictureParamsChanged() { diff --git a/services/core/java/com/android/server/wm/TaskDisplayArea.java b/services/core/java/com/android/server/wm/TaskDisplayArea.java index 6dde5b0d48798..22054db20bbde 100644 --- a/services/core/java/com/android/server/wm/TaskDisplayArea.java +++ b/services/core/java/com/android/server/wm/TaskDisplayArea.java @@ -646,7 +646,7 @@ final class TaskDisplayArea extends DisplayArea { mSplitScreenDividerAnchor = makeChildSurface(null) .setName("splitScreenDividerAnchor") .build(); - getPendingTransaction() + getSyncTransaction() .show(mAppAnimationLayer) .show(mBoostedAppAnimationLayer) .show(mHomeAppAnimationLayer) diff --git a/services/core/java/com/android/server/wm/WindowContainer.java b/services/core/java/com/android/server/wm/WindowContainer.java index 3fe8229e2ec2c..1e4f309083a2c 100644 --- a/services/core/java/com/android/server/wm/WindowContainer.java +++ b/services/core/java/com/android/server/wm/WindowContainer.java @@ -386,7 +386,7 @@ class WindowContainer extends ConfigurationContainer< // surface animator such that hierarchy is preserved when animating, i.e. // mSurfaceControl stays attached to the leash and we just reparent the leash to the // new parent. - reparentSurfaceControl(getPendingTransaction(), mParent.mSurfaceControl); + reparentSurfaceControl(getSyncTransaction(), mParent.mSurfaceControl); } if (callback != null) { @@ -404,8 +404,8 @@ class WindowContainer extends ConfigurationContainer< private void setInitialSurfaceControlProperties(SurfaceControl surfaceControl) { setSurfaceControl(surfaceControl); - getPendingTransaction().show(mSurfaceControl); - onSurfaceShown(getPendingTransaction()); + getSyncTransaction().show(mSurfaceControl); + onSurfaceShown(getSyncTransaction()); updateSurfacePosition(); } @@ -575,7 +575,7 @@ class WindowContainer extends ConfigurationContainer< void removeImmediately() { final DisplayContent dc = getDisplayContent(); if (dc != null) { - mSurfaceFreezer.unfreeze(getPendingTransaction()); + mSurfaceFreezer.unfreeze(getSyncTransaction()); dc.mChangingContainers.remove(this); } while (!mChildren.isEmpty()) { @@ -590,7 +590,7 @@ class WindowContainer extends ConfigurationContainer< } if (mSurfaceControl != null) { - getPendingTransaction().remove(mSurfaceControl); + getSyncTransaction().remove(mSurfaceControl); setSurfaceControl(null); mLastSurfacePosition.set(0, 0); scheduleAnimation(); @@ -1002,7 +1002,7 @@ class WindowContainer extends ConfigurationContainer< void onChildVisibilityRequested(boolean visible) { // If we are changing visibility, then a snapshot isn't necessary and we are no-longer // part of a change transition. - mSurfaceFreezer.unfreeze(getPendingTransaction()); + mSurfaceFreezer.unfreeze(getSyncTransaction()); if (mDisplayContent != null) { mDisplayContent.mChangingContainers.remove(this); } @@ -1901,7 +1901,7 @@ class WindowContainer extends ConfigurationContainer< } void assignChildLayers() { - assignChildLayers(getPendingTransaction()); + assignChildLayers(getSyncTransaction()); scheduleAnimation(); } @@ -2050,12 +2050,23 @@ class WindowContainer extends ConfigurationContainer< return mSurfaceControl; } - @Override - public Transaction getPendingTransaction() { + /** + * Use this method instead of {@link #getPendingTransaction()} if the Transaction should be + * synchronized with the client. + * + * @return {@link #mBLASTSyncTransaction} if available. Otherwise, returns + * {@link #getPendingTransaction()} + */ + public Transaction getSyncTransaction() { if (mUsingBLASTSyncTransaction) { return mBLASTSyncTransaction; } + return getPendingTransaction(); + } + + @Override + public Transaction getPendingTransaction() { final DisplayContent displayContent = getDisplayContent(); if (displayContent != null && displayContent != this) { return displayContent.getPendingTransaction(); @@ -2465,7 +2476,7 @@ class WindowContainer extends ConfigurationContainer< } final void updateSurfacePosition() { - updateSurfacePosition(getPendingTransaction()); + updateSurfacePosition(getSyncTransaction()); } void updateSurfacePosition(Transaction t) { diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index 4f1893eb6c13c..ae21174583d23 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -5240,7 +5240,7 @@ class WindowState extends WindowContainer implements WindowManagerP private void applyDims(Dimmer dimmer) { if (!mAnimatingExit && mAppDied) { mIsDimming = true; - dimmer.dimAbove(getPendingTransaction(), this, DEFAULT_DIM_AMOUNT_DEAD_WINDOW); + dimmer.dimAbove(getSyncTransaction(), this, DEFAULT_DIM_AMOUNT_DEAD_WINDOW); } else if ((mAttrs.flags & FLAG_DIM_BEHIND) != 0 && isVisibleNow() && !mHidden) { // Only show a dim behind when the following is satisfied: // 1. The window has the flag FLAG_DIM_BEHIND @@ -5248,7 +5248,7 @@ class WindowState extends WindowContainer implements WindowManagerP // 3. The WS is considered visible according to the isVisible() method // 4. The WS is not hidden. mIsDimming = true; - dimmer.dimBelow(getPendingTransaction(), this, mAttrs.dimAmount); + dimmer.dimBelow(getSyncTransaction(), this, mAttrs.dimAmount); } }