Loading services/core/java/com/android/server/policy/PhoneWindowManager.java +18 −10 Original line number Diff line number Diff line Loading @@ -445,6 +445,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { private final SparseArray<ScreenOnListener> mScreenOnListeners = new SparseArray<>(); Context mContext; Injector mInjector; WindowManagerFuncs mWindowManagerFuncs; WindowManagerInternal mWindowManagerInternal; PowerManager mPowerManager; Loading Loading @@ -1338,12 +1339,14 @@ public class PhoneWindowManager implements WindowManagerPolicy { final PowerManager.WakeData lastWakeUp = mPowerManagerInternal.getLastWakeup(); if (lastWakeUp != null && (lastWakeUp.wakeReason == PowerManager.WAKE_REASON_GESTURE || lastWakeUp.wakeReason == PowerManager.WAKE_REASON_LIFT || lastWakeUp.wakeReason == PowerManager.WAKE_REASON_BIOMETRIC)) { final long now = SystemClock.uptimeMillis(); || lastWakeUp.wakeReason == PowerManager.WAKE_REASON_BIOMETRIC || lastWakeUp.wakeReason == PowerManager.WAKE_REASON_TAP)) { final long now = mInjector.getUptimeMillis(); if (mPowerButtonSuppressionDelayMillis > 0 && (now < lastWakeUp.wakeTime + mPowerButtonSuppressionDelayMillis)) { Slog.i(TAG, "Sleep from power button suppressed. Time since gesture: " + (now - lastWakeUp.wakeTime) + "ms"); + (now - lastWakeUp.wakeTime) + "ms. Gesture: " + PowerManager.wakeReasonToString(lastWakeUp.wakeReason)); return false; } } Loading Loading @@ -1800,7 +1803,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { mGlobalActions.showDialog(keyguardShowing, isDeviceProvisioned()); // since it took two seconds of long press to bring this up, // poke the wake lock so they have some time to see the dialog. mPowerManager.userActivity(SystemClock.uptimeMillis(), false); mPowerManager.userActivity(mInjector.getUptimeMillis(), false); } private void cancelGlobalActionsAction() { Loading Loading @@ -2229,6 +2232,10 @@ public class PhoneWindowManager implements WindowManagerPolicy { WindowWakeUpPolicy getWindowWakeUpPolicy() { return new WindowWakeUpPolicy(mContext); } long getUptimeMillis() { return SystemClock.uptimeMillis(); } } /** {@inheritDoc} */ Loading @@ -2239,6 +2246,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { @VisibleForTesting void init(Injector injector) { mInjector = injector; mContext = injector.getContext(); mWindowManagerFuncs = injector.getWindowManagerFuncs(); mWindowManagerInternal = LocalServices.getService(WindowManagerInternal.class); Loading Loading @@ -3501,7 +3509,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { if (shouldLaunchAssist) { launchAssistAction( isPowerLongPress ? null : Intent.EXTRA_ASSIST_INPUT_HINT_KEYBOARD, deviceId, event.getDisplayId(), SystemClock.uptimeMillis(), deviceId, event.getDisplayId(), mInjector.getUptimeMillis(), isPowerLongPress ? AssistUtils.INVOCATION_TYPE_POWER_BUTTON_LONG_PRESS : AssistUtils.INVOCATION_TYPE_UNKNOWN); Loading Loading @@ -3974,7 +3982,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { } if (startKeyguardExitAnimation) { if (DEBUG_KEYGUARD) Slog.d(TAG, "Starting keyguard exit animation"); startKeyguardExitAnimation(SystemClock.uptimeMillis()); startKeyguardExitAnimation(mInjector.getUptimeMillis()); } return redoLayout; } Loading Loading @@ -4283,7 +4291,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { if (lidOpen) { mWindowWakeUpPolicy.wakeUpFromLid(); } else if (getLidBehavior() != LID_BEHAVIOR_SLEEP) { mPowerManager.userActivity(SystemClock.uptimeMillis(), false); mPowerManager.userActivity(mInjector.getUptimeMillis(), false); } } Loading Loading @@ -5180,7 +5188,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { mHavePendingMediaKeyRepeatWithWakeLock = false; KeyEvent repeatEvent = KeyEvent.changeTimeRepeat(event, SystemClock.uptimeMillis(), 1, event.getFlags() | KeyEvent.FLAG_LONG_PRESS); mInjector.getUptimeMillis(), 1, event.getFlags() | KeyEvent.FLAG_LONG_PRESS); if (DEBUG_INPUT) { Slog.d(TAG, "dispatchMediaKeyRepeatWithWakeLock: " + repeatEvent); } Loading Loading @@ -6131,7 +6139,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { mWindowManagerFuncs.lockDeviceNow(); break; case LID_BEHAVIOR_SLEEP: goToSleep(SystemClock.uptimeMillis(), goToSleep(mInjector.getUptimeMillis(), PowerManager.GO_TO_SLEEP_REASON_LID_SWITCH, PowerManager.GO_TO_SLEEP_FLAG_NO_DOZE); break; Loading Loading @@ -6351,7 +6359,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { @Override public void keepScreenOnStoppedLw() { if (isKeyguardShowingAndNotOccluded()) { mPowerManager.userActivity(SystemClock.uptimeMillis(), false); mPowerManager.userActivity(mInjector.getUptimeMillis(), false); } } Loading services/tests/wmtests/src/com/android/server/policy/PhoneWindowManagerTests.java +63 −0 Original line number Diff line number Diff line Loading @@ -39,6 +39,7 @@ import static com.android.dx.mockito.inline.extended.ExtendedMockito.when; import static com.android.hardware.input.Flags.FLAG_HID_BLUETOOTH_WAKEUP; import static com.android.server.policy.PhoneWindowManager.EXTRA_TRIGGER_HUB; import static com.android.server.policy.PhoneWindowManager.SHORT_PRESS_POWER_DREAM_OR_AWAKE_OR_SLEEP; import static com.android.server.policy.PhoneWindowManager.SHORT_PRESS_POWER_GO_TO_SLEEP; import static com.android.server.policy.PhoneWindowManager.SHORT_PRESS_POWER_HUB_OR_DREAM_OR_SLEEP; import static com.google.common.truth.Truth.assertThat; Loading Loading @@ -85,6 +86,7 @@ import com.android.server.input.InputManagerInternal; import com.android.server.pm.UserManagerInternal; import com.android.server.policy.keyguard.KeyguardServiceDelegate; import com.android.server.statusbar.StatusBarManagerInternal; import com.android.server.testutils.OffsettableClock; import com.android.server.wm.ActivityTaskManagerInternal; import com.android.server.wm.DisplayPolicy; import com.android.server.wm.DisplayRotation; Loading Loading @@ -124,6 +126,7 @@ public class PhoneWindowManagerTests { public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule(); @Mock private IBinder mInputToken; private OffsettableClock mOffsettableClock; PhoneWindowManager mNonSpyPhoneWindowManager; PhoneWindowManager mPhoneWindowManager; Loading Loading @@ -163,6 +166,8 @@ public class PhoneWindowManagerTests { MockitoAnnotations.initMocks(this); when(mContext.getSystemService(Context.POWER_SERVICE)).thenReturn(mPowerManager); mOffsettableClock = new OffsettableClock.Stopped(); mNonSpyPhoneWindowManager = new PhoneWindowManager(); mPhoneWindowManager = spy(mNonSpyPhoneWindowManager); spyOn(ActivityManager.getService()); Loading Loading @@ -597,6 +602,60 @@ public class PhoneWindowManagerTests { verify(mWindowWakeUpPolicy).wakeUpFromBluetooth(); } @Test public void powerPress_firstTapThenPowerPress_shouldIgnorePowerPress() { final int tapGestureEventTimeMillis = 0; final int suppressionDelayMillis = 400; final int powerButtonPressEventTimeMillis = tapGestureEventTimeMillis + suppressionDelayMillis - 1; final int sleepDuration = 10_000; PowerManager.WakeData wakeData = new PowerManager.WakeData( tapGestureEventTimeMillis, PowerManager.WAKE_REASON_TAP, sleepDuration); Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.POWER_BUTTON_SHORT_PRESS, SHORT_PRESS_POWER_GO_TO_SLEEP); Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.POWER_BUTTON_SUPPRESSION_DELAY_AFTER_GESTURE_WAKE, suppressionDelayMillis); initPhoneWindowManager(); when(mPowerManagerInternal.getLastWakeup()).thenReturn(wakeData); when(mDisplayPolicy.isAwake()).thenReturn(true); mPhoneWindowManager.updateSettings(null); mOffsettableClock.fastForward(powerButtonPressEventTimeMillis); mPhoneWindowManager.powerPress(powerButtonPressEventTimeMillis, 1, DEFAULT_DISPLAY); verify(mPowerManager, never()).goToSleep(powerButtonPressEventTimeMillis, PowerManager.GO_TO_SLEEP_REASON_POWER_BUTTON, 0); } @Test public void powerPress_firstTapThenPowerPress_shouldRespectPowerPress() { final int tapGestureEventTimeMillis = 0; final int suppressionDelayMillis = 400; final int powerButtonPressEventTimeMillis = tapGestureEventTimeMillis + suppressionDelayMillis + 1; final int sleepDuration = 10_000; PowerManager.WakeData wakeData = new PowerManager.WakeData( tapGestureEventTimeMillis, PowerManager.WAKE_REASON_TAP, sleepDuration); Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.POWER_BUTTON_SHORT_PRESS, SHORT_PRESS_POWER_GO_TO_SLEEP); Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.POWER_BUTTON_SUPPRESSION_DELAY_AFTER_GESTURE_WAKE, suppressionDelayMillis); initPhoneWindowManager(); when(mPowerManagerInternal.getLastWakeup()).thenReturn(wakeData); when(mDisplayPolicy.isAwake()).thenReturn(true); mPhoneWindowManager.updateSettings(null); mOffsettableClock.fastForward(powerButtonPressEventTimeMillis); mPhoneWindowManager.powerPress(powerButtonPressEventTimeMillis, 1, DEFAULT_DISPLAY); verify(mPowerManager, times(1)).goToSleep(powerButtonPressEventTimeMillis, PowerManager.GO_TO_SLEEP_REASON_POWER_BUTTON, 0); } private void initNonSpyPhoneWindowManager() { mNonSpyPhoneWindowManager.mDefaultDisplayPolicy = mDisplayPolicy; mNonSpyPhoneWindowManager.mDefaultDisplayRotation = mock(DisplayRotation.class); Loading Loading @@ -639,5 +698,9 @@ public class PhoneWindowManagerTests { WindowWakeUpPolicy getWindowWakeUpPolicy() { return mWindowWakeUpPolicy; } long getUptimeMillis() { return mOffsettableClock.now(); } } } Loading
services/core/java/com/android/server/policy/PhoneWindowManager.java +18 −10 Original line number Diff line number Diff line Loading @@ -445,6 +445,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { private final SparseArray<ScreenOnListener> mScreenOnListeners = new SparseArray<>(); Context mContext; Injector mInjector; WindowManagerFuncs mWindowManagerFuncs; WindowManagerInternal mWindowManagerInternal; PowerManager mPowerManager; Loading Loading @@ -1338,12 +1339,14 @@ public class PhoneWindowManager implements WindowManagerPolicy { final PowerManager.WakeData lastWakeUp = mPowerManagerInternal.getLastWakeup(); if (lastWakeUp != null && (lastWakeUp.wakeReason == PowerManager.WAKE_REASON_GESTURE || lastWakeUp.wakeReason == PowerManager.WAKE_REASON_LIFT || lastWakeUp.wakeReason == PowerManager.WAKE_REASON_BIOMETRIC)) { final long now = SystemClock.uptimeMillis(); || lastWakeUp.wakeReason == PowerManager.WAKE_REASON_BIOMETRIC || lastWakeUp.wakeReason == PowerManager.WAKE_REASON_TAP)) { final long now = mInjector.getUptimeMillis(); if (mPowerButtonSuppressionDelayMillis > 0 && (now < lastWakeUp.wakeTime + mPowerButtonSuppressionDelayMillis)) { Slog.i(TAG, "Sleep from power button suppressed. Time since gesture: " + (now - lastWakeUp.wakeTime) + "ms"); + (now - lastWakeUp.wakeTime) + "ms. Gesture: " + PowerManager.wakeReasonToString(lastWakeUp.wakeReason)); return false; } } Loading Loading @@ -1800,7 +1803,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { mGlobalActions.showDialog(keyguardShowing, isDeviceProvisioned()); // since it took two seconds of long press to bring this up, // poke the wake lock so they have some time to see the dialog. mPowerManager.userActivity(SystemClock.uptimeMillis(), false); mPowerManager.userActivity(mInjector.getUptimeMillis(), false); } private void cancelGlobalActionsAction() { Loading Loading @@ -2229,6 +2232,10 @@ public class PhoneWindowManager implements WindowManagerPolicy { WindowWakeUpPolicy getWindowWakeUpPolicy() { return new WindowWakeUpPolicy(mContext); } long getUptimeMillis() { return SystemClock.uptimeMillis(); } } /** {@inheritDoc} */ Loading @@ -2239,6 +2246,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { @VisibleForTesting void init(Injector injector) { mInjector = injector; mContext = injector.getContext(); mWindowManagerFuncs = injector.getWindowManagerFuncs(); mWindowManagerInternal = LocalServices.getService(WindowManagerInternal.class); Loading Loading @@ -3501,7 +3509,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { if (shouldLaunchAssist) { launchAssistAction( isPowerLongPress ? null : Intent.EXTRA_ASSIST_INPUT_HINT_KEYBOARD, deviceId, event.getDisplayId(), SystemClock.uptimeMillis(), deviceId, event.getDisplayId(), mInjector.getUptimeMillis(), isPowerLongPress ? AssistUtils.INVOCATION_TYPE_POWER_BUTTON_LONG_PRESS : AssistUtils.INVOCATION_TYPE_UNKNOWN); Loading Loading @@ -3974,7 +3982,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { } if (startKeyguardExitAnimation) { if (DEBUG_KEYGUARD) Slog.d(TAG, "Starting keyguard exit animation"); startKeyguardExitAnimation(SystemClock.uptimeMillis()); startKeyguardExitAnimation(mInjector.getUptimeMillis()); } return redoLayout; } Loading Loading @@ -4283,7 +4291,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { if (lidOpen) { mWindowWakeUpPolicy.wakeUpFromLid(); } else if (getLidBehavior() != LID_BEHAVIOR_SLEEP) { mPowerManager.userActivity(SystemClock.uptimeMillis(), false); mPowerManager.userActivity(mInjector.getUptimeMillis(), false); } } Loading Loading @@ -5180,7 +5188,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { mHavePendingMediaKeyRepeatWithWakeLock = false; KeyEvent repeatEvent = KeyEvent.changeTimeRepeat(event, SystemClock.uptimeMillis(), 1, event.getFlags() | KeyEvent.FLAG_LONG_PRESS); mInjector.getUptimeMillis(), 1, event.getFlags() | KeyEvent.FLAG_LONG_PRESS); if (DEBUG_INPUT) { Slog.d(TAG, "dispatchMediaKeyRepeatWithWakeLock: " + repeatEvent); } Loading Loading @@ -6131,7 +6139,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { mWindowManagerFuncs.lockDeviceNow(); break; case LID_BEHAVIOR_SLEEP: goToSleep(SystemClock.uptimeMillis(), goToSleep(mInjector.getUptimeMillis(), PowerManager.GO_TO_SLEEP_REASON_LID_SWITCH, PowerManager.GO_TO_SLEEP_FLAG_NO_DOZE); break; Loading Loading @@ -6351,7 +6359,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { @Override public void keepScreenOnStoppedLw() { if (isKeyguardShowingAndNotOccluded()) { mPowerManager.userActivity(SystemClock.uptimeMillis(), false); mPowerManager.userActivity(mInjector.getUptimeMillis(), false); } } Loading
services/tests/wmtests/src/com/android/server/policy/PhoneWindowManagerTests.java +63 −0 Original line number Diff line number Diff line Loading @@ -39,6 +39,7 @@ import static com.android.dx.mockito.inline.extended.ExtendedMockito.when; import static com.android.hardware.input.Flags.FLAG_HID_BLUETOOTH_WAKEUP; import static com.android.server.policy.PhoneWindowManager.EXTRA_TRIGGER_HUB; import static com.android.server.policy.PhoneWindowManager.SHORT_PRESS_POWER_DREAM_OR_AWAKE_OR_SLEEP; import static com.android.server.policy.PhoneWindowManager.SHORT_PRESS_POWER_GO_TO_SLEEP; import static com.android.server.policy.PhoneWindowManager.SHORT_PRESS_POWER_HUB_OR_DREAM_OR_SLEEP; import static com.google.common.truth.Truth.assertThat; Loading Loading @@ -85,6 +86,7 @@ import com.android.server.input.InputManagerInternal; import com.android.server.pm.UserManagerInternal; import com.android.server.policy.keyguard.KeyguardServiceDelegate; import com.android.server.statusbar.StatusBarManagerInternal; import com.android.server.testutils.OffsettableClock; import com.android.server.wm.ActivityTaskManagerInternal; import com.android.server.wm.DisplayPolicy; import com.android.server.wm.DisplayRotation; Loading Loading @@ -124,6 +126,7 @@ public class PhoneWindowManagerTests { public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule(); @Mock private IBinder mInputToken; private OffsettableClock mOffsettableClock; PhoneWindowManager mNonSpyPhoneWindowManager; PhoneWindowManager mPhoneWindowManager; Loading Loading @@ -163,6 +166,8 @@ public class PhoneWindowManagerTests { MockitoAnnotations.initMocks(this); when(mContext.getSystemService(Context.POWER_SERVICE)).thenReturn(mPowerManager); mOffsettableClock = new OffsettableClock.Stopped(); mNonSpyPhoneWindowManager = new PhoneWindowManager(); mPhoneWindowManager = spy(mNonSpyPhoneWindowManager); spyOn(ActivityManager.getService()); Loading Loading @@ -597,6 +602,60 @@ public class PhoneWindowManagerTests { verify(mWindowWakeUpPolicy).wakeUpFromBluetooth(); } @Test public void powerPress_firstTapThenPowerPress_shouldIgnorePowerPress() { final int tapGestureEventTimeMillis = 0; final int suppressionDelayMillis = 400; final int powerButtonPressEventTimeMillis = tapGestureEventTimeMillis + suppressionDelayMillis - 1; final int sleepDuration = 10_000; PowerManager.WakeData wakeData = new PowerManager.WakeData( tapGestureEventTimeMillis, PowerManager.WAKE_REASON_TAP, sleepDuration); Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.POWER_BUTTON_SHORT_PRESS, SHORT_PRESS_POWER_GO_TO_SLEEP); Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.POWER_BUTTON_SUPPRESSION_DELAY_AFTER_GESTURE_WAKE, suppressionDelayMillis); initPhoneWindowManager(); when(mPowerManagerInternal.getLastWakeup()).thenReturn(wakeData); when(mDisplayPolicy.isAwake()).thenReturn(true); mPhoneWindowManager.updateSettings(null); mOffsettableClock.fastForward(powerButtonPressEventTimeMillis); mPhoneWindowManager.powerPress(powerButtonPressEventTimeMillis, 1, DEFAULT_DISPLAY); verify(mPowerManager, never()).goToSleep(powerButtonPressEventTimeMillis, PowerManager.GO_TO_SLEEP_REASON_POWER_BUTTON, 0); } @Test public void powerPress_firstTapThenPowerPress_shouldRespectPowerPress() { final int tapGestureEventTimeMillis = 0; final int suppressionDelayMillis = 400; final int powerButtonPressEventTimeMillis = tapGestureEventTimeMillis + suppressionDelayMillis + 1; final int sleepDuration = 10_000; PowerManager.WakeData wakeData = new PowerManager.WakeData( tapGestureEventTimeMillis, PowerManager.WAKE_REASON_TAP, sleepDuration); Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.POWER_BUTTON_SHORT_PRESS, SHORT_PRESS_POWER_GO_TO_SLEEP); Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.POWER_BUTTON_SUPPRESSION_DELAY_AFTER_GESTURE_WAKE, suppressionDelayMillis); initPhoneWindowManager(); when(mPowerManagerInternal.getLastWakeup()).thenReturn(wakeData); when(mDisplayPolicy.isAwake()).thenReturn(true); mPhoneWindowManager.updateSettings(null); mOffsettableClock.fastForward(powerButtonPressEventTimeMillis); mPhoneWindowManager.powerPress(powerButtonPressEventTimeMillis, 1, DEFAULT_DISPLAY); verify(mPowerManager, times(1)).goToSleep(powerButtonPressEventTimeMillis, PowerManager.GO_TO_SLEEP_REASON_POWER_BUTTON, 0); } private void initNonSpyPhoneWindowManager() { mNonSpyPhoneWindowManager.mDefaultDisplayPolicy = mDisplayPolicy; mNonSpyPhoneWindowManager.mDefaultDisplayRotation = mock(DisplayRotation.class); Loading Loading @@ -639,5 +698,9 @@ public class PhoneWindowManagerTests { WindowWakeUpPolicy getWindowWakeUpPolicy() { return mWindowWakeUpPolicy; } long getUptimeMillis() { return mOffsettableClock.now(); } } }