diff --git a/services/core/java/com/android/server/wm/WindowLayersController.java b/services/core/java/com/android/server/wm/WindowLayersController.java index 8608967667a86..55abf78b001db 100644 --- a/services/core/java/com/android/server/wm/WindowLayersController.java +++ b/services/core/java/com/android/server/wm/WindowLayersController.java @@ -208,7 +208,11 @@ public class WindowLayersController { if (mDockDivider != null && mDockDivider.isVisibleLw()) { while (!mInputMethodWindows.isEmpty()) { - layer = assignAndIncreaseLayerIfNeeded(mInputMethodWindows.remove(), layer); + final WindowState w = mInputMethodWindows.remove(); + // Only ever move IME windows up, else we brake IME for windows above the divider. + if (layer > w.mLayer) { + layer = assignAndIncreaseLayerIfNeeded(w, layer); + } } } diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index ff63632852297..5107ac189cf99 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -1567,11 +1567,13 @@ public class WindowManagerService extends IWindowManager.Stub // If the docked divider is visible, we still need to go through this whole // excercise to find the appropriate input method target (used for animations // and dialog adjustments), but for purposes of Z ordering we simply wish to - // place it above the docked divider. + // place it above the docked divider. Unless it is already above the divider. WindowState dockedDivider = w.mDisplayContent.mDividerControllerLocked.getWindow(); if (dockedDivider != null && dockedDivider.isVisibleLw()) { int dividerIndex = windows.indexOf(dockedDivider); - return dividerIndex > 0 ? dividerIndex + 1 : i + 1; + if (dividerIndex > 0 && dividerIndex > i) { + return dividerIndex + 1; + } } return i+1; }