OSDN Git Service

Avoid changing resize dim layer if not needed
authorJorim Jaggi <jjaggi@google.com>
Wed, 25 Oct 2017 13:20:24 +0000 (15:20 +0200)
committerJorim Jaggi <jjaggi@google.com>
Wed, 25 Oct 2017 13:20:24 +0000 (15:20 +0200)
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

services/core/java/com/android/server/wm/DockedStackDividerController.java
services/core/java/com/android/server/wm/TaskStack.java

index 52526e2..5ce4d46 100644 (file)
@@ -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();
     }
 
     /**
index d170b6f..3320274 100644 (file)
@@ -1008,10 +1008,13 @@ public class TaskStack extends WindowContainer<Task> 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 {