diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index a39add80ba8fc..3a78968f9ee7b 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -6397,6 +6397,9 @@ public class PhoneWindowManager implements WindowManagerPolicy { } mWindowManagerDrawComplete = true; + if (mKeyguardDelegate != null) { + mKeyguardDelegate.onDrawCompleteLw(); + } } finishScreenTurningOn(); @@ -6866,7 +6869,8 @@ public class PhoneWindowManager implements WindowManagerPolicy { /** {@inheritDoc} */ @Override public void systemReady() { - mKeyguardDelegate = new KeyguardServiceDelegate(mContext); + mKeyguardDelegate = new KeyguardServiceDelegate(mContext, + mWindowManagerFuncs.getWindowManagerLock()); mKeyguardDelegate.onSystemReady(); readCameraLensCoverState(); diff --git a/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java b/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java index 4fce49e16815f..c48095eee7649 100644 --- a/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java +++ b/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java @@ -19,6 +19,7 @@ import android.view.ViewGroup; import android.view.WindowManager; import android.view.WindowManagerPolicy.OnKeyguardExitResult; +import com.android.internal.annotations.GuardedBy; import com.android.internal.policy.IKeyguardDrawnCallback; import com.android.internal.policy.IKeyguardExitCallback; import com.android.internal.policy.IKeyguardService; @@ -43,6 +44,7 @@ public class KeyguardServiceDelegate { private static final int INTERACTIVE_STATE_AWAKE = 1; private static final int INTERACTIVE_STATE_GOING_TO_SLEEP = 2; + private final Object mWindowManagerLock; protected KeyguardServiceWrapper mKeyguardService; private final Context mContext; private final View mScrim; // shown if keyguard crashes @@ -50,6 +52,9 @@ public class KeyguardServiceDelegate { private final KeyguardState mKeyguardState = new KeyguardState(); private DrawnListener mDrawnListenerWhenConnect; + @GuardedBy("mWindowManagerLock") + private boolean mHideScrimPending; + private static final class KeyguardState { KeyguardState() { // Assume keyguard is showing and secure until we know for sure. This is here in @@ -92,10 +97,12 @@ public class KeyguardServiceDelegate { @Override public void onDrawn() throws RemoteException { if (DEBUG) Log.v(TAG, "**** SHOWN CALLED ****"); + synchronized (mWindowManagerLock) { + mHideScrimPending = true; + } if (mDrawnListener != null) { mDrawnListener.onDrawn(); } - hideScrim(); } }; @@ -116,7 +123,8 @@ public class KeyguardServiceDelegate { } }; - public KeyguardServiceDelegate(Context context) { + public KeyguardServiceDelegate(Context context, Object windowManagerLock) { + mWindowManagerLock = windowManagerLock; mContext = context; mScrimHandler = UiThread.getHandler(); mScrim = createScrim(context, mScrimHandler); @@ -355,6 +363,16 @@ public class KeyguardServiceDelegate { } } + /** + * Called when all windows were fully drawn. + */ + public void onDrawCompleteLw() { + if (mHideScrimPending) { + hideScrim(); + mHideScrimPending = false; + } + } + private static View createScrim(Context context, Handler handler) { final View view = new View(context);