From 69ab104a865e9cc66286b97978ca44afbbab41aa Mon Sep 17 00:00:00 2001 From: Tarandeep Singh Date: Tue, 30 Jul 2019 13:30:03 -0700 Subject: [PATCH] Keep IME above starting window. While app window is animating-in, IME window is child of aboveAppContainers. If app requests IME on activity resume, IME will start animating-in above Snapshot during app window animation. However when app window animation finishes, IME's parent is no longer aboveAppContainers, thereby making snapshot occlude IME briefly. This results in flashing. The fix is to keep IME in aboveAppContainers as long as startingWindow is not removed from hierarchy. Bug: 137534359 Test: Manual and atest ZOrderingTests AppWindowTokenTests Change-Id: I78c939e8d1f23144162ba9eb8d834150fdd08ae8 --- .../com/android/server/wm/AppWindowToken.java | 16 ++++++++++++++++ .../com/android/server/wm/DisplayContent.java | 10 +++++++--- .../android/server/wm/AppWindowTokenTests.java | 15 +++++++++++++++ 3 files changed, 38 insertions(+), 3 deletions(-) diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java index 6c577e150e54d..f1a9e60d18aa5 100644 --- a/services/core/java/com/android/server/wm/AppWindowToken.java +++ b/services/core/java/com/android/server/wm/AppWindowToken.java @@ -206,6 +206,7 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree boolean removed; // Information about an application starting window if displayed. + // Note: these are de-referenced before the starting window animates away. StartingData mStartingData; WindowState startingWindow; StartingSurface startingSurface; @@ -1243,6 +1244,21 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree return true; } + /** + * @return {@code true} if starting window is in app's hierarchy. + */ + boolean hasStartingWindow() { + if (startingDisplayed || mStartingData != null) { + return true; + } + for (int i = mChildren.size() - 1; i >= 0; i--) { + if (getChildAt(i).mAttrs.type == TYPE_APPLICATION_STARTING) { + return true; + } + } + return false; + } + @Override void addWindow(WindowState w) { super.addWindow(w); diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index a1b87605ac1f7..885095f248f49 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -4845,9 +4845,13 @@ class DisplayContent extends WindowContainer