From 19d9a8f47625319406f593d4ec71de0c8df1fcfe Mon Sep 17 00:00:00 2001 From: Keisuke Kuroyanagi Date: Thu, 12 May 2016 16:49:02 -0700 Subject: [PATCH] Adjust divider when IME height is changed. Previously, divider was adjusted for IME when IME window visibility is changed. However, IME size can be changed without changing IME window visibility. For example, when hardware keyboard key is pressed to show emoji layout. This CL checks if IME height has been changed and adjust divider position properly. Bug: 28389933 Change-Id: I9a561bd4796a0513c8b5c493884946883f160907 --- .../server/wm/DockedStackDividerController.java | 11 +++++++++-- .../core/java/com/android/server/wm/TaskStack.java | 4 ++-- .../com/android/server/wm/WindowManagerService.java | 9 ++++++--- 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/services/core/java/com/android/server/wm/DockedStackDividerController.java b/services/core/java/com/android/server/wm/DockedStackDividerController.java index 61425114ff9d5..aa4a81502fc01 100644 --- a/services/core/java/com/android/server/wm/DockedStackDividerController.java +++ b/services/core/java/com/android/server/wm/DockedStackDividerController.java @@ -115,6 +115,7 @@ public class DockedStackDividerController implements DimLayerUser { private final Rect mTouchRegion = new Rect(); private boolean mAnimatingForIme; private boolean mAdjustedForIme; + private int mImeHeight; private WindowState mDelayedImeWin; private boolean mAdjustedForDivider; private float mDividerAnimationStart; @@ -215,8 +216,9 @@ public class DockedStackDividerController implements DimLayerUser { void setAdjustedForIme( boolean adjustedForIme, boolean adjustedForDivider, - boolean animate, WindowState imeWin) { - if (mAdjustedForIme != adjustedForIme || mAdjustedForDivider != adjustedForDivider) { + boolean animate, WindowState imeWin, int imeHeight) { + if (mAdjustedForIme != adjustedForIme || (adjustedForIme && mImeHeight != imeHeight) + || mAdjustedForDivider != adjustedForDivider) { if (animate) { startImeAdjustAnimation(adjustedForIme, adjustedForDivider, imeWin); } else { @@ -224,10 +226,15 @@ public class DockedStackDividerController implements DimLayerUser { notifyAdjustedForImeChanged(adjustedForIme || adjustedForDivider, 0 /* duration */); } mAdjustedForIme = adjustedForIme; + mImeHeight = imeHeight; mAdjustedForDivider = adjustedForDivider; } } + int getImeHeightAdjustedFor() { + return mImeHeight; + } + void positionDockedStackedDivider(Rect frame) { TaskStack stack = mDisplayContent.getDockedStackLocked(); if (stack == null) { diff --git a/services/core/java/com/android/server/wm/TaskStack.java b/services/core/java/com/android/server/wm/TaskStack.java index b2f3df7782370..cdced6940fdb0 100644 --- a/services/core/java/com/android/server/wm/TaskStack.java +++ b/services/core/java/com/android/server/wm/TaskStack.java @@ -849,10 +849,10 @@ public class TaskStack implements DimLayer.DimLayerUser, * * @param imeWin The IME window. */ - void setAdjustedForIme(WindowState imeWin) { + void setAdjustedForIme(WindowState imeWin, boolean forceUpdate) { mImeWin = imeWin; mImeGoingAway = false; - if (!mAdjustedForIme) { + if (!mAdjustedForIme || forceUpdate) { mAdjustedForIme = true; mAdjustImeAmount = 0f; mAdjustDividerAmount = 0f; diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index a0b8c356cdd87..a9802d44b2b4d 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -7535,6 +7535,9 @@ public class WindowManagerService extends IWindowManager.Stub final boolean imeOnTop = (imeDockSide == DOCKED_TOP); final boolean imeOnBottom = (imeDockSide == DOCKED_BOTTOM); final boolean dockMinimized = displayContent.mDividerControllerLocked.isMinimizedDock(); + final int imeHeight = mPolicy.getInputMethodWindowVisibleHeightLw(); + final boolean imeHeightChanged = imeVisible && + imeHeight != displayContent.mDividerControllerLocked.getImeHeightAdjustedFor(); // The divider could be adjusted for IME position, or be thinner than usual, // or both. There are three possible cases: @@ -7548,13 +7551,13 @@ public class WindowManagerService extends IWindowManager.Stub final TaskStack stack = stacks.get(i); final boolean isDockedOnBottom = stack.getDockSide() == DOCKED_BOTTOM; if (stack.isVisibleLocked() && (imeOnBottom || isDockedOnBottom)) { - stack.setAdjustedForIme(imeWin); + stack.setAdjustedForIme(imeWin, imeOnBottom && imeHeightChanged); } else { stack.resetAdjustedForIme(false); } } displayContent.mDividerControllerLocked.setAdjustedForIme( - imeOnBottom /*ime*/, true /*divider*/, true /*animate*/, imeWin); + imeOnBottom /*ime*/, true /*divider*/, true /*animate*/, imeWin, imeHeight); } else { final ArrayList stacks = displayContent.getStacks(); for (int i = stacks.size() - 1; i >= 0; --i) { @@ -7562,7 +7565,7 @@ public class WindowManagerService extends IWindowManager.Stub stack.resetAdjustedForIme(!dockVisible); } displayContent.mDividerControllerLocked.setAdjustedForIme( - false /*ime*/, false /*divider*/, dockVisible /*animate*/, imeWin); + false /*ime*/, false /*divider*/, dockVisible /*animate*/, imeWin, imeHeight); } }