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
diff --git a/services/core/java/com/android/server/wm/DimLayer.java b/services/core/java/com/android/server/wm/DimLayer.java
index 574ae2d..aa7d485 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 @@
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 415a06b..68834d8 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 @@
}
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 @@
}
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 7d8cff4..a6059008 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 @@
* mTaskHistory in the ActivityStack with the same mStackId */
private final ArrayList<Task> mTasks = new ArrayList<Task>();
- /** 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 @@
return mTasks;
}
- private void resizeWindows() {
+ void resizeWindows() {
final boolean underStatusBar = mBounds.top == 0;
final ArrayList<WindowState> resizingWindows = mService.mResizingWindows;
@@ -108,7 +113,13 @@
}
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 @@
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 @@
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 @@
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 63aef8f..3c22427 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 @@
+ " not found.");
}
if (stack.setBounds(bounds)) {
+ stack.resizeWindows();
stack.getDisplayContent().layoutNeeded = true;
performLayoutAndPlaceSurfacesLocked();
}
@@ -9957,6 +9958,7 @@
}
// TODO(multidisplay): rotation on main screen only.
+ displayContent.updateDisplayInfo();
screenRotationAnimation = new ScreenRotationAnimation(mContext, displayContent,
mFxSession, inTransaction, mPolicy.isDefaultOrientationForced());
mAnimator.setScreenRotationAnimationLocked(displayId, screenRotationAnimation);