From 41de79e22050e3975636e50ab3954cf4be6bc6d8 Mon Sep 17 00:00:00 2001 From: Chong Zhang Date: Thu, 21 Apr 2016 12:57:55 -0700 Subject: [PATCH] Make sure don't adjust IME when docked left-right bug: 28295645 Change-Id: Ia8f7f9a92fcc562bd672abae4d3ddfd6e6201a79 --- .../com/android/server/wm/WindowManagerService.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index aee8fc90a8d28..59b0a00c405d1 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -174,6 +174,7 @@ import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_BEHIND; import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; import static android.view.WindowManager.DOCKED_BOTTOM; import static android.view.WindowManager.DOCKED_INVALID; +import static android.view.WindowManager.DOCKED_TOP; import static android.view.WindowManager.LayoutParams.FIRST_APPLICATION_WINDOW; import static android.view.WindowManager.LayoutParams.FIRST_SUB_WINDOW; import static android.view.WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM; @@ -7467,6 +7468,10 @@ public class WindowManagerService extends IWindowManager.Stub final boolean imeVisible = imeWin != null && imeWin.isVisibleLw() && imeWin.isDisplayedLw(); final boolean dockVisible = isStackVisibleLocked(DOCKED_STACK_ID); final TaskStack imeTargetStack = getImeTargetStackLocked(); + final int imeDockSide = (dockVisible && imeTargetStack != null) ? + imeTargetStack.getDockSide() : DOCKED_INVALID; + final boolean imeOnTop = (imeDockSide == DOCKED_TOP); + final boolean imeOnBottom = (imeDockSide == DOCKED_BOTTOM); // The divider could be adjusted for IME position, or be thinner than usual, // or both. There are three possible cases: @@ -7474,20 +7479,19 @@ public class WindowManagerService extends IWindowManager.Stub // - If IME is visible, and focus is on bottom, divider is moved for IME and thinner. // - If IME is not visible, divider is not moved and is normal width. - if (imeVisible && dockVisible && imeTargetStack != null) { - final boolean isFocusOnBottom = imeTargetStack.getDockSide() == DOCKED_BOTTOM; + if (imeVisible && dockVisible && (imeOnTop || imeOnBottom)) { final ArrayList stacks = displayContent.getStacks(); for (int i = stacks.size() - 1; i >= 0; --i) { final TaskStack stack = stacks.get(i); final boolean isDockedOnBottom = stack.getDockSide() == DOCKED_BOTTOM; - if (stack.isVisibleLocked() && (isFocusOnBottom || isDockedOnBottom)) { + if (stack.isVisibleLocked() && (imeOnBottom || isDockedOnBottom)) { stack.setAdjustedForIme(imeWin); } else { stack.resetAdjustedForIme(false); } } displayContent.mDividerControllerLocked.setAdjustedForIme( - isFocusOnBottom /*ime*/, true /*divider*/, true /*animate*/, imeWin); + imeOnBottom /*ime*/, true /*divider*/, true /*animate*/, imeWin); } else { final ArrayList stacks = displayContent.getStacks(); for (int i = stacks.size() - 1; i >= 0; --i) {