From b976877a4b62a6030fe67796ab8a6a69b4cc041f Mon Sep 17 00:00:00 2001 From: Robert Carr Date: Tue, 19 Apr 2016 22:31:09 -0700 Subject: [PATCH] When restacking IM windows preserve relative order. We were still having some troubles with attached windows which we werent properly promoting here. Now we catch everything with the mIsImWindow flag. Before it was safe to assume dialogs were on top of the Input Method but with a whole range of child windows we need to be more careful. WindowManagerService has been very careful preparing the window list for us, so carry out its wishes and preserve the original relative ordering of input method windows when restacking. Bug: 28235787 Change-Id: Ied96d83f77b82df81b3b0aa94cb61e9c22999d23 --- .../android/server/wm/WindowLayersController.java | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) 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); } }