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:
@@ -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);
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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());
|
||||
|
||||
Reference in New Issue
Block a user