Fixed some issues with fullscreen dimming

- Always dim home stack and task fullscreen. The home stack could be
in split-screen mode, but we still want to dim dialogs that are
associated with the stack or task in fullscreen. The dialogs are not
really activities, but they are associated with the home stack for
things like dimming. Don't ask me why...
- Update the fullscreen dim layer bounds anytime the dim layer is
adjusted so we always have up-to-date bounds after rotation.

Bug: 28575624
Change-Id: I805c771153a2d25fb199bd9987bbf78a5967f6b9
diff --git a/services/core/java/com/android/server/wm/DimLayer.java b/services/core/java/com/android/server/wm/DimLayer.java
index 95be233..052b2f5 100644
--- a/services/core/java/com/android/server/wm/DimLayer.java
+++ b/services/core/java/com/android/server/wm/DimLayer.java
@@ -73,8 +73,8 @@
 
     /** Interface implemented by users of the dim layer */
     interface DimLayerUser {
-        /** Returns true if the user of the dim layer is fullscreen. */
-        boolean isFullscreen();
+        /** Returns true if the  dim should be fullscreen. */
+        boolean dimFullscreen();
         /** Returns the display info. of the dim layer user. */
         DisplayInfo getDisplayInfo();
         /** Gets the bounds of the dim layer user. */
@@ -188,33 +188,40 @@
      * NOTE: Must be called with Surface transaction open.
      */
     private void adjustBounds() {
-        final int dw, dh;
-        final float xPos, yPos;
-        if (!mUser.isFullscreen()) {
-            dw = mBounds.width();
-            dh = mBounds.height();
-            xPos = mBounds.left;
-            yPos = mBounds.top;
-        } else {
-            // Set surface size to screen size.
-            final DisplayInfo info = mUser.getDisplayInfo();
-            // Multiply by 1.5 so that rotating a frozen surface that includes this does not expose
-            // a corner.
-            dw = (int) (info.logicalWidth * 1.5);
-            dh = (int) (info.logicalHeight * 1.5);
-            // back off position so 1/4 of Surface is before and 1/4 is after.
-            xPos = -1 * dw / 6;
-            yPos = -1 * dh / 6;
+        if (mUser.dimFullscreen()) {
+            getBoundsForFullscreen(mBounds);
         }
 
         if (mDimSurface != null) {
-            mDimSurface.setPosition(xPos, yPos);
-            mDimSurface.setSize(dw, dh);
+            mDimSurface.setPosition(mBounds.left, mBounds.top);
+            mDimSurface.setSize(mBounds.width(), mBounds.height());
+            if (DEBUG_DIM_LAYER) Slog.v(TAG,
+                    "adjustBounds user=" + mUser.toShortString() + " mBounds=" + mBounds);
         }
 
         mLastBounds.set(mBounds);
     }
 
+    private void getBoundsForFullscreen(Rect outBounds) {
+        final int dw, dh;
+        final float xPos, yPos;
+        // Set surface size to screen size.
+        final DisplayInfo info = mUser.getDisplayInfo();
+        // Multiply by 1.5 so that rotating a frozen surface that includes this does not expose
+        // a corner.
+        dw = (int) (info.logicalWidth * 1.5);
+        dh = (int) (info.logicalHeight * 1.5);
+        // back off position so 1/4 of Surface is before and 1/4 is after.
+        xPos = -1 * dw / 6;
+        yPos = -1 * dh / 6;
+        outBounds.set((int) xPos, (int) yPos, (int) xPos + dw, (int) yPos + dh);
+    }
+
+    void setBoundsForFullscreen() {
+        getBoundsForFullscreen(mBounds);
+        setBounds(mBounds);
+    }
+
     /** @param bounds The new bounds to set */
     void setBounds(Rect bounds) {
         mBounds.set(bounds);
diff --git a/services/core/java/com/android/server/wm/DimLayerController.java b/services/core/java/com/android/server/wm/DimLayerController.java
index 52146c2..2b9879e 100644
--- a/services/core/java/com/android/server/wm/DimLayerController.java
+++ b/services/core/java/com/android/server/wm/DimLayerController.java
@@ -48,14 +48,15 @@
 
     /** Updates the dim layer bounds, recreating it if needed. */
     void updateDimLayer(DimLayer.DimLayerUser dimLayerUser) {
-        DimLayerState state = getOrCreateDimLayerState(dimLayerUser);
+        final DimLayerState state = getOrCreateDimLayerState(dimLayerUser);
         final boolean previousFullscreen = state.dimLayer != null
                 && state.dimLayer == mSharedFullScreenDimLayer;
         DimLayer newDimLayer;
         final int displayId = mDisplayContent.getDisplayId();
-        if (dimLayerUser.isFullscreen()) {
-            if (previousFullscreen) {
-                // Nothing to do here...
+        if (dimLayerUser.dimFullscreen()) {
+            if (previousFullscreen && mSharedFullScreenDimLayer != null) {
+                // Update the bounds for fullscreen in case of rotation.
+                mSharedFullScreenDimLayer.setBoundsForFullscreen();
                 return;
             }
             // Use shared fullscreen dim layer
@@ -146,7 +147,7 @@
                 || !state.animator.getShown()
                 || state.animator.mAnimLayer <= newWinAnimator.mAnimLayer)) {
             state.animator = newWinAnimator;
-            if (state.animator.mWin.mAppToken == null && !dimLayerUser.isFullscreen()) {
+            if (state.animator.mWin.mAppToken == null && !dimLayerUser.dimFullscreen()) {
                 // Dim should cover the entire screen for system windows.
                 mDisplayContent.getLogicalDisplayRect(mTmpBounds);
             } else {
@@ -190,11 +191,11 @@
         for (int i = mState.size() - 1; i >= 0; i--) {
             DimLayer.DimLayerUser user = mState.keyAt(i);
             DimLayerState state = mState.valueAt(i);
-            // We have to check that we are acutally the shared fullscreen layer
+            // We have to check that we are actually the shared fullscreen layer
             // for this path. If we began as non fullscreen and became fullscreen
             // (e.g. Docked stack closing), then we may not be the shared layer
             // and we have to make sure we always animate the layer.
-            if (user.isFullscreen() && state.dimLayer == mSharedFullScreenDimLayer) {
+            if (user.dimFullscreen() && state.dimLayer == mSharedFullScreenDimLayer) {
                 fullScreen = i;
                 if (mState.valueAt(i).continueDimming) {
                     fullScreenAndDimming = i;
@@ -337,15 +338,18 @@
 
     void dump(String prefix, PrintWriter pw) {
         pw.println(prefix + "DimLayerController");
-        for (int i = 0, n = mState.size(); i < n; i++) {
-            pw.println(prefix + "  " + mState.keyAt(i).toShortString());
-            pw.print(prefix + "    ");
-            DimLayerState state = mState.valueAt(i);
-            pw.print("dimLayer=" + (state.dimLayer == mSharedFullScreenDimLayer ? "shared" :
-                    state.dimLayer));
-            pw.print(", animator=" + state.animator);
-            pw.println(", continueDimming=" + state.continueDimming + "}");
+        final String doubleSpace = "  ";
+        final String prefixPlusDoubleSpace = prefix + doubleSpace;
 
+        for (int i = 0, n = mState.size(); i < n; i++) {
+            pw.println(prefixPlusDoubleSpace + mState.keyAt(i).toShortString());
+            DimLayerState state = mState.valueAt(i);
+            pw.println(prefixPlusDoubleSpace + doubleSpace + "dimLayer="
+                    + (state.dimLayer == mSharedFullScreenDimLayer ? "shared" : state.dimLayer)
+                    + ", animator=" + state.animator + ", continueDimming=" + state.continueDimming);
+            if (state.dimLayer != null) {
+                state.dimLayer.printTo(prefixPlusDoubleSpace + doubleSpace, pw);
+            }
         }
     }
 }
diff --git a/services/core/java/com/android/server/wm/DockedStackDividerController.java b/services/core/java/com/android/server/wm/DockedStackDividerController.java
index 6e1ff06..298a0d8 100644
--- a/services/core/java/com/android/server/wm/DockedStackDividerController.java
+++ b/services/core/java/com/android/server/wm/DockedStackDividerController.java
@@ -758,7 +758,7 @@
     }
 
     @Override
-    public boolean isFullscreen() {
+    public boolean dimFullscreen() {
         return false;
     }
 
diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java
index efabe31..8f4197f 100644
--- a/services/core/java/com/android/server/wm/Task.java
+++ b/services/core/java/com/android/server/wm/Task.java
@@ -750,7 +750,11 @@
     }
 
     @Override
-    public boolean isFullscreen() {
+    public boolean dimFullscreen() {
+        return isHomeTask() || isFullscreen();
+    }
+
+    boolean isFullscreen() {
         if (useCurrentBounds()) {
             return mFullscreen;
         }
diff --git a/services/core/java/com/android/server/wm/TaskPositioner.java b/services/core/java/com/android/server/wm/TaskPositioner.java
index 222087d..e823972 100644
--- a/services/core/java/com/android/server/wm/TaskPositioner.java
+++ b/services/core/java/com/android/server/wm/TaskPositioner.java
@@ -515,7 +515,11 @@
     }
 
     @Override /** {@link DimLayer.DimLayerUser} */
-    public boolean isFullscreen() {
+    public boolean dimFullscreen() {
+        return isFullscreen();
+    }
+
+    boolean isFullscreen() {
         return false;
     }
 
diff --git a/services/core/java/com/android/server/wm/TaskStack.java b/services/core/java/com/android/server/wm/TaskStack.java
index 58468f6..f25ef52 100644
--- a/services/core/java/com/android/server/wm/TaskStack.java
+++ b/services/core/java/com/android/server/wm/TaskStack.java
@@ -1155,7 +1155,11 @@
     }
 
     @Override
-    public boolean isFullscreen() {
+    public boolean dimFullscreen() {
+        return mStackId == HOME_STACK_ID || isFullscreen();
+    }
+
+    boolean isFullscreen() {
         if (useCurrentBounds()) {
             return mFullscreen;
         }