From 6102ee30e65e6e6d308d59f81bed19935a7bc1c7 Mon Sep 17 00:00:00 2001 From: Coco Duan Date: Thu, 8 Jun 2023 17:13:19 +0000 Subject: [PATCH] Fix screen getting relocked after unlocking once and wallpaper dream has stopped For windowless dream, onAppTransitionFinishedLocked is not called when dreaming starts like other dreams, so mLockAfterAppTransitionFinished flag remains true. When user unlocked via bouncer and dreaming stopped, onAppTransitionFinishedLocked got called and lockNow would then be called to relock the screen. Fix is to add isDreaming check so when dreaming has stopped, we won't call lockNow. Renamed the variable to mLockAfterDreamingTransitionFinished as it is only used by power button press to start dreaming. Bug: b/285059622 Test: atest PowerKeyGestureTests; manual Change-Id: Iceeb2ac97514600bd9a52439282496a38c387b98 --- .../server/policy/PhoneWindowManager.java | 20 +++++++++-------- .../server/policy/PowerKeyGestureTests.java | 13 ++++++++++- .../server/policy/TestPhoneWindowManager.java | 22 ++++++++++++++----- 3 files changed, 40 insertions(+), 15 deletions(-) diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index b1201ba5bf551..8488f2aa99b83 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -600,8 +600,8 @@ public class PhoneWindowManager implements WindowManagerPolicy { // What we do when the user double-taps on home private int mDoubleTapOnHomeBehavior; - // Whether to lock the device after the next app transition has finished. - boolean mLockAfterAppTransitionFinished; + // Whether to lock the device after the next dreaming transition has finished. + private boolean mLockAfterDreamingTransitionFinished; // Allowed theater mode wake actions private boolean mAllowTheaterModeWakeFromKey; @@ -1104,7 +1104,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { synchronized (mLock) { // If the setting to lock instantly on power button press is true, then set the flag to // lock after the dream transition has finished. - mLockAfterAppTransitionFinished = + mLockAfterDreamingTransitionFinished = mLockPatternUtils.getPowerButtonInstantlyLocks(mCurrentUserId); } @@ -2253,20 +2253,22 @@ public class PhoneWindowManager implements WindowManagerPolicy { true /* notifyOccluded */); synchronized (mLock) { - mLockAfterAppTransitionFinished = false; + mLockAfterDreamingTransitionFinished = false; } } @Override public void onAppTransitionFinishedLocked(IBinder token) { synchronized (mLock) { - if (!mLockAfterAppTransitionFinished) { - return; + final DreamManagerInternal dreamManagerInternal = getDreamManagerInternal(); + // check both isDreaming and mLockAfterDreamingTransitionFinished before lockNow + // so it won't relock after dreaming has stopped + if (dreamManagerInternal != null && dreamManagerInternal.isDreaming() + && mLockAfterDreamingTransitionFinished) { + lockNow(null); } - mLockAfterAppTransitionFinished = false; + mLockAfterDreamingTransitionFinished = false; } - - lockNow(null); } }); diff --git a/services/tests/wmtests/src/com/android/server/policy/PowerKeyGestureTests.java b/services/tests/wmtests/src/com/android/server/policy/PowerKeyGestureTests.java index 5863e9d9243a1..6a9f283c9c4c4 100644 --- a/services/tests/wmtests/src/com/android/server/policy/PowerKeyGestureTests.java +++ b/services/tests/wmtests/src/com/android/server/policy/PowerKeyGestureTests.java @@ -58,9 +58,20 @@ public class PowerKeyGestureTests extends ShortcutKeyTestBase { mPhoneWindowManager.overrideCanStartDreaming(true); sendKey(KEYCODE_POWER); mPhoneWindowManager.assertDreamRequest(); + mPhoneWindowManager.overrideIsDreaming(true); mPhoneWindowManager.assertLockedAfterAppTransitionFinished(); } + @Test + public void testAppTransitionFinishedCalledAfterDreamStoppedWillNotLockAgain() { + mPhoneWindowManager.overrideShortPressOnPower(SHORT_PRESS_POWER_DREAM_OR_SLEEP); + mPhoneWindowManager.overrideCanStartDreaming(true); + sendKey(KEYCODE_POWER); + mPhoneWindowManager.assertDreamRequest(); + mPhoneWindowManager.overrideIsDreaming(false); + mPhoneWindowManager.assertDidNotLockAfterAppTransitionFinished(); + } + /** * Power double-press to launch camera does not lock device when the single press behavior is to * dream. @@ -72,7 +83,7 @@ public class PowerKeyGestureTests extends ShortcutKeyTestBase { sendKey(KEYCODE_POWER); sendKey(KEYCODE_POWER); mPhoneWindowManager.assertCameraLaunch(); - mPhoneWindowManager.assertWillNotLockAfterAppTransitionFinished(); + mPhoneWindowManager.assertDidNotLockAfterAppTransitionFinished(); } /** diff --git a/services/tests/wmtests/src/com/android/server/policy/TestPhoneWindowManager.java b/services/tests/wmtests/src/com/android/server/policy/TestPhoneWindowManager.java index af48cbd616ac0..766a88f6476cc 100644 --- a/services/tests/wmtests/src/com/android/server/policy/TestPhoneWindowManager.java +++ b/services/tests/wmtests/src/com/android/server/policy/TestPhoneWindowManager.java @@ -65,6 +65,7 @@ import android.hardware.display.DisplayManagerInternal; import android.media.AudioManagerInternal; import android.os.Handler; import android.os.HandlerThread; +import android.os.IBinder; import android.os.PowerManager; import android.os.PowerManagerInternal; import android.os.RemoteException; @@ -344,6 +345,10 @@ class TestPhoneWindowManager { doReturn(canDream).when(mDreamManagerInternal).canStartDreaming(anyBoolean()); } + void overrideIsDreaming(boolean isDreaming) { + doReturn(isDreaming).when(mDreamManagerInternal).isDreaming(); + } + void overrideDisplayState(int state) { doReturn(state).when(mDisplay).getState(); doReturn(state == STATE_ON).when(mDisplayPolicy).isAwake(); @@ -520,19 +525,26 @@ class TestPhoneWindowManager { verify(mInputManagerInternal).toggleCapsLock(anyInt()); } - void assertWillNotLockAfterAppTransitionFinished() { - Assert.assertFalse(mPhoneWindowManager.mLockAfterAppTransitionFinished); - } - void assertLockedAfterAppTransitionFinished() { ArgumentCaptor transitionCaptor = ArgumentCaptor.forClass(AppTransitionListener.class); verify(mWindowManagerInternal).registerAppTransitionListener( transitionCaptor.capture()); - transitionCaptor.getValue().onAppTransitionFinishedLocked(any()); + final IBinder token = mock(IBinder.class); + transitionCaptor.getValue().onAppTransitionFinishedLocked(token); verify(mPhoneWindowManager).lockNow(null); } + void assertDidNotLockAfterAppTransitionFinished() { + ArgumentCaptor transitionCaptor = + ArgumentCaptor.forClass(AppTransitionListener.class); + verify(mWindowManagerInternal).registerAppTransitionListener( + transitionCaptor.capture()); + final IBinder token = mock(IBinder.class); + transitionCaptor.getValue().onAppTransitionFinishedLocked(token); + verify(mPhoneWindowManager, never()).lockNow(null); + } + void assertGoToHomescreen() { waitForIdle(); verify(mPhoneWindowManager).launchHomeFromHotKey(anyInt());