From b660b9d8cf6b951b85a35599d636c470795e9a1a Mon Sep 17 00:00:00 2001 From: Craig Mautner Date: Thu, 13 Feb 2014 10:59:16 -0800 Subject: [PATCH] Update DimLayer sizes on rotation. Required replumbing and updating the TaskStack bounds calculations to match the new separation of TaskStack from DisplayContent. Fixes bug 12780687. Change-Id: I061c92831c06f4eb3e673ad6296e721b0c0f3202 --- .../core/java/com/android/server/wm/DimLayer.java | 5 ++ .../java/com/android/server/wm/DisplayContent.java | 18 ++----- .../core/java/com/android/server/wm/TaskStack.java | 56 ++++++++++------------ .../android/server/wm/WindowManagerService.java | 2 + 4 files changed, 38 insertions(+), 43 deletions(-) diff --git a/services/core/java/com/android/server/wm/DimLayer.java b/services/core/java/com/android/server/wm/DimLayer.java index 574ae2d77b34..aa7d4851fa9c 100644 --- a/services/core/java/com/android/server/wm/DimLayer.java +++ b/services/core/java/com/android/server/wm/DimLayer.java @@ -127,6 +127,11 @@ public class DimLayer { void setBounds(Rect bounds) { mBounds.set(bounds); + if (isDimming() && !mLastBounds.equals(bounds)) { + // Clearing mAlpha forces show to redisplay with new size. + mAlpha = 0; + show(); + } } /** diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index 415a06b2f250..68834d8f691b 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -170,22 +170,13 @@ class DisplayContent { } void updateDisplayInfo() { - // Save old size. - int oldWidth = mDisplayInfo.logicalWidth; - int oldHeight = mDisplayInfo.logicalHeight; mDisplay.getDisplayInfo(mDisplayInfo); - for (int i = mStacks.size() - 1; i >= 0; --i) { - final TaskStack stack = mStacks.get(i); - if (!stack.isFullscreen()) { - stack.resizeBounds(oldWidth, oldHeight, mDisplayInfo.logicalWidth, - mDisplayInfo.logicalHeight); - } + mStacks.get(i).updateDisplayInfo(); } } void getLogicalDisplayRect(Rect out) { - updateDisplayInfo(); // Uses same calculation as in LogicalDisplay#configureDisplayInTransactionLocked. final int orientation = mDisplayInfo.rotation; boolean rotated = (orientation == Surface.ROTATION_90 @@ -291,11 +282,12 @@ class DisplayContent { } boolean isDimming() { - boolean result = false; for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { - result |= mStacks.get(stackNdx).isDimming(); + if (mStacks.get(stackNdx).isDimming()) { + return true; + } } - return result; + return false; } void stopDimmingIfNeeded() { diff --git a/services/core/java/com/android/server/wm/TaskStack.java b/services/core/java/com/android/server/wm/TaskStack.java index 7d8cff4a8040..a6059008de0b 100644 --- a/services/core/java/com/android/server/wm/TaskStack.java +++ b/services/core/java/com/android/server/wm/TaskStack.java @@ -47,12 +47,17 @@ public class TaskStack { * mTaskHistory in the ActivityStack with the same mStackId */ private final ArrayList mTasks = new ArrayList(); - /** Content limits relative to the DisplayContent this sits in. Empty indicates fullscreen, - * Nonempty is size of this TaskStack but is also used to scale if DisplayContent changes. */ - Rect mBounds = new Rect(); + /** For comparison with DisplayContent bounds. */ + private Rect mTmpRect = new Rect(); + + /** Content limits relative to the DisplayContent this sits in. */ + private Rect mBounds = new Rect(); + + /** Whether mBounds is fullscreen */ + private boolean mFullscreen = true; /** Used to support {@link android.view.WindowManager.LayoutParams#FLAG_DIM_BEHIND} */ - DimLayer mDimLayer; + private DimLayer mDimLayer; /** The particular window with FLAG_DIM_BEHIND set. If null, hide mDimLayer. */ WindowStateAnimator mDimWinAnimator; @@ -86,7 +91,7 @@ public class TaskStack { return mTasks; } - private void resizeWindows() { + void resizeWindows() { final boolean underStatusBar = mBounds.top == 0; final ArrayList resizingWindows = mService.mResizingWindows; @@ -108,7 +113,13 @@ public class TaskStack { } boolean setBounds(Rect bounds) { - if (mBounds.equals(bounds)) { + boolean oldFullscreen = mFullscreen; + if (mDisplayContent != null) { + mDisplayContent.getLogicalDisplayRect(mTmpRect); + mFullscreen = mTmpRect.equals(bounds); + } + + if (mBounds.equals(bounds) && oldFullscreen == mFullscreen) { return false; } @@ -116,25 +127,22 @@ public class TaskStack { mAnimationBackgroundSurface.setBounds(bounds); mBounds.set(bounds); - resizeWindows(); return true; } void getBounds(Rect out) { - if (mDisplayContent != null) { - if (mBounds.isEmpty()) { - mDisplayContent.getLogicalDisplayRect(out); - } else { - out.set(mBounds); - } - out.intersect(mDisplayContent.mContentRect); - } else { - out.set(mBounds); + out.set(mBounds); + } + + void updateDisplayInfo() { + if (mFullscreen && mDisplayContent != null) { + mDisplayContent.getLogicalDisplayRect(mTmpRect); + setBounds(mTmpRect); } } boolean isFullscreen() { - return mBounds.isEmpty(); + return mFullscreen; } boolean isAnimating() { @@ -152,19 +160,6 @@ public class TaskStack { return false; } - void resizeBounds(float oldWidth, float oldHeight, float newWidth, float newHeight) { - if (oldWidth == newWidth && oldHeight == newHeight) { - return; - } - float widthScale = newWidth / oldWidth; - float heightScale = newHeight / oldHeight; - mBounds.left = (int)(mBounds.left * widthScale + 0.5); - mBounds.top = (int)(mBounds.top * heightScale + 0.5); - mBounds.right = (int)(mBounds.right * widthScale + 0.5); - mBounds.bottom = (int)(mBounds.bottom * heightScale + 0.5); - resizeWindows(); - } - /** * Put a Task in this stack. Used for adding and moving. * @param task The task to add. @@ -233,6 +228,7 @@ public class TaskStack { mDisplayContent = displayContent; mDimLayer = new DimLayer(mService, this, displayContent); mAnimationBackgroundSurface = new DimLayer(mService, this, displayContent); + updateDisplayInfo(); } void detachDisplay() { diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 63aef8ffb4b2..3c22427ceddd 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -4986,6 +4986,7 @@ public class WindowManagerService extends IWindowManager.Stub + " not found."); } if (stack.setBounds(bounds)) { + stack.resizeWindows(); stack.getDisplayContent().layoutNeeded = true; performLayoutAndPlaceSurfacesLocked(); } @@ -9957,6 +9958,7 @@ public class WindowManagerService extends IWindowManager.Stub } // TODO(multidisplay): rotation on main screen only. + displayContent.updateDisplayInfo(); screenRotationAnimation = new ScreenRotationAnimation(mContext, displayContent, mFxSession, inTransaction, mPolicy.isDefaultOrientationForced()); mAnimator.setScreenRotationAnimationLocked(displayId, screenRotationAnimation); -- 2.11.0