From 21e9f2b2dbb0d01fc53a576a72f02809eab9736d Mon Sep 17 00:00:00 2001 From: Santos Cordon Date: Wed, 13 Sep 2017 11:59:39 -0700 Subject: [PATCH] Move VR Display Policy check to after wakefulness. Being in VR was preventing sleep and doze functionalities to function. Sleep and doze is what commonly happens when the user hits power button and without this fix hitting the power button resulted in PowerManager not turning off the display. Bug: 65635259 Test: Manual. Ensure that hitting power button while in 2D-in-VR turns screen off on smartphones. Test: runtest --path frameworks/base/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java Change-Id: If3a14a5a423b0394926b323b97ed11b98177e43b --- .../server/power/PowerManagerService.java | 30 ++++++++++++----- .../server/power/PowerManagerServiceTest.java | 33 +++++++++++++++++++ 2 files changed, 54 insertions(+), 9 deletions(-) diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java index 0c72326095a68..be44607658d03 100644 --- a/services/core/java/com/android/server/power/PowerManagerService.java +++ b/services/core/java/com/android/server/power/PowerManagerService.java @@ -120,7 +120,7 @@ public final class PowerManagerService extends SystemService implements Watchdog.Monitor { private static final String TAG = "PowerManagerService"; - private static final boolean DEBUG = false; + private static final boolean DEBUG = true; private static final boolean DEBUG_SPEW = DEBUG && true; // Message: Sent when a user activity timeout occurs to update the power state. @@ -1569,12 +1569,15 @@ public final class PowerManagerService extends SystemService return true; } - private void setWakefulnessLocked(int wakefulness, int reason) { + @VisibleForTesting + void setWakefulnessLocked(int wakefulness, int reason) { if (mWakefulness != wakefulness) { mWakefulness = wakefulness; mWakefulnessChanging = true; mDirty |= DIRTY_WAKEFULNESS; - mNotifier.onWakefulnessChangeStarted(wakefulness, reason); + if (mNotifier != null) { + mNotifier.onWakefulnessChangeStarted(wakefulness, reason); + } } } @@ -2432,11 +2435,8 @@ public final class PowerManagerService extends SystemService return value >= -1.0f && value <= 1.0f; } - private int getDesiredScreenPolicyLocked() { - if (mIsVrModeEnabled) { - return DisplayPowerRequest.POLICY_VR; - } - + @VisibleForTesting + int getDesiredScreenPolicyLocked() { if (mWakefulness == WAKEFULNESS_ASLEEP || sQuiescent) { return DisplayPowerRequest.POLICY_OFF; } @@ -2452,6 +2452,13 @@ public final class PowerManagerService extends SystemService // doze after screen off. This causes the screen off transition to be skipped. } + // It is important that POLICY_VR check happens after the wakefulness checks above so + // that VR-mode does not prevent displays from transitioning to the correct state when + // dozing or sleeping. + if (mIsVrModeEnabled) { + return DisplayPowerRequest.POLICY_VR; + } + if ((mWakeLockSummary & WAKE_LOCK_SCREEN_BRIGHT) != 0 || (mUserActivitySummary & USER_ACTIVITY_SCREEN_BRIGHT) != 0 || !mBootCompleted @@ -3113,6 +3120,11 @@ public final class PowerManagerService extends SystemService } } + @VisibleForTesting + void setVrModeEnabled(boolean enabled) { + mIsVrModeEnabled = enabled; + } + private void powerHintInternal(int hintId, int data) { nativeSendPowerHint(hintId, data); } @@ -3810,7 +3822,7 @@ public final class PowerManagerService extends SystemService synchronized (mLock) { if (mIsVrModeEnabled != enabled) { - mIsVrModeEnabled = enabled; + setVrModeEnabled(enabled); mDirty |= DIRTY_VR_MODE_CHANGED; updatePowerStateLocked(); } diff --git a/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java index d12c07a84004b..7c31e8082606d 100644 --- a/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java @@ -32,6 +32,10 @@ import org.junit.rules.TemporaryFolder; import org.mockito.Mock; import org.mockito.MockitoAnnotations; +import static android.os.PowerManagerInternal.WAKEFULNESS_ASLEEP; +import static android.os.PowerManagerInternal.WAKEFULNESS_AWAKE; +import static android.os.PowerManagerInternal.WAKEFULNESS_DOZING; +import static android.os.PowerManagerInternal.WAKEFULNESS_DREAMING; import static com.google.common.truth.Truth.assertThat; import static org.mockito.Matchers.anyBoolean; import static org.mockito.Matchers.eq; @@ -92,4 +96,33 @@ public class PowerManagerServiceTest extends AndroidTestCase { int reason = mService.getLastShutdownReasonInternal(mTempReason); assertThat(reason).isEqualTo(PowerManager.SHUTDOWN_REASON_THERMAL_SHUTDOWN); } + + @SmallTest + public void testGetDesiredScreenPolicy_WithVR() throws Exception { + // Brighten up the screen + mService.setWakefulnessLocked(WAKEFULNESS_AWAKE, 0); + assertThat(mService.getDesiredScreenPolicyLocked()).isEqualTo( + DisplayPowerRequest.POLICY_BRIGHT); + + // Move to VR + mService.setVrModeEnabled(true); + assertThat(mService.getDesiredScreenPolicyLocked()).isEqualTo( + DisplayPowerRequest.POLICY_VR); + + // Then take a nap + mService.setWakefulnessLocked(WAKEFULNESS_ASLEEP, 0); + assertThat(mService.getDesiredScreenPolicyLocked()).isEqualTo( + DisplayPowerRequest.POLICY_OFF); + + // Wake up to VR + mService.setWakefulnessLocked(WAKEFULNESS_AWAKE, 0); + assertThat(mService.getDesiredScreenPolicyLocked()).isEqualTo( + DisplayPowerRequest.POLICY_VR); + + // And back to normal + mService.setVrModeEnabled(false); + assertThat(mService.getDesiredScreenPolicyLocked()).isEqualTo( + DisplayPowerRequest.POLICY_BRIGHT); + + } }