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); } }