Loading services/core/java/com/android/server/policy/PhoneWindowManager.java +12 −14 Original line number Diff line number Diff line Loading @@ -1141,9 +1141,9 @@ public class PhoneWindowManager implements WindowManagerPolicy { + mShortPressOnPowerBehavior); if (count == 2) { powerMultiPressAction(displayId, eventTime, interactive, mDoublePressOnPowerBehavior); powerMultiPressAction(eventTime, interactive, mDoublePressOnPowerBehavior); } else if (count == 3) { powerMultiPressAction(displayId, eventTime, interactive, mTriplePressOnPowerBehavior); powerMultiPressAction(eventTime, interactive, mTriplePressOnPowerBehavior); } else if (count > 3 && count <= getMaxMultiPressPowerCount()) { Slog.d(TAG, "No behavior defined for power press count " + count); } else if (count == 1 && shouldHandleShortPressPowerAction(interactive, eventTime)) { Loading Loading @@ -1307,8 +1307,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { } } private void powerMultiPressAction(int displayId, long eventTime, boolean interactive, int behavior) { private void powerMultiPressAction(long eventTime, boolean interactive, int behavior) { switch (behavior) { case MULTI_PRESS_POWER_NOTHING: break; Loading @@ -1323,7 +1322,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.THEATER_MODE_ON, 0); if (!interactive) { wakeUpFromWakeKey(displayId, eventTime, KEYCODE_POWER, /* isDown= */ false); wakeUpFromWakeKey(eventTime, KEYCODE_POWER, /* isDown= */ false); } } else { Slog.i(TAG, "Toggling theater mode on."); Loading @@ -1339,7 +1338,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { case MULTI_PRESS_POWER_BRIGHTNESS_BOOST: Slog.i(TAG, "Starting brightness boost."); if (!interactive) { wakeUpFromWakeKey(displayId, eventTime, KEYCODE_POWER, /* isDown= */ false); wakeUpFromWakeKey(eventTime, KEYCODE_POWER, /* isDown= */ false); } mPowerManager.boostScreenBrightness(eventTime); break; Loading Loading @@ -5547,7 +5546,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { if (mRequestedOrSleepingDefaultDisplay) { mCameraGestureTriggeredDuringGoingToSleep = true; // Wake device up early to prevent display doing redundant turning off/on stuff. mWindowWakeUpPolicy.wakeUpFromPowerKeyCameraGesture(event.getDisplayId()); mWindowWakeUpPolicy.wakeUpFromPowerKeyCameraGesture(); } return true; } Loading Loading @@ -5645,8 +5644,8 @@ public class PhoneWindowManager implements WindowManagerPolicy { public int interceptMotionBeforeQueueingNonInteractive(int displayId, int source, int action, long whenNanos, int policyFlags) { if ((policyFlags & FLAG_WAKE) != 0) { if (mWindowWakeUpPolicy.wakeUpFromMotion(displayId, whenNanos / 1000000, source, action == MotionEvent.ACTION_DOWN)) { if (mWindowWakeUpPolicy.wakeUpFromMotion( whenNanos / 1000000, source, action == MotionEvent.ACTION_DOWN)) { // Woke up. Pass motion events to user. return ACTION_PASS_TO_USER; } Loading @@ -5660,8 +5659,8 @@ public class PhoneWindowManager implements WindowManagerPolicy { // there will be no dream to intercept the touch and wake into ambient. The device should // wake up in this case. if (isTheaterModeEnabled() && (policyFlags & FLAG_WAKE) != 0) { if (mWindowWakeUpPolicy.wakeUpFromMotion(displayId, whenNanos / 1000000, source, action == MotionEvent.ACTION_DOWN)) { if (mWindowWakeUpPolicy.wakeUpFromMotion( whenNanos / 1000000, source, action == MotionEvent.ACTION_DOWN)) { // Woke up. Pass motion events to user. return ACTION_PASS_TO_USER; } Loading Loading @@ -6003,14 +6002,13 @@ public class PhoneWindowManager implements WindowManagerPolicy { return; } wakeUpFromWakeKey( event.getDisplayId(), event.getEventTime(), event.getKeyCode(), event.getAction() == KeyEvent.ACTION_DOWN); } private void wakeUpFromWakeKey(int displayId, long eventTime, int keyCode, boolean isDown) { if (mWindowWakeUpPolicy.wakeUpFromKey(displayId, eventTime, keyCode, isDown)) { private void wakeUpFromWakeKey(long eventTime, int keyCode, boolean isDown) { if (mWindowWakeUpPolicy.wakeUpFromKey(eventTime, keyCode, isDown)) { final boolean keyCanLaunchHome = keyCode == KEYCODE_HOME || keyCode == KEYCODE_POWER; // Start HOME with "reason" extra if sleeping for more than mWakeUpToLastStateTimeout if (shouldWakeUpWithHomeIntent() && keyCanLaunchHome) { Loading services/core/java/com/android/server/policy/WindowWakeUpPolicy.java +10 −20 Original line number Diff line number Diff line Loading @@ -25,7 +25,6 @@ import static android.os.PowerManager.WAKE_REASON_WAKE_MOTION; import static android.view.KeyEvent.KEYCODE_POWER; import static com.android.server.policy.Flags.supportInputWakeupDelegate; import static com.android.server.power.feature.flags.Flags.perDisplayWakeByTouch; import android.annotation.Nullable; import android.content.Context; Loading Loading @@ -108,14 +107,13 @@ class WindowWakeUpPolicy { /** * Wakes up from a key event. * * @param displayId the id of the display to wake. * @param eventTime the timestamp of the event in {@link SystemClock#uptimeMillis()}. * @param keyCode the {@link android.view.KeyEvent} key code of the key event. * @param isDown {@code true} if the event's action is {@link KeyEvent#ACTION_DOWN}. * @return {@code true} if the policy allows the requested wake up and the request has been * executed; {@code false} otherwise. */ boolean wakeUpFromKey(int displayId, long eventTime, int keyCode, boolean isDown) { boolean wakeUpFromKey(long eventTime, int keyCode, boolean isDown) { final boolean wakeAllowedDuringTheaterMode = keyCode == KEYCODE_POWER ? mAllowTheaterModeWakeFromPowerKey Loading @@ -129,7 +127,6 @@ class WindowWakeUpPolicy { return true; } wakeUp( displayId, eventTime, keyCode == KEYCODE_POWER ? WAKE_REASON_POWER_BUTTON : WAKE_REASON_WAKE_KEY, keyCode == KEYCODE_POWER ? "POWER" : "KEY"); Loading @@ -139,13 +136,12 @@ class WindowWakeUpPolicy { /** * Wakes up from a motion event. * * @param displayId the id of the display to wake. * @param eventTime the timestamp of the event in {@link SystemClock#uptimeMillis()}. * @param isDown {@code true} if the event's action is {@link MotionEvent#ACTION_DOWN}. * @return {@code true} if the policy allows the requested wake up and the request has been * executed; {@code false} otherwise. */ boolean wakeUpFromMotion(int displayId, long eventTime, int source, boolean isDown) { boolean wakeUpFromMotion(long eventTime, int source, boolean isDown) { if (!canWakeUp(mAllowTheaterModeWakeFromMotion)) { if (DEBUG) Slog.d(TAG, "Unable to wake up from motion."); return false; Loading @@ -154,7 +150,7 @@ class WindowWakeUpPolicy { && mInputWakeUpDelegate.wakeUpFromMotion(eventTime, source, isDown)) { return true; } wakeUp(displayId, eventTime, WAKE_REASON_WAKE_MOTION, "MOTION"); wakeUp(eventTime, WAKE_REASON_WAKE_MOTION, "MOTION"); return true; } Loading @@ -170,7 +166,7 @@ class WindowWakeUpPolicy { if (DEBUG) Slog.d(TAG, "Unable to wake up from camera cover."); return false; } wakeUp(Display.DEFAULT_DISPLAY, eventTime, WAKE_REASON_CAMERA_LAUNCH, "CAMERA_COVER"); wakeUp(eventTime, WAKE_REASON_CAMERA_LAUNCH, "CAMERA_COVER"); return true; } Loading @@ -185,24 +181,22 @@ class WindowWakeUpPolicy { if (DEBUG) Slog.d(TAG, "Unable to wake up from lid."); return false; } wakeUp(Display.DEFAULT_DISPLAY, mClock.uptimeMillis(), WAKE_REASON_LID, "LID"); wakeUp(mClock.uptimeMillis(), WAKE_REASON_LID, "LID"); return true; } /** * Wakes up to prevent sleeping when opening camera through power button. * * @param displayId the id of the display to wake. * @return {@code true} if the policy allows the requested wake up and the request has been * executed; {@code false} otherwise. */ boolean wakeUpFromPowerKeyCameraGesture(int displayId) { boolean wakeUpFromPowerKeyCameraGesture() { if (!canWakeUp(mAllowTheaterModeWakeFromPowerKey)) { if (DEBUG) Slog.d(TAG, "Unable to wake up from power key camera gesture."); return false; } wakeUp(displayId, mClock.uptimeMillis(), WAKE_REASON_CAMERA_LAUNCH, "CAMERA_GESTURE_PREVENT_LOCK"); wakeUp(mClock.uptimeMillis(), WAKE_REASON_CAMERA_LAUNCH, "CAMERA_GESTURE_PREVENT_LOCK"); return true; } Loading @@ -217,7 +211,7 @@ class WindowWakeUpPolicy { if (DEBUG) Slog.d(TAG, "Unable to wake up from gesture."); return false; } wakeUp(Display.DEFAULT_DISPLAY, mClock.uptimeMillis(), WAKE_REASON_GESTURE, "GESTURE"); wakeUp(mClock.uptimeMillis(), WAKE_REASON_GESTURE, "GESTURE"); return true; } Loading @@ -240,11 +234,7 @@ class WindowWakeUpPolicy { } /** Wakes up {@link PowerManager}. */ private void wakeUp(int displayId, long wakeTime, @WakeReason int reason, String details) { if (perDisplayWakeByTouch()) { mPowerManager.wakeUp(wakeTime, reason, "android.policy:" + details, displayId); } else { private void wakeUp(long wakeTime, @WakeReason int reason, String details) { mPowerManager.wakeUp(wakeTime, reason, "android.policy:" + details); } } } services/tests/wmtests/src/com/android/server/policy/TestPhoneWindowManager.java +1 −1 Original line number Diff line number Diff line Loading @@ -700,7 +700,7 @@ class TestPhoneWindowManager { void assertPowerWakeUp() { mTestLooper.dispatchAll(); verify(mWindowWakeUpPolicy) .wakeUpFromKey(anyInt(), anyLong(), eq(KeyEvent.KEYCODE_POWER), anyBoolean()); .wakeUpFromKey(anyLong(), eq(KeyEvent.KEYCODE_POWER), anyBoolean()); } void assertNoPowerSleep() { Loading services/tests/wmtests/src/com/android/server/policy/WindowWakeUpPolicyTests.java +12 −70 Original line number Diff line number Diff line Loading @@ -35,7 +35,6 @@ import static com.android.internal.R.bool.config_allowTheaterModeWakeFromCameraL import static com.android.internal.R.bool.config_allowTheaterModeWakeFromLidSwitch; import static com.android.internal.R.bool.config_allowTheaterModeWakeFromGesture; import static com.android.server.policy.Flags.FLAG_SUPPORT_INPUT_WAKEUP_DELEGATE; import static com.android.server.power.feature.flags.Flags.FLAG_PER_DISPLAY_WAKE_BY_TOUCH; import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertWithMessage; Loading @@ -44,7 +43,6 @@ import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; Loading @@ -54,8 +52,6 @@ import android.content.Context; import android.content.ContextWrapper; import android.content.res.Resources; import android.os.PowerManager; import android.platform.test.annotations.DisableFlags; import android.platform.test.annotations.EnableFlags; import android.platform.test.flag.junit.SetFlagsRule; import android.provider.Settings; import android.view.Display; Loading Loading @@ -129,7 +125,6 @@ public final class WindowWakeUpPolicyTests { } @Test @DisableFlags({FLAG_PER_DISPLAY_WAKE_BY_TOUCH}) public void testMotionWakeUpDelegation_wakePowerManagerIfDelegateDoesNotHandleWake() { setTheaterModeEnabled(false); mSetFlagsRule.enableFlags(FLAG_SUPPORT_INPUT_WAKEUP_DELEGATE); Loading @@ -141,8 +136,7 @@ public final class WindowWakeUpPolicyTests { // Verify the policy wake up call succeeds because of the call on the delegate, and not // because of a PowerManager wake up. assertThat(mPolicy.wakeUpFromMotion( mDefaultDisplay.getDisplayId(), 200, SOURCE_TOUCHSCREEN, true)).isTrue(); assertThat(mPolicy.wakeUpFromMotion(200, SOURCE_TOUCHSCREEN, true)).isTrue(); verify(mInputWakeUpDelegate).wakeUpFromMotion(200, SOURCE_TOUCHSCREEN, true); verifyNoPowerManagerWakeUp(); Loading @@ -150,14 +144,12 @@ public final class WindowWakeUpPolicyTests { // Verify the policy wake up call succeeds because of the PowerManager wake up, since the // delegate would not handle the wake up request. assertThat(mPolicy.wakeUpFromMotion( mDefaultDisplay.getDisplayId(), 300, SOURCE_ROTARY_ENCODER, false)).isTrue(); assertThat(mPolicy.wakeUpFromMotion(300, SOURCE_ROTARY_ENCODER, false)).isTrue(); verify(mInputWakeUpDelegate).wakeUpFromMotion(300, SOURCE_ROTARY_ENCODER, false); verify(mPowerManager).wakeUp(300, WAKE_REASON_WAKE_MOTION, "android.policy:MOTION"); } @Test @DisableFlags({FLAG_PER_DISPLAY_WAKE_BY_TOUCH}) public void testKeyWakeUpDelegation_wakePowerManagerIfDelegateDoesNotHandleWake() { setTheaterModeEnabled(false); mSetFlagsRule.enableFlags(FLAG_SUPPORT_INPUT_WAKEUP_DELEGATE); Loading @@ -169,8 +161,7 @@ public final class WindowWakeUpPolicyTests { // Verify the policy wake up call succeeds because of the call on the delegate, and not // because of a PowerManager wake up. assertThat(mPolicy.wakeUpFromKey( mDefaultDisplay.getDisplayId(), 200, KEYCODE_POWER, true)).isTrue(); assertThat(mPolicy.wakeUpFromKey(200, KEYCODE_POWER, true)).isTrue(); verify(mInputWakeUpDelegate).wakeUpFromKey(200, KEYCODE_POWER, true); verifyNoPowerManagerWakeUp(); Loading @@ -178,8 +169,7 @@ public final class WindowWakeUpPolicyTests { // Verify the policy wake up call succeeds because of the PowerManager wake up, since the // delegate would not handle the wake up request. assertThat(mPolicy.wakeUpFromKey( mDefaultDisplay.getDisplayId(), 300, KEYCODE_STEM_PRIMARY, false)).isTrue(); assertThat(mPolicy.wakeUpFromKey(300, KEYCODE_STEM_PRIMARY, false)).isTrue(); verify(mInputWakeUpDelegate).wakeUpFromKey(300, KEYCODE_STEM_PRIMARY, false); verify(mPowerManager).wakeUp(300, WAKE_REASON_WAKE_KEY, "android.policy:KEY"); } Loading @@ -196,8 +186,7 @@ public final class WindowWakeUpPolicyTests { .setInputWakeUpDelegate(mInputWakeUpDelegate); // Check that the wake up does not happen because the theater mode policy check fails. assertThat(mPolicy.wakeUpFromKey( mDefaultDisplay.getDisplayId(), 200, KEYCODE_POWER, true)).isFalse(); assertThat(mPolicy.wakeUpFromKey(200, KEYCODE_POWER, true)).isFalse(); verify(mInputWakeUpDelegate, never()).wakeUpFromKey(anyLong(), anyInt(), anyBoolean()); } Loading @@ -212,13 +201,11 @@ public final class WindowWakeUpPolicyTests { .setInputWakeUpDelegate(mInputWakeUpDelegate); // Check that the wake up does not happen because the theater mode policy check fails. assertThat(mPolicy.wakeUpFromMotion( mDefaultDisplay.getDisplayId(), 200, SOURCE_TOUCHSCREEN, true)).isFalse(); assertThat(mPolicy.wakeUpFromMotion(200, SOURCE_TOUCHSCREEN, true)).isFalse(); verify(mInputWakeUpDelegate, never()).wakeUpFromMotion(anyLong(), anyInt(), anyBoolean()); } @Test @DisableFlags({FLAG_PER_DISPLAY_WAKE_BY_TOUCH}) public void testTheaterModeChecksNotAppliedWhenScreenIsOn() { mSetFlagsRule.enableFlags(FLAG_SUPPORT_INPUT_WAKEUP_DELEGATE); setDefaultDisplayState(Display.STATE_ON); Loading @@ -226,69 +213,30 @@ public final class WindowWakeUpPolicyTests { setBooleanRes(config_allowTheaterModeWakeFromMotion, false); mPolicy = new WindowWakeUpPolicy(mContextSpy, mClock); mPolicy.wakeUpFromMotion(mDefaultDisplay.getDisplayId(), 200L, SOURCE_TOUCHSCREEN, true); mPolicy.wakeUpFromMotion(200L, SOURCE_TOUCHSCREEN, true); verify(mPowerManager).wakeUp(200L, WAKE_REASON_WAKE_MOTION, "android.policy:MOTION"); } @Test @DisableFlags({FLAG_PER_DISPLAY_WAKE_BY_TOUCH}) public void testWakeUpFromMotion() { runPowerManagerUpChecks( () -> mPolicy.wakeUpFromMotion(mDefaultDisplay.getDisplayId(), mClock.uptimeMillis(), SOURCE_TOUCHSCREEN, true), () -> mPolicy.wakeUpFromMotion(mClock.uptimeMillis(), SOURCE_TOUCHSCREEN, true), config_allowTheaterModeWakeFromMotion, WAKE_REASON_WAKE_MOTION, "android.policy:MOTION"); } @Test @EnableFlags({FLAG_PER_DISPLAY_WAKE_BY_TOUCH}) public void testWakeUpFromMotion_perDisplayWakeByTouchEnabled() { setTheaterModeEnabled(false); final int displayId = 555; mPolicy = new WindowWakeUpPolicy(mContextSpy, mClock); boolean displayWokeUp = mPolicy.wakeUpFromMotion( displayId, mClock.uptimeMillis(), SOURCE_TOUCHSCREEN, /* isDown= */ true); // Verify that display is woken up assertThat(displayWokeUp).isTrue(); verify(mPowerManager).wakeUp(anyLong(), eq(WAKE_REASON_WAKE_MOTION), eq("android.policy:MOTION"), eq(displayId)); } @Test @DisableFlags({FLAG_PER_DISPLAY_WAKE_BY_TOUCH}) public void testWakeUpFromMotion_perDisplayWakeByTouchDisabled() { setTheaterModeEnabled(false); final int displayId = 555; mPolicy = new WindowWakeUpPolicy(mContextSpy, mClock); boolean displayWokeUp = mPolicy.wakeUpFromMotion( displayId, mClock.uptimeMillis(), SOURCE_TOUCHSCREEN, /* isDown= */ true); // Verify that power is woken up and display isn't woken up individually assertThat(displayWokeUp).isTrue(); verify(mPowerManager).wakeUp( anyLong(), eq(WAKE_REASON_WAKE_MOTION), eq("android.policy:MOTION")); verify(mPowerManager, never()).wakeUp(anyLong(), eq(WAKE_REASON_WAKE_MOTION), eq("android.policy:MOTION"), eq(displayId)); } @Test @DisableFlags({FLAG_PER_DISPLAY_WAKE_BY_TOUCH}) public void testWakeUpFromKey_nonPowerKey() { runPowerManagerUpChecks( () -> mPolicy.wakeUpFromKey( mDefaultDisplay.getDisplayId(), mClock.uptimeMillis(), KEYCODE_HOME, true), () -> mPolicy.wakeUpFromKey(mClock.uptimeMillis(), KEYCODE_HOME, true), config_allowTheaterModeWakeFromKey, WAKE_REASON_WAKE_KEY, "android.policy:KEY"); } @Test @DisableFlags({FLAG_PER_DISPLAY_WAKE_BY_TOUCH}) public void testWakeUpFromKey_powerKey() { // Disable the resource affecting all wake keys because it affects power key as well. // That way, power key wake during theater mode will solely be controlled by Loading @@ -297,8 +245,7 @@ public final class WindowWakeUpPolicyTests { // Test with power key runPowerManagerUpChecks( () -> mPolicy.wakeUpFromKey( mDefaultDisplay.getDisplayId(), mClock.uptimeMillis(), KEYCODE_POWER, true), () -> mPolicy.wakeUpFromKey(mClock.uptimeMillis(), KEYCODE_POWER, true), config_allowTheaterModeWakeFromPowerKey, WAKE_REASON_POWER_BUTTON, "android.policy:POWER"); Loading @@ -307,15 +254,13 @@ public final class WindowWakeUpPolicyTests { // even if the power-key specific theater mode config is disabled. setBooleanRes(config_allowTheaterModeWakeFromPowerKey, false); runPowerManagerUpChecks( () -> mPolicy.wakeUpFromKey(mDefaultDisplay.getDisplayId(), mClock.uptimeMillis(), KEYCODE_POWER, false), () -> mPolicy.wakeUpFromKey(mClock.uptimeMillis(), KEYCODE_POWER, false), config_allowTheaterModeWakeFromKey, WAKE_REASON_POWER_BUTTON, "android.policy:POWER"); } @Test @DisableFlags({FLAG_PER_DISPLAY_WAKE_BY_TOUCH}) public void testWakeUpFromLid() { runPowerManagerUpChecks( () -> mPolicy.wakeUpFromLid(), Loading @@ -325,7 +270,6 @@ public final class WindowWakeUpPolicyTests { } @Test @DisableFlags({FLAG_PER_DISPLAY_WAKE_BY_TOUCH}) public void testWakeUpFromWakeGesture() { runPowerManagerUpChecks( () -> mPolicy.wakeUpFromWakeGesture(), Loading @@ -335,7 +279,6 @@ public final class WindowWakeUpPolicyTests { } @Test @DisableFlags({FLAG_PER_DISPLAY_WAKE_BY_TOUCH}) public void testwakeUpFromCameraCover() { runPowerManagerUpChecks( () -> mPolicy.wakeUpFromCameraCover(mClock.uptimeMillis()), Loading @@ -345,7 +288,6 @@ public final class WindowWakeUpPolicyTests { } @Test @DisableFlags({FLAG_PER_DISPLAY_WAKE_BY_TOUCH}) public void testWakeUpFromPowerKeyCameraGesture() { // Disable the resource affecting all wake keys because it affects power key as well. // That way, power key wake during theater mode will solely be controlled by Loading @@ -353,7 +295,7 @@ public final class WindowWakeUpPolicyTests { setBooleanRes(config_allowTheaterModeWakeFromKey, false); runPowerManagerUpChecks( () -> mPolicy.wakeUpFromPowerKeyCameraGesture(mDefaultDisplay.getDisplayId()), () -> mPolicy.wakeUpFromPowerKeyCameraGesture(), config_allowTheaterModeWakeFromPowerKey, WAKE_REASON_CAMERA_LAUNCH, "android.policy:CAMERA_GESTURE_PREVENT_LOCK"); Loading Loading
services/core/java/com/android/server/policy/PhoneWindowManager.java +12 −14 Original line number Diff line number Diff line Loading @@ -1141,9 +1141,9 @@ public class PhoneWindowManager implements WindowManagerPolicy { + mShortPressOnPowerBehavior); if (count == 2) { powerMultiPressAction(displayId, eventTime, interactive, mDoublePressOnPowerBehavior); powerMultiPressAction(eventTime, interactive, mDoublePressOnPowerBehavior); } else if (count == 3) { powerMultiPressAction(displayId, eventTime, interactive, mTriplePressOnPowerBehavior); powerMultiPressAction(eventTime, interactive, mTriplePressOnPowerBehavior); } else if (count > 3 && count <= getMaxMultiPressPowerCount()) { Slog.d(TAG, "No behavior defined for power press count " + count); } else if (count == 1 && shouldHandleShortPressPowerAction(interactive, eventTime)) { Loading Loading @@ -1307,8 +1307,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { } } private void powerMultiPressAction(int displayId, long eventTime, boolean interactive, int behavior) { private void powerMultiPressAction(long eventTime, boolean interactive, int behavior) { switch (behavior) { case MULTI_PRESS_POWER_NOTHING: break; Loading @@ -1323,7 +1322,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.THEATER_MODE_ON, 0); if (!interactive) { wakeUpFromWakeKey(displayId, eventTime, KEYCODE_POWER, /* isDown= */ false); wakeUpFromWakeKey(eventTime, KEYCODE_POWER, /* isDown= */ false); } } else { Slog.i(TAG, "Toggling theater mode on."); Loading @@ -1339,7 +1338,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { case MULTI_PRESS_POWER_BRIGHTNESS_BOOST: Slog.i(TAG, "Starting brightness boost."); if (!interactive) { wakeUpFromWakeKey(displayId, eventTime, KEYCODE_POWER, /* isDown= */ false); wakeUpFromWakeKey(eventTime, KEYCODE_POWER, /* isDown= */ false); } mPowerManager.boostScreenBrightness(eventTime); break; Loading Loading @@ -5547,7 +5546,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { if (mRequestedOrSleepingDefaultDisplay) { mCameraGestureTriggeredDuringGoingToSleep = true; // Wake device up early to prevent display doing redundant turning off/on stuff. mWindowWakeUpPolicy.wakeUpFromPowerKeyCameraGesture(event.getDisplayId()); mWindowWakeUpPolicy.wakeUpFromPowerKeyCameraGesture(); } return true; } Loading Loading @@ -5645,8 +5644,8 @@ public class PhoneWindowManager implements WindowManagerPolicy { public int interceptMotionBeforeQueueingNonInteractive(int displayId, int source, int action, long whenNanos, int policyFlags) { if ((policyFlags & FLAG_WAKE) != 0) { if (mWindowWakeUpPolicy.wakeUpFromMotion(displayId, whenNanos / 1000000, source, action == MotionEvent.ACTION_DOWN)) { if (mWindowWakeUpPolicy.wakeUpFromMotion( whenNanos / 1000000, source, action == MotionEvent.ACTION_DOWN)) { // Woke up. Pass motion events to user. return ACTION_PASS_TO_USER; } Loading @@ -5660,8 +5659,8 @@ public class PhoneWindowManager implements WindowManagerPolicy { // there will be no dream to intercept the touch and wake into ambient. The device should // wake up in this case. if (isTheaterModeEnabled() && (policyFlags & FLAG_WAKE) != 0) { if (mWindowWakeUpPolicy.wakeUpFromMotion(displayId, whenNanos / 1000000, source, action == MotionEvent.ACTION_DOWN)) { if (mWindowWakeUpPolicy.wakeUpFromMotion( whenNanos / 1000000, source, action == MotionEvent.ACTION_DOWN)) { // Woke up. Pass motion events to user. return ACTION_PASS_TO_USER; } Loading Loading @@ -6003,14 +6002,13 @@ public class PhoneWindowManager implements WindowManagerPolicy { return; } wakeUpFromWakeKey( event.getDisplayId(), event.getEventTime(), event.getKeyCode(), event.getAction() == KeyEvent.ACTION_DOWN); } private void wakeUpFromWakeKey(int displayId, long eventTime, int keyCode, boolean isDown) { if (mWindowWakeUpPolicy.wakeUpFromKey(displayId, eventTime, keyCode, isDown)) { private void wakeUpFromWakeKey(long eventTime, int keyCode, boolean isDown) { if (mWindowWakeUpPolicy.wakeUpFromKey(eventTime, keyCode, isDown)) { final boolean keyCanLaunchHome = keyCode == KEYCODE_HOME || keyCode == KEYCODE_POWER; // Start HOME with "reason" extra if sleeping for more than mWakeUpToLastStateTimeout if (shouldWakeUpWithHomeIntent() && keyCanLaunchHome) { Loading
services/core/java/com/android/server/policy/WindowWakeUpPolicy.java +10 −20 Original line number Diff line number Diff line Loading @@ -25,7 +25,6 @@ import static android.os.PowerManager.WAKE_REASON_WAKE_MOTION; import static android.view.KeyEvent.KEYCODE_POWER; import static com.android.server.policy.Flags.supportInputWakeupDelegate; import static com.android.server.power.feature.flags.Flags.perDisplayWakeByTouch; import android.annotation.Nullable; import android.content.Context; Loading Loading @@ -108,14 +107,13 @@ class WindowWakeUpPolicy { /** * Wakes up from a key event. * * @param displayId the id of the display to wake. * @param eventTime the timestamp of the event in {@link SystemClock#uptimeMillis()}. * @param keyCode the {@link android.view.KeyEvent} key code of the key event. * @param isDown {@code true} if the event's action is {@link KeyEvent#ACTION_DOWN}. * @return {@code true} if the policy allows the requested wake up and the request has been * executed; {@code false} otherwise. */ boolean wakeUpFromKey(int displayId, long eventTime, int keyCode, boolean isDown) { boolean wakeUpFromKey(long eventTime, int keyCode, boolean isDown) { final boolean wakeAllowedDuringTheaterMode = keyCode == KEYCODE_POWER ? mAllowTheaterModeWakeFromPowerKey Loading @@ -129,7 +127,6 @@ class WindowWakeUpPolicy { return true; } wakeUp( displayId, eventTime, keyCode == KEYCODE_POWER ? WAKE_REASON_POWER_BUTTON : WAKE_REASON_WAKE_KEY, keyCode == KEYCODE_POWER ? "POWER" : "KEY"); Loading @@ -139,13 +136,12 @@ class WindowWakeUpPolicy { /** * Wakes up from a motion event. * * @param displayId the id of the display to wake. * @param eventTime the timestamp of the event in {@link SystemClock#uptimeMillis()}. * @param isDown {@code true} if the event's action is {@link MotionEvent#ACTION_DOWN}. * @return {@code true} if the policy allows the requested wake up and the request has been * executed; {@code false} otherwise. */ boolean wakeUpFromMotion(int displayId, long eventTime, int source, boolean isDown) { boolean wakeUpFromMotion(long eventTime, int source, boolean isDown) { if (!canWakeUp(mAllowTheaterModeWakeFromMotion)) { if (DEBUG) Slog.d(TAG, "Unable to wake up from motion."); return false; Loading @@ -154,7 +150,7 @@ class WindowWakeUpPolicy { && mInputWakeUpDelegate.wakeUpFromMotion(eventTime, source, isDown)) { return true; } wakeUp(displayId, eventTime, WAKE_REASON_WAKE_MOTION, "MOTION"); wakeUp(eventTime, WAKE_REASON_WAKE_MOTION, "MOTION"); return true; } Loading @@ -170,7 +166,7 @@ class WindowWakeUpPolicy { if (DEBUG) Slog.d(TAG, "Unable to wake up from camera cover."); return false; } wakeUp(Display.DEFAULT_DISPLAY, eventTime, WAKE_REASON_CAMERA_LAUNCH, "CAMERA_COVER"); wakeUp(eventTime, WAKE_REASON_CAMERA_LAUNCH, "CAMERA_COVER"); return true; } Loading @@ -185,24 +181,22 @@ class WindowWakeUpPolicy { if (DEBUG) Slog.d(TAG, "Unable to wake up from lid."); return false; } wakeUp(Display.DEFAULT_DISPLAY, mClock.uptimeMillis(), WAKE_REASON_LID, "LID"); wakeUp(mClock.uptimeMillis(), WAKE_REASON_LID, "LID"); return true; } /** * Wakes up to prevent sleeping when opening camera through power button. * * @param displayId the id of the display to wake. * @return {@code true} if the policy allows the requested wake up and the request has been * executed; {@code false} otherwise. */ boolean wakeUpFromPowerKeyCameraGesture(int displayId) { boolean wakeUpFromPowerKeyCameraGesture() { if (!canWakeUp(mAllowTheaterModeWakeFromPowerKey)) { if (DEBUG) Slog.d(TAG, "Unable to wake up from power key camera gesture."); return false; } wakeUp(displayId, mClock.uptimeMillis(), WAKE_REASON_CAMERA_LAUNCH, "CAMERA_GESTURE_PREVENT_LOCK"); wakeUp(mClock.uptimeMillis(), WAKE_REASON_CAMERA_LAUNCH, "CAMERA_GESTURE_PREVENT_LOCK"); return true; } Loading @@ -217,7 +211,7 @@ class WindowWakeUpPolicy { if (DEBUG) Slog.d(TAG, "Unable to wake up from gesture."); return false; } wakeUp(Display.DEFAULT_DISPLAY, mClock.uptimeMillis(), WAKE_REASON_GESTURE, "GESTURE"); wakeUp(mClock.uptimeMillis(), WAKE_REASON_GESTURE, "GESTURE"); return true; } Loading @@ -240,11 +234,7 @@ class WindowWakeUpPolicy { } /** Wakes up {@link PowerManager}. */ private void wakeUp(int displayId, long wakeTime, @WakeReason int reason, String details) { if (perDisplayWakeByTouch()) { mPowerManager.wakeUp(wakeTime, reason, "android.policy:" + details, displayId); } else { private void wakeUp(long wakeTime, @WakeReason int reason, String details) { mPowerManager.wakeUp(wakeTime, reason, "android.policy:" + details); } } }
services/tests/wmtests/src/com/android/server/policy/TestPhoneWindowManager.java +1 −1 Original line number Diff line number Diff line Loading @@ -700,7 +700,7 @@ class TestPhoneWindowManager { void assertPowerWakeUp() { mTestLooper.dispatchAll(); verify(mWindowWakeUpPolicy) .wakeUpFromKey(anyInt(), anyLong(), eq(KeyEvent.KEYCODE_POWER), anyBoolean()); .wakeUpFromKey(anyLong(), eq(KeyEvent.KEYCODE_POWER), anyBoolean()); } void assertNoPowerSleep() { Loading
services/tests/wmtests/src/com/android/server/policy/WindowWakeUpPolicyTests.java +12 −70 Original line number Diff line number Diff line Loading @@ -35,7 +35,6 @@ import static com.android.internal.R.bool.config_allowTheaterModeWakeFromCameraL import static com.android.internal.R.bool.config_allowTheaterModeWakeFromLidSwitch; import static com.android.internal.R.bool.config_allowTheaterModeWakeFromGesture; import static com.android.server.policy.Flags.FLAG_SUPPORT_INPUT_WAKEUP_DELEGATE; import static com.android.server.power.feature.flags.Flags.FLAG_PER_DISPLAY_WAKE_BY_TOUCH; import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertWithMessage; Loading @@ -44,7 +43,6 @@ import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; Loading @@ -54,8 +52,6 @@ import android.content.Context; import android.content.ContextWrapper; import android.content.res.Resources; import android.os.PowerManager; import android.platform.test.annotations.DisableFlags; import android.platform.test.annotations.EnableFlags; import android.platform.test.flag.junit.SetFlagsRule; import android.provider.Settings; import android.view.Display; Loading Loading @@ -129,7 +125,6 @@ public final class WindowWakeUpPolicyTests { } @Test @DisableFlags({FLAG_PER_DISPLAY_WAKE_BY_TOUCH}) public void testMotionWakeUpDelegation_wakePowerManagerIfDelegateDoesNotHandleWake() { setTheaterModeEnabled(false); mSetFlagsRule.enableFlags(FLAG_SUPPORT_INPUT_WAKEUP_DELEGATE); Loading @@ -141,8 +136,7 @@ public final class WindowWakeUpPolicyTests { // Verify the policy wake up call succeeds because of the call on the delegate, and not // because of a PowerManager wake up. assertThat(mPolicy.wakeUpFromMotion( mDefaultDisplay.getDisplayId(), 200, SOURCE_TOUCHSCREEN, true)).isTrue(); assertThat(mPolicy.wakeUpFromMotion(200, SOURCE_TOUCHSCREEN, true)).isTrue(); verify(mInputWakeUpDelegate).wakeUpFromMotion(200, SOURCE_TOUCHSCREEN, true); verifyNoPowerManagerWakeUp(); Loading @@ -150,14 +144,12 @@ public final class WindowWakeUpPolicyTests { // Verify the policy wake up call succeeds because of the PowerManager wake up, since the // delegate would not handle the wake up request. assertThat(mPolicy.wakeUpFromMotion( mDefaultDisplay.getDisplayId(), 300, SOURCE_ROTARY_ENCODER, false)).isTrue(); assertThat(mPolicy.wakeUpFromMotion(300, SOURCE_ROTARY_ENCODER, false)).isTrue(); verify(mInputWakeUpDelegate).wakeUpFromMotion(300, SOURCE_ROTARY_ENCODER, false); verify(mPowerManager).wakeUp(300, WAKE_REASON_WAKE_MOTION, "android.policy:MOTION"); } @Test @DisableFlags({FLAG_PER_DISPLAY_WAKE_BY_TOUCH}) public void testKeyWakeUpDelegation_wakePowerManagerIfDelegateDoesNotHandleWake() { setTheaterModeEnabled(false); mSetFlagsRule.enableFlags(FLAG_SUPPORT_INPUT_WAKEUP_DELEGATE); Loading @@ -169,8 +161,7 @@ public final class WindowWakeUpPolicyTests { // Verify the policy wake up call succeeds because of the call on the delegate, and not // because of a PowerManager wake up. assertThat(mPolicy.wakeUpFromKey( mDefaultDisplay.getDisplayId(), 200, KEYCODE_POWER, true)).isTrue(); assertThat(mPolicy.wakeUpFromKey(200, KEYCODE_POWER, true)).isTrue(); verify(mInputWakeUpDelegate).wakeUpFromKey(200, KEYCODE_POWER, true); verifyNoPowerManagerWakeUp(); Loading @@ -178,8 +169,7 @@ public final class WindowWakeUpPolicyTests { // Verify the policy wake up call succeeds because of the PowerManager wake up, since the // delegate would not handle the wake up request. assertThat(mPolicy.wakeUpFromKey( mDefaultDisplay.getDisplayId(), 300, KEYCODE_STEM_PRIMARY, false)).isTrue(); assertThat(mPolicy.wakeUpFromKey(300, KEYCODE_STEM_PRIMARY, false)).isTrue(); verify(mInputWakeUpDelegate).wakeUpFromKey(300, KEYCODE_STEM_PRIMARY, false); verify(mPowerManager).wakeUp(300, WAKE_REASON_WAKE_KEY, "android.policy:KEY"); } Loading @@ -196,8 +186,7 @@ public final class WindowWakeUpPolicyTests { .setInputWakeUpDelegate(mInputWakeUpDelegate); // Check that the wake up does not happen because the theater mode policy check fails. assertThat(mPolicy.wakeUpFromKey( mDefaultDisplay.getDisplayId(), 200, KEYCODE_POWER, true)).isFalse(); assertThat(mPolicy.wakeUpFromKey(200, KEYCODE_POWER, true)).isFalse(); verify(mInputWakeUpDelegate, never()).wakeUpFromKey(anyLong(), anyInt(), anyBoolean()); } Loading @@ -212,13 +201,11 @@ public final class WindowWakeUpPolicyTests { .setInputWakeUpDelegate(mInputWakeUpDelegate); // Check that the wake up does not happen because the theater mode policy check fails. assertThat(mPolicy.wakeUpFromMotion( mDefaultDisplay.getDisplayId(), 200, SOURCE_TOUCHSCREEN, true)).isFalse(); assertThat(mPolicy.wakeUpFromMotion(200, SOURCE_TOUCHSCREEN, true)).isFalse(); verify(mInputWakeUpDelegate, never()).wakeUpFromMotion(anyLong(), anyInt(), anyBoolean()); } @Test @DisableFlags({FLAG_PER_DISPLAY_WAKE_BY_TOUCH}) public void testTheaterModeChecksNotAppliedWhenScreenIsOn() { mSetFlagsRule.enableFlags(FLAG_SUPPORT_INPUT_WAKEUP_DELEGATE); setDefaultDisplayState(Display.STATE_ON); Loading @@ -226,69 +213,30 @@ public final class WindowWakeUpPolicyTests { setBooleanRes(config_allowTheaterModeWakeFromMotion, false); mPolicy = new WindowWakeUpPolicy(mContextSpy, mClock); mPolicy.wakeUpFromMotion(mDefaultDisplay.getDisplayId(), 200L, SOURCE_TOUCHSCREEN, true); mPolicy.wakeUpFromMotion(200L, SOURCE_TOUCHSCREEN, true); verify(mPowerManager).wakeUp(200L, WAKE_REASON_WAKE_MOTION, "android.policy:MOTION"); } @Test @DisableFlags({FLAG_PER_DISPLAY_WAKE_BY_TOUCH}) public void testWakeUpFromMotion() { runPowerManagerUpChecks( () -> mPolicy.wakeUpFromMotion(mDefaultDisplay.getDisplayId(), mClock.uptimeMillis(), SOURCE_TOUCHSCREEN, true), () -> mPolicy.wakeUpFromMotion(mClock.uptimeMillis(), SOURCE_TOUCHSCREEN, true), config_allowTheaterModeWakeFromMotion, WAKE_REASON_WAKE_MOTION, "android.policy:MOTION"); } @Test @EnableFlags({FLAG_PER_DISPLAY_WAKE_BY_TOUCH}) public void testWakeUpFromMotion_perDisplayWakeByTouchEnabled() { setTheaterModeEnabled(false); final int displayId = 555; mPolicy = new WindowWakeUpPolicy(mContextSpy, mClock); boolean displayWokeUp = mPolicy.wakeUpFromMotion( displayId, mClock.uptimeMillis(), SOURCE_TOUCHSCREEN, /* isDown= */ true); // Verify that display is woken up assertThat(displayWokeUp).isTrue(); verify(mPowerManager).wakeUp(anyLong(), eq(WAKE_REASON_WAKE_MOTION), eq("android.policy:MOTION"), eq(displayId)); } @Test @DisableFlags({FLAG_PER_DISPLAY_WAKE_BY_TOUCH}) public void testWakeUpFromMotion_perDisplayWakeByTouchDisabled() { setTheaterModeEnabled(false); final int displayId = 555; mPolicy = new WindowWakeUpPolicy(mContextSpy, mClock); boolean displayWokeUp = mPolicy.wakeUpFromMotion( displayId, mClock.uptimeMillis(), SOURCE_TOUCHSCREEN, /* isDown= */ true); // Verify that power is woken up and display isn't woken up individually assertThat(displayWokeUp).isTrue(); verify(mPowerManager).wakeUp( anyLong(), eq(WAKE_REASON_WAKE_MOTION), eq("android.policy:MOTION")); verify(mPowerManager, never()).wakeUp(anyLong(), eq(WAKE_REASON_WAKE_MOTION), eq("android.policy:MOTION"), eq(displayId)); } @Test @DisableFlags({FLAG_PER_DISPLAY_WAKE_BY_TOUCH}) public void testWakeUpFromKey_nonPowerKey() { runPowerManagerUpChecks( () -> mPolicy.wakeUpFromKey( mDefaultDisplay.getDisplayId(), mClock.uptimeMillis(), KEYCODE_HOME, true), () -> mPolicy.wakeUpFromKey(mClock.uptimeMillis(), KEYCODE_HOME, true), config_allowTheaterModeWakeFromKey, WAKE_REASON_WAKE_KEY, "android.policy:KEY"); } @Test @DisableFlags({FLAG_PER_DISPLAY_WAKE_BY_TOUCH}) public void testWakeUpFromKey_powerKey() { // Disable the resource affecting all wake keys because it affects power key as well. // That way, power key wake during theater mode will solely be controlled by Loading @@ -297,8 +245,7 @@ public final class WindowWakeUpPolicyTests { // Test with power key runPowerManagerUpChecks( () -> mPolicy.wakeUpFromKey( mDefaultDisplay.getDisplayId(), mClock.uptimeMillis(), KEYCODE_POWER, true), () -> mPolicy.wakeUpFromKey(mClock.uptimeMillis(), KEYCODE_POWER, true), config_allowTheaterModeWakeFromPowerKey, WAKE_REASON_POWER_BUTTON, "android.policy:POWER"); Loading @@ -307,15 +254,13 @@ public final class WindowWakeUpPolicyTests { // even if the power-key specific theater mode config is disabled. setBooleanRes(config_allowTheaterModeWakeFromPowerKey, false); runPowerManagerUpChecks( () -> mPolicy.wakeUpFromKey(mDefaultDisplay.getDisplayId(), mClock.uptimeMillis(), KEYCODE_POWER, false), () -> mPolicy.wakeUpFromKey(mClock.uptimeMillis(), KEYCODE_POWER, false), config_allowTheaterModeWakeFromKey, WAKE_REASON_POWER_BUTTON, "android.policy:POWER"); } @Test @DisableFlags({FLAG_PER_DISPLAY_WAKE_BY_TOUCH}) public void testWakeUpFromLid() { runPowerManagerUpChecks( () -> mPolicy.wakeUpFromLid(), Loading @@ -325,7 +270,6 @@ public final class WindowWakeUpPolicyTests { } @Test @DisableFlags({FLAG_PER_DISPLAY_WAKE_BY_TOUCH}) public void testWakeUpFromWakeGesture() { runPowerManagerUpChecks( () -> mPolicy.wakeUpFromWakeGesture(), Loading @@ -335,7 +279,6 @@ public final class WindowWakeUpPolicyTests { } @Test @DisableFlags({FLAG_PER_DISPLAY_WAKE_BY_TOUCH}) public void testwakeUpFromCameraCover() { runPowerManagerUpChecks( () -> mPolicy.wakeUpFromCameraCover(mClock.uptimeMillis()), Loading @@ -345,7 +288,6 @@ public final class WindowWakeUpPolicyTests { } @Test @DisableFlags({FLAG_PER_DISPLAY_WAKE_BY_TOUCH}) public void testWakeUpFromPowerKeyCameraGesture() { // Disable the resource affecting all wake keys because it affects power key as well. // That way, power key wake during theater mode will solely be controlled by Loading @@ -353,7 +295,7 @@ public final class WindowWakeUpPolicyTests { setBooleanRes(config_allowTheaterModeWakeFromKey, false); runPowerManagerUpChecks( () -> mPolicy.wakeUpFromPowerKeyCameraGesture(mDefaultDisplay.getDisplayId()), () -> mPolicy.wakeUpFromPowerKeyCameraGesture(), config_allowTheaterModeWakeFromPowerKey, WAKE_REASON_CAMERA_LAUNCH, "android.policy:CAMERA_GESTURE_PREVENT_LOCK"); Loading