diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index 858192078740e..ac59101d40902 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -13569,6 +13569,28 @@ public final class Settings { private static final Validator AWARE_ALLOWED_VALIDATOR = BOOLEAN_VALIDATOR; + /** + * Overrides internal R.integer.config_longPressOnPowerBehavior. + * Allowable values detailed in frameworks/base/core/res/res/values/config.xml. + * Used by PhoneWindowManager. + * @hide + */ + public static final String POWER_BUTTON_LONG_PRESS = + "power_button_long_press"; + private static final Validator POWER_BUTTON_LONG_PRESS_VALIDATOR = + new SettingsValidators.InclusiveIntegerRangeValidator(0, 5); + + /** + * Overrides internal R.integer.config_veryLongPressOnPowerBehavior. + * Allowable values detailed in frameworks/base/core/res/res/values/config.xml. + * Used by PhoneWindowManager. + * @hide + */ + public static final String POWER_BUTTON_VERY_LONG_PRESS = + "power_button_very_long_press"; + private static final Validator POWER_BUTTON_VERY_LONG_PRESS_VALIDATOR = + new SettingsValidators.InclusiveIntegerRangeValidator(0, 1); + /** * Settings to backup. This is here so that it's in the same place as the settings * keys and easy to update. @@ -13682,6 +13704,8 @@ public final class Settings { WIFI_PNO_RECENCY_SORTING_ENABLED_VALIDATOR); VALIDATORS.put(WIFI_LINK_PROBING_ENABLED, WIFI_LINK_PROBING_ENABLED_VALIDATOR); VALIDATORS.put(AWARE_ALLOWED, AWARE_ALLOWED_VALIDATOR); + VALIDATORS.put(POWER_BUTTON_LONG_PRESS, POWER_BUTTON_LONG_PRESS_VALIDATOR); + VALIDATORS.put(POWER_BUTTON_VERY_LONG_PRESS, POWER_BUTTON_VERY_LONG_PRESS_VALIDATOR); } /** @@ -14687,6 +14711,7 @@ public final class Settings { */ public static final String TEXT_CLASSIFIER_ACTION_MODEL_PARAMS = "text_classifier_action_model_params"; + } /** diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 9c4717b4497ef..b3e94e39f30e7 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -1098,6 +1098,7 @@ 2 - Power off (with confirmation) 3 - Power off (without confirmation) 4 - Go to voice assist + 5 - Go to assistant (Settings.Secure.ASSISTANT) --> 1 diff --git a/core/tests/coretests/src/android/provider/SettingsBackupTest.java b/core/tests/coretests/src/android/provider/SettingsBackupTest.java index cf9a7fc763a45..a853121bac4e0 100644 --- a/core/tests/coretests/src/android/provider/SettingsBackupTest.java +++ b/core/tests/coretests/src/android/provider/SettingsBackupTest.java @@ -577,7 +577,10 @@ public class SettingsBackupTest { Settings.Global.RADIO_BUG_WAKELOCK_TIMEOUT_COUNT_THRESHOLD, Settings.Global.RADIO_BUG_SYSTEM_ERROR_COUNT_THRESHOLD, Settings.Global.ENABLED_SUBSCRIPTION_FOR_SLOT, - Settings.Global.MODEM_STACK_ENABLED_FOR_SLOT); + Settings.Global.MODEM_STACK_ENABLED_FOR_SLOT, + Settings.Global.POWER_BUTTON_LONG_PRESS, + Settings.Global.POWER_BUTTON_VERY_LONG_PRESS); + private static final Set BACKUP_BLACKLISTED_SECURE_SETTINGS = newHashSet( Settings.Secure.ACCESSIBILITY_SOFT_KEYBOARD_MODE, diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index d0ca861d8d3b9..9b4293d484bc4 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -256,6 +256,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { // Whether to allow devices placed in vr headset viewers to have an alternative Home intent. static final boolean ENABLE_VR_HEADSET_HOME_CAPTURE = true; + // must match: config_shortPressOnPowerBehavior in config.xml static final int SHORT_PRESS_POWER_NOTHING = 0; static final int SHORT_PRESS_POWER_GO_TO_SLEEP = 1; static final int SHORT_PRESS_POWER_REALLY_GO_TO_SLEEP = 2; @@ -263,29 +264,34 @@ public class PhoneWindowManager implements WindowManagerPolicy { static final int SHORT_PRESS_POWER_GO_HOME = 4; static final int SHORT_PRESS_POWER_CLOSE_IME_OR_GO_HOME = 5; + // must match: config_LongPressOnPowerBehavior in config.xml static final int LONG_PRESS_POWER_NOTHING = 0; static final int LONG_PRESS_POWER_GLOBAL_ACTIONS = 1; static final int LONG_PRESS_POWER_SHUT_OFF = 2; static final int LONG_PRESS_POWER_SHUT_OFF_NO_CONFIRM = 3; static final int LONG_PRESS_POWER_GO_TO_VOICE_ASSIST = 4; + static final int LONG_PRESS_POWER_ASSISTANT = 5; // Settings.Secure.ASSISTANT + // must match: config_veryLongPresOnPowerBehavior in config.xml static final int VERY_LONG_PRESS_POWER_NOTHING = 0; static final int VERY_LONG_PRESS_POWER_GLOBAL_ACTIONS = 1; + // must match: config_doublePressOnPowerBehavior in config.xml static final int MULTI_PRESS_POWER_NOTHING = 0; static final int MULTI_PRESS_POWER_THEATER_MODE = 1; static final int MULTI_PRESS_POWER_BRIGHTNESS_BOOST = 2; + // must match: config_longPressOnBackBehavior in config.xml static final int LONG_PRESS_BACK_NOTHING = 0; static final int LONG_PRESS_BACK_GO_TO_VOICE_ASSIST = 1; - // These need to match the documentation/constant in - // core/res/res/values/config.xml + // must match: config_longPressOnHomeBehavior in config.xml static final int LONG_PRESS_HOME_NOTHING = 0; static final int LONG_PRESS_HOME_ALL_APPS = 1; static final int LONG_PRESS_HOME_ASSIST = 2; static final int LAST_LONG_PRESS_HOME_BEHAVIOR = LONG_PRESS_HOME_ASSIST; + // must match: config_doubleTapOnHomeBehavior in config.xml static final int DOUBLE_TAP_HOME_NOTHING = 0; static final int DOUBLE_TAP_HOME_RECENT_SYSTEM_UI = 1; @@ -770,6 +776,12 @@ public class PhoneWindowManager implements WindowManagerPolicy { resolver.registerContentObserver(Settings.Secure.getUriFor( Settings.Secure.SYSTEM_NAVIGATION_KEYS_ENABLED), false, this, UserHandle.USER_ALL); + 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_VERY_LONG_PRESS), false, this, + UserHandle.USER_ALL); updateSettings(); } @@ -1195,38 +1207,38 @@ public class PhoneWindowManager implements WindowManagerPolicy { private void powerLongPress() { final int behavior = getResolvedLongPressOnPowerBehavior(); switch (behavior) { - case LONG_PRESS_POWER_NOTHING: - break; - case LONG_PRESS_POWER_GLOBAL_ACTIONS: - mPowerKeyHandled = true; - performHapticFeedback(HapticFeedbackConstants.LONG_PRESS, false, - "Power - Long Press - Global Actions"); - showGlobalActionsInternal(); - break; - case LONG_PRESS_POWER_SHUT_OFF: - case LONG_PRESS_POWER_SHUT_OFF_NO_CONFIRM: - mPowerKeyHandled = true; - performHapticFeedback(HapticFeedbackConstants.LONG_PRESS, false, - "Power - Long Press - Shut Off"); - sendCloseSystemWindows(SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS); - mWindowManagerFuncs.shutdown(behavior == LONG_PRESS_POWER_SHUT_OFF); - break; - case LONG_PRESS_POWER_GO_TO_VOICE_ASSIST: - mPowerKeyHandled = true; - performHapticFeedback(HapticFeedbackConstants.LONG_PRESS, false, - "Power - Long Press - Go To Voice Assist"); - final boolean keyguardActive = mKeyguardDelegate == null - ? false - : mKeyguardDelegate.isShowing(); - if (!keyguardActive) { - Intent intent = new Intent(Intent.ACTION_VOICE_ASSIST); - if (mAllowStartActivityForLongPressOnPowerDuringSetup) { - mContext.startActivityAsUser(intent, UserHandle.CURRENT_OR_SELF); - } else { - startActivityAsUser(intent, UserHandle.CURRENT_OR_SELF); - } - } - break; + case LONG_PRESS_POWER_NOTHING: + break; + case LONG_PRESS_POWER_GLOBAL_ACTIONS: + mPowerKeyHandled = true; + performHapticFeedback(HapticFeedbackConstants.LONG_PRESS, false, + "Power - Long Press - Global Actions"); + showGlobalActionsInternal(); + break; + case LONG_PRESS_POWER_SHUT_OFF: + case LONG_PRESS_POWER_SHUT_OFF_NO_CONFIRM: + mPowerKeyHandled = true; + performHapticFeedback(HapticFeedbackConstants.LONG_PRESS, false, + "Power - Long Press - Shut Off"); + sendCloseSystemWindows(SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS); + mWindowManagerFuncs.shutdown(behavior == LONG_PRESS_POWER_SHUT_OFF); + break; + case LONG_PRESS_POWER_GO_TO_VOICE_ASSIST: + mPowerKeyHandled = true; + performHapticFeedback(HapticFeedbackConstants.LONG_PRESS, false, + "Power - Long Press - Go To Voice Assist"); + // Some devices allow the voice assistant intent during setup (and use that intent + // to launch something else, like Settings). So we explicitly allow that via the + // config_allowStartActivityForLongPressOnPowerInSetup resource in config.xml. + launchVoiceAssist(mAllowStartActivityForLongPressOnPowerDuringSetup); + break; + case LONG_PRESS_POWER_ASSISTANT: + mPowerKeyHandled = true; + performHapticFeedback(HapticFeedbackConstants.LONG_PRESS, false, + "Power - Long Press - Go To Assistant"); + final int powerKeyDeviceId = Integer.MIN_VALUE; + launchAssistAction(null, powerKeyDeviceId); + break; } } @@ -1250,13 +1262,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { case LONG_PRESS_BACK_NOTHING: break; case LONG_PRESS_BACK_GO_TO_VOICE_ASSIST: - final boolean keyguardActive = mKeyguardDelegate == null - ? false - : mKeyguardDelegate.isShowing(); - if (!keyguardActive) { - Intent intent = new Intent(Intent.ACTION_VOICE_ASSIST); - startActivityAsUser(intent, UserHandle.CURRENT_OR_SELF); - } + launchVoiceAssist(false /* allowDuringSetup */); break; } } @@ -1999,6 +2005,15 @@ public class PhoneWindowManager implements WindowManagerPolicy { mHasSoftInput = hasSoftInput; updateRotation = true; } + + mLongPressOnPowerBehavior = Settings.Global.getInt(resolver, + Settings.Global.POWER_BUTTON_LONG_PRESS, + mContext.getResources().getInteger( + com.android.internal.R.integer.config_longPressOnPowerBehavior)); + mVeryLongPressOnPowerBehavior = Settings.Global.getInt(resolver, + Settings.Global.POWER_BUTTON_VERY_LONG_PRESS, + mContext.getResources().getInteger( + com.android.internal.R.integer.config_veryLongPressOnPowerBehavior)); } if (updateRotation) { updateRotation(true); @@ -3225,6 +3240,10 @@ public class PhoneWindowManager implements WindowManagerPolicy { return 0; } + // There are several different flavors of "assistant" that can be launched from + // various parts of the UI. + + /** starts ACTION_SEARCH_LONG_PRESS, usually a voice search prompt */ private void launchAssistLongPressAction() { performHapticFeedback(HapticFeedbackConstants.LONG_PRESS, false, "Assist - Long Press"); @@ -3246,6 +3265,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { } } + /** Asks the status bar to startAssist(), usually a full "assistant" interface */ private void launchAssistAction(String hint, int deviceId) { sendCloseSystemWindows(SYSTEM_DIALOG_REASON_ASSIST); if (!isUserSetupComplete()) { @@ -3276,12 +3296,30 @@ public class PhoneWindowManager implements WindowManagerPolicy { } } + /** Launches ACTION_VOICE_ASSIST. Does nothing on keyguard. */ + private void launchVoiceAssist(boolean allowDuringSetup) { + final boolean keyguardActive = mKeyguardDelegate == null + ? false + : mKeyguardDelegate.isShowing(); + if (!keyguardActive) { + Intent intent = new Intent(Intent.ACTION_VOICE_ASSIST); + startActivityAsUser(intent, null, UserHandle.CURRENT_OR_SELF, + allowDuringSetup); + } + + } + private void startActivityAsUser(Intent intent, UserHandle handle) { startActivityAsUser(intent, null, handle); } private void startActivityAsUser(Intent intent, Bundle bundle, UserHandle handle) { - if (isUserSetupComplete()) { + startActivityAsUser(intent, bundle, handle, false /* allowDuringSetup */); + } + + private void startActivityAsUser(Intent intent, Bundle bundle, UserHandle handle, + boolean allowDuringSetup) { + if (allowDuringSetup || isUserSetupComplete()) { mContext.startActivityAsUser(intent, bundle, handle); } else { Slog.i(TAG, "Not starting activity because user setup is in progress: " + intent); @@ -5541,6 +5579,10 @@ public class PhoneWindowManager implements WindowManagerPolicy { return "LONG_PRESS_POWER_SHUT_OFF"; case LONG_PRESS_POWER_SHUT_OFF_NO_CONFIRM: return "LONG_PRESS_POWER_SHUT_OFF_NO_CONFIRM"; + case LONG_PRESS_POWER_GO_TO_VOICE_ASSIST: + return "LONG_PRESS_POWER_GO_TO_VOICE_ASSIST"; + case LONG_PRESS_POWER_ASSISTANT: + return "LONG_PRESS_POWER_ASSISTANT"; default: return Integer.toString(behavior); }