From f93ac2b45591cfd50294dd4c039567f547fe36ba Mon Sep 17 00:00:00 2001 From: Jorim Jaggi Date: Wed, 25 Oct 2017 15:20:24 +0200 Subject: Avoid changing resize dim layer if not needed UPDATE_DOCKED_STACK_DIVIDER gets called fairly frequently. When we switched to having a stack per task, TaskStack.resetAdjustedForIme was called a lot more frequently, leading to a lot of empty surface transaction binder calls, which took very long to execute. We fix this by avoid calling setResizeDimLayer as well as avoid even creating a transaction when the dim layer hasn't changed. Test: go/wm-smoke Test: Resize docked stack, check IME adjust animations Change-Id: I75e64c6e3ac77012388c68c6750a426bd3ed6e21 Fixes: 67747409 Bug: 67780926 --- .../server/wm/DockedStackDividerController.java | 28 ++++++++++++++++++---- .../core/java/com/android/server/wm/TaskStack.java | 5 +++- 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/services/core/java/com/android/server/wm/DockedStackDividerController.java b/services/core/java/com/android/server/wm/DockedStackDividerController.java index 52526e2f7d24..5ce4d46c6b4a 100644 --- a/services/core/java/com/android/server/wm/DockedStackDividerController.java +++ b/services/core/java/com/android/server/wm/DockedStackDividerController.java @@ -137,6 +137,8 @@ public class DockedStackDividerController implements DimLayerUser { float mLastDividerProgress; private final DividerSnapAlgorithm[] mSnapAlgorithmForRotation = new DividerSnapAlgorithm[4]; private boolean mImeHideRequested; + private final Rect mLastDimLayerRect = new Rect(); + private float mLastDimLayerAlpha; DockedStackDividerController(WindowManagerService service, DisplayContent displayContent) { mService = service; @@ -525,7 +527,6 @@ public class DockedStackDividerController implements DimLayerUser { * display in that windowing mode. */ void setResizeDimLayer(boolean visible, int targetWindowingMode, float alpha) { - mService.openSurfaceTransaction(); // TODO: Maybe only allow split-screen windowing modes? final TaskStack stack = targetWindowingMode != WINDOWING_MODE_UNDEFINED ? mDisplayContent.getStack(targetWindowingMode) @@ -535,16 +536,33 @@ public class DockedStackDividerController implements DimLayerUser { if (visibleAndValid) { stack.getDimBounds(mTmpRect); if (mTmpRect.height() > 0 && mTmpRect.width() > 0) { - mDimLayer.setBounds(mTmpRect); - mDimLayer.show(getResizeDimLayer(), alpha, 0 /* duration */); + if (!mLastDimLayerRect.equals(mTmpRect) || mLastDimLayerAlpha != alpha) { + try { + // TODO: This should use the regular animation transaction - here and below + mService.openSurfaceTransaction(); + mDimLayer.setBounds(mTmpRect); + mDimLayer.show(getResizeDimLayer(), alpha, 0 /* duration */); + } finally { + mService.closeSurfaceTransaction(); + } + } + mLastDimLayerRect.set(mTmpRect); + mLastDimLayerAlpha = alpha; } else { visibleAndValid = false; } } if (!visibleAndValid) { - mDimLayer.hide(); + if (mLastDimLayerAlpha != 0f) { + try { + mService.openSurfaceTransaction(); + mDimLayer.hide(); + } finally { + mService.closeSurfaceTransaction(); + } + } + mLastDimLayerAlpha = 0f; } - mService.closeSurfaceTransaction(); } /** diff --git a/services/core/java/com/android/server/wm/TaskStack.java b/services/core/java/com/android/server/wm/TaskStack.java index d170b6f24067..33202749aca1 100644 --- a/services/core/java/com/android/server/wm/TaskStack.java +++ b/services/core/java/com/android/server/wm/TaskStack.java @@ -1008,10 +1008,13 @@ public class TaskStack extends WindowContainer implements DimLayer.DimLaye void resetAdjustedForIme(boolean adjustBoundsNow) { if (adjustBoundsNow) { mImeWin = null; - mAdjustedForIme = false; mImeGoingAway = false; mAdjustImeAmount = 0f; mAdjustDividerAmount = 0f; + if (!mAdjustedForIme) { + return; + } + mAdjustedForIme = false; updateAdjustedBounds(); mService.setResizeDimLayer(false, getWindowingMode(), 1.0f); } else { -- cgit v1.2.3-59-g8ed1b