Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 18902221 authored by Fiona Campbell's avatar Fiona Campbell
Browse files

Add WAKE_REASON_TAP to power button press check

- add WAKE_REASON_TAP when checking for other wake reasons before
  ignoring power button press
- add detail to logs
- add tests

Bug: 406304644
Flag: EXEMPT trivial change
Test: atest PhoneWindowManagerTests
Change-Id: I2d9ce174d6a01a7b892da2c88d766a49fcea6db5
parent 10aa6d61
Loading
Loading
Loading
Loading
+18 −10
Original line number Diff line number Diff line
@@ -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;
@@ -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;
            }
        }
@@ -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() {
@@ -2229,6 +2232,10 @@ public class PhoneWindowManager implements WindowManagerPolicy {
        WindowWakeUpPolicy getWindowWakeUpPolicy() {
            return new WindowWakeUpPolicy(mContext);
        }

        long getUptimeMillis() {
            return SystemClock.uptimeMillis();
        }
    }

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

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

+63 −0
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -124,6 +126,7 @@ public class PhoneWindowManagerTests {
    public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();

    @Mock private IBinder mInputToken;
    private OffsettableClock mOffsettableClock;

    PhoneWindowManager mNonSpyPhoneWindowManager;
    PhoneWindowManager mPhoneWindowManager;
@@ -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());
@@ -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);
@@ -639,5 +698,9 @@ public class PhoneWindowManagerTests {
        WindowWakeUpPolicy getWindowWakeUpPolicy() {
            return mWindowWakeUpPolicy;
        }

        long getUptimeMillis() {
            return mOffsettableClock.now();
        }
    }
}