From 76d2fe42880bd37b80c01fb68c31a4c619ddfdeb Mon Sep 17 00:00:00 2001 From: Adrian Roos Date: Thu, 9 Jul 2015 14:54:08 -0700 Subject: [PATCH] Fix black keyguard / missing status bar The status bar window was stuck in the READY_TO_SHOW state because it was not policy visible, whereas the policy was waiting for the window to become HAS_DRAWN. Now BarController also updates states if the window is READY_TO_SHOW, which in turn allows the window to become visible and HAS_DRAWN. Bug: 22072099 Change-Id: I1836c276723ee2205d7d5759be079f02aaa23e2e --- core/java/android/view/WindowManagerPolicy.java | 8 ++++++++ .../java/com/android/server/policy/BarController.java | 4 ++-- services/core/java/com/android/server/wm/WindowState.java | 1 + 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/core/java/android/view/WindowManagerPolicy.java b/core/java/android/view/WindowManagerPolicy.java index 64210ea002562..be564f84d221d 100644 --- a/core/java/android/view/WindowManagerPolicy.java +++ b/core/java/android/view/WindowManagerPolicy.java @@ -341,6 +341,14 @@ public interface WindowManagerPolicy { */ boolean isGoneForLayoutLw(); + /** + * Returns true if the window has a surface that it has drawn a + * complete UI in to. Note that this is different from {@link #hasDrawnLw()} + * in that it also returns true if the window is READY_TO_SHOW, but was not yet + * promoted to HAS_DRAWN. + */ + boolean isDrawnLw(); + /** * Returns true if this window has been shown on screen at some time in * the past. Must be called with the window manager lock held. diff --git a/services/core/java/com/android/server/policy/BarController.java b/services/core/java/com/android/server/policy/BarController.java index 5877b3eb8598e..9095f57b175a1 100644 --- a/services/core/java/com/android/server/policy/BarController.java +++ b/services/core/java/com/android/server/policy/BarController.java @@ -155,7 +155,7 @@ public class BarController { } private int computeStateLw(boolean wasVis, boolean wasAnim, WindowState win, boolean change) { - if (win.hasDrawnLw()) { + if (win.isDrawnLw()) { final boolean vis = win.isVisibleLw(); final boolean anim = win.isAnimatingLw(); if (mState == StatusBarManager.WINDOW_STATE_HIDING && !change && !vis) { @@ -198,7 +198,7 @@ public class BarController { } public boolean checkHiddenLw() { - if (mWin != null && mWin.hasDrawnLw()) { + if (mWin != null && mWin.isDrawnLw()) { if (!mWin.isVisibleLw() && !mWin.isAnimatingLw()) { updateStateLw(StatusBarManager.WINDOW_STATE_HIDDEN); } diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index b918a25f98ded..c2548de64ec26 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -1104,6 +1104,7 @@ final class WindowState implements WindowManagerPolicy.WindowState { * Returns true if the window has a surface that it has drawn a * complete UI in to. */ + @Override public boolean isDrawnLw() { return mHasSurface && !mDestroying && (mWinAnimator.mDrawState == WindowStateAnimator.READY_TO_SHOW