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
This commit is contained in:
Coco Duan
2023-06-08 17:13:19 +00:00
parent aa15d01120
commit 6102ee30e6
3 changed files with 40 additions and 15 deletions

View File

@@ -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);
}
});

View File

@@ -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();
}
/**

View File

@@ -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());