@@ -412,7 +412,17 @@ public void onInputEvent(InputEvent event) {
412412 boolean mForceStatusBar ;
413413 boolean mForceStatusBarFromKeyguard ;
414414 boolean mHideLockScreen ;
415- boolean mDismissKeyguard ;
415+
416+ // States of keyguard dismiss.
417+ private static final int DISMISS_KEYGUARD_NONE = 0 ; // Keyguard not being dismissed.
418+ private static final int DISMISS_KEYGUARD_START = 1 ; // Keyguard needs to be dismissed.
419+ private static final int DISMISS_KEYGUARD_CONTINUE = 2 ; // Keyguard has been dismissed.
420+ int mDismissKeyguard = DISMISS_KEYGUARD_NONE ;
421+
422+ /** The window that is currently dismissing the keyguard. Dismissing the keyguard must only
423+ * be done once per window. */
424+ private WindowState mWinDismissingKeyguard ;
425+
416426 boolean mShowingLockscreen ;
417427 boolean mShowingDream ;
418428 boolean mDreamingLockscreen ;
@@ -2921,19 +2931,21 @@ public void finishLayoutLw() {
29212931 }
29222932
29232933 /** {@inheritDoc} */
2934+ @ Override
29242935 public void beginPostLayoutPolicyLw (int displayWidth , int displayHeight ) {
29252936 mTopFullscreenOpaqueWindowState = null ;
29262937 mForceStatusBar = false ;
29272938 mForceStatusBarFromKeyguard = false ;
29282939
29292940 mHideLockScreen = false ;
29302941 mAllowLockscreenWhenOn = false ;
2931- mDismissKeyguard = false ;
2942+ mDismissKeyguard = DISMISS_KEYGUARD_NONE ;
29322943 mShowingLockscreen = false ;
29332944 mShowingDream = false ;
29342945 }
29352946
29362947 /** {@inheritDoc} */
2948+ @ Override
29372949 public void applyPostLayoutPolicyLw (WindowState win ,
29382950 WindowManager .LayoutParams attrs ) {
29392951 if (DEBUG_LAYOUT ) Slog .i (TAG , "Win " + win + ": isVisibleOrBehindKeyguardLw="
@@ -2971,9 +2983,12 @@ public void applyPostLayoutPolicyLw(WindowState win,
29712983 mHideLockScreen = true ;
29722984 mForceStatusBarFromKeyguard = false ;
29732985 }
2974- if ((attrs .flags & FLAG_DISMISS_KEYGUARD ) != 0 ) {
2986+ if ((attrs .flags & FLAG_DISMISS_KEYGUARD ) != 0
2987+ && mDismissKeyguard == DISMISS_KEYGUARD_NONE ) {
29752988 if (DEBUG_LAYOUT ) Log .v (TAG , "Setting mDismissKeyguard to true by win " + win );
2976- mDismissKeyguard = true ;
2989+ mDismissKeyguard = mWinDismissingKeyguard == win ?
2990+ DISMISS_KEYGUARD_CONTINUE : DISMISS_KEYGUARD_START ;
2991+ mWinDismissingKeyguard = win ;
29772992 mForceStatusBarFromKeyguard = false ;
29782993 }
29792994 if ((attrs .flags & FLAG_ALLOW_LOCK_WHILE_SCREEN_ON ) != 0 ) {
@@ -2984,6 +2999,7 @@ public void applyPostLayoutPolicyLw(WindowState win,
29842999 }
29853000
29863001 /** {@inheritDoc} */
3002+ @ Override
29873003 public int finishPostLayoutPolicyLw () {
29883004 int changes = 0 ;
29893005 boolean topIsFullscreen = false ;
@@ -3023,7 +3039,9 @@ public int finishPostLayoutPolicyLw() {
30233039 if (mStatusBar .hideLw (true )) {
30243040 changes |= FINISH_LAYOUT_REDO_LAYOUT ;
30253041
3026- mHandler .post (new Runnable () { public void run () {
3042+ mHandler .post (new Runnable () {
3043+ @ Override
3044+ public void run () {
30273045 try {
30283046 IStatusBarService statusbar = getStatusBarService ();
30293047 if (statusbar != null ) {
@@ -3051,14 +3069,15 @@ public int finishPostLayoutPolicyLw() {
30513069 if (mKeyguard != null ) {
30523070 if (localLOGV ) Log .v (TAG , "finishPostLayoutPolicyLw: mHideKeyguard="
30533071 + mHideLockScreen );
3054- if (mDismissKeyguard && !mKeyguardMediator .isSecure ()) {
3072+ if (mDismissKeyguard != DISMISS_KEYGUARD_NONE && !mKeyguardMediator .isSecure ()) {
30553073 if (mKeyguard .hideLw (true )) {
30563074 changes |= FINISH_LAYOUT_REDO_LAYOUT
30573075 | FINISH_LAYOUT_REDO_CONFIG
30583076 | FINISH_LAYOUT_REDO_WALLPAPER ;
30593077 }
30603078 if (mKeyguardMediator .isShowing ()) {
30613079 mHandler .post (new Runnable () {
3080+ @ Override
30623081 public void run () {
30633082 mKeyguardMediator .keyguardDone (false , false );
30643083 }
@@ -3071,7 +3090,25 @@ public void run() {
30713090 | FINISH_LAYOUT_REDO_WALLPAPER ;
30723091 }
30733092 mKeyguardMediator .setHidden (true );
3093+ } else if (mDismissKeyguard != DISMISS_KEYGUARD_NONE ) {
3094+ // This is the case of keyguard isSecure() and not mHideLockScreen.
3095+ if (mDismissKeyguard == DISMISS_KEYGUARD_START ) {
3096+ // Only launch the next keyguard unlock window once per window.
3097+ if (mKeyguard .showLw (true )) {
3098+ changes |= FINISH_LAYOUT_REDO_LAYOUT
3099+ | FINISH_LAYOUT_REDO_CONFIG
3100+ | FINISH_LAYOUT_REDO_WALLPAPER ;
3101+ }
3102+ mKeyguardMediator .setHidden (false );
3103+ mHandler .post (new Runnable () {
3104+ @ Override
3105+ public void run () {
3106+ mKeyguardMediator .dismiss ();
3107+ }
3108+ });
3109+ }
30743110 } else {
3111+ mWinDismissingKeyguard = null ;
30753112 if (mKeyguard .showLw (true )) {
30763113 changes |= FINISH_LAYOUT_REDO_LAYOUT
30773114 | FINISH_LAYOUT_REDO_CONFIG
@@ -4549,6 +4586,7 @@ public void dump(String prefix, PrintWriter pw, String[] args) {
45494586 pw .print (" mForceStatusBarFromKeyguard=" );
45504587 pw .println (mForceStatusBarFromKeyguard );
45514588 pw .print (prefix ); pw .print ("mDismissKeyguard=" ); pw .print (mDismissKeyguard );
4589+ pw .print (" mWinDismissingKeyguard=" ); pw .print (mWinDismissingKeyguard );
45524590 pw .print (" mHomePressed=" ); pw .println (mHomePressed );
45534591 pw .print (prefix ); pw .print ("mAllowLockscreenWhenOn=" ); pw .print (mAllowLockscreenWhenOn );
45544592 pw .print (" mLockScreenTimeout=" ); pw .print (mLockScreenTimeout );
0 commit comments