Power + Volume up key chord can now be configured.

Device default value set in config_keyChordPowerVolumeUp in
config.xml; can be overridden for all users with
Settings.Global.KEY_CHORD_POWER_VOLUME_UP.

Value may be one of:

    0 - no-op
    1 - vibrate mode (current AOSP default behavior)
    2 - launch assistant

Bug: 179673796
Test: adb shell settings put global key_chord_volume_up <0, 1, or 2>
      adb shell dumpsys window | grep mPowerVolUpBehavior
      adb shell input keycombination POWER VOLUME_UP
Change-Id: I0e03155bdbe61d9fdd6838fe2c860749cf360907
This commit is contained in:
Dan Sandler
2021-03-31 22:52:37 -04:00
parent 7d8ae59fee
commit 069278cdb7
6 changed files with 84 additions and 4 deletions

View File

@@ -14702,6 +14702,15 @@ public final class Settings {
public static final String POWER_BUTTON_VERY_LONG_PRESS =
"power_button_very_long_press";
/**
* Overrides internal R.integer.config_keyChordPowerVolumeUp.
* Allowable values detailed in frameworks/base/core/res/res/values/config.xml.
* Used by PhoneWindowManager.
* @hide
*/
@Readable
public static final String KEY_CHORD_POWER_VOLUME_UP =
"key_chord_power_volume_up";
/**
* Keyguard should be on the left hand side of the screen, for wide screen layouts.

View File

@@ -960,6 +960,13 @@
-->
<integer name="config_veryLongPressOnPowerBehavior">0</integer>
<!-- Control the behavior when the user presses the power and volume up buttons together.
0 - Nothing
1 - Mute toggle
2 - Global actions menu
-->
<integer name="config_keyChordPowerVolumeUp">1</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

View File

@@ -436,6 +436,7 @@
<java-symbol type="integer" name="config_veryLongPressTimeout" />
<java-symbol type="integer" name="config_longPressOnBackBehavior" />
<java-symbol type="bool" name="config_allowStartActivityForLongPressOnPowerInSetup" />
<java-symbol type="integer" name="config_keyChordPowerVolumeUp" />
<java-symbol type="integer" name="config_wakeUpToLastStateTimeoutMillis" />
<java-symbol type="integer" name="config_lowMemoryKillerMinFreeKbytesAdjust" />
<java-symbol type="integer" name="config_lowMemoryKillerMinFreeKbytesAbsolute" />

View File

@@ -127,6 +127,7 @@ public class GlobalSettingsValidators {
VALIDATORS.put(Global.POWER_BUTTON_LONG_PRESS, new InclusiveIntegerRangeValidator(0, 5));
VALIDATORS.put(
Global.POWER_BUTTON_VERY_LONG_PRESS, new InclusiveIntegerRangeValidator(0, 1));
VALIDATORS.put(Global.KEY_CHORD_POWER_VOLUME_UP, new InclusiveIntegerRangeValidator(0, 2));
VALIDATORS.put(Global.NOTIFICATION_BUBBLES, BOOLEAN_VALIDATOR);
VALIDATORS.put(Global.CUSTOM_BUGREPORT_HANDLER_APP, ANY_STRING_VALIDATOR);
VALIDATORS.put(Global.CUSTOM_BUGREPORT_HANDLER_USER, ANY_INTEGER_VALIDATOR);

View File

@@ -593,6 +593,7 @@ public class SettingsBackupTest {
Settings.Global.INTEGRITY_CHECK_INCLUDES_RULE_PROVIDER,
Settings.Global.CACHED_APPS_FREEZER_ENABLED,
Settings.Global.APP_INTEGRITY_VERIFICATION_TIMEOUT,
Settings.Global.KEY_CHORD_POWER_VOLUME_UP,
Settings.Global.ADVANCED_BATTERY_USAGE_AMOUNT);
private static final Set<String> BACKUP_DENY_LIST_SECURE_SETTINGS =

View File

@@ -273,6 +273,11 @@ public class PhoneWindowManager implements WindowManagerPolicy {
static final int VERY_LONG_PRESS_POWER_NOTHING = 0;
static final int VERY_LONG_PRESS_POWER_GLOBAL_ACTIONS = 1;
// must match: config_keyChordPowerVolumeUp in config.xml
static final int POWER_VOLUME_UP_BEHAVIOR_NOTHING = 0;
static final int POWER_VOLUME_UP_BEHAVIOR_MUTE = 1;
static final int POWER_VOLUME_UP_BEHAVIOR_GLOBAL_ACTIONS = 2;
// must match: config_doublePressOnPowerBehavior in config.xml
static final int MULTI_PRESS_POWER_NOTHING = 0;
static final int MULTI_PRESS_POWER_THEATER_MODE = 1;
@@ -488,6 +493,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
int mLongPressOnBackBehavior;
int mShortPressOnSleepBehavior;
int mShortPressOnWindowBehavior;
int mPowerVolUpBehavior;
boolean mHasSoftInput = false;
boolean mHapticTextHandleEnabled;
boolean mUseTvRouting;
@@ -727,6 +733,9 @@ public class PhoneWindowManager implements WindowManagerPolicy {
resolver.registerContentObserver(Settings.Global.getUriFor(
Settings.Global.POWER_BUTTON_VERY_LONG_PRESS), false, this,
UserHandle.USER_ALL);
resolver.registerContentObserver(Settings.Global.getUriFor(
Settings.Global.KEY_CHORD_POWER_VOLUME_UP), false, this,
UserHandle.USER_ALL);
resolver.registerContentObserver(Settings.Global.getUriFor(
Settings.Global.POWER_BUTTON_SUPPRESSION_DELAY_AFTER_GESTURE_WAKE), false, this,
UserHandle.USER_ALL);
@@ -1267,6 +1276,10 @@ public class PhoneWindowManager implements WindowManagerPolicy {
mPowerManager.userActivity(SystemClock.uptimeMillis(), false);
}
private void cancelGlobalActionsAction() {
mHandler.removeMessages(MSG_DISPATCH_SHOW_GLOBAL_ACTIONS);
}
boolean isDeviceProvisioned() {
return Settings.Global.getInt(
mContext.getContentResolver(), Settings.Global.DEVICE_PROVISIONED, 0) != 0;
@@ -1835,20 +1848,48 @@ public class PhoneWindowManager implements WindowManagerPolicy {
}
});
// Volume up + power can either be the "ringer toggle chord" or as another way to
// launch GlobalActions. This behavior can change at runtime so we must check behavior
// inside the TwoKeysCombinationRule.
mKeyCombinationManager.addRule(
new TwoKeysCombinationRule(KEYCODE_VOLUME_UP, KEYCODE_POWER) {
@Override
boolean preCondition() {
return mRingerToggleChord != VOLUME_HUSH_OFF;
switch (mPowerVolUpBehavior) {
case POWER_VOLUME_UP_BEHAVIOR_MUTE:
return mRingerToggleChord != VOLUME_HUSH_OFF;
default:
return true;
}
}
@Override
void execute() {
mPowerKeyHandled = true;
interceptRingerToggleChord();
switch (mPowerVolUpBehavior) {
case POWER_VOLUME_UP_BEHAVIOR_MUTE:
// no haptic feedback here since
interceptRingerToggleChord();
mPowerKeyHandled = true;
break;
case POWER_VOLUME_UP_BEHAVIOR_GLOBAL_ACTIONS:
performHapticFeedback(HapticFeedbackConstants.LONG_PRESS, false,
"Power + Volume Up - Global Actions");
showGlobalActions();
mPowerKeyHandled = true;
break;
default:
break;
}
}
@Override
void cancel() {
cancelPendingRingerToggleChordAction();
switch (mPowerVolUpBehavior) {
case POWER_VOLUME_UP_BEHAVIOR_MUTE:
cancelPendingRingerToggleChordAction();
break;
case POWER_VOLUME_UP_BEHAVIOR_GLOBAL_ACTIONS:
cancelGlobalActionsAction();
break;
}
}
});
@@ -2054,6 +2095,10 @@ public class PhoneWindowManager implements WindowManagerPolicy {
Settings.Global.POWER_BUTTON_VERY_LONG_PRESS,
mContext.getResources().getInteger(
com.android.internal.R.integer.config_veryLongPressOnPowerBehavior));
mPowerVolUpBehavior = Settings.Global.getInt(resolver,
Settings.Global.KEY_CHORD_POWER_VOLUME_UP,
mContext.getResources().getInteger(
com.android.internal.R.integer.config_keyChordPowerVolumeUp));
}
if (updateRotation) {
updateRotation(true);
@@ -5204,6 +5249,9 @@ public class PhoneWindowManager implements WindowManagerPolicy {
pw.print(prefix);
pw.print("mTriplePressOnPowerBehavior=");
pw.println(multiPressOnPowerBehaviorToString(mTriplePressOnPowerBehavior));
pw.print(prefix);
pw.print("mPowerVolUpBehavior=");
pw.println(powerVolumeUpBehaviorToString(mPowerVolUpBehavior));
pw.print(prefix);
pw.print("mShortPressOnSleepBehavior=");
pw.println(shortPressOnSleepBehaviorToString(mShortPressOnSleepBehavior));
@@ -5378,6 +5426,19 @@ public class PhoneWindowManager implements WindowManagerPolicy {
}
}
private static String powerVolumeUpBehaviorToString(int behavior) {
switch (behavior) {
case POWER_VOLUME_UP_BEHAVIOR_NOTHING:
return "POWER_VOLUME_UP_BEHAVIOR_NOTHING";
case POWER_VOLUME_UP_BEHAVIOR_MUTE:
return "POWER_VOLUME_UP_BEHAVIOR_MUTE";
case POWER_VOLUME_UP_BEHAVIOR_GLOBAL_ACTIONS:
return "POWER_VOLUME_UP_BEHAVIOR_GLOBAL_ACTIONS";
default:
return Integer.toString(behavior);
}
}
private static String multiPressOnPowerBehaviorToString(int behavior) {
switch (behavior) {
case MULTI_PRESS_POWER_NOTHING: