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
diff --git a/services/core/java/com/android/server/wm/DockedStackDividerController.java b/services/core/java/com/android/server/wm/DockedStackDividerController.java
index 52526e2..5ce4d46 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 @@
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 @@
* 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 @@
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();
}
/**