diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index e6324abe2123616413cb0718bff0325b91dcf455..7198ef46d7c44d10c5948123e23a7a34d1d17649 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -5499,6 +5499,14 @@ public final class Settings { */ public static final String KEY_HOME_DOUBLE_TAP_ACTION = "key_home_double_tap_action"; + /** + * Action to perform when the back key is long-pressed. + * (Default can be configured via config_longPressOnBackBehavior) + * (See KEY_HOME_LONG_PRESS_ACTION for valid values) + * @hide + */ + public static final String KEY_BACK_LONG_PRESS_ACTION = "key_back_long_press_action"; + /** * Action to perform when the menu key is pressed. (Default is 1) * @hide diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 912f2922e5fc09c54756d9f683717d575ad3d8b8..534a297238e2d00b62e635bb9047b22f2e050ba9 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -1012,13 +1012,6 @@ --> <integer name="config_keyChordPowerVolumeUp">2</integer> - <!-- Control the behavior when the user long presses the back button. Non-zero values are only - valid for watches as part of CDD/CTS. - 0 - Nothing - 1 - Go to voice assist - --> - <integer name="config_longPressOnBackBehavior">0</integer> - <!-- Allows activities to be launched on a long press on power during device setup. --> <bool name="config_allowStartActivityForLongPressOnPowerInSetup">false</bool> diff --git a/core/res/res/values/lmodroid_config.xml b/core/res/res/values/lmodroid_config.xml index 352f84187ee6115487a4fa5239d809559f40df56..47945ba897410069d772fcc419d08ba156a01fea 100644 --- a/core/res/res/values/lmodroid_config.xml +++ b/core/res/res/values/lmodroid_config.xml @@ -111,6 +111,12 @@ config to 7. --> <integer name="config_deviceHardwareWakeKeys">64</integer> + <!-- Control the behavior when the user long presses the back button. + This needs to match the enums in + frameworks/base/core/java/com/android/internal/util/libremobileos/hwkeys/DeviceKeysConstants.java. + --> + <integer name="config_longPressOnBackBehavior">0</integer> + <!-- Control the behavior when the user long presses the home button. This needs to match the enums in frameworks/base/core/java/com/android/internal/util/libremobileos/hwkeys/DeviceKeysConstants.java. diff --git a/core/res/res/values/lmodroid_symbols.xml b/core/res/res/values/lmodroid_symbols.xml index f3c3537140268f93e1d04bfedce23bab30d94e75..2eb24348268902f61cc427048e46f9f105059680 100644 --- a/core/res/res/values/lmodroid_symbols.xml +++ b/core/res/res/values/lmodroid_symbols.xml @@ -50,6 +50,7 @@ <java-symbol type="integer" name="config_deviceHardwareWakeKeys" /> <!-- Device keys user-customisable behavior --> + <java-symbol type="integer" name="config_longPressOnBackBehavior" /> <java-symbol type="integer" name="config_longPressOnHomeBehavior" /> <java-symbol type="integer" name="config_doubleTapOnHomeBehavior" /> <java-symbol type="integer" name="config_longPressOnMenuBehavior" /> diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index 113f8b2f6e04d3109e9bc4b52bc35eacee6b2c38..63cb5259a4d8b8cf6984e25d61e0f328c24ecb1d 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -556,6 +556,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { boolean mPendingCapsLockToggle; // Tracks user-customisable behavior for certain key events + private Action mBackLongPressAction; private Action mHomeLongPressAction; private Action mHomeDoubleTapAction; private Action mMenuPressAction; @@ -829,6 +830,9 @@ public class PhoneWindowManager implements WindowManagerPolicy { resolver.registerContentObserver(Settings.System.getUriFor( Settings.System.TORCH_LONG_PRESS_POWER_TIMEOUT), false, this, UserHandle.USER_ALL); + resolver.registerContentObserver(Settings.System.getUriFor( + Settings.System.KEY_BACK_LONG_PRESS_ACTION), false, this, + UserHandle.USER_ALL); resolver.registerContentObserver(Settings.System.getUriFor( Settings.System.KEY_HOME_LONG_PRESS_ACTION), false, this, UserHandle.USER_ALL); @@ -1306,13 +1310,14 @@ public class PhoneWindowManager implements WindowManagerPolicy { private void backLongPress() { mBackKeyHandled = true; - switch (mLongPressOnBackBehavior) { - case LONG_PRESS_BACK_NOTHING: - break; - case LONG_PRESS_BACK_GO_TO_VOICE_ASSIST: - launchVoiceAssist(false /* allowDuringSetup */); - break; - } + long now = SystemClock.uptimeMillis(); + KeyEvent event = new KeyEvent(now, now, KeyEvent.ACTION_DOWN, + KEYCODE_BACK, 0, 0, KeyCharacterMap.VIRTUAL_KEYBOARD, 0, + KeyEvent.FLAG_FROM_SYSTEM, InputDevice.SOURCE_KEYBOARD); + + performHapticFeedback(HapticFeedbackConstants.LONG_PRESS, false, + "Back - Long Press"); + performKeyAction(mBackLongPressAction, event); } private void accessibilityShortcutActivated() { @@ -1380,7 +1385,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { } private boolean hasLongPressOnBackBehavior() { - return mLongPressOnBackBehavior != LONG_PRESS_BACK_NOTHING; + return mBackLongPressAction != Action.NOTHING; } private void interceptScreenshotChord() { @@ -2320,10 +2325,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { powerKeyGestures |= KEY_LONGPRESS; } mSingleKeyGestureDetector.addRule(new PowerKeyRule(powerKeyGestures)); - - if (hasLongPressOnBackBehavior()) { - mSingleKeyGestureDetector.addRule(new BackKeyRule(KEY_LONGPRESS)); - } + mSingleKeyGestureDetector.addRule(new BackKeyRule(KEY_LONGPRESS)); } private void updateKeyAssignments() { @@ -2354,6 +2356,16 @@ public class PhoneWindowManager implements WindowManagerPolicy { mEdgeLongSwipeAction = Action.NOTHING; + mBackLongPressAction = Action.fromIntSafe(res.getInteger( + com.android.internal.R.integer.config_longPressOnBackBehavior)); + if (mBackLongPressAction.ordinal() > Action.SLEEP.ordinal()) { + mBackLongPressAction = Action.NOTHING; + } + + mBackLongPressAction = Action.fromSettings(resolver, + Settings.System.KEY_BACK_LONG_PRESS_ACTION, + mBackLongPressAction); + mHomeLongPressAction = Action.fromIntSafe(res.getInteger( com.android.internal.R.integer.config_longPressOnHomeBehavior)); if (mHomeLongPressAction.ordinal() > Action.SLEEP.ordinal()) {