From ae35fef616c14f721cf12d6a0f78bef9fef5df9d Mon Sep 17 00:00:00 2001 From: Chong Zhang Date: Wed, 16 Mar 2016 15:56:55 -0700 Subject: [PATCH] Apply temp inset bounds to child window if it's not empty bug: 27676101 bug: 27687126 Change-Id: Iab1129cc0224194e7a9d11d0454bc7af6897a6e8 --- .../core/java/com/android/server/wm/WindowState.java | 16 ++++++++++++---- .../java/com/android/server/wm/WindowStateAnimator.java | 2 -- .../com/android/server/wm/WindowSurfaceController.java | 5 +++++ 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index cd771ba6fed2..1695615fedda 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -645,15 +645,23 @@ final class WindowState implements WindowManagerPolicy.WindowState { final boolean fullscreenTask = !inMultiWindowMode(); final boolean windowsAreFloating = task != null && task.isFloating(); - if (fullscreenTask || (isChildWindow() - && (mAttrs.privateFlags & PRIVATE_FLAG_LAYOUT_CHILD_WINDOW_IN_PARENT_FRAME) != 0)) { + // If the task has temp inset bounds set, we have to make sure all its windows uses + // the temp inset frame. Otherwise different display frames get applied to the main + // window and the child window, making them misaligned. + if (fullscreenTask) { + mInsetFrame.setEmpty(); + } else { + task.getTempInsetBounds(mInsetFrame); + } + + if (mInsetFrame.isEmpty() && (fullscreenTask + || (isChildWindow() && (mAttrs.privateFlags + & PRIVATE_FLAG_LAYOUT_CHILD_WINDOW_IN_PARENT_FRAME) != 0))) { // We use the parent frame as the containing frame for fullscreen and child windows mContainingFrame.set(pf); mDisplayFrame.set(df); - mInsetFrame.setEmpty(); } else { task.getBounds(mContainingFrame); - task.getTempInsetBounds(mInsetFrame); if (mAppToken != null && !mAppToken.mFrozenBounds.isEmpty()) { // If the bounds are frozen, we still want to translate the window freely and only diff --git a/services/core/java/com/android/server/wm/WindowStateAnimator.java b/services/core/java/com/android/server/wm/WindowStateAnimator.java index 6ce1a64f11a5..568c12bc4bcb 100644 --- a/services/core/java/com/android/server/wm/WindowStateAnimator.java +++ b/services/core/java/com/android/server/wm/WindowStateAnimator.java @@ -711,8 +711,6 @@ class WindowStateAnimator { // Start a new transaction and apply position & offset. final int layerStack = w.getDisplayContent().getDisplay().getLayerStack(); - if (SHOW_TRANSACTIONS) WindowManagerService.logSurface(w, - "POS " + mTmpSize.left + ", " + mTmpSize.top, false); mSurfaceController.setPositionAndLayer(mTmpSize.left, mTmpSize.top, layerStack, mAnimLayer); mLastHidden = true; diff --git a/services/core/java/com/android/server/wm/WindowSurfaceController.java b/services/core/java/com/android/server/wm/WindowSurfaceController.java index fb07512f16e2..11f37719f047 100644 --- a/services/core/java/com/android/server/wm/WindowSurfaceController.java +++ b/services/core/java/com/android/server/wm/WindowSurfaceController.java @@ -119,6 +119,8 @@ class WindowSurfaceController { mSurfaceY = top; try { + if (SHOW_TRANSACTIONS) logSurface( + "POS (setPositionAndLayer) @ (" + left + "," + top + ")", null); mSurfaceControl.setPosition(left, top); mSurfaceControl.setLayerStack(layerStack); @@ -205,6 +207,9 @@ class WindowSurfaceController { mSurfaceY = top; try { + if (SHOW_TRANSACTIONS) logSurface( + "POS (setPositionInTransaction) @ (" + left + "," + top + ")", null); + mSurfaceControl.setPosition(left, top); } catch (RuntimeException e) { Slog.w(TAG, "Error positioning surface of " + this -- 2.11.0