diff --git a/services/core/java/com/android/server/wm/WindowLayersController.java b/services/core/java/com/android/server/wm/WindowLayersController.java index ed1f4287b49e6..8608967667a86 100644 --- a/services/core/java/com/android/server/wm/WindowLayersController.java +++ b/services/core/java/com/android/server/wm/WindowLayersController.java @@ -59,6 +59,7 @@ public class WindowLayersController { private int mHighestApplicationLayer = 0; private ArrayDeque mPinnedWindows = new ArrayDeque<>(); private ArrayDeque mDockedWindows = new ArrayDeque<>(); + private ArrayDeque mInputMethodWindows = new ArrayDeque<>(); private WindowState mDockDivider = null; private ArrayDeque mReplacingWindows = new ArrayDeque<>(); @@ -166,6 +167,7 @@ public class WindowLayersController { private void clear() { mHighestApplicationLayer = 0; mPinnedWindows.clear(); + mInputMethodWindows.clear(); mDockedWindows.clear(); mReplacingWindows.clear(); mDockDivider = null; @@ -179,6 +181,10 @@ public class WindowLayersController { if (w.mWillReplaceWindow) { mReplacingWindows.add(w); } + if (w.mIsImWindow) { + mInputMethodWindows.add(w); + return; + } final TaskStack stack = w.getStack(); if (stack == null) { return; @@ -200,12 +206,9 @@ public class WindowLayersController { layer = assignAndIncreaseLayerIfNeeded(mDockDivider, layer); - if (mDockDivider != null && mDockDivider.isVisibleLw() - && mService.mInputMethodWindow != null) { - layer = assignAndIncreaseLayerIfNeeded(mService.mInputMethodWindow, layer); - for (int i = mService.mInputMethodDialogs.size() - 1; i >= 0; i--) { - final WindowState dialog = mService.mInputMethodDialogs.get(i); - layer = assignAndIncreaseLayerIfNeeded(dialog, layer); + if (mDockDivider != null && mDockDivider.isVisibleLw()) { + while (!mInputMethodWindows.isEmpty()) { + layer = assignAndIncreaseLayerIfNeeded(mInputMethodWindows.remove(), layer); } }