diff options
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 b1201ba5bf55..8488f2aa99b8 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 5863e9d9243a..6a9f283c9c4c 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 af48cbd616ac..766a88f6476c 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<AppTransitionListener> 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<AppTransitionListener> 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()); |