From e7887c221c80a7aa302d83c4a6f783989ce7d8b9 Mon Sep 17 00:00:00 2001 From: Govinda Wasserman Date: Wed, 11 Aug 2021 13:29:59 -0400 Subject: [PATCH] Adds LPP sensitivity for Assistant invocation Test: Cherrypick ag/15542611 Test: Ensure Assistant invocation is set as the LPP action Test: Adjust LPP sensitivity Test: Hold LPP for the set time Test: Observe activation duration matches set time BUG: 192995149 FIX: 197080361 FIX: 197081640 Merged-In: I820a9d83fd56bfa9ca978e82eb779cf3d519a5ab Change-Id: I820a9d83fd56bfa9ca978e82eb779cf3d519a5ab (cherry picked from commit d655414526bf1d354b413f79614786980c8035d3) --- core/java/android/provider/Settings.java | 10 +++++ .../android/providers/settings/global.proto | 4 +- core/res/res/values/config.xml | 14 +++++++ core/res/res/values/symbols.xml | 2 + .../settings/backup/GlobalSettings.java | 1 + .../validators/GlobalSettingsValidators.java | 2 + .../settings/SettingsProtoDumpUtil.java | 3 ++ .../server/policy/PhoneWindowManager.java | 29 ++++++++++++-- .../policy/SingleKeyGestureDetector.java | 39 ++++++++++++++----- .../server/policy/SingleKeyGestureTests.java | 4 +- 10 files changed, 92 insertions(+), 16 deletions(-) diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index dc4a74766ed92..94d19bc1c8694 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -14980,6 +14980,16 @@ public final class Settings { public static final String POWER_BUTTON_LONG_PRESS = "power_button_long_press"; + /** + * Override internal R.integer.config_longPressOnPowerDurationMs. It determines the length + * of power button press to be considered a long press in milliseconds. + * Used by PhoneWindowManager. + * @hide + */ + @Readable + public static final String POWER_BUTTON_LONG_PRESS_DURATION_MS = + "power_button_long_press_duration_ms"; + /** * Overrides internal R.integer.config_veryLongPressOnPowerBehavior. * Allowable values detailed in frameworks/base/core/res/res/values/config.xml. diff --git a/core/proto/android/providers/settings/global.proto b/core/proto/android/providers/settings/global.proto index c3d159659622d..6bc00e2281eff 100644 --- a/core/proto/android/providers/settings/global.proto +++ b/core/proto/android/providers/settings/global.proto @@ -771,6 +771,8 @@ message GlobalSettingsProto { optional SettingProto power_manager_constants = 93; reserved 94; // Used to be priv_app_oob_enabled + optional SettingProto power_button_long_press_duration_ms = 154 [ (android.privacy).dest = DEST_AUTOMATIC ]; + message PrepaidSetup { option (android.msg_privacy).dest = DEST_EXPLICIT; @@ -1063,5 +1065,5 @@ message GlobalSettingsProto { // Please insert fields in alphabetical order and group them into messages // if possible (to avoid reaching the method limit). - // Next tag = 154; + // Next tag = 155; } diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 5d87f84332ae1..89c5a8d867cb0 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -971,6 +971,20 @@ --> 5 + + 500 + + + + 250 + 350 + 500 + 650 + 750 + + diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 289439ffd4f42..77a45f9caf7f6 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -439,6 +439,8 @@ + + diff --git a/packages/SettingsProvider/src/android/provider/settings/backup/GlobalSettings.java b/packages/SettingsProvider/src/android/provider/settings/backup/GlobalSettings.java index 01ae1e915c8c2..db33c3f2c9cf6 100644 --- a/packages/SettingsProvider/src/android/provider/settings/backup/GlobalSettings.java +++ b/packages/SettingsProvider/src/android/provider/settings/backup/GlobalSettings.java @@ -78,5 +78,6 @@ public class GlobalSettings { Settings.Global.POWER_BUTTON_LONG_PRESS, Settings.Global.AUTOMATIC_POWER_SAVE_MODE, Settings.Global.ADVANCED_BATTERY_USAGE_AMOUNT, + Settings.Global.POWER_BUTTON_LONG_PRESS_DURATION_MS }; } diff --git a/packages/SettingsProvider/src/android/provider/settings/validators/GlobalSettingsValidators.java b/packages/SettingsProvider/src/android/provider/settings/validators/GlobalSettingsValidators.java index 3c7d7a8e890c2..d0448ef637933 100644 --- a/packages/SettingsProvider/src/android/provider/settings/validators/GlobalSettingsValidators.java +++ b/packages/SettingsProvider/src/android/provider/settings/validators/GlobalSettingsValidators.java @@ -20,6 +20,7 @@ import static android.media.AudioFormat.SURROUND_SOUND_ENCODING; import static android.provider.settings.validators.SettingsValidators.ANY_INTEGER_VALIDATOR; import static android.provider.settings.validators.SettingsValidators.ANY_STRING_VALIDATOR; import static android.provider.settings.validators.SettingsValidators.BOOLEAN_VALIDATOR; +import static android.provider.settings.validators.SettingsValidators.NONE_NEGATIVE_LONG_VALIDATOR; import static android.provider.settings.validators.SettingsValidators.PACKAGE_NAME_VALIDATOR; import static android.provider.settings.validators.SettingsValidators.PERCENTAGE_INTEGER_VALIDATOR; import static android.view.Display.HdrCapabilities.HDR_TYPES; @@ -142,6 +143,7 @@ public class GlobalSettingsValidators { VALIDATORS.put(Global.DEVICE_CONFIG_SYNC_DISABLED, BOOLEAN_VALIDATOR); VALIDATORS.put(Global.AUTOMATIC_POWER_SAVE_MODE, ANY_INTEGER_VALIDATOR); VALIDATORS.put(Global.ADVANCED_BATTERY_USAGE_AMOUNT, PERCENTAGE_INTEGER_VALIDATOR); + VALIDATORS.put(Global.POWER_BUTTON_LONG_PRESS_DURATION_MS, NONE_NEGATIVE_LONG_VALIDATOR); } } diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java index 073b4d00653db..90cec3fb6913b 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java @@ -1195,6 +1195,9 @@ class SettingsProtoDumpUtil { dumpSetting(s, p, Settings.Global.POWER_MANAGER_CONSTANTS, GlobalSettingsProto.POWER_MANAGER_CONSTANTS); + dumpSetting(s, p, + Settings.Global.POWER_BUTTON_LONG_PRESS_DURATION_MS, + GlobalSettingsProto.POWER_BUTTON_LONG_PRESS_DURATION_MS); final long prepaidSetupToken = p.start(GlobalSettingsProto.PREPAID_SETUP); dumpSetting(s, p, diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index 139ab0cc65859..45f5daac8dd9f 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -484,6 +484,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { int mLidNavigationAccessibility; int mShortPressOnPowerBehavior; int mLongPressOnPowerBehavior; + long mLongPressOnPowerAssistantTimeoutMs; int mVeryLongPressOnPowerBehavior; int mDoublePressOnPowerBehavior; int mTriplePressOnPowerBehavior; @@ -731,6 +732,9 @@ public class PhoneWindowManager implements WindowManagerPolicy { resolver.registerContentObserver(Settings.Global.getUriFor( Settings.Global.POWER_BUTTON_LONG_PRESS), false, this, UserHandle.USER_ALL); + resolver.registerContentObserver(Settings.Global.getUriFor( + Settings.Global.POWER_BUTTON_LONG_PRESS_DURATION_MS), false, this, + UserHandle.USER_ALL); resolver.registerContentObserver(Settings.Global.getUriFor( Settings.Global.POWER_BUTTON_VERY_LONG_PRESS), false, this, UserHandle.USER_ALL); @@ -1732,6 +1736,8 @@ public class PhoneWindowManager implements WindowManagerPolicy { com.android.internal.R.integer.config_shortPressOnPowerBehavior); mLongPressOnPowerBehavior = mContext.getResources().getInteger( com.android.internal.R.integer.config_longPressOnPowerBehavior); + mLongPressOnPowerAssistantTimeoutMs = mContext.getResources().getInteger( + com.android.internal.R.integer.config_longPressOnPowerDurationMs); mVeryLongPressOnPowerBehavior = mContext.getResources().getInteger( com.android.internal.R.integer.config_veryLongPressOnPowerBehavior); mDoublePressOnPowerBehavior = mContext.getResources().getInteger( @@ -1955,7 +1961,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { */ private final class PowerKeyRule extends SingleKeyGestureDetector.SingleKeyRule { PowerKeyRule(int gestures) { - super(KEYCODE_POWER, gestures); + super(mContext, KEYCODE_POWER, gestures); } @Override @@ -1969,6 +1975,15 @@ public class PhoneWindowManager implements WindowManagerPolicy { mSingleKeyGestureDetector.beganFromNonInteractive()); } + @Override + long getLongPressTimeoutMs() { + if (getResolvedLongPressOnPowerBehavior() == LONG_PRESS_POWER_ASSISTANT) { + return mLongPressOnPowerAssistantTimeoutMs; + } else { + return super.getLongPressTimeoutMs(); + } + } + @Override void onLongPress(long eventTime) { if (mSingleKeyGestureDetector.beganFromNonInteractive() @@ -1997,7 +2012,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { */ private final class BackKeyRule extends SingleKeyGestureDetector.SingleKeyRule { BackKeyRule(int gestures) { - super(KEYCODE_BACK, gestures); + super(mContext, KEYCODE_BACK, gestures); } @Override @@ -2017,7 +2032,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { } private void initSingleKeyGestureRules() { - mSingleKeyGestureDetector = new SingleKeyGestureDetector(mContext); + mSingleKeyGestureDetector = new SingleKeyGestureDetector(); int powerKeyGestures = 0; if (hasVeryLongPressOnPowerBehavior()) { @@ -2115,6 +2130,11 @@ public class PhoneWindowManager implements WindowManagerPolicy { Settings.Global.POWER_BUTTON_LONG_PRESS, mContext.getResources().getInteger( com.android.internal.R.integer.config_longPressOnPowerBehavior)); + mLongPressOnPowerAssistantTimeoutMs = Settings.Global.getLong( + mContext.getContentResolver(), + Settings.Global.POWER_BUTTON_LONG_PRESS_DURATION_MS, + mContext.getResources().getInteger( + com.android.internal.R.integer.config_longPressOnPowerDurationMs)); mVeryLongPressOnPowerBehavior = Settings.Global.getInt(resolver, Settings.Global.POWER_BUTTON_VERY_LONG_PRESS, mContext.getResources().getInteger( @@ -5330,6 +5350,9 @@ public class PhoneWindowManager implements WindowManagerPolicy { pw.print(prefix); pw.print("mLongPressOnPowerBehavior="); pw.println(longPressOnPowerBehaviorToString(mLongPressOnPowerBehavior)); + pw.print(prefix); + pw.print("mLongPressOnPowerAssistantTimeoutMs="); + pw.println(mLongPressOnPowerAssistantTimeoutMs); pw.print(prefix); pw.print("mVeryLongPressOnPowerBehavior="); pw.println(veryLongPressOnPowerBehaviorToString(mVeryLongPressOnPowerBehavior)); diff --git a/services/core/java/com/android/server/policy/SingleKeyGestureDetector.java b/services/core/java/com/android/server/policy/SingleKeyGestureDetector.java index 1ef2bf9151e0a..6fee69bf04727 100644 --- a/services/core/java/com/android/server/policy/SingleKeyGestureDetector.java +++ b/services/core/java/com/android/server/policy/SingleKeyGestureDetector.java @@ -44,9 +44,6 @@ public final class SingleKeyGestureDetector { private static final int MSG_KEY_VERY_LONG_PRESS = 1; private static final int MSG_KEY_DELAYED_PRESS = 2; - private final long mLongPressTimeout; - private final long mVeryLongPressTimeout; - private volatile int mKeyPressCounter; private boolean mBeganFromNonInteractive = false; @@ -86,12 +83,19 @@ public final class SingleKeyGestureDetector { * */ abstract static class SingleKeyRule { + private final int mKeyCode; private final int mSupportedGestures; + private final long mDefaultLongPressTimeout; + private final long mDefaultVeryLongPressTimeout; - SingleKeyRule(int keyCode, @KeyGestureFlag int supportedGestures) { + SingleKeyRule(Context context, int keyCode, @KeyGestureFlag int supportedGestures) { mKeyCode = keyCode; mSupportedGestures = supportedGestures; + mDefaultLongPressTimeout = + ViewConfiguration.get(context).getDeviceGlobalActionKeyTimeout(); + mDefaultVeryLongPressTimeout = context.getResources().getInteger( + com.android.internal.R.integer.config_veryLongPressTimeout); } /** @@ -133,10 +137,28 @@ public final class SingleKeyGestureDetector { * Callback when multi press (>= 2) has been detected. */ void onMultiPress(long downTime, int count) {} + /** + * Returns the timeout in milliseconds for a long press. + * + * If multipress is also supported, this should always be greater than the multipress + * timeout. If very long press is supported, this should always be less than the very long + * press timeout. + */ + long getLongPressTimeoutMs() { + return mDefaultLongPressTimeout; + } /** * Callback when long press has been detected. */ void onLongPress(long eventTime) {} + /** + * Returns the timeout in milliseconds for a very long press. + * + * If long press is supported, this should always be longer than the long press timeout. + */ + long getVeryLongPressTimeoutMs() { + return mDefaultVeryLongPressTimeout; + } /** * Callback when very long press has been detected. */ @@ -151,10 +173,7 @@ public final class SingleKeyGestureDetector { } } - public SingleKeyGestureDetector(Context context) { - mLongPressTimeout = ViewConfiguration.get(context).getDeviceGlobalActionKeyTimeout(); - mVeryLongPressTimeout = context.getResources().getInteger( - com.android.internal.R.integer.config_veryLongPressTimeout); + public SingleKeyGestureDetector() { mHandler = new KeyHandler(); } @@ -225,14 +244,14 @@ public final class SingleKeyGestureDetector { final Message msg = mHandler.obtainMessage(MSG_KEY_LONG_PRESS, keyCode, 0, eventTime); msg.setAsynchronous(true); - mHandler.sendMessageDelayed(msg, mLongPressTimeout); + mHandler.sendMessageDelayed(msg, mActiveRule.getLongPressTimeoutMs()); } if (mActiveRule.supportVeryLongPress()) { final Message msg = mHandler.obtainMessage(MSG_KEY_VERY_LONG_PRESS, keyCode, 0, eventTime); msg.setAsynchronous(true); - mHandler.sendMessageDelayed(msg, mVeryLongPressTimeout); + mHandler.sendMessageDelayed(msg, mActiveRule.getVeryLongPressTimeoutMs()); } } else { mHandler.removeMessages(MSG_KEY_LONG_PRESS); 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 222c692a9778c..6b36fe808a2e9 100644 --- a/services/tests/wmtests/src/com/android/server/policy/SingleKeyGestureTests.java +++ b/services/tests/wmtests/src/com/android/server/policy/SingleKeyGestureTests.java @@ -69,7 +69,7 @@ public class SingleKeyGestureTests { @Before public void setUp() { - mDetector = new SingleKeyGestureDetector(mContext); + mDetector = new SingleKeyGestureDetector(); initSingleKeyGestureRules(); mWaitTimeout = ViewConfiguration.getMultiPressTimeout() + 50; mLongPressTime = ViewConfiguration.get(mContext).getDeviceGlobalActionKeyTimeout() + 50; @@ -78,7 +78,7 @@ public class SingleKeyGestureTests { } private void initSingleKeyGestureRules() { - mDetector.addRule(new SingleKeyGestureDetector.SingleKeyRule(KEYCODE_POWER, + mDetector.addRule(new SingleKeyGestureDetector.SingleKeyRule(mContext, KEYCODE_POWER, KEY_LONGPRESS | KEY_VERYLONGPRESS) { @Override int getMaxMultiPressCount() {