From 29bfbb878d54db14204e9b02dc17bfc6e127b6b2 Mon Sep 17 00:00:00 2001 From: Wale Ogunwale Date: Thu, 12 May 2016 15:13:52 -0700 Subject: [PATCH] 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 --- .../java/com/android/server/wm/DimLayer.java | 49 +++++++++++-------- .../android/server/wm/DimLayerController.java | 34 +++++++------ .../wm/DockedStackDividerController.java | 2 +- .../core/java/com/android/server/wm/Task.java | 6 ++- .../com/android/server/wm/TaskPositioner.java | 6 ++- .../java/com/android/server/wm/TaskStack.java | 6 ++- 6 files changed, 63 insertions(+), 40 deletions(-) diff --git a/services/core/java/com/android/server/wm/DimLayer.java b/services/core/java/com/android/server/wm/DimLayer.java index 95be233e44b24..052b2f542d28d 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 @@ public class DimLayer { /** 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 @@ public class DimLayer { * 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 52146c2c61daa..2b9879e92fcb0 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 @@ class DimLayerController { /** 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 @@ class DimLayerController { || !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 @@ class DimLayerController { 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 @@ class DimLayerController { 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 6e1ff0682465a..298a0d8fc0519 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 @@ public class DockedStackDividerController implements DimLayerUser { } @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 efabe31ae26e1..8f4197f06f1b9 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 @@ class Task implements DimLayer.DimLayerUser { } @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 222087d080616..e82397226346b 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 @@ class TaskPositioner implements DimLayer.DimLayerUser { } @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 58468f62eefb6..f25ef52bee455 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 @@ public class TaskStack implements DimLayer.DimLayerUser, } @Override - public boolean isFullscreen() { + public boolean dimFullscreen() { + return mStackId == HOME_STACK_ID || isFullscreen(); + } + + boolean isFullscreen() { if (useCurrentBounds()) { return mFullscreen; }