From 5117e273eca0b15ef057d0c2440546799c17edf4 Mon Sep 17 00:00:00 2001 From: Chong Zhang Date: Tue, 3 May 2016 12:47:34 -0700 Subject: [PATCH] Apply IME adjust to newly added window bug: 28390108 Change-Id: I72132d68cb41056fb69f2fe38fa13f2b3c9ce3d6 --- .../core/java/com/android/server/wm/Task.java | 26 +++++++++++++++++ .../java/com/android/server/wm/TaskStack.java | 29 ++++++++++--------- .../server/wm/WindowManagerService.java | 4 +++ .../com/android/server/wm/WindowState.java | 7 +++++ 4 files changed, 53 insertions(+), 13 deletions(-) diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index 7ee26a048185a..efabe31ae26e1 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -322,6 +322,32 @@ class Task implements DimLayer.DimLayerUser { mPreparedFrozenBounds.set(mBounds); } + /** + * Align the task to the adjusted bounds. + * + * @param adjustedBounds Adjusted bounds to which the task should be aligned. + * @param tempInsetBounds Insets bounds for the task. + * @param alignBottom True if the task's bottom should be aligned to the adjusted + * bounds's bottom; false if the task's top should be aligned + * the adjusted bounds's top. + */ + void alignToAdjustedBounds( + Rect adjustedBounds, Rect tempInsetBounds, boolean alignBottom) { + if (!isResizeable() || mOverrideConfig == Configuration.EMPTY) { + return; + } + + getBounds(mTmpRect2); + if (alignBottom) { + int offsetY = adjustedBounds.bottom - mTmpRect2.bottom; + mTmpRect2.offset(0, offsetY); + } else { + mTmpRect2.offsetTo(adjustedBounds.left, adjustedBounds.top); + } + setTempInsetBounds(tempInsetBounds); + resizeLocked(mTmpRect2, mOverrideConfig, false /* forced */); + } + void resetScrollLocked() { if (mScrollValid) { mScrollValid = false; diff --git a/services/core/java/com/android/server/wm/TaskStack.java b/services/core/java/com/android/server/wm/TaskStack.java index 6c80d1ab3cfec..b2f3df7782370 100644 --- a/services/core/java/com/android/server/wm/TaskStack.java +++ b/services/core/java/com/android/server/wm/TaskStack.java @@ -240,7 +240,7 @@ public class TaskStack implements DimLayer.DimLayerUser, Rect insetBounds = null; if (adjusted && isAdjustedForMinimizedDock()) { insetBounds = mBounds; - } else if (adjusted && isAdjustedForIme()) { + } else if (adjusted && mAdjustedForIme) { if (mImeGoingAway) { insetBounds = mBounds; } else { @@ -264,16 +264,9 @@ public class TaskStack implements DimLayer.DimLayerUser, task.resizeLocked(null, null, false /* forced */); task.getBounds(mTmpRect2); task.scrollLocked(mTmpRect2); - } else if (task.isResizeable() && task.mOverrideConfig != Configuration.EMPTY) { - task.getBounds(mTmpRect2); - if (mAdjustedForIme && getDockSide() == DOCKED_TOP) { - int offsetY = adjustedBounds.bottom - mTmpRect2.bottom; - mTmpRect2.offset(0, offsetY); - } else { - mTmpRect2.offsetTo(adjustedBounds.left, adjustedBounds.top); - } - task.setTempInsetBounds(tempInsetBounds); - task.resizeLocked(mTmpRect2, task.mOverrideConfig, false /* forced */); + } else { + final boolean alignBottom = mAdjustedForIme && getDockSide() == DOCKED_TOP; + task.alignToAdjustedBounds(adjustedBounds, tempInsetBounds, alignBottom); } } } @@ -868,7 +861,7 @@ public class TaskStack implements DimLayer.DimLayerUser, } boolean isAdjustedForIme() { - return mAdjustedForIme || mImeGoingAway; + return mAdjustedForIme; } boolean isAnimatingForIme() { @@ -1083,7 +1076,7 @@ public class TaskStack implements DimLayer.DimLayerUser, /** * Updates the adjustment depending on it's current state. */ - void updateAdjustedBounds() { + private void updateAdjustedBounds() { boolean adjust = false; if (mMinimizeAmount != 0f) { adjust = adjustForMinimizedDockedStack(mMinimizeAmount); @@ -1103,6 +1096,16 @@ public class TaskStack implements DimLayer.DimLayerUser, } } + void applyAdjustForImeIfNeeded(Task task) { + if (mMinimizeAmount != 0f || !mAdjustedForIme || mAdjustedBounds.isEmpty()) { + return; + } + + final Rect insetBounds = mImeGoingAway ? mBounds : mFullyAdjustedImeBounds; + task.alignToAdjustedBounds(mAdjustedBounds, insetBounds, getDockSide() == DOCKED_TOP); + mDisplayContent.layoutNeeded = true; + } + boolean isAdjustedForMinimizedDockedStack() { return mMinimizeAmount != 0f; } diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index dfe44213499da..cf5cdc38bf2f6 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -2077,6 +2077,10 @@ public class WindowManagerService extends IWindowManager.Stub // we need to update this new window's scroll position when it's added. win.applyScrollIfNeeded(); + // If the window is being added to a stack that's currently adjusted for IME, + // make sure to apply the same adjust to this new window. + win.applyAdjustForImeIfNeeded(); + if (type == TYPE_DOCK_DIVIDER) { getDefaultDisplayContentLocked().getDockedDividerController().setWindow(win); } diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index 6a2a91dac1dde..304b2a76f1f71 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -1620,6 +1620,13 @@ final class WindowState implements WindowManagerPolicy.WindowState { } } + void applyAdjustForImeIfNeeded() { + final Task task = getTask(); + if (task != null && task.mStack != null && task.mStack.isAdjustedForIme()) { + task.mStack.applyAdjustForImeIfNeeded(task); + } + } + int getTouchableRegion(Region region, int flags) { final boolean modal = (flags & (FLAG_NOT_TOUCH_MODAL | FLAG_NOT_FOCUSABLE)) == 0; if (modal && mAppToken != null) {