From 7155f5e59e84b965360486c662668b48eafe294c Mon Sep 17 00:00:00 2001 From: Arthur Hung Date: Tue, 27 Jun 2023 09:06:37 +0000 Subject: [PATCH] Fix screen turns off once triggering long press power behavior If the long press or very long press behavior had been handled, we should indicate the key had been handled by long press and skip the short press processing. Bug: 286742461 Test: atest SingleKeyGestureTests Change-Id: I5e99388cdfb30eaeb3fcbcfdf5d97c3287adddf4 --- .../server/policy/SingleKeyGestureDetector.java | 4 +++- .../android/server/policy/SingleKeyGestureTests.java | 12 ++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/policy/SingleKeyGestureDetector.java b/services/core/java/com/android/server/policy/SingleKeyGestureDetector.java index 9c3b38ab51a31..b999bbb3dce24 100644 --- a/services/core/java/com/android/server/policy/SingleKeyGestureDetector.java +++ b/services/core/java/com/android/server/policy/SingleKeyGestureDetector.java @@ -314,7 +314,9 @@ public final class SingleKeyGestureDetector { if (eventTime < mLastDownTime + mActiveRule.getVeryLongPressTimeoutMs()) { mHandler.removeMessages(MSG_KEY_VERY_LONG_PRESS); } else { - mHandledByLongPress = mActiveRule.supportVeryLongPress(); + // If long press or very long press (~3.5s) had been handled, we should skip the + // short press behavior. + mHandledByLongPress |= mActiveRule.supportVeryLongPress(); } } diff --git a/services/tests/wmtests/src/com/android/server/policy/SingleKeyGestureTests.java b/services/tests/wmtests/src/com/android/server/policy/SingleKeyGestureTests.java index 280afbadec30c..3bb86a7bfecb3 100644 --- a/services/tests/wmtests/src/com/android/server/policy/SingleKeyGestureTests.java +++ b/services/tests/wmtests/src/com/android/server/policy/SingleKeyGestureTests.java @@ -316,4 +316,16 @@ public class SingleKeyGestureTests { pressKey(KEYCODE_POWER, 0 /* pressTime */); assertTrue(mShortPressed.await(mWaitTimeout, TimeUnit.MILLISECONDS)); } + + // Verify short press should not be triggered if no very long press behavior defined but the + // press time exceeded the very long press timeout. + @Test + public void testTimeoutExceedVeryLongPress() throws InterruptedException { + mVeryLongPressOnPowerBehavior = false; + + pressKey(KEYCODE_POWER, mVeryLongPressTime + 50); + assertTrue(mLongPressed.await(mWaitTimeout, TimeUnit.MILLISECONDS)); + assertEquals(mVeryLongPressed.getCount(), 1); + assertEquals(mShortPressed.getCount(), 1); + } }